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
package/README.md CHANGED
@@ -11,13 +11,26 @@ Local-first: loopback only, no accounts, no billing, no model reselling. Crew dr
11
11
 
12
12
  ## Install
13
13
 
14
- Requires Node.js ≥ 22 and at least one coding-agent CLI on your machine (e.g. Claude Code, Codex).
14
+ Before you start, you need:
15
+
16
+ - **Node.js ≥ 22.**
17
+ - **A container runtime** (Rancher Desktop, Docker, Podman, Colima or OrbStack), running. Governed
18
+ agents work in a hardened seat container, and you sign each one in from studio's Agents tab in a
19
+ login container. `WICKED_SEAT_FLOOR=host` keeps the labelled interim host floor instead.
20
+ - **At least one coding-agent CLI** you can sign in (Claude Code, Codex, GitHub Copilot, OpenCode or Pi).
21
+ - **wicked-garden ≥ 12.40.0**, the skills every governed worker follows. crew does not vendor it, and
22
+ without it every launch is refused: `npx wicked-installer install wicked-garden`, then restart
23
+ `wicked-crew serve`.
24
+ - Optional: **wicked-estate** (`wicked-estate-mcp` on PATH) for code graphs and memory. It installs
25
+ with cargo today, so it needs a Rust toolchain.
15
26
 
16
27
  ```bash
17
28
  npm install -g wicked-crew
18
29
  wicked-crew serve
19
30
  ```
20
31
 
32
+ Studio's Nerve Center names whichever of these is missing on a fresh install.
33
+
21
34
  Or without installing:
22
35
 
23
36
  ```bash
@@ -40,8 +53,9 @@ engine cannot store dead-letter to
40
53
  `WICKED_APPS_EMIT_DEADLETTER` is honoured), are counted on
41
54
  `GET /api/v1/diagnostics` → `governance` (a `governance.deadletter` finding), and are drained back
42
55
  with `wicked-crew governance replay <outbox>`. The interactive document bridge is spawned on demand
43
- as `npx wicked-interactive@^0.12.0` (0.12.0: export asset reads confined to the document's own and
44
- approved roots); `WICKED_INTERACTIVE_SPEC` overrides the range (semver range
56
+ as `npx wicked-interactive@^0.15.0` (0.15.0 lands a chat-made draft only on the head it started from; 0.14.1
57
+ carries the demo import crew's demo runs use; 0.12.0
58
+ confined export asset reads to the document's own and approved roots); `WICKED_INTERACTIVE_SPEC` overrides the range (semver range
45
59
  only, validated; invalid values are named on the boot line and ignored, a floor below crew's need
46
60
  is warned about).
47
61
 
@@ -60,16 +74,20 @@ curl -X POST http://127.0.0.1:7701/api/v1/runs \
60
74
  # 3. Watch it move through the workflow's phases; approve or reject at the gates.
61
75
  ```
62
76
 
63
- One run token moves through the workflow's phases with a gate between every one — e.g. for
64
- `feature`: clarify → design → build → adversarial-review → test → review. Each phase is executed
77
+ A launch of a preset workflow or a plan on a repository runs in **power mode** by default: a
78
+ workflow's `build` step is one orchestrator seat building the whole change in checkpointed turns, rigor is re-scored from the
79
+ actual diff, and the hand-off runs the review, security and QE steps that rigor calls for. Phased (`power: false`, or a launch power mode
80
+ cannot run, such as one with no repository), one run token moves through the workflow's phases with a gate between every one — e.g.
81
+ for `feature`: clarify → design → build → adversarial-review → test → review. Each phase is executed
65
82
  by a versioned skill on an assigned CLI worker; the gates decide, and every decision is audited.
66
83
 
67
84
  ## The governed-run model
68
85
 
69
86
  - **You own the workflow; the agent owns the work.** The orchestrator sequences phases and holds
70
87
  the gates; the agent does the coding inside a phase.
71
- - **Workflows are data.** `feature` / `bug` / `migration` ship built-in; new ones are drop-in JSON
72
- files, not code.
88
+ - **Workflows are data.** `feature`, `bug` and `migration` ship built-in, beside `domain-extraction`
89
+ (requirements), `mcp-server`, `editor-plugin`, `analyze` and others; new ones are drop-in JSON files,
90
+ not code.
73
91
  - **Gates are real, and they say what they checked.** A gated transition resolves
74
92
  **deny-dominates** on the layers that ran — a deterministic floor, repo checks, policies, an
75
93
  evaluator seat that reads cold evidence only — and a model may fail a gate, never solely approve
@@ -96,7 +114,7 @@ is a real answer about the gate, not an error); `?qeRun=<id>` pins the read to o
96
114
  ## CLI
97
115
 
98
116
  ```
99
- wicked-crew serve|start|resume|gate|status|mcp
117
+ wicked-crew serve|start|resume|gate|status|mcp|governance|version
100
118
  ```
101
119
 
102
120
  | command | what it does |
@@ -107,6 +125,8 @@ wicked-crew serve|start|resume|gate|status|mcp
107
125
  | `gate` | answer a pending human gate from the terminal |
108
126
  | `status` | inspect run state |
109
127
  | `mcp` | stdio MCP server — crew-as-a-tool for coding agents |
128
+ | `governance` | `governance replay <outbox>` drains governance events the engine could not store |
129
+ | `version` | the versions of this install (wicked-crew, wicked-core-ts, the bundled studio) |
110
130
 
111
131
  ## Links
112
132
 
@@ -0,0 +1,64 @@
1
+ /**
2
+ * What a chat seat is told about the artifact the person has open (DES-CHAT-ARTIFACTS-001 §5.1): its title, an outline
3
+ * by slide or section (so "what does slide 4 say?" has a numbered answer even before the seat opens the copy), and the
4
+ * text of each part the person selected, by `data-wid`.
5
+ *
6
+ * A small tolerant tokenizer, not a browser: the documents are interactive's own HTML (`<section class="wi-slide"
7
+ * data-slide-id=… data-wid=…>`, speaker notes in `<aside class="notes">`), and the result is only ever DATA handed to
8
+ * a seat, so a malformed document yields a rougher outline, never a crash. Scripts, styles, templates and comments are
9
+ * dropped before anything is read; nothing is evaluated.
10
+ */
11
+ export interface HtmlNode {
12
+ tag: string;
13
+ attrs: Record<string, string>;
14
+ children: Array<HtmlNode | string>;
15
+ parent: HtmlNode | null;
16
+ }
17
+ export declare function decodeEntities(s: string): string;
18
+ /**
19
+ * `html` without comments and raw-text bodies (scripts, styles, templates, noscript, svg), in one forward pass over the
20
+ * document as written (a lower-cased copy can differ in length: `İ` lower-cases to two units). An opening's own `>` is
21
+ * found with its quoted attributes; only an `<svg … />` closes itself (a `<script />` does not, as in HTML); an `svg`
22
+ * or `template` nests, so its close is the one that matches it; a raw block ends only at its own close tag, never a
23
+ * longer name (`</scriptlet>`). An opening that is never closed drops the rest of the document.
24
+ */
25
+ export declare function stripRaw(html: string): string;
26
+ /** Parse `html` into a loose tree. Unmatched closing tags are ignored; a close pops to its nearest open ancestor. */
27
+ export declare function parseHtml(html: string): HtmlNode;
28
+ /** The node's text, words separated at block boundaries, whitespace collapsed. `skip` drops matching subtrees. */
29
+ export declare function textOf(node: HtmlNode, skip?: (n: HtmlNode) => boolean): string;
30
+ export declare function findAll(node: HtmlNode, pred: (n: HtmlNode) => boolean, opts?: {
31
+ descendIntoMatches?: boolean;
32
+ }): HtmlNode[];
33
+ export interface OutlineItem {
34
+ /** 1-based place in the document. */
35
+ n: number;
36
+ /** "slide" for a deck's slides, "section" otherwise, "heading" for a document with neither. */
37
+ unit: 'slide' | 'section' | 'heading';
38
+ wid: string | null;
39
+ slideId: string | null;
40
+ text: string;
41
+ notes: string | null;
42
+ }
43
+ export interface ArtifactOutline {
44
+ title: string | null;
45
+ items: OutlineItem[];
46
+ /** Items past the cap were left out. */
47
+ more: number;
48
+ }
49
+ /** The outline: a deck's slides, else top-level `data-wid` sections, else its h1–h3 headings. */
50
+ export declare function outlineOf(html: string, opts?: {
51
+ maxItems?: number;
52
+ itemChars?: number;
53
+ }): ArtifactOutline;
54
+ export interface AnchorText {
55
+ wid: string;
56
+ found: boolean;
57
+ /** The slide (1-based) the part sits on, for a deck. */
58
+ slide: number | null;
59
+ tag: string | null;
60
+ text: string;
61
+ }
62
+ /** The text of each selected part, by `data-wid`, with the slide it sits on. */
63
+ export declare function anchorTexts(html: string, wids: readonly string[], itemChars?: number): AnchorText[];
64
+ //# sourceMappingURL=artifact-outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-outline.d.ts","sourceRoot":"","sources":["../../src/api/artifact-outline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;CACzB;AASD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhD;AAgBD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsD7C;AAED,qHAAqH;AACrH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAqChD;AAED,kHAAkH;AAClH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,GAAG,MAAM,CAe9E;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,EAAE,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,QAAQ,EAAE,CAc/H;AAmBD,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,+FAA+F;IAC/F,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,CA+B7G;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,SAAM,GAAG,UAAU,EAAE,CAgBhG"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * What a chat seat is told about the artifact the person has open (DES-CHAT-ARTIFACTS-001 §5.1): its title, an outline
3
+ * by slide or section (so "what does slide 4 say?" has a numbered answer even before the seat opens the copy), and the
4
+ * text of each part the person selected, by `data-wid`.
5
+ *
6
+ * A small tolerant tokenizer, not a browser: the documents are interactive's own HTML (`<section class="wi-slide"
7
+ * data-slide-id=… data-wid=…>`, speaker notes in `<aside class="notes">`), and the result is only ever DATA handed to
8
+ * a seat, so a malformed document yields a rougher outline, never a crash. Scripts, styles, templates and comments are
9
+ * dropped before anything is read; nothing is evaluated.
10
+ */
11
+ /** The deepest a parsed tree nests. */
12
+ const MAX_DEPTH = 256;
13
+ const VOID = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
14
+ /** Elements that separate words when their text is joined. */
15
+ const BLOCK = /^(address|article|aside|blockquote|br|dd|div|dl|dt|figcaption|figure|footer|h[1-6]|header|hr|li|main|nav|ol|p|pre|section|table|tbody|td|tfoot|th|thead|tr|ul)$/;
16
+ const ENTITIES = {
17
+ amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', rarr: '→', larr: '←', harr: '↔', uarr: '↑', darr: '↓',
18
+ mdash: '—', ndash: '–', hellip: '…', lsquo: '‘', rsquo: '’', ldquo: '“', rdquo: '”', middot: '·', bull: '•',
19
+ times: '×', divide: '÷', plusmn: '±', le: '≤', ge: '≥', ne: '≠', deg: '°', copy: '©', reg: '®', trade: '™',
20
+ laquo: '«', raquo: '»', euro: '€', pound: '£', check: '✓', cross: '✗',
21
+ };
22
+ export function decodeEntities(s) {
23
+ return s.replace(/&(#x[0-9a-f]{1,6}|#[0-9]{1,7}|[a-z]{2,8});/gi, (m, name) => {
24
+ if (name[0] === '#') {
25
+ const code = name[1] === 'x' || name[1] === 'X' ? Number.parseInt(name.slice(2), 16) : Number.parseInt(name.slice(1), 10);
26
+ return Number.isFinite(code) && code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : m;
27
+ }
28
+ return ENTITIES[name.toLowerCase()] ?? m;
29
+ });
30
+ }
31
+ function parseAttrs(raw) {
32
+ // No prototype: an attribute named `constructor` or `toString` is an attribute like any other.
33
+ const attrs = Object.create(null);
34
+ for (const m of raw.matchAll(/([^\s"'>/=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g)) {
35
+ const name = m[1].toLowerCase();
36
+ if (!Object.hasOwn(attrs, name))
37
+ attrs[name] = decodeEntities(m[2] ?? m[3] ?? m[4] ?? '');
38
+ }
39
+ return attrs;
40
+ }
41
+ /** A tag's attribute run: unquoted characters up to the next `<` or `>`, or quoted values (which may hold `<`, `>` or
42
+ * `/>`) of bounded length, so a scan from one opening never runs past a few KiB without a decision. */
43
+ const ATTRS = `(?:[^<>"']|"[^"]{0,4096}"|'[^']{0,4096}')*`;
44
+ /**
45
+ * `html` without comments and raw-text bodies (scripts, styles, templates, noscript, svg), in one forward pass over the
46
+ * document as written (a lower-cased copy can differ in length: `İ` lower-cases to two units). An opening's own `>` is
47
+ * found with its quoted attributes; only an `<svg … />` closes itself (a `<script />` does not, as in HTML); an `svg`
48
+ * or `template` nests, so its close is the one that matches it; a raw block ends only at its own close tag, never a
49
+ * longer name (`</scriptlet>`). An opening that is never closed drops the rest of the document.
50
+ */
51
+ export function stripRaw(html) {
52
+ const out = [];
53
+ // Ordinary tags are matched too (and copied as they are), so `<template>` or `<!--` inside a quoted attribute value of
54
+ // an ordinary element is stepped over with that element, never taken for an opening.
55
+ const open = new RegExp(`<!--|<(script|style|template|noscript|svg)(?=[\\s>/])(${ATTRS})>|</?[a-zA-Z][\\w:-]*(?![\\w:-])${ATTRS}>`, 'gi');
56
+ let from = 0;
57
+ for (;;) {
58
+ open.lastIndex = from;
59
+ const m = open.exec(html);
60
+ if (m === null)
61
+ break;
62
+ if (m[1] === undefined && !m[0].startsWith('<!--')) {
63
+ // An ordinary tag: kept, attributes and all.
64
+ out.push(html.slice(from, m.index + m[0].length));
65
+ from = m.index + m[0].length;
66
+ continue;
67
+ }
68
+ out.push(html.slice(from, m.index));
69
+ if (m[1] === undefined) {
70
+ const end = html.indexOf('-->', m.index + 4);
71
+ if (end === -1)
72
+ return out.join('');
73
+ from = end + 3;
74
+ continue;
75
+ }
76
+ const tag = m[1].toLowerCase();
77
+ const nests = tag === 'svg' || tag === 'template';
78
+ if (tag === 'svg' && /\/\s*$/.test(m[2] ?? '')) {
79
+ from = m.index + m[0].length;
80
+ continue;
81
+ }
82
+ // A comment inside an svg or a template is stepped over whole: a tag in it changes no depth. A script's or a
83
+ // style's body is raw text, where `<!--` is just characters: only its own close tag ends it.
84
+ const edge = new RegExp(`${nests ? '<!--|' : ''}<(/?)${tag}(?=[\\s>/])(${ATTRS})>`, 'gi');
85
+ edge.lastIndex = m.index + m[0].length;
86
+ let depth = 1;
87
+ let closedAt = -1;
88
+ for (let e = edge.exec(html); e !== null; e = edge.exec(html)) {
89
+ if (e[0] === '<!--') {
90
+ const end = html.indexOf('-->', e.index + 4);
91
+ if (end === -1)
92
+ break;
93
+ edge.lastIndex = end + 3;
94
+ continue;
95
+ }
96
+ if (e[1] === '/')
97
+ depth -= 1;
98
+ else if (nests && !(tag === 'svg' && /\/\s*$/.test(e[2] ?? '')))
99
+ depth += 1;
100
+ if (depth === 0) {
101
+ closedAt = e.index + e[0].length;
102
+ break;
103
+ }
104
+ }
105
+ if (closedAt === -1)
106
+ return out.join('');
107
+ from = closedAt;
108
+ }
109
+ out.push(html.slice(from));
110
+ return out.join('');
111
+ }
112
+ /** Parse `html` into a loose tree. Unmatched closing tags are ignored; a close pops to its nearest open ancestor. */
113
+ export function parseHtml(html) {
114
+ const root = { tag: '#root', attrs: {}, children: [], parent: null };
115
+ let cur = root;
116
+ let depth = 0;
117
+ const src = stripRaw(html);
118
+ // Linear by construction: the tag name ends where name characters end (the lookahead stops it giving characters
119
+ // back to the attribute run), the unquoted attribute run stops at the next `<`, and a quoted value is bounded. A tag
120
+ // that never closes costs at most a few KiB of scanning, never the rest of the document.
121
+ for (const m of src.matchAll(new RegExp(`<(\\/?)([a-zA-Z][\\w:-]*)(?![\\w:-])(${ATTRS})>|([^<]+)|<`, 'g'))) {
122
+ if (m[4] !== undefined) {
123
+ cur.children.push(decodeEntities(m[4]));
124
+ continue;
125
+ }
126
+ if (m[2] === undefined)
127
+ continue; // a stray '<'
128
+ const tag = m[2].toLowerCase();
129
+ if (m[1] === '/') {
130
+ let up = 1;
131
+ for (let n = cur; n !== null && n !== root; n = n.parent, up += 1) {
132
+ if (n.tag === tag) {
133
+ cur = n.parent ?? root;
134
+ depth -= up;
135
+ break;
136
+ }
137
+ }
138
+ continue;
139
+ }
140
+ const rawAttrs = m[3] ?? '';
141
+ const node = { tag, attrs: parseAttrs(rawAttrs.replace(/\/\s*$/, '')), children: [], parent: cur };
142
+ cur.children.push(node);
143
+ // Nesting is capped: past MAX_DEPTH an opening becomes a sibling, so a close's ancestor search and every
144
+ // recursive walk stay bounded on a document of unclosed tags.
145
+ if (!VOID.has(tag) && !/\/\s*$/.test(rawAttrs) && depth < MAX_DEPTH) {
146
+ cur = node;
147
+ depth += 1;
148
+ }
149
+ }
150
+ return root;
151
+ }
152
+ /** The node's text, words separated at block boundaries, whitespace collapsed. `skip` drops matching subtrees. */
153
+ export function textOf(node, skip) {
154
+ const parts = [];
155
+ const walk = (n) => {
156
+ for (const c of n.children) {
157
+ if (typeof c === 'string')
158
+ parts.push(c);
159
+ else if (skip === undefined || !skip(c)) {
160
+ const block = BLOCK.test(c.tag);
161
+ if (block)
162
+ parts.push(' ');
163
+ walk(c);
164
+ if (block)
165
+ parts.push(' ');
166
+ }
167
+ }
168
+ };
169
+ walk(node);
170
+ return parts.join('').replace(/\s+/g, ' ').trim();
171
+ }
172
+ export function findAll(node, pred, opts = {}) {
173
+ const out = [];
174
+ const walk = (n) => {
175
+ for (const c of n.children) {
176
+ if (typeof c === 'string')
177
+ continue;
178
+ if (pred(c)) {
179
+ out.push(c);
180
+ if (opts.descendIntoMatches !== true)
181
+ continue;
182
+ }
183
+ walk(c);
184
+ }
185
+ };
186
+ walk(node);
187
+ return out;
188
+ }
189
+ function hasClass(n, cls) {
190
+ return (n.attrs['class'] ?? '').split(/\s+/).includes(cls);
191
+ }
192
+ const ID = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/;
193
+ function idOrNull(v) {
194
+ return v !== undefined && ID.test(v) ? v : null;
195
+ }
196
+ const isSlide = (n) => n.tag === 'section' && (hasClass(n, 'wi-slide') || 'data-slide-id' in n.attrs);
197
+ const isNotes = (n) => n.tag === 'aside' && (hasClass(n, 'notes') || 'data-notes-for' in n.attrs);
198
+ /** Cut `s` at `cap` characters with an ellipsis. */
199
+ function cap(s, n) {
200
+ return s.length > n ? `${s.slice(0, n - 1).trimEnd()}…` : s;
201
+ }
202
+ /** The outline: a deck's slides, else top-level `data-wid` sections, else its h1–h3 headings. */
203
+ export function outlineOf(html, opts = {}) {
204
+ const maxItems = opts.maxItems ?? 40;
205
+ const itemChars = opts.itemChars ?? 400;
206
+ const root = parseHtml(html);
207
+ const titleNode = findAll(root, (n) => n.tag === 'title')[0];
208
+ const h1 = findAll(root, (n) => n.tag === 'h1')[0];
209
+ const title = titleNode !== undefined && textOf(titleNode) !== '' ? textOf(titleNode) : h1 !== undefined ? textOf(h1) : null;
210
+ let nodes = findAll(root, isSlide);
211
+ let unit = 'slide';
212
+ if (nodes.length === 0) {
213
+ nodes = findAll(root, (n) => n.tag === 'section' && /^section-\d+$/.test(n.attrs['data-wid'] ?? ''));
214
+ unit = 'section';
215
+ }
216
+ if (nodes.length === 0) {
217
+ nodes = findAll(root, (n) => /^h[1-3]$/.test(n.tag));
218
+ unit = 'heading';
219
+ }
220
+ const items = nodes.slice(0, maxItems).map((node, i) => {
221
+ const notesNodes = findAll(node, isNotes);
222
+ const notes = notesNodes.map((x) => textOf(x)).filter((t) => t !== '').join(' ');
223
+ return {
224
+ n: i + 1,
225
+ unit,
226
+ // Ids from the document are data too: only one that is an id is shown, never a value that carries text.
227
+ wid: idOrNull(node.attrs['data-wid']),
228
+ slideId: idOrNull(node.attrs['data-slide-id']),
229
+ text: cap(textOf(node, isNotes), itemChars),
230
+ notes: notes === '' ? null : cap(notes, itemChars),
231
+ };
232
+ });
233
+ return { title: title === null ? null : cap(title, 200), items, more: Math.max(0, nodes.length - maxItems) };
234
+ }
235
+ /** The text of each selected part, by `data-wid`, with the slide it sits on. */
236
+ export function anchorTexts(html, wids, itemChars = 600) {
237
+ const root = parseHtml(html);
238
+ const slides = findAll(root, isSlide);
239
+ return wids.map((wid) => {
240
+ const node = findAll(root, (n) => n.attrs['data-wid'] === wid, { descendIntoMatches: true })[0];
241
+ if (node === undefined)
242
+ return { wid, found: false, slide: null, tag: null, text: '' };
243
+ let slide = null;
244
+ for (let p = node; p !== null; p = p.parent) {
245
+ const at = slides.indexOf(p);
246
+ if (at !== -1) {
247
+ slide = at + 1;
248
+ break;
249
+ }
250
+ }
251
+ return { wid, found: true, slide, tag: node.tag, text: cap(textOf(node), itemChars) };
252
+ });
253
+ }
254
+ //# sourceMappingURL=artifact-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-outline.js","sourceRoot":"","sources":["../../src/api/artifact-outline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * OPEN BENEATH A ROOT, FOLLOWING NO LINK BELOW IT (crew#1274; DES-CHAT-ARTIFACTS-001 §5.3 containment).
3
+ *
4
+ * The chat's per-turn block reads and writes under directories a run or a seat can change: a run's evidence root, the
5
+ * chat's scratch root (the seat's own working directory), and a project's docs root. Checking a path (`realpath`,
6
+ * `lstat`) and then opening it is a race: `O_NOFOLLOW` covers only the last component, so an ancestor directory
7
+ * swapped for a link between the check and the open sends the open outside the root. Node has no `openat`, so this
8
+ * module opens with the platform's own guarantee instead of a check:
9
+ *
10
+ * - macOS: `O_NOFOLLOW_ANY` (Darwin ≥ 20): the open fails with ELOOP if ANY component of the path is a link. The
11
+ * root is passed as its real path (no link in it by construction), so the guarantee covers exactly the components
12
+ * below it.
13
+ * - Linux: a descriptor walk: the root is opened as a directory, then each component is opened through the magic
14
+ * link `/proc/self/fd/<dir>/<name>` with `O_NOFOLLOW` — the kernel resolves the magic link to the directory the
15
+ * descriptor holds (never a path re-read), so this is `openat(dir, name, O_NOFOLLOW)`.
16
+ * - Anywhere else (Windows): refused, with the reason. A brief or a copy is then simply not made there.
17
+ *
18
+ * The root itself is trusted: its ancestors belong to the daemon, and a run or a seat cannot rename the root (it can
19
+ * write only inside it). Every component below it is checked on every open, by the kernel.
20
+ *
21
+ * Listing a directory is by IDENTITY, never by a path that could be re-resolved: the directory is first opened beneath
22
+ * the root, then listed through what that descriptor holds — on Linux `/proc/self/fd/<n>`, on macOS
23
+ * `/.vol/<dev>/<ino>` (the volume file system's by-identity name; `/dev/fd/<n>` cannot be listed there). A folder
24
+ * swapped for a link after it was opened still lists as the folder that was opened; a file system without `/.vol`
25
+ * refuses the listing.
26
+ */
27
+ import { type Stats } from 'node:fs';
28
+ export type BeneathMode = 'darwin' | 'procfd' | 'unsupported';
29
+ /** How this platform opens beneath a root. */
30
+ export declare function beneathMode(): BeneathMode;
31
+ /** Test seams: called with the absolute path just before an open beneath a root (with its flags), and just before a
32
+ * directory opened beneath a root is listed. */
33
+ export declare const beneathTestHooks: {
34
+ beforeOpen?: (absPath: string, flags: number) => void;
35
+ beforeList?: (absPath: string) => void;
36
+ mode?: BeneathMode;
37
+ };
38
+ export declare class BeneathError extends Error {
39
+ readonly code: string;
40
+ constructor(code: string, message: string);
41
+ }
42
+ export interface OpenBeneathOptions {
43
+ /** Open flags for the leaf (`O_RDONLY` by default). No link is followed at the leaf either way. */
44
+ flags?: number;
45
+ /** The mode a created file gets. */
46
+ mode?: number;
47
+ }
48
+ /**
49
+ * Open `rel` beneath the real directory `root`, following no link at or below it. Throws the open's own error (its
50
+ * `code`: ELOOP for a link anywhere below the root, ENOENT, ENOTDIR, EEXIST…) or a {@link BeneathError}.
51
+ */
52
+ export declare function openBeneath(root: string, rel: string, opts?: OpenBeneathOptions): number;
53
+ /** Read the regular file `rel` beneath `root`, at most `max` bytes (over = refused, never cut), non-blocking (a FIFO
54
+ * is refused, not waited on). Returns the bytes and the file's stats from the same descriptor. */
55
+ export declare function readBeneath(root: string, rel: string, max: number): {
56
+ data: Buffer;
57
+ st: Stats;
58
+ };
59
+ /** What `rel` beneath `root` is (a regular file, a directory, something else), by its own descriptor; `null` if absent. */
60
+ export declare function statBeneath(root: string, rel: string): Stats | null;
61
+ /** Create the file `rel` beneath `root` exclusively (never through a link, never over an existing entry) with `data`. */
62
+ export declare function createBeneath(root: string, rel: string, data: Buffer, mode: number): void;
63
+ /**
64
+ * Make the directory `name` directly beneath `root` (one component: the root's own entry) and prove it is a real
65
+ * directory, not a link, by opening it beneath the root.
66
+ */
67
+ export declare function mkdirBeneath(root: string, name: string, mode?: number): void;
68
+ /**
69
+ * The names in the directory `rel` beneath `root` (`''` = the root itself, trusted), at most `max`, listed by the
70
+ * identity of the directory opened beneath the root (see the module doc). `null` when it cannot be listed.
71
+ */
72
+ export declare function listBeneath(root: string, rel: string, max: number): {
73
+ names: string[];
74
+ more: boolean;
75
+ } | null;
76
+ //# sourceMappingURL=beneath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beneath.d.ts","sourceRoot":"","sources":["../../src/api/beneath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAqH,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAMxJ,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;AAG9D,8CAA8C;AAC9C,wBAAgB,WAAW,IAAI,WAAW,CAIzC;AAED;iDACiD;AACjD,eAAO,MAAM,gBAAgB,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,CAAC;AAE1J,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGnD;AAYD,MAAM,WAAW,kBAAkB;IACjC,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,MAAM,CAgC5F;AAED;mGACmG;AACnG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAiB/F;AAED,2HAA2H;AAC3H,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAanE;AAED,yHAAyH;AACzH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQzF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAQ,GAAG,IAAI,CAU3E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAgC7G"}