wicked-crew 0.7.40 → 0.7.46

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 (361) hide show
  1. package/dist/api/audit.d.ts +3 -0
  2. package/dist/api/audit.d.ts.map +1 -1
  3. package/dist/api/audit.js +2 -0
  4. package/dist/api/audit.js.map +1 -1
  5. package/dist/api/capture.d.ts +149 -0
  6. package/dist/api/capture.d.ts.map +1 -0
  7. package/dist/api/capture.js +330 -0
  8. package/dist/api/capture.js.map +1 -0
  9. package/dist/api/chat-citations.d.ts +174 -0
  10. package/dist/api/chat-citations.d.ts.map +1 -0
  11. package/dist/api/chat-citations.js +528 -0
  12. package/dist/api/chat-citations.js.map +1 -0
  13. package/dist/api/chat-transcripts.d.ts +20 -1
  14. package/dist/api/chat-transcripts.d.ts.map +1 -1
  15. package/dist/api/chat-transcripts.js +29 -0
  16. package/dist/api/chat-transcripts.js.map +1 -1
  17. package/dist/api/delivery-cache.d.ts +2 -2
  18. package/dist/api/delivery-freeze.d.ts +66 -0
  19. package/dist/api/delivery-freeze.d.ts.map +1 -0
  20. package/dist/api/delivery-freeze.js +104 -0
  21. package/dist/api/delivery-freeze.js.map +1 -0
  22. package/dist/api/delivery-index.d.ts +53 -9
  23. package/dist/api/delivery-index.d.ts.map +1 -1
  24. package/dist/api/delivery-index.js +115 -22
  25. package/dist/api/delivery-index.js.map +1 -1
  26. package/dist/api/demo.d.ts +90 -0
  27. package/dist/api/demo.d.ts.map +1 -0
  28. package/dist/api/demo.js +492 -0
  29. package/dist/api/demo.js.map +1 -0
  30. package/dist/api/diagnostics.d.ts +64 -1
  31. package/dist/api/diagnostics.d.ts.map +1 -1
  32. package/dist/api/diagnostics.js +129 -1
  33. package/dist/api/diagnostics.js.map +1 -1
  34. package/dist/api/eval-sample.d.ts +6 -6
  35. package/dist/api/governance-steering.d.ts +2 -2
  36. package/dist/api/mcp.d.ts +282 -0
  37. package/dist/api/mcp.d.ts.map +1 -0
  38. package/dist/api/mcp.js +521 -0
  39. package/dist/api/mcp.js.map +1 -0
  40. package/dist/api/plan-schema.d.ts +56 -0
  41. package/dist/api/plan-schema.d.ts.map +1 -0
  42. package/dist/api/plan-schema.js +26 -0
  43. package/dist/api/plan-schema.js.map +1 -0
  44. package/dist/api/roster-standing.d.ts +15 -2
  45. package/dist/api/roster-standing.d.ts.map +1 -1
  46. package/dist/api/roster-standing.js +59 -3
  47. package/dist/api/roster-standing.js.map +1 -1
  48. package/dist/api/routes.d.ts +630 -51
  49. package/dist/api/routes.d.ts.map +1 -1
  50. package/dist/api/routes.js +738 -127
  51. package/dist/api/routes.js.map +1 -1
  52. package/dist/api/run-files.d.ts.map +1 -1
  53. package/dist/api/run-files.js +31 -2
  54. package/dist/api/run-files.js.map +1 -1
  55. package/dist/api/run-liveness.d.ts +41 -0
  56. package/dist/api/run-liveness.d.ts.map +1 -0
  57. package/dist/api/run-liveness.js +166 -0
  58. package/dist/api/run-liveness.js.map +1 -0
  59. package/dist/api/seat-health.d.ts +35 -0
  60. package/dist/api/seat-health.d.ts.map +1 -1
  61. package/dist/api/seat-health.js +92 -4
  62. package/dist/api/seat-health.js.map +1 -1
  63. package/dist/api/seat-probe.d.ts +141 -0
  64. package/dist/api/seat-probe.d.ts.map +1 -0
  65. package/dist/api/seat-probe.js +257 -0
  66. package/dist/api/seat-probe.js.map +1 -0
  67. package/dist/api/seat-record.d.ts +40 -0
  68. package/dist/api/seat-record.d.ts.map +1 -0
  69. package/dist/api/seat-record.js +218 -0
  70. package/dist/api/seat-record.js.map +1 -0
  71. package/dist/api/seat-signin.d.ts.map +1 -1
  72. package/dist/api/seat-signin.js +3 -1
  73. package/dist/api/seat-signin.js.map +1 -1
  74. package/dist/api/seat-standing.d.ts +25 -5
  75. package/dist/api/seat-standing.d.ts.map +1 -1
  76. package/dist/api/seat-standing.js +76 -9
  77. package/dist/api/seat-standing.js.map +1 -1
  78. package/dist/api/server.d.ts +34 -48
  79. package/dist/api/server.d.ts.map +1 -1
  80. package/dist/api/server.js +283 -107
  81. package/dist/api/server.js.map +1 -1
  82. package/dist/api/skills.d.ts +3 -1
  83. package/dist/api/skills.d.ts.map +1 -1
  84. package/dist/api/skills.js +7 -2
  85. package/dist/api/skills.js.map +1 -1
  86. package/dist/api/stall-watchdog.d.ts +34 -3
  87. package/dist/api/stall-watchdog.d.ts.map +1 -1
  88. package/dist/api/stall-watchdog.js +107 -8
  89. package/dist/api/stall-watchdog.js.map +1 -1
  90. package/dist/api/steering-landing.d.ts +6 -6
  91. package/dist/api/steering-landing.d.ts.map +1 -1
  92. package/dist/api/steering-landing.js +7 -9
  93. package/dist/api/steering-landing.js.map +1 -1
  94. package/dist/api/testing.d.ts +6 -4
  95. package/dist/api/testing.d.ts.map +1 -1
  96. package/dist/api/testing.js +82 -47
  97. package/dist/api/testing.js.map +1 -1
  98. package/dist/campaign/boot-resume.d.ts +34 -0
  99. package/dist/campaign/boot-resume.d.ts.map +1 -0
  100. package/dist/campaign/boot-resume.js +45 -0
  101. package/dist/campaign/boot-resume.js.map +1 -0
  102. package/dist/campaigns/rollup.d.ts +4 -1
  103. package/dist/campaigns/rollup.d.ts.map +1 -1
  104. package/dist/campaigns/rollup.js +6 -1
  105. package/dist/campaigns/rollup.js.map +1 -1
  106. package/dist/campaigns/routes.d.ts +2 -2
  107. package/dist/cli/bearer.d.ts +27 -1
  108. package/dist/cli/bearer.d.ts.map +1 -1
  109. package/dist/cli/bearer.js +62 -2
  110. package/dist/cli/bearer.js.map +1 -1
  111. package/dist/cli/governance.d.ts +11 -0
  112. package/dist/cli/governance.d.ts.map +1 -1
  113. package/dist/cli/governance.js +8 -2
  114. package/dist/cli/governance.js.map +1 -1
  115. package/dist/cli/index.d.ts.map +1 -1
  116. package/dist/cli/index.js +140 -75
  117. package/dist/cli/index.js.map +1 -1
  118. package/dist/cli/mcp.d.ts +11 -0
  119. package/dist/cli/mcp.d.ts.map +1 -1
  120. package/dist/cli/mcp.js +40 -9
  121. package/dist/cli/mcp.js.map +1 -1
  122. package/dist/cli/service.d.ts +78 -0
  123. package/dist/cli/service.d.ts.map +1 -0
  124. package/dist/cli/service.js +334 -0
  125. package/dist/cli/service.js.map +1 -0
  126. package/dist/core/adapter.d.ts +238 -12
  127. package/dist/core/adapter.d.ts.map +1 -1
  128. package/dist/core/adapter.js +619 -157
  129. package/dist/core/adapter.js.map +1 -1
  130. package/dist/core/bridge-reaper.d.ts +4 -1
  131. package/dist/core/bridge-reaper.d.ts.map +1 -1
  132. package/dist/core/bridge-reaper.js +15 -1
  133. package/dist/core/bridge-reaper.js.map +1 -1
  134. package/dist/core/bus-notice.d.ts +27 -0
  135. package/dist/core/bus-notice.d.ts.map +1 -0
  136. package/dist/core/bus-notice.js +24 -0
  137. package/dist/core/bus-notice.js.map +1 -0
  138. package/dist/core/bus.d.ts +99 -0
  139. package/dist/core/bus.d.ts.map +1 -0
  140. package/dist/core/bus.js +176 -0
  141. package/dist/core/bus.js.map +1 -0
  142. package/dist/core/deliver-exclusions.d.ts +71 -0
  143. package/dist/core/deliver-exclusions.d.ts.map +1 -0
  144. package/dist/core/deliver-exclusions.js +110 -0
  145. package/dist/core/deliver-exclusions.js.map +1 -0
  146. package/dist/core/deliver-text.d.ts +61 -14
  147. package/dist/core/deliver-text.d.ts.map +1 -1
  148. package/dist/core/deliver-text.js +178 -30
  149. package/dist/core/deliver-text.js.map +1 -1
  150. package/dist/core/deliver-triage.d.ts +11 -2
  151. package/dist/core/deliver-triage.d.ts.map +1 -1
  152. package/dist/core/deliver-triage.js +19 -1
  153. package/dist/core/deliver-triage.js.map +1 -1
  154. package/dist/core/deliver.d.ts +161 -3
  155. package/dist/core/deliver.d.ts.map +1 -1
  156. package/dist/core/deliver.js +463 -25
  157. package/dist/core/deliver.js.map +1 -1
  158. package/dist/core/deliverable-floor.d.ts.map +1 -1
  159. package/dist/core/deliverable-floor.js +5 -7
  160. package/dist/core/deliverable-floor.js.map +1 -1
  161. package/dist/core/engine-bus.d.ts +40 -0
  162. package/dist/core/engine-bus.d.ts.map +1 -0
  163. package/dist/core/engine-bus.js +27 -0
  164. package/dist/core/engine-bus.js.map +1 -0
  165. package/dist/core/estate-mcp-client.d.ts +87 -5
  166. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  167. package/dist/core/estate-mcp-client.js +90 -11
  168. package/dist/core/estate-mcp-client.js.map +1 -1
  169. package/dist/core/linked-issues.d.ts +46 -0
  170. package/dist/core/linked-issues.d.ts.map +1 -0
  171. package/dist/core/linked-issues.js +123 -0
  172. package/dist/core/linked-issues.js.map +1 -0
  173. package/dist/core/run-identity.d.ts +100 -0
  174. package/dist/core/run-identity.d.ts.map +1 -0
  175. package/dist/core/run-identity.js +178 -0
  176. package/dist/core/run-identity.js.map +1 -0
  177. package/dist/core/shutdown.d.ts +16 -0
  178. package/dist/core/shutdown.d.ts.map +1 -0
  179. package/dist/core/shutdown.js +39 -0
  180. package/dist/core/shutdown.js.map +1 -0
  181. package/dist/core/types.d.ts +15 -1
  182. package/dist/core/types.d.ts.map +1 -1
  183. package/dist/core/types.js +4 -0
  184. package/dist/core/types.js.map +1 -1
  185. package/dist/interactive/bridge-pool.d.ts +67 -3
  186. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  187. package/dist/interactive/bridge-pool.js +129 -13
  188. package/dist/interactive/bridge-pool.js.map +1 -1
  189. package/dist/interactive/bridge-root.d.ts +9 -0
  190. package/dist/interactive/bridge-root.d.ts.map +1 -1
  191. package/dist/interactive/bridge-root.js +11 -4
  192. package/dist/interactive/bridge-root.js.map +1 -1
  193. package/dist/interactive/chat-events.d.ts +14 -9
  194. package/dist/interactive/chat-events.d.ts.map +1 -1
  195. package/dist/interactive/chat-events.js +55 -57
  196. package/dist/interactive/chat-events.js.map +1 -1
  197. package/dist/interactive/council-outcome.d.ts +1 -0
  198. package/dist/interactive/council-outcome.d.ts.map +1 -1
  199. package/dist/interactive/council-outcome.js +33 -0
  200. package/dist/interactive/council-outcome.js.map +1 -1
  201. package/dist/interactive/draft-events.d.ts +36 -17
  202. package/dist/interactive/draft-events.d.ts.map +1 -1
  203. package/dist/interactive/draft-events.js +121 -92
  204. package/dist/interactive/draft-events.js.map +1 -1
  205. package/dist/interactive/draft-skill.d.ts +59 -0
  206. package/dist/interactive/draft-skill.d.ts.map +1 -1
  207. package/dist/interactive/draft-skill.js +233 -0
  208. package/dist/interactive/draft-skill.js.map +1 -1
  209. package/dist/interactive/edit-events.d.ts +1 -14
  210. package/dist/interactive/edit-events.d.ts.map +1 -1
  211. package/dist/interactive/edit-events.js +37 -70
  212. package/dist/interactive/edit-events.js.map +1 -1
  213. package/dist/interactive/proxy-routes.d.ts +2 -2
  214. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  215. package/dist/interactive/proxy-routes.js +4 -13
  216. package/dist/interactive/proxy-routes.js.map +1 -1
  217. package/dist/interactive/ws-relay.d.ts +9 -10
  218. package/dist/interactive/ws-relay.d.ts.map +1 -1
  219. package/dist/interactive/ws-relay.js +23 -50
  220. package/dist/interactive/ws-relay.js.map +1 -1
  221. package/dist/mcp/broker.d.ts +88 -0
  222. package/dist/mcp/broker.d.ts.map +1 -0
  223. package/dist/mcp/broker.js +307 -0
  224. package/dist/mcp/broker.js.map +1 -0
  225. package/dist/mcp/call-records.d.ts +61 -0
  226. package/dist/mcp/call-records.d.ts.map +1 -0
  227. package/dist/mcp/call-records.js +135 -0
  228. package/dist/mcp/call-records.js.map +1 -0
  229. package/dist/mcp/classify.d.ts +45 -0
  230. package/dist/mcp/classify.d.ts.map +1 -0
  231. package/dist/mcp/classify.js +83 -0
  232. package/dist/mcp/classify.js.map +1 -0
  233. package/dist/mcp/discovery.d.ts +24 -0
  234. package/dist/mcp/discovery.d.ts.map +1 -0
  235. package/dist/mcp/discovery.js +78 -0
  236. package/dist/mcp/discovery.js.map +1 -0
  237. package/dist/mcp/invoke.d.ts +36 -0
  238. package/dist/mcp/invoke.d.ts.map +1 -0
  239. package/dist/mcp/invoke.js +80 -0
  240. package/dist/mcp/invoke.js.map +1 -0
  241. package/dist/mcp/policies.d.ts +110 -0
  242. package/dist/mcp/policies.d.ts.map +1 -0
  243. package/dist/mcp/policies.js +400 -0
  244. package/dist/mcp/policies.js.map +1 -0
  245. package/dist/mcp/probe.d.ts +66 -0
  246. package/dist/mcp/probe.d.ts.map +1 -0
  247. package/dist/mcp/probe.js +116 -0
  248. package/dist/mcp/probe.js.map +1 -0
  249. package/dist/mcp/redact.d.ts +34 -0
  250. package/dist/mcp/redact.d.ts.map +1 -0
  251. package/dist/mcp/redact.js +84 -0
  252. package/dist/mcp/redact.js.map +1 -0
  253. package/dist/mcp/registry-store.d.ts +69 -0
  254. package/dist/mcp/registry-store.d.ts.map +1 -0
  255. package/dist/mcp/registry-store.js +82 -0
  256. package/dist/mcp/registry-store.js.map +1 -0
  257. package/dist/mcp/registry.d.ts +147 -0
  258. package/dist/mcp/registry.d.ts.map +1 -0
  259. package/dist/mcp/registry.js +509 -0
  260. package/dist/mcp/registry.js.map +1 -0
  261. package/dist/mcp/rest.d.ts +111 -0
  262. package/dist/mcp/rest.d.ts.map +1 -0
  263. package/dist/mcp/rest.js +606 -0
  264. package/dist/mcp/rest.js.map +1 -0
  265. package/dist/mcp/secrets.d.ts +66 -0
  266. package/dist/mcp/secrets.d.ts.map +1 -0
  267. package/dist/mcp/secrets.js +180 -0
  268. package/dist/mcp/secrets.js.map +1 -0
  269. package/dist/mcp/tool-list.d.ts +25 -0
  270. package/dist/mcp/tool-list.d.ts.map +1 -0
  271. package/dist/mcp/tool-list.js +62 -0
  272. package/dist/mcp/tool-list.js.map +1 -0
  273. package/dist/mcp/upstream-error.d.ts +12 -0
  274. package/dist/mcp/upstream-error.d.ts.map +1 -0
  275. package/dist/mcp/upstream-error.js +14 -0
  276. package/dist/mcp/upstream-error.js.map +1 -0
  277. package/dist/mcp/usage.d.ts +31 -0
  278. package/dist/mcp/usage.d.ts.map +1 -0
  279. package/dist/mcp/usage.js +159 -0
  280. package/dist/mcp/usage.js.map +1 -0
  281. package/dist/presets/routes.d.ts +53 -0
  282. package/dist/presets/routes.d.ts.map +1 -0
  283. package/dist/presets/routes.js +115 -0
  284. package/dist/presets/routes.js.map +1 -0
  285. package/dist/projects/activity.d.ts +6 -18
  286. package/dist/projects/activity.d.ts.map +1 -1
  287. package/dist/projects/activity.js +17 -60
  288. package/dist/projects/activity.js.map +1 -1
  289. package/dist/projects/events.d.ts +6 -5
  290. package/dist/projects/events.d.ts.map +1 -1
  291. package/dist/projects/events.js +33 -58
  292. package/dist/projects/events.js.map +1 -1
  293. package/dist/projects/routes.d.ts.map +1 -1
  294. package/dist/projects/routes.js +19 -0
  295. package/dist/projects/routes.js.map +1 -1
  296. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  297. package/dist/projects/state-home-preflight.js +7 -0
  298. package/dist/projects/state-home-preflight.js.map +1 -1
  299. package/dist/projects/state-home-registry.d.ts.map +1 -1
  300. package/dist/projects/state-home-registry.js +9 -1
  301. package/dist/projects/state-home-registry.js.map +1 -1
  302. package/dist/qe/acceptance.d.ts +28 -28
  303. package/dist/qe/acceptance.d.ts.map +1 -1
  304. package/dist/qe/acceptance.js +60 -61
  305. package/dist/qe/acceptance.js.map +1 -1
  306. package/dist/qe/test-sets.d.ts +3 -5
  307. package/dist/qe/test-sets.d.ts.map +1 -1
  308. package/dist/qe/test-sets.js +5 -7
  309. package/dist/qe/test-sets.js.map +1 -1
  310. package/dist/skills/installed.d.ts +51 -0
  311. package/dist/skills/installed.d.ts.map +1 -0
  312. package/dist/skills/installed.js +46 -0
  313. package/dist/skills/installed.js.map +1 -0
  314. package/dist/standing-orders/evaluator.d.ts +113 -0
  315. package/dist/standing-orders/evaluator.d.ts.map +1 -0
  316. package/dist/standing-orders/evaluator.js +225 -0
  317. package/dist/standing-orders/evaluator.js.map +1 -0
  318. package/dist/standing-orders/history.d.ts +58 -0
  319. package/dist/standing-orders/history.d.ts.map +1 -0
  320. package/dist/standing-orders/history.js +117 -0
  321. package/dist/standing-orders/history.js.map +1 -0
  322. package/dist/standing-orders/parse.d.ts +19 -0
  323. package/dist/standing-orders/parse.d.ts.map +1 -0
  324. package/dist/standing-orders/parse.js +75 -0
  325. package/dist/standing-orders/parse.js.map +1 -0
  326. package/dist/standing-orders/routes.d.ts +180 -0
  327. package/dist/standing-orders/routes.d.ts.map +1 -0
  328. package/dist/standing-orders/routes.js +95 -0
  329. package/dist/standing-orders/routes.js.map +1 -0
  330. package/dist/standing-orders/store.d.ts +154 -0
  331. package/dist/standing-orders/store.d.ts.map +1 -0
  332. package/dist/standing-orders/store.js +189 -0
  333. package/dist/standing-orders/store.js.map +1 -0
  334. package/dist/studio/assets/index-CvV5qITf.css +32 -0
  335. package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
  336. package/dist/studio/index.html +3 -3
  337. package/dist/studio/testid-inventory.json +3274 -894
  338. package/dist/team/key.d.ts +5 -0
  339. package/dist/team/key.d.ts.map +1 -0
  340. package/dist/team/key.js +21 -0
  341. package/dist/team/key.js.map +1 -0
  342. package/dist/team/routes.d.ts +196 -0
  343. package/dist/team/routes.d.ts.map +1 -0
  344. package/dist/team/routes.js +274 -0
  345. package/dist/team/routes.js.map +1 -0
  346. package/dist/team/ws-relay.d.ts +39 -0
  347. package/dist/team/ws-relay.d.ts.map +1 -0
  348. package/dist/team/ws-relay.js +63 -0
  349. package/dist/team/ws-relay.js.map +1 -0
  350. package/endpoint-manifest.json +502 -6
  351. package/package.json +6 -6
  352. package/dist/interactive/demo-events.d.ts +0 -367
  353. package/dist/interactive/demo-events.d.ts.map +0 -1
  354. package/dist/interactive/demo-events.js +0 -1293
  355. package/dist/interactive/demo-events.js.map +0 -1
  356. package/dist/qe/gate-events.d.ts +0 -113
  357. package/dist/qe/gate-events.d.ts.map +0 -1
  358. package/dist/qe/gate-events.js +0 -172
  359. package/dist/qe/gate-events.js.map +0 -1
  360. package/dist/studio/assets/index-Bg7Z3BR-.css +0 -32
  361. package/dist/studio/assets/index-BvOFMjf9.js +0 -554
@@ -0,0 +1,159 @@
1
+ /**
2
+ * The MCP usage fold (DES-MCP-TOOLS-001 §7 Usage, §8 `GET /mcp/usage`; slice S7).
3
+ *
4
+ * A pure function over call records (`calls.ndjson`, written by the broker, S3): counts, the
5
+ * decision split (allow / ask / deny / guard_error), the error rate and nearest-rank p50/p95/p99
6
+ * over the calls that ran, a per-tool table, per-server totals, the tool × seat × run drill-down,
7
+ * the common tool chains and one row per UTC day. Nothing is cached and no poller runs: every
8
+ * `GET /mcp/usage` folds the records as they are on disk.
9
+ */
10
+ import { parseMcpSubject } from './classify.js';
11
+ export const MCP_USAGE_MAX_DAYS = 30;
12
+ export const MCP_USAGE_DEFAULT_DAYS = 7;
13
+ export const MCP_USAGE_DECISIONS = ['allow', 'ask', 'deny', 'guard_error'];
14
+ export const MCP_USAGE_MAX_RUNS = 200;
15
+ export const MCP_USAGE_MAX_CHAINS = 20;
16
+ const DAY_MS = 86_400_000;
17
+ /** Nearest-rank percentile of ascending `sorted`: the value at position `ceil(q * n)`. */
18
+ export function nearestRank(sorted, q) {
19
+ if (sorted.length === 0)
20
+ return null;
21
+ const rank = Math.max(1, Math.ceil(q * sorted.length));
22
+ return sorted[Math.min(rank, sorted.length) - 1] ?? null;
23
+ }
24
+ function zero() {
25
+ return { allow: 0, ask: 0, deny: 0, guard_error: 0 };
26
+ }
27
+ function stats(records) {
28
+ const decisions = zero();
29
+ const ms = [];
30
+ let errors = 0;
31
+ for (const r of records) {
32
+ decisions[r.decision.decision] += 1;
33
+ if (r.decision.decision !== 'allow')
34
+ continue;
35
+ ms.push(r.ms);
36
+ if (r.status.code === 'error')
37
+ errors += 1;
38
+ }
39
+ ms.sort((a, b) => a - b);
40
+ return {
41
+ calls: records.length,
42
+ decisions,
43
+ ran: ms.length,
44
+ errors,
45
+ errorRate: ms.length === 0 ? null : errors / ms.length,
46
+ p50Ms: nearestRank(ms, 0.5),
47
+ p95Ms: nearestRank(ms, 0.95),
48
+ p99Ms: nearestRank(ms, 0.99),
49
+ };
50
+ }
51
+ function groupBy(records, key) {
52
+ const out = new Map();
53
+ for (const r of records) {
54
+ const k = key(r);
55
+ const list = out.get(k);
56
+ if (list === undefined)
57
+ out.set(k, [r]);
58
+ else
59
+ list.push(r);
60
+ }
61
+ return out;
62
+ }
63
+ const byStart = (a, b) => Date.parse(a.start) - Date.parse(b.start) || a.spanId.localeCompare(b.spanId);
64
+ const newest = (records) => records.reduce((n, r) => (byStart(r, n) > 0 ? r : n));
65
+ const seatOf = (r) => r.attrs['wicked.seat'];
66
+ const subjectOf = (r) => r.attrs['mcp.subject'];
67
+ /** The tool chains of `records`: consecutive calls of one unit attempt, with different subjects. */
68
+ export function foldChains(records, subject) {
69
+ const units = groupBy(records.filter((r) => r.traceId !== null && r.parentSpanId !== null), (r) => `${r.traceId ?? ''}\u0000${r.parentSpanId ?? ''}`);
70
+ const chains = new Map();
71
+ for (const calls of units.values()) {
72
+ const ordered = [...calls].sort(byStart);
73
+ for (let i = 1; i < ordered.length; i++) {
74
+ const from = subjectOf(ordered[i - 1]);
75
+ const to = subjectOf(ordered[i]);
76
+ if (from === to)
77
+ continue;
78
+ if (subject !== undefined && from !== subject && to !== subject)
79
+ continue;
80
+ const key = `${from}\u0000${to}`;
81
+ const c = chains.get(key) ?? { from, to, count: 0, runs: new Set() };
82
+ c.count += 1;
83
+ c.runs.add(ordered[i].traceId ?? '');
84
+ chains.set(key, c);
85
+ }
86
+ }
87
+ return [...chains.values()]
88
+ .map((c) => ({ from: c.from, to: c.to, count: c.count, runs: c.runs.size }))
89
+ .sort((a, b) => b.count - a.count || a.from.localeCompare(b.from) || a.to.localeCompare(b.to))
90
+ .slice(0, MCP_USAGE_MAX_CHAINS);
91
+ }
92
+ /**
93
+ * Fold `records` into the usage view for the last `days` × 24 h before `now`. `skipped` passes
94
+ * through the count of lines the reader could not parse.
95
+ */
96
+ export function foldMcpUsage(records, query, now, skipped = 0) {
97
+ const days = query.days ?? MCP_USAGE_DEFAULT_DAYS;
98
+ const since = now - days * DAY_MS;
99
+ // Every start is re-spelled as UTC ISO (the broker writes that already; a line written with an
100
+ // offset must still land on its UTC day and order by its instant).
101
+ const inWindow = [];
102
+ for (const r of records) {
103
+ const t = Date.parse(r.start);
104
+ if (Number.isFinite(t) && t >= since && t <= now)
105
+ inWindow.push({ ...r, start: new Date(t).toISOString() });
106
+ }
107
+ const seats = [...new Set(inWindow.map(seatOf).filter((s) => s !== null))].sort();
108
+ const unitFiltered = inWindow.filter((r) => (query.seat === undefined || seatOf(r) === query.seat) && (query.decision === undefined || r.decision.decision === query.decision));
109
+ const filtered = query.subject === undefined ? unitFiltered : unitFiltered.filter((r) => subjectOf(r) === query.subject);
110
+ const tools = [...groupBy(filtered, subjectOf)].map(([subject, calls]) => {
111
+ const parts = parseMcpSubject(subject);
112
+ const last = newest(calls);
113
+ const cls = last.attrs['mcp.class'];
114
+ return {
115
+ subject,
116
+ server: parts?.server ?? '',
117
+ tool: parts?.tool ?? '',
118
+ class: cls,
119
+ seats: [...new Set(calls.map(seatOf).filter((s) => s !== null))].sort(),
120
+ lastCall: last.start,
121
+ ...stats(calls),
122
+ };
123
+ });
124
+ tools.sort((a, b) => b.calls - a.calls || a.subject.localeCompare(b.subject));
125
+ const servers = [...groupBy(filtered, (r) => parseMcpSubject(subjectOf(r))?.server ?? '')].map(([server, calls]) => {
126
+ const s = stats(calls);
127
+ return { server, calls: s.calls, decisions: s.decisions, lastCall: newest(calls).start };
128
+ });
129
+ servers.sort((a, b) => b.calls - a.calls || a.server.localeCompare(b.server));
130
+ const runs = [...groupBy(filtered, (r) => `${subjectOf(r)}\u0000${seatOf(r) ?? ''}\u0000${r.traceId ?? ''}`).values()].map((calls) => {
131
+ const first = calls[0];
132
+ const s = stats(calls);
133
+ return { subject: subjectOf(first), seat: seatOf(first), runId: first.traceId, calls: s.calls, decisions: s.decisions, errors: s.errors, lastCall: newest(calls).start };
134
+ });
135
+ runs.sort((a, b) => b.lastCall.localeCompare(a.lastCall) || a.subject.localeCompare(b.subject));
136
+ const daily = [];
137
+ const perDay = groupBy(filtered, (r) => r.start.slice(0, 10));
138
+ const firstDay = Date.UTC(new Date(since).getUTCFullYear(), new Date(since).getUTCMonth(), new Date(since).getUTCDate());
139
+ for (let t = firstDay; t <= now; t += DAY_MS) {
140
+ const day = new Date(t).toISOString().slice(0, 10);
141
+ const s = stats(perDay.get(day) ?? []);
142
+ daily.push({ day, calls: s.calls, decisions: s.decisions });
143
+ }
144
+ return {
145
+ days,
146
+ since: new Date(since).toISOString(),
147
+ until: new Date(now).toISOString(),
148
+ filters: { subject: query.subject ?? null, seat: query.seat ?? null, decision: query.decision ?? null },
149
+ totals: stats(filtered),
150
+ tools,
151
+ servers,
152
+ runs: runs.slice(0, MCP_USAGE_MAX_RUNS),
153
+ chains: foldChains(unitFiltered, query.subject),
154
+ daily,
155
+ seats,
156
+ skipped,
157
+ };
158
+ }
159
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/mcp/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `/api/v1/presets` — saved phase selections (DES-TEAMING-002 §8.4, seam C2):
3
+ *
4
+ * GET /presets[?projectId=] the presets a launch in that project sees, by name
5
+ * GET /presets/:name[?projectId=] one preset (the project's row, else the global one)
6
+ * PUT /presets/:name save {steps, projectId?} (global when projectId is absent)
7
+ * DELETE /presets/:name[?projectId=] delete in that scope
8
+ *
9
+ * A preset is launched by NAME: `POST /runs {workflow: "<name>"}`. The ENGINE resolves it (the
10
+ * launch's project row, then the global row, then a registered workflow of that name), so the same
11
+ * name launches the same selection from a campaign node or a bus `wicked.crew.run.requested` with
12
+ * no crew involvement. These routes are commands and reads over the engine's store (§4.0); crew
13
+ * keeps no copy and publishes no event.
14
+ *
15
+ * Engine error → status: the engine's message leads with a reason token.
16
+ * `preset_builtin_readonly` 409 · `preset_unknown_project` 404 · any other `preset_*` 400.
17
+ * An addon without the bindings answers 501 (PresetsUnsupportedError), never 400.
18
+ */
19
+ import type { FastifyInstance } from 'fastify';
20
+ import { z } from 'zod';
21
+ import type { CoreAdapter } from '../core/adapter.js';
22
+ import { AuditLog } from '../api/audit.js';
23
+ export declare const PutPresetSchema: z.ZodObject<{
24
+ steps: z.ZodArray<z.ZodObject<{
25
+ catalog: z.ZodString;
26
+ id: z.ZodString;
27
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
28
+ catalog: z.ZodString;
29
+ id: z.ZodString;
30
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
31
+ catalog: z.ZodString;
32
+ id: z.ZodString;
33
+ }, z.ZodTypeAny, "passthrough">>, "many">;
34
+ projectId: z.ZodOptional<z.ZodString>;
35
+ }, "strict", z.ZodTypeAny, {
36
+ steps: z.objectOutputType<{
37
+ catalog: z.ZodString;
38
+ id: z.ZodString;
39
+ }, z.ZodTypeAny, "passthrough">[];
40
+ projectId?: string | undefined;
41
+ }, {
42
+ steps: z.objectInputType<{
43
+ catalog: z.ZodString;
44
+ id: z.ZodString;
45
+ }, z.ZodTypeAny, "passthrough">[];
46
+ projectId?: string | undefined;
47
+ }>;
48
+ /** Engine error → HTTP status (the mapping in the module doc). */
49
+ export declare function presetErrorStatus(err: unknown): number;
50
+ export declare function registerPresetRoutes(app: FastifyInstance, adapter: CoreAdapter, security?: {
51
+ audit: AuditLog;
52
+ }): void;
53
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/presets/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAU3C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAKjB,CAAC;AAQZ,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAMtD;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,WAAW,EAEpB,QAAQ,GAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAA+B,GACzD,IAAI,CAgEN"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * `/api/v1/presets` — saved phase selections (DES-TEAMING-002 §8.4, seam C2):
3
+ *
4
+ * GET /presets[?projectId=] the presets a launch in that project sees, by name
5
+ * GET /presets/:name[?projectId=] one preset (the project's row, else the global one)
6
+ * PUT /presets/:name save {steps, projectId?} (global when projectId is absent)
7
+ * DELETE /presets/:name[?projectId=] delete in that scope
8
+ *
9
+ * A preset is launched by NAME: `POST /runs {workflow: "<name>"}`. The ENGINE resolves it (the
10
+ * launch's project row, then the global row, then a registered workflow of that name), so the same
11
+ * name launches the same selection from a campaign node or a bus `wicked.crew.run.requested` with
12
+ * no crew involvement. These routes are commands and reads over the engine's store (§4.0); crew
13
+ * keeps no copy and publishes no event.
14
+ *
15
+ * Engine error → status: the engine's message leads with a reason token.
16
+ * `preset_builtin_readonly` 409 · `preset_unknown_project` 404 · any other `preset_*` 400.
17
+ * An addon without the bindings answers 501 (PresetsUnsupportedError), never 400.
18
+ */
19
+ import { z } from 'zod';
20
+ import { PresetsUnsupportedError } from '../core/adapter.js';
21
+ import { API_PREFIX } from '../api/api-prefix.js';
22
+ import { AuditLog } from '../api/audit.js';
23
+ import { LOCAL_ACTOR } from '../api/auth.js';
24
+ const V = API_PREFIX;
25
+ /** One plan step. The engine owns the step rules (`plan::compose`, `deny_unknown_fields`), so
26
+ * this layer checks only the two keys every step carries and passes the rest through. */
27
+ const PresetStepSchema = z.object({ catalog: z.string().min(1), id: z.string().min(1) }).passthrough();
28
+ // Exported for tests/wire-contract.test.ts (the request-direction drift guard).
29
+ export const PutPresetSchema = z
30
+ .object({
31
+ steps: z.array(PresetStepSchema).min(1),
32
+ projectId: z.string().min(1).optional(),
33
+ })
34
+ .strict();
35
+ const ScopeQuerySchema = z.object({ projectId: z.string().min(1).optional() }).strict();
36
+ function message(err) {
37
+ return err instanceof Error ? err.message : String(err);
38
+ }
39
+ /** Engine error → HTTP status (the mapping in the module doc). */
40
+ export function presetErrorStatus(err) {
41
+ if (err instanceof PresetsUnsupportedError)
42
+ return 501;
43
+ const msg = message(err);
44
+ if (msg.startsWith('preset_builtin_readonly'))
45
+ return 409;
46
+ if (msg.startsWith('preset_unknown_project'))
47
+ return 404;
48
+ return 400;
49
+ }
50
+ export function registerPresetRoutes(app, adapter,
51
+ // Defaulted to a NOOP trail so a directly-driven route set never writes the real audit log.
52
+ security = { audit: AuditLog.noop() }) {
53
+ const { audit } = security;
54
+ const actorOf = (req) => req.actor ?? LOCAL_ACTOR;
55
+ app.get(`${V}/presets`, async (req, reply) => {
56
+ const q = ScopeQuerySchema.safeParse(req.query);
57
+ if (!q.success)
58
+ return reply.code(400).send({ error: 'Invalid query', details: q.error.issues });
59
+ try {
60
+ const body = { presets: await adapter.listPresets(q.data.projectId) };
61
+ return body;
62
+ }
63
+ catch (err) {
64
+ return reply.code(presetErrorStatus(err)).send({ error: message(err) });
65
+ }
66
+ });
67
+ app.get(`${V}/presets/:name`, async (req, reply) => {
68
+ const q = ScopeQuerySchema.safeParse(req.query);
69
+ if (!q.success)
70
+ return reply.code(400).send({ error: 'Invalid query', details: q.error.issues });
71
+ try {
72
+ const preset = (await adapter.listPresets(q.data.projectId)).find((p) => p.name === req.params.name);
73
+ if (preset === undefined)
74
+ return reply.code(404).send({ error: `no preset \`${req.params.name}\`` });
75
+ const body = { preset };
76
+ return body;
77
+ }
78
+ catch (err) {
79
+ return reply.code(presetErrorStatus(err)).send({ error: message(err) });
80
+ }
81
+ });
82
+ app.put(`${V}/presets/:name`, async (req, reply) => {
83
+ const parsed = PutPresetSchema.safeParse(req.body);
84
+ if (!parsed.success) {
85
+ return reply.code(400).send({ error: 'Invalid request body', details: parsed.error.issues });
86
+ }
87
+ try {
88
+ const preset = await adapter.putPreset(req.params.name, parsed.data.steps, parsed.data.projectId, 'api');
89
+ audit.record('preset.saved', actorOf(req), { detail: { name: preset.name, scope: preset.scope } });
90
+ const body = { preset };
91
+ return body;
92
+ }
93
+ catch (err) {
94
+ return reply.code(presetErrorStatus(err)).send({ error: message(err) });
95
+ }
96
+ });
97
+ app.delete(`${V}/presets/:name`, async (req, reply) => {
98
+ const q = ScopeQuerySchema.safeParse(req.query);
99
+ if (!q.success)
100
+ return reply.code(400).send({ error: 'Invalid query', details: q.error.issues });
101
+ try {
102
+ const deleted = await adapter.deletePreset(req.params.name, q.data.projectId);
103
+ if (!deleted)
104
+ return reply.code(404).send({ error: `no preset \`${req.params.name}\` in that scope` });
105
+ audit.record('preset.deleted', actorOf(req), {
106
+ detail: { name: req.params.name, projectId: q.data.projectId ?? null },
107
+ });
108
+ return reply.code(204).send();
109
+ }
110
+ catch (err) {
111
+ return reply.code(presetErrorStatus(err)).send({ error: message(err) });
112
+ }
113
+ });
114
+ }
115
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/presets/routes.ts"],"names":[],"mappings":"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"}
@@ -4,24 +4,12 @@
4
4
  * Two sources, one normalized shape:
5
5
  * - CREW: the durable core-event log of the project's `crew.run`/`crew.chat` members
6
6
  * (`adapter.runEvents` — the same log `/runs/:id/events` serves), entry id `crew:<run>:<seq>`.
7
- * - INTERACTIVE: `wicked.interactive.*` bus events carrying this `project_id`, read directly
8
- * from the bus SQLite READ-ONLY through the SAME SQLite library wicked-bus itself uses
9
- * (better-sqlite3, resolved from wicked-bus's own location — wicked-bus exposes
10
- * subscribe-cursors, not ad-hoc history queries, and a durable cursor per feed-read would turn
11
- * a GET into a write), entry id `bus:<event_id>`.
12
- *
13
- * WHY NOT `node:sqlite` (F-E2E-021): this daemon already holds long-lived better-sqlite3
14
- * connections on the very same bus.db (the interactive seams, the /ws relay, the project bridge).
15
- * SQLite's file locks are POSIX advisory locks, which the kernel releases for the WHOLE process the
16
- * moment ANY descriptor for that file is closed. One SQLite library instance protects itself (it
17
- * defers the close while sibling connections hold locks); a SECOND library instance in the same
18
- * process — Node's bundled SQLite behind `node:sqlite` — knows nothing about the first, so its
19
- * `close()` here silently released every lock the seams held on bus.db and bus.db-shm. The next
20
- * short-lived external emitter (`wicked-bus emit`, what wicked-estate spawns after an index) then
21
- * won the EXCLUSIVE lock on its own close, checkpointed and UNLINKED bus.db-wal/-shm under the
22
- * seams, whose reads decayed into "database disk image is malformed" on every poll for the life
23
- * of the daemon. Rule: ONE SQLite library per database file per process — this read goes through
24
- * wicked-bus's better-sqlite3, whose deferred-close protection then covers it like any seam.
7
+ * - INTERACTIVE: `wicked.interactive.*` bus events carrying this `project_id`, read through the
8
+ * engine that holds the bus (`Core.busRead`, core/bus.ts — wicked-core#631), entry id
9
+ * `bus:<event_id>`. Crew opens no SQLite of its own: a second SQLite library on the engine's bus
10
+ * file in the same process drops the engine's POSIX locks on its close (F-E2E-021), which is
11
+ * why this read used to need a long-lived handle and now needs none. The newest 1000 live
12
+ * interactive rows for the project are read, expired ones included: the feed is history.
25
13
  *
26
14
  * Newest-first, cursor on `(ts, id)` — an opaque `<ts>:<id>` token, base64url. The merge is
27
15
  * recomputed per read; members are few and the log excludes high-volume frames, so the simple
@@ -1 +1 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/projects/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA8DtD,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW9E;AAsFD,sFAAsF;AACtF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAgBlE"}
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/projects/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAiCtD,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW9E;AA4ED,sFAAsF;AACtF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAgBlE"}
@@ -4,49 +4,18 @@
4
4
  * Two sources, one normalized shape:
5
5
  * - CREW: the durable core-event log of the project's `crew.run`/`crew.chat` members
6
6
  * (`adapter.runEvents` — the same log `/runs/:id/events` serves), entry id `crew:<run>:<seq>`.
7
- * - INTERACTIVE: `wicked.interactive.*` bus events carrying this `project_id`, read directly
8
- * from the bus SQLite READ-ONLY through the SAME SQLite library wicked-bus itself uses
9
- * (better-sqlite3, resolved from wicked-bus's own location — wicked-bus exposes
10
- * subscribe-cursors, not ad-hoc history queries, and a durable cursor per feed-read would turn
11
- * a GET into a write), entry id `bus:<event_id>`.
12
- *
13
- * WHY NOT `node:sqlite` (F-E2E-021): this daemon already holds long-lived better-sqlite3
14
- * connections on the very same bus.db (the interactive seams, the /ws relay, the project bridge).
15
- * SQLite's file locks are POSIX advisory locks, which the kernel releases for the WHOLE process the
16
- * moment ANY descriptor for that file is closed. One SQLite library instance protects itself (it
17
- * defers the close while sibling connections hold locks); a SECOND library instance in the same
18
- * process — Node's bundled SQLite behind `node:sqlite` — knows nothing about the first, so its
19
- * `close()` here silently released every lock the seams held on bus.db and bus.db-shm. The next
20
- * short-lived external emitter (`wicked-bus emit`, what wicked-estate spawns after an index) then
21
- * won the EXCLUSIVE lock on its own close, checkpointed and UNLINKED bus.db-wal/-shm under the
22
- * seams, whose reads decayed into "database disk image is malformed" on every poll for the life
23
- * of the daemon. Rule: ONE SQLite library per database file per process — this read goes through
24
- * wicked-bus's better-sqlite3, whose deferred-close protection then covers it like any seam.
7
+ * - INTERACTIVE: `wicked.interactive.*` bus events carrying this `project_id`, read through the
8
+ * engine that holds the bus (`Core.busRead`, core/bus.ts — wicked-core#631), entry id
9
+ * `bus:<event_id>`. Crew opens no SQLite of its own: a second SQLite library on the engine's bus
10
+ * file in the same process drops the engine's POSIX locks on its close (F-E2E-021), which is
11
+ * why this read used to need a long-lived handle and now needs none. The newest 1000 live
12
+ * interactive rows for the project are read, expired ones included: the feed is history.
25
13
  *
26
14
  * Newest-first, cursor on `(ts, id)` — an opaque `<ts>:<id>` token, base64url. The merge is
27
15
  * recomputed per read; members are few and the log excludes high-volume frames, so the simple
28
16
  * full-merge is the honest v1 (the ADR explicitly rejects a new store here).
29
17
  */
30
- import { createRequire } from 'node:module';
31
- let sqliteCtor;
32
- /**
33
- * The better-sqlite3 module INSTANCE wicked-bus loads: resolved from wicked-bus's own entry (the
34
- * same walk `lib/db.js`'s `require('better-sqlite3')` takes), so even a duplicated copy elsewhere
35
- * in node_modules could not become a second SQLite library on the bus db (see the module doc).
36
- * `null` when unresolvable — the interactive half is then empty, never an error.
37
- */
38
- function sqlite() {
39
- if (sqliteCtor === undefined) {
40
- try {
41
- const busEntry = createRequire(import.meta.url).resolve('wicked-bus');
42
- sqliteCtor = createRequire(busEntry)('better-sqlite3');
43
- }
44
- catch {
45
- sqliteCtor = null;
46
- }
47
- }
48
- return sqliteCtor;
49
- }
18
+ import { readBus } from '../core/bus.js';
50
19
  /** One-line human summary of a core frame (best-effort; `raw` carries the whole frame). */
51
20
  function summarizeCoreEvent(frame, runId) {
52
21
  const type = typeof frame['type'] === 'string' ? frame['type'] : 'event';
@@ -129,27 +98,18 @@ async function crewEntries(adapter, refs) {
129
98
  async function interactiveEntries(busDbPath, projectId) {
130
99
  if (busDbPath === null)
131
100
  return [];
132
- const Database = sqlite();
133
- if (Database === null)
134
- return [];
135
- let db = null;
136
101
  const entries = [];
137
102
  try {
138
- db = new Database(busDbPath, { readonly: true, fileMustExist: true });
139
- const rows = db
140
- .prepare(`SELECT event_id, event_type, payload, emitted_at FROM events
141
- WHERE event_type LIKE 'wicked.interactive.%'
142
- AND json_extract(payload, '$.project_id') = ?
143
- ORDER BY emitted_at DESC LIMIT 1000`)
144
- .all(projectId);
103
+ // History: rows past the bus TTL stay in the feed (nothing sweeps the daemon's bus).
104
+ const rows = (await readBus(busDbPath, 'wicked.interactive.', { history: true }))
105
+ .filter((r) => r.payload?.project_id === projectId)
106
+ .sort((x, y) => y.emitted_at - x.emitted_at)
107
+ .slice(0, 1000);
145
108
  for (const row of rows) {
146
- let payload = null;
147
- try {
148
- payload = JSON.parse(row.payload);
149
- }
150
- catch {
151
- /* raw stays the string */
152
- }
109
+ // The engine parses the payload; one that is not a JSON object stays in `raw` as stored.
110
+ const payload = row.payload !== null && typeof row.payload === 'object' && !Array.isArray(row.payload)
111
+ ? row.payload
112
+ : null;
153
113
  entries.push({
154
114
  id: `bus:${row.event_id}`,
155
115
  ts: row.emitted_at,
@@ -164,13 +124,10 @@ async function interactiveEntries(busDbPath, projectId) {
164
124
  }
165
125
  }
166
126
  catch {
167
- // No bus db / schema mismatch — the interactive half is empty, never an error:
127
+ // No engine bus / an unreadable one — the interactive half is empty, never an error:
168
128
  // a project with no bound docs must not 500 its activity feed.
169
129
  return entries;
170
130
  }
171
- finally {
172
- db?.close();
173
- }
174
131
  return entries;
175
132
  }
176
133
  /** Build one page of the merged feed. `refs` = the project's run/chat member refs. */
@@ -1 +1 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/projects/activity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/projects/activity.ts"],"names":[],"mappings":"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"}
@@ -29,14 +29,15 @@ export declare const PROJECT_ARCHIVED = "wicked.crew.project.archived";
29
29
  export declare const MEMBERSHIP_ATTACHED = "wicked.crew.membership.attached";
30
30
  export declare const MEMBERSHIP_DETACHED = "wicked.crew.membership.detached";
31
31
  export interface ProjectBus {
32
- /** Emit one post-commit project event. Never throws; WB-002 (duplicate key) is success. */
33
- emit(type: string, payload: Record<string, unknown>, idempotencyKey: string): boolean;
32
+ /** Emit one post-commit project event (through the engine, core/bus.ts). Never rejects; a key
33
+ * already on the bus is success. */
34
+ emit(type: string, payload: Record<string, unknown>, idempotencyKey: string): Promise<boolean>;
34
35
  /** The resolved bus db path (the activity feed's read side opens the same file). */
35
36
  dbPath: string | null;
36
37
  stop(): Promise<void>;
37
38
  }
38
39
  export interface ProjectBusOptions {
39
- /** Bus db path; omit for wicked-bus's own resolution (honors WICKED_BUS_DATA_DIR). */
40
+ /** The bus db the daemon handed its engine (core/bus.ts); without one the seam does not arm. */
40
41
  dbPath?: string;
41
42
  /** Poll cadence for the /ws bridge subscriber, ms (tests shorten it). */
42
43
  pollIntervalMs?: number;
@@ -45,8 +46,8 @@ export interface ProjectBusOptions {
45
46
  logError?: (msg: string) => void;
46
47
  }
47
48
  /**
48
- * Open the bus and arm both halves. Returns `null` (logged) when wicked-bus is not importable
49
- * or the db cannot open — the caller degrades to CRUD-without-events.
49
+ * Arm both halves. Returns `null` (logged) when the bus db cannot open — the caller degrades to
50
+ * CRUD-without-events.
50
51
  */
51
52
  export declare function startProjectBus(opts?: ProjectBusOptions): Promise<ProjectBus | null>;
52
53
  export declare function projectCreatedKey(projectId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/projects/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH;;8FAE8F;AAC9F,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAM7C,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,2FAA2F;IAC3F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACtF,oFAAoF;IACpF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,qHAAqH;IACrH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkG9F;AAID,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AACD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AACD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AACD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AACD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7F"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/projects/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH;;8FAE8F;AAC9F,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAI7C,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB;yCACqC;IACrC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,oFAAoF;IACpF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,qHAAqH;IACrH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoE9F;AAID,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AACD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AACD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AACD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AACD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7F"}