@mmerterden/multi-agent-pipeline 20.29.0 → 20.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +50 -5
  3. package/README.tr.md +64 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +9 -9
  7. package/install/_unattended-profile.mjs +61 -0
  8. package/install/catalog-history.json +1 -1
  9. package/install/claude.mjs +19 -3
  10. package/install/codex.mjs +2 -0
  11. package/install/copilot.mjs +13 -0
  12. package/install/index.mjs +10 -1
  13. package/install/templates/claude-hooks.json +12 -1
  14. package/manifest.json +230 -88
  15. package/package.json +3 -1
  16. package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
  17. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +13 -15
  18. package/pipeline/commands/multi-agent/office-off/SKILL.md +27 -0
  19. package/pipeline/commands/multi-agent/office-on/SKILL.md +51 -0
  20. package/pipeline/commands/multi-agent/office-status/SKILL.md +29 -0
  21. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
  22. package/pipeline/commands/multi-agent/review/SKILL.md +4 -3
  23. package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
  24. package/pipeline/commands/multi-agent/serve/SKILL.md +4 -2
  25. package/pipeline/commands/multi-agent/stack/SKILL.md +15 -8
  26. package/pipeline/commands/multi-agent/steer/SKILL.md +10 -9
  27. package/pipeline/commands/multi-agent/sync/SKILL.md +15 -3
  28. package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
  29. package/pipeline/contract/CHANGELOG.md +108 -0
  30. package/pipeline/contract/README.md +72 -12
  31. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  32. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  33. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  34. package/pipeline/contract/fixtures/launch-plan.json +1 -1
  35. package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
  36. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  37. package/pipeline/contract/fixtures/runs-failed.json +6 -1
  38. package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
  39. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
  40. package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
  41. package/pipeline/contract/fixtures/runs-running.json +6 -1
  42. package/pipeline/contract/manifest.json +506 -27
  43. package/pipeline/contract/types/index.d.ts +829 -4
  44. package/pipeline/lib/bg-launch.mjs +106 -0
  45. package/pipeline/lib/code-digest.mjs +49 -0
  46. package/pipeline/lib/credential-resolve.mjs +42 -2
  47. package/pipeline/multi-agent-refs/cross-cli-contract.md +5 -4
  48. package/pipeline/multi-agent-refs/features/office-threat-model.md +109 -0
  49. package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
  50. package/pipeline/multi-agent-refs/help/en.md +3 -0
  51. package/pipeline/multi-agent-refs/help/tr.md +3 -0
  52. package/pipeline/multi-agent-refs/phases/modes.md +7 -7
  53. package/pipeline/multi-agent-refs/phases/phase-5-report.md +16 -10
  54. package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
  55. package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
  56. package/pipeline/office/NOTICE.md +45 -0
  57. package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
  58. package/pipeline/office/assets/BIN.png +0 -0
  59. package/pipeline/office/assets/BOOKSHELF.png +0 -0
  60. package/pipeline/office/assets/CACTUS.png +0 -0
  61. package/pipeline/office/assets/CLOCK.png +0 -0
  62. package/pipeline/office/assets/COFFEE.png +0 -0
  63. package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
  64. package/pipeline/office/assets/COFFEE_TABLE.png +0 -0
  65. package/pipeline/office/assets/COUNTER_SINK.png +0 -0
  66. package/pipeline/office/assets/CUSHIONED_BENCH.png +0 -0
  67. package/pipeline/office/assets/CUSHIONED_CHAIR_BACK.png +0 -0
  68. package/pipeline/office/assets/CUSHIONED_CHAIR_FRONT.png +0 -0
  69. package/pipeline/office/assets/CUSHIONED_CHAIR_SIDE.png +0 -0
  70. package/pipeline/office/assets/DESK_FRONT.png +0 -0
  71. package/pipeline/office/assets/DESK_SIDE.png +0 -0
  72. package/pipeline/office/assets/DEVICE_STAND.png +0 -0
  73. package/pipeline/office/assets/DOUBLE_BOOKSHELF.png +0 -0
  74. package/pipeline/office/assets/FILING_CABINET.png +0 -0
  75. package/pipeline/office/assets/FRIDGE.png +0 -0
  76. package/pipeline/office/assets/HANGING_PLANT.png +0 -0
  77. package/pipeline/office/assets/LARGE_PAINTING.png +0 -0
  78. package/pipeline/office/assets/LARGE_PLANT.png +0 -0
  79. package/pipeline/office/assets/MAILBOX.png +0 -0
  80. package/pipeline/office/assets/MOP_BUCKET.png +0 -0
  81. package/pipeline/office/assets/PC_BACK.png +0 -0
  82. package/pipeline/office/assets/PC_FRONT_OFF.png +0 -0
  83. package/pipeline/office/assets/PC_FRONT_ON_1.png +0 -0
  84. package/pipeline/office/assets/PC_FRONT_ON_2.png +0 -0
  85. package/pipeline/office/assets/PC_FRONT_ON_3.png +0 -0
  86. package/pipeline/office/assets/PC_SIDE.png +0 -0
  87. package/pipeline/office/assets/PLANT.png +0 -0
  88. package/pipeline/office/assets/PLANT_2.png +0 -0
  89. package/pipeline/office/assets/POT.png +0 -0
  90. package/pipeline/office/assets/PRINTER.png +0 -0
  91. package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
  92. package/pipeline/office/assets/SERVER_RACK.png +0 -0
  93. package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
  94. package/pipeline/office/assets/SMALL_PAINTING.png +0 -0
  95. package/pipeline/office/assets/SMALL_PAINTING_2.png +0 -0
  96. package/pipeline/office/assets/SMALL_TABLE_FRONT.png +0 -0
  97. package/pipeline/office/assets/SMALL_TABLE_SIDE.png +0 -0
  98. package/pipeline/office/assets/SOFA_BACK.png +0 -0
  99. package/pipeline/office/assets/SOFA_FRONT.png +0 -0
  100. package/pipeline/office/assets/SOFA_SIDE.png +0 -0
  101. package/pipeline/office/assets/TABLE_FRONT.png +0 -0
  102. package/pipeline/office/assets/TOILET_STALL.png +0 -0
  103. package/pipeline/office/assets/VENDING.png +0 -0
  104. package/pipeline/office/assets/WASHBASIN.png +0 -0
  105. package/pipeline/office/assets/WATER_COOLER.png +0 -0
  106. package/pipeline/office/assets/WHITEBOARD.png +0 -0
  107. package/pipeline/office/assets/WOODEN_BENCH.png +0 -0
  108. package/pipeline/office/assets/WOODEN_CHAIR_BACK.png +0 -0
  109. package/pipeline/office/assets/WOODEN_CHAIR_FRONT.png +0 -0
  110. package/pipeline/office/assets/WOODEN_CHAIR_SIDE.png +0 -0
  111. package/pipeline/office/assets/char_0.png +0 -0
  112. package/pipeline/office/assets/char_1.png +0 -0
  113. package/pipeline/office/assets/char_2.png +0 -0
  114. package/pipeline/office/assets/char_3.png +0 -0
  115. package/pipeline/office/assets/char_4.png +0 -0
  116. package/pipeline/office/assets/char_5.png +0 -0
  117. package/pipeline/office/assets/floor_0.png +0 -0
  118. package/pipeline/office/assets/floor_1.png +0 -0
  119. package/pipeline/office/assets/floor_2.png +0 -0
  120. package/pipeline/office/assets/floor_3.png +0 -0
  121. package/pipeline/office/assets/floor_4.png +0 -0
  122. package/pipeline/office/assets/floor_5.png +0 -0
  123. package/pipeline/office/assets/floor_6.png +0 -0
  124. package/pipeline/office/assets/floor_7.png +0 -0
  125. package/pipeline/office/assets/floor_8.png +0 -0
  126. package/pipeline/office/assets/wall_0.png +0 -0
  127. package/pipeline/office/index.html +8431 -0
  128. package/pipeline/office/toolkit.json +3 -0
  129. package/pipeline/schemas/activity-chat.schema.json +78 -0
  130. package/pipeline/schemas/activity-roles.json +48 -0
  131. package/pipeline/schemas/activity-roles.schema.json +49 -0
  132. package/pipeline/schemas/activity.schema.json +613 -0
  133. package/pipeline/schemas/agent-state.schema.json +493 -115
  134. package/pipeline/schemas/autopilot-on-request.schema.json +33 -0
  135. package/pipeline/schemas/autopilot-on.schema.json +111 -0
  136. package/pipeline/schemas/contract-error.schema.json +45 -4
  137. package/pipeline/schemas/issue-maturity.schema.json +68 -0
  138. package/pipeline/schemas/job-change.schema.json +72 -0
  139. package/pipeline/schemas/job-request.schema.json +38 -0
  140. package/pipeline/schemas/launch.json +4 -4
  141. package/pipeline/schemas/ledger.schema.json +202 -0
  142. package/pipeline/schemas/office-credentials.schema.json +71 -0
  143. package/pipeline/schemas/office-jobs.json +253 -0
  144. package/pipeline/schemas/office-jobs.schema.json +62 -0
  145. package/pipeline/schemas/office-memory.schema.json +105 -0
  146. package/pipeline/schemas/office-settings-request.schema.json +30 -0
  147. package/pipeline/schemas/office-settings.schema.json +67 -0
  148. package/pipeline/schemas/permissions.schema.json +47 -0
  149. package/pipeline/schemas/phases.json +10 -2
  150. package/pipeline/schemas/phases.schema.json +86 -19
  151. package/pipeline/schemas/prefs.schema.json +19 -0
  152. package/pipeline/schemas/prs.schema.json +78 -0
  153. package/pipeline/schemas/prune-logs-request.schema.json +26 -0
  154. package/pipeline/schemas/prune-logs.schema.json +52 -0
  155. package/pipeline/schemas/repo-change.schema.json +54 -0
  156. package/pipeline/schemas/repo-request.schema.json +29 -0
  157. package/pipeline/schemas/repos.schema.json +49 -1
  158. package/pipeline/schemas/review-verdict-request.schema.json +20 -0
  159. package/pipeline/schemas/review-verdict.schema.json +62 -0
  160. package/pipeline/schemas/routine-delete.schema.json +59 -0
  161. package/pipeline/schemas/routines.schema.json +38 -0
  162. package/pipeline/schemas/run-evidence.schema.json +29 -0
  163. package/pipeline/schemas/run-results.schema.json +218 -0
  164. package/pipeline/schemas/runs-index.schema.json +257 -46
  165. package/pipeline/schemas/service-read.schema.json +58 -0
  166. package/pipeline/schemas/stack-change.schema.json +82 -0
  167. package/pipeline/schemas/stack-request.schema.json +33 -0
  168. package/pipeline/schemas/stack.schema.json +59 -0
  169. package/pipeline/schemas/steer-request.schema.json +25 -0
  170. package/pipeline/schemas/steer.schema.json +59 -0
  171. package/pipeline/schemas/system-status.schema.json +111 -0
  172. package/pipeline/schemas/tool-call-request.schema.json +19 -0
  173. package/pipeline/schemas/tool-call.schema.json +47 -0
  174. package/pipeline/schemas/tools.schema.json +65 -0
  175. package/pipeline/schemas/unattended-profile.json +7 -2
  176. package/pipeline/scripts/_active-run.mjs +2 -1
  177. package/pipeline/scripts/_cost.mjs +66 -1
  178. package/pipeline/scripts/_office-smoke-lib.sh +115 -0
  179. package/pipeline/scripts/_spawn-async.mjs +77 -0
  180. package/pipeline/scripts/_transcript-tail.mjs +274 -0
  181. package/pipeline/scripts/activity-snapshot.mjs +1223 -0
  182. package/pipeline/scripts/autopilot-control.mjs +214 -9
  183. package/pipeline/scripts/autopilot-runner.mjs +7 -5
  184. package/pipeline/scripts/contract-server.mjs +1853 -197
  185. package/pipeline/scripts/cost-analyze.mjs +2 -53
  186. package/pipeline/scripts/cost-table.json +1 -0
  187. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
  188. package/pipeline/scripts/job-launch.mjs +477 -0
  189. package/pipeline/scripts/launch-request.mjs +94 -9
  190. package/pipeline/scripts/office-build.mjs +226 -0
  191. package/pipeline/scripts/office-control.mjs +410 -0
  192. package/pipeline/scripts/office-credentials.mjs +106 -0
  193. package/pipeline/scripts/office-ledger.mjs +409 -0
  194. package/pipeline/scripts/office-memory.mjs +200 -0
  195. package/pipeline/scripts/office-prune.mjs +125 -0
  196. package/pipeline/scripts/office-settings.mjs +145 -0
  197. package/pipeline/scripts/phase-tracker.sh +12 -5
  198. package/pipeline/scripts/prune-logs.sh +53 -2
  199. package/pipeline/scripts/routine-registry.mjs +42 -6
  200. package/pipeline/scripts/run-results.mjs +373 -0
  201. package/pipeline/scripts/runs-index.mjs +62 -2
  202. package/pipeline/scripts/service-read.mjs +244 -0
  203. package/pipeline/scripts/stack-toggle.mjs +285 -0
  204. package/pipeline/scripts/steer-run.mjs +97 -0
  205. package/pipeline/scripts/system-status.mjs +196 -0
  206. package/pipeline/scripts/task-mirror.mjs +150 -0
  207. package/pipeline/scripts/task-mirror.sh +20 -0
  208. package/pipeline/scripts/toolkit-tools.mjs +625 -0
  209. package/pipeline/scripts/transcript-index.mjs +4 -1
  210. package/pipeline/scripts/uninstall.mjs +3 -0
  211. package/pipeline/scripts/work-items.mjs +473 -0
  212. package/pipeline/skills/.skill-manifest.json +23 -11
  213. package/pipeline/skills/.skills-index.json +34 -1
  214. package/pipeline/skills/shared/README.md +6 -3
  215. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +13 -15
  216. package/pipeline/skills/shared/core/multi-agent-office-off/SKILL.md +16 -0
  217. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +21 -0
  218. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +17 -0
  219. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
  220. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -0
  221. package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
  222. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +4 -2
  223. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -6
  224. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +10 -9
  225. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  226. package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
  227. package/pipeline/skills/skills-index.md +4 -1
@@ -42,7 +42,11 @@ same bytes (`test/contract-parity.test.mjs`):
42
42
  | Assigned issues | `issues.mjs --json [--source S] [--project K] [--max N]` | `GET /v1/issues` |
43
43
  | Worktrees | `worktrees.mjs --json [--measure] [--redact]` | `GET /v1/worktrees` |
44
44
  | Launch shape | `launch-request.mjs spec` | `GET /v1/launch-spec` |
45
- | Launch repositories | `launch-request.mjs repos [--redact]` | `GET /v1/repos` |
45
+ | Launch repositories | `launch-request.mjs repos [--redact] [--all]` | `GET /v1/repos[?all=1]` |
46
+ | Add a launch repository (two steps; the route also requires a git checkout) | `launch-request.mjs register-repo <path>` | `POST /v1/repos` |
47
+ | Remove a registered repository (two steps) | - | `DELETE /v1/repos/{id}` |
48
+ | Office jobs | `job-launch.mjs list` | `GET /v1/jobs` |
49
+ | Start an office job (two steps) | - | `POST /v1/jobs` |
46
50
  | Start a run | write the request file, then `launch-request.mjs plan FILE --repo P --session-id U [--channel phone]` | `POST /v1/launch?repo=P` |
47
51
  | Answer a question | `answer-question.mjs STATE --question Q --answer IDS` | `POST /v1/runs/{id}/answer` |
48
52
  | A run's log | `run-log.mjs ID [--tail N]` (1-2000, default 200) | `GET /v1/runs/{id}/log?tail=N` |
@@ -51,12 +55,46 @@ same bytes (`test/contract-parity.test.mjs`):
51
55
  | Garbage-collect (two steps) | `gc-plan.mjs preview [--scope S,...]`, then `gc-plan.mjs apply < items` | `POST /v1/gc` |
52
56
  | Autopilot status | `autopilot-control.mjs status` | `GET /v1/autopilot` |
53
57
  | Autopilot off | `autopilot-control.mjs off [--now]` | `POST /v1/autopilot/off` |
54
-
55
- Starting a run is always the client's act. `POST /v1/launch` validates the
58
+ | Autopilot on (two steps) | `autopilot-control.mjs on-preview --repo R...`, then `on --repo R... [--configure-only]` | `POST /v1/autopilot/on` |
59
+ | Steer a run (two steps on the server) | `steer-run.mjs STATE --text T` | `POST /v1/runs/{id}/steer` |
60
+ | Agent activity | `activity-snapshot.mjs --json` | `GET /v1/activity`, `GET /v1/activity/stream` (SSE) |
61
+ | An agent's chat | `activity-snapshot.mjs chat SESSION [AGENT] [--before N] [--limit N]` | `GET /v1/agents/{sessionId}/{agentId}/chat` |
62
+ | Cost ledger | `office-ledger.mjs --json` | `GET /v1/ledger` |
63
+ | Machine resources | `system-status.mjs --json` | `GET /v1/system` |
64
+ | Key cabinet (names and verdicts, never values) | `office-credentials.mjs --json [--probe]` | `GET /v1/credentials` |
65
+ | Institutional memory | `office-memory.mjs --json` | `GET /v1/memory` |
66
+ | Prune old run logs (two steps) | `office-prune.mjs preview\|apply N --json` | `POST /v1/prune-logs` |
67
+ | Office settings | `office-settings.mjs --json` | `GET /v1/settings` |
68
+ | Change one setting (two steps) | `office-settings.mjs set SETTING VALUE --json` | `POST /v1/settings` |
69
+ | What a run produced | `run-results.mjs ID --json` | `GET /v1/runs/{id}/results` |
70
+ | One screenshot | `run-results.mjs ID --evidence NAME` | `GET /v1/runs/{id}/evidence/{name}` |
71
+ | Post a review verdict (two steps) | `work-items.mjs verdict ID [--post]` | `POST /v1/runs/{id}/review-verdict` |
72
+ | An issue's maturity | `work-items.mjs maturity KEY` | `GET /v1/issues/{key}/maturity` |
73
+ | Open pull requests | `work-items.mjs prs` | `GET /v1/prs` |
74
+ | Toolkit MCP tools | `toolkit-tools.mjs list` | `GET /v1/tools` |
75
+ | Call an allowed toolkit tool (read-only, no location argument) | `toolkit-tools.mjs call NAME JSON` | `POST /v1/tools/{name}/call` |
76
+ | A Confluence page, a Crashlytics issue, a Figma frame | `service-read.mjs confluence\|crashlytics\|figma ...` | `GET /v1/services/{confluence,crashlytics,figma}` |
77
+ | Pending host permission prompts | (none can be read yet) | `GET /v1/permissions` |
78
+ | Routines | `routine-registry.mjs list --json` | `GET /v1/routines` |
79
+ | Remove a routine (two steps) | `routine-registry.mjs remove --name N` | `DELETE /v1/routines/{name}` |
80
+ | A repo's stacks | `stack-toggle.mjs status --repo P --json` | `GET /v1/stack?repo=R` |
81
+ | Set a repo's stacks (two steps) | `stack-toggle.mjs set --repo P STACK... --json` | `POST /v1/stack` |
82
+
83
+ Every surface in `manifest.json` carries `remote` (the scope a remote carrier
84
+ would require: `read`, `answer`, `launch`, or `local-only` for anything that
85
+ widens what runs on this machine (autopilot on, stack, routine removal, kill,
86
+ gc, prune, settings) and for a read that stays on this machine for privacy
87
+ (credentials, memory, settings)) and `risk` (the confirmation tier: `read`, `low`, `high`). Locally the
88
+ bearer token is the only credential; nothing enforces the tags yet. They are
89
+ there so a later carrier reuses these routes without redefining them.
90
+
91
+ Starting a run is the client's act. `POST /v1/launch` validates the
56
92
  request, writes it (0600) and returns the argv, environment and working
57
- directory from `launch.json`; it never starts a session (the only `claude` the
58
- server runs is `claude stop`, for a kill). Spawn the argv without
59
- a shell. `launch.json` is marked `verified: false` until a live launch trial, so
93
+ directory from `launch.json`; spawn the argv without a shell. The office panel
94
+ is a client that starts its own: `POST /v1/jobs` (two steps, `local-only`)
95
+ starts a job from `schemas/office-jobs.json` in the background after the
96
+ unattended profile, workspace trust and sandbox checks. Besides that the only
97
+ `claude` the server runs is `claude stop`, for a kill. `launch.json` is marked `verified: false` until a live launch trial, so
60
98
  treat the shape as provisional.
61
99
 
62
100
  The run starts with no permission prompts, so its input is held to a shape: a
@@ -90,7 +128,8 @@ Resuming is the client's act too: `POST /v1/runs/{id}/resume` returns the plan
90
128
  root, `409 not-resumable` for any other, a finished or a killed one, and `409
91
129
  run-active` while its session runs.
92
130
 
93
- Kill and gc remove things, so each takes two requests. The first (no
131
+ Kill, gc, autopilot on and a stack change take two requests (a routine
132
+ removal takes its token as `?confirm=`). The first (no
94
133
  `confirmToken`) returns the preview with `confirmToken` and `expiresAt`; the
95
134
  second sends the token back and acts on exactly what was previewed. A token is
96
135
  single use, lives 120 seconds in the server's memory only, and is bound to the
@@ -113,14 +152,35 @@ answer to the old one.
113
152
  that spawned the server can pass `--print-token` to get it on the ready line.
114
153
  - Every request sends `Authorization: Bearer <token>` and a `Host` of
115
154
  `127.0.0.1:<port>` or `localhost:<port>`.
116
- - A browser page is allowed only from an origin passed with `--allow-origin`;
117
- CORS is off without one. A request carrying an `Origin` is always served
118
- redacted.
155
+ - A browser page is allowed only from the server's own origin (the optional
156
+ panel at `GET /office`) or an origin passed with `--allow-origin`; CORS is
157
+ off without one. A write (POST, DELETE) and the chat route accept no Origin
158
+ but the server's own, even an allowed one. A request carrying an `Origin` is
159
+ always served redacted.
160
+ - The token is read from the `Authorization` header only, never from a cookie
161
+ or a query parameter.
162
+ - `GET /office` serves the panel page (`MA_OFFICE_PAGE`, else
163
+ `prefs.global.office.page`, else the installed `office/index.html` beside the
164
+ package) without a token, with a per-response CSP nonce, and is 404 when no
165
+ page exists. The page never sees the token in a URL: `POST /office/code`
166
+ (bearer, no Origin) mints a code valid for 10 seconds and one use, the page
167
+ is opened with it in the fragment, and trades it at `POST /office/exchange`
168
+ (own Origin only, no bearer); a used, expired or unknown code is 401.
169
+ `GET /office/assets/<name>.png` serves the page's sprites, also without a
170
+ token: a plain file name, a PNG of at most 256 KiB directly in the assets
171
+ directory beside the page, and 404 for anything else. `GET /favicon.ico`
172
+ answers an empty 204 without a token, since browsers request it on their own.
173
+ - Every write route appends one line (who, route, step, status; never a body
174
+ or token) to `~/.claude/logs/multi-agent/office-actions.jsonl`.
119
175
  - Bodies are JSON, at most 64 KiB, and must satisfy the route's schema.
120
176
  - Errors follow `contract-error.schema.json`; switch on `error`, never on
121
177
  `message`.
122
- - The server exits after 15 idle minutes (`--idle-minutes`) or on SIGTERM. It
123
- is never a service; start it when you need it.
178
+ - Service reads, the work list, the review verdict and autopilot control run
179
+ in child processes and never block other routes; a second request for the
180
+ same one while the first runs is 429 `busy`.
181
+ - The server exits after 15 idle minutes (`--idle-minutes`), after 8 hours in
182
+ any case (`--max-hours`, an open event stream does not extend it) or on
183
+ SIGTERM. It is never a service; start it when you need it.
124
184
 
125
185
  A client that relays anything off this machine uses `redact=1` (or
126
186
  `--redact`) for every read.
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.3.0",
2
+ "contractVersion": "1.6.0",
3
3
  "error": "invalid-request",
4
4
  "message": "the launch request was refused",
5
5
  "errors": [
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.3.0",
2
+ "contractVersion": "1.6.0",
3
3
  "error": "unauthorized",
4
4
  "message": "a bearer token is required"
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.3.0",
2
+ "contractVersion": "1.6.0",
3
3
  "error": "unsigned",
4
4
  "message": "a device signature is required"
5
5
  }
@@ -22,7 +22,7 @@
22
22
  "MULTI_AGENT_UNATTENDED": "1",
23
23
  "MULTI_AGENT_SESSION_ID": "00000000-0000-4000-8000-000000000201",
24
24
  "MCP_TOOLKIT_URL_POLICY": "strict",
25
- "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
25
+ "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains,~/.claude/logs/multi-agent/contract-server,~/.claude/logs/multi-agent/office",
26
26
  "LOGS_ROOT": "/Users/example/.multi-agent-unattended/logs",
27
27
  "MA_LAUNCH_REQUEST": "/Users/example/.claude/autopilot/requests/00000000-0000-4000-8000-000000000201.json"
28
28
  },
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "logsRoot": "/Users/example/.claude/logs/multi-agent",
4
4
  "count": 1,
5
5
  "runs": [
@@ -68,7 +68,12 @@
68
68
  "estUsd": 0,
69
69
  "unlockedWrites": 0,
70
70
  "runType": "autopilot",
71
+ "mode": null,
71
72
  "title": null,
73
+ "source": null,
74
+ "prNumber": null,
75
+ "channels": [],
76
+ "channelUrls": {},
72
77
  "progress": 0,
73
78
  "currentTask": null,
74
79
  "processAlive": false
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "logsRoot": "/Users/example/.claude/logs/multi-agent",
4
4
  "count": 0,
5
5
  "runs": []
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "logsRoot": "/Users/example/.claude/logs/multi-agent",
4
4
  "count": 1,
5
5
  "runs": [
@@ -88,7 +88,12 @@
88
88
  "estUsd": 0.0353,
89
89
  "unlockedWrites": 0,
90
90
  "runType": "development",
91
+ "mode": null,
91
92
  "title": null,
93
+ "source": null,
94
+ "prNumber": null,
95
+ "channels": [],
96
+ "channelUrls": {},
92
97
  "progress": 0.75,
93
98
  "currentTask": null,
94
99
  "processAlive": null
@@ -64,7 +64,12 @@
64
64
  "cached": 1800
65
65
  },
66
66
  "estUsd": 0.0236,
67
- "unlockedWrites": 0
67
+ "unlockedWrites": 0,
68
+ "mode": null,
69
+ "source": null,
70
+ "prNumber": null,
71
+ "channels": [],
72
+ "channelUrls": {}
68
73
  }
69
74
  ]
70
75
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "count": 1,
4
4
  "runs": [
5
5
  {
@@ -109,7 +109,11 @@
109
109
  "estUsd": 0.0707,
110
110
  "unlockedWrites": 0,
111
111
  "runType": "development",
112
+ "mode": null,
112
113
  "title": null,
114
+ "source": null,
115
+ "prNumber": 104,
116
+ "channels": [],
113
117
  "progress": 1,
114
118
  "currentTask": null,
115
119
  "processAlive": null
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "logsRoot": "/Users/example/.claude/logs/multi-agent",
4
4
  "count": 1,
5
5
  "runs": [
@@ -114,7 +114,12 @@
114
114
  "estUsd": 0.0707,
115
115
  "unlockedWrites": 0,
116
116
  "runType": "development",
117
+ "mode": null,
117
118
  "title": null,
119
+ "source": null,
120
+ "prNumber": 104,
121
+ "channels": [],
122
+ "channelUrls": {},
118
123
  "progress": 1,
119
124
  "currentTask": null,
120
125
  "processAlive": null
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.2.0",
2
+ "contractVersion": "1.3.0",
3
3
  "logsRoot": "/Users/example/.claude/logs/multi-agent",
4
4
  "count": 1,
5
5
  "runs": [
@@ -99,7 +99,12 @@
99
99
  "estUsd": 0.0236,
100
100
  "unlockedWrites": 0,
101
101
  "runType": "autopilot",
102
+ "mode": null,
102
103
  "title": "Fix the crash on the login screen",
104
+ "source": null,
105
+ "prNumber": null,
106
+ "channels": [],
107
+ "channelUrls": {},
103
108
  "progress": 0.8333333333333334,
104
109
  "currentTask": {
105
110
  "subject": "Make the test pass",