Commit Graph

85 Commits

Author SHA1 Message Date
jay e5dd64a1f7 docs: T-2.10 background lifecycle done; update next-steps 2026-05-17 13:25:09 +02:00
jay 0882ef8038 docs: bring NEXT-STEPS + SYNC up to current state (2026-05-16)
Phase 2 reality vs plan:
- Done: T-2.0..T-2.6, T-2.8, T-2.9, T-2.11
- Bonus done: XCUITest target + 8/8 tests, idb automation guide
- Open: T-2.7, T-2.10, T-2.12, T-2.13
- Bug backlog: 4 Keychain entitlements failures + 4 Pairing http-scheme tests

Also documented conventions: async subagent dispatch, reviewer fan-in,
--uitest mode + idb workflow, sidecar manual restart pattern.

Replaced obsolete Phase-1 orchestration instructions with current
priorities.
2026-05-16 22:20:55 +02:00
jay 2c627ea095 Merge fix/post-sessions-response-shape: POST /sessions returns full shape 2026-05-16 22:18:54 +02:00
jay df735aa279 fix(sidecar): POST /sessions response now matches GET shape (id+name+state+lastOutputAt)
Previously POST returned only { id, name }, while GET returns
{ id, name, state, lastOutputAt }. iOS clients that share a Decodable
for both endpoints (e.g. SessionItem in pi-remote-ios) failed to decode
the POST response with 'data couldn't be read because it is missing'.

The new session always starts in 'idle' state with empty lastOutputAt.
Documented the new shape in the route header comment.
2026-05-16 22:07:54 +02:00
jay 964226847b Merge fix/ws-input-handler: WS handler processes keys/key/paste 2026-05-16 12:07:53 +02:00
jay a7c7b8f3d7 fix(sidecar): WS stream handler — process keys/key/paste messages 2026-05-16 12:07:16 +02:00
jay 0604fd7c03 Merge feat/sidecar-pair-smoke: POST /pair smoke test 2026-05-16 11:54:33 +02:00
jay 8eb8360387 test: POST /pair smoke test (T-1.3 regression guard) 2026-05-16 04:17:18 +02:00
jay 547df01c21 fix: spawn sessions at 80x24 default (smaller mismatch before iOS resize arrives) 2026-05-16 04:00:02 +02:00
jay 2e44a7f286 fix: listSessions filters to @pi-remote-managed sessions only — excludes pi-sidecar and other unrelated tmux sessions 2026-05-16 03:51:27 +02:00
jay 4b428df0a4 fix: capturePane with escapes=true for color-accurate snapshots 2026-05-16 03:46:24 +02:00
jay 8ff635e6f5 fix: tsc errors — use correct ExtensionAPI event names (tool_execution_start/end, session_start) 2026-05-16 03:32:58 +02:00
jay fcfe729d23 fix: terminal size sync — resize message handler + xterm-256color default-terminal 2026-05-16 03:30:27 +02:00
Johannes Merz b64aaab40a fix: WS upgrade auth — multi-token bearer not validated
Problem: isAuthenticated() for WS upgrade only checked legacy single token.
iOS bearer token (from POST /pair → createToken()) was rejected → 403 on WS.

Fix:
- warmTokenCache(): pre-load all multi-tokens into a sync Set on startup
- validateBearerSync(): O(1) sync lookup against the cache
- createToken(): adds to cache immediately on creation
- isAuthenticated(): checks validateBearerSync() as third fallback
2026-05-16 03:12:43 +02:00
Johannes Merz 38cad794e2 feat: tsconfig.json + npm run typecheck
- tsconfig.json simulates pi's ESM TypeScript runtime
- Resolves peer deps from pi's global node_modules
- 'type: module' added to package.json (correct — pi loads as ESM)
- Fixes found by tsc:
  - buffer/writer.ts: correct Dirent import from node:fs
  - messages.ts: toolCall id/name may be undefined, default to empty string
- Remaining warnings: pi event API names (session_switch etc.) not in types;
  these are guarded with try/catch at runtime — acceptable
- npm run typecheck: tsc --noEmit
2026-05-16 03:08:02 +02:00
Johannes Merz 920f6d8fc3 fix: import readBody+sendJson in server.ts — POST /pair was crashing 2026-05-16 03:04:07 +02:00
Johannes Merz 571cf8c9ec feat: GET /pair-qr endpoint — QR code in terminal, fix double-port bug 2026-05-16 02:56:06 +02:00
Johannes Merz 1f36636e06 feat: POST /pair endpoint + async bearer token auth
- POST /pair: consumes one-time pairingToken, creates named bearer token,
  returns { bearerToken, sidecarId } per IC-3
- isAuthenticatedAsync(): checks legacy token + new multi-token store
- isAuthenticated(): extended with Bearer header support for WS upgrade
- Smoke still 12/12 green
2026-05-16 02:46:15 +02:00
Johannes Merz 91b1ad1a44 docs: Phase 2 in progress — T-2.0..T-2.5+T-2.9 done, app on device 2026-05-16 02:42:01 +02:00
Johannes Merz 911d3f7625 feat(T-1.8/1.9): stream integration smoke, operator guide, Phase 1 complete
- T-1.8: stream.test.mjs — session CRUD, WS stream attach, send-keys,
  marker observation, reconnect+delta replay, thumbnail, delete. 12/12 green.
- T-1.9: docs/reference/OPERATOR.md — full operator guide; README sidecar section.
- Fix: tmux/control.ts -CC → -C (passthrough mode bypassed %output events).
- Fix: tmux/input.ts + snapshot.ts drop hardcoded :0.0 pane (base-index safety).
- SYNC.md + NEXT-STEPS.md: Phase 1 marked done, Phase 2 unblocked.
2026-05-15 11:43:59 +02:00
Johannes Merz b94b668df6 feat(T-1.5/1.6/1.7): stream+input+snapshot routes, sessions CRUD, commands, side-channel, health endpoint 2026-05-15 11:35:55 +02:00
Johannes Merz db6be6dcf8 feat(T-1.10): APNs scaffold — JWT provider auth, push primitive, device-token stub 2026-05-15 11:32:05 +02:00
Johannes Merz f89abd1125 feat(T-1.4): pi adapter — events, commands, autoname 2026-05-15 11:31:36 +02:00
Johannes Merz 6f106d2411 feat(T-1.3): auth tokens, pairing, TLS, CLI (pair/auth list/revoke/name) 2026-05-15 11:30:54 +02:00
Johannes Merz 17c32e7e93 feat(T-1.2): sequence counter + disk ring-buffer writer/reader 2026-05-15 11:29:41 +02:00
Johannes Merz bd990a07ab feat(T-1.1): tmux manager, control-mode client, input, snapshot 2026-05-15 11:28:45 +02:00
Johannes Merz 4f6fa0e83b docs: resolve OQ-3 — tmux control-mode per-session 2026-05-15 11:25:16 +02:00
Johannes Merz d74341af2a merge: T-1.0 server refactor + T-1.0a smoke harness 2026-05-15 11:20:32 +02:00
jay af990f6592 sync: release T-1.0a claim, add history + file ownership [@worker-t1.0a] 2026-05-15 11:18:56 +02:00
jay a7dad86901 feat(t-1.0a): smoke test harness MVP
- scripts/smoke/helpers.mjs — spawn-pi (via python3 pty.spawn), wait-for-port,
  fetch, WebSocket helpers; createSmokeHome/removeSmokeHome for isolated HOME
- scripts/smoke/smoke.mjs — 6 node:test assertions:
    GET /manifest.json → 200 + JSON shape
    GET /icon.svg → 200 + <svg body
    GET / (with token) → 302→200 + HTML marker
    GET / (no token) → 403
    WS /ws (with token) → 101 upgrade
    pi process alive check
- scripts/smoke/README.md — usage, design notes, extension guide
- package.json: add 'smoke' script
- docs/SYNC.md: add scripts/smoke/** ownership row + History entry

All 6 tests pass in ~1.4 s locally.

Key finding: pi requires a PTY to enter interactive mode and fire
session_start. Spawning without a TTY causes immediate exit. Workaround:
python3 pty.spawn() — allocates a PTY with no additional deps.
2026-05-15 11:18:20 +02:00
jay 174fa7fb31 sync: claim T-1.0a smoke test harness [@worker-t1.0a] 2026-05-15 11:12:10 +02:00
jay 3e813eb90a sync: release T-1.0 claim, add history entry (@worker-t1.0) 2026-05-15 10:58:07 +02:00
jay 568931901d refactor(T-1.0): carve server.ts into server/ sub-modules
Create the modular server/ layout from PHASE-1-sidecar.md §Architecture Sketch:

  server/types.ts    — shared WsClient/WsServer/RemoteServer interfaces
  server/upgrade.ts  — WS upgrade routing per path (LEGACY /ws)
  server/server.ts   — HTTP bootstrap, middleware, LEGACY HTML routes
  server/routes/     — empty dir, placeholder for T-1.5/T-1.6/T-1.7

The original extensions/remote-control/server.ts is replaced with a
thin re-export shim so that index.ts continues to resolve
'./server.js' without changes.

All LEGACY code paths (manifest.json, icon.svg, /, /ws) are tagged
with // LEGACY: … comments. No behaviour changes. No new endpoints.

Pre-existing biome errors in auth.ts, config.ts, index.ts are
unchanged — NOT introduced by this commit.
2026-05-15 10:57:52 +02:00
jay e396cfcaaa sync: claim T-1.0 — server refactor scaffold (@worker-t1.0) 2026-05-15 10:56:04 +02:00
Johannes Merz ba23050eda docs: resolve OQ-4 — T-1.0 worker = sonnet-4-6 2026-05-15 10:51:27 +02:00
Johannes Merz 460c5fac7a sync: clear stale T-1.0 claim (qwen swarm reset) 2026-05-15 10:48:56 +02:00
Johannes Merz 07522e5974 docs: mark IC-1..IC-4 frozen in NEXT-STEPS, resolve OQ-1/OQ-2 2026-05-15 10:48:38 +02:00
jay c9bdfce890 sync: claim T-1.0 server refactor 2026-05-15 06:56:58 +02:00
jay 7c40c49b1a chore: freeze IC-1..IC-4 interface contracts
Resolved OQ-1 (drop tree event), OQ-2 (defer resize), OQ-3 (per-session
control-mode, T-1.1 to decide final), OQ-4 (sonnet-4-5 for T-1.0).

IC-3: clarified deviceToken/environment optional pre-Phase-2, mandatory
from Phase 2 onward.
2026-05-15 06:56:38 +02:00
jay aa8aa42655 docs: update README for iOS app direction + sidecar architecture 2026-05-15 04:50:22 +02:00
jay b2b82c82ce docs: incorporate Phase 0.5 verdict (Path B), prep Phase 1
- PHASE-1-sidecar.md
  - Note at top: streaming primitive decided as tmux control mode
  - Architecture sketch: tmux/pipe.ts → tmux/control.ts
  - T-1.1 description updated to reference control mode + spike-cc.ts
  - Risks R4 (parser throughput) and R5 (tmux ≥2.5 required) added

- SYNC.md
  - File ownership map: tmux/** note about control mode
  - Frozen Interface Contracts table: added Status + Frozen-at columns
    so contracts can be tracked from draft → frozen with date stamp
  - Freeze protocol prose

- NEW: NEXT-STEPS.md — single resume pointer for the next session.
  Lists what's done, what's draft, the orchestrator todo list (freeze
  contracts → dispatch T-1.0 → plan fan-out), open questions, and
  things explicitly NOT to do tomorrow.

- README.md: NEXT-STEPS.md added at top of the docs index.
2026-05-15 04:48:20 +02:00
jay 86c4d3e869 docs: mark Phase 0.5 complete in SYNC
- Phase 0.5 status: done
- Verdict: Path B (tmux control mode) recommended
- Active claim removed
- History entry added
- Phase 1 status updated: ready to start with control mode
2026-05-15 04:18:41 +02:00
jay 307417b392 docs: add Phase 0.5 — spike tmux control mode
Phase 0 found that tmux pipe-pane is unreliable across alternate-screen
transitions. Before Phase 1 commits to a streaming primitive, a short
follow-up spike evaluates tmux control mode (`tmux -CC`) as an
alternative to pipe-pane + watchdog. Verdict drives T-1.1 design.
2026-05-15 04:06:25 +02:00
jay d97bd4aeef docs: mark Phase 0 complete in SYNC.md
- Phase 0 status: done (GREEN LIGHT)
- Phase 1 status: ready to start
- Remove active claim for T-0.*
- Add history entry
- Full report available in feat/spike-stream branch
2026-05-15 03:51:14 +02:00
jay 15772558dd docs: claim Phase 0 spike stream task 2026-05-15 03:40:50 +02:00
jay f6cbf17078 docs: reorganise — implementation plans + sync, archive spec to reference/
- docs/ now holds only implementation drivers:
  - PHASE-0-spike-stream.md (single agent, ~1 day PoC)
  - PHASE-1-sidecar.md (multi-agent, sidecar production-ready)
  - PHASE-2-ios-mvp.md (multi-agent, iOS app MVP)
  - PHASE-3-ios-augmentation.md (multi-agent, iOS polish)
  - SYNC.md (live coordination: claims, ownership, CCRs)
  - README.md (folder guide)

- docs/reference/ holds background:
  - SPEC-ios-app.md (final v3 spec)
  - EXTENSION-API-AUDIT.md (audit result)
  - SPEC-ios-app-review-v1.md (archived review thread)
  - ARCHITECTURE.md (original extension architecture)
  - README.md (folder guide)

Each phase plan defines: goal, acceptance criteria, file layout,
explicit task table with parallelisable tasks, interface contracts,
branching strategy, risks, exit criteria.

SYNC.md provides the multi-agent coordination protocol: active claims
table, file ownership map, frozen contracts, and contract change
requests (CCR) workflow.
2026-05-15 03:33:51 +02:00
jay 0f946d56ea docs: spec v3 — close Q-A (pi -p flags) and Q-C (APNs details)
- S-09a: concrete pi CLI invocation verified, ~2s with haiku-4-5
- iOS-C-02: full APNs setup, .p8 key, sandbox/production routing
  per device-token (Xcode-debug → sandbox, TestFlight → production),
  collapse-id, JWT caching, auto-cleanup on 410
2026-05-15 01:48:23 +02:00
jay cf61b2ba1b docs: spec v3 — drop Tree-Nav from iOS, audit closed
- Audit confirmed S-07, S-08 work out-of-the-box → upgraded from PENDING to firm SHOULD
- Tree-Write blocked by ExtensionAPI; Gruppe T removed entirely
- Tree-Navigation explicitly out of scope (native pi only)
- Spike-0a closed, EXTENSION-API-AUDIT.md is referenced artifact
2026-05-15 01:35:20 +02:00
jay 36938a66c4 docs: spec v2 — incorporate review feedback, archive v1 thread 2026-05-15 01:20:17 +02:00
jay 7c0e94cb57 docs: add iOS app spec with inline review thread 2026-05-15 01:09:20 +02:00