The entrypoint guard only looked for ~/.octop/octop.db, which PostgreSQL
(and other external) backends never create in the data volume, so every
container restart re-ran `octop init`. The unconditional admin INSERT
then aborted the container with UniqueViolation on users_username_key.
- docker/docker-entrypoint.sh: write a backend-agnostic marker
(~/.octop/.initialized) after a successful `octop init`; skip the
bootstrap block on restarts when the marker or octop.db exists. When
init reports the admin already exists (upgrade of a pre-marker
deployment), keep the existing credential card instead of writing a
password that was never applied; also mention external DBs in the
generic init-failure hint.
- src/octop/cli/commands/init.py: make the admin bootstrap idempotent —
when the username already exists, skip creation with an explicit
message (the entrypoint greps for it) instead of hitting
UNIQUE(username).
Tests: entrypoint tests run the real script with a stub `octop` on PATH
(first boot + restart for an external backend, sqlite regression guard,
credential preservation, failed-init retry); a CLI test covers rerunning
`octop init` when the DB lives outside ~/.octop.
Fixes#1866
Signed-off-by: fengyue-xve <1759519137@qq.com>
Keep the Docker/native wizards on an account-only flow, fail native start
when 8089 never comes up, and vendor harness storage_errors so current
Octop can boot against PyPI harness 1.0.0.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
CI:
- Drop Python 3.11 from the test matrix (package requires >=3.12); the
3.11 jobs failed at `uv sync`. Linux and Windows now test Python 3.12.
- Rename tests/unit/infra/setup/tls/test_store.py -> test_tls_store.py to
fix the pytest import collision (duplicate basename) that aborted
collection on the 3.12 job.
Source bugs uncovered by the suite:
- Move ACTOR_SYSTEM to a runtime import in infra/cron/job.py (was wrongly
placed under TYPE_CHECKING, causing NameError at runtime).
- Add missing users-table columns (login_failed_count, login_locked_until,
preferences_json) in infra/db/migrate.py for legacy schema repair.
- Make auth.update_me honor explicit nulls via model_dump(exclude_unset=True).
- Relax skills hub endpoints to existence/ownership checks (require_agent_row)
instead of requiring the agent to be running.
- Marshal WebSocket frames onto the owning event loop in chat/ws.py so the
starlette TestClient portal does not deadlock.
- Include error details in the browser session 503 response.
Tests:
- Update tests to match current source APIs (harness async create/remove/
rebuild, FakeHarnessAgent skill methods, workspace nested layout, JWT
middleware, CLI surface, proactive config defaults, general-assistant
template manifest).
- Migrate WebSocket tests to starlette TestClient(...).websocket_connect
(httpx 0.28 removed AsyncClient.websocket_connect).
- Skip memory API tests when the optional harness_memory dependency is absent
via pytest.importorskip.
- Remove the invalid diagnostic test tests/integration/test_diag_e2e.py
(no assertions; inspected private internals only).
Also includes the pre-existing uncommitted orca -> Octop rename across docs,
README, LICENSE, Dockerfile and docker assets, as requested.