@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
@@ -0,0 +1,613 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/activity.schema.json",
4
+ "title": "Office activity",
5
+ "description": "What GET /v1/activity returns and `activity-snapshot.mjs --json` prints, and what each GET /v1/activity/stream event carries: one room per repository, one table per run (its team; a session no run claims sits at a table of its own), one seat per agent seen in the recent window, the orchestrator at the head. Derived from disk on every call. No field is machine-local: there are no paths, seat labels come from allow-listed fields only (tool name, file basename, sidecar description), and every free-text string has been through the redactor, so the redacted and the full view are the same document.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "generatedAt", "recentMinutes", "rooms", "corridors", "counts"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "generatedAt": {
16
+ "type": "string",
17
+ "format": "date-time",
18
+ "x-sensitivity": "none"
19
+ },
20
+ "recentMinutes": {
21
+ "type": "number",
22
+ "description": "A session or subagent whose transcript changed within this window has a desk.",
23
+ "x-sensitivity": "none"
24
+ },
25
+ "counts": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["rooms", "tables", "seats", "live", "waiting"],
29
+ "x-sensitivity": "none",
30
+ "properties": {
31
+ "rooms": {
32
+ "type": "integer",
33
+ "minimum": 0
34
+ },
35
+ "tables": {
36
+ "type": "integer",
37
+ "minimum": 0
38
+ },
39
+ "seats": {
40
+ "type": "integer",
41
+ "minimum": 0
42
+ },
43
+ "live": {
44
+ "type": "integer",
45
+ "minimum": 0
46
+ },
47
+ "waiting": {
48
+ "type": "integer",
49
+ "minimum": 0
50
+ }
51
+ }
52
+ },
53
+ "rooms": {
54
+ "type": "array",
55
+ "x-sensitivity": "none",
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["repo", "tables"],
60
+ "properties": {
61
+ "repo": {
62
+ "type": "string"
63
+ },
64
+ "tables": {
65
+ "type": "array",
66
+ "items": {
67
+ "$ref": "#/$defs/table"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ },
73
+ "corridors": {
74
+ "type": "array",
75
+ "x-sensitivity": "none",
76
+ "description": "Runs over more than one repository: the table and the rooms its corridor joins.",
77
+ "items": {
78
+ "type": "object",
79
+ "additionalProperties": false,
80
+ "required": ["tableId", "repos"],
81
+ "properties": {
82
+ "tableId": {
83
+ "type": "string"
84
+ },
85
+ "repos": {
86
+ "type": "array",
87
+ "items": {
88
+ "type": "string"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ },
95
+ "$defs": {
96
+ "table": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": [
100
+ "id",
101
+ "kind",
102
+ "runType",
103
+ "command",
104
+ "taskId",
105
+ "title",
106
+ "host",
107
+ "limited",
108
+ "sessionId",
109
+ "matchedBy",
110
+ "repos",
111
+ "phase",
112
+ "now",
113
+ "status",
114
+ "waitingForYou",
115
+ "pendingQuestion",
116
+ "tokens",
117
+ "estUsd",
118
+ "costSource",
119
+ "repo",
120
+ "location",
121
+ "branch",
122
+ "phaseHistory",
123
+ "currentTask",
124
+ "progress",
125
+ "startedAt",
126
+ "elapsedSeconds",
127
+ "holder",
128
+ "previousHolder",
129
+ "seats",
130
+ "source",
131
+ "pr",
132
+ "waitingFor",
133
+ "channels"
134
+ ],
135
+ "properties": {
136
+ "id": {
137
+ "type": "string"
138
+ },
139
+ "kind": {
140
+ "enum": ["run", "session", "solo", "unmatched"],
141
+ "description": "run: a pipeline run; session: a session no run claims (outside the pipeline); unmatched: a session more than one run could claim, kept apart rather than guessed. solo: a session the office started for a one-person job, seated at a desk."
142
+ },
143
+ "command": {
144
+ "type": ["string", "null"],
145
+ "description": "The command the table runs, for its room sign: /multi-agent, /multi-agent:analysis, /multi-agent:test-gen. Null for a session no command owns."
146
+ },
147
+ "runType": {
148
+ "enum": ["development", "analysis", "autopilot", null],
149
+ "description": "Which pipeline the table runs: /multi-agent (development), /multi-agent:analysis, or an autopilot run. Null for a session no pipeline owns. The office names the room after it."
150
+ },
151
+ "taskId": {
152
+ "type": ["string", "null"]
153
+ },
154
+ "title": {
155
+ "type": ["string", "null"]
156
+ },
157
+ "host": {
158
+ "enum": ["claude", "copilot", "codex"]
159
+ },
160
+ "limited": {
161
+ "type": "boolean",
162
+ "description": "true for a Copilot CLI or Codex session: no subagent detail exists there."
163
+ },
164
+ "sessionId": {
165
+ "type": ["string", "null"]
166
+ },
167
+ "matchedBy": {
168
+ "enum": ["session", "cwd-branch", null],
169
+ "description": "How the session was tied to the run: the session id the run recorded, or its working directory and branch."
170
+ },
171
+ "repos": {
172
+ "type": "array",
173
+ "items": {
174
+ "type": "string"
175
+ }
176
+ },
177
+ "phase": {
178
+ "oneOf": [
179
+ {
180
+ "type": "object",
181
+ "additionalProperties": false,
182
+ "required": ["id", "name", "last"],
183
+ "properties": {
184
+ "id": {
185
+ "type": "integer"
186
+ },
187
+ "name": {
188
+ "type": "string"
189
+ },
190
+ "last": {
191
+ "type": "integer",
192
+ "description": "The last phase id, for an n of last display."
193
+ }
194
+ }
195
+ },
196
+ {
197
+ "type": "null"
198
+ }
199
+ ]
200
+ },
201
+ "currentTask": {
202
+ "type": ["string", "null"],
203
+ "description": "The task in progress in the phase in progress, from the mirrored task list."
204
+ },
205
+ "progress": {
206
+ "type": ["number", "null"],
207
+ "minimum": 0,
208
+ "maximum": 1
209
+ },
210
+ "now": {
211
+ "type": ["string", "null"]
212
+ },
213
+ "status": {
214
+ "type": ["string", "null"]
215
+ },
216
+ "waitingForYou": {
217
+ "type": "boolean"
218
+ },
219
+ "pendingQuestion": {
220
+ "oneOf": [
221
+ {
222
+ "type": "object",
223
+ "additionalProperties": false,
224
+ "required": ["id", "text", "kind", "options"],
225
+ "properties": {
226
+ "id": {
227
+ "type": "string"
228
+ },
229
+ "text": {
230
+ "type": "string"
231
+ },
232
+ "kind": {
233
+ "enum": ["single-select", "multi-select"]
234
+ },
235
+ "options": {
236
+ "type": "array",
237
+ "items": {
238
+ "type": "object",
239
+ "additionalProperties": false,
240
+ "required": ["id", "label"],
241
+ "properties": {
242
+ "id": {
243
+ "type": "string"
244
+ },
245
+ "label": {
246
+ "type": "string"
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ },
253
+ {
254
+ "type": "null"
255
+ }
256
+ ]
257
+ },
258
+ "tokens": {
259
+ "oneOf": [
260
+ {
261
+ "type": "object",
262
+ "additionalProperties": false,
263
+ "required": ["in", "out", "cached"],
264
+ "properties": {
265
+ "in": {
266
+ "type": "integer",
267
+ "minimum": 0
268
+ },
269
+ "out": {
270
+ "type": "integer",
271
+ "minimum": 0
272
+ },
273
+ "cached": {
274
+ "type": "integer",
275
+ "minimum": 0
276
+ }
277
+ }
278
+ },
279
+ {
280
+ "type": "null"
281
+ }
282
+ ]
283
+ },
284
+ "estUsd": {
285
+ "type": ["number", "null"]
286
+ },
287
+ "costSource": {
288
+ "enum": ["tracker-state", "not-measured"],
289
+ "description": "Where tokens and estUsd come from. not-measured means the numbers are null, never 0."
290
+ },
291
+ "repo": {
292
+ "type": "string",
293
+ "description": "The room this table stands in."
294
+ },
295
+ "location": {
296
+ "enum": ["worktree", "local", "unknown"],
297
+ "description": "worktree: the run works in its own worktree; local: in the main checkout; unknown when the state does not say."
298
+ },
299
+ "branch": {
300
+ "type": ["string", "null"]
301
+ },
302
+ "phaseHistory": {
303
+ "type": "array",
304
+ "items": {
305
+ "type": "object",
306
+ "additionalProperties": false,
307
+ "required": ["id", "name", "status", "startedAt", "completedAt", "progress", "tasks"],
308
+ "properties": {
309
+ "id": {
310
+ "type": ["integer", "null"]
311
+ },
312
+ "progress": {
313
+ "type": ["number", "null"],
314
+ "minimum": 0,
315
+ "maximum": 1,
316
+ "description": "How far the phase is, from its mirrored task list; null when it has none."
317
+ },
318
+ "tasks": {
319
+ "type": "array",
320
+ "maxItems": 20,
321
+ "description": "The phase's task list as the host task widget shows it (mirrored by phase-tracker.sh task), redacted and cut short.",
322
+ "items": {
323
+ "type": "object",
324
+ "additionalProperties": false,
325
+ "required": ["subject", "status"],
326
+ "properties": {
327
+ "subject": {
328
+ "type": "string",
329
+ "maxLength": 80
330
+ },
331
+ "status": {
332
+ "enum": ["pending", "in_progress", "completed"]
333
+ }
334
+ }
335
+ }
336
+ },
337
+ "name": {
338
+ "type": "string"
339
+ },
340
+ "status": {
341
+ "type": "string"
342
+ },
343
+ "startedAt": {
344
+ "type": ["string", "null"]
345
+ },
346
+ "completedAt": {
347
+ "type": ["string", "null"]
348
+ }
349
+ }
350
+ }
351
+ },
352
+ "startedAt": {
353
+ "type": ["string", "null"]
354
+ },
355
+ "elapsedSeconds": {
356
+ "type": ["integer", "null"],
357
+ "minimum": 0
358
+ },
359
+ "holder": {
360
+ "type": ["string", "null"],
361
+ "description": "The seat id that holds the work now."
362
+ },
363
+ "previousHolder": {
364
+ "type": ["string", "null"],
365
+ "description": "The last seat of an earlier phase, for drawing the handoff."
366
+ },
367
+ "seats": {
368
+ "type": "array",
369
+ "items": {
370
+ "$ref": "#/$defs/seat"
371
+ }
372
+ },
373
+ "job": {
374
+ "description": "The office job a session was started for (run tables carry none).",
375
+ "oneOf": [
376
+ {
377
+ "type": "null"
378
+ },
379
+ {
380
+ "type": "object",
381
+ "additionalProperties": false,
382
+ "required": ["id", "role", "team"],
383
+ "properties": {
384
+ "id": {
385
+ "type": "string"
386
+ },
387
+ "role": {
388
+ "type": "string"
389
+ },
390
+ "team": {
391
+ "type": "boolean"
392
+ }
393
+ }
394
+ }
395
+ ]
396
+ },
397
+ "source": {
398
+ "type": ["object", "null"],
399
+ "additionalProperties": false,
400
+ "required": ["kind", "jira", "issue"],
401
+ "description": "Where the run's work came from, for the table sign: a Jira key, a GitHub issue or free text. Null for a session or a run that recorded neither.",
402
+ "properties": {
403
+ "kind": {
404
+ "enum": ["jira", "github", "text"]
405
+ },
406
+ "jira": {
407
+ "type": ["string", "null"],
408
+ "pattern": "^[A-Z][A-Z0-9_]{0,30}-[0-9]{1,9}$"
409
+ },
410
+ "issue": {
411
+ "type": ["string", "null"],
412
+ "pattern": "^[A-Za-z0-9_.-]{1,100}/[A-Za-z0-9_.-]{1,100}#[0-9]{1,9}$"
413
+ }
414
+ }
415
+ },
416
+ "pr": {
417
+ "type": ["object", "null"],
418
+ "additionalProperties": false,
419
+ "required": ["number"],
420
+ "properties": {
421
+ "number": {
422
+ "type": "integer",
423
+ "minimum": 1
424
+ }
425
+ },
426
+ "description": "The pull request the run opened, by number only."
427
+ },
428
+ "waitingFor": {
429
+ "enum": [
430
+ "maturity",
431
+ "user-channels-choice",
432
+ "local-test",
433
+ "attended-reply",
434
+ "question",
435
+ "terminal",
436
+ null
437
+ ],
438
+ "description": "What a waiting run waits for: a step it paused at (the run's waitingFor), or terminal when its session holds a question open in its own window."
439
+ },
440
+ "channels": {
441
+ "type": "array",
442
+ "maxItems": 5,
443
+ "items": {
444
+ "type": "object",
445
+ "additionalProperties": false,
446
+ "required": ["channel", "status"],
447
+ "properties": {
448
+ "channel": {
449
+ "enum": ["pr", "jira", "confluence", "wiki", "issue"]
450
+ },
451
+ "status": {
452
+ "enum": ["posted", "skipped", "failed"]
453
+ }
454
+ }
455
+ },
456
+ "description": "Where the run's report went, per adapter, for the run window; empty for a session or before Phase 5."
457
+ }
458
+ }
459
+ },
460
+ "seat": {
461
+ "type": "object",
462
+ "additionalProperties": false,
463
+ "required": [
464
+ "tasks",
465
+ "mcp",
466
+ "id",
467
+ "sessionId",
468
+ "agentId",
469
+ "agentType",
470
+ "role",
471
+ "label",
472
+ "known",
473
+ "sprite",
474
+ "color",
475
+ "model",
476
+ "modelLabel",
477
+ "description",
478
+ "state",
479
+ "tool",
480
+ "detail",
481
+ "live",
482
+ "startedAt",
483
+ "lastAt",
484
+ "phase",
485
+ "status",
486
+ "doing"
487
+ ],
488
+ "properties": {
489
+ "tasks": {
490
+ "type": "array",
491
+ "maxItems": 20,
492
+ "description": "The desk's own task list from its transcript (TaskCreate / TaskUpdate / TodoWrite), phase tiles left out, redacted and cut short.",
493
+ "items": {
494
+ "type": "object",
495
+ "additionalProperties": false,
496
+ "required": ["subject", "status"],
497
+ "properties": {
498
+ "subject": {
499
+ "type": "string",
500
+ "maxLength": 80
501
+ },
502
+ "status": {
503
+ "enum": ["pending", "in_progress", "completed"]
504
+ }
505
+ }
506
+ }
507
+ },
508
+ "mcp": {
509
+ "type": "array",
510
+ "maxItems": 8,
511
+ "description": "The desk's last MCP calls, newest last: server, tool, whether it is still running, failed or answered, and how long it took. No input or result.",
512
+ "items": {
513
+ "type": "object",
514
+ "additionalProperties": false,
515
+ "required": ["server", "tool", "state", "ms", "at"],
516
+ "properties": {
517
+ "server": {
518
+ "type": "string"
519
+ },
520
+ "tool": {
521
+ "type": "string"
522
+ },
523
+ "state": {
524
+ "enum": ["running", "ok", "error"]
525
+ },
526
+ "ms": {
527
+ "type": ["integer", "null"],
528
+ "minimum": 0
529
+ },
530
+ "at": {
531
+ "type": ["string", "null"]
532
+ }
533
+ }
534
+ }
535
+ },
536
+ "id": {
537
+ "type": "string"
538
+ },
539
+ "sessionId": {
540
+ "type": ["string", "null"]
541
+ },
542
+ "agentId": {
543
+ "type": ["string", "null"],
544
+ "description": "null for the session's own (orchestrator) desk."
545
+ },
546
+ "agentType": {
547
+ "type": ["string", "null"]
548
+ },
549
+ "role": {
550
+ "type": "string"
551
+ },
552
+ "label": {
553
+ "type": "string",
554
+ "description": "The role, numbered when agents of the same role sit at one table (Reviewer 1, Reviewer 2)."
555
+ },
556
+ "known": {
557
+ "type": "boolean",
558
+ "description": "false when the agent type is in no role table entry and the raw type is shown."
559
+ },
560
+ "sprite": {
561
+ "type": "integer",
562
+ "minimum": 0
563
+ },
564
+ "color": {
565
+ "type": "string",
566
+ "pattern": "^#[0-9a-f]{6}$"
567
+ },
568
+ "model": {
569
+ "type": ["string", "null"]
570
+ },
571
+ "modelLabel": {
572
+ "type": ["string", "null"]
573
+ },
574
+ "description": {
575
+ "type": ["string", "null"],
576
+ "maxLength": 64
577
+ },
578
+ "state": {
579
+ "enum": ["reading", "writing", "spawning", "waiting", "idle", "done"]
580
+ },
581
+ "tool": {
582
+ "type": ["string", "null"]
583
+ },
584
+ "detail": {
585
+ "type": ["string", "null"]
586
+ },
587
+ "live": {
588
+ "type": ["boolean", "null"],
589
+ "description": "Whether the session is alive per `claude agents --json`; null when that list cannot be read."
590
+ },
591
+ "startedAt": {
592
+ "type": ["string", "null"],
593
+ "format": "date-time"
594
+ },
595
+ "lastAt": {
596
+ "type": ["string", "null"],
597
+ "format": "date-time"
598
+ },
599
+ "phase": {
600
+ "type": ["integer", "null"],
601
+ "description": "The run phase the agent was spawned in; null for the orchestrator or outside a run."
602
+ },
603
+ "status": {
604
+ "enum": ["working", "idle", "done"]
605
+ },
606
+ "doing": {
607
+ "type": "string",
608
+ "description": "What the seat is doing in a few plain words (Reading Foo.swift, Running a command), else the raw tool name."
609
+ }
610
+ }
611
+ }
612
+ }
613
+ }