wicked-crew 0.8.1 → 0.8.3

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 (133) hide show
  1. package/dist/api/ask-paths.d.ts +90 -0
  2. package/dist/api/ask-paths.d.ts.map +1 -0
  3. package/dist/api/ask-paths.js +145 -0
  4. package/dist/api/ask-paths.js.map +1 -0
  5. package/dist/api/ask-relay.d.ts +150 -0
  6. package/dist/api/ask-relay.d.ts.map +1 -0
  7. package/dist/api/ask-relay.js +601 -0
  8. package/dist/api/ask-relay.js.map +1 -0
  9. package/dist/api/auth.d.ts +5 -1
  10. package/dist/api/auth.d.ts.map +1 -1
  11. package/dist/api/auth.js +23 -0
  12. package/dist/api/auth.js.map +1 -1
  13. package/dist/api/chat-scope.d.ts +25 -2
  14. package/dist/api/chat-scope.d.ts.map +1 -1
  15. package/dist/api/chat-scope.js +47 -4
  16. package/dist/api/chat-scope.js.map +1 -1
  17. package/dist/api/diagnostics.d.ts +5 -2
  18. package/dist/api/diagnostics.d.ts.map +1 -1
  19. package/dist/api/diagnostics.js +7 -3
  20. package/dist/api/diagnostics.js.map +1 -1
  21. package/dist/api/eval-sample.d.ts +12 -12
  22. package/dist/api/governance-health.d.ts.map +1 -1
  23. package/dist/api/governance-health.js +9 -6
  24. package/dist/api/governance-health.js.map +1 -1
  25. package/dist/api/mcp.d.ts +10 -10
  26. package/dist/api/mcp.d.ts.map +1 -1
  27. package/dist/api/mcp.js +6 -1
  28. package/dist/api/mcp.js.map +1 -1
  29. package/dist/api/plan-schema.d.ts +14 -0
  30. package/dist/api/plan-schema.d.ts.map +1 -1
  31. package/dist/api/plan-schema.js +4 -0
  32. package/dist/api/plan-schema.js.map +1 -1
  33. package/dist/api/recording.d.ts +30 -1
  34. package/dist/api/recording.d.ts.map +1 -1
  35. package/dist/api/recording.js +54 -6
  36. package/dist/api/recording.js.map +1 -1
  37. package/dist/api/roster-standing.d.ts.map +1 -1
  38. package/dist/api/roster-standing.js +6 -2
  39. package/dist/api/roster-standing.js.map +1 -1
  40. package/dist/api/routes.d.ts +144 -14
  41. package/dist/api/routes.d.ts.map +1 -1
  42. package/dist/api/routes.js +346 -204
  43. package/dist/api/routes.js.map +1 -1
  44. package/dist/api/seat-standing.d.ts +9 -1
  45. package/dist/api/seat-standing.d.ts.map +1 -1
  46. package/dist/api/seat-standing.js +27 -1
  47. package/dist/api/seat-standing.js.map +1 -1
  48. package/dist/api/server.d.ts +34 -0
  49. package/dist/api/server.d.ts.map +1 -1
  50. package/dist/api/server.js +143 -14
  51. package/dist/api/server.js.map +1 -1
  52. package/dist/api/stall-watchdog.d.ts +10 -2
  53. package/dist/api/stall-watchdog.d.ts.map +1 -1
  54. package/dist/api/stall-watchdog.js +32 -13
  55. package/dist/api/stall-watchdog.js.map +1 -1
  56. package/dist/api/testing.d.ts +4 -4
  57. package/dist/campaigns/routes.d.ts +2 -2
  58. package/dist/cli/governance.d.ts +7 -0
  59. package/dist/cli/governance.d.ts.map +1 -1
  60. package/dist/cli/governance.js +14 -1
  61. package/dist/cli/governance.js.map +1 -1
  62. package/dist/cli/index.d.ts.map +1 -1
  63. package/dist/cli/index.js +36 -7
  64. package/dist/cli/index.js.map +1 -1
  65. package/dist/core/adapter.d.ts +1 -0
  66. package/dist/core/adapter.d.ts.map +1 -1
  67. package/dist/core/adapter.js +8 -0
  68. package/dist/core/adapter.js.map +1 -1
  69. package/dist/core/bridge-reaper.d.ts +50 -7
  70. package/dist/core/bridge-reaper.d.ts.map +1 -1
  71. package/dist/core/bridge-reaper.js +242 -42
  72. package/dist/core/bridge-reaper.js.map +1 -1
  73. package/dist/core/governance-store.d.ts +9 -0
  74. package/dist/core/governance-store.d.ts.map +1 -1
  75. package/dist/core/governance-store.js +13 -0
  76. package/dist/core/governance-store.js.map +1 -1
  77. package/dist/core/run-boot-resume.d.ts +55 -0
  78. package/dist/core/run-boot-resume.d.ts.map +1 -0
  79. package/dist/core/run-boot-resume.js +94 -0
  80. package/dist/core/run-boot-resume.js.map +1 -0
  81. package/dist/core/types.d.ts +2 -0
  82. package/dist/core/types.d.ts.map +1 -1
  83. package/dist/core/types.js.map +1 -1
  84. package/dist/decisions/chat-recorder.d.ts +18 -0
  85. package/dist/decisions/chat-recorder.d.ts.map +1 -1
  86. package/dist/decisions/chat-recorder.js +107 -14
  87. package/dist/decisions/chat-recorder.js.map +1 -1
  88. package/dist/decisions/consider.d.ts +13 -0
  89. package/dist/decisions/consider.d.ts.map +1 -1
  90. package/dist/decisions/consider.js +20 -4
  91. package/dist/decisions/consider.js.map +1 -1
  92. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  93. package/dist/interactive/bridge-pool.js +3 -2
  94. package/dist/interactive/bridge-pool.js.map +1 -1
  95. package/dist/interactive/doc-grounding.d.ts +37 -0
  96. package/dist/interactive/doc-grounding.d.ts.map +1 -1
  97. package/dist/interactive/doc-grounding.js +63 -0
  98. package/dist/interactive/doc-grounding.js.map +1 -1
  99. package/dist/interactive/doc-list-routes.d.ts +5 -0
  100. package/dist/interactive/doc-list-routes.d.ts.map +1 -1
  101. package/dist/interactive/doc-list-routes.js +7 -1
  102. package/dist/interactive/doc-list-routes.js.map +1 -1
  103. package/dist/interactive/draft-events.d.ts +32 -2
  104. package/dist/interactive/draft-events.d.ts.map +1 -1
  105. package/dist/interactive/draft-events.js +94 -20
  106. package/dist/interactive/draft-events.js.map +1 -1
  107. package/dist/interactive/draft-skill.d.ts.map +1 -1
  108. package/dist/interactive/draft-skill.js +24 -6
  109. package/dist/interactive/draft-skill.js.map +1 -1
  110. package/dist/interactive/review-events.d.ts +1 -1
  111. package/dist/interactive/review-events.d.ts.map +1 -1
  112. package/dist/interactive/review-events.js +4 -2
  113. package/dist/interactive/review-events.js.map +1 -1
  114. package/dist/skills/live-generations.d.ts +16 -11
  115. package/dist/skills/live-generations.d.ts.map +1 -1
  116. package/dist/skills/live-generations.js +28 -14
  117. package/dist/skills/live-generations.js.map +1 -1
  118. package/dist/skills/store.d.ts +16 -0
  119. package/dist/skills/store.d.ts.map +1 -1
  120. package/dist/skills/store.js +18 -0
  121. package/dist/skills/store.js.map +1 -1
  122. package/dist/studio/assets/index-BKkB4En4.js +581 -0
  123. package/dist/studio/assets/index-CGjbTpLl.css +32 -0
  124. package/dist/studio/editors/wicked-page/editor.json +1 -1
  125. package/dist/studio/editors/wicked-page/index.html +1 -1
  126. package/dist/studio/index.html +2 -2
  127. package/dist/studio/testid-inventory.json +275 -5
  128. package/dist/team/routes.d.ts +38 -0
  129. package/dist/team/routes.d.ts.map +1 -1
  130. package/endpoint-manifest.json +1 -1
  131. package/package.json +4 -4
  132. package/dist/studio/assets/index-D9cD_lY1.js +0 -580
  133. package/dist/studio/assets/index-DEBAWrq3.css +0 -32
@@ -146,5 +146,13 @@ export type ChatAdmission = {
146
146
  * `council_eligible` / health are deliberately NOT consulted here — a seat benched in councils can
147
147
  * still answer a chat, and saying otherwise would refuse a working seat.
148
148
  */
149
- export declare function chatSeatAdmission(seat: StandingSeat, auth: SeatAuth, scoped: boolean): ChatAdmission;
149
+ export declare function chatSeatAdmission(seat: StandingSeat, auth: SeatAuth, scoped: boolean,
150
+ /** `pool`: the warm chat pool (an ACP session held read-only — the structural rules below).
151
+ * `path` (ASK-C1/C2, DES-ASK-TEAM-CHAT-001 §4.2): an ask is a team RUN. The seat's standing
152
+ * (signed in, enabled) is the gate; the structural rule stays ONLY where the run itself cannot
153
+ * hold the repositories read-only — a scoped ask that is not bound to one repository (several
154
+ * repos, a project, everything): no worktree, no guard, no default sandbox (codex on #810 r9).
155
+ * `path-bound`: a single-repo ask — the run is bound (worktree snapshot + guard + mutation
156
+ * check), so every seat in standing is eligible, wrapped ones included. */
157
+ kind?: 'pool' | 'path' | 'path-bound'): ChatAdmission;
150
158
  //# sourceMappingURL=seat-standing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seat-standing.d.ts","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seat-standing.d.ts","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
@@ -203,14 +203,40 @@ export function seatStanding(seat, signedIn, authFailure = null, probeInput = un
203
203
  * `council_eligible` / health are deliberately NOT consulted here — a seat benched in councils can
204
204
  * still answer a chat, and saying otherwise would refuse a working seat.
205
205
  */
206
- export function chatSeatAdmission(seat, auth, scoped) {
206
+ export function chatSeatAdmission(seat, auth, scoped,
207
+ /** `pool`: the warm chat pool (an ACP session held read-only — the structural rules below).
208
+ * `path` (ASK-C1/C2, DES-ASK-TEAM-CHAT-001 §4.2): an ask is a team RUN. The seat's standing
209
+ * (signed in, enabled) is the gate; the structural rule stays ONLY where the run itself cannot
210
+ * hold the repositories read-only — a scoped ask that is not bound to one repository (several
211
+ * repos, a project, everything): no worktree, no guard, no default sandbox (codex on #810 r9).
212
+ * `path-bound`: a single-repo ask — the run is bound (worktree snapshot + guard + mutation
213
+ * check), so every seat in standing is eligible, wrapped ones included. */
214
+ kind = 'pool') {
207
215
  const reasons = [];
208
216
  let source = 'scope';
209
217
  if (!authUsable(auth)) {
210
218
  reasons.push('signed out — it cannot take a turn until it is signed in from the System page');
211
219
  source = 'auth';
212
220
  }
221
+ if (seat.enabled_for_council === false) {
222
+ reasons.push('disabled for the council, so it takes no turn');
223
+ }
224
+ if (kind === 'path-bound' || (kind === 'path' && !scoped)) {
225
+ return reasons.length === 0 ? { ok: true } : { ok: false, reason: reasons.join('; '), source };
226
+ }
213
227
  const acp = seat.acp ?? undefined;
228
+ if (kind === 'path') {
229
+ // A scoped ask the run cannot bind: the seat must hold itself read-only.
230
+ if (acp === undefined) {
231
+ reasons.push('it has no ACP adapter and this ask reads several repositories (or a project) the run cannot bind, ' +
232
+ 'so nothing would hold them read-only for it — scope the ask to one repository to include it');
233
+ }
234
+ else if (acp.acp_input_governance !== true && acp.os_sandbox !== true) {
235
+ reasons.push('its ACP adapter asks no permissions and its record arms no OS sandbox, and this ask reads several ' +
236
+ 'repositories (or a project) the run cannot bind — scope the ask to one repository to include it');
237
+ }
238
+ return reasons.length === 0 ? { ok: true } : { ok: false, reason: reasons.join('; '), source };
239
+ }
214
240
  if (acp === undefined) {
215
241
  // F-W1-003 = A (approved 2026-09-15): chat runs on ACP-adapter seats only, scoped AND
216
242
  // unscoped. A seat with no ACP adapter is a WRAPPED seat — it does governed work in runs, but
@@ -1 +1 @@
1
- {"version":3,"file":"seat-standing.js","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,kBAAkB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,gGAAgG;IAChG,kGAAkG;IAClG,qGAAqG;IACrG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,OAAe,OAAO,EAAE;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACrG,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACxJ,OAAO,GAAG,CAAC;AACb,CAAC;AAKD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC7E,QAAQ,EAAE,8CAA8C;CACzD,CAAC,CAAC;AAKH,4GAA4G;AAC5G,MAAM,UAAU,QAAQ,CAAC,IAAkB,EAAE,QAAwB;IACnE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,8FAA8F;IAC9F,8FAA8F;IAC9F,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,wCAAwC;YAClI,gBAAgB,EAAE,UAAU;SAC7B,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACtH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAChC,CAAC;AA4CD,qIAAqI;AACrI,MAAM,UAAU,iBAAiB,CAAC,OAAmD;IACnF,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;AACzE,CAAC;AAED,sGAAsG;AACtG,SAAS,UAAU,CAAC,QAA4B;IAC9C,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtE,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,2BAA2B,KAAK,GAAG,CAAC;AACtF,CAAC;AASD,iGAAiG;AACjG,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,OAAO,IAAI,KAAK,YAAY,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAkB,EAClB,QAAwB,EACxB,cAAsC,IAAI,EAC1C,aAAyB,SAAS,EAClC,cAAsC,IAAI;IAE1C,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,6FAA6F;IAC7F,kGAAkG;IAClG,iGAAiG;IACjG,iGAAiG;IACjG,uFAAuF;IACvF,MAAM,IAAI,GACR,WAAW,KAAK,IAAI;QAClB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,WAAW,EAAE,aAAsB,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;QACnH,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAC9C,CAAC,CAAC;gBACE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,WAAqB,CAAC,CAAC,CAAE,YAAsB;gBACvE,WAAW,EAAE,OAAgB;gBAC7B,SAAS,EAAE,KAAK,CAAC,QAAQ;gBACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;aACrE;YACH,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAiB;QACzB,GAAG,IAAI;QACP,GAAG,KAAK;QACR,gBAAgB,EAAE,IAAI;KACvB,CAAC;IACF,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,GAAG,IAAI;YACP,gBAAgB,EAAE,KAAK;YACvB,yBAAyB,EACvB,WAAW,KAAK,IAAI;gBAClB,CAAC,CAAC,wDAAwD,iBAAiB,CAAC,WAAW,CAAC,oCAAoC;gBAC5H,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO;oBAC5B,CAAC,CAAC,+CAA+C,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,mCAAmC;oBAClH,CAAC,CAAC,mGAAmG;SAC5G,CAAC;IACJ,CAAC;IACD,iGAAiG;IACjG,8FAA8F;IAC9F,gGAAgG;IAChG,kGAAkG;IAClG,4FAA4F;IAC5F,6EAA6E;IAC7E,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO;YACL,GAAG,IAAI;YACP,gBAAgB,EAAE,KAAK;YACvB,yBAAyB,EACvB,UAAU,KAAK,2BAA2B,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,WAAW,CAAC,MAAM,IAAI;gBACnG,GAAG,WAAW,CAAC,MAAM,wBAAwB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,sCAAsC;SAC7G,CAAC;IACJ,CAAC;IACD,gGAAgG;IAChG,iGAAiG;IACjG,yFAAyF;IACzF,kGAAkG;IAClG,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO;YACL,GAAG,IAAI;YACP,gBAAgB,EAAE,KAAK;YACvB,yBAAyB,EACvB,8HAA8H;SACjI,CAAC;IACJ,CAAC;IACD,8FAA8F;IAC9F,8FAA8F;IAC9F,iGAAiG;IACjG,gGAAgG;IAChG,6FAA6F;IAC7F,qBAAqB;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,IAAc,EAAE,MAAe;IACnF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAsB,OAAO,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC9F,MAAM,GAAG,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,sFAAsF;QACtF,8FAA8F;QAC9F,6FAA6F;QAC7F,8EAA8E;QAC9E,OAAO,CAAC,IAAI,CACV,6FAA6F;YAC3F,8CAA8C,CACjD,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,IAAI,GAAG,CAAC,oBAAoB,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAClF,OAAO,CAAC,IAAI,CACV,0FAA0F;YACxF,yFAAyF,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;AACjG,CAAC;AAED,iFAAiF;AACjF,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,GAAW,EAAE,WAAmC,EAAE,KAAiB;IACrF,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACzD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,mEAAmE,EAAE,CAAC;IACxH,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,oCAAoC,GAAG,uIAAuI;SAC3L,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,gEAAgE,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IACpI,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC3D,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,UAAU,EAAE,8GAA8G,KAAK,CAAC,MAAM,GAAG;KAC1I,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"seat-standing.js","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
@@ -217,6 +217,11 @@ export interface CreateServerOptions {
217
217
  * `enabled` defaults to ON in the daemon and OFF under a test runner (VITEST /
218
218
  * NODE_ENV=test), the seat-health-probe posture.
219
219
  */
220
+ /** The seats' standing (tests: a sign-in answer instead of the credential-file heuristic and
221
+ * the live auth-status probes, so admission is host-independent). */
222
+ seats?: {
223
+ signedIn?: (seatKey: string, workerRoot?: string) => boolean | null;
224
+ };
220
225
  stallWatchdog?: {
221
226
  enabled?: boolean;
222
227
  /** Sweep cadence, ms (default 30 s; tests shorten it). */
@@ -278,11 +283,40 @@ export interface CreateServerOptions {
278
283
  limits?: VerifyOptions;
279
284
  };
280
285
  }
286
+ /**
287
+ * Per-stage boot timings, ms (crew#741): where a slow boot's seconds went, instead of one
288
+ * `startupMs`. EXCLUSIVE stages that sum to the boot: `setup`, `skills`, `venv`, `routes`,
289
+ * `studio`, `listen` here; `wicked-crew serve` prepends `preflight` and `engine`. The key set is
290
+ * open — a harness reads the stages it knows.
291
+ */
292
+ export type BootStages = Readonly<Record<string, number>>;
293
+ /**
294
+ * A lap clock for the boot: `lap(name)` closes the stage that ran since the previous lap (or since
295
+ * construction) and rounds it to whole ms; `set` records (or corrects) a stage measured elsewhere —
296
+ * a re-`set` key keeps its position. Stages are reported in the order they were first recorded.
297
+ */
298
+ export declare class BootStageClock {
299
+ private readonly stages;
300
+ private mark;
301
+ lap(name: string): number;
302
+ set(name: string, ms: number): void;
303
+ snapshot(): BootStages;
304
+ /** One human line: `setup 12ms · skills 1203ms · venv 0ms · …` */
305
+ describe(): string;
306
+ }
307
+ declare module 'fastify' {
308
+ interface FastifyInstance {
309
+ /** crew#741 — the boot's stage clock; `startServer` adds `listen` and hands the snapshot back. */
310
+ bootStages?: BootStageClock;
311
+ }
312
+ }
281
313
  export declare function createServer(adapter: CoreAdapter, options?: CreateServerOptions): Promise<ReturnType<typeof Fastify>>;
282
314
  export interface StartedServer {
283
315
  app: ReturnType<typeof Fastify>;
284
316
  port: number;
285
317
  host: string;
318
+ /** crew#741: the boot's exclusive per-stage ms (`setup`, `skills`, `venv`, `routes`, `studio`, `listen`). */
319
+ stages: BootStages;
286
320
  }
287
321
  /** The URL a worker on this host reaches the daemon at: a wildcard bind is reached on loopback. */
288
322
  export declare function brokerUrlFor(host: string, port: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ import { DeliveryDerivationCache } from './delivery-cache.js';
25
25
  import { coreUnitId } from './evidence.js';
26
26
  import { registerClient, broadcast } from '../events/bus.js';
27
27
  import { TerminalHub, registerTerminalWs } from '../events/terminals.js';
28
- import { INTERACTIVE_DRAFT_WORKFLOW_DEF, startInteractiveDraftSubscriber } from '../interactive/draft-events.js';
28
+ import { INTERACTIVE_DRAFT_WORKFLOW_DEF, startInteractiveDraftSubscriber, isAnotherProjectsDraftKey } from '../interactive/draft-events.js';
29
29
  import { INTERACTIVE_EDIT_WORKFLOW_DEF, startInteractiveEditSubscriber } from '../interactive/edit-events.js';
30
30
  import { putLearnedThemeViaBridge, startInteractiveThemeSubscriber } from '../interactive/theme-events.js';
31
31
  import { authoringRunsFromLedgers, isAnotherProjectsReviewKey, readDocVersionViaBridge, startInteractiveReviewSubscriber } from '../interactive/review-events.js';
@@ -52,6 +52,8 @@ import { platformSecretStore } from '../mcp/secrets.js';
52
52
  import { startProjectBus, MEMBERSHIP_ATTACHED, membershipAttachedKey } from '../projects/events.js';
53
53
  import { startInteractiveWsRelay, registerInteractiveEventRoutes } from '../interactive/ws-relay.js';
54
54
  import { startTeamWsRelay } from '../team/ws-relay.js';
55
+ import { AskPathIndex } from './ask-paths.js';
56
+ import { AskRelay } from './ask-relay.js';
55
57
  import { MembershipIndex } from '../projects/membership-index.js';
56
58
  import { writeRunEvidencePointer } from '../projects/charter.js';
57
59
  import { engineBenchesUnclassifiedSeats, CoreAdapter } from '../core/adapter.js';
@@ -66,6 +68,7 @@ import { installEndpointManifestHook } from './endpoint-manifest.js';
66
68
  import { WorkerStallWatchdog } from './stall-watchdog.js';
67
69
  import { RunLivenessSampler } from './run-liveness.js';
68
70
  import { resumeRunningCampaigns } from '../campaign/boot-resume.js';
71
+ import { resumeOrphanedRuns } from '../core/run-boot-resume.js';
69
72
  import { StandingOrderStore } from '../standing-orders/store.js';
70
73
  import { StandingOrderEvaluator } from '../standing-orders/evaluator.js';
71
74
  import { registerStandingOrderRoutes } from '../standing-orders/routes.js';
@@ -106,7 +109,36 @@ const LOOPBACK_ORIGIN = /^http:\/\/(127\.0\.0\.1|localhost):\d+$/;
106
109
  export function defaultStudioRoot() {
107
110
  return fileURLToPath(new URL('../studio', import.meta.url));
108
111
  }
112
+ /**
113
+ * A lap clock for the boot: `lap(name)` closes the stage that ran since the previous lap (or since
114
+ * construction) and rounds it to whole ms; `set` records (or corrects) a stage measured elsewhere —
115
+ * a re-`set` key keeps its position. Stages are reported in the order they were first recorded.
116
+ */
117
+ export class BootStageClock {
118
+ stages = {};
119
+ mark = performance.now();
120
+ lap(name) {
121
+ const now = performance.now();
122
+ const ms = Math.max(0, Math.round(now - this.mark));
123
+ this.stages[name] = ms;
124
+ this.mark = now;
125
+ return ms;
126
+ }
127
+ set(name, ms) {
128
+ this.stages[name] = Math.max(0, Math.round(ms));
129
+ }
130
+ snapshot() {
131
+ return { ...this.stages };
132
+ }
133
+ /** One human line: `setup 12ms · skills 1203ms · venv 0ms · …` */
134
+ describe() {
135
+ return Object.entries(this.stages)
136
+ .map(([name, ms]) => `${name} ${ms}ms`)
137
+ .join(' · ');
138
+ }
139
+ }
109
140
  export async function createServer(adapter, options) {
141
+ const bootClock = new BootStageClock();
110
142
  // The diagnostics error ring: a tee on the pino stream that keeps the last ~20 error-level
111
143
  // lines in memory (crew has no log file of its own — stdout belongs to whoever launched the
112
144
  // daemon), surfaced read-only on GET /diagnostics. Built before Fastify so the logger's
@@ -148,7 +180,10 @@ export async function createServer(adapter, options) {
148
180
  // `runtime.rosterWithStanding`), the four interactive seams (`roster`), and the adapter's own
149
181
  // launches (`setRosterProvider` → `seatsForWorkflow` / `wicked-crew start`). Read at call time,
150
182
  // so a seat signed in from the System page is eligible on the very next launch.
151
- const rosterWithStanding = rosterWithStandingFactory({ seatHealth });
183
+ const rosterWithStanding = rosterWithStandingFactory({
184
+ seatHealth,
185
+ ...(options?.seats?.signedIn !== undefined ? { signedIn: options.seats.signedIn } : {}),
186
+ });
152
187
  // Runtime-guarded, not typed away: the integration suites drive `createServer` over PARTIAL fake
153
188
  // adapters (cast to `CoreAdapter`) that never grew this method — the real adapter always has it.
154
189
  if (typeof adapter.setRosterProvider === 'function') {
@@ -202,19 +237,26 @@ export async function createServer(adapter, options) {
202
237
  // was refused — discovered at each run's first worker. Judged here, before any seam creates
203
238
  // anything under those roots (`serve` asserts the same rule before the engine spawns).
204
239
  assertWickedRootsOutsideStateHome(process.env, crewStateHome());
240
+ // crew#741: everything above (logger, settings, roots) is `setup`; the skills seam is its own
241
+ // stage, with the provisioner's time (`venv`) read from the store and carved OUT of it — `0`
242
+ // when the baseline env already carried its verified ready marker (`SkillsStore.ensureVenv`'s
243
+ // fast path), which is the acceptance that a boot on an unchanged baseline re-runs no `uv sync`.
244
+ bootClock.lap('setup');
205
245
  let skillsRuntime;
246
+ let skillsStore;
206
247
  if (options?.skills?.disabled !== true) {
207
248
  const source = options?.skills?.source;
208
249
  const skillsRoot = resolveSkillsRoot();
209
250
  assertSkillsRootFenced(skillsRoot, { stateHome: crewStateHome() });
251
+ skillsStore = new SkillsStore({
252
+ root: skillsRoot,
253
+ registeredSkillRefs: () => registeredSkillRefs(adapter.listWorkflows()),
254
+ provisionVenv: options?.skills?.provisionVenv ?? uvSyncBaseline,
255
+ ...(source !== undefined ? { source } : {}),
256
+ warn: (m) => app.log.warn(m),
257
+ });
210
258
  skillsRuntime = new SkillsRuntime({
211
- store: new SkillsStore({
212
- root: skillsRoot,
213
- registeredSkillRefs: () => registeredSkillRefs(adapter.listWorkflows()),
214
- provisionVenv: options?.skills?.provisionVenv ?? uvSyncBaseline,
215
- ...(source !== undefined ? { source } : {}),
216
- warn: (m) => app.log.warn(m),
217
- }),
259
+ store: skillsStore,
218
260
  log: (m) => app.log.warn(m),
219
261
  });
220
262
  // The base skill setting (crew#554 / wicked-core#468) is applied BEFORE the ladder runs, so
@@ -226,6 +268,12 @@ export async function createServer(adapter, options) {
226
268
  skillsRuntime.configureBaseSkill(bootSettings);
227
269
  await skillsRuntime.apply();
228
270
  }
271
+ // Exclusive peers (codex on #846): `venv` is the provisioner path's time, `skills` the rest of
272
+ // the seam (seed, validate, hash, stage, flip) — the stages sum, never double-count.
273
+ const skillsMs = bootClock.lap('skills');
274
+ const venvMs = skillsStore?.venvStage().ms ?? 0;
275
+ bootClock.set('skills', skillsMs - venvMs);
276
+ bootClock.set('venv', venvMs);
229
277
  // The state-home PREFLIGHT (wicked-core#411 / crew#497; F-RC1-011, F-RC2-020): an entry under the
230
278
  // state home that core's fence registry cannot classify refuses EVERY worker launch — and until
231
279
  // now the daemon booted green over it, the refusal surfacing at each run's first worker as a
@@ -270,6 +318,9 @@ export async function createServer(adapter, options) {
270
318
  // `run.launched` entries that carry a `chatId`) and kept in sync by the event loop.
271
319
  const chatRetained = new Map();
272
320
  const runToChat = new Map();
321
+ // ASK-C1/C2: the daemon's record of each chat's ask path (which run answers which chat, the PA,
322
+ // the reviewer, the helpers) — written by the routes, read by the relay below. In-memory.
323
+ const askPaths = new AskPathIndex();
273
324
  // Retry lineage (CREW-UX-3) + ad-hoc group attach (wicked-studio#27): both durable records
274
325
  // live in the trail's `run.launched` entries, so ONE exhaustive scan feeds both indexes —
275
326
  // boot stays at three full-file trail scans, not four (the crew#321 consolidation note).
@@ -515,7 +566,9 @@ export async function createServer(adapter, options) {
515
566
  const docReviewsDir = () => reviewSub?.reviewsDir ?? join(options?.interactiveEditEvents?.editDir ?? join(crewStateDir, 'interactive-edits'), REVIEWS_DIRNAME);
516
567
  const dropDocLedgerRows = (documentId, projectId) => {
517
568
  // EP-C2: a review row names its project, so the same-named document of ANOTHER project keeps its rows.
518
- const sweep = sweepDocLedgers(documentId, docLedgerSources(), (key) => isAnotherProjectsReviewKey(key, documentId, projectId));
569
+ const sweep = sweepDocLedgers(documentId, docLedgerSources(),
570
+ // crew#809: a draft row names its project too.
571
+ (key) => isAnotherProjectsReviewKey(key, documentId, projectId) || isAnotherProjectsDraftKey(key, documentId, projectId));
519
572
  // EP-C2: the document's recorded reviews go with it — a later document of the same name must
520
573
  // not inherit them (the same ghost the ledger rows would be). Its own project's only: the
521
574
  // review store is partitioned per project, like the docs roots.
@@ -576,9 +629,12 @@ export async function createServer(adapter, options) {
576
629
  dbPath: teamBusDb,
577
630
  projectOf: (runId) => membershipIndex.projectOf(runId),
578
631
  // Standing orders (behaviour 10) read the same team rows: a finding can wake the operator.
632
+ // ASK-C2: the ask relay reads them too (path.started → the PA; step.completed → the
633
+ // reply's text source).
579
634
  broadcast: (frame) => {
580
635
  broadcast(frame);
581
636
  void standingOrderEvaluator?.onTeamFrame(frame);
637
+ askRelay.onTeamRow(frame.event);
582
638
  },
583
639
  ...(options?.teamWsRelay?.pollIntervalMs !== undefined
584
640
  ? { pollIntervalMs: options.teamWsRelay.pollIntervalMs }
@@ -935,6 +991,11 @@ export async function createServer(adapter, options) {
935
991
  ...(cursor?.cli !== undefined ? { cli: cursor.cli } : {}),
936
992
  ...(Array.isArray(v.session.clis) ? { seats: v.session.clis } : {}),
937
993
  ...(avoid.length > 0 ? { avoid } : {}),
994
+ // crew#833: the seats THIS RUN benched (`benched_seats`, engine ≥ wave 6) are never a
995
+ // failover target — the run already failed over away from them on the same error.
996
+ ...(Array.isArray(v.session.benched_seats) && v.session.benched_seats.length > 0
997
+ ? { benched: v.session.benched_seats.map((b) => ({ cli: b.cli, reason: b.reason })) }
998
+ : {}),
938
999
  // crew #580 / #581: a tool cursor is notified about, never reassigned.
939
1000
  ...(cursor !== undefined ? { executor: cursor.executor } : {}),
940
1001
  };
@@ -1019,6 +1080,30 @@ export async function createServer(adapter, options) {
1019
1080
  // CoreEvent stream below; `POST /chats/:id/messages` refuses a send to a busy seat and the
1020
1081
  // chat frames leave here stamped with the `turn_id` they answer.
1021
1082
  const chatTurns = new ChatTurnIndex();
1083
+ // ASK-C2 (DES-ASK-TEAM-CHAT-001 §5.2): the ask relay — the answer unit's deltas as chatDelta, the
1084
+ // step.completed row's output as the chatReply, both fed back through the fold below so the turn
1085
+ // index stamps them and the transcript/recorder/citations/ws consumers are unchanged.
1086
+ const askRelay = new AskRelay({
1087
+ paths: askPaths,
1088
+ turns: chatTurns,
1089
+ workOutput: (unitId) => adapter.workOutput(unitId),
1090
+ units: async (runId) => {
1091
+ const view = (await adapter.sessionsDetail()).find((v) => v.session.id === runId);
1092
+ return (view?.units ?? []).map((u) => {
1093
+ const la = u.last_attempt;
1094
+ return {
1095
+ id: u.id,
1096
+ ord: u.ord,
1097
+ status: String(u.status),
1098
+ assigned_cli: u.assigned_cli ?? null,
1099
+ ...(typeof la === 'number' ? { last_attempt: la } : {}),
1100
+ };
1101
+ });
1102
+ },
1103
+ fold: (frame) => onEngineEvent(frame),
1104
+ recorderReconcile: (chat, turnId, seats) => chatDecisionRecorder?.reconcile(chat, turnId, seats),
1105
+ log: (m) => app.log.warn(m),
1106
+ });
1022
1107
  // Chat transcripts at rest (DES-L5, D-13): one JSONL per LIVE chat under `<state home>/chats/`,
1023
1108
  // written from the stamped frames below, dropped with the chat on `chatClosed`, served on
1024
1109
  // `GET /chats/:id.messages`.
@@ -1098,10 +1183,14 @@ export async function createServer(adapter, options) {
1098
1183
  // prefill remains reproducible across a daemon restart (crew#619).
1099
1184
  chatTranscripts.clearOrphaned(new Set(chatRetained.keys()));
1100
1185
  }
1101
- const offEvent = adapter.onEvent((event) => {
1186
+ const onEngineEvent = (event) => {
1102
1187
  gateCache.ingest(event);
1103
1188
  elicitationCache.ingest(event);
1104
1189
  seatHealth.ingest(event);
1190
+ // ASK-C2: a path run's unit + terminal frames become the chat's frames (re-entering this fold
1191
+ // as chatDelta / chatReply, which the relay ignores — no recursion).
1192
+ if (typeof event.session === 'string')
1193
+ void askRelay.onCoreEvent(event);
1105
1194
  if (event.type === 'chatClosed' && typeof event.chat === 'string') {
1106
1195
  chatScopes.closed(event.chat);
1107
1196
  // DC-S4b: whatever the chat's open turns gathered is recorded now — into the ledger and onto
@@ -1290,7 +1379,8 @@ export async function createServer(adapter, options) {
1290
1379
  }
1291
1380
  })();
1292
1381
  }
1293
- });
1382
+ };
1383
+ const offEvent = adapter.onEvent(onEngineEvent);
1294
1384
  // Skills keystone (codex round 4): every launch the daemon hands the engine — run, resume, gate
1295
1385
  // answer, campaign — opens a generation pin BEFORE the engine call, released only by the engine's
1296
1386
  // `skillsSnapshotHanded` report or the terminal frame (live-generations.ts). Unregistered on
@@ -1469,6 +1559,35 @@ export async function createServer(adapter, options) {
1469
1559
  // Routes that say something to the thread (a refused chat seat, F-2R2-007) emit through the
1470
1560
  // SAME /ws fan-out the engine's frames take.
1471
1561
  broadcast: (frame) => broadcast(frame),
1562
+ // ASK-C1/C2: the ask-path index the routes write and the relay reads.
1563
+ askPaths,
1564
+ // ASK-C1: DELETE /chats/:id on an ask path closes through the same fold an engine
1565
+ // `chatClosed` takes (scope slot, decisions, considerations, retention-aware transcript).
1566
+ closeChat: async (frame, runId, ticket) => {
1567
+ // End cancels the path's run: its retention hold goes first, so the fold drops the
1568
+ // transcript with the chat (a reused id starts empty — codex on #808 r3, 1).
1569
+ if (runId !== undefined && typeof frame.chat === 'string') {
1570
+ const retaining = chatRetained.get(frame.chat);
1571
+ retaining?.delete(runId);
1572
+ if (retaining !== undefined && retaining.size === 0)
1573
+ chatRetained.delete(frame.chat);
1574
+ runToChat.delete(runId);
1575
+ askRelay.forget(runId);
1576
+ }
1577
+ // The recorder settles the chat's open turns NOW — resolving the project while the index
1578
+ // still names this chat's (the id is parked `closing` until the fold below frees it), and
1579
+ // writing the transcript's decisions record before the file is dropped. A deferred close
1580
+ // could otherwise file the ended chat's words under a replacement's project and append
1581
+ // them to its transcript (codex on #808 r4, 1). The fold's own call then finds nothing.
1582
+ if (typeof frame.chat === 'string')
1583
+ await chatDecisionRecorder?.closed(frame.chat);
1584
+ // The id is held for this close alone (no timer, a second DELETE joined); the fold frees
1585
+ // it. Not held any more = settled elsewhere: nothing to fold (codex on #808 r5, 1+2).
1586
+ if (typeof frame.chat !== 'string' || !chatScopes.isHeld(frame.chat, ticket))
1587
+ return;
1588
+ chatScopes.closeHeld(frame.chat, ticket);
1589
+ onEngineEvent(frame);
1590
+ },
1472
1591
  // crew#619: retain a chat's transcript for the lifetime of its promoted run.
1473
1592
  linkChatRun,
1474
1593
  // TR-W5a: the `watch.*` settings guard validates against the registry's entries.
@@ -1548,9 +1667,15 @@ export async function createServer(adapter, options) {
1548
1667
  // crew#471: a campaign the previous daemon left `running` is crash-resumed by the engine (its
1549
1668
  // node runs froze with that process) — asked once, at boot, never for a paused one.
1550
1669
  void resumeRunningCampaigns(adapter, (m) => app.log.warn(m));
1670
+ // crew#830: a run the previous daemon left `executing` with no worker is marked `runOrphaned` by
1671
+ // the engine at bootstrap (core#124) but never moved — resume every run whose trail ends on that
1672
+ // frame, once, and audit it as `run.resumed {via: 'boot'}`; a live run (trail continues) is untouched.
1673
+ void resumeOrphanedRuns(adapter, audit, DAEMON_ACTOR, (m) => app.log.warn(m));
1551
1674
  // The UI-emittable direction of the interactive seam. Registered unconditionally (a null relay
1552
1675
  // answers 503, not 404) and BEFORE the static/SPA fallback below, like every other API route.
1553
1676
  registerInteractiveEventRoutes(app, interactiveRelay);
1677
+ // crew#741: route registration + index hydration, from the skills seam to here, is `routes`.
1678
+ bootClock.lap('routes');
1554
1679
  // Serve the bundled studio SPA same-origin (DES-STUDIO-SERVING-001 §3). The
1555
1680
  // API routes, `/ws`, and terminal WS are registered ABOVE and keep winning:
1556
1681
  // static uses `wildcard: false` (only serves files that physically exist),
@@ -1606,6 +1731,8 @@ export async function createServer(adapter, options) {
1606
1731
  // Dev / headless run without a built bundle: degrade gracefully (§3.1).
1607
1732
  app.log.warn(`studio bundle not found at ${studioRoot} — serving API + WS only (headless)`);
1608
1733
  }
1734
+ bootClock.lap('studio');
1735
+ app.decorate('bootStages', bootClock);
1609
1736
  return app;
1610
1737
  }
1611
1738
  /** The URL a worker on this host reaches the daemon at: a wildcard bind is reached on loopback. */
@@ -1616,14 +1743,16 @@ export function brokerUrlFor(host, port) {
1616
1743
  export async function startServer(adapter, port = 7701, host = '127.0.0.1', options) {
1617
1744
  const app = await createServer(adapter, options);
1618
1745
  await app.listen({ port, host });
1746
+ const clock = app.bootStages ?? new BootStageClock();
1747
+ clock.lap('listen');
1619
1748
  const addr = app.server.address();
1620
1749
  const boundPort = typeof addr === 'object' && addr ? addr.port : port;
1621
1750
  const boundHost = typeof addr === 'object' && addr ? addr.address : host;
1622
- app.log.info(`wicked-crew daemon listening on ${boundHost}:${boundPort}`);
1751
+ app.log.info(`wicked-crew daemon listening on ${boundHost}:${boundPort} (boot: ${clock.describe()})`);
1623
1752
  // DES-MCP-TOOLS-001 S1/S3: the in-process engine hands each governed worker this URL (with its
1624
1753
  // `WICKED_MCP_TOKEN`) as `WICKED_CREW_URL`, so the garden shim reaches THIS daemon's broker. The
1625
1754
  // engine reads the daemon's own env at every spawn; a daemon that never listened hands none.
1626
1755
  process.env['WICKED_CREW_URL'] = brokerUrlFor(boundHost, boundPort);
1627
- return { app, port: boundPort, host: boundHost };
1756
+ return { app, port: boundPort, host: boundHost, stages: clock.snapshot() };
1628
1757
  }
1629
1758
  //# sourceMappingURL=server.js.map