@north-light/crouter 0.3.318 → 0.3.320

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 (1304) hide show
  1. package/README.md +0 -3
  2. package/dist/api/client.js +2 -912
  3. package/dist/api/dto/attach.js +0 -13
  4. package/dist/api/dto/bash-jobs.js +1 -9
  5. package/dist/api/dto/broker-ops.js +0 -6
  6. package/dist/api/dto/broker.js +0 -20
  7. package/dist/api/dto/canvas.js +0 -2
  8. package/dist/api/dto/chat-inventory.js +0 -11
  9. package/dist/api/dto/common.js +1 -15
  10. package/dist/api/dto/config.js +0 -3
  11. package/dist/api/dto/crons.js +1 -10
  12. package/dist/api/dto/files.js +0 -7
  13. package/dist/api/dto/focus.js +0 -10
  14. package/dist/api/dto/health.js +0 -2
  15. package/dist/api/dto/human-requests.js +0 -4
  16. package/dist/api/dto/human.js +0 -4
  17. package/dist/api/dto/inbox.js +0 -4
  18. package/dist/api/dto/lifecycle.js +0 -3
  19. package/dist/api/dto/mail.js +0 -1
  20. package/dist/api/dto/memory.js +0 -6
  21. package/dist/api/dto/messages.js +0 -2
  22. package/dist/api/dto/model-config.js +0 -1
  23. package/dist/api/dto/modelauth.js +0 -4
  24. package/dist/api/dto/node-outcomes.js +0 -2
  25. package/dist/api/dto/nodes.js +0 -3
  26. package/dist/api/dto/profiles.js +1 -4
  27. package/dist/api/dto/recovery.js +0 -1
  28. package/dist/api/dto/reports.js +0 -2
  29. package/dist/api/dto/review-comments.js +0 -5
  30. package/dist/api/dto/reviews.js +0 -5
  31. package/dist/api/dto/subscriptions.js +0 -2
  32. package/dist/api/dto/worktree.js +0 -6
  33. package/dist/api/errors.js +1 -40
  34. package/dist/api/index.js +1 -33
  35. package/dist/api/plugin-manifest-schema.js +0 -23
  36. package/dist/api/routes.js +1 -147
  37. package/dist/build-root.js +1 -198
  38. package/dist/cli.js +3 -99
  39. package/dist/clients/attach/ansi-cells.js +1 -137
  40. package/dist/clients/attach/chrome/bash-jobs.js +1 -31
  41. package/dist/clients/attach/chrome/canvas-panels.js +1 -194
  42. package/dist/clients/attach/chrome/completion-bell.js +1 -89
  43. package/dist/clients/attach/chrome/cron-wait.js +1 -34
  44. package/dist/clients/attach/chrome/git-info.js +2 -44
  45. package/dist/clients/attach/chrome/header.js +1 -30
  46. package/dist/clients/attach/chrome/inbox-strip.js +1 -199
  47. package/dist/clients/attach/chrome/recap.js +1 -19
  48. package/dist/clients/attach/chrome/review-wait.js +1 -22
  49. package/dist/clients/attach/chrome/roster.js +4 -275
  50. package/dist/clients/attach/chrome/status-line.js +1 -117
  51. package/dist/clients/attach/chrome/ticket-panel.js +1 -280
  52. package/dist/clients/attach/chrome/widgets.js +1 -51
  53. package/dist/clients/attach/command.js +1 -107
  54. package/dist/clients/attach/config.js +1 -274
  55. package/dist/clients/attach/input/capabilities.js +1 -104
  56. package/dist/clients/attach/input/clipboard-image.js +3 -220
  57. package/dist/clients/attach/input/completion-frecency.js +1 -141
  58. package/dist/clients/attach/input/controller.js +7 -377
  59. package/dist/clients/attach/input/overlay-owner.js +1 -199
  60. package/dist/clients/attach/input/ref-autocomplete.js +2 -176
  61. package/dist/clients/attach/input/titled-editor.js +4 -859
  62. package/dist/clients/attach/overlays/auth.js +2 -271
  63. package/dist/clients/attach/overlays/dialogs.js +2 -102
  64. package/dist/clients/attach/overlays/file-review.js +2 -128
  65. package/dist/clients/attach/overlays/graph.js +1 -661
  66. package/dist/clients/attach/overlays/help.js +1 -211
  67. package/dist/clients/attach/overlays/mcp.js +1 -302
  68. package/dist/clients/attach/overlays/pickers.js +1 -163
  69. package/dist/clients/attach/render/activity-slot.js +1 -13
  70. package/dist/clients/attach/render/assistant-message.js +1 -56
  71. package/dist/clients/attach/render/card-presentation.js +5 -218
  72. package/dist/clients/attach/render/chat-view.js +5 -1708
  73. package/dist/clients/attach/render/condensed-history.js +1 -60
  74. package/dist/clients/attach/render/context-message.js +1 -63
  75. package/dist/clients/attach/render/crtr-output.js +17 -905
  76. package/dist/clients/attach/render/diagram.js +7 -111
  77. package/dist/clients/attach/render/edit-diff.js +5 -304
  78. package/dist/clients/attach/render/glyph-codepoints.js +1 -42
  79. package/dist/clients/attach/render/group-activity.js +2 -263
  80. package/dist/clients/attach/render/group-recap.js +1 -152
  81. package/dist/clients/attach/render/markdown-source.js +5 -266
  82. package/dist/clients/attach/render/measured-container.js +1 -322
  83. package/dist/clients/attach/render/page-block.js +1 -183
  84. package/dist/clients/attach/render/scroll-animation.js +1 -80
  85. package/dist/clients/attach/render/tool-calls.js +3 -361
  86. package/dist/clients/attach/render/transcript-copy.js +2 -81
  87. package/dist/clients/attach/render/transcript-search.js +1 -152
  88. package/dist/clients/attach/render/viewport.js +1 -184
  89. package/dist/clients/attach/session/banner.js +1 -29
  90. package/dist/clients/attach/session/bindings.js +1 -71
  91. package/dist/clients/attach/session/chrome-refresh.js +1 -94
  92. package/dist/clients/attach/session/connection.js +1 -186
  93. package/dist/clients/attach/session/context.js +0 -16
  94. package/dist/clients/attach/session/editor-frame.js +1 -142
  95. package/dist/clients/attach/session/editor-inventory.js +6 -160
  96. package/dist/clients/attach/session/file-links.js +1 -68
  97. package/dist/clients/attach/session/focus-events.js +1 -12
  98. package/dist/clients/attach/session/frame.js +1 -214
  99. package/dist/clients/attach/session/frames.js +1 -188
  100. package/dist/clients/attach/session/identity.js +1 -26
  101. package/dist/clients/attach/session/input-wiring.js +1 -140
  102. package/dist/clients/attach/session/invariant.js +1 -15
  103. package/dist/clients/attach/session/keys.js +1 -77
  104. package/dist/clients/attach/session/layout.js +1 -59
  105. package/dist/clients/attach/session/mouse.js +1 -78
  106. package/dist/clients/attach/session/pane-focus.js +1 -42
  107. package/dist/clients/attach/session/pane-tag.js +1 -112
  108. package/dist/clients/attach/session/pi-assets.js +1 -24
  109. package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
  110. package/dist/clients/attach/session/profile-files.js +1 -228
  111. package/dist/clients/attach/session/reconnect.js +1 -175
  112. package/dist/clients/attach/session/selection.js +3 -108
  113. package/dist/clients/attach/session/state-sync.js +1 -67
  114. package/dist/clients/attach/session/surface-frame.js +1 -73
  115. package/dist/clients/attach/session/surface-host.js +1 -255
  116. package/dist/clients/attach/session/teardown.js +5 -94
  117. package/dist/clients/attach/session/transcript-search.js +3 -151
  118. package/dist/clients/attach/session/whip-achievements.js +2 -145
  119. package/dist/clients/attach/session/whip.js +1 -362
  120. package/dist/clients/attach/slash/dispatch.js +1 -706
  121. package/dist/clients/attach/slash/prompt-preview.js +1 -121
  122. package/dist/clients/attach/viewer.js +441 -441
  123. package/dist/clients/conversation/projection.js +1 -324
  124. package/dist/clients/conversation/submit.js +1 -51
  125. package/dist/clients/inbox/controller.js +1 -701
  126. package/dist/clients/inbox/dto-adapt.js +1 -93
  127. package/dist/clients/inbox/layout.js +1 -9
  128. package/dist/clients/inbox/page-adapter.js +1 -55
  129. package/dist/clients/inbox/resolve.js +1 -35
  130. package/dist/clients/inbox/review/anchors.js +1 -89
  131. package/dist/clients/inbox/review/comments-client.js +1 -98
  132. package/dist/clients/inbox/review/companion-pane.js +1 -82
  133. package/dist/clients/inbox/review/document-surface.js +2 -1188
  134. package/dist/clients/inbox/review/frame.js +1 -216
  135. package/dist/clients/inbox/review/keys.js +1 -123
  136. package/dist/clients/inbox/review/launch.js +1 -151
  137. package/dist/clients/inbox/review/live-source.js +1 -160
  138. package/dist/clients/inbox/review/nvim.js +1 -44
  139. package/dist/clients/inbox/review/remap.js +1 -157
  140. package/dist/clients/inbox/review/review-client.js +1 -123
  141. package/dist/clients/inbox/review/roundtrip.js +3 -36
  142. package/dist/clients/inbox/review/state.js +4 -315
  143. package/dist/clients/inbox/review-adapter.js +1 -43
  144. package/dist/clients/inbox/surface.js +1 -152
  145. package/dist/clients/inbox/tui/ansi.js +3 -321
  146. package/dist/clients/inbox/tui/input.js +5 -392
  147. package/dist/clients/inbox/tui/keys.js +1 -104
  148. package/dist/clients/inbox/tui/page-body.js +1 -66
  149. package/dist/clients/inbox/tui/panel.js +1 -84
  150. package/dist/clients/inbox/tui/render.js +2 -368
  151. package/dist/clients/inbox/tui/slots.js +3 -134
  152. package/dist/clients/inbox/tui/types.js +0 -1
  153. package/dist/clients/inbox/tui.js +1 -86
  154. package/dist/clients/surfaces/host.js +0 -1
  155. package/dist/commands/api-client.js +4 -290
  156. package/dist/commands/attention.js +1 -215
  157. package/dist/commands/canvas-browse.js +1 -70
  158. package/dist/commands/canvas-config.js +2 -192
  159. package/dist/commands/canvas-history/grep.js +7 -85
  160. package/dist/commands/canvas-history/read.js +3 -50
  161. package/dist/commands/canvas-history/search.js +10 -99
  162. package/dist/commands/canvas-history/shared.js +1 -139
  163. package/dist/commands/canvas-history/stats.js +6 -68
  164. package/dist/commands/canvas-history.js +1 -32
  165. package/dist/commands/canvas-issue.js +14 -149
  166. package/dist/commands/canvas-prune.js +1 -108
  167. package/dist/commands/canvas-roster.js +1 -69
  168. package/dist/commands/canvas-snapshot.js +1 -34
  169. package/dist/commands/canvas-use.js +1 -61
  170. package/dist/commands/canvas.js +1 -49
  171. package/dist/commands/chord.js +1 -241
  172. package/dist/commands/cron.js +11 -534
  173. package/dist/commands/dashboard.js +1 -85
  174. package/dist/commands/human/components.js +3 -77
  175. package/dist/commands/human/feedback.js +1 -112
  176. package/dist/commands/human/prompts.js +1 -331
  177. package/dist/commands/human/queue.js +1 -191
  178. package/dist/commands/human/request.js +1 -266
  179. package/dist/commands/human/review.js +1 -288
  180. package/dist/commands/human/shared.js +1 -67
  181. package/dist/commands/human.js +4 -60
  182. package/dist/commands/memory/delete.js +1 -100
  183. package/dist/commands/memory/edit.js +21 -219
  184. package/dist/commands/memory/find.js +2 -244
  185. package/dist/commands/memory/history.js +5 -199
  186. package/dist/commands/memory/lint.js +1 -107
  187. package/dist/commands/memory/list.js +1 -142
  188. package/dist/commands/memory/move.js +1 -223
  189. package/dist/commands/memory/origin.js +1 -130
  190. package/dist/commands/memory/read.js +6 -232
  191. package/dist/commands/memory/shared.js +12 -802
  192. package/dist/commands/memory/write.js +13 -235
  193. package/dist/commands/memory.js +1 -30
  194. package/dist/commands/node/bash.js +5 -245
  195. package/dist/commands/node/create.js +3 -332
  196. package/dist/commands/node/inspect.js +12 -300
  197. package/dist/commands/node/lifecycle.js +2 -453
  198. package/dist/commands/node/message.js +1 -161
  199. package/dist/commands/node/outcome.js +4 -134
  200. package/dist/commands/node/pyramid.js +2 -79
  201. package/dist/commands/node/subscription.js +1 -78
  202. package/dist/commands/node/wait.js +7 -163
  203. package/dist/commands/node-context.js +2 -159
  204. package/dist/commands/node-inspect-artifacts.js +8 -109
  205. package/dist/commands/node-lifecycle-revive.js +1 -217
  206. package/dist/commands/node-snapshot.js +1 -37
  207. package/dist/commands/node-transcript.js +1 -62
  208. package/dist/commands/node-worktree.js +1 -138
  209. package/dist/commands/node.js +1 -29
  210. package/dist/commands/pkg/browse/actions.js +1 -198
  211. package/dist/commands/pkg/browse/catalog.js +1 -466
  212. package/dist/commands/pkg/browse/command-view.js +1 -191
  213. package/dist/commands/pkg/browse/detail-panel.js +1 -402
  214. package/dist/commands/pkg/browse/doc-view.js +1 -89
  215. package/dist/commands/pkg/browse/list-panel.js +2 -168
  216. package/dist/commands/pkg/browse/model.js +1 -36
  217. package/dist/commands/pkg/browse/shell.js +1 -640
  218. package/dist/commands/pkg/browse.js +1 -27
  219. package/dist/commands/pkg/market-inspect.js +1 -141
  220. package/dist/commands/pkg/market-manage.js +1 -327
  221. package/dist/commands/pkg/market.js +1 -14
  222. package/dist/commands/pkg/plugin-inspect.js +1 -168
  223. package/dist/commands/pkg/plugin-manage.js +17 -1109
  224. package/dist/commands/pkg/plugin.js +1 -14
  225. package/dist/commands/pkg/shared.js +1 -62
  226. package/dist/commands/pkg.js +1 -21
  227. package/dist/commands/profile/default.js +1 -139
  228. package/dist/commands/profile/delete.js +1 -66
  229. package/dist/commands/profile/env.js +3 -188
  230. package/dist/commands/profile/kind.js +2 -35
  231. package/dist/commands/profile/list.js +1 -43
  232. package/dist/commands/profile/meta.js +1 -67
  233. package/dist/commands/profile/new.js +1 -115
  234. package/dist/commands/profile/pause.js +1 -59
  235. package/dist/commands/profile/project.js +1 -113
  236. package/dist/commands/profile/rename.js +1 -38
  237. package/dist/commands/profile/show.js +1 -52
  238. package/dist/commands/profile.js +1 -35
  239. package/dist/commands/push.js +9 -265
  240. package/dist/commands/revive.js +10 -181
  241. package/dist/commands/surface/node/cycle.js +1 -83
  242. package/dist/commands/surface/node/focus.js +1 -81
  243. package/dist/commands/surface/node/id.js +1 -38
  244. package/dist/commands/surface/node/pin.js +1 -42
  245. package/dist/commands/surface/node/placement.js +1 -134
  246. package/dist/commands/surface-edit.js +1 -157
  247. package/dist/commands/surface-inbox.js +1 -98
  248. package/dist/commands/surface-inspect.js +1 -39
  249. package/dist/commands/surface-node.js +1 -19
  250. package/dist/commands/surface-reload.js +2 -134
  251. package/dist/commands/surface-tmux-spread.js +1 -214
  252. package/dist/commands/surface.js +1 -28
  253. package/dist/commands/sys/branch.js +1 -19
  254. package/dist/commands/sys/config.js +1 -353
  255. package/dist/commands/sys/context/admin/actions.js +2 -246
  256. package/dist/commands/sys/context/admin/detail-panel.js +1 -247
  257. package/dist/commands/sys/context/admin/docs-panel.js +1 -191
  258. package/dist/commands/sys/context/admin/list-view.js +1 -183
  259. package/dist/commands/sys/context/admin/model.js +1 -229
  260. package/dist/commands/sys/context/admin/rail-panel.js +1 -227
  261. package/dist/commands/sys/context/admin/read-view.js +2 -194
  262. package/dist/commands/sys/context/admin/shell.js +1 -910
  263. package/dist/commands/sys/context/admin.js +2 -126
  264. package/dist/commands/sys/context/doc.js +3 -197
  265. package/dist/commands/sys/context/prompt-review.js +11 -291
  266. package/dist/commands/sys/context/resolve.js +10 -489
  267. package/dist/commands/sys/context/sysprompt.js +5 -96
  268. package/dist/commands/sys/context.js +1 -20
  269. package/dist/commands/sys/daemon.js +1 -313
  270. package/dist/commands/sys/doctor.js +1 -617
  271. package/dist/commands/sys/feedback.js +7 -228
  272. package/dist/commands/sys/logs.js +3 -129
  273. package/dist/commands/sys/migrate.js +1 -94
  274. package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
  275. package/dist/commands/sys/panels/dependencies-panel.js +1 -80
  276. package/dist/commands/sys/panels/keybindings-panel.js +1 -703
  277. package/dist/commands/sys/panels/models-panel.js +1 -1133
  278. package/dist/commands/sys/panels/plugins-panel.js +1 -80
  279. package/dist/commands/sys/panels/prefs-panel.js +1 -85
  280. package/dist/commands/sys/panels/profiles-panel.js +1 -601
  281. package/dist/commands/sys/panels/provider-panel.js +1 -538
  282. package/dist/commands/sys/settings-shell.js +1 -400
  283. package/dist/commands/sys/settings.js +1 -46
  284. package/dist/commands/sys/setup-core.js +6 -579
  285. package/dist/commands/sys/setup-settings-runner.js +1 -16
  286. package/dist/commands/sys/setup-wizard.js +1 -279
  287. package/dist/commands/sys/setup.js +1 -34
  288. package/dist/commands/sys/shared.js +1 -81
  289. package/dist/commands/sys/support/prepare.js +3 -239
  290. package/dist/commands/sys/support/submit.js +6 -524
  291. package/dist/commands/sys/support.js +1 -18
  292. package/dist/commands/sys/sync-deps.js +15 -498
  293. package/dist/commands/sys/sync-project-guidance.js +4 -481
  294. package/dist/commands/sys/sync-shared.js +1 -49
  295. package/dist/commands/sys/sync-skills.js +2 -311
  296. package/dist/commands/sys/sync.js +1 -18
  297. package/dist/commands/sys/update.js +1 -147
  298. package/dist/commands/sys/worktrees.js +5 -53
  299. package/dist/commands/sys.js +1 -18
  300. package/dist/core/activity-signal.js +2 -38
  301. package/dist/core/asset-root.js +1 -18
  302. package/dist/core/auth-file.js +2 -179
  303. package/dist/core/auth-interaction.js +3 -94
  304. package/dist/core/auto-update.js +4 -94
  305. package/dist/core/bash-guard.js +11 -393
  306. package/dist/core/bash-jobs.js +7 -411
  307. package/dist/core/bootstrap.js +2 -53
  308. package/dist/core/broker-client/client.js +1 -184
  309. package/dist/core/broker-client/index.js +1 -13
  310. package/dist/core/broker-client/transport-relay.js +1 -157
  311. package/dist/core/broker-client/transport-socket.js +1 -179
  312. package/dist/core/broker-client/transport.js +1 -26
  313. package/dist/core/canvas/attention.js +1 -47
  314. package/dist/core/canvas/boot-id.js +1 -26
  315. package/dist/core/canvas/boot.js +1 -186
  316. package/dist/core/canvas/browse/app.js +3 -919
  317. package/dist/core/canvas/browse/model.js +1 -477
  318. package/dist/core/canvas/browse/pins.js +1 -29
  319. package/dist/core/canvas/browse/render.js +3 -1055
  320. package/dist/core/canvas/canvas.js +15 -922
  321. package/dist/core/canvas/crons.js +11 -481
  322. package/dist/core/canvas/daemon-owner.js +2 -146
  323. package/dist/core/canvas/db.js +2 -100
  324. package/dist/core/canvas/deliveries.js +22 -283
  325. package/dist/core/canvas/delivery-contract.js +1 -8
  326. package/dist/core/canvas/executions.js +1 -68
  327. package/dist/core/canvas/extensions.js +1 -83
  328. package/dist/core/canvas/focuses.js +1 -77
  329. package/dist/core/canvas/history.js +24 -860
  330. package/dist/core/canvas/index.js +1 -15
  331. package/dist/core/canvas/install-id.js +1 -84
  332. package/dist/core/canvas/labels.js +1 -43
  333. package/dist/core/canvas/meta-file.js +1 -89
  334. package/dist/core/canvas/migrations.js +41 -1150
  335. package/dist/core/canvas/nav-model.js +1 -231
  336. package/dist/core/canvas/nav-render.js +1 -260
  337. package/dist/core/canvas/node-order.js +1 -37
  338. package/dist/core/canvas/node-recap.js +2 -67
  339. package/dist/core/canvas/node-sql-migration.js +2 -209
  340. package/dist/core/canvas/paths.js +1 -153
  341. package/dist/core/canvas/pid.js +4 -683
  342. package/dist/core/canvas/recovery.js +3 -565
  343. package/dist/core/canvas/remote-canvas-source.js +1 -288
  344. package/dist/core/canvas/remote-transport.js +1 -57
  345. package/dist/core/canvas/render-source.js +10 -635
  346. package/dist/core/canvas/sessions.js +1 -78
  347. package/dist/core/canvas/source.js +1 -47
  348. package/dist/core/canvas/status-glyph.js +1 -132
  349. package/dist/core/canvas/telemetry.js +1 -35
  350. package/dist/core/canvas/types.js +1 -6
  351. package/dist/core/canvas/waits.js +4 -68
  352. package/dist/core/canvas/worktrees.js +1 -93
  353. package/dist/core/clipboard-text.js +1 -57
  354. package/dist/core/command-hooks/artifact.js +1 -145
  355. package/dist/core/command-hooks/catalog.js +1 -38
  356. package/dist/core/command-hooks/compose.js +1 -99
  357. package/dist/core/command-hooks/discovery.js +1 -228
  358. package/dist/core/command-hooks/help.js +1 -18
  359. package/dist/core/command-hooks/index.js +1 -7
  360. package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
  361. package/dist/core/command-hooks/lifecycle-create.js +1 -51
  362. package/dist/core/command-hooks/report.js +1 -28
  363. package/dist/core/command-hooks/schema.js +1 -157
  364. package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
  365. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
  366. package/dist/core/command-manifests/manifest.js +1 -324
  367. package/dist/core/command-manifests/registry.js +1 -118
  368. package/dist/core/command-manifests/schema.js +1 -736
  369. package/dist/core/command-plugins/bundle.js +1 -261
  370. package/dist/core/command-plugins/compose.js +1 -65
  371. package/dist/core/command-plugins/discovery.js +1 -245
  372. package/dist/core/command-plugins/endpoint.js +1 -48
  373. package/dist/core/command-plugins/extensions.js +1 -166
  374. package/dist/core/command-plugins/help-addenda.js +1 -44
  375. package/dist/core/command-plugins/presence.js +1 -17
  376. package/dist/core/command-plugins/revalidate.js +2 -152
  377. package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
  378. package/dist/core/command-plugins/transport/http-fetch.js +1 -68
  379. package/dist/core/command-plugins/transport/http-invoke.js +3 -546
  380. package/dist/core/command.js +10 -739
  381. package/dist/core/config.js +1 -1059
  382. package/dist/core/document-lines.js +3 -6
  383. package/dist/core/env-name.js +1 -9
  384. package/dist/core/errors.js +1 -52
  385. package/dist/core/events/emit.js +1 -17
  386. package/dist/core/events/envelope.js +1 -84
  387. package/dist/core/events/errors.js +1 -69
  388. package/dist/core/events/index.js +1 -4
  389. package/dist/core/events/operation-id.js +1 -24
  390. package/dist/core/events/read.js +1 -623
  391. package/dist/core/events/serialize.js +1 -199
  392. package/dist/core/events/source.js +1 -31
  393. package/dist/core/events/types.js +1 -11
  394. package/dist/core/exclusive-lock.js +1 -197
  395. package/dist/core/fault-classifier.js +1 -96
  396. package/dist/core/feed/feed.js +7 -202
  397. package/dist/core/feed/inbox-migrate.js +3 -135
  398. package/dist/core/feed/inbox.js +10 -122
  399. package/dist/core/feed/messages.js +6 -212
  400. package/dist/core/frontmatter.js +1 -35
  401. package/dist/core/fs-utils.js +3 -202
  402. package/dist/core/git.js +2 -103
  403. package/dist/core/help.js +9 -310
  404. package/dist/core/host-exports/builtins.js +9 -68
  405. package/dist/core/host-exports/export.js +3 -124
  406. package/dist/core/human/action-binding.js +1 -40
  407. package/dist/core/human/answer-text.js +5 -100
  408. package/dist/core/human/answer.js +1 -119
  409. package/dist/core/human/claim.js +3 -67
  410. package/dist/core/human/completion.js +1 -27
  411. package/dist/core/human/component-docs.js +78 -272
  412. package/dist/core/human/convention.js +2 -82
  413. package/dist/core/human/feedback-companion.js +1 -106
  414. package/dist/core/human/feedback.js +1 -88
  415. package/dist/core/human/page-authoring.js +1 -19
  416. package/dist/core/human/page-catalog.js +1 -172
  417. package/dist/core/human/page-errors.js +1 -7
  418. package/dist/core/human/page-eval.js +1 -125
  419. package/dist/core/human/page-html-markdown.js +8 -260
  420. package/dist/core/human/page-markdown.js +17 -295
  421. package/dist/core/human/page-schema.js +1 -373
  422. package/dist/core/human/page-synth.js +8 -27
  423. package/dist/core/human/page.js +1 -198
  424. package/dist/core/human/requests.js +15 -466
  425. package/dist/core/human/review-schema.js +1 -34
  426. package/dist/core/human/root.js +1 -11
  427. package/dist/core/human/scan.js +1 -69
  428. package/dist/core/human/summary.js +1 -5
  429. package/dist/core/human/tickets.js +1 -171
  430. package/dist/core/human/types.js +0 -1
  431. package/dist/core/human/visible-paths.js +1 -77
  432. package/dist/core/human-actions.js +1 -101
  433. package/dist/core/inspector/chrome.js +1 -14
  434. package/dist/core/inspector/contract.js +0 -1
  435. package/dist/core/inspector/core.js +2 -295
  436. package/dist/core/inspector/host.js +4 -538
  437. package/dist/core/inspector/model.js +2 -226
  438. package/dist/core/inspector/text.js +6 -45
  439. package/dist/core/inspector/transport.js +1 -36
  440. package/dist/core/inspector/tui.js +2 -295
  441. package/dist/core/installed-plugins.js +1 -78
  442. package/dist/core/io.js +7 -356
  443. package/dist/core/keybindings/attach-control.js +1 -42
  444. package/dist/core/keybindings/background-bash.js +1 -33
  445. package/dist/core/keybindings/catalog.js +1 -256
  446. package/dist/core/keybindings/inbox.js +1 -25
  447. package/dist/core/keybindings/index.js +1 -7
  448. package/dist/core/keybindings/match.js +1 -127
  449. package/dist/core/keybindings/persistence.js +1 -49
  450. package/dist/core/keybindings/resolve.js +1 -348
  451. package/dist/core/keybindings/types.js +0 -1
  452. package/dist/core/locked-file.js +1 -118
  453. package/dist/core/log.js +3 -27
  454. package/dist/core/manifest-recovery.js +1 -72
  455. package/dist/core/manifest-stale.js +1 -39
  456. package/dist/core/manifest.js +1 -20
  457. package/dist/core/memory/doc-link-grammar.js +2 -109
  458. package/dist/core/memory/extensions.js +1 -221
  459. package/dist/core/memory/history.js +6 -268
  460. package/dist/core/memory/identity.js +1 -181
  461. package/dist/core/memory/inline-ref-grammar.js +1 -98
  462. package/dist/core/memory/inline-ref-guidance.js +2 -35
  463. package/dist/core/memory/inline-ref-inventory.js +1 -59
  464. package/dist/core/memory/lint.js +2 -671
  465. package/dist/core/memory/project-namespace.js +2 -85
  466. package/dist/core/memory/repository-association.js +1 -129
  467. package/dist/core/memory/tree.js +1 -93
  468. package/dist/core/memory-resolver.js +2 -611
  469. package/dist/core/model-config.js +1 -107
  470. package/dist/core/model-routes.js +1 -201
  471. package/dist/core/nested-stores.js +2 -166
  472. package/dist/core/output.js +7 -99
  473. package/dist/core/pagination.js +1 -88
  474. package/dist/core/plugin-swap-lock.js +1 -31
  475. package/dist/core/pool-credential-store.js +1 -116
  476. package/dist/core/predicate.js +1 -191
  477. package/dist/core/preview-registry.js +2 -411
  478. package/dist/core/preview-result-path.js +1 -26
  479. package/dist/core/profiles/default-binding.js +1 -24
  480. package/dist/core/profiles/deletion-reservation.js +1 -42
  481. package/dist/core/profiles/env-store.js +2 -162
  482. package/dist/core/profiles/fuzzy-match.js +1 -92
  483. package/dist/core/profiles/manifest.js +1 -574
  484. package/dist/core/profiles/select.js +35 -741
  485. package/dist/core/profiles/state-block.js +3 -17
  486. package/dist/core/provider-error-recognition.js +1 -74
  487. package/dist/core/provider-failure.js +1 -86
  488. package/dist/core/provider-management.js +1 -22
  489. package/dist/core/remote-canvas-target.js +1 -30
  490. package/dist/core/render.js +18 -138
  491. package/dist/core/resolver.js +1 -111
  492. package/dist/core/review/birth.js +1 -52
  493. package/dist/core/review/comments.js +5 -279
  494. package/dist/core/review/companion.js +1 -215
  495. package/dist/core/review/document.js +2 -138
  496. package/dist/core/review/project.js +1 -36
  497. package/dist/core/review/realize.js +1 -71
  498. package/dist/core/review/remap.js +4 -141
  499. package/dist/core/review/signal.js +1 -12
  500. package/dist/core/review/stage.js +1 -184
  501. package/dist/core/review/store.js +1 -168
  502. package/dist/core/review/types.js +1 -23
  503. package/dist/core/runtime/advertised-command-invocation.js +1 -233
  504. package/dist/core/runtime/auth-reload.js +1 -67
  505. package/dist/core/runtime/banner.js +1 -51
  506. package/dist/core/runtime/bearings-render.js +18 -250
  507. package/dist/core/runtime/bearings.js +7 -194
  508. package/dist/core/runtime/bin-contributions.js +2 -186
  509. package/dist/core/runtime/boot-root.js +1 -107
  510. package/dist/core/runtime/branded-host.js +2 -264
  511. package/dist/core/runtime/broker/auth-reload.js +1 -157
  512. package/dist/core/runtime/broker/client-registry.js +1 -179
  513. package/dist/core/runtime/broker/daemon-ops.js +1 -88
  514. package/dist/core/runtime/broker/engine-drive.js +1 -354
  515. package/dist/core/runtime/broker/engine-routing.js +1 -211
  516. package/dist/core/runtime/broker/event-projection.js +1 -193
  517. package/dist/core/runtime/broker/extension-abort.js +1 -36
  518. package/dist/core/runtime/broker/fault-retry.js +1 -588
  519. package/dist/core/runtime/broker/frame-client.js +1 -132
  520. package/dist/core/runtime/broker/frame-dispatch.js +1 -183
  521. package/dist/core/runtime/broker/frame-engine-control.js +1 -231
  522. package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
  523. package/dist/core/runtime/broker/frame-model-query.js +1 -69
  524. package/dist/core/runtime/broker/frame-read.js +1 -116
  525. package/dist/core/runtime/broker/frame-replies.js +1 -64
  526. package/dist/core/runtime/broker/frame-session.js +4 -203
  527. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
  528. package/dist/core/runtime/broker/inbox.js +13 -163
  529. package/dist/core/runtime/broker/node-named.js +1 -27
  530. package/dist/core/runtime/broker/read-ops.js +1 -171
  531. package/dist/core/runtime/broker/rebind.js +1 -318
  532. package/dist/core/runtime/broker/tool-groups.js +1 -246
  533. package/dist/core/runtime/broker/turn-admission.js +1 -31
  534. package/dist/core/runtime/broker/turn-ignition.js +1 -84
  535. package/dist/core/runtime/broker-cli.js +3 -81
  536. package/dist/core/runtime/broker-extension-render.js +5 -135
  537. package/dist/core/runtime/broker-inventory.js +1 -116
  538. package/dist/core/runtime/broker-persona-guidance.js +4 -154
  539. package/dist/core/runtime/broker-protocol.js +3 -152
  540. package/dist/core/runtime/broker-request.js +1 -85
  541. package/dist/core/runtime/broker-sdk.js +1 -129
  542. package/dist/core/runtime/broker.js +1 -1214
  543. package/dist/core/runtime/canvas-extensions.js +1 -96
  544. package/dist/core/runtime/chat-inventory-rows.js +1 -105
  545. package/dist/core/runtime/close.js +1 -265
  546. package/dist/core/runtime/command-expansion.js +9 -104
  547. package/dist/core/runtime/command-surface.js +1 -117
  548. package/dist/core/runtime/connectivity.js +1 -73
  549. package/dist/core/runtime/deliver-live.js +1 -88
  550. package/dist/core/runtime/fault-recovery.js +1 -83
  551. package/dist/core/runtime/fault.js +1 -17
  552. package/dist/core/runtime/fleet.js +1 -58
  553. package/dist/core/runtime/front-door-env.js +1 -16
  554. package/dist/core/runtime/front-door.js +7 -183
  555. package/dist/core/runtime/headless-pi.js +1 -161
  556. package/dist/core/runtime/host.js +1 -457
  557. package/dist/core/runtime/interactive-deliver.js +1 -51
  558. package/dist/core/runtime/invocation.js +0 -10
  559. package/dist/core/runtime/kickoff.js +30 -327
  560. package/dist/core/runtime/launch-config-worker.js +1 -12
  561. package/dist/core/runtime/launch-prompt.js +4 -13
  562. package/dist/core/runtime/launch-target.js +1 -55
  563. package/dist/core/runtime/launch.js +1 -483
  564. package/dist/core/runtime/lifecycle.js +2 -213
  565. package/dist/core/runtime/managed-provider-cooling.js +1 -62
  566. package/dist/core/runtime/memory.js +1 -17
  567. package/dist/core/runtime/model-registry.js +1 -13
  568. package/dist/core/runtime/model-selection.js +1 -135
  569. package/dist/core/runtime/model-swap.js +1 -86
  570. package/dist/core/runtime/naming.js +14 -298
  571. package/dist/core/runtime/nerd-font.js +2 -127
  572. package/dist/core/runtime/node-read.js +2 -386
  573. package/dist/core/runtime/nodes.js +1 -331
  574. package/dist/core/runtime/outcome-document.js +1 -97
  575. package/dist/core/runtime/package-health.js +4 -99
  576. package/dist/core/runtime/persona.js +2 -55
  577. package/dist/core/runtime/pi-cli.js +1 -65
  578. package/dist/core/runtime/pi-vendored.js +1 -66
  579. package/dist/core/runtime/placement-tmux.js +1 -81
  580. package/dist/core/runtime/placement.js +1 -386
  581. package/dist/core/runtime/promote.js +1 -174
  582. package/dist/core/runtime/prospective-inventory-cli.js +3 -61
  583. package/dist/core/runtime/prospective-inventory.js +2 -88
  584. package/dist/core/runtime/recap.js +27 -103
  585. package/dist/core/runtime/recycle.js +1 -190
  586. package/dist/core/runtime/reopen.js +1 -138
  587. package/dist/core/runtime/reset.js +1 -245
  588. package/dist/core/runtime/resume-root.js +10 -290
  589. package/dist/core/runtime/revive-all.js +1 -107
  590. package/dist/core/runtime/revive.js +4 -544
  591. package/dist/core/runtime/roadmap.js +4 -38
  592. package/dist/core/runtime/session-branch.js +1 -46
  593. package/dist/core/runtime/session-cycles.js +1 -110
  594. package/dist/core/runtime/session-list-cache.js +1 -406
  595. package/dist/core/runtime/session-visibility.js +1 -99
  596. package/dist/core/runtime/shell-expansion.js +9 -100
  597. package/dist/core/runtime/situational-context.js +2 -67
  598. package/dist/core/runtime/situational-live.js +1 -41
  599. package/dist/core/runtime/spawn-env.js +1 -255
  600. package/dist/core/runtime/spawn.js +3 -577
  601. package/dist/core/runtime/stamp/channel.js +1 -76
  602. package/dist/core/runtime/stamp/protocol.js +1 -113
  603. package/dist/core/runtime/stop-guard.js +7 -116
  604. package/dist/core/runtime/stop-signals.js +1 -46
  605. package/dist/core/runtime/stream-watchdog.js +1 -134
  606. package/dist/core/runtime/structured-output.js +4 -156
  607. package/dist/core/runtime/surface-bg.js +1 -85
  608. package/dist/core/runtime/tmux-bindings.js +4 -730
  609. package/dist/core/runtime/tmux-chrome.js +1 -5
  610. package/dist/core/runtime/tmux-driver.js +7 -637
  611. package/dist/core/runtime/tool-group-summary.js +6 -85
  612. package/dist/core/runtime/turn-visibility.js +1 -31
  613. package/dist/core/runtime/view-socket.js +1 -83
  614. package/dist/core/runtime/warm-pool.js +1 -395
  615. package/dist/core/scope.js +1 -254
  616. package/dist/core/scoped-state/db.js +1 -135
  617. package/dist/core/scoped-state/migrate.js +3 -181
  618. package/dist/core/scoped-state/paths.js +1 -27
  619. package/dist/core/scoped-state/profiles.js +1 -62
  620. package/dist/core/scoped-state/providers.js +1 -8
  621. package/dist/core/scoped-state/schema.js +3 -16
  622. package/dist/core/scoped-state/settings.js +1 -82
  623. package/dist/core/secrets.js +2 -55
  624. package/dist/core/self-update.js +1 -71
  625. package/dist/core/session-model/session-state.js +1 -180
  626. package/dist/core/shell-segments.js +4 -169
  627. package/dist/core/spawn.js +1 -26
  628. package/dist/core/stdout-errors.js +1 -14
  629. package/dist/core/subscription-state.js +3 -193
  630. package/dist/core/substrate/frontmatter-validation.js +1 -105
  631. package/dist/core/substrate/gate-explain.js +1 -424
  632. package/dist/core/substrate/gate.js +1 -26
  633. package/dist/core/substrate/index.js +1 -30
  634. package/dist/core/substrate/injected-store.js +1 -249
  635. package/dist/core/substrate/listings.js +1 -115
  636. package/dist/core/substrate/on-read-node.js +1 -36
  637. package/dist/core/substrate/on-read.js +9 -315
  638. package/dist/core/substrate/plan.js +1 -266
  639. package/dist/core/substrate/render-node.js +1 -30
  640. package/dist/core/substrate/render.js +65 -689
  641. package/dist/core/substrate/schema.js +1 -186
  642. package/dist/core/substrate/session-cache.js +1 -83
  643. package/dist/core/substrate/subject-fields.js +1 -35
  644. package/dist/core/substrate/subject.js +1 -47
  645. package/dist/core/substrate/surface-match.js +1 -242
  646. package/dist/core/termrender/code-doc.js +5 -92
  647. package/dist/core/termrender/display.js +2 -56
  648. package/dist/core/termrender/termrender.js +14 -719
  649. package/dist/core/termrender/version.js +1 -1
  650. package/dist/core/timing.js +2 -94
  651. package/dist/core/tui/draw.js +2 -378
  652. package/dist/core/tui/fuzzy.js +1 -38
  653. package/dist/core/tui/markdown.js +3 -407
  654. package/dist/core/tui/page-host.js +1 -74
  655. package/dist/core/tui/panel.js +1 -137
  656. package/dist/core/tui/terminal.js +2 -100
  657. package/dist/core/user-settings.js +1 -454
  658. package/dist/core/wake.js +1 -296
  659. package/dist/core/worktree-close.js +6 -228
  660. package/dist/core/worktree-containment.js +3 -48
  661. package/dist/core/worktree-landing.js +4 -56
  662. package/dist/core/worktree-mutation-async.js +10 -280
  663. package/dist/core/worktree-quarantine.js +1 -54
  664. package/dist/core/worktree-sweep.js +6 -453
  665. package/dist/core/worktree.js +18 -899
  666. package/dist/daemon/api/bridge.js +8 -418
  667. package/dist/daemon/api/handlers/attach.js +1 -65
  668. package/dist/daemon/api/handlers/bash-jobs.js +2 -91
  669. package/dist/daemon/api/handlers/broker-ops.js +1 -447
  670. package/dist/daemon/api/handlers/broker-recovery.js +1 -251
  671. package/dist/daemon/api/handlers/canvas.js +6 -490
  672. package/dist/daemon/api/handlers/chat-inventory.js +1 -25
  673. package/dist/daemon/api/handlers/crons.js +1 -373
  674. package/dist/daemon/api/handlers/daemon.js +1 -76
  675. package/dist/daemon/api/handlers/feedback-comments.js +3 -199
  676. package/dist/daemon/api/handlers/files.js +1 -63
  677. package/dist/daemon/api/handlers/focus.js +1 -92
  678. package/dist/daemon/api/handlers/health.js +1 -76
  679. package/dist/daemon/api/handlers/human-requests.js +1 -379
  680. package/dist/daemon/api/handlers/human.js +1 -3
  681. package/dist/daemon/api/handlers/inbox-page.js +1 -89
  682. package/dist/daemon/api/handlers/inbox.js +1 -301
  683. package/dist/daemon/api/handlers/memory.js +1 -50
  684. package/dist/daemon/api/handlers/messages.js +2 -506
  685. package/dist/daemon/api/handlers/model-config.js +1 -44
  686. package/dist/daemon/api/handlers/modelauth.js +1 -165
  687. package/dist/daemon/api/handlers/node-outcomes.js +1 -181
  688. package/dist/daemon/api/handlers/nodes.js +1 -939
  689. package/dist/daemon/api/handlers/profiles.js +1 -140
  690. package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
  691. package/dist/daemon/api/handlers/reports.js +16 -332
  692. package/dist/daemon/api/handlers/review-comments.js +1 -465
  693. package/dist/daemon/api/handlers/reviews.js +1 -200
  694. package/dist/daemon/api/handlers/subscriptions.js +1 -53
  695. package/dist/daemon/api/handlers/validate.js +1 -58
  696. package/dist/daemon/api/handlers/worktree.js +1 -39
  697. package/dist/daemon/api/map.js +2 -735
  698. package/dist/daemon/api/router.js +1 -190
  699. package/dist/daemon/api/server.js +11 -408
  700. package/dist/daemon/boot-migrations.js +1 -31
  701. package/dist/daemon/companion-retire.js +1 -34
  702. package/dist/daemon/control.js +1 -22
  703. package/dist/daemon/cron/armed-context.js +1 -100
  704. package/dist/daemon/cron/capture.js +2 -45
  705. package/dist/daemon/cron/disposition.js +1 -55
  706. package/dist/daemon/cron/escalation.js +3 -124
  707. package/dist/daemon/cron/held.js +1 -20
  708. package/dist/daemon/cron/lease-recovery.js +1 -119
  709. package/dist/daemon/cron/live-runs.js +1 -23
  710. package/dist/daemon/cron/passes.js +1 -58
  711. package/dist/daemon/cron/settle.js +1 -61
  712. package/dist/daemon/cron/sinks.js +2 -59
  713. package/dist/daemon/cron-run.js +1 -405
  714. package/dist/daemon/crtrd-cli.js +1 -23
  715. package/dist/daemon/crtrd.js +8 -854
  716. package/dist/daemon/delivery/run-delivery.js +1 -164
  717. package/dist/daemon/fleet.js +17 -475
  718. package/dist/daemon/human/finish.js +10 -179
  719. package/dist/daemon/human/settle.js +1 -89
  720. package/dist/daemon/human/sweep.js +1 -66
  721. package/dist/daemon/manage.js +2 -595
  722. package/dist/daemon/messaging/node-message.js +1 -99
  723. package/dist/daemon/park-activity.js +1 -30
  724. package/dist/daemon/park-pending.js +1 -52
  725. package/dist/daemon/pidfile.js +1 -37
  726. package/dist/daemon/profile-delete.js +1 -306
  727. package/dist/daemon/reconcilers/bash-deadline.js +1 -80
  728. package/dist/daemon/reconcilers/broker-supervision.js +4 -761
  729. package/dist/daemon/reconcilers/controller-death.js +1 -14
  730. package/dist/daemon/reconcilers/cron-lane.js +1 -29
  731. package/dist/daemon/reconcilers/delivery-lane.js +1 -130
  732. package/dist/daemon/reconcilers/live-obligation.js +1 -87
  733. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
  734. package/dist/daemon/reconcilers/node-deadline.js +1 -82
  735. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
  736. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
  737. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
  738. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
  739. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
  740. package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
  741. package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
  742. package/dist/daemon/review/comment-notify.js +2 -109
  743. package/dist/daemon/review/companion.js +1 -29
  744. package/dist/daemon/review/deliver.js +3 -8
  745. package/dist/daemon/review/finish.js +1 -122
  746. package/dist/daemon/review/sweep.js +1 -18
  747. package/dist/daemon/startup-policy.js +1 -1
  748. package/dist/daemon/supervise-cadence.js +1 -6
  749. package/dist/hook-authoring.js +5 -447
  750. package/dist/hook-process.js +1 -34
  751. package/dist/index.js +1 -52
  752. package/dist/migrations/001-surfaces-frontmatter.js +1 -161
  753. package/dist/migrations/002-profile-project-memory.js +1 -72
  754. package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
  755. package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
  756. package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
  757. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
  758. package/dist/migrations/activation.js +2 -89
  759. package/dist/migrations/convergent.js +2 -82
  760. package/dist/migrations/corpus.js +3 -483
  761. package/dist/migrations/frontmatter-splice.js +8 -176
  762. package/dist/migrations/profile-manifests.js +2 -70
  763. package/dist/migrations/registry.js +1 -42
  764. package/dist/migrations/runner.js +1 -85
  765. package/dist/migrations/types.js +0 -24
  766. package/dist/pi-extensions/broker-local.js +2 -106
  767. package/dist/pi-extensions/canvas-bash-valve.js +7 -461
  768. package/dist/pi-extensions/canvas-context-intro.js +2 -113
  769. package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
  770. package/dist/pi-extensions/canvas-goal-capture.js +1 -83
  771. package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
  772. package/dist/pi-extensions/canvas-passive-context.js +14 -203
  773. package/dist/pi-extensions/canvas-preview-result.js +2 -72
  774. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
  775. package/dist/pi-extensions/canvas-recap.js +11 -405
  776. package/dist/pi-extensions/canvas-review-boundary.js +3 -63
  777. package/dist/pi-extensions/canvas-stamp.js +2 -77
  778. package/dist/pi-extensions/canvas-stophook.js +1 -643
  779. package/dist/pi-extensions/canvas-structured-output.js +13 -35
  780. package/dist/pi-extensions/canvas-tool-guide.js +9 -78
  781. package/dist/pi-extensions/envelope-merge.js +8 -29
  782. package/dist/prompts/review.js +20 -42
  783. package/dist/shared/birth-announcement.js +1 -25
  784. package/dist/shared/crtr-version.js +1 -18
  785. package/dist/shared/env.js +1 -214
  786. package/dist/shared/generated-context.js +11 -226
  787. package/dist/shared/predicates.js +1 -4
  788. package/dist/shared/shell-quote.js +1 -5
  789. package/dist/shared/tool-groups.js +1 -64
  790. package/dist/shared/working-activity.js +1 -27
  791. package/dist/suppress-experimental-warnings.js +1 -15
  792. package/dist/types.js +1 -185
  793. package/docs/public-api.md +10 -9
  794. package/package.json +6 -4
  795. package/runtime.lock.json +5 -5
  796. package/scripts/pack-minify.mjs +108 -0
  797. package/dist/api/__tests__/integration/client.test.d.ts +0 -1
  798. package/dist/api/__tests__/integration/client.test.js +0 -163
  799. package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
  800. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
  801. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
  802. package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
  803. package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
  804. package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
  805. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
  806. package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
  807. package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
  808. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
  809. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
  810. package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
  811. package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
  812. package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
  813. package/dist/clients/attach/__tests__/context-message.test.js +0 -130
  814. package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
  815. package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
  816. package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
  817. package/dist/clients/attach/__tests__/diagram.test.js +0 -42
  818. package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
  819. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
  820. package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
  821. package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
  822. package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
  823. package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
  824. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
  825. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
  826. package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
  827. package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
  828. package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
  829. package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
  830. package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
  831. package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
  832. package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
  833. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
  834. package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
  835. package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
  836. package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
  837. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
  838. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
  839. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
  840. package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
  841. package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
  842. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
  843. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
  844. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
  845. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
  846. package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
  847. package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
  848. package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
  849. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
  850. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
  851. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
  852. package/dist/commands/__tests__/human.test.d.ts +0 -1
  853. package/dist/commands/__tests__/human.test.js +0 -172
  854. package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
  855. package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
  856. package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
  857. package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
  858. package/dist/commands/__tests__/node-message.test.d.ts +0 -1
  859. package/dist/commands/__tests__/node-message.test.js +0 -112
  860. package/dist/commands/__tests__/node-new.test.d.ts +0 -1
  861. package/dist/commands/__tests__/node-new.test.js +0 -58
  862. package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
  863. package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
  864. package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
  865. package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
  866. package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
  867. package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
  868. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
  869. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
  870. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
  871. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
  872. package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
  873. package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
  874. package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
  875. package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
  876. package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
  877. package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
  878. package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
  879. package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
  880. package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
  881. package/dist/core/__tests__/bash-guard.test.js +0 -190
  882. package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
  883. package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
  884. package/dist/core/__tests__/boot.test.d.ts +0 -1
  885. package/dist/core/__tests__/boot.test.js +0 -274
  886. package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
  887. package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
  888. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
  889. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
  890. package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
  891. package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
  892. package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
  893. package/dist/core/__tests__/broker-preflight.test.js +0 -95
  894. package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
  895. package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
  896. package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
  897. package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
  898. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
  899. package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
  900. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
  901. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
  902. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
  903. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
  904. package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
  905. package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
  906. package/dist/core/__tests__/canvas.test.d.ts +0 -1
  907. package/dist/core/__tests__/canvas.test.js +0 -138
  908. package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
  909. package/dist/core/__tests__/child-death-wake.test.js +0 -153
  910. package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
  911. package/dist/core/__tests__/cli-help-contract.test.js +0 -152
  912. package/dist/core/__tests__/close.test.d.ts +0 -1
  913. package/dist/core/__tests__/close.test.js +0 -284
  914. package/dist/core/__tests__/collectible.test.d.ts +0 -1
  915. package/dist/core/__tests__/collectible.test.js +0 -89
  916. package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
  917. package/dist/core/__tests__/config-change-delta.test.js +0 -108
  918. package/dist/core/__tests__/context-intro.test.d.ts +0 -1
  919. package/dist/core/__tests__/context-intro.test.js +0 -123
  920. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
  921. package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
  922. package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
  923. package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
  924. package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
  925. package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
  926. package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
  927. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
  928. package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
  929. package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
  930. package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
  931. package/dist/core/__tests__/daemon-boot.test.js +0 -422
  932. package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
  933. package/dist/core/__tests__/daemon-wedge.test.js +0 -106
  934. package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
  935. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
  936. package/dist/core/__tests__/events-contract.test.d.ts +0 -1
  937. package/dist/core/__tests__/events-contract.test.js +0 -76
  938. package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
  939. package/dist/core/__tests__/extension-abort.test.js +0 -21
  940. package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
  941. package/dist/core/__tests__/fault-classifier.test.js +0 -138
  942. package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
  943. package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
  944. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
  945. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
  946. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
  947. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
  948. package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
  949. package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
  950. package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
  951. package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
  952. package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
  953. package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
  954. package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
  955. package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
  956. package/dist/core/__tests__/focuses.test.d.ts +0 -1
  957. package/dist/core/__tests__/focuses.test.js +0 -113
  958. package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
  959. package/dist/core/__tests__/fs-utils.test.js +0 -50
  960. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
  961. package/dist/core/__tests__/helpers/broker-clients.js +0 -174
  962. package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
  963. package/dist/core/__tests__/helpers/fleet.js +0 -50
  964. package/dist/core/__tests__/helpers/harness.d.ts +0 -124
  965. package/dist/core/__tests__/helpers/harness.js +0 -806
  966. package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
  967. package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
  968. package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
  969. package/dist/core/__tests__/history-inbox.test.js +0 -121
  970. package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
  971. package/dist/core/__tests__/human-action-delivery.test.js +0 -162
  972. package/dist/core/__tests__/human-actions.test.d.ts +0 -1
  973. package/dist/core/__tests__/human-actions.test.js +0 -120
  974. package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
  975. package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
  976. package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
  977. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
  978. package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
  979. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
  980. package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
  981. package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
  982. package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
  983. package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
  984. package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
  985. package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
  986. package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
  987. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
  988. package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
  989. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
  990. package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
  991. package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
  992. package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
  993. package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
  994. package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
  995. package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
  996. package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
  997. package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
  998. package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
  999. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
  1000. package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
  1001. package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
  1002. package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
  1003. package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
  1004. package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
  1005. package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
  1006. package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
  1007. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
  1008. package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
  1009. package/dist/core/__tests__/integration/revive.test.js +0 -615
  1010. package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
  1011. package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
  1012. package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
  1013. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
  1014. package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
  1015. package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
  1016. package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
  1017. package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
  1018. package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
  1019. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
  1020. package/dist/core/__tests__/kickoff.test.d.ts +0 -1
  1021. package/dist/core/__tests__/kickoff.test.js +0 -196
  1022. package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
  1023. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
  1024. package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
  1025. package/dist/core/__tests__/lifecycle.test.js +0 -176
  1026. package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
  1027. package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
  1028. package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
  1029. package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
  1030. package/dist/core/__tests__/migration.test.d.ts +0 -1
  1031. package/dist/core/__tests__/migration.test.js +0 -946
  1032. package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
  1033. package/dist/core/__tests__/model-pin-durability.test.js +0 -195
  1034. package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
  1035. package/dist/core/__tests__/model-routes-config.test.js +0 -150
  1036. package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
  1037. package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
  1038. package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
  1039. package/dist/core/__tests__/node-outcome.test.js +0 -246
  1040. package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
  1041. package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
  1042. package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
  1043. package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
  1044. package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
  1045. package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
  1046. package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
  1047. package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
  1048. package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
  1049. package/dist/core/__tests__/passive-subscription.test.js +0 -120
  1050. package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
  1051. package/dist/core/__tests__/pid-identity-match.test.js +0 -145
  1052. package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
  1053. package/dist/core/__tests__/pid-zombie.test.js +0 -42
  1054. package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
  1055. package/dist/core/__tests__/plugin-kinds.test.js +0 -182
  1056. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
  1057. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
  1058. package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
  1059. package/dist/core/__tests__/plugin-page-components.test.js +0 -159
  1060. package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
  1061. package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
  1062. package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
  1063. package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
  1064. package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
  1065. package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
  1066. package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
  1067. package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
  1068. package/dist/core/__tests__/prune.test.d.ts +0 -1
  1069. package/dist/core/__tests__/prune.test.js +0 -243
  1070. package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
  1071. package/dist/core/__tests__/push-final-guard.test.js +0 -191
  1072. package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
  1073. package/dist/core/__tests__/relaunch-root.test.js +0 -249
  1074. package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
  1075. package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
  1076. package/dist/core/__tests__/repository-association.test.d.ts +0 -1
  1077. package/dist/core/__tests__/repository-association.test.js +0 -153
  1078. package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
  1079. package/dist/core/__tests__/repository-root-identity.test.js +0 -223
  1080. package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
  1081. package/dist/core/__tests__/respawn-throttle.test.js +0 -20
  1082. package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
  1083. package/dist/core/__tests__/review-model-floor.test.js +0 -83
  1084. package/dist/core/__tests__/revive-all.test.d.ts +0 -1
  1085. package/dist/core/__tests__/revive-all.test.js +0 -157
  1086. package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
  1087. package/dist/core/__tests__/revive-capacity.test.js +0 -184
  1088. package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
  1089. package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
  1090. package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
  1091. package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
  1092. package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
  1093. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
  1094. package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
  1095. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
  1096. package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
  1097. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
  1098. package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
  1099. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
  1100. package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
  1101. package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
  1102. package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
  1103. package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
  1104. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
  1105. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
  1106. package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
  1107. package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
  1108. package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
  1109. package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
  1110. package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
  1111. package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
  1112. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
  1113. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
  1114. package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
  1115. package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
  1116. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
  1117. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
  1118. package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
  1119. package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
  1120. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
  1121. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
  1122. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
  1123. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
  1124. package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
  1125. package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
  1126. package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
  1127. package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
  1128. package/dist/core/__tests__/secrets.test.d.ts +0 -1
  1129. package/dist/core/__tests__/secrets.test.js +0 -49
  1130. package/dist/core/__tests__/self-update.test.d.ts +0 -1
  1131. package/dist/core/__tests__/self-update.test.js +0 -46
  1132. package/dist/core/__tests__/session-branch.test.d.ts +0 -1
  1133. package/dist/core/__tests__/session-branch.test.js +0 -61
  1134. package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
  1135. package/dist/core/__tests__/session-cycles.test.js +0 -133
  1136. package/dist/core/__tests__/session-model.test.d.ts +0 -1
  1137. package/dist/core/__tests__/session-model.test.js +0 -111
  1138. package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
  1139. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
  1140. package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
  1141. package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
  1142. package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
  1143. package/dist/core/__tests__/stdout-errors.test.js +0 -16
  1144. package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
  1145. package/dist/core/__tests__/stop-guard.test.js +0 -237
  1146. package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
  1147. package/dist/core/__tests__/stream-watchdog.test.js +0 -154
  1148. package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
  1149. package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
  1150. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
  1151. package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
  1152. package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
  1153. package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
  1154. package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
  1155. package/dist/core/__tests__/worktree-landing.test.js +0 -11
  1156. package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
  1157. package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
  1158. package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
  1159. package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
  1160. package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
  1161. package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
  1162. package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
  1163. package/dist/core/canvas/__tests__/attention.test.js +0 -83
  1164. package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
  1165. package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
  1166. package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
  1167. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
  1168. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
  1169. package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
  1170. package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
  1171. package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
  1172. package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
  1173. package/dist/core/canvas/__tests__/session-window.test.js +0 -70
  1174. package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
  1175. package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
  1176. package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
  1177. package/dist/core/human/__tests__/page-catalog.test.js +0 -20
  1178. package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
  1179. package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
  1180. package/dist/core/human/__tests__/page.test.d.ts +0 -1
  1181. package/dist/core/human/__tests__/page.test.js +0 -92
  1182. package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
  1183. package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
  1184. package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
  1185. package/dist/core/profiles/__tests__/env-store.test.js +0 -99
  1186. package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
  1187. package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
  1188. package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
  1189. package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
  1190. package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
  1191. package/dist/core/review/__tests__/capture-origin.test.js +0 -150
  1192. package/dist/core/review/__tests__/comments.test.d.ts +0 -1
  1193. package/dist/core/review/__tests__/comments.test.js +0 -116
  1194. package/dist/core/review/__tests__/remap.test.d.ts +0 -1
  1195. package/dist/core/review/__tests__/remap.test.js +0 -177
  1196. package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
  1197. package/dist/core/review/__tests__/stage-identity.test.js +0 -150
  1198. package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
  1199. package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
  1200. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
  1201. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
  1202. package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
  1203. package/dist/core/runtime/__tests__/node-env.test.js +0 -73
  1204. package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
  1205. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
  1206. package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
  1207. package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
  1208. package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
  1209. package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
  1210. package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
  1211. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
  1212. package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
  1213. package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
  1214. package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
  1215. package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
  1216. package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
  1217. package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
  1218. package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
  1219. package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
  1220. package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
  1221. package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
  1222. package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
  1223. package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
  1224. package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
  1225. package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
  1226. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
  1227. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
  1228. package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
  1229. package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
  1230. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
  1231. package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
  1232. package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
  1233. package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
  1234. package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
  1235. package/dist/daemon/__tests__/thaw-order.test.js +0 -55
  1236. package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
  1237. package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
  1238. package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
  1239. package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
  1240. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
  1241. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
  1242. package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
  1243. package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
  1244. package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
  1245. package/dist/daemon/api/__tests__/model-config.test.js +0 -73
  1246. package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
  1247. package/dist/daemon/api/__tests__/node-create-description.test.js +0 -127
  1248. package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
  1249. package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
  1250. package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
  1251. package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
  1252. package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
  1253. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
  1254. package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
  1255. package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
  1256. package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
  1257. package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
  1258. package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
  1259. package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
  1260. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
  1261. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
  1262. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
  1263. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
  1264. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
  1265. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
  1266. package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
  1267. package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
  1268. package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
  1269. package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
  1270. package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
  1271. package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
  1272. package/dist/migrations/__tests__/activation.test.d.ts +0 -1
  1273. package/dist/migrations/__tests__/activation.test.js +0 -152
  1274. package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
  1275. package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
  1276. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
  1277. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
  1278. package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
  1279. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
  1280. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
  1281. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
  1282. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
  1283. package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
  1284. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
  1285. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
  1286. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
  1287. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
  1288. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
  1289. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
  1290. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
  1291. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
  1292. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
  1293. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
  1294. package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
  1295. package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
  1296. package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
  1297. package/dist/shared/__tests__/env-boundary.test.js +0 -95
  1298. package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
  1299. package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
  1300. package/docs/compat/hearth-crtr-v1.md +0 -179
  1301. package/docs/compat/hearth-crtr-v2.md +0 -177
  1302. package/docs/compat/hearth-crtr-v3.md +0 -176
  1303. package/docs/compat/hearth-crtr-v4.md +0 -182
  1304. package/docs/compat/hearth-crtr-v5.md +0 -169
@@ -1,802 +1,12 @@
1
- // Shared constants + helpers for the `crtr memory` command family. The leaf
2
- // handlers (list/read/find/write) consume the resolver, substrate schema, and
3
- // scope modules and build their documented output objects on top of the small
4
- // helpers here. Nothing in this file forks on kind or re-implements the
5
- // schema/gate/resolver — it only composes them.
6
- import { envNodeId, envProfileId } from '../../shared/env.js';
7
- import { existsSync, readdirSync, realpathSync, rmdirSync, statSync } from 'node:fs';
8
- import { dirname, join, resolve as resolvePath } from 'node:path';
9
- import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
10
- import { stateBlock } from '../../core/help.js';
11
- import { loadStoreMemoryDocs, openProjectMemoryStore, } from '../../core/memory-resolver.js';
12
- import { canonicalSegments, physicalRelativePathFor, stripNamespace, validateExplicitLocalName, } from '../../core/memory/identity.js';
13
- import { pathExists, realpathOrSelf } from '../../core/fs-utils.js';
14
- import { usage } from '../../core/errors.js';
15
- import { memoryExtensionValidationCatalog, } from '../../core/memory/extensions.js';
16
- import { CRTR_DIR_NAME } from '../../types.js';
17
- import { NEUTRAL_PROJECT_MEMORY, scopeMemoryDir, projectScopeRoot, ensureProjectScopeRoot, resetScopeCache, } from '../../core/scope.js';
18
- import { loadProfileManifest, resolveProfileOperand, profileMemoryDir } from '../../core/profiles/manifest.js';
19
- import { memoryDir as nodeMemoryDir } from '../../core/runtime/memory.js';
20
- import { SURFACE_EVENTS, SURFACE_RUNGS } from '../../core/substrate/schema.js';
21
- import { SUPPRESSIBLE_RULES } from '../../core/substrate/frontmatter-validation.js';
22
- import { exposureTarget, loadContextExposureState, registerExposure, saveContextExposureState, } from '../../core/substrate/injected-store.js';
23
- // The two memory kinds — knowledge (consult: procedural playbooks + factual
24
- // references merged) vs preference (behave: standing directives). Used as the
25
- // `--kind` enum choices everywhere.
26
- export const MEMORY_KINDS = ['knowledge', 'preference'];
27
- // Scope choices for READ-ONLY source filtering — every scope a target view
28
- // mounts, builtin included. A scope narrows the source stack only: the query is
29
- // still the full canonical name.
30
- export const MEMORY_READ_SCOPES = ['user', 'project', 'profile', 'node', 'builtin'];
31
- // Scope choices a mutation may target. builtin ships with the package and
32
- // installed-plugin stores are managed by `crtr pkg`, so neither is writable.
33
- // `node` is the this-node store, writable only inside a running node.
34
- export const MEMORY_WRITE_SCOPES = ['user', 'project', 'profile', 'node'];
35
- // Retained for the leaves that have not yet split their read filter from their
36
- // write target; each cuts over to the pair above in its own phase.
37
- export const MEMORY_SCOPES = MEMORY_WRITE_SCOPES;
38
- /** Scope sort weight matching resolution precedence (node > project stack >
39
- * profile > user > builtin). Used by `list` for its "scope then kind then
40
- * name" ordering. */
41
- export function scopeRank(scope) {
42
- return scope === 'node' ? -1 : scope === 'project' ? 0 : scope === 'profile' ? 1 : scope === 'user' ? 2 : 3;
43
- }
44
- export function registerMemoryListingExposure(identity) {
45
- const nodeId = envNodeId();
46
- if (nodeId === undefined || nodeId === '')
47
- return;
48
- const state = loadContextExposureState(nodeId);
49
- registerExposure(exposureTarget(state, 'transcript'), identity, 'content');
50
- saveContextExposureState(nodeId, state);
51
- }
52
- function rejectDirConflicts(input) {
53
- if (input.scope !== undefined && input.scope !== '') {
54
- throw usage(`--dir selects the project store itself and cannot combine with --scope ${input.scope}`, {
55
- received: `--dir ${input.dir} --scope ${input.scope}`,
56
- next: 'Drop --scope: --dir already pins the exact project store.',
57
- });
58
- }
59
- if (input.profile !== undefined && input.profile !== '') {
60
- throw usage('--profile only applies to --scope profile; --dir selects a project store', {
61
- received: input.profile,
62
- next: 'Drop --profile when using --dir.',
63
- });
64
- }
65
- }
66
- /** The realpathed project owner directory `--dir` names. */
67
- function ownerDirFromArg(dirArg) {
68
- const abs = resolvePath(dirArg);
69
- if (!existsSync(abs) || !statSync(abs).isDirectory()) {
70
- throw usage(`--dir does not exist or is not a directory: ${dirArg}`, {
71
- received: dirArg,
72
- next: 'Pass an existing project directory.',
73
- });
74
- }
75
- try {
76
- return realpathSync(abs);
77
- }
78
- catch {
79
- return abs;
80
- }
81
- }
82
- function parseScope(scopeArg, allowed) {
83
- if (scopeArg === undefined || scopeArg === '')
84
- return undefined;
85
- if (!allowed.includes(scopeArg)) {
86
- throw usage(`invalid --scope: ${scopeArg} (expected ${allowed.join('|')})`);
87
- }
88
- return scopeArg;
89
- }
90
- /** A store with no namespace of its own: user, profile, node. */
91
- function nativeStoreDescriptor(scope, memoryDir) {
92
- return {
93
- scope,
94
- storeRoot: memoryDir,
95
- namespace: '',
96
- mountStatus: pathExists(memoryDir) ? 'ready' : 'absent',
97
- projectMemory: NEUTRAL_PROJECT_MEMORY,
98
- };
99
- }
100
- /** Resolve the read selection: a scope filter, or the exact store `--dir`
101
- * names. */
102
- export function resolveReadSelector(input) {
103
- if (input.dir !== undefined && input.dir !== '') {
104
- rejectDirConflicts(input);
105
- return { store: openProjectMemoryStore(ownerDirFromArg(input.dir)) };
106
- }
107
- if (input.profile !== undefined && input.profile !== '' && input.scope !== 'profile') {
108
- throw usage(`--profile only applies to --scope profile (received scope: ${input.scope ?? 'none'})`, {
109
- received: input.profile,
110
- next: 'Drop --profile, or pass --scope profile to target a specific profile store.',
111
- });
112
- }
113
- const scope = parseScope(input.scope, MEMORY_READ_SCOPES);
114
- if (input.profile !== undefined && input.profile !== '') {
115
- // Naming a profile selects THAT profile's store exactly; the ambient
116
- // selection would otherwise answer for whichever profile this process runs
117
- // under, silently ignoring the flag.
118
- const { profileId } = resolveProfileOperand(input.profile);
119
- return { scope: 'profile', store: nativeStoreDescriptor('profile', profileMemoryDir(profileId)) };
120
- }
121
- return { ...(scope === undefined ? {} : { scope }), store: null };
122
- }
123
- /** Resolve the one store a mutation writes to. Default: project when a project
124
- * scope exists for the cwd, else user. An explicit `--scope project` with no
125
- * project scope yet scaffolds one (`ensureProjectScopeRoot`). `--scope
126
- * profile` is NEVER a default — it requires a selected profile, from
127
- * `--profile <id-or-name>` or else the process's `CRTR_PROFILE_ID`, resolved
128
- * through the centralized `loadProfileManifest` (never a raw path join).
129
- * `--scope node` targets the this-node store
130
- * (`nodes/<CRTR_NODE_ID>/context/memory/`) and requires a running node. */
131
- export function resolveWriteSelector(input) {
132
- if (input.dir !== undefined && input.dir !== '') {
133
- rejectDirConflicts(input);
134
- const owner = ownerDirFromArg(input.dir);
135
- // The scaffold (mkdir of `.crouter/memory/`) happens at write time via the
136
- // writer's ensureDir; drop the scope cache so this process's later resolves
137
- // see the new root.
138
- resetScopeCache();
139
- return {
140
- scope: 'project',
141
- memoryDir: join(owner, CRTR_DIR_NAME, 'memory'),
142
- store: openProjectMemoryStore(owner),
143
- };
144
- }
145
- const requested = parseScope(input.scope, MEMORY_WRITE_SCOPES);
146
- const scope = requested ?? (projectScopeRoot() !== null ? 'project' : 'user');
147
- if (input.profile !== undefined && input.profile !== '' && scope !== 'profile') {
148
- throw usage(`--profile only applies to --scope profile (resolved scope: ${scope})`, {
149
- received: input.profile,
150
- next: 'Drop --profile, or pass --scope profile to target a specific profile store.',
151
- });
152
- }
153
- if (scope === 'node') {
154
- // The this-node store: the same dir render.ts's nodeLocalDocs loads at
155
- // boot, so a doc written here rides into this node's knowledge block.
156
- const nodeId = envNodeId() || '';
157
- if (nodeId === '') {
158
- throw usage('node scope requires a running node (CRTR_NODE_ID unset); rerun inside a node');
159
- }
160
- const memoryDir = nodeMemoryDir(nodeId);
161
- return { scope, memoryDir, store: nativeStoreDescriptor(scope, memoryDir) };
162
- }
163
- if (scope === 'profile') {
164
- // A typed `--profile` gets fuzzy tolerance; the ambient `CRTR_PROFILE_ID`
165
- // is a durable id this process was launched under, so it resolves strictly
166
- // — a stale one must fail rather than write into a neighbouring store.
167
- const typed = input.profile !== undefined && input.profile !== '';
168
- const profileIdOrName = typed ? input.profile : envProfileId() || '';
169
- if (profileIdOrName === '') {
170
- throw usage('profile scope requires a selected profile; rerun inside a profiled node or pass --profile');
171
- }
172
- const { profileId } = typed ? resolveProfileOperand(profileIdOrName) : loadProfileManifest(profileIdOrName);
173
- const memoryDir = profileMemoryDir(profileId);
174
- return { scope, memoryDir, store: nativeStoreDescriptor(scope, memoryDir) };
175
- }
176
- let memoryDir = scopeMemoryDir(scope);
177
- if (!memoryDir && scope === 'project') {
178
- // Explicit --scope project with no project root yet → scaffold it.
179
- memoryDir = join(ensureProjectScopeRoot(), 'memory');
180
- }
181
- if (!memoryDir)
182
- throw usage(`no ${scope} scope available for writing memory documents`);
183
- if (scope === 'project') {
184
- return { scope, memoryDir, store: openProjectMemoryStore(dirname(dirname(memoryDir))) };
185
- }
186
- return { scope, memoryDir, store: nativeStoreDescriptor(scope, memoryDir) };
187
- }
188
- /** The scope + memory dir a write lands in. Retained for the leaves that still
189
- * place documents by path alone; they cut over to `resolveWriteSelector` and
190
- * `planNewDocumentPlacement` in their own phases. */
191
- export function resolveWriteTarget(scopeArg, profileArg, dirArg) {
192
- const { scope, memoryDir } = resolveWriteSelector({ scope: scopeArg, profile: profileArg, dir: dirArg });
193
- return { scope, memoryDir };
194
- }
195
- /** Refuse a project store the runtime will not resolve through. A project
196
- * repository-root store carries the identity every canonical name in it composes under, so
197
- * without a valid declaration no name can be validated, stripped, or placed;
198
- * user, profile, and node stores have no declaration and always pass, even
199
- * before their directory exists. */
200
- export function requireMountedStore(store) {
201
- if (store.scope !== 'project' || store.mountStatus === 'ready')
202
- return store;
203
- const owner = store.ownerDir ?? store.storeRoot;
204
- if (store.mountStatus === 'absent') {
205
- throw usage(`no memory store at ${store.storeRoot}`, {
206
- next: `Initialize it with \`crtr memory write <namespace> --dir ${owner}\`, which declares the repository namespace.`,
207
- });
208
- }
209
- const repositoryRoot = store.repositoryRoot ?? owner;
210
- throw usage(store.diagnostic ?? `project memory store at ${store.storeRoot} does not declare a namespace`, {
211
- next: `Run \`crtr sys migrate --dir ${repositoryRoot}\`.`,
212
- });
213
- }
214
- // Canonical name → physical placement
215
- //
216
- // Every surface takes the FULL canonical name. Placement strips the selected
217
- // store's namespace off it, checks that neither the identity nor either
218
- // physical representation of the local name is already taken, and picks the
219
- // form the new file takes.
220
- /** Normalize and validate a full canonical name: ordering prefixes are
221
- * physical-path-only, a trailing `INDEX` is never an address, and the segment
222
- * charset is fixed. */
223
- export function requireCanonicalName(rawName) {
224
- const name = canonicalSegments(rawName.trim()).join('/');
225
- if (name === '')
226
- throw usage('memory document name required');
227
- const valid = validateExplicitLocalName(name);
228
- if (!valid.ok) {
229
- throw usage(`invalid memory document name \`${rawName}\`: ${valid.reason}`, {
230
- received: rawName,
231
- next: 'Pass the full canonical name (a project document is <namespace>/<local name>); run `crtr memory find <leaf>` to look one up.',
232
- });
233
- }
234
- return name;
235
- }
236
- /** The store-local name a full canonical name has inside one exact store, or a
237
- * usage error when it falls outside that store's namespace. `''` names the
238
- * store's own root document — a project store answers at its namespace. */
239
- export function requireLocalNameInStore(store, rawName) {
240
- requireMountedStore(store);
241
- const name = requireCanonicalName(rawName);
242
- if (store.namespace === '')
243
- return name;
244
- const local = stripNamespace(name, store.namespace);
245
- if (local === null) {
246
- throw usage(`\`${name}\` is not in the namespace of the store at ${store.storeRoot} (\`${store.namespace}\`)`, {
247
- memory: name,
248
- next: `Every document there answers at \`${store.namespace}/<local name>\`; the store's own document answers at \`${store.namespace}\`.`,
249
- });
250
- }
251
- return local;
252
- }
253
- /** Where a NEW document (a `write`, a `move` destination) physically lands in
254
- * one exact store, after proving the canonical identity is free.
255
- *
256
- * Both physical forms carry the same identity, so occupancy is checked against
257
- * the loaded identities AND both `<local>.md` and `<local>/INDEX.md` — a file
258
- * whose explicit `name:` points elsewhere still owns its path. The chosen form
259
- * is `<local>/INDEX.md` when the canonical directory already has descendants
260
- * in this store (the document fronts a directory that exists), else
261
- * `<local>.md`; descendants created later never relocate it, because either
262
- * form validly owns the identity. Pass `storeDocs` when the caller already
263
- * loaded the store, and `source` when planning a move, whose own identity and
264
- * file are being vacated. */
265
- export function planNewDocumentPlacement(store, rawName, storeDocs, source) {
266
- const localName = requireLocalNameInStore(store, rawName);
267
- const canonicalName = requireCanonicalName(rawName);
268
- const docs = storeDocs ?? loadStoreMemoryDocs(store, true);
269
- // A move's own source occupies neither the identity nor the path it is
270
- // vacating: retiring an explicit `name:` pin back to the file's path-derived
271
- // identity lands the document exactly where it already sits.
272
- const sourceReal = source === undefined ? null : realpathOrSelf(source.path);
273
- const owner = docs.find((d) => d.name === canonicalName && realpathOrSelf(d.path) !== sourceReal);
274
- if (owner !== undefined) {
275
- throw usage(`${canonicalName} already exists in ${store.storeRoot}`, {
276
- memory: canonicalName,
277
- path: owner.path,
278
- next: `Revise it with \`crtr memory edit ${canonicalName}\`, which records the change, or move it with \`crtr memory move\`.`,
279
- });
280
- }
281
- const forms = localName === '' ? ['directory-index'] : ['directory-index', 'leaf-file'];
282
- const taken = forms
283
- .map((representation) => join(store.storeRoot, physicalRelativePathFor(localName, representation)))
284
- .filter((path) => pathExists(path) && realpathOrSelf(path) !== sourceReal);
285
- if (taken.length > 0) {
286
- throw usage(`${canonicalName} cannot be created: ${taken.join(' and ')} already exists`, {
287
- memory: canonicalName,
288
- path: taken.join(', '),
289
- next: 'Both `<name>.md` and `<name>/INDEX.md` carry that identity. Read the existing file, then edit, move, or delete it.',
290
- });
291
- }
292
- const representation = localName === '' || docs.some((d) => d.localName.startsWith(`${localName}/`)) ? 'directory-index' : 'leaf-file';
293
- const physicalRelativePath = physicalRelativePathFor(localName, representation);
294
- return {
295
- store,
296
- canonicalName,
297
- localName,
298
- representation,
299
- physicalRelativePath,
300
- path: join(store.storeRoot, physicalRelativePath),
301
- };
302
- }
303
- /** The document a mutation acts on, refusing an identity two files in ONE
304
- * store both own. Reads stay answerable (`<name>/INDEX.md` deterministically
305
- * wins), but a mutation would silently pick one of two files, so it stops with
306
- * both paths. Candidates in OTHER stores are ordinary alternates — precedence
307
- * picked the winner and `--dir` reaches the rest. */
308
- export function requireUnambiguousDoc(set) {
309
- const winner = set.winner;
310
- const sameStore = set.candidates.filter((d) => d.store.storeRoot === winner.store.storeRoot);
311
- if (sameStore.length > 1) {
312
- throw usage(`${set.name} is owned by ${sameStore.length} files in one store: ${sameStore.map((d) => d.path).join(' and ')}`, {
313
- memory: set.name,
314
- path: sameStore.map((d) => d.path).join(', '),
315
- next: `Recover the collision with \`crtr memory move ${set.name} --to <new-free-name>\`; it selects the first physical path in stable lexical order. Do not remove files by hand; \`crtr memory lint\` reports every such collision.`,
316
- });
317
- }
318
- return winner;
319
- }
320
- export function selectMutationDoc(set) {
321
- const sameStore = set.candidates.filter((d) => d.store.storeRoot === set.winner.store.storeRoot);
322
- const ordered = [...sameStore].sort((a, b) => {
323
- const byRelativePath = a.physicalRelativePath.localeCompare(b.physicalRelativePath);
324
- return byRelativePath !== 0 ? byRelativePath : a.path.localeCompare(b.path);
325
- });
326
- return {
327
- doc: ordered[0] ?? set.winner,
328
- collisionPaths: ordered.length > 1 ? ordered.map((d) => d.path) : [],
329
- };
330
- }
331
- /** Remove a just-removed file's now-empty parent directories up to (never
332
- * including) its store root, so removing the last entry under an `area/`
333
- * prefix does not orphan an empty directory. `pathSegments` counts the
334
- * PHYSICAL store-relative path (`doc.physicalRelativePath.split('/').length`),
335
- * never the canonical name, which carries the store's namespace on top of it —
336
- * the same count addresses a `.history/<path>.jsonl` sidecar. Stops at the
337
- * first non-empty ancestor. */
338
- export function pruneEmptyParents(filePath, pathSegments) {
339
- let treeRoot = filePath;
340
- for (let i = 0; i < pathSegments; i += 1)
341
- treeRoot = dirname(treeRoot);
342
- let dir = dirname(filePath);
343
- while (dir !== treeRoot && dir.startsWith(treeRoot) && existsSync(dir) && readdirSync(dir).length === 0) {
344
- rmdirSync(dir);
345
- dir = dirname(dir);
346
- }
347
- }
348
- /** Map a STORE-LOCAL name (`topic`, `area/topic`, `INDEX`) to its file path
349
- * under a memory dir, guarding against traversal/absolute escapes. Physical
350
- * mapping only: it composes no namespace and collapses no `INDEX`, so a
351
- * canonical name reaches it through `planNewDocumentPlacement`. */
352
- export function memoryFilePath(memoryDir, name) {
353
- const segments = name.split('/').filter((s) => s.length > 0);
354
- if (segments.length === 0)
355
- throw usage('memory document name required');
356
- if (segments.some((s) => s === '.' || s === '..')) {
357
- throw usage(`invalid memory document name: ${name}`);
358
- }
359
- return join(memoryDir, ...segments) + '.md';
360
- }
361
- /** Coerce a `--gate` string into a predicate tree. The gate field MUST be a
362
- * YAML/JSON object (the field→matcher map the schema expects). Throws a usage
363
- * error when the input fails to parse or does not parse to a non-null,
364
- * non-array object — a scalar or array gate silently makes a doc never-eligible
365
- * (the matcher engine ignores non-object predicates), so passing one is always
366
- * a mistake and must be caught at authoring time rather than stored. */
367
- function parseYamlObject(raw) {
368
- const parsed = yamlParse(raw);
369
- if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
370
- return parsed;
371
- }
372
- return `expected an object, got ${JSON.stringify(parsed)}`;
373
- }
374
- export function coerceGate(raw) {
375
- const result = parseYamlObject(raw);
376
- if (typeof result === 'string') {
377
- throw usage(`--gate must be a YAML/JSON object (field→matcher map): ${result}. ` +
378
- `Example: --gate '{kind: design}' or --gate '{orchestration.depth: {gte: 2}}'`);
379
- }
380
- return result;
381
- }
382
- // The frontmatter keys one `surfaces` entry may carry.
383
- const SURFACE_ENTRY_KEYS = new Set(['on', 'match', 'match-frontmatter', 'gate', 'at']);
384
- /** Coerce one `--surface` value into a validated surfaces entry. Strict where
385
- * the runtime parser is tolerant: a flag that would be silently dropped or
386
- * trimmed at render time is an authoring mistake and fails HERE. The entry is
387
- * returned in canonical key order with a single glob kept as a bare string,
388
- * so the stored YAML stays as compact as the flag that authored it. */
389
- export function coerceSurface(raw) {
390
- const parsed = yamlParse(raw);
391
- if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
392
- throw usage(`--surface must be a YAML/JSON object entry {on, at, match?, match-frontmatter?, gate?}, got ${JSON.stringify(parsed)}. ` +
393
- `Example: --surface '{on: read, match: "src/**", at: content}'`);
394
- }
395
- const rec = parsed;
396
- for (const key of Object.keys(rec)) {
397
- if (!SURFACE_ENTRY_KEYS.has(key)) {
398
- throw usage(`--surface: unknown key \`${key}\` (an entry carries only on, match, match-frontmatter, gate, at)`);
399
- }
400
- }
401
- const on = rec['on'];
402
- if (typeof on !== 'string' || !SURFACE_EVENTS.includes(on)) {
403
- throw usage(`--surface: invalid \`on\`: ${JSON.stringify(on)} (expected ${SURFACE_EVENTS.join('|')})`);
404
- }
405
- const at = rec['at'];
406
- if (typeof at !== 'string' || !SURFACE_RUNGS.includes(at)) {
407
- throw usage(`--surface: invalid \`at\`: ${JSON.stringify(at)} (expected ${SURFACE_RUNGS.join('|')})`);
408
- }
409
- let match;
410
- if (rec['match'] !== undefined) {
411
- if (on === 'boot' || on === 'workspace-open') {
412
- throw usage(`--surface: \`match\` is meaningless on \`${on}\` — the entry's presence is the match; drop it`);
413
- }
414
- if (typeof rec['match'] === 'string') {
415
- const t = rec['match'].trim();
416
- if (t === '')
417
- throw usage('--surface: `match` must be a non-empty glob or a non-empty glob list');
418
- match = t;
419
- }
420
- else if (Array.isArray(rec['match'])) {
421
- const globs = rec['match'].map((g) => (typeof g === 'string' ? g.trim() : ''));
422
- if (globs.length === 0 || globs.some((g) => g === '')) {
423
- throw usage('--surface: `match` must be a non-empty glob or a non-empty glob list');
424
- }
425
- match = globs.length === 1 ? globs[0] : globs;
426
- }
427
- else {
428
- throw usage(`--surface: invalid \`match\`: ${JSON.stringify(rec['match'])} (expected a glob string or list)`);
429
- }
430
- }
431
- const matchFrontmatter = rec['match-frontmatter'];
432
- if (matchFrontmatter !== undefined) {
433
- if (on !== 'read')
434
- throw usage('--surface: `match-frontmatter` is a `read`-event predicate only');
435
- if (matchFrontmatter === null || typeof matchFrontmatter !== 'object' || Array.isArray(matchFrontmatter)) {
436
- throw usage(`--surface: invalid \`match-frontmatter\`: ${JSON.stringify(matchFrontmatter)} (expected a field→matcher object)`);
437
- }
438
- }
439
- if ((on === 'read' || on === 'memory-read' || on === 'command' || on === 'pre-command') && match === undefined && matchFrontmatter === undefined) {
440
- throw usage(`--surface: a \`${on}\` entry requires \`match\`${on === 'read' ? ' or `match-frontmatter`' : ''}`);
441
- }
442
- const gate = rec['gate'];
443
- if (gate !== undefined && (gate === null || typeof gate !== 'object' || Array.isArray(gate))) {
444
- throw usage(`--surface: invalid \`gate\`: ${JSON.stringify(gate)} (expected a field→matcher object)`);
445
- }
446
- return {
447
- on,
448
- ...(match !== undefined ? { match } : {}),
449
- ...(matchFrontmatter !== undefined ? { 'match-frontmatter': matchFrontmatter } : {}),
450
- ...(gate !== undefined ? { gate } : {}),
451
- at,
452
- };
453
- }
454
- // Canonical frontmatter field order for a substrate document. Known fields come
455
- // first in this order; any preserved-on-update extras append after. `origin` is
456
- // provenance the runtime stamps at creation (never the author) — it sorts last
457
- // of the known fields so the authoring contract stays at the top of the block.
458
- const FRONTMATTER_ORDER = [
459
- 'kind',
460
- 'when-and-why-to-read',
461
- 'short-form',
462
- 'unlisted',
463
- 'surfaces',
464
- 'gate',
465
- 'slash',
466
- 'rationale',
467
- 'lint-ignore',
468
- 'last-updated',
469
- 'origin',
470
- ];
471
- /** Provenance for a doc at the moment it is created: when, where, and which
472
- * node's conversation authored it. Read from the env the runtime injects into
473
- * every node's pi process (CRTR_NODE_ID/KIND/MODE/NODE_CWD); when invoked
474
- * outside a node (a human at the CLI) only `created` + `cwd` are recorded.
475
- * Stamped ONCE at create and preserved verbatim on every later update —
476
- * `crtr memory origin <name>` derefs the `node` pointer back to the live node
477
- * (its session conversation, context dir, current state). */
478
- export function buildOrigin() {
479
- const env = process.env;
480
- const origin = {
481
- created: new Date().toISOString(),
482
- cwd: env['CRTR_NODE_CWD'] ?? process.cwd(),
483
- };
484
- const nodeId = env['CRTR_NODE_ID'];
485
- if (nodeId !== undefined && nodeId !== '')
486
- origin['node'] = nodeId;
487
- return origin;
488
- }
489
- /** Serialize a substrate frontmatter record + body into a complete `.md`
490
- * document. Frontmatter is emitted as a `---` fenced YAML block (the `yaml`
491
- * package — the same one the parser uses — so nested gate maps and surfaces
492
- * entry lists round-trip), in canonical field order with preserved extras last. */
493
- export function serializeMemoryDoc(frontmatter, body) {
494
- const ordered = {};
495
- for (const key of FRONTMATTER_ORDER) {
496
- if (frontmatter[key] !== undefined)
497
- ordered[key] = frontmatter[key];
498
- }
499
- for (const key of Object.keys(frontmatter)) {
500
- if (!(key in ordered) && frontmatter[key] !== undefined)
501
- ordered[key] = frontmatter[key];
502
- }
503
- const yamlText = yamlStringify(ordered).replace(/\n+$/, '');
504
- const cleanBody = body.replace(/^\n+/, '').replace(/\s+$/, '');
505
- return `---\n${yamlText}\n---\n\n${cleanBody}\n`;
506
- }
507
- // Structure only: the closing fence tolerates trailing spaces/tabs but never
508
- // consumes the newlines or indentation that open the body. `parseFrontmatterGeneric`
509
- // closes on `\s*`, which eats them — fine for reading a doc, lossy for rewriting one.
510
- const LITERAL_FENCE_RE = /^---[ \t]*\r?\n[\s\S]*?\r?\n---[ \t]*(?:\r?\n|$)/;
511
- /** Everything after the closing frontmatter fence, byte for byte — leading blank
512
- * lines and indentation intact. Source without a fence is all body. */
513
- export function literalBodySegment(source) {
514
- const match = source.match(LITERAL_FENCE_RE);
515
- return match ? source.slice(match[0].length) : source;
516
- }
517
- /** Serialize a document WITHOUT touching the body. `bodySegment` is everything
518
- * after the closing frontmatter fence (leading blank line included), emitted
519
- * byte for byte. This is the revision path: `edit` saves what it was given, so
520
- * an unchanged doc round-trips identically and a supplied body reaches disk
521
- * untransformed. Creation uses `serializeMemoryDoc`, which normalizes a first
522
- * body into the canonical shape. */
523
- export function serializeMemoryDocLiteral(frontmatter, bodySegment) {
524
- const ordered = {};
525
- for (const key of FRONTMATTER_ORDER) {
526
- if (frontmatter[key] !== undefined)
527
- ordered[key] = frontmatter[key];
528
- }
529
- for (const key of Object.keys(frontmatter)) {
530
- if (!(key in ordered) && frontmatter[key] !== undefined)
531
- ordered[key] = frontmatter[key];
532
- }
533
- const yamlText = yamlStringify(ordered).replace(/\n+$/, '');
534
- return `---\n${yamlText}\n---\n${bodySegment}`;
535
- }
536
- /** Resolve declarations at the same scope and path a document will use. The
537
- * catalog intentionally includes disabled plugins: they still authorize typed
538
- * edits to values that stay inert until their plugin is enabled again. */
539
- export function memoryExtensionCatalogForDoc(doc) {
540
- return memoryExtensionValidationCatalog(doc);
541
- }
542
- function declarationValueDescription(declaration) {
543
- if (declaration.type !== 'enum')
544
- return declaration.type;
545
- return `enum (${declaration.values.join('|')})`;
546
- }
547
- function extensionHelpValue(value) {
548
- return typeof value === 'string' ? JSON.stringify(value) : String(value);
549
- }
550
- /** A bounded declaration catalog for the two authoring leaves. The manifest is
551
- * the source for both the type and operation-specific guidance. */
552
- export function memoryExtensionFieldCatalogHelp(operation) {
553
- const scope = projectScopeRoot() === null ? 'user' : 'project';
554
- const memoryDir = scopeMemoryDir(scope);
555
- if (memoryDir === null)
556
- return null;
557
- const catalog = memoryExtensionCatalogForDoc({ scope, path: join(memoryDir, '.extension-help.md') });
558
- const fields = Object.entries(catalog)
559
- .flatMap(([namespace, declarations]) => Object.entries(declarations).map(([field, declaration]) => ({ namespace, field, declaration })))
560
- .sort((left, right) => `${left.namespace}.${left.field}`.localeCompare(`${right.namespace}.${right.field}`));
561
- if (fields.length === 0)
562
- return null;
563
- const maxRows = 50;
564
- const rows = fields.slice(0, maxRows).map(({ namespace, field, declaration }) => {
565
- const defaultValue = declaration.default === undefined ? '' : `; default ${extensionHelpValue(declaration.default)}`;
566
- const help = operation === 'write' ? declaration.write_help : declaration.edit_help;
567
- return `- \`extensions.${namespace}.${field}\` — ${declarationValueDescription(declaration)}${defaultValue}. ${help}`;
568
- });
569
- if (fields.length > maxRows)
570
- rows.push(`- ${fields.length - maxRows} additional declared fields omitted from help.`);
571
- return stateBlock('memory-extension-fields', { count: fields.length }, rows.join('\n'));
572
- }
573
- function parseExtensionPath(raw, flag) {
574
- const match = /^extensions\.([^.]+)\.([^.]+)$/.exec(raw);
575
- if (match === null)
576
- return `${flag} requires the full path extensions.<plugin>.<field>: ${raw}`;
577
- return { path: raw, namespace: match[1], field: match[2] };
578
- }
579
- function parseExtensionValue(path, raw, declaration) {
580
- if (declaration.type === 'boolean') {
581
- if (raw === 'true')
582
- return true;
583
- if (raw === 'false')
584
- return false;
585
- return `${path} expects boolean true or false, received ${JSON.stringify(raw)}`;
586
- }
587
- if (declaration.type === 'number') {
588
- if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(raw)) {
589
- return `${path} expects finite numeric syntax, received ${JSON.stringify(raw)}`;
590
- }
591
- const value = Number(raw);
592
- return Number.isFinite(value) ? value : `${path} expects a finite number, received ${JSON.stringify(raw)}`;
593
- }
594
- if (declaration.type === 'enum' && !declaration.values.includes(raw)) {
595
- return `${path} expects one of ${declaration.values.join('|')}, received ${JSON.stringify(raw)}`;
596
- }
597
- return raw;
598
- }
599
- /** Parse every requested extension mutation before the caller constructs any
600
- * frontmatter. Set values are deliberately declaration-typed rather than YAML. */
601
- export function parseRequestedExtensionChanges(setRaw, unsetRaw, catalog) {
602
- const errors = [];
603
- const sets = [];
604
- const unsets = [];
605
- const setPaths = new Set();
606
- const unsetPaths = new Set();
607
- for (const raw of setRaw ?? []) {
608
- const delimiter = raw.indexOf('=');
609
- if (delimiter < 0) {
610
- errors.push(`--extension requires extensions.<plugin>.<field>=VALUE: ${raw}`);
611
- continue;
612
- }
613
- const parsedPath = parseExtensionPath(raw.slice(0, delimiter), '--extension');
614
- if (typeof parsedPath === 'string') {
615
- errors.push(parsedPath);
616
- continue;
617
- }
618
- if (setPaths.has(parsedPath.path)) {
619
- errors.push(`duplicate --extension path: ${parsedPath.path}`);
620
- continue;
621
- }
622
- setPaths.add(parsedPath.path);
623
- const declaration = catalog[parsedPath.namespace]?.[parsedPath.field];
624
- if (declaration === undefined) {
625
- errors.push(`${parsedPath.path} is not declared by an installed plugin`);
626
- continue;
627
- }
628
- const value = parseExtensionValue(parsedPath.path, raw.slice(delimiter + 1), declaration);
629
- if (typeof value === 'string' && declaration.type !== 'string' && declaration.type !== 'enum') {
630
- errors.push(value);
631
- continue;
632
- }
633
- if (typeof value === 'string' && declaration.type === 'enum' && !declaration.values.includes(value)) {
634
- errors.push(`${parsedPath.path} expects one of ${declaration.values.join('|')}, received ${JSON.stringify(value)}`);
635
- continue;
636
- }
637
- sets.push({ ...parsedPath, value });
638
- }
639
- for (const raw of unsetRaw ?? []) {
640
- const parsedPath = parseExtensionPath(raw, '--unset-extension');
641
- if (typeof parsedPath === 'string') {
642
- errors.push(parsedPath);
643
- continue;
644
- }
645
- if (unsetPaths.has(parsedPath.path)) {
646
- errors.push(`duplicate --unset-extension path: ${parsedPath.path}`);
647
- continue;
648
- }
649
- unsetPaths.add(parsedPath.path);
650
- if (catalog[parsedPath.namespace]?.[parsedPath.field] === undefined) {
651
- errors.push(`${parsedPath.path} is not declared by an installed plugin`);
652
- continue;
653
- }
654
- unsets.push(parsedPath);
655
- }
656
- for (const path of setPaths) {
657
- if (unsetPaths.has(path))
658
- errors.push(`${path} was requested in both --extension and --unset-extension`);
659
- }
660
- if (errors.length > 0) {
661
- throw usage(`invalid plugin memory extension request:\n- ${errors.join('\n- ')}`, {
662
- received: [...(setRaw ?? []), ...(unsetRaw ?? [])].join(', '),
663
- next: 'Run `crtr memory write -h` or `crtr memory edit -h` for the installed field catalog and value syntax.',
664
- });
665
- }
666
- return { sets, unsets };
667
- }
668
- /** Apply only requested extension paths. Existing unknown namespaces remain
669
- * untouched; an unset prunes the empty namespace and empty root mapping. */
670
- export function applyExtensionChanges(frontmatter, sets, unsets) {
671
- if (sets.length === 0 && unsets.length === 0)
672
- return;
673
- const current = frontmatter['extensions'];
674
- if (current !== undefined && (current === null || typeof current !== 'object' || Array.isArray(current))) {
675
- throw usage('existing extensions frontmatter must be a mapping before extension fields can be changed', {
676
- received: JSON.stringify(current),
677
- next: 'Repair the extensions mapping, or make a core-field-only edit that preserves it unchanged.',
678
- });
679
- }
680
- const extensions = { ...(current ?? {}) };
681
- for (const set of sets) {
682
- const existing = extensions[set.namespace];
683
- if (existing !== undefined && (existing === null || typeof existing !== 'object' || Array.isArray(existing))) {
684
- throw usage(`existing ${`extensions.${set.namespace}`} frontmatter must be a mapping before ${set.path} can change`, {
685
- received: JSON.stringify(existing),
686
- next: 'Repair the namespace mapping, or make a core-field-only edit that preserves it unchanged.',
687
- });
688
- }
689
- extensions[set.namespace] = { ...(existing ?? {}), [set.field]: set.value };
690
- }
691
- for (const unset of unsets) {
692
- const existing = extensions[unset.namespace];
693
- if (existing === undefined)
694
- continue;
695
- if (existing === null || typeof existing !== 'object' || Array.isArray(existing)) {
696
- throw usage(`existing ${`extensions.${unset.namespace}`} frontmatter must be a mapping before ${unset.path} can change`, {
697
- received: JSON.stringify(existing),
698
- next: 'Repair the namespace mapping, or make a core-field-only edit that preserves it unchanged.',
699
- });
700
- }
701
- const fields = { ...existing };
702
- delete fields[unset.field];
703
- if (Object.keys(fields).length === 0)
704
- delete extensions[unset.namespace];
705
- else
706
- extensions[unset.namespace] = fields;
707
- }
708
- if (Object.keys(extensions).length === 0)
709
- delete frontmatter['extensions'];
710
- else
711
- frontmatter['extensions'] = extensions;
712
- }
713
- // Help material shared by `write` and `edit`
714
- //
715
- // Single-sourced: both leaves compose these, so a wording fix lands on both.
716
- // Anything exclusive to one leaf (creation rules on `write`, the rationale
717
- // contract on `edit`) stays owned by that leaf.
718
- /** The frontmatter-overlay flags, keyed by flag name, carrying the prose true
719
- * on BOTH leaves. `write` appends its creation clauses with `withConstraint`;
720
- * neither leaf restates the other's rules. */
721
- /** The selector flags, keyed by flag name, carrying the prose true on every
722
- * leaf that accepts them. A leaf appends its own clause with `selectorParam`;
723
- * none of them restates the shared rules. */
724
- export const SELECTOR_PARAMS = {
725
- 'scope-read': {
726
- kind: 'flag',
727
- name: 'scope',
728
- type: 'enum',
729
- choices: [...MEMORY_READ_SCOPES],
730
- required: false,
731
- constraint: 'Restrict resolution to one source class. A source filter only: the name stays the full canonical name, and project scope keeps its nearest-first precedence. Conflicts with --dir, which selects one exact store instead.',
732
- },
733
- 'scope-write': {
734
- kind: 'flag',
735
- name: 'scope',
736
- type: 'enum',
737
- choices: [...MEMORY_WRITE_SCOPES],
738
- required: false,
739
- constraint: 'Store to write to (package-shipped documents and installed-plugin documents are managed outside this command, so neither is writable). Default: project when cwd sits in a project, else user. `project` resolves to the NEAREST ancestor `.crouter/` walking up from cwd — in a nested workspace that can be a parent’s store, not the dir you are standing in; pass --dir to pin the exact project. `profile` requires a selected profile (CRTR_PROFILE_ID) or an explicit --profile. `node` writes the this-node store (`nodes/<CRTR_NODE_ID>/context/memory/`), the nearest scope, seen only by this running node. Conflicts with --dir.',
740
- },
741
- 'dir': {
742
- kind: 'flag',
743
- name: 'dir',
744
- type: 'string',
745
- required: false,
746
- constraint: 'Exact project directory to operate in — selects `<dir>/.crouter/memory/` by realpath, regardless of cwd, ancestor stores, or which store a target view would pick. THE way to reach one specific project store: another project in your profile’s purview, a store shadowed by an ancestor, or a non-winning duplicate such as a linked worktree that declares the same namespace as its main checkout. The name is still the FULL canonical name — the repository namespace plus that store’s path under the repository root, plus the store-local name. It selects the store itself, so it conflicts with any explicit --scope and with --profile.',
747
- },
748
- 'profile': {
749
- kind: 'flag',
750
- name: 'profile',
751
- type: 'string',
752
- required: false,
753
- constraint: 'Profile id or name to target, for --scope profile. Names that profile’s store exactly, whichever profile this process runs under. Default: the process CRTR_PROFILE_ID (the node’s selected profile). Resolved through the same profile lookup as `crtr profile show`. Rejected (usage error) unless --scope profile is also selected — never silently ignored for another scope — and rejected with --dir.',
754
- },
755
- };
756
- /** One selector flag, with leaf-specific prose appended to the shared
757
- * constraint and any leaf-specific schema override applied. */
758
- export function selectorParam(name, overrides = {}, extraConstraint) {
759
- const base = SELECTOR_PARAMS[name];
760
- if (base === undefined)
761
- throw new Error(`unknown selector param: ${name}`);
762
- const constraint = extraConstraint === undefined ? base.constraint : `${base.constraint} ${extraConstraint}`;
763
- return { ...base, ...overrides, constraint };
764
- }
765
- export function coerceLintIgnore(raw) {
766
- if (raw === undefined)
767
- return undefined;
768
- const rules = Array.isArray(raw) ? raw : [raw];
769
- if (rules.length === 0 || rules.some((rule) => typeof rule !== 'string' || !SUPPRESSIBLE_RULES.includes(rule))) {
770
- throw usage(`invalid lint-ignore: ${JSON.stringify(raw)} (suppressible rules: ${SUPPRESSIBLE_RULES.map((rule) => `\`${rule}\``).join(', ')})`);
771
- }
772
- return rules.length === 1 ? rules[0] : rules;
773
- }
774
- export const FRONTMATTER_OVERLAY_PARAMS = {
775
- 'kind': { kind: 'flag', name: 'kind', type: 'enum', choices: [...MEMORY_KINDS], required: false, constraint: 'Document kind.' },
776
- 'when-and-why-to-read': { kind: 'flag', name: 'when-and-why-to-read', type: 'string', required: false, constraint: 'ONE routing sentence: "When <circumstance>, this <kind> should be read because <broader downstream payoff>." WHY is the reader\u2019s payoff \u2014 the consequence they secure for their task by reading \u2014 NEVER the doc summary, its rule, or that rule reworded as an outcome (a benefit-shaped restatement still fails). Rendered verbatim as the preview.' },
777
- 'short-form': { kind: 'flag', name: 'short-form', type: 'string', required: false, constraint: 'Frontmatter short-form \u2014 a very abbreviated version of the content, the hook shown in `crtr memory list`.' },
778
- 'unlisted': { kind: 'flag', name: 'unlisted', type: 'bool', required: false, default: false, constraint: 'Suppress this doc from directory listings. Suppression only — explicit reads, [[links]], and surfaces entries still work.' },
779
- 'surface': { kind: 'flag', name: 'surface', type: 'string', required: false, repeatable: true, constraint: 'One routing entry per occurrence, as a YAML/JSON object `{on, at, match?, match-frontmatter?, gate?}`; the flag set replaces the document’s whole surfaces list. `on` is boot|workspace-open|read|memory-read|command|pre-command; `at` is name|preview|content. `match` holds the event’s globs — required on read/memory-read/command/pre-command (a read entry may carry `match-frontmatter`, a predicate over the read file’s own frontmatter, instead), meaningless on boot/workspace-open. Optional entry `gate` is a node-config predicate using the same vocabulary as the document gate; its event constraints and gate both match before it participates. A `./`-anchored glob is relative: for `read` to the store’s owning repo dir, for `memory-read` to this doc’s routing anchor — its own canonical name when the doc is its directory’s document (`<dir>/INDEX.md`), otherwise the canonical directory it sits in. Participating entries fold to their highest `at`; there is no cross-entry deny precedence.' },
780
- 'gate': { kind: 'flag', name: 'gate', type: 'string', required: false, constraint: 'Frontmatter gate \u2014 YAML/JSON object predicate over node config using the same field/matcher vocabulary described in the guide.' },
781
- 'lint-ignore': { kind: 'flag', name: 'lint-ignore', type: 'enum', choices: [...SUPPRESSIBLE_RULES], required: false, repeatable: true, constraint: 'Suppress one authoring lint rule for this document. Repeat for a list; valid rules: length, broad-memory-read, orphan.' },
782
- 'slash': { kind: 'flag', name: 'slash', type: 'bool', required: false, default: false, constraint: 'Presence flags this doc invocable as a pi slash command (`/<name>`, `/` in a nested name rendered as `:`) \u2014 the doc body becomes the command\u2019s injected prompt. Default false: most docs are consulted, not invoked.' },
783
- };
784
- /** One overlay flag, with leaf-specific prose appended to the shared
785
- * constraint and any leaf-specific schema override applied. */
786
- export function overlayParam(name, overrides = {}, extraConstraint) {
787
- const base = FRONTMATTER_OVERLAY_PARAMS[name];
788
- if (base === undefined)
789
- throw new Error(`unknown frontmatter overlay param: ${name}`);
790
- const constraint = extraConstraint === undefined ? base.constraint : `${base.constraint} ${extraConstraint}`;
791
- return { ...base, ...overrides, constraint };
792
- }
793
- /** The doc's standing `rationale` frontmatter field \u2014 the observed gap the doc
794
- * exists to close. `write` takes it as `--rationale`; `edit` takes it as
795
- * `--doc-rationale`, because `--rationale` there means why THIS REVISION is
796
- * happening. Same field, same prose, two flag names that cannot be confused. */
797
- export const DOC_RATIONALE_CONSTRAINT = 'Frontmatter rationale \u2014 the observed agent failure that made this doc necessary. Maintainer-facing only: never ships in any delivered surface (boot render, on-read injection, `memory read` content), visible only via `memory read --frontmatter`. Omitting the flag preserves an existing rationale unchanged.';
798
- export const GUIDE_SURFACES = 'Every doc appears in its directory’s listing by default (suppress with --unlisted); everything beyond the listing is explicit `surfaces` routing — entries declaring WHEN the doc delivers and how much. Events: `boot` delivers in the boot catalog every agent sees; `workspace-open` delivers in first-message context when cwd/profile mounts the doc’s project store (project stores only); `read` fires when the agent reads a matching file (globs vs the file’s absolute path and basename, `./`-anchored globs vs its path relative to the store’s owning repo dir, `match-frontmatter` predicates over the read file’s own YAML frontmatter); `memory-read` fires when another memory doc’s full body is delivered, including an explicit read (globs vs that doc’s canonical name, `./` anchored to this doc’s routing anchor — its own canonical name when it is its directory’s document, otherwise the canonical directory it sits in); `command` fires when a matching shell command runs (globs vs each shell segment of the command line — split on `&&`/`||`/`;`/`|`/newlines outside quotes, leading `VAR=value` assignments dropped — where `*` spans whole whitespace-separated tokens and never part of one, `?` is one character inside a token, and quoted argument text is opaque, so `*git commit*` fires for `cd x && git commit -m "…"` but not for `git commit-tree` or an `echo` that merely mentions it); `pre-command` fires BEFORE a matching bash command runs (same matching): when the memory has not been read yet, the command does not execute — the memory comes back as the tool result instead, and the agent re-issues the command, which then runs. Use it to guarantee a memory is seen before a sensitive action is taken. Requires `match`. An entry may also carry `gate`, a node-config predicate using the same vocabulary as the document-level `gate`: event constraints and entry gate both must match, then all participating entries fold to the highest `at` (`content` > `preview` > `name`), with no cross-entry deny precedence. The document-level `gate` remains the hard eligibility check: when it fails, no automatic surface can deliver the document. `at` sets how much delivers: `name` the bare tag, `preview` the routing line, `content` the whole body. Explicit `memory read` and listings remain deliberate access and ignore gates/rungs; only companion docs routed by their `memory-read` entries use entry gates. Each entry is paid by every future agent it fires on, so default down: no surfaces at all is correct for reference depth reached through listings and [[links]], and when a doc fits in a single sentence, deliver `content` directly — a `preview` routing line would run longer than the doc itself. Sentence-length `content` docs are correct; never pad a memory to be more verbose than the rule or fact it carries.';
799
- export const GUIDE_ROUTING_LINE = 'The routing line (--when-and-why-to-read) is the only text an agent reads before deciding to load the doc. The test for its when-clause: it names an observable circumstance in the reader\u2019s current work, not the doc\u2019s topic reworded as an activity. If the WHEN can be inferred from the title alone, it is not a real trigger. Bad on a todo list: "When planning or prioritizing work across this profile." Good: "When the user mentions something from their todos, or asks what is still outstanding across this profile." The test for its because-clause: if it can be derived by paraphrasing the doc\u2019s advice, it is a restatement, not a payoff \u2014 a real payoff names a consequence in the reader\u2019s world that the document itself never asserts. Bad: "because only genuine first principles belong in taste memory." Bad: "because keeping the test loop fast and free of speculative tests protects the development pace" \u2014 the doc\u2019s rule as an outcome, derivable straight from its advice. Good: "because identifying throughlines in user taste lets future decisions be made faster and with less re-litigation." Someone mid-task who has not read the doc must be able to decide from this line alone whether the read is worth it. If you cannot name the concrete situation that triggers it, you do not yet understand the memory \u2014 ask the user one sharp question instead of improvising.';
800
- export const GUIDE_PREDICATE_VOCABULARY = 'Document gates, surface-entry gates, and match-frontmatter share the same predicate language: a field map is AND-ed across fields; dotted fields resolve nested values; field matchers may be scalar, array, or object. Scalar matchers do exact equality, with arrays matching any element. Array matchers do membership or intersection. Object matchers accept `eq`, `ne`, `in`, `nin`, `exists`, `contains`, `containsAll`, `containsAny`, `matches`, `imatches`, `gt`, `gte`, `lt`, and `lte`. Combinators are `all`, `any`, and `not`; sibling field matchers next to them are AND-ed in. An empty condition is inert. An unknown op never matches.';
801
- export const GUIDE_DOC_LINKS = 'Link related docs with `[[canonical/name]]`. A doc link in any body is a first-class cross-reference to another memory document by its exact canonical name \u2014 the same identifier `crtr memory read` takes, namespace included for a project document. A bare directory name is a valid link too: following it returns that directory\u2019s own document when it has one, plus the directory listing. Links are pointers, never transclusion: the linked body is loaded only when a reader follows it, so a link costs nothing until needed. `crtr memory lint` fails on a link that resolves to no document or directory, and `crtr memory read` lists a doc\u2019s resolvable links alongside its body. There is no alias, label, or old-name form \u2014 a renamed target needs its links rewritten.';
802
- export const GUIDE_CANONICAL_NAMES = 'A document has exactly one address: its canonical name, the store\u2019s namespace composed with the document\u2019s store-local name. A repository declares its namespace once, as `namespace:` on the root `INDEX.md` of `<repository root>/.crouter/memory/`; a store nested inside that repository composes under the repository namespace plus its own directory path relative to the repository root, and declares nothing itself. An installed plugin\u2019s store mounts under the plugin\u2019s own name; user, profile, node, and builtin stores have no namespace, so their local names are already canonical. A local doc `unit-tests` in a store that declares `namespace: acme/core` therefore answers only at `acme/core/unit-tests`, and the store\u2019s root document answers at `acme/core`; a store at `packages/api/.crouter/memory/` in a repository declaring `namespace: acme` answers under `acme/packages/api`. A non-root explicit `name:` in frontmatter is store-LOCAL \u2014 it never carries the namespace, and composition is unconditional, so a name that merely looks prefixed is prefixed again. The namespace itself is immutable through the memory commands: `crtr memory write <namespace> --dir <repository root>` declares it once in an empty repository-root store, `crtr sys migrate --dir <repository root>` converts a legacy one, and nothing else rewrites it. A trailing `INDEX` is never part of an address in any store: `area/INDEX.md` is the document attached to directory `area`, so it answers at `area` and reading `area` returns that body together with the directory\u2019s immediate listing. Resolution is exact \u2014 a file path, a bare leaf, a `<scope>/<name>` spelling, and a trailing `/INDEX` all fail \u2014 so run `crtr memory find <leaf>` when you do not know the canonical name.';
1
+ var U=Object.defineProperty;var a=(e,n)=>U(e,"name",{value:n,configurable:!0});import{envNodeId as R,envProfileId as Y}from"../../shared/env.js";import{existsSync as E,readdirSync as W,realpathSync as V,rmdirSync as B,statSync as G}from"node:fs";import{dirname as g,join as y,resolve as H}from"node:path";import{stringify as S,parse as k}from"yaml";import{stateBlock as X}from"../../core/help.js";import{loadStoreMemoryDocs as z,openProjectMemoryStore as x}from"../../core/memory-resolver.js";import{canonicalSegments as K,physicalRelativePathFor as j,stripNamespace as Q,validateExplicitLocalName as Z}from"../../core/memory/identity.js";import{pathExists as O,realpathOrSelf as b}from"../../core/fs-utils.js";import{usage as s}from"../../core/errors.js";import{memoryExtensionValidationCatalog as ee}from"../../core/memory/extensions.js";import{CRTR_DIR_NAME as te}from"../../types.js";import{NEUTRAL_PROJECT_MEMORY as ne,scopeMemoryDir as N,projectScopeRoot as A,ensureProjectScopeRoot as oe,resetScopeCache as re}from"../../core/scope.js";import{loadProfileManifest as ie,resolveProfileOperand as D,profileMemoryDir as _}from"../../core/profiles/manifest.js";import{memoryDir as se}from"../../core/runtime/memory.js";import{SURFACE_EVENTS as I,SURFACE_RUNGS as C}from"../../core/substrate/schema.js";import{SUPPRESSIBLE_RULES as v}from"../../core/substrate/frontmatter-validation.js";import{exposureTarget as ae,loadContextExposureState as ce,registerExposure as de,saveContextExposureState as le}from"../../core/substrate/injected-store.js";const me=["knowledge","preference"],q=["user","project","profile","node","builtin"],$=["user","project","profile","node"],Ue=$;function Ye(e){return e==="node"?-1:e==="project"?0:e==="profile"?1:e==="user"?2:3}a(Ye,"scopeRank");function We(e){const n=R();if(n===void 0||n==="")return;const t=ce(n);de(ae(t,"transcript"),e,"content"),le(n,t)}a(We,"registerMemoryListingExposure");function T(e){if(e.scope!==void 0&&e.scope!=="")throw s(`--dir selects the project store itself and cannot combine with --scope ${e.scope}`,{received:`--dir ${e.dir} --scope ${e.scope}`,next:"Drop --scope: --dir already pins the exact project store."});if(e.profile!==void 0&&e.profile!=="")throw s("--profile only applies to --scope profile; --dir selects a project store",{received:e.profile,next:"Drop --profile when using --dir."})}a(T,"rejectDirConflicts");function P(e){const n=H(e);if(!E(n)||!G(n).isDirectory())throw s(`--dir does not exist or is not a directory: ${e}`,{received:e,next:"Pass an existing project directory."});try{return V(n)}catch{return n}}a(P,"ownerDirFromArg");function M(e,n){if(!(e===void 0||e==="")){if(!n.includes(e))throw s(`invalid --scope: ${e} (expected ${n.join("|")})`);return e}}a(M,"parseScope");function w(e,n){return{scope:e,storeRoot:n,namespace:"",mountStatus:O(n)?"ready":"absent",projectMemory:ne}}a(w,"nativeStoreDescriptor");function Ve(e){if(e.dir!==void 0&&e.dir!=="")return T(e),{store:x(P(e.dir))};if(e.profile!==void 0&&e.profile!==""&&e.scope!=="profile")throw s(`--profile only applies to --scope profile (received scope: ${e.scope??"none"})`,{received:e.profile,next:"Drop --profile, or pass --scope profile to target a specific profile store."});const n=M(e.scope,q);if(e.profile!==void 0&&e.profile!==""){const{profileId:t}=D(e.profile);return{scope:"profile",store:w("profile",_(t))}}return{...n===void 0?{}:{scope:n},store:null}}a(Ve,"resolveReadSelector");function pe(e){if(e.dir!==void 0&&e.dir!==""){T(e);const r=P(e.dir);return re(),{scope:"project",memoryDir:y(r,te,"memory"),store:x(r)}}const t=M(e.scope,$)??(A()!==null?"project":"user");if(e.profile!==void 0&&e.profile!==""&&t!=="profile")throw s(`--profile only applies to --scope profile (resolved scope: ${t})`,{received:e.profile,next:"Drop --profile, or pass --scope profile to target a specific profile store."});if(t==="node"){const r=R()||"";if(r==="")throw s("node scope requires a running node (CRTR_NODE_ID unset); rerun inside a node");const i=se(r);return{scope:t,memoryDir:i,store:w(t,i)}}if(t==="profile"){const r=e.profile!==void 0&&e.profile!=="",i=r?e.profile:Y()||"";if(i==="")throw s("profile scope requires a selected profile; rerun inside a profiled node or pass --profile");const{profileId:c}=r?D(i):ie(i),l=_(c);return{scope:t,memoryDir:l,store:w(t,l)}}let o=N(t);if(!o&&t==="project"&&(o=y(oe(),"memory")),!o)throw s(`no ${t} scope available for writing memory documents`);return t==="project"?{scope:t,memoryDir:o,store:x(g(g(o)))}:{scope:t,memoryDir:o,store:w(t,o)}}a(pe,"resolveWriteSelector");function Be(e,n,t){const{scope:o,memoryDir:r}=pe({scope:e,profile:n,dir:t});return{scope:o,memoryDir:r}}a(Be,"resolveWriteTarget");function fe(e){if(e.scope!=="project"||e.mountStatus==="ready")return e;const n=e.ownerDir??e.storeRoot;if(e.mountStatus==="absent")throw s(`no memory store at ${e.storeRoot}`,{next:`Initialize it with \`crtr memory write <namespace> --dir ${n}\`, which declares the repository namespace.`});const t=e.repositoryRoot??n;throw s(e.diagnostic??`project memory store at ${e.storeRoot} does not declare a namespace`,{next:`Run \`crtr sys migrate --dir ${t}\`.`})}a(fe,"requireMountedStore");function L(e){const n=K(e.trim()).join("/");if(n==="")throw s("memory document name required");const t=Z(n);if(!t.ok)throw s(`invalid memory document name \`${e}\`: ${t.reason}`,{received:e,next:"Pass the full canonical name (a project document is <namespace>/<local name>); run `crtr memory find <leaf>` to look one up."});return n}a(L,"requireCanonicalName");function he(e,n){fe(e);const t=L(n);if(e.namespace==="")return t;const o=Q(t,e.namespace);if(o===null)throw s(`\`${t}\` is not in the namespace of the store at ${e.storeRoot} (\`${e.namespace}\`)`,{memory:t,next:`Every document there answers at \`${e.namespace}/<local name>\`; the store's own document answers at \`${e.namespace}\`.`});return o}a(he,"requireLocalNameInStore");function Ge(e,n,t,o){const r=he(e,n),i=L(n),c=t??z(e,!0),l=o===void 0?null:b(o.path),d=c.find(u=>u.name===i&&b(u.path)!==l);if(d!==void 0)throw s(`${i} already exists in ${e.storeRoot}`,{memory:i,path:d.path,next:`Revise it with \`crtr memory edit ${i}\`, which records the change, or move it with \`crtr memory move\`.`});const p=(r===""?["directory-index"]:["directory-index","leaf-file"]).map(u=>y(e.storeRoot,j(r,u))).filter(u=>O(u)&&b(u)!==l);if(p.length>0)throw s(`${i} cannot be created: ${p.join(" and ")} already exists`,{memory:i,path:p.join(", "),next:"Both `<name>.md` and `<name>/INDEX.md` carry that identity. Read the existing file, then edit, move, or delete it."});const f=r===""||c.some(u=>u.localName.startsWith(`${r}/`))?"directory-index":"leaf-file",h=j(r,f);return{store:e,canonicalName:i,localName:r,representation:f,physicalRelativePath:h,path:y(e.storeRoot,h)}}a(Ge,"planNewDocumentPlacement");function He(e){const n=e.winner,t=e.candidates.filter(o=>o.store.storeRoot===n.store.storeRoot);if(t.length>1)throw s(`${e.name} is owned by ${t.length} files in one store: ${t.map(o=>o.path).join(" and ")}`,{memory:e.name,path:t.map(o=>o.path).join(", "),next:`Recover the collision with \`crtr memory move ${e.name} --to <new-free-name>\`; it selects the first physical path in stable lexical order. Do not remove files by hand; \`crtr memory lint\` reports every such collision.`});return n}a(He,"requireUnambiguousDoc");function Xe(e){const t=[...e.candidates.filter(o=>o.store.storeRoot===e.winner.store.storeRoot)].sort((o,r)=>{const i=o.physicalRelativePath.localeCompare(r.physicalRelativePath);return i!==0?i:o.path.localeCompare(r.path)});return{doc:t[0]??e.winner,collisionPaths:t.length>1?t.map(o=>o.path):[]}}a(Xe,"selectMutationDoc");function ze(e,n){let t=e;for(let r=0;r<n;r+=1)t=g(t);let o=g(e);for(;o!==t&&o.startsWith(t)&&E(o)&&W(o).length===0;)B(o),o=g(o)}a(ze,"pruneEmptyParents");function Ke(e,n){const t=n.split("/").filter(o=>o.length>0);if(t.length===0)throw s("memory document name required");if(t.some(o=>o==="."||o===".."))throw s(`invalid memory document name: ${n}`);return y(e,...t)+".md"}a(Ke,"memoryFilePath");function ue(e){const n=k(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:`expected an object, got ${JSON.stringify(n)}`}a(ue,"parseYamlObject");function Qe(e){const n=ue(e);if(typeof n=="string")throw s(`--gate must be a YAML/JSON object (field\u2192matcher map): ${n}. Example: --gate '{kind: design}' or --gate '{orchestration.depth: {gte: 2}}'`);return n}a(Qe,"coerceGate");const ye=new Set(["on","match","match-frontmatter","gate","at"]);function Ze(e){const n=k(e);if(n===null||typeof n!="object"||Array.isArray(n))throw s(`--surface must be a YAML/JSON object entry {on, at, match?, match-frontmatter?, gate?}, got ${JSON.stringify(n)}. Example: --surface '{on: read, match: "src/**", at: content}'`);const t=n;for(const d of Object.keys(t))if(!ye.has(d))throw s(`--surface: unknown key \`${d}\` (an entry carries only on, match, match-frontmatter, gate, at)`);const o=t.on;if(typeof o!="string"||!I.includes(o))throw s(`--surface: invalid \`on\`: ${JSON.stringify(o)} (expected ${I.join("|")})`);const r=t.at;if(typeof r!="string"||!C.includes(r))throw s(`--surface: invalid \`at\`: ${JSON.stringify(r)} (expected ${C.join("|")})`);let i;if(t.match!==void 0){if(o==="boot"||o==="workspace-open")throw s(`--surface: \`match\` is meaningless on \`${o}\` \u2014 the entry's presence is the match; drop it`);if(typeof t.match=="string"){const d=t.match.trim();if(d==="")throw s("--surface: `match` must be a non-empty glob or a non-empty glob list");i=d}else if(Array.isArray(t.match)){const d=t.match.map(m=>typeof m=="string"?m.trim():"");if(d.length===0||d.some(m=>m===""))throw s("--surface: `match` must be a non-empty glob or a non-empty glob list");i=d.length===1?d[0]:d}else throw s(`--surface: invalid \`match\`: ${JSON.stringify(t.match)} (expected a glob string or list)`)}const c=t["match-frontmatter"];if(c!==void 0){if(o!=="read")throw s("--surface: `match-frontmatter` is a `read`-event predicate only");if(c===null||typeof c!="object"||Array.isArray(c))throw s(`--surface: invalid \`match-frontmatter\`: ${JSON.stringify(c)} (expected a field\u2192matcher object)`)}if((o==="read"||o==="memory-read"||o==="command"||o==="pre-command")&&i===void 0&&c===void 0)throw s(`--surface: a \`${o}\` entry requires \`match\`${o==="read"?" or `match-frontmatter`":""}`);const l=t.gate;if(l!==void 0&&(l===null||typeof l!="object"||Array.isArray(l)))throw s(`--surface: invalid \`gate\`: ${JSON.stringify(l)} (expected a field\u2192matcher object)`);return{on:o,...i!==void 0?{match:i}:{},...c!==void 0?{"match-frontmatter":c}:{},...l!==void 0?{gate:l}:{},at:r}}a(Ze,"coerceSurface");const J=["kind","when-and-why-to-read","short-form","unlisted","surfaces","gate","slash","rationale","lint-ignore","last-updated","origin"];function et(){const e=process.env,n={created:new Date().toISOString(),cwd:e.CRTR_NODE_CWD??process.cwd()},t=e.CRTR_NODE_ID;return t!==void 0&&t!==""&&(n.node=t),n}a(et,"buildOrigin");function tt(e,n){const t={};for(const i of J)e[i]!==void 0&&(t[i]=e[i]);for(const i of Object.keys(e))!(i in t)&&e[i]!==void 0&&(t[i]=e[i]);const o=S(t).replace(/\n+$/,""),r=n.replace(/^\n+/,"").replace(/\s+$/,"");return`---
2
+ ${o}
3
+ ---
4
+
5
+ ${r}
6
+ `}a(tt,"serializeMemoryDoc");const ge=/^---[ \t]*\r?\n[\s\S]*?\r?\n---[ \t]*(?:\r?\n|$)/;function nt(e){const n=e.match(ge);return n?e.slice(n[0].length):e}a(nt,"literalBodySegment");function ot(e,n){const t={};for(const r of J)e[r]!==void 0&&(t[r]=e[r]);for(const r of Object.keys(e))!(r in t)&&e[r]!==void 0&&(t[r]=e[r]);return`---
7
+ ${S(t).replace(/\n+$/,"")}
8
+ ---
9
+ ${n}`}a(ot,"serializeMemoryDocLiteral");function we(e){return ee(e)}a(we,"memoryExtensionCatalogForDoc");function xe(e){return e.type!=="enum"?e.type:`enum (${e.values.join("|")})`}a(xe,"declarationValueDescription");function be(e){return typeof e=="string"?JSON.stringify(e):String(e)}a(be,"extensionHelpValue");function rt(e){const n=A()===null?"user":"project",t=N(n);if(t===null)return null;const o=we({scope:n,path:y(t,".extension-help.md")}),r=Object.entries(o).flatMap(([l,d])=>Object.entries(d).map(([m,p])=>({namespace:l,field:m,declaration:p}))).sort((l,d)=>`${l.namespace}.${l.field}`.localeCompare(`${d.namespace}.${d.field}`));if(r.length===0)return null;const i=50,c=r.slice(0,i).map(({namespace:l,field:d,declaration:m})=>{const p=m.default===void 0?"":`; default ${be(m.default)}`,f=e==="write"?m.write_help:m.edit_help;return`- \`extensions.${l}.${d}\` \u2014 ${xe(m)}${p}. ${f}`});return r.length>i&&c.push(`- ${r.length-i} additional declared fields omitted from help.`),X("memory-extension-fields",{count:r.length},c.join(`
10
+ `))}a(rt,"memoryExtensionFieldCatalogHelp");function F(e,n){const t=/^extensions\.([^.]+)\.([^.]+)$/.exec(e);return t===null?`${n} requires the full path extensions.<plugin>.<field>: ${e}`:{path:e,namespace:t[1],field:t[2]}}a(F,"parseExtensionPath");function ve(e,n,t){if(t.type==="boolean")return n==="true"?!0:n==="false"?!1:`${e} expects boolean true or false, received ${JSON.stringify(n)}`;if(t.type==="number"){if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n))return`${e} expects finite numeric syntax, received ${JSON.stringify(n)}`;const o=Number(n);return Number.isFinite(o)?o:`${e} expects a finite number, received ${JSON.stringify(n)}`}return t.type==="enum"&&!t.values.includes(n)?`${e} expects one of ${t.values.join("|")}, received ${JSON.stringify(n)}`:n}a(ve,"parseExtensionValue");function it(e,n,t){const o=[],r=[],i=[],c=new Set,l=new Set;for(const d of e??[]){const m=d.indexOf("=");if(m<0){o.push(`--extension requires extensions.<plugin>.<field>=VALUE: ${d}`);continue}const p=F(d.slice(0,m),"--extension");if(typeof p=="string"){o.push(p);continue}if(c.has(p.path)){o.push(`duplicate --extension path: ${p.path}`);continue}c.add(p.path);const f=t[p.namespace]?.[p.field];if(f===void 0){o.push(`${p.path} is not declared by an installed plugin`);continue}const h=ve(p.path,d.slice(m+1),f);if(typeof h=="string"&&f.type!=="string"&&f.type!=="enum"){o.push(h);continue}if(typeof h=="string"&&f.type==="enum"&&!f.values.includes(h)){o.push(`${p.path} expects one of ${f.values.join("|")}, received ${JSON.stringify(h)}`);continue}r.push({...p,value:h})}for(const d of n??[]){const m=F(d,"--unset-extension");if(typeof m=="string"){o.push(m);continue}if(l.has(m.path)){o.push(`duplicate --unset-extension path: ${m.path}`);continue}if(l.add(m.path),t[m.namespace]?.[m.field]===void 0){o.push(`${m.path} is not declared by an installed plugin`);continue}i.push(m)}for(const d of c)l.has(d)&&o.push(`${d} was requested in both --extension and --unset-extension`);if(o.length>0)throw s(`invalid plugin memory extension request:
11
+ - ${o.join(`
12
+ - `)}`,{received:[...e??[],...n??[]].join(", "),next:"Run `crtr memory write -h` or `crtr memory edit -h` for the installed field catalog and value syntax."});return{sets:r,unsets:i}}a(it,"parseRequestedExtensionChanges");function st(e,n,t){if(n.length===0&&t.length===0)return;const o=e.extensions;if(o!==void 0&&(o===null||typeof o!="object"||Array.isArray(o)))throw s("existing extensions frontmatter must be a mapping before extension fields can be changed",{received:JSON.stringify(o),next:"Repair the extensions mapping, or make a core-field-only edit that preserves it unchanged."});const r={...o??{}};for(const i of n){const c=r[i.namespace];if(c!==void 0&&(c===null||typeof c!="object"||Array.isArray(c)))throw s(`existing ${`extensions.${i.namespace}`} frontmatter must be a mapping before ${i.path} can change`,{received:JSON.stringify(c),next:"Repair the namespace mapping, or make a core-field-only edit that preserves it unchanged."});r[i.namespace]={...c??{},[i.field]:i.value}}for(const i of t){const c=r[i.namespace];if(c===void 0)continue;if(c===null||typeof c!="object"||Array.isArray(c))throw s(`existing ${`extensions.${i.namespace}`} frontmatter must be a mapping before ${i.path} can change`,{received:JSON.stringify(c),next:"Repair the namespace mapping, or make a core-field-only edit that preserves it unchanged."});const l={...c};delete l[i.field],Object.keys(l).length===0?delete r[i.namespace]:r[i.namespace]=l}Object.keys(r).length===0?delete e.extensions:e.extensions=r}a(st,"applyExtensionChanges");const $e={"scope-read":{kind:"flag",name:"scope",type:"enum",choices:[...q],required:!1,constraint:"Restrict resolution to one source class. A source filter only: the name stays the full canonical name, and project scope keeps its nearest-first precedence. Conflicts with --dir, which selects one exact store instead."},"scope-write":{kind:"flag",name:"scope",type:"enum",choices:[...$],required:!1,constraint:"Store to write to (package-shipped documents and installed-plugin documents are managed outside this command, so neither is writable). Default: project when cwd sits in a project, else user. `project` resolves to the NEAREST ancestor `.crouter/` walking up from cwd \u2014 in a nested workspace that can be a parent\u2019s store, not the dir you are standing in; pass --dir to pin the exact project. `profile` requires a selected profile (CRTR_PROFILE_ID) or an explicit --profile. `node` writes the this-node store (`nodes/<CRTR_NODE_ID>/context/memory/`), the nearest scope, seen only by this running node. Conflicts with --dir."},dir:{kind:"flag",name:"dir",type:"string",required:!1,constraint:"Exact project directory to operate in \u2014 selects `<dir>/.crouter/memory/` by realpath, regardless of cwd, ancestor stores, or which store a target view would pick. THE way to reach one specific project store: another project in your profile\u2019s purview, a store shadowed by an ancestor, or a non-winning duplicate such as a linked worktree that declares the same namespace as its main checkout. The name is still the FULL canonical name \u2014 the repository namespace plus that store\u2019s path under the repository root, plus the store-local name. It selects the store itself, so it conflicts with any explicit --scope and with --profile."},profile:{kind:"flag",name:"profile",type:"string",required:!1,constraint:"Profile id or name to target, for --scope profile. Names that profile\u2019s store exactly, whichever profile this process runs under. Default: the process CRTR_PROFILE_ID (the node\u2019s selected profile). Resolved through the same profile lookup as `crtr profile show`. Rejected (usage error) unless --scope profile is also selected \u2014 never silently ignored for another scope \u2014 and rejected with --dir."}};function at(e,n={},t){const o=$e[e];if(o===void 0)throw new Error(`unknown selector param: ${e}`);const r=t===void 0?o.constraint:`${o.constraint} ${t}`;return{...o,...n,constraint:r}}a(at,"selectorParam");function ct(e){if(e===void 0)return;const n=Array.isArray(e)?e:[e];if(n.length===0||n.some(t=>typeof t!="string"||!v.includes(t)))throw s(`invalid lint-ignore: ${JSON.stringify(e)} (suppressible rules: ${v.map(t=>`\`${t}\``).join(", ")})`);return n.length===1?n[0]:n}a(ct,"coerceLintIgnore");const Re={kind:{kind:"flag",name:"kind",type:"enum",choices:[...me],required:!1,constraint:"Document kind."},"when-and-why-to-read":{kind:"flag",name:"when-and-why-to-read",type:"string",required:!1,constraint:'ONE routing sentence: "When <circumstance>, this <kind> should be read because <broader downstream payoff>." WHY is the reader\u2019s payoff \u2014 the consequence they secure for their task by reading \u2014 NEVER the doc summary, its rule, or that rule reworded as an outcome (a benefit-shaped restatement still fails). Rendered verbatim as the preview.'},"short-form":{kind:"flag",name:"short-form",type:"string",required:!1,constraint:"Frontmatter short-form \u2014 a very abbreviated version of the content, the hook shown in `crtr memory list`."},unlisted:{kind:"flag",name:"unlisted",type:"bool",required:!1,default:!1,constraint:"Suppress this doc from directory listings. Suppression only \u2014 explicit reads, [[links]], and surfaces entries still work."},surface:{kind:"flag",name:"surface",type:"string",required:!1,repeatable:!0,constraint:"One routing entry per occurrence, as a YAML/JSON object `{on, at, match?, match-frontmatter?, gate?}`; the flag set replaces the document\u2019s whole surfaces list. `on` is boot|workspace-open|read|memory-read|command|pre-command; `at` is name|preview|content. `match` holds the event\u2019s globs \u2014 required on read/memory-read/command/pre-command (a read entry may carry `match-frontmatter`, a predicate over the read file\u2019s own frontmatter, instead), meaningless on boot/workspace-open. Optional entry `gate` is a node-config predicate using the same vocabulary as the document gate; its event constraints and gate both match before it participates. A `./`-anchored glob is relative: for `read` to the store\u2019s owning repo dir, for `memory-read` to this doc\u2019s routing anchor \u2014 its own canonical name when the doc is its directory\u2019s document (`<dir>/INDEX.md`), otherwise the canonical directory it sits in. Participating entries fold to their highest `at`; there is no cross-entry deny precedence."},gate:{kind:"flag",name:"gate",type:"string",required:!1,constraint:"Frontmatter gate \u2014 YAML/JSON object predicate over node config using the same field/matcher vocabulary described in the guide."},"lint-ignore":{kind:"flag",name:"lint-ignore",type:"enum",choices:[...v],required:!1,repeatable:!0,constraint:"Suppress one authoring lint rule for this document. Repeat for a list; valid rules: length, broad-memory-read, orphan."},slash:{kind:"flag",name:"slash",type:"bool",required:!1,default:!1,constraint:"Presence flags this doc invocable as a pi slash command (`/<name>`, `/` in a nested name rendered as `:`) \u2014 the doc body becomes the command\u2019s injected prompt. Default false: most docs are consulted, not invoked."}};function dt(e,n={},t){const o=Re[e];if(o===void 0)throw new Error(`unknown frontmatter overlay param: ${e}`);const r=t===void 0?o.constraint:`${o.constraint} ${t}`;return{...o,...n,constraint:r}}a(dt,"overlayParam");const lt="Frontmatter rationale \u2014 the observed agent failure that made this doc necessary. Maintainer-facing only: never ships in any delivered surface (boot render, on-read injection, `memory read` content), visible only via `memory read --frontmatter`. Omitting the flag preserves an existing rationale unchanged.",mt='Every doc appears in its directory\u2019s listing by default (suppress with --unlisted); everything beyond the listing is explicit `surfaces` routing \u2014 entries declaring WHEN the doc delivers and how much. Events: `boot` delivers in the boot catalog every agent sees; `workspace-open` delivers in first-message context when cwd/profile mounts the doc\u2019s project store (project stores only); `read` fires when the agent reads a matching file (globs vs the file\u2019s absolute path and basename, `./`-anchored globs vs its path relative to the store\u2019s owning repo dir, `match-frontmatter` predicates over the read file\u2019s own YAML frontmatter); `memory-read` fires when another memory doc\u2019s full body is delivered, including an explicit read (globs vs that doc\u2019s canonical name, `./` anchored to this doc\u2019s routing anchor \u2014 its own canonical name when it is its directory\u2019s document, otherwise the canonical directory it sits in); `command` fires when a matching shell command runs (globs vs each shell segment of the command line \u2014 split on `&&`/`||`/`;`/`|`/newlines outside quotes, leading `VAR=value` assignments dropped \u2014 where `*` spans whole whitespace-separated tokens and never part of one, `?` is one character inside a token, and quoted argument text is opaque, so `*git commit*` fires for `cd x && git commit -m "\u2026"` but not for `git commit-tree` or an `echo` that merely mentions it); `pre-command` fires BEFORE a matching bash command runs (same matching): when the memory has not been read yet, the command does not execute \u2014 the memory comes back as the tool result instead, and the agent re-issues the command, which then runs. Use it to guarantee a memory is seen before a sensitive action is taken. Requires `match`. An entry may also carry `gate`, a node-config predicate using the same vocabulary as the document-level `gate`: event constraints and entry gate both must match, then all participating entries fold to the highest `at` (`content` > `preview` > `name`), with no cross-entry deny precedence. The document-level `gate` remains the hard eligibility check: when it fails, no automatic surface can deliver the document. `at` sets how much delivers: `name` the bare tag, `preview` the routing line, `content` the whole body. Explicit `memory read` and listings remain deliberate access and ignore gates/rungs; only companion docs routed by their `memory-read` entries use entry gates. Each entry is paid by every future agent it fires on, so default down: no surfaces at all is correct for reference depth reached through listings and [[links]], and when a doc fits in a single sentence, deliver `content` directly \u2014 a `preview` routing line would run longer than the doc itself. Sentence-length `content` docs are correct; never pad a memory to be more verbose than the rule or fact it carries.',pt='The routing line (--when-and-why-to-read) is the only text an agent reads before deciding to load the doc. The test for its when-clause: it names an observable circumstance in the reader\u2019s current work, not the doc\u2019s topic reworded as an activity. If the WHEN can be inferred from the title alone, it is not a real trigger. Bad on a todo list: "When planning or prioritizing work across this profile." Good: "When the user mentions something from their todos, or asks what is still outstanding across this profile." The test for its because-clause: if it can be derived by paraphrasing the doc\u2019s advice, it is a restatement, not a payoff \u2014 a real payoff names a consequence in the reader\u2019s world that the document itself never asserts. Bad: "because only genuine first principles belong in taste memory." Bad: "because keeping the test loop fast and free of speculative tests protects the development pace" \u2014 the doc\u2019s rule as an outcome, derivable straight from its advice. Good: "because identifying throughlines in user taste lets future decisions be made faster and with less re-litigation." Someone mid-task who has not read the doc must be able to decide from this line alone whether the read is worth it. If you cannot name the concrete situation that triggers it, you do not yet understand the memory \u2014 ask the user one sharp question instead of improvising.',ft="Document gates, surface-entry gates, and match-frontmatter share the same predicate language: a field map is AND-ed across fields; dotted fields resolve nested values; field matchers may be scalar, array, or object. Scalar matchers do exact equality, with arrays matching any element. Array matchers do membership or intersection. Object matchers accept `eq`, `ne`, `in`, `nin`, `exists`, `contains`, `containsAll`, `containsAny`, `matches`, `imatches`, `gt`, `gte`, `lt`, and `lte`. Combinators are `all`, `any`, and `not`; sibling field matchers next to them are AND-ed in. An empty condition is inert. An unknown op never matches.",ht="Link related docs with `[[canonical/name]]`. A doc link in any body is a first-class cross-reference to another memory document by its exact canonical name \u2014 the same identifier `crtr memory read` takes, namespace included for a project document. A bare directory name is a valid link too: following it returns that directory\u2019s own document when it has one, plus the directory listing. Links are pointers, never transclusion: the linked body is loaded only when a reader follows it, so a link costs nothing until needed. `crtr memory lint` fails on a link that resolves to no document or directory, and `crtr memory read` lists a doc\u2019s resolvable links alongside its body. There is no alias, label, or old-name form \u2014 a renamed target needs its links rewritten.",ut="A document has exactly one address: its canonical name, the store\u2019s namespace composed with the document\u2019s store-local name. A repository declares its namespace once, as `namespace:` on the root `INDEX.md` of `<repository root>/.crouter/memory/`; a store nested inside that repository composes under the repository namespace plus its own directory path relative to the repository root, and declares nothing itself. An installed plugin\u2019s store mounts under the plugin\u2019s own name; user, profile, node, and builtin stores have no namespace, so their local names are already canonical. A local doc `unit-tests` in a store that declares `namespace: acme/core` therefore answers only at `acme/core/unit-tests`, and the store\u2019s root document answers at `acme/core`; a store at `packages/api/.crouter/memory/` in a repository declaring `namespace: acme` answers under `acme/packages/api`. A non-root explicit `name:` in frontmatter is store-LOCAL \u2014 it never carries the namespace, and composition is unconditional, so a name that merely looks prefixed is prefixed again. The namespace itself is immutable through the memory commands: `crtr memory write <namespace> --dir <repository root>` declares it once in an empty repository-root store, `crtr sys migrate --dir <repository root>` converts a legacy one, and nothing else rewrites it. A trailing `INDEX` is never part of an address in any store: `area/INDEX.md` is the document attached to directory `area`, so it answers at `area` and reading `area` returns that body together with the directory\u2019s immediate listing. Resolution is exact \u2014 a file path, a bare leaf, a `<scope>/<name>` spelling, and a trailing `/INDEX` all fail \u2014 so run `crtr memory find <leaf>` when you do not know the canonical name.";export{lt as DOC_RATIONALE_CONSTRAINT,Re as FRONTMATTER_OVERLAY_PARAMS,ut as GUIDE_CANONICAL_NAMES,ht as GUIDE_DOC_LINKS,ft as GUIDE_PREDICATE_VOCABULARY,pt as GUIDE_ROUTING_LINE,mt as GUIDE_SURFACES,me as MEMORY_KINDS,q as MEMORY_READ_SCOPES,Ue as MEMORY_SCOPES,$ as MEMORY_WRITE_SCOPES,$e as SELECTOR_PARAMS,st as applyExtensionChanges,et as buildOrigin,Qe as coerceGate,ct as coerceLintIgnore,Ze as coerceSurface,nt as literalBodySegment,we as memoryExtensionCatalogForDoc,rt as memoryExtensionFieldCatalogHelp,Ke as memoryFilePath,dt as overlayParam,it as parseRequestedExtensionChanges,Ge as planNewDocumentPlacement,ze as pruneEmptyParents,We as registerMemoryListingExposure,L as requireCanonicalName,he as requireLocalNameInStore,fe as requireMountedStore,He as requireUnambiguousDoc,Ve as resolveReadSelector,pe as resolveWriteSelector,Be as resolveWriteTarget,Ye as scopeRank,Xe as selectMutationDoc,at as selectorParam,tt as serializeMemoryDoc,ot as serializeMemoryDocLiteral};