wicked-crew 0.16.11 → 0.16.13

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 (341) hide show
  1. package/README.md +28 -8
  2. package/dist/api/artifact-outline.d.ts +64 -0
  3. package/dist/api/artifact-outline.d.ts.map +1 -0
  4. package/dist/api/artifact-outline.js +254 -0
  5. package/dist/api/artifact-outline.js.map +1 -0
  6. package/dist/api/beneath.d.ts +76 -0
  7. package/dist/api/beneath.d.ts.map +1 -0
  8. package/dist/api/beneath.js +214 -0
  9. package/dist/api/beneath.js.map +1 -0
  10. package/dist/api/capture.d.ts +2 -2
  11. package/dist/api/chat-citations.d.ts +25 -1
  12. package/dist/api/chat-citations.d.ts.map +1 -1
  13. package/dist/api/chat-citations.js +186 -61
  14. package/dist/api/chat-citations.js.map +1 -1
  15. package/dist/api/chat-context.d.ts +236 -0
  16. package/dist/api/chat-context.d.ts.map +1 -0
  17. package/dist/api/chat-context.js +808 -0
  18. package/dist/api/chat-context.js.map +1 -0
  19. package/dist/api/chat-history.d.ts +20 -0
  20. package/dist/api/chat-history.d.ts.map +1 -1
  21. package/dist/api/chat-history.js +46 -1
  22. package/dist/api/chat-history.js.map +1 -1
  23. package/dist/api/chat-proposals.d.ts +534 -0
  24. package/dist/api/chat-proposals.d.ts.map +1 -0
  25. package/dist/api/chat-proposals.js +1562 -0
  26. package/dist/api/chat-proposals.js.map +1 -0
  27. package/dist/api/chat-scope.d.ts +41 -0
  28. package/dist/api/chat-scope.d.ts.map +1 -1
  29. package/dist/api/chat-scope.js +87 -15
  30. package/dist/api/chat-scope.js.map +1 -1
  31. package/dist/api/chat-transcripts.d.ts +27 -2
  32. package/dist/api/chat-transcripts.d.ts.map +1 -1
  33. package/dist/api/chat-transcripts.js +105 -4
  34. package/dist/api/chat-transcripts.js.map +1 -1
  35. package/dist/api/diagnostics.d.ts +15 -0
  36. package/dist/api/diagnostics.d.ts.map +1 -1
  37. package/dist/api/diagnostics.js +56 -0
  38. package/dist/api/diagnostics.js.map +1 -1
  39. package/dist/api/elicitation-cache.d.ts +13 -0
  40. package/dist/api/elicitation-cache.d.ts.map +1 -1
  41. package/dist/api/elicitation-cache.js +12 -0
  42. package/dist/api/elicitation-cache.js.map +1 -1
  43. package/dist/api/eval-sample.d.ts +12 -12
  44. package/dist/api/frame-guard.d.ts +62 -0
  45. package/dist/api/frame-guard.d.ts.map +1 -0
  46. package/dist/api/frame-guard.js +97 -0
  47. package/dist/api/frame-guard.js.map +1 -0
  48. package/dist/api/governance-steering.d.ts +4 -4
  49. package/dist/api/multiscope.d.ts +3 -0
  50. package/dist/api/multiscope.d.ts.map +1 -1
  51. package/dist/api/multiscope.js +13 -0
  52. package/dist/api/multiscope.js.map +1 -1
  53. package/dist/api/needs.d.ts +6 -0
  54. package/dist/api/needs.d.ts.map +1 -1
  55. package/dist/api/needs.js +31 -4
  56. package/dist/api/needs.js.map +1 -1
  57. package/dist/api/product.d.ts.map +1 -1
  58. package/dist/api/product.js +13 -2
  59. package/dist/api/product.js.map +1 -1
  60. package/dist/api/project-aggregates.d.ts +6 -6
  61. package/dist/api/project-aggregates.d.ts.map +1 -1
  62. package/dist/api/project-aggregates.js +16 -24
  63. package/dist/api/project-aggregates.js.map +1 -1
  64. package/dist/api/requirements.d.ts +261 -6
  65. package/dist/api/requirements.d.ts.map +1 -1
  66. package/dist/api/requirements.js +344 -64
  67. package/dist/api/requirements.js.map +1 -1
  68. package/dist/api/routes.d.ts +156 -4
  69. package/dist/api/routes.d.ts.map +1 -1
  70. package/dist/api/routes.js +851 -78
  71. package/dist/api/routes.js.map +1 -1
  72. package/dist/api/run-brief.d.ts +78 -0
  73. package/dist/api/run-brief.d.ts.map +1 -0
  74. package/dist/api/run-brief.js +318 -0
  75. package/dist/api/run-brief.js.map +1 -0
  76. package/dist/api/run-files.d.ts.map +1 -1
  77. package/dist/api/run-files.js +5 -1
  78. package/dist/api/run-files.js.map +1 -1
  79. package/dist/api/run-timing-index.d.ts +27 -0
  80. package/dist/api/run-timing-index.d.ts.map +1 -1
  81. package/dist/api/run-timing-index.js +65 -0
  82. package/dist/api/run-timing-index.js.map +1 -1
  83. package/dist/api/seat-images.d.ts +102 -0
  84. package/dist/api/seat-images.d.ts.map +1 -0
  85. package/dist/api/seat-images.js +333 -0
  86. package/dist/api/seat-images.js.map +1 -0
  87. package/dist/api/server.d.ts +3 -0
  88. package/dist/api/server.d.ts.map +1 -1
  89. package/dist/api/server.js +265 -2
  90. package/dist/api/server.js.map +1 -1
  91. package/dist/api/steering-landing.d.ts +48 -1
  92. package/dist/api/steering-landing.d.ts.map +1 -1
  93. package/dist/api/steering-landing.js +116 -42
  94. package/dist/api/steering-landing.js.map +1 -1
  95. package/dist/api/system-snapshot.d.ts +51 -2
  96. package/dist/api/system-snapshot.d.ts.map +1 -1
  97. package/dist/api/system-snapshot.js +151 -15
  98. package/dist/api/system-snapshot.js.map +1 -1
  99. package/dist/api/testing.d.ts +4 -4
  100. package/dist/api/testing.js +2 -2
  101. package/dist/api/testing.js.map +1 -1
  102. package/dist/apps/spec.d.ts +3009 -0
  103. package/dist/apps/spec.d.ts.map +1 -0
  104. package/dist/apps/spec.js +870 -0
  105. package/dist/apps/spec.js.map +1 -0
  106. package/dist/campaigns/routes.js +1 -1
  107. package/dist/campaigns/routes.js.map +1 -1
  108. package/dist/cli/index.js +3 -3
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/core/adapter.d.ts +12 -0
  111. package/dist/core/adapter.d.ts.map +1 -1
  112. package/dist/core/adapter.js +36 -1
  113. package/dist/core/adapter.js.map +1 -1
  114. package/dist/core/deliver-text.d.ts.map +1 -1
  115. package/dist/core/deliver-text.js +22 -10
  116. package/dist/core/deliver-text.js.map +1 -1
  117. package/dist/core/estate-mcp-client.d.ts +7 -1
  118. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  119. package/dist/core/estate-mcp-client.js +10 -2
  120. package/dist/core/estate-mcp-client.js.map +1 -1
  121. package/dist/core/exec.d.ts +12 -0
  122. package/dist/core/exec.d.ts.map +1 -1
  123. package/dist/core/exec.js +23 -0
  124. package/dist/core/exec.js.map +1 -1
  125. package/dist/core/reassign-refusal.d.ts.map +1 -1
  126. package/dist/core/reassign-refusal.js +23 -3
  127. package/dist/core/reassign-refusal.js.map +1 -1
  128. package/dist/core/repoPaths.d.ts +32 -7
  129. package/dist/core/repoPaths.d.ts.map +1 -1
  130. package/dist/core/repoPaths.js +56 -9
  131. package/dist/core/repoPaths.js.map +1 -1
  132. package/dist/core/requirements-graph-setting.d.ts +32 -0
  133. package/dist/core/requirements-graph-setting.d.ts.map +1 -0
  134. package/dist/core/requirements-graph-setting.js +84 -0
  135. package/dist/core/requirements-graph-setting.js.map +1 -0
  136. package/dist/core/run-boot-resume.d.ts +4 -1
  137. package/dist/core/run-boot-resume.d.ts.map +1 -1
  138. package/dist/core/run-boot-resume.js +6 -1
  139. package/dist/core/run-boot-resume.js.map +1 -1
  140. package/dist/core/run-identity.d.ts.map +1 -1
  141. package/dist/core/run-identity.js +6 -0
  142. package/dist/core/run-identity.js.map +1 -1
  143. package/dist/core/types.d.ts +14 -0
  144. package/dist/core/types.d.ts.map +1 -1
  145. package/dist/core/types.js.map +1 -1
  146. package/dist/decisions/chat-recorder.d.ts +14 -3
  147. package/dist/decisions/chat-recorder.d.ts.map +1 -1
  148. package/dist/decisions/chat-recorder.js +54 -9
  149. package/dist/decisions/chat-recorder.js.map +1 -1
  150. package/dist/editors/csp.d.ts +24 -4
  151. package/dist/editors/csp.d.ts.map +1 -1
  152. package/dist/editors/csp.js +35 -8
  153. package/dist/editors/csp.js.map +1 -1
  154. package/dist/editors/registry.d.ts +46 -21
  155. package/dist/editors/registry.d.ts.map +1 -1
  156. package/dist/editors/registry.js +13 -2
  157. package/dist/editors/registry.js.map +1 -1
  158. package/dist/editors/routes.d.ts +4 -1
  159. package/dist/editors/routes.d.ts.map +1 -1
  160. package/dist/editors/routes.js +30 -3
  161. package/dist/editors/routes.js.map +1 -1
  162. package/dist/editors/visuals.d.ts +51 -0
  163. package/dist/editors/visuals.d.ts.map +1 -0
  164. package/dist/editors/visuals.js +164 -0
  165. package/dist/editors/visuals.js.map +1 -0
  166. package/dist/editors/webrtc-guard.d.ts +94 -0
  167. package/dist/editors/webrtc-guard.d.ts.map +1 -0
  168. package/dist/editors/webrtc-guard.js +506 -0
  169. package/dist/editors/webrtc-guard.js.map +1 -0
  170. package/dist/inspect/reading.d.ts +110 -0
  171. package/dist/inspect/reading.d.ts.map +1 -0
  172. package/dist/inspect/reading.js +325 -0
  173. package/dist/inspect/reading.js.map +1 -0
  174. package/dist/inspect/routes.d.ts +14 -0
  175. package/dist/inspect/routes.d.ts.map +1 -0
  176. package/dist/inspect/routes.js +44 -0
  177. package/dist/inspect/routes.js.map +1 -0
  178. package/dist/inspect/service.d.ts +161 -0
  179. package/dist/inspect/service.d.ts.map +1 -0
  180. package/dist/inspect/service.js +466 -0
  181. package/dist/inspect/service.js.map +1 -0
  182. package/dist/interactive/bridge-pool.d.ts +11 -2
  183. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  184. package/dist/interactive/bridge-pool.js +10 -1
  185. package/dist/interactive/bridge-pool.js.map +1 -1
  186. package/dist/interactive/doc-binding.d.ts +156 -0
  187. package/dist/interactive/doc-binding.d.ts.map +1 -0
  188. package/dist/interactive/doc-binding.js +277 -0
  189. package/dist/interactive/doc-binding.js.map +1 -0
  190. package/dist/interactive/doc-delete-routes.d.ts +3 -0
  191. package/dist/interactive/doc-delete-routes.d.ts.map +1 -1
  192. package/dist/interactive/doc-delete-routes.js +4 -0
  193. package/dist/interactive/doc-delete-routes.js.map +1 -1
  194. package/dist/interactive/draft-events.d.ts +89 -3
  195. package/dist/interactive/draft-events.d.ts.map +1 -1
  196. package/dist/interactive/draft-events.js +441 -30
  197. package/dist/interactive/draft-events.js.map +1 -1
  198. package/dist/interactive/draft-skill.d.ts +7 -0
  199. package/dist/interactive/draft-skill.d.ts.map +1 -1
  200. package/dist/interactive/draft-skill.js +10 -3
  201. package/dist/interactive/draft-skill.js.map +1 -1
  202. package/dist/interactive/edit-events.d.ts +2 -0
  203. package/dist/interactive/edit-events.d.ts.map +1 -1
  204. package/dist/interactive/edit-events.js +11 -0
  205. package/dist/interactive/edit-events.js.map +1 -1
  206. package/dist/interactive/proposal-create.d.ts +143 -0
  207. package/dist/interactive/proposal-create.d.ts.map +1 -0
  208. package/dist/interactive/proposal-create.js +318 -0
  209. package/dist/interactive/proposal-create.js.map +1 -0
  210. package/dist/interactive/proxy-routes.d.ts +60 -3
  211. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  212. package/dist/interactive/proxy-routes.js +217 -3
  213. package/dist/interactive/proxy-routes.js.map +1 -1
  214. package/dist/interactive/source-packet.d.ts +126 -0
  215. package/dist/interactive/source-packet.d.ts.map +1 -0
  216. package/dist/interactive/source-packet.js +482 -0
  217. package/dist/interactive/source-packet.js.map +1 -0
  218. package/dist/learnings/estate.d.ts +16 -0
  219. package/dist/learnings/estate.d.ts.map +1 -0
  220. package/dist/learnings/estate.js +68 -0
  221. package/dist/learnings/estate.js.map +1 -0
  222. package/dist/learnings/extract.d.ts +56 -0
  223. package/dist/learnings/extract.d.ts.map +1 -0
  224. package/dist/learnings/extract.js +252 -0
  225. package/dist/learnings/extract.js.map +1 -0
  226. package/dist/learnings/recall.d.ts +43 -0
  227. package/dist/learnings/recall.d.ts.map +1 -0
  228. package/dist/learnings/recall.js +104 -0
  229. package/dist/learnings/recall.js.map +1 -0
  230. package/dist/learnings/service.d.ts +183 -0
  231. package/dist/learnings/service.d.ts.map +1 -0
  232. package/dist/learnings/service.js +571 -0
  233. package/dist/learnings/service.js.map +1 -0
  234. package/dist/mcp/ask-server.d.ts.map +1 -1
  235. package/dist/mcp/ask-server.js +37 -4
  236. package/dist/mcp/ask-server.js.map +1 -1
  237. package/dist/mcp/broker.d.ts +12 -1
  238. package/dist/mcp/broker.d.ts.map +1 -1
  239. package/dist/mcp/broker.js +24 -5
  240. package/dist/mcp/broker.js.map +1 -1
  241. package/dist/mcp/invoke.d.ts +26 -2
  242. package/dist/mcp/invoke.d.ts.map +1 -1
  243. package/dist/mcp/invoke.js +51 -5
  244. package/dist/mcp/invoke.js.map +1 -1
  245. package/dist/persona/routes.d.ts +92 -0
  246. package/dist/persona/routes.d.ts.map +1 -0
  247. package/dist/persona/routes.js +69 -0
  248. package/dist/persona/routes.js.map +1 -0
  249. package/dist/persona/store.d.ts +104 -0
  250. package/dist/persona/store.d.ts.map +1 -0
  251. package/dist/persona/store.js +176 -0
  252. package/dist/persona/store.js.map +1 -0
  253. package/dist/persona/voice.d.ts +4 -0
  254. package/dist/persona/voice.d.ts.map +1 -0
  255. package/dist/persona/voice.js +58 -0
  256. package/dist/persona/voice.js.map +1 -0
  257. package/dist/projects/routes.d.ts +2 -2
  258. package/dist/setup/known.d.ts +56 -0
  259. package/dist/setup/known.d.ts.map +1 -0
  260. package/dist/setup/known.js +159 -0
  261. package/dist/setup/known.js.map +1 -0
  262. package/dist/setup/routes.d.ts +13 -0
  263. package/dist/setup/routes.d.ts.map +1 -0
  264. package/dist/setup/routes.js +20 -0
  265. package/dist/setup/routes.js.map +1 -0
  266. package/dist/standing-orders/history.d.ts +2 -0
  267. package/dist/standing-orders/history.d.ts.map +1 -1
  268. package/dist/standing-orders/history.js +1 -0
  269. package/dist/standing-orders/history.js.map +1 -1
  270. package/dist/studio/assets/WickedSans-Regular-fb698rcD.woff2 +0 -0
  271. package/dist/studio/assets/WickedSans-SemiBold-CD53n1AC.woff2 +0 -0
  272. package/dist/studio/assets/WickedScript-Regular-CY5juO6I.woff2 +0 -0
  273. package/dist/studio/assets/WickedSerif-Regular-mdPEjaVZ.woff2 +0 -0
  274. package/dist/studio/assets/index-BUZ_-Syk.css +32 -0
  275. package/dist/studio/assets/index-u4O_7N-b.js +986 -0
  276. package/dist/studio/editors/wicked-deck/editor.json +6 -1
  277. package/dist/studio/editors/wicked-deck/icon.svg +1 -0
  278. package/dist/studio/editors/wicked-deck/index.html +1 -1
  279. package/dist/studio/editors/wicked-doc/editor.json +6 -1
  280. package/dist/studio/editors/wicked-doc/icon.svg +1 -0
  281. package/dist/studio/editors/wicked-doc/index.html +1 -1
  282. package/dist/studio/editors/wicked-insights/editor.json +6 -1
  283. package/dist/studio/editors/wicked-insights/icon.svg +1 -0
  284. package/dist/studio/editors/wicked-insights/index.html +1 -1
  285. package/dist/studio/editors/wicked-page/editor.json +6 -1
  286. package/dist/studio/editors/wicked-page/icon.svg +1 -0
  287. package/dist/studio/editors/wicked-page/index.html +1 -1
  288. package/dist/studio/editors/wicked-video/editor.json +6 -1
  289. package/dist/studio/editors/wicked-video/icon.svg +1 -0
  290. package/dist/studio/editors/wicked-video/index.html +1 -1
  291. package/dist/studio/index.html +2 -2
  292. package/dist/studio/testid-inventory.json +5155 -2707
  293. package/dist/voice/dashboard.d.ts +376 -0
  294. package/dist/voice/dashboard.d.ts.map +1 -0
  295. package/dist/voice/dashboard.js +92 -0
  296. package/dist/voice/dashboard.js.map +1 -0
  297. package/dist/voice/inject-input.d.ts +51 -0
  298. package/dist/voice/inject-input.d.ts.map +1 -0
  299. package/dist/voice/inject-input.js +126 -0
  300. package/dist/voice/inject-input.js.map +1 -0
  301. package/dist/voice/routes.d.ts +41 -0
  302. package/dist/voice/routes.d.ts.map +1 -0
  303. package/dist/voice/routes.js +116 -0
  304. package/dist/voice/routes.js.map +1 -0
  305. package/dist/voice/service.d.ts +177 -0
  306. package/dist/voice/service.d.ts.map +1 -0
  307. package/dist/voice/service.js +400 -0
  308. package/dist/voice/service.js.map +1 -0
  309. package/dist/workflow-catalog/build.d.ts +35 -0
  310. package/dist/workflow-catalog/build.d.ts.map +1 -0
  311. package/dist/workflow-catalog/build.js +229 -0
  312. package/dist/workflow-catalog/build.js.map +1 -0
  313. package/dist/workflow-catalog/catalog-data.d.ts +36 -0
  314. package/dist/workflow-catalog/catalog-data.d.ts.map +1 -0
  315. package/dist/workflow-catalog/catalog-data.js +430 -0
  316. package/dist/workflow-catalog/catalog-data.js.map +1 -0
  317. package/dist/working-doc/event-lines.d.ts +76 -0
  318. package/dist/working-doc/event-lines.d.ts.map +1 -0
  319. package/dist/working-doc/event-lines.js +247 -0
  320. package/dist/working-doc/event-lines.js.map +1 -0
  321. package/dist/working-doc/routes.d.ts +1 -1
  322. package/dist/working-doc/routes.d.ts.map +1 -1
  323. package/dist/working-doc/routes.js +2 -1
  324. package/dist/working-doc/routes.js.map +1 -1
  325. package/dist/working-doc/sections.d.ts +3 -1
  326. package/dist/working-doc/sections.d.ts.map +1 -1
  327. package/dist/working-doc/sections.js +4 -2
  328. package/dist/working-doc/sections.js.map +1 -1
  329. package/dist/working-doc/service.d.ts +66 -1
  330. package/dist/working-doc/service.d.ts.map +1 -1
  331. package/dist/working-doc/service.js +298 -22
  332. package/dist/working-doc/service.js.map +1 -1
  333. package/dist/working-doc/store.d.ts +8 -2
  334. package/dist/working-doc/store.d.ts.map +1 -1
  335. package/dist/working-doc/store.js.map +1 -1
  336. package/endpoint-manifest.json +205 -2
  337. package/package.json +5 -4
  338. package/workflows/distill-learnings.json +27 -0
  339. package/workflows/inspect-unit.json +27 -0
  340. package/dist/studio/assets/index-B-f_VEL2.css +0 -32
  341. package/dist/studio/assets/index-DhkxIK-0.js +0 -845
@@ -0,0 +1,325 @@
1
+ /**
2
+ * CREW'S OWN READING of a working step (operator 2026-10-30: "if it's been running long you can have an agent analyze
3
+ * right there, to make sure no tokens are wasted and no problems are occurring"). Pure and deterministic: the unit's
4
+ * newest attempt, read off its recorded frames, and nothing else.
5
+ *
6
+ * What it reads (the run's own log, `GET /runs/:id/events`):
7
+ * - `toolActivity` (core#1207): each tool call, started and finished, with its target; a `working` frame is a quiet
8
+ * seat's heartbeat and is not a call;
9
+ * - `powerActivity`: power mode's edits and commits, read off git;
10
+ * - `unitOutputDelta`: what the seat said;
11
+ * - `usageProgress` (live) and `cliUsage` (at the attempt's end): its tokens.
12
+ *
13
+ * What it says, in this order (the first that holds):
14
+ * - **stuck**: a call open for {@link STUCK_OPEN_CALL_MS} (a hung process), or nothing at all for
15
+ * {@link STUCK_QUIET_MS} (no call, no words, no tokens);
16
+ * - **looping**: the same call (tool + target) {@link LOOP_SAME_CALL} times, the same failing command
17
+ * {@link LOOP_FAILING_RERUN} times, or the same file edited {@link LOOP_SAME_FILE_EDITS} times; with the evidence;
18
+ * - **wasteful**: {@link WASTE_TOKENS} tokens or more since its last new words or edit, at least
19
+ * {@link WASTE_MIN_MS} ago;
20
+ * - else **progressing**.
21
+ *
22
+ * The seat that checks on a step (service.ts) gets this reading and the step's recent frames; this reading stands on
23
+ * its own when no such seat can answer.
24
+ */
25
+ /** A call open this long is a hung process. */
26
+ export const STUCK_OPEN_CALL_MS = 10 * 60_000;
27
+ /** Nothing at all this long (no call, no words, no tokens): stuck. */
28
+ export const STUCK_QUIET_MS = 5 * 60_000;
29
+ /** The same call (tool + target) this many times: a loop. */
30
+ export const LOOP_SAME_CALL = 4;
31
+ /** The same command failing this many times: a loop. */
32
+ export const LOOP_FAILING_RERUN = 3;
33
+ /** The same file edited this many times: a loop. */
34
+ export const LOOP_SAME_FILE_EDITS = 6;
35
+ /** Tokens spent since the last new words or edit that read as waste... */
36
+ export const WASTE_TOKENS = 400_000;
37
+ /** A usage total sent this soon after an output still belongs to the turn that made it (the engine sends at most one
38
+ * per 3 s, after the message that carried the output). */
39
+ export const USAGE_SETTLE_MS = 5_000;
40
+ /** ...when that last new output is at least this old. */
41
+ export const WASTE_MIN_MS = 3 * 60_000;
42
+ const str = (v) => (typeof v === 'string' && v.trim() !== '' ? v.trim() : null);
43
+ const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : null);
44
+ const timeOf = (e) => num(e['ts']) ?? num(e['at']);
45
+ const oneLine = (s, max = 90) => {
46
+ const t = s.replace(/\s+/g, ' ').trim();
47
+ return t.length > max ? `${t.slice(0, max - 1)}…` : t;
48
+ };
49
+ const plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
50
+ const mins = (ms) => {
51
+ const m = Math.round(ms / 60_000);
52
+ return m < 1 ? `${Math.max(1, Math.round(ms / 1000))} s` : `${m} min`;
53
+ };
54
+ const tokens = (n) => (n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)}M` : n >= 1000 ? `${Math.round(n / 1000)}k` : String(n));
55
+ /** The frames of the unit's newest attempt: from its last `unitDispatched`, this ord only. */
56
+ export function attemptFrames(events, ord) {
57
+ let from = -1;
58
+ for (let i = events.length - 1; i >= 0; i -= 1) {
59
+ const e = events[i];
60
+ if (e['ord'] === ord && e['type'] === 'unitDispatched') {
61
+ from = i;
62
+ break;
63
+ }
64
+ }
65
+ const start = from >= 0 ? events[from] : null;
66
+ const attempt = start !== null ? num(start['attempt']) ?? 0 : 0;
67
+ const frames = events.slice(Math.max(0, from)).filter((e) => e['ord'] === ord
68
+ // A frame stamped with another attempt is not this one's.
69
+ && (typeof e['attempt'] !== 'number' || e['attempt'] === attempt));
70
+ return { frames, attempt, startedAt: start !== null ? timeOf(start) : null };
71
+ }
72
+ /** A call's identity for repeat counting: the tool and its target, whitespace folded. */
73
+ const callKey = (c) => `${c.tool}\u0000${(c.target ?? '').replace(/\s+/g, ' ').trim()}`;
74
+ function callWords(c) {
75
+ const t = c.target !== null ? oneLine(c.target, 80) : null;
76
+ switch (c.kind) {
77
+ case 'read': return t !== null ? `${c.open ? 'Reading' : 'Read'} ${t}` : c.open ? 'Reading a file' : 'Read a file';
78
+ case 'search': return t !== null ? `${c.open ? 'Searching' : 'Searched'} ${t}` : c.open ? 'Searching the code' : 'Searched the code';
79
+ case 'test': return c.open ? `Running the tests${t !== null ? ` \`${t}\`` : ''}` : `Ran the tests${t !== null ? ` \`${t}\`` : ''}${c.ok === false ? ' (failed)' : ''}`;
80
+ case 'run': return t !== null ? `${c.open ? 'Running' : 'Ran'} \`${t}\`${!c.open && c.ok === false ? ' (failed)' : ''}` : c.open ? 'Running a command' : 'Ran a command';
81
+ case 'edit': return t !== null ? `${c.open ? 'Editing' : 'Edited'} ${t}` : c.open ? 'Editing a file' : 'Edited a file';
82
+ case 'write': return t !== null ? `${c.open ? 'Writing' : 'Wrote'} ${t}` : c.open ? 'Writing a file' : 'Wrote a file';
83
+ default: return `${c.open ? 'Using' : 'Used'} ${c.tool}${t !== null ? ` on ${t}` : ''}`;
84
+ }
85
+ }
86
+ /** Crew's reading of the unit's newest attempt at `now`. */
87
+ export function readUnit(events, ord, now) {
88
+ const { frames, attempt, startedAt } = attemptFrames(events ?? [], ord);
89
+ const calls = [];
90
+ const byId = new Map();
91
+ const edits = new Map();
92
+ const editTimes = [];
93
+ const gitEdits = [];
94
+ let deltas = 0;
95
+ let chars = 0;
96
+ let saidAt = null;
97
+ let newest = null;
98
+ const seenText = new Set();
99
+ let usage = null;
100
+ /** Live usage totals in time order, to measure the tokens spent since the last new output. */
101
+ const usageAt = [];
102
+ let lastSignAt = null;
103
+ const sign = (t) => { if (t !== null && (lastSignAt === null || t > lastSignAt))
104
+ lastSignAt = t; };
105
+ const edited = (path, at) => {
106
+ if (path === null)
107
+ return;
108
+ edits.set(path, (edits.get(path) ?? 0) + 1);
109
+ if (at !== null)
110
+ editTimes.push(at);
111
+ };
112
+ for (const e of frames) {
113
+ const at = timeOf(e);
114
+ switch (e['type']) {
115
+ case 'toolActivity': {
116
+ if (e['state'] === 'working' || e['kind'] === 'working')
117
+ continue;
118
+ sign(at);
119
+ const id = str(e['id']);
120
+ const prev = id !== null ? byId.get(id) : undefined;
121
+ const ok = typeof e['ok'] === 'boolean' ? e['ok'] : null;
122
+ if (e['state'] === 'finished' && prev !== undefined) {
123
+ calls[prev] = { ...calls[prev], open: false, ok, durationMs: num(e['durationMs']) };
124
+ // An edit's change lands when it finishes.
125
+ if ((calls[prev].kind === 'edit' || calls[prev].kind === 'write') && at !== null)
126
+ editTimes.push(at);
127
+ continue;
128
+ }
129
+ const call = {
130
+ tool: str(e['tool']) ?? 'tool', kind: str(e['kind']) ?? 'other', target: str(e['target']), at, ok,
131
+ durationMs: num(e['durationMs']), open: e['state'] === 'started',
132
+ };
133
+ if (id !== null)
134
+ byId.set(id, calls.length);
135
+ calls.push(call);
136
+ if (call.kind === 'edit' || call.kind === 'write')
137
+ edited(call.target, at);
138
+ break;
139
+ }
140
+ case 'powerActivity':
141
+ sign(at);
142
+ // Power mode reads the same edits back off git: counted only where the seat's stream says nothing of its
143
+ // edits (xreview on #1233: an edit seen by both was counted twice).
144
+ if (e['kind'] === 'edit')
145
+ gitEdits.push({ path: str(e['path']), at });
146
+ break;
147
+ case 'unitOutputDelta': {
148
+ const text = str(e['text']);
149
+ if (text === null)
150
+ break;
151
+ sign(at);
152
+ deltas += 1;
153
+ chars += text.length;
154
+ // New words, not a repeat of something it already said.
155
+ const key = text.replace(/\s+/g, ' ');
156
+ if (!seenText.has(key)) {
157
+ seenText.add(key);
158
+ saidAt = at ?? saidAt;
159
+ const lines = text.split('\n').map((l) => l.trim()).filter((l) => l !== '');
160
+ newest = lines.length > 0 ? oneLine(lines[lines.length - 1], 140) : newest;
161
+ }
162
+ break;
163
+ }
164
+ case 'usageProgress': {
165
+ const i = num(e['inputTokens']);
166
+ const o = num(e['outputTokens']);
167
+ if (i === null || o === null)
168
+ break;
169
+ sign(at);
170
+ usage = { inputTokens: i, outputTokens: o, costUsd: num(e['costUsd']), source: 'live' };
171
+ if (at !== null)
172
+ usageAt.push({ at, total: i + o });
173
+ break;
174
+ }
175
+ case 'cliUsage': {
176
+ const i = num(e['inputTokens']);
177
+ const o = num(e['outputTokens']);
178
+ if (i === null || o === null)
179
+ break;
180
+ usage = { inputTokens: i, outputTokens: o, costUsd: num(e['costUsd']), source: 'final' };
181
+ break;
182
+ }
183
+ default:
184
+ break;
185
+ }
186
+ }
187
+ if (!calls.some((c) => c.kind === 'edit' || c.kind === 'write'))
188
+ for (const g of gitEdits)
189
+ edited(g.path, g.at);
190
+ const byKind = {};
191
+ for (const c of calls)
192
+ byKind[c.kind] = (byKind[c.kind] ?? 0) + 1;
193
+ const open = calls.filter((c) => c.open).map((c) => ({ tool: c.tool, target: c.target, forMs: c.at !== null ? Math.max(0, now - c.at) : 0 }));
194
+ const editList = [...edits.entries()].map(([path, count]) => ({ path, count })).sort((a, b) => b.count - a.count || a.path.localeCompare(b.path));
195
+ const newestCall = calls.at(-1);
196
+ const doing = newestCall !== undefined ? callWords(newestCall) : newest;
197
+ const evidence = [];
198
+ let verdict = 'progressing';
199
+ let action = 'let_run';
200
+ let note = null;
201
+ // ── stuck ──
202
+ const hung = open.filter((o) => o.forMs >= STUCK_OPEN_CALL_MS).sort((a, b) => b.forMs - a.forMs)[0];
203
+ const quietFor = lastSignAt !== null ? now - lastSignAt : startedAt !== null ? now - startedAt : null;
204
+ if (hung !== undefined) {
205
+ verdict = 'stuck';
206
+ const what = hung.target !== null ? `\`${oneLine(hung.target, 80)}\`` : hung.tool;
207
+ evidence.push(`${what} has been running for ${mins(hung.forMs)} with no result`);
208
+ action = 'stop';
209
+ note = null;
210
+ }
211
+ else if (quietFor !== null && quietFor >= STUCK_QUIET_MS && open.length === 0) {
212
+ verdict = 'stuck';
213
+ evidence.push(lastSignAt !== null
214
+ ? `Nothing for ${mins(quietFor)}: no tool call, no words and no tokens since then`
215
+ : `Nothing since it started ${mins(quietFor)} ago: no tool call, no words and no tokens`);
216
+ action = 'steer';
217
+ note = `You have been quiet for ${mins(quietFor)}. Say where you are, what you are waiting on, and what you will do next.`;
218
+ }
219
+ // ── looping ──
220
+ if (verdict === 'progressing') {
221
+ const counts = new Map();
222
+ for (const c of calls) {
223
+ // Edits are counted per file below ({@link LOOP_SAME_FILE_EDITS}): several edits to one file are normal work.
224
+ if (c.kind === 'skill' || c.kind === 'task' || c.kind === 'edit' || c.kind === 'write')
225
+ continue;
226
+ const k = callKey(c);
227
+ const cur = counts.get(k) ?? { call: c, n: 0, failed: 0 };
228
+ cur.n += 1;
229
+ if (c.ok === false)
230
+ cur.failed += 1;
231
+ counts.set(k, cur);
232
+ }
233
+ const loops = [];
234
+ for (const { call, n, failed } of counts.values()) {
235
+ const what = call.target !== null ? `\`${oneLine(call.target, 80)}\`` : call.tool;
236
+ if ((call.kind === 'run' || call.kind === 'test') && failed >= LOOP_FAILING_RERUN)
237
+ loops.push(`Ran ${what} ${n} times, ${failed} failed`);
238
+ else if (n >= LOOP_SAME_CALL)
239
+ loops.push(`${call.kind === 'read' ? 'Read' : call.kind === 'search' ? 'Searched' : 'Ran'} ${what} ${n} times`);
240
+ }
241
+ for (const { path, count } of editList) {
242
+ if (count >= LOOP_SAME_FILE_EDITS && !loops.some((l) => l.includes(path)))
243
+ loops.push(`Edited ${path} ${count} times`);
244
+ }
245
+ if (loops.length > 0) {
246
+ verdict = 'looping';
247
+ evidence.push(...loops.slice(0, 4));
248
+ action = 'steer';
249
+ note = `You seem to be repeating yourself (${loops[0].replace(/`/g, '')}). Stop repeating it: say what you learned from the last attempts and try a different approach, or say what blocks you.`;
250
+ }
251
+ }
252
+ // ── wasteful ──
253
+ if (verdict === 'progressing' && usageAt.length > 0) {
254
+ const lastOutput = Math.max(saidAt ?? -Infinity, editTimes.length > 0 ? Math.max(...editTimes) : -Infinity, startedAt ?? -Infinity);
255
+ const latest = usageAt[usageAt.length - 1];
256
+ // The total when it last said or changed something: the newest snapshot up to the settle window after it (the
257
+ // total that turn's own message sent, xreview on #1233); none = 0. Only tokens spent after that are waste.
258
+ const settled = lastOutput + USAGE_SETTLE_MS;
259
+ const before = [...usageAt].reverse().find((u) => u.at <= settled)?.total ?? 0;
260
+ const spent = latest.total - before;
261
+ if (Number.isFinite(lastOutput) && latest.at > settled && spent >= WASTE_TOKENS && now - lastOutput >= WASTE_MIN_MS) {
262
+ verdict = 'wasteful';
263
+ evidence.push(`${tokens(spent)} tokens in the ${mins(now - lastOutput)} since it last said or changed anything`);
264
+ action = 'steer';
265
+ note = `You have used ${tokens(spent)} tokens since your last new output. Summarise what you have and finish, or name exactly what is missing.`;
266
+ }
267
+ }
268
+ if (verdict === 'progressing') {
269
+ const did = [
270
+ byKind['read'] ? `read ${plural(byKind['read'], 'file')}` : null,
271
+ byKind['search'] ? `searched ${plural(byKind['search'], 'time')}` : null,
272
+ byKind['run'] ? `ran ${plural(byKind['run'], 'command')}` : null,
273
+ byKind['test'] ? `ran the tests ${plural(byKind['test'], 'time')}` : null,
274
+ editList.length > 0 ? `edited ${plural(editList.length, 'file')}` : null,
275
+ ].filter((x) => x !== null);
276
+ if (did.length > 0)
277
+ evidence.push(`So far it ${did.join(', ')}`);
278
+ if (doing !== null)
279
+ evidence.push(`Now: ${doing}`);
280
+ }
281
+ return {
282
+ ord, attempt, startedAt,
283
+ elapsedMs: startedAt !== null ? Math.max(0, now - startedAt) : null,
284
+ calls: calls.length, openCalls: open, byKind, edits: editList,
285
+ said: { deltas, chars, lastAt: saidAt, newest },
286
+ usage, lastSignAt, verdict, evidence, doing, action, note,
287
+ };
288
+ }
289
+ /** The step's recent frames for the checking seat, compact and bounded: one line each, newest last. */
290
+ export function timeline(events, ord, max = 80) {
291
+ const { frames, startedAt } = attemptFrames(events ?? [], ord);
292
+ const t0 = startedAt ?? (frames.length > 0 ? timeOf(frames[0]) : null) ?? 0;
293
+ const at = (e) => {
294
+ const t = timeOf(e);
295
+ return t === null ? '?' : `+${Math.max(0, Math.round((t - t0) / 1000))}s`;
296
+ };
297
+ const out = [];
298
+ for (const e of frames) {
299
+ switch (e['type']) {
300
+ case 'toolActivity':
301
+ if (e['state'] === 'working') {
302
+ out.push(`${at(e)} quiet: ${str(e['target']) ?? ''}`);
303
+ break;
304
+ }
305
+ out.push(`${at(e)} ${e['state'] === 'started' ? 'start' : `done${e['ok'] === false ? ' FAILED' : ''}`} ${str(e['tool']) ?? '?'} ${oneLine(str(e['target']) ?? '', 120)}`.trim());
306
+ break;
307
+ case 'powerActivity':
308
+ out.push(`${at(e)} ${e['kind'] === 'commit' ? `commit ${str(e['subject']) ?? ''}` : `edit ${str(e['path']) ?? ''} +${num(e['added']) ?? 0} -${num(e['removed']) ?? 0}`}`);
309
+ break;
310
+ case 'unitOutputDelta':
311
+ if (str(e['text']) !== null)
312
+ out.push(`${at(e)} said: ${oneLine(str(e['text']), 200)}`);
313
+ break;
314
+ case 'usageProgress':
315
+ out.push(`${at(e)} tokens: ${num(e['inputTokens']) ?? 0} in, ${num(e['outputTokens']) ?? 0} out`);
316
+ break;
317
+ default:
318
+ break;
319
+ }
320
+ }
321
+ // Heartbeats repeat: keep the newest of a run of them.
322
+ const folded = out.filter((l, i) => !(l.includes(' quiet: ') && out[i + 1]?.includes(' quiet: ')));
323
+ return folded.slice(-max);
324
+ }
325
+ //# sourceMappingURL=reading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reading.js","sourceRoot":"","sources":["../../src/inspect/reading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The in-flight check's routes (service.ts): `POST /runs/:id/units/:ord/inspect` starts one (a human operator only,
3
+ * audited `unit.inspected`), `GET /runs/:id/units/:ord/inspections` reads them back, newest first. Starting a check
4
+ * never changes the run it looks at.
5
+ */
6
+ import type { FastifyInstance } from 'fastify';
7
+ import type { AuditLog } from '../api/audit.js';
8
+ import { type InspectService } from './service.js';
9
+ export interface InspectRoutesDeps {
10
+ service: Pick<InspectService, 'start' | 'settle'>;
11
+ audit: AuditLog;
12
+ }
13
+ export declare function registerInspectRoutes(app: FastifyInstance, deps: InspectRoutesDeps): void;
14
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/inspect/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;IAClD,KAAK,EAAE,QAAQ,CAAC;CACjB;AAID,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAsCzF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The in-flight check's routes (service.ts): `POST /runs/:id/units/:ord/inspect` starts one (a human operator only,
3
+ * audited `unit.inspected`), `GET /runs/:id/units/:ord/inspections` reads them back, newest first. Starting a check
4
+ * never changes the run it looks at.
5
+ */
6
+ import { API_PREFIX as V } from '../api/api-prefix.js';
7
+ import { LOCAL_ACTOR } from '../api/auth.js';
8
+ import { isHumanOperator } from '../api/watch-routes.js';
9
+ import { InspectError } from './service.js';
10
+ const ordOf = (raw) => (/^\d{1,6}$/.test(raw) ? Number(raw) : null);
11
+ export function registerInspectRoutes(app, deps) {
12
+ const actorOf = (req) => req.actor ?? LOCAL_ACTOR;
13
+ app.post(`${V}/runs/:id/units/:ord/inspect`, { config: { manifest: { responseType: 'UnitInspectionResponse', statusCodes: [202, 400, 403, 404, 409] } } }, async (req, reply) => {
14
+ const { id, ord: rawOrd } = req.params;
15
+ const actor = actorOf(req);
16
+ if (!isHumanOperator(actor)) {
17
+ return reply.code(403).send({ error: `Only a person can ask for a check on a step (you are ${actor.kind}/${actor.trust})` });
18
+ }
19
+ const ord = ordOf(rawOrd);
20
+ if (ord === null)
21
+ return reply.code(400).send({ error: '`ord` must be a step number' });
22
+ try {
23
+ const inspection = await deps.service.start(id, ord, actor.id);
24
+ deps.audit.record('unit.inspected', actor, {
25
+ runId: id,
26
+ detail: { ord, inspection: inspection.id, seat: inspection.seat, checkRunId: inspection.checkRunId, source: inspection.source },
27
+ });
28
+ return reply.code(202).send({ inspection });
29
+ }
30
+ catch (err) {
31
+ if (err instanceof InspectError)
32
+ return reply.code(err.status).send({ code: err.code, error: err.message });
33
+ throw err;
34
+ }
35
+ });
36
+ app.get(`${V}/runs/:id/units/:ord/inspections`, { config: { manifest: { responseType: 'UnitInspectionsResponse', statusCodes: [200, 400] } } }, async (req, reply) => {
37
+ const { id, ord: rawOrd } = req.params;
38
+ const ord = ordOf(rawOrd);
39
+ if (ord === null)
40
+ return reply.code(400).send({ error: '`ord` must be a step number' });
41
+ return { inspections: deps.service.settle(id).filter((r) => r.ord === ord) };
42
+ });
43
+ }
44
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/inspect/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * "IS THIS GOING WELL?" — the in-flight check on a working step (operator 2026-10-30: "if it's been running long you
3
+ * can have an agent analyze right there, to make sure no tokens are wasted and no problems are occurring").
4
+ *
5
+ * A person asks (`POST /runs/:id/units/:ord/inspect`, human operator only, audited). Crew reads the step's newest
6
+ * attempt off the run's own log ({@link readUnit}: what it called, edited, said and spent) and hands that reading and
7
+ * the step's recent frames to ONE seat that is not the step's own: an `inspect-unit` run, one turn, no repository,
8
+ * read-only (a neutral phase that executes no code: the engine's read-only write posture), its reply one JSON object.
9
+ * The seat words the verdict (progressing, looping, stuck, wasteful), what the step is doing and how far along it
10
+ * is, the evidence, and one recommended action (let it run, steer with a note, stop).
11
+ *
12
+ * It never steers, stops or edits anything: nothing here calls the source run. The person chooses what to do with
13
+ * the answer, through the ordinary routes. Its own cost is bounded: a wall-clock limit and a token/cost budget,
14
+ * past either of which crew stops the check run and answers with its own reading, saying why. Every answer says
15
+ * whose it is and what it cost.
16
+ *
17
+ * The answer is a record (`<dir>/<runId>.json`, newest first) and a `/ws` frame `unitInspection`.
18
+ */
19
+ import type { LaunchRunInput, WorkflowDef } from '../core/types.js';
20
+ import { type InspectAction, type InspectVerdict, type UnitReading } from './reading.js';
21
+ export declare const INSPECT_WORKFLOW = "inspect-unit";
22
+ export declare const INSPECT_WORKFLOW_FILE: string;
23
+ /** How long a check may take before crew answers with its own reading. */
24
+ export declare const INSPECT_TIMEOUT_MS: number;
25
+ /** The check's own budget: past either, crew stops it and answers with its own reading. */
26
+ export declare const INSPECT_MAX_COST_USD = 0.25;
27
+ export declare const INSPECT_MAX_TOKENS = 400000;
28
+ /** Seats in the order a check prefers them (the step's own seat is never asked). */
29
+ export declare const INSPECT_SEAT_ORDER: readonly string[];
30
+ export interface InspectionCost {
31
+ inputTokens: number;
32
+ outputTokens: number;
33
+ costUsd: number | null;
34
+ }
35
+ export interface InspectionRecord {
36
+ id: string;
37
+ runId: string;
38
+ ord: number;
39
+ attempt: number;
40
+ state: 'checking' | 'done';
41
+ requestedBy: string;
42
+ requestedAt: number;
43
+ finishedAt: number | null;
44
+ /** The step's own seat. */
45
+ workerSeat: string | null;
46
+ /** The seat that checked (never the step's own), null when none could. */
47
+ seat: string | null;
48
+ /** The check's own run, null when none was launched. */
49
+ checkRunId: string | null;
50
+ /** Whose answer this is: the checking seat's, or crew's own reading (with why). */
51
+ source: 'seat' | 'crew' | null;
52
+ why: string | null;
53
+ verdict: InspectVerdict | null;
54
+ doing: string | null;
55
+ progress: string | null;
56
+ evidence: string[];
57
+ action: InspectAction | null;
58
+ note: string | null;
59
+ /** Crew's own reading at the time of the ask (always there, whatever the seat answered). */
60
+ reading: UnitReading;
61
+ /** What the check itself spent, when its seat reported it. */
62
+ cost: InspectionCost | null;
63
+ }
64
+ interface RunView {
65
+ session: {
66
+ id: string;
67
+ status: string;
68
+ unit_ix?: number;
69
+ problem?: string;
70
+ title?: unknown;
71
+ };
72
+ units: Array<{
73
+ ord: number;
74
+ status: string;
75
+ assigned_cli?: string | null;
76
+ description?: string | null;
77
+ id?: string;
78
+ }>;
79
+ }
80
+ export interface InspectServiceDeps {
81
+ adapter: {
82
+ sessionsDetail(): Promise<unknown[]>;
83
+ runEvents(runId: string): Promise<unknown[] | null>;
84
+ seatsForWorkflow(workflowId: string): Promise<unknown[]>;
85
+ launchRun(input: LaunchRunInput): Promise<string>;
86
+ cancelRun(runId: string): Promise<unknown>;
87
+ };
88
+ /** The check run's reply text (its one unit's output), null when there is none. */
89
+ replyOf(checkRunId: string): Promise<string | null>;
90
+ dir: string;
91
+ broadcast(frame: Record<string, unknown>): void;
92
+ /** Launch bookkeeping for the check run (audit line, timing index). */
93
+ launched?(checkRunId: string, sourceRunId: string): void;
94
+ log(m: string): void;
95
+ newId(): string;
96
+ now?(): number;
97
+ timeoutMs?: number;
98
+ maxCostUsd?: number;
99
+ maxTokens?: number;
100
+ }
101
+ export declare class InspectError extends Error {
102
+ readonly status: number;
103
+ readonly code: string;
104
+ constructor(status: number, code: string, message: string);
105
+ }
106
+ /** The step the run is working on now, or null (the engine's cursor on a unit that has not finished). */
107
+ export declare function workingOrd(view: RunView): number | null;
108
+ /** The seat that checks: signed in, eligible, never the step's own CLI; in {@link INSPECT_SEAT_ORDER}. */
109
+ export declare function pickInspectSeat(roster: readonly unknown[], workerSeat: string | null): Record<string, unknown> | null;
110
+ /** The checking seat's answer: the last JSON object in its reply that names a verdict, checked field by field. */
111
+ export declare function parseInspectReply(text: string | null): Pick<InspectionRecord, 'verdict' | 'doing' | 'progress' | 'evidence' | 'action' | 'note'> | null;
112
+ /** The check run's brief: the reading and the recent frames, inline (the seat needs no tool to read them). */
113
+ export declare function inspectBrief(view: RunView, ord: number, reading: UnitReading, frames: string[]): string;
114
+ /** The in-flight checks of one daemon. */
115
+ /** The in-flight checks of one daemon. */
116
+ export declare class InspectService {
117
+ private readonly deps;
118
+ private readonly now;
119
+ /** Check run id → the record it answers. Kept until the record's answer is saved (`finalizing` meanwhile). */
120
+ private readonly pending;
121
+ /** A start in flight per step: a second ask for the same step joins it (xreview on #1233). */
122
+ private readonly starting;
123
+ constructor(deps: InspectServiceDeps);
124
+ private file;
125
+ /** The run's records, newest first. */
126
+ list(runId: string): InspectionRecord[];
127
+ private save;
128
+ /** A record still `checking` that no check of this daemon owns (it restarted mid-check) ends with crew's reading. */
129
+ settle(runId: string): InspectionRecord[];
130
+ /**
131
+ * At boot, before anything resumes: every check a restart interrupted is stopped (its run cancelled, so it can
132
+ * never spend past its bound unwatched; xreview on #1233) and answered with crew's reading. Never throws.
133
+ */
134
+ recover(): Promise<void>;
135
+ /** Start a check on step `ord` of `runId` for `requestedBy`. Answers at once with the record (`state: checking`). */
136
+ start(runId: string, ord: number, requestedBy: string): Promise<InspectionRecord>;
137
+ private startOnce;
138
+ private finishWithReading;
139
+ private recordOf;
140
+ /** Take the check over for its ending: `null` when another path already ends it. It stays owned (so `settle` never
141
+ * reads it as orphaned) until {@link release}. */
142
+ private claim;
143
+ private release;
144
+ /** Stop the check run (crew's own run, never the step's) and answer with crew's reading. */
145
+ private stopCheck;
146
+ private expire;
147
+ /** Every `/ws` frame: the check run's usage (its budget) and end. */
148
+ onEvent(event: Record<string, unknown>): void;
149
+ private finish;
150
+ }
151
+ /**
152
+ * Where the records live: `WICKED_CREW_INSPECTIONS_DIR`, else `~/.wicked/inspections` — beside run learnings, NOT in the
153
+ * daemon state home: core refuses every launch whose state home holds a top-level entry its fence registry
154
+ * (tests/fixtures/state-home-subtrees.json, embedded in core) does not classify, so a new entry there needs a core
155
+ * release first. Records are keyed by run id (unique), so two daemons sharing the directory never collide.
156
+ */
157
+ export declare function defaultInspectionsDir(env?: NodeJS.ProcessEnv): string;
158
+ /** The `inspect-unit` workflow def (data), as registered with the engine. */
159
+ export declare function loadInspectWorkflow(file?: string): WorkflowDef;
160
+ export {};
161
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/inspect/service.ts"],"names":[],"mappings":"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"}