@north-light/crouter 0.3.317 → 0.3.319

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 (1305) hide show
  1. package/README.md +0 -3
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -912
  4. package/dist/api/dto/attach.js +0 -13
  5. package/dist/api/dto/bash-jobs.js +1 -9
  6. package/dist/api/dto/broker-ops.js +0 -6
  7. package/dist/api/dto/broker.js +0 -20
  8. package/dist/api/dto/canvas.js +0 -2
  9. package/dist/api/dto/chat-inventory.js +0 -11
  10. package/dist/api/dto/common.js +1 -15
  11. package/dist/api/dto/config.js +0 -3
  12. package/dist/api/dto/crons.js +1 -10
  13. package/dist/api/dto/files.js +0 -7
  14. package/dist/api/dto/focus.js +0 -10
  15. package/dist/api/dto/health.js +0 -2
  16. package/dist/api/dto/human-requests.js +0 -4
  17. package/dist/api/dto/human.js +0 -4
  18. package/dist/api/dto/inbox.js +0 -4
  19. package/dist/api/dto/lifecycle.js +0 -3
  20. package/dist/api/dto/mail.js +0 -1
  21. package/dist/api/dto/memory.js +0 -6
  22. package/dist/api/dto/messages.js +0 -2
  23. package/dist/api/dto/model-config.js +0 -1
  24. package/dist/api/dto/modelauth.js +0 -4
  25. package/dist/api/dto/node-outcomes.js +0 -2
  26. package/dist/api/dto/nodes.js +0 -3
  27. package/dist/api/dto/profiles.js +1 -4
  28. package/dist/api/dto/recovery.js +0 -1
  29. package/dist/api/dto/reports.js +0 -2
  30. package/dist/api/dto/review-comments.js +0 -5
  31. package/dist/api/dto/reviews.js +0 -5
  32. package/dist/api/dto/subscriptions.js +0 -2
  33. package/dist/api/dto/worktree.js +0 -6
  34. package/dist/api/errors.js +1 -40
  35. package/dist/api/index.js +1 -33
  36. package/dist/api/plugin-manifest-schema.js +0 -23
  37. package/dist/api/routes.js +1 -147
  38. package/dist/build-root.js +1 -198
  39. package/dist/cli.js +3 -99
  40. package/dist/clients/attach/ansi-cells.js +1 -137
  41. package/dist/clients/attach/chrome/bash-jobs.js +1 -31
  42. package/dist/clients/attach/chrome/canvas-panels.js +1 -194
  43. package/dist/clients/attach/chrome/completion-bell.js +1 -89
  44. package/dist/clients/attach/chrome/cron-wait.js +1 -34
  45. package/dist/clients/attach/chrome/git-info.js +2 -44
  46. package/dist/clients/attach/chrome/header.js +1 -30
  47. package/dist/clients/attach/chrome/inbox-strip.js +1 -199
  48. package/dist/clients/attach/chrome/recap.js +1 -19
  49. package/dist/clients/attach/chrome/review-wait.js +1 -22
  50. package/dist/clients/attach/chrome/roster.js +4 -275
  51. package/dist/clients/attach/chrome/status-line.js +1 -117
  52. package/dist/clients/attach/chrome/ticket-panel.js +1 -280
  53. package/dist/clients/attach/chrome/widgets.js +1 -51
  54. package/dist/clients/attach/command.js +1 -107
  55. package/dist/clients/attach/config.js +1 -274
  56. package/dist/clients/attach/input/capabilities.js +1 -104
  57. package/dist/clients/attach/input/clipboard-image.js +3 -220
  58. package/dist/clients/attach/input/completion-frecency.js +1 -141
  59. package/dist/clients/attach/input/controller.js +7 -377
  60. package/dist/clients/attach/input/overlay-owner.js +1 -199
  61. package/dist/clients/attach/input/ref-autocomplete.js +2 -176
  62. package/dist/clients/attach/input/titled-editor.js +4 -859
  63. package/dist/clients/attach/overlays/auth.js +2 -271
  64. package/dist/clients/attach/overlays/dialogs.js +2 -102
  65. package/dist/clients/attach/overlays/file-review.js +2 -128
  66. package/dist/clients/attach/overlays/graph.js +1 -661
  67. package/dist/clients/attach/overlays/help.js +1 -211
  68. package/dist/clients/attach/overlays/mcp.js +1 -302
  69. package/dist/clients/attach/overlays/pickers.js +1 -163
  70. package/dist/clients/attach/render/activity-slot.js +1 -13
  71. package/dist/clients/attach/render/assistant-message.js +1 -56
  72. package/dist/clients/attach/render/card-presentation.js +5 -218
  73. package/dist/clients/attach/render/chat-view.js +5 -1708
  74. package/dist/clients/attach/render/condensed-history.js +1 -60
  75. package/dist/clients/attach/render/context-message.js +1 -63
  76. package/dist/clients/attach/render/crtr-output.js +17 -905
  77. package/dist/clients/attach/render/diagram.js +7 -111
  78. package/dist/clients/attach/render/edit-diff.js +5 -304
  79. package/dist/clients/attach/render/glyph-codepoints.js +1 -42
  80. package/dist/clients/attach/render/group-activity.js +2 -263
  81. package/dist/clients/attach/render/group-recap.js +1 -152
  82. package/dist/clients/attach/render/markdown-source.js +5 -266
  83. package/dist/clients/attach/render/measured-container.js +1 -322
  84. package/dist/clients/attach/render/page-block.js +1 -183
  85. package/dist/clients/attach/render/scroll-animation.js +1 -80
  86. package/dist/clients/attach/render/tool-calls.js +3 -361
  87. package/dist/clients/attach/render/transcript-copy.js +2 -81
  88. package/dist/clients/attach/render/transcript-search.js +1 -152
  89. package/dist/clients/attach/render/viewport.js +1 -184
  90. package/dist/clients/attach/session/banner.js +1 -29
  91. package/dist/clients/attach/session/bindings.js +1 -71
  92. package/dist/clients/attach/session/chrome-refresh.js +1 -94
  93. package/dist/clients/attach/session/connection.js +1 -186
  94. package/dist/clients/attach/session/context.js +0 -16
  95. package/dist/clients/attach/session/editor-frame.js +1 -142
  96. package/dist/clients/attach/session/editor-inventory.js +6 -160
  97. package/dist/clients/attach/session/file-links.js +1 -68
  98. package/dist/clients/attach/session/focus-events.js +1 -12
  99. package/dist/clients/attach/session/frame.js +1 -214
  100. package/dist/clients/attach/session/frames.js +1 -188
  101. package/dist/clients/attach/session/identity.js +1 -26
  102. package/dist/clients/attach/session/input-wiring.js +1 -140
  103. package/dist/clients/attach/session/invariant.js +1 -15
  104. package/dist/clients/attach/session/keys.js +1 -77
  105. package/dist/clients/attach/session/layout.js +1 -59
  106. package/dist/clients/attach/session/mouse.js +1 -78
  107. package/dist/clients/attach/session/pane-focus.js +1 -42
  108. package/dist/clients/attach/session/pane-tag.js +1 -112
  109. package/dist/clients/attach/session/pi-assets.js +1 -24
  110. package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
  111. package/dist/clients/attach/session/profile-files.js +1 -228
  112. package/dist/clients/attach/session/reconnect.js +1 -175
  113. package/dist/clients/attach/session/selection.js +3 -108
  114. package/dist/clients/attach/session/state-sync.js +1 -67
  115. package/dist/clients/attach/session/surface-frame.js +1 -73
  116. package/dist/clients/attach/session/surface-host.js +1 -255
  117. package/dist/clients/attach/session/teardown.js +5 -94
  118. package/dist/clients/attach/session/transcript-search.js +3 -151
  119. package/dist/clients/attach/session/whip-achievements.js +2 -145
  120. package/dist/clients/attach/session/whip.js +1 -362
  121. package/dist/clients/attach/slash/dispatch.js +1 -706
  122. package/dist/clients/attach/slash/prompt-preview.js +1 -121
  123. package/dist/clients/attach/viewer.js +1 -1
  124. package/dist/clients/conversation/projection.js +1 -324
  125. package/dist/clients/conversation/submit.js +1 -51
  126. package/dist/clients/inbox/controller.js +1 -701
  127. package/dist/clients/inbox/dto-adapt.js +1 -93
  128. package/dist/clients/inbox/layout.js +1 -9
  129. package/dist/clients/inbox/page-adapter.js +1 -55
  130. package/dist/clients/inbox/resolve.js +1 -35
  131. package/dist/clients/inbox/review/anchors.js +1 -89
  132. package/dist/clients/inbox/review/comments-client.js +1 -98
  133. package/dist/clients/inbox/review/companion-pane.js +1 -82
  134. package/dist/clients/inbox/review/document-surface.js +2 -1188
  135. package/dist/clients/inbox/review/frame.js +1 -216
  136. package/dist/clients/inbox/review/keys.js +1 -123
  137. package/dist/clients/inbox/review/launch.js +1 -151
  138. package/dist/clients/inbox/review/live-source.js +1 -160
  139. package/dist/clients/inbox/review/nvim.js +1 -44
  140. package/dist/clients/inbox/review/remap.js +1 -157
  141. package/dist/clients/inbox/review/review-client.js +1 -123
  142. package/dist/clients/inbox/review/roundtrip.js +3 -36
  143. package/dist/clients/inbox/review/state.js +4 -315
  144. package/dist/clients/inbox/review-adapter.js +1 -43
  145. package/dist/clients/inbox/surface.js +1 -152
  146. package/dist/clients/inbox/tui/ansi.js +3 -321
  147. package/dist/clients/inbox/tui/input.js +5 -392
  148. package/dist/clients/inbox/tui/keys.js +1 -104
  149. package/dist/clients/inbox/tui/page-body.js +1 -66
  150. package/dist/clients/inbox/tui/panel.js +1 -84
  151. package/dist/clients/inbox/tui/render.js +2 -368
  152. package/dist/clients/inbox/tui/slots.js +3 -134
  153. package/dist/clients/inbox/tui/types.js +0 -1
  154. package/dist/clients/inbox/tui.js +1 -86
  155. package/dist/clients/surfaces/host.js +0 -1
  156. package/dist/commands/api-client.js +4 -290
  157. package/dist/commands/attention.js +1 -215
  158. package/dist/commands/canvas-browse.js +1 -70
  159. package/dist/commands/canvas-config.js +2 -192
  160. package/dist/commands/canvas-history/grep.js +7 -85
  161. package/dist/commands/canvas-history/read.js +3 -50
  162. package/dist/commands/canvas-history/search.js +10 -99
  163. package/dist/commands/canvas-history/shared.js +1 -139
  164. package/dist/commands/canvas-history/stats.js +6 -68
  165. package/dist/commands/canvas-history.js +1 -32
  166. package/dist/commands/canvas-issue.js +14 -149
  167. package/dist/commands/canvas-prune.js +1 -108
  168. package/dist/commands/canvas-roster.js +1 -69
  169. package/dist/commands/canvas-snapshot.js +1 -34
  170. package/dist/commands/canvas-use.js +1 -61
  171. package/dist/commands/canvas.js +1 -49
  172. package/dist/commands/chord.js +1 -241
  173. package/dist/commands/cron.js +11 -534
  174. package/dist/commands/dashboard.js +1 -85
  175. package/dist/commands/human/components.js +3 -77
  176. package/dist/commands/human/feedback.js +1 -112
  177. package/dist/commands/human/prompts.js +1 -331
  178. package/dist/commands/human/queue.js +1 -191
  179. package/dist/commands/human/request.js +1 -266
  180. package/dist/commands/human/review.js +1 -288
  181. package/dist/commands/human/shared.js +1 -67
  182. package/dist/commands/human.js +4 -60
  183. package/dist/commands/memory/delete.js +1 -100
  184. package/dist/commands/memory/edit.js +21 -219
  185. package/dist/commands/memory/find.js +2 -244
  186. package/dist/commands/memory/history.js +5 -199
  187. package/dist/commands/memory/lint.js +1 -107
  188. package/dist/commands/memory/list.js +1 -142
  189. package/dist/commands/memory/move.js +1 -223
  190. package/dist/commands/memory/origin.js +1 -130
  191. package/dist/commands/memory/read.js +6 -232
  192. package/dist/commands/memory/shared.js +12 -802
  193. package/dist/commands/memory/write.js +13 -235
  194. package/dist/commands/memory.js +1 -30
  195. package/dist/commands/node/bash.js +5 -245
  196. package/dist/commands/node/create.js +3 -332
  197. package/dist/commands/node/inspect.js +12 -300
  198. package/dist/commands/node/lifecycle.js +2 -453
  199. package/dist/commands/node/message.js +1 -161
  200. package/dist/commands/node/outcome.js +4 -134
  201. package/dist/commands/node/pyramid.js +2 -79
  202. package/dist/commands/node/subscription.js +1 -78
  203. package/dist/commands/node/wait.js +7 -163
  204. package/dist/commands/node-context.js +2 -159
  205. package/dist/commands/node-inspect-artifacts.js +8 -109
  206. package/dist/commands/node-lifecycle-revive.js +1 -217
  207. package/dist/commands/node-snapshot.js +1 -37
  208. package/dist/commands/node-transcript.js +1 -62
  209. package/dist/commands/node-worktree.js +1 -138
  210. package/dist/commands/node.js +1 -29
  211. package/dist/commands/pkg/browse/actions.js +1 -198
  212. package/dist/commands/pkg/browse/catalog.js +1 -466
  213. package/dist/commands/pkg/browse/command-view.js +1 -191
  214. package/dist/commands/pkg/browse/detail-panel.js +1 -402
  215. package/dist/commands/pkg/browse/doc-view.js +1 -89
  216. package/dist/commands/pkg/browse/list-panel.js +2 -168
  217. package/dist/commands/pkg/browse/model.js +1 -36
  218. package/dist/commands/pkg/browse/shell.js +1 -640
  219. package/dist/commands/pkg/browse.js +1 -27
  220. package/dist/commands/pkg/market-inspect.js +1 -141
  221. package/dist/commands/pkg/market-manage.js +1 -327
  222. package/dist/commands/pkg/market.js +1 -14
  223. package/dist/commands/pkg/plugin-inspect.js +1 -168
  224. package/dist/commands/pkg/plugin-manage.js +17 -1109
  225. package/dist/commands/pkg/plugin.js +1 -14
  226. package/dist/commands/pkg/shared.js +1 -62
  227. package/dist/commands/pkg.js +1 -21
  228. package/dist/commands/profile/default.js +1 -139
  229. package/dist/commands/profile/delete.js +1 -66
  230. package/dist/commands/profile/env.js +3 -188
  231. package/dist/commands/profile/kind.js +2 -35
  232. package/dist/commands/profile/list.js +1 -43
  233. package/dist/commands/profile/meta.js +1 -67
  234. package/dist/commands/profile/new.js +1 -115
  235. package/dist/commands/profile/pause.js +1 -59
  236. package/dist/commands/profile/project.js +1 -113
  237. package/dist/commands/profile/rename.js +1 -38
  238. package/dist/commands/profile/show.js +1 -52
  239. package/dist/commands/profile.js +1 -35
  240. package/dist/commands/push.js +9 -265
  241. package/dist/commands/revive.js +10 -181
  242. package/dist/commands/surface/node/cycle.js +1 -83
  243. package/dist/commands/surface/node/focus.js +1 -81
  244. package/dist/commands/surface/node/id.js +1 -38
  245. package/dist/commands/surface/node/pin.js +1 -42
  246. package/dist/commands/surface/node/placement.js +1 -134
  247. package/dist/commands/surface-edit.js +1 -157
  248. package/dist/commands/surface-inbox.js +1 -98
  249. package/dist/commands/surface-inspect.js +1 -39
  250. package/dist/commands/surface-node.js +1 -19
  251. package/dist/commands/surface-reload.js +2 -134
  252. package/dist/commands/surface-tmux-spread.js +1 -214
  253. package/dist/commands/surface.js +1 -28
  254. package/dist/commands/sys/branch.js +1 -19
  255. package/dist/commands/sys/config.js +1 -353
  256. package/dist/commands/sys/context/admin/actions.js +2 -246
  257. package/dist/commands/sys/context/admin/detail-panel.js +1 -247
  258. package/dist/commands/sys/context/admin/docs-panel.js +1 -191
  259. package/dist/commands/sys/context/admin/list-view.js +1 -183
  260. package/dist/commands/sys/context/admin/model.js +1 -229
  261. package/dist/commands/sys/context/admin/rail-panel.js +1 -227
  262. package/dist/commands/sys/context/admin/read-view.js +2 -194
  263. package/dist/commands/sys/context/admin/shell.js +1 -910
  264. package/dist/commands/sys/context/admin.js +2 -126
  265. package/dist/commands/sys/context/doc.js +3 -197
  266. package/dist/commands/sys/context/prompt-review.js +11 -291
  267. package/dist/commands/sys/context/resolve.js +10 -489
  268. package/dist/commands/sys/context/sysprompt.js +5 -96
  269. package/dist/commands/sys/context.js +1 -20
  270. package/dist/commands/sys/daemon.js +1 -313
  271. package/dist/commands/sys/doctor.js +1 -617
  272. package/dist/commands/sys/feedback.js +7 -228
  273. package/dist/commands/sys/logs.js +3 -129
  274. package/dist/commands/sys/migrate.js +1 -94
  275. package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
  276. package/dist/commands/sys/panels/dependencies-panel.js +1 -80
  277. package/dist/commands/sys/panels/keybindings-panel.js +1 -703
  278. package/dist/commands/sys/panels/models-panel.js +1 -1133
  279. package/dist/commands/sys/panels/plugins-panel.js +1 -80
  280. package/dist/commands/sys/panels/prefs-panel.js +1 -85
  281. package/dist/commands/sys/panels/profiles-panel.js +1 -601
  282. package/dist/commands/sys/panels/provider-panel.js +1 -538
  283. package/dist/commands/sys/settings-shell.js +1 -400
  284. package/dist/commands/sys/settings.js +1 -46
  285. package/dist/commands/sys/setup-core.js +6 -579
  286. package/dist/commands/sys/setup-settings-runner.js +1 -16
  287. package/dist/commands/sys/setup-wizard.js +1 -279
  288. package/dist/commands/sys/setup.js +1 -34
  289. package/dist/commands/sys/shared.js +1 -81
  290. package/dist/commands/sys/support/prepare.js +3 -239
  291. package/dist/commands/sys/support/submit.js +6 -524
  292. package/dist/commands/sys/support.js +1 -18
  293. package/dist/commands/sys/sync-deps.js +15 -498
  294. package/dist/commands/sys/sync-project-guidance.js +4 -481
  295. package/dist/commands/sys/sync-shared.js +1 -49
  296. package/dist/commands/sys/sync-skills.js +2 -311
  297. package/dist/commands/sys/sync.js +1 -18
  298. package/dist/commands/sys/update.js +1 -147
  299. package/dist/commands/sys/worktrees.js +5 -53
  300. package/dist/commands/sys.js +1 -18
  301. package/dist/core/activity-signal.js +2 -38
  302. package/dist/core/asset-root.js +1 -18
  303. package/dist/core/auth-file.js +2 -179
  304. package/dist/core/auth-interaction.js +3 -94
  305. package/dist/core/auto-update.js +4 -94
  306. package/dist/core/bash-guard.js +11 -393
  307. package/dist/core/bash-jobs.js +7 -411
  308. package/dist/core/bootstrap.js +2 -53
  309. package/dist/core/broker-client/client.js +1 -184
  310. package/dist/core/broker-client/index.js +1 -13
  311. package/dist/core/broker-client/transport-relay.js +1 -157
  312. package/dist/core/broker-client/transport-socket.js +1 -179
  313. package/dist/core/broker-client/transport.js +1 -26
  314. package/dist/core/canvas/attention.js +1 -47
  315. package/dist/core/canvas/boot-id.js +1 -26
  316. package/dist/core/canvas/boot.js +1 -186
  317. package/dist/core/canvas/browse/app.js +3 -919
  318. package/dist/core/canvas/browse/model.js +1 -477
  319. package/dist/core/canvas/browse/pins.js +1 -29
  320. package/dist/core/canvas/browse/render.js +3 -1055
  321. package/dist/core/canvas/canvas.js +15 -922
  322. package/dist/core/canvas/crons.js +11 -481
  323. package/dist/core/canvas/daemon-owner.js +2 -146
  324. package/dist/core/canvas/db.js +2 -100
  325. package/dist/core/canvas/deliveries.js +22 -283
  326. package/dist/core/canvas/delivery-contract.js +1 -8
  327. package/dist/core/canvas/executions.js +1 -68
  328. package/dist/core/canvas/extensions.js +1 -83
  329. package/dist/core/canvas/focuses.js +1 -77
  330. package/dist/core/canvas/history.js +24 -860
  331. package/dist/core/canvas/index.js +1 -15
  332. package/dist/core/canvas/install-id.js +1 -84
  333. package/dist/core/canvas/labels.js +1 -43
  334. package/dist/core/canvas/meta-file.js +1 -89
  335. package/dist/core/canvas/migrations.js +41 -1150
  336. package/dist/core/canvas/nav-model.js +1 -231
  337. package/dist/core/canvas/nav-render.js +1 -260
  338. package/dist/core/canvas/node-order.js +1 -37
  339. package/dist/core/canvas/node-recap.js +2 -67
  340. package/dist/core/canvas/node-sql-migration.js +2 -209
  341. package/dist/core/canvas/paths.js +1 -153
  342. package/dist/core/canvas/pid.js +4 -683
  343. package/dist/core/canvas/recovery.js +3 -565
  344. package/dist/core/canvas/remote-canvas-source.js +1 -288
  345. package/dist/core/canvas/remote-transport.js +1 -57
  346. package/dist/core/canvas/render-source.js +10 -635
  347. package/dist/core/canvas/sessions.js +1 -78
  348. package/dist/core/canvas/source.js +1 -47
  349. package/dist/core/canvas/status-glyph.js +1 -132
  350. package/dist/core/canvas/telemetry.js +1 -35
  351. package/dist/core/canvas/types.js +1 -6
  352. package/dist/core/canvas/waits.js +4 -68
  353. package/dist/core/canvas/worktrees.js +1 -93
  354. package/dist/core/clipboard-text.js +1 -57
  355. package/dist/core/command-hooks/artifact.js +1 -145
  356. package/dist/core/command-hooks/catalog.js +1 -38
  357. package/dist/core/command-hooks/compose.js +1 -99
  358. package/dist/core/command-hooks/discovery.js +1 -228
  359. package/dist/core/command-hooks/help.js +1 -18
  360. package/dist/core/command-hooks/index.js +1 -7
  361. package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
  362. package/dist/core/command-hooks/lifecycle-create.js +1 -51
  363. package/dist/core/command-hooks/report.js +1 -28
  364. package/dist/core/command-hooks/schema.js +1 -157
  365. package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
  366. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
  367. package/dist/core/command-manifests/manifest.js +1 -324
  368. package/dist/core/command-manifests/registry.js +1 -118
  369. package/dist/core/command-manifests/schema.js +1 -736
  370. package/dist/core/command-plugins/bundle.js +1 -261
  371. package/dist/core/command-plugins/compose.js +1 -65
  372. package/dist/core/command-plugins/discovery.js +1 -245
  373. package/dist/core/command-plugins/endpoint.js +1 -48
  374. package/dist/core/command-plugins/extensions.js +1 -166
  375. package/dist/core/command-plugins/help-addenda.js +1 -44
  376. package/dist/core/command-plugins/presence.js +1 -17
  377. package/dist/core/command-plugins/revalidate.js +2 -152
  378. package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
  379. package/dist/core/command-plugins/transport/http-fetch.js +1 -68
  380. package/dist/core/command-plugins/transport/http-invoke.js +3 -546
  381. package/dist/core/command.js +10 -739
  382. package/dist/core/config.js +1 -1059
  383. package/dist/core/document-lines.js +3 -6
  384. package/dist/core/env-name.js +1 -9
  385. package/dist/core/errors.js +1 -52
  386. package/dist/core/events/emit.js +1 -17
  387. package/dist/core/events/envelope.js +1 -84
  388. package/dist/core/events/errors.js +1 -69
  389. package/dist/core/events/index.js +1 -4
  390. package/dist/core/events/operation-id.js +1 -24
  391. package/dist/core/events/read.js +1 -623
  392. package/dist/core/events/serialize.js +1 -199
  393. package/dist/core/events/source.js +1 -31
  394. package/dist/core/events/types.js +1 -11
  395. package/dist/core/exclusive-lock.js +1 -197
  396. package/dist/core/fault-classifier.js +1 -96
  397. package/dist/core/feed/feed.js +7 -202
  398. package/dist/core/feed/inbox-migrate.js +3 -135
  399. package/dist/core/feed/inbox.js +10 -122
  400. package/dist/core/feed/messages.js +6 -212
  401. package/dist/core/frontmatter.js +1 -35
  402. package/dist/core/fs-utils.js +3 -202
  403. package/dist/core/git.js +2 -103
  404. package/dist/core/help.js +9 -310
  405. package/dist/core/host-exports/builtins.js +9 -68
  406. package/dist/core/host-exports/export.js +3 -124
  407. package/dist/core/human/action-binding.js +1 -40
  408. package/dist/core/human/answer-text.js +5 -100
  409. package/dist/core/human/answer.js +1 -119
  410. package/dist/core/human/claim.js +3 -67
  411. package/dist/core/human/completion.js +1 -27
  412. package/dist/core/human/component-docs.js +78 -272
  413. package/dist/core/human/convention.js +2 -82
  414. package/dist/core/human/feedback-companion.js +1 -106
  415. package/dist/core/human/feedback.js +1 -88
  416. package/dist/core/human/page-authoring.js +1 -19
  417. package/dist/core/human/page-catalog.js +1 -172
  418. package/dist/core/human/page-errors.js +1 -7
  419. package/dist/core/human/page-eval.js +1 -125
  420. package/dist/core/human/page-html-markdown.js +8 -260
  421. package/dist/core/human/page-markdown.js +17 -295
  422. package/dist/core/human/page-schema.js +1 -373
  423. package/dist/core/human/page-synth.js +8 -27
  424. package/dist/core/human/page.js +1 -198
  425. package/dist/core/human/requests.js +15 -466
  426. package/dist/core/human/review-schema.js +1 -34
  427. package/dist/core/human/root.js +1 -11
  428. package/dist/core/human/scan.js +1 -69
  429. package/dist/core/human/summary.js +1 -5
  430. package/dist/core/human/tickets.js +1 -171
  431. package/dist/core/human/types.js +0 -1
  432. package/dist/core/human/visible-paths.js +1 -77
  433. package/dist/core/human-actions.js +1 -101
  434. package/dist/core/inspector/chrome.js +1 -14
  435. package/dist/core/inspector/contract.js +0 -1
  436. package/dist/core/inspector/core.js +2 -295
  437. package/dist/core/inspector/host.js +4 -538
  438. package/dist/core/inspector/model.js +2 -226
  439. package/dist/core/inspector/text.js +6 -45
  440. package/dist/core/inspector/transport.js +1 -36
  441. package/dist/core/inspector/tui.js +2 -295
  442. package/dist/core/installed-plugins.js +1 -78
  443. package/dist/core/io.js +7 -356
  444. package/dist/core/keybindings/attach-control.js +1 -42
  445. package/dist/core/keybindings/background-bash.js +1 -33
  446. package/dist/core/keybindings/catalog.js +1 -256
  447. package/dist/core/keybindings/inbox.js +1 -25
  448. package/dist/core/keybindings/index.js +1 -7
  449. package/dist/core/keybindings/match.js +1 -127
  450. package/dist/core/keybindings/persistence.js +1 -49
  451. package/dist/core/keybindings/resolve.js +1 -348
  452. package/dist/core/keybindings/types.js +0 -1
  453. package/dist/core/locked-file.js +1 -118
  454. package/dist/core/log.js +3 -27
  455. package/dist/core/manifest-recovery.js +1 -72
  456. package/dist/core/manifest-stale.js +1 -39
  457. package/dist/core/manifest.js +1 -20
  458. package/dist/core/memory/doc-link-grammar.js +2 -109
  459. package/dist/core/memory/extensions.js +1 -221
  460. package/dist/core/memory/history.js +6 -268
  461. package/dist/core/memory/identity.js +1 -181
  462. package/dist/core/memory/inline-ref-grammar.js +1 -98
  463. package/dist/core/memory/inline-ref-guidance.js +2 -35
  464. package/dist/core/memory/inline-ref-inventory.js +1 -59
  465. package/dist/core/memory/lint.js +2 -671
  466. package/dist/core/memory/project-namespace.js +2 -85
  467. package/dist/core/memory/repository-association.js +1 -129
  468. package/dist/core/memory/tree.js +1 -93
  469. package/dist/core/memory-resolver.js +2 -611
  470. package/dist/core/model-config.js +1 -107
  471. package/dist/core/model-routes.js +1 -201
  472. package/dist/core/nested-stores.js +2 -166
  473. package/dist/core/output.js +7 -99
  474. package/dist/core/pagination.js +1 -88
  475. package/dist/core/plugin-swap-lock.js +1 -31
  476. package/dist/core/pool-credential-store.js +1 -116
  477. package/dist/core/predicate.js +1 -191
  478. package/dist/core/preview-registry.js +2 -411
  479. package/dist/core/preview-result-path.js +1 -26
  480. package/dist/core/profiles/default-binding.js +1 -24
  481. package/dist/core/profiles/deletion-reservation.js +1 -42
  482. package/dist/core/profiles/env-store.js +2 -162
  483. package/dist/core/profiles/fuzzy-match.js +1 -92
  484. package/dist/core/profiles/manifest.js +1 -574
  485. package/dist/core/profiles/select.js +35 -741
  486. package/dist/core/profiles/state-block.js +3 -17
  487. package/dist/core/provider-error-recognition.js +1 -74
  488. package/dist/core/provider-failure.js +1 -86
  489. package/dist/core/provider-management.js +1 -22
  490. package/dist/core/remote-canvas-target.js +1 -30
  491. package/dist/core/render.js +18 -138
  492. package/dist/core/resolver.js +1 -111
  493. package/dist/core/review/birth.js +1 -52
  494. package/dist/core/review/comments.js +5 -279
  495. package/dist/core/review/companion.js +1 -215
  496. package/dist/core/review/document.js +2 -138
  497. package/dist/core/review/project.js +1 -36
  498. package/dist/core/review/realize.js +1 -71
  499. package/dist/core/review/remap.js +4 -141
  500. package/dist/core/review/signal.js +1 -12
  501. package/dist/core/review/stage.js +1 -184
  502. package/dist/core/review/store.js +1 -168
  503. package/dist/core/review/types.js +1 -23
  504. package/dist/core/runtime/advertised-command-invocation.js +1 -233
  505. package/dist/core/runtime/auth-reload.js +1 -67
  506. package/dist/core/runtime/banner.js +1 -51
  507. package/dist/core/runtime/bearings-render.js +18 -250
  508. package/dist/core/runtime/bearings.js +7 -194
  509. package/dist/core/runtime/bin-contributions.js +2 -186
  510. package/dist/core/runtime/boot-root.js +1 -107
  511. package/dist/core/runtime/branded-host.js +2 -264
  512. package/dist/core/runtime/broker/auth-reload.js +1 -157
  513. package/dist/core/runtime/broker/client-registry.js +1 -179
  514. package/dist/core/runtime/broker/daemon-ops.js +1 -88
  515. package/dist/core/runtime/broker/engine-drive.js +1 -354
  516. package/dist/core/runtime/broker/engine-routing.js +1 -211
  517. package/dist/core/runtime/broker/event-projection.js +1 -193
  518. package/dist/core/runtime/broker/extension-abort.js +1 -36
  519. package/dist/core/runtime/broker/fault-retry.js +1 -588
  520. package/dist/core/runtime/broker/frame-client.js +1 -132
  521. package/dist/core/runtime/broker/frame-dispatch.js +1 -183
  522. package/dist/core/runtime/broker/frame-engine-control.js +1 -231
  523. package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
  524. package/dist/core/runtime/broker/frame-model-query.js +1 -69
  525. package/dist/core/runtime/broker/frame-read.js +1 -116
  526. package/dist/core/runtime/broker/frame-replies.js +1 -64
  527. package/dist/core/runtime/broker/frame-session.js +4 -203
  528. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
  529. package/dist/core/runtime/broker/inbox.js +13 -163
  530. package/dist/core/runtime/broker/node-named.js +1 -27
  531. package/dist/core/runtime/broker/read-ops.js +1 -171
  532. package/dist/core/runtime/broker/rebind.js +1 -318
  533. package/dist/core/runtime/broker/tool-groups.js +1 -246
  534. package/dist/core/runtime/broker/turn-admission.js +1 -31
  535. package/dist/core/runtime/broker/turn-ignition.js +1 -84
  536. package/dist/core/runtime/broker-cli.js +3 -81
  537. package/dist/core/runtime/broker-extension-render.js +5 -135
  538. package/dist/core/runtime/broker-inventory.js +1 -116
  539. package/dist/core/runtime/broker-persona-guidance.js +4 -154
  540. package/dist/core/runtime/broker-protocol.js +3 -152
  541. package/dist/core/runtime/broker-request.js +1 -85
  542. package/dist/core/runtime/broker-sdk.js +1 -129
  543. package/dist/core/runtime/broker.js +1 -1214
  544. package/dist/core/runtime/canvas-extensions.js +1 -96
  545. package/dist/core/runtime/chat-inventory-rows.js +1 -105
  546. package/dist/core/runtime/close.js +1 -265
  547. package/dist/core/runtime/command-expansion.js +9 -104
  548. package/dist/core/runtime/command-surface.js +1 -117
  549. package/dist/core/runtime/connectivity.js +1 -73
  550. package/dist/core/runtime/deliver-live.js +1 -88
  551. package/dist/core/runtime/fault-recovery.js +1 -83
  552. package/dist/core/runtime/fault.js +1 -17
  553. package/dist/core/runtime/fleet.js +1 -58
  554. package/dist/core/runtime/front-door-env.js +1 -16
  555. package/dist/core/runtime/front-door.js +7 -183
  556. package/dist/core/runtime/headless-pi.js +1 -161
  557. package/dist/core/runtime/host.js +1 -457
  558. package/dist/core/runtime/interactive-deliver.js +1 -51
  559. package/dist/core/runtime/invocation.js +0 -10
  560. package/dist/core/runtime/kickoff.js +30 -327
  561. package/dist/core/runtime/launch-config-worker.js +1 -12
  562. package/dist/core/runtime/launch-prompt.js +4 -13
  563. package/dist/core/runtime/launch-target.js +1 -55
  564. package/dist/core/runtime/launch.js +1 -483
  565. package/dist/core/runtime/lifecycle.js +2 -213
  566. package/dist/core/runtime/managed-provider-cooling.js +1 -62
  567. package/dist/core/runtime/memory.js +1 -17
  568. package/dist/core/runtime/model-registry.js +1 -13
  569. package/dist/core/runtime/model-selection.js +1 -135
  570. package/dist/core/runtime/model-swap.js +1 -86
  571. package/dist/core/runtime/naming.js +14 -298
  572. package/dist/core/runtime/nerd-font.js +2 -127
  573. package/dist/core/runtime/node-read.js +2 -386
  574. package/dist/core/runtime/nodes.js +1 -331
  575. package/dist/core/runtime/outcome-document.js +1 -97
  576. package/dist/core/runtime/package-health.js +4 -99
  577. package/dist/core/runtime/persona.js +2 -55
  578. package/dist/core/runtime/pi-cli.js +1 -65
  579. package/dist/core/runtime/pi-vendored.js +1 -66
  580. package/dist/core/runtime/placement-tmux.js +1 -81
  581. package/dist/core/runtime/placement.js +1 -386
  582. package/dist/core/runtime/promote.js +1 -174
  583. package/dist/core/runtime/prospective-inventory-cli.js +3 -61
  584. package/dist/core/runtime/prospective-inventory.js +2 -88
  585. package/dist/core/runtime/recap.js +27 -103
  586. package/dist/core/runtime/recycle.js +1 -190
  587. package/dist/core/runtime/reopen.js +1 -138
  588. package/dist/core/runtime/reset.js +1 -245
  589. package/dist/core/runtime/resume-root.js +10 -290
  590. package/dist/core/runtime/revive-all.js +1 -107
  591. package/dist/core/runtime/revive.js +4 -544
  592. package/dist/core/runtime/roadmap.js +4 -38
  593. package/dist/core/runtime/session-branch.js +1 -46
  594. package/dist/core/runtime/session-cycles.js +1 -110
  595. package/dist/core/runtime/session-list-cache.js +1 -406
  596. package/dist/core/runtime/session-visibility.js +1 -99
  597. package/dist/core/runtime/shell-expansion.js +9 -100
  598. package/dist/core/runtime/situational-context.js +2 -67
  599. package/dist/core/runtime/situational-live.js +1 -41
  600. package/dist/core/runtime/spawn-env.js +1 -255
  601. package/dist/core/runtime/spawn.js +3 -577
  602. package/dist/core/runtime/stamp/channel.js +1 -76
  603. package/dist/core/runtime/stamp/protocol.js +1 -113
  604. package/dist/core/runtime/stop-guard.js +7 -116
  605. package/dist/core/runtime/stop-signals.js +1 -46
  606. package/dist/core/runtime/stream-watchdog.js +1 -134
  607. package/dist/core/runtime/structured-output.js +4 -156
  608. package/dist/core/runtime/surface-bg.js +1 -85
  609. package/dist/core/runtime/tmux-bindings.js +4 -730
  610. package/dist/core/runtime/tmux-chrome.js +1 -5
  611. package/dist/core/runtime/tmux-driver.js +7 -637
  612. package/dist/core/runtime/tool-group-summary.js +6 -85
  613. package/dist/core/runtime/turn-visibility.js +1 -31
  614. package/dist/core/runtime/view-socket.js +1 -83
  615. package/dist/core/runtime/warm-pool.d.ts +3 -2
  616. package/dist/core/runtime/warm-pool.js +1 -385
  617. package/dist/core/scope.js +1 -254
  618. package/dist/core/scoped-state/db.js +1 -135
  619. package/dist/core/scoped-state/migrate.js +3 -181
  620. package/dist/core/scoped-state/paths.js +1 -27
  621. package/dist/core/scoped-state/profiles.js +1 -62
  622. package/dist/core/scoped-state/providers.js +1 -8
  623. package/dist/core/scoped-state/schema.js +3 -16
  624. package/dist/core/scoped-state/settings.js +1 -82
  625. package/dist/core/secrets.js +2 -55
  626. package/dist/core/self-update.js +1 -71
  627. package/dist/core/session-model/session-state.js +1 -180
  628. package/dist/core/shell-segments.js +4 -169
  629. package/dist/core/spawn.js +1 -26
  630. package/dist/core/stdout-errors.js +1 -14
  631. package/dist/core/subscription-state.js +3 -193
  632. package/dist/core/substrate/frontmatter-validation.js +1 -105
  633. package/dist/core/substrate/gate-explain.js +1 -424
  634. package/dist/core/substrate/gate.js +1 -26
  635. package/dist/core/substrate/index.js +1 -30
  636. package/dist/core/substrate/injected-store.js +1 -249
  637. package/dist/core/substrate/listings.js +1 -115
  638. package/dist/core/substrate/on-read-node.js +1 -36
  639. package/dist/core/substrate/on-read.js +9 -315
  640. package/dist/core/substrate/plan.js +1 -266
  641. package/dist/core/substrate/render-node.js +1 -30
  642. package/dist/core/substrate/render.js +65 -689
  643. package/dist/core/substrate/schema.js +1 -186
  644. package/dist/core/substrate/session-cache.js +1 -83
  645. package/dist/core/substrate/subject-fields.js +1 -35
  646. package/dist/core/substrate/subject.js +1 -47
  647. package/dist/core/substrate/surface-match.js +1 -242
  648. package/dist/core/termrender/code-doc.js +5 -92
  649. package/dist/core/termrender/display.js +2 -56
  650. package/dist/core/termrender/termrender.js +14 -719
  651. package/dist/core/termrender/version.js +1 -1
  652. package/dist/core/timing.js +2 -94
  653. package/dist/core/tui/draw.js +2 -378
  654. package/dist/core/tui/fuzzy.js +1 -38
  655. package/dist/core/tui/markdown.js +3 -407
  656. package/dist/core/tui/page-host.js +1 -74
  657. package/dist/core/tui/panel.js +1 -137
  658. package/dist/core/tui/terminal.js +2 -100
  659. package/dist/core/user-settings.js +1 -454
  660. package/dist/core/wake.js +1 -296
  661. package/dist/core/worktree-close.js +6 -228
  662. package/dist/core/worktree-containment.js +3 -48
  663. package/dist/core/worktree-landing.js +4 -56
  664. package/dist/core/worktree-mutation-async.js +10 -280
  665. package/dist/core/worktree-quarantine.js +1 -54
  666. package/dist/core/worktree-sweep.js +6 -453
  667. package/dist/core/worktree.js +18 -899
  668. package/dist/daemon/api/bridge.js +8 -418
  669. package/dist/daemon/api/handlers/attach.js +1 -65
  670. package/dist/daemon/api/handlers/bash-jobs.js +2 -91
  671. package/dist/daemon/api/handlers/broker-ops.js +1 -447
  672. package/dist/daemon/api/handlers/broker-recovery.js +1 -251
  673. package/dist/daemon/api/handlers/canvas.js +6 -490
  674. package/dist/daemon/api/handlers/chat-inventory.js +1 -25
  675. package/dist/daemon/api/handlers/crons.js +1 -373
  676. package/dist/daemon/api/handlers/daemon.js +1 -76
  677. package/dist/daemon/api/handlers/feedback-comments.js +3 -199
  678. package/dist/daemon/api/handlers/files.js +1 -63
  679. package/dist/daemon/api/handlers/focus.js +1 -92
  680. package/dist/daemon/api/handlers/health.js +1 -76
  681. package/dist/daemon/api/handlers/human-requests.js +1 -379
  682. package/dist/daemon/api/handlers/human.js +1 -3
  683. package/dist/daemon/api/handlers/inbox-page.js +1 -89
  684. package/dist/daemon/api/handlers/inbox.js +1 -301
  685. package/dist/daemon/api/handlers/memory.js +1 -50
  686. package/dist/daemon/api/handlers/messages.js +2 -506
  687. package/dist/daemon/api/handlers/model-config.js +1 -44
  688. package/dist/daemon/api/handlers/modelauth.js +1 -165
  689. package/dist/daemon/api/handlers/node-outcomes.js +1 -181
  690. package/dist/daemon/api/handlers/nodes.js +1 -943
  691. package/dist/daemon/api/handlers/profiles.js +1 -140
  692. package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
  693. package/dist/daemon/api/handlers/reports.js +16 -332
  694. package/dist/daemon/api/handlers/review-comments.js +1 -465
  695. package/dist/daemon/api/handlers/reviews.js +1 -200
  696. package/dist/daemon/api/handlers/subscriptions.js +1 -53
  697. package/dist/daemon/api/handlers/validate.js +1 -58
  698. package/dist/daemon/api/handlers/worktree.js +1 -39
  699. package/dist/daemon/api/map.js +2 -735
  700. package/dist/daemon/api/router.js +1 -190
  701. package/dist/daemon/api/server.js +11 -408
  702. package/dist/daemon/boot-migrations.js +1 -31
  703. package/dist/daemon/companion-retire.js +1 -34
  704. package/dist/daemon/control.js +1 -22
  705. package/dist/daemon/cron/armed-context.js +1 -100
  706. package/dist/daemon/cron/capture.js +2 -45
  707. package/dist/daemon/cron/disposition.js +1 -55
  708. package/dist/daemon/cron/escalation.js +3 -124
  709. package/dist/daemon/cron/held.js +1 -20
  710. package/dist/daemon/cron/lease-recovery.js +1 -119
  711. package/dist/daemon/cron/live-runs.js +1 -23
  712. package/dist/daemon/cron/passes.js +1 -58
  713. package/dist/daemon/cron/settle.js +1 -61
  714. package/dist/daemon/cron/sinks.js +2 -59
  715. package/dist/daemon/cron-run.js +1 -405
  716. package/dist/daemon/crtrd-cli.js +1 -23
  717. package/dist/daemon/crtrd.js +8 -854
  718. package/dist/daemon/delivery/run-delivery.js +1 -164
  719. package/dist/daemon/fleet.js +17 -475
  720. package/dist/daemon/human/finish.js +10 -179
  721. package/dist/daemon/human/settle.js +1 -89
  722. package/dist/daemon/human/sweep.js +1 -66
  723. package/dist/daemon/manage.js +2 -595
  724. package/dist/daemon/messaging/node-message.js +1 -99
  725. package/dist/daemon/park-activity.js +1 -30
  726. package/dist/daemon/park-pending.js +1 -52
  727. package/dist/daemon/pidfile.js +1 -37
  728. package/dist/daemon/profile-delete.js +1 -306
  729. package/dist/daemon/reconcilers/bash-deadline.js +1 -80
  730. package/dist/daemon/reconcilers/broker-supervision.js +4 -761
  731. package/dist/daemon/reconcilers/controller-death.js +1 -14
  732. package/dist/daemon/reconcilers/cron-lane.js +1 -29
  733. package/dist/daemon/reconcilers/delivery-lane.js +1 -130
  734. package/dist/daemon/reconcilers/live-obligation.js +1 -87
  735. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
  736. package/dist/daemon/reconcilers/node-deadline.js +1 -82
  737. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
  738. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
  739. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
  740. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
  741. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
  742. package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
  743. package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
  744. package/dist/daemon/review/comment-notify.js +2 -109
  745. package/dist/daemon/review/companion.js +1 -29
  746. package/dist/daemon/review/deliver.js +3 -8
  747. package/dist/daemon/review/finish.js +1 -122
  748. package/dist/daemon/review/sweep.js +1 -18
  749. package/dist/daemon/startup-policy.js +1 -1
  750. package/dist/daemon/supervise-cadence.js +1 -6
  751. package/dist/hook-authoring.js +5 -447
  752. package/dist/hook-process.js +1 -34
  753. package/dist/index.js +1 -52
  754. package/dist/migrations/001-surfaces-frontmatter.js +1 -161
  755. package/dist/migrations/002-profile-project-memory.js +1 -72
  756. package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
  757. package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
  758. package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
  759. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
  760. package/dist/migrations/activation.js +2 -89
  761. package/dist/migrations/convergent.js +2 -82
  762. package/dist/migrations/corpus.js +3 -483
  763. package/dist/migrations/frontmatter-splice.js +8 -176
  764. package/dist/migrations/profile-manifests.js +2 -70
  765. package/dist/migrations/registry.js +1 -42
  766. package/dist/migrations/runner.js +1 -85
  767. package/dist/migrations/types.js +0 -24
  768. package/dist/pi-extensions/broker-local.js +2 -106
  769. package/dist/pi-extensions/canvas-bash-valve.js +7 -461
  770. package/dist/pi-extensions/canvas-context-intro.js +2 -113
  771. package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
  772. package/dist/pi-extensions/canvas-goal-capture.js +1 -83
  773. package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
  774. package/dist/pi-extensions/canvas-passive-context.js +14 -203
  775. package/dist/pi-extensions/canvas-preview-result.js +2 -72
  776. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
  777. package/dist/pi-extensions/canvas-recap.js +11 -405
  778. package/dist/pi-extensions/canvas-review-boundary.js +3 -63
  779. package/dist/pi-extensions/canvas-stamp.js +2 -77
  780. package/dist/pi-extensions/canvas-stophook.js +1 -643
  781. package/dist/pi-extensions/canvas-structured-output.js +13 -35
  782. package/dist/pi-extensions/canvas-tool-guide.js +9 -78
  783. package/dist/pi-extensions/envelope-merge.js +8 -29
  784. package/dist/prompts/review.js +20 -42
  785. package/dist/shared/birth-announcement.js +1 -25
  786. package/dist/shared/crtr-version.js +1 -18
  787. package/dist/shared/env.js +1 -214
  788. package/dist/shared/generated-context.js +11 -226
  789. package/dist/shared/predicates.js +1 -4
  790. package/dist/shared/shell-quote.js +1 -5
  791. package/dist/shared/tool-groups.js +1 -64
  792. package/dist/shared/working-activity.js +1 -27
  793. package/dist/suppress-experimental-warnings.js +1 -15
  794. package/dist/types.js +1 -185
  795. package/docs/public-api.md +10 -9
  796. package/package.json +6 -5
  797. package/runtime.lock.json +5 -5
  798. package/dist/api/__tests__/integration/client.test.d.ts +0 -1
  799. package/dist/api/__tests__/integration/client.test.js +0 -163
  800. package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
  801. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
  802. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
  803. package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
  804. package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
  805. package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
  806. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
  807. package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
  808. package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
  809. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
  810. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
  811. package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
  812. package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
  813. package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
  814. package/dist/clients/attach/__tests__/context-message.test.js +0 -130
  815. package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
  816. package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
  817. package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
  818. package/dist/clients/attach/__tests__/diagram.test.js +0 -42
  819. package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
  820. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
  821. package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
  822. package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
  823. package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
  824. package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
  825. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
  826. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
  827. package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
  828. package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
  829. package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
  830. package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
  831. package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
  832. package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
  833. package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
  834. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
  835. package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
  836. package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
  837. package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
  838. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
  839. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
  840. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
  841. package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
  842. package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
  843. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
  844. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
  845. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
  846. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
  847. package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
  848. package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
  849. package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
  850. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
  851. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
  852. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
  853. package/dist/commands/__tests__/human.test.d.ts +0 -1
  854. package/dist/commands/__tests__/human.test.js +0 -172
  855. package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
  856. package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
  857. package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
  858. package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
  859. package/dist/commands/__tests__/node-message.test.d.ts +0 -1
  860. package/dist/commands/__tests__/node-message.test.js +0 -112
  861. package/dist/commands/__tests__/node-new.test.d.ts +0 -1
  862. package/dist/commands/__tests__/node-new.test.js +0 -58
  863. package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
  864. package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
  865. package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
  866. package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
  867. package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
  868. package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
  869. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
  870. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
  871. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
  872. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
  873. package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
  874. package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
  875. package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
  876. package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
  877. package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
  878. package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
  879. package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
  880. package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
  881. package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
  882. package/dist/core/__tests__/bash-guard.test.js +0 -190
  883. package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
  884. package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
  885. package/dist/core/__tests__/boot.test.d.ts +0 -1
  886. package/dist/core/__tests__/boot.test.js +0 -274
  887. package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
  888. package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
  889. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
  890. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
  891. package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
  892. package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
  893. package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
  894. package/dist/core/__tests__/broker-preflight.test.js +0 -95
  895. package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
  896. package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
  897. package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
  898. package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
  899. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
  900. package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
  901. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
  902. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
  903. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
  904. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
  905. package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
  906. package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
  907. package/dist/core/__tests__/canvas.test.d.ts +0 -1
  908. package/dist/core/__tests__/canvas.test.js +0 -138
  909. package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
  910. package/dist/core/__tests__/child-death-wake.test.js +0 -153
  911. package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
  912. package/dist/core/__tests__/cli-help-contract.test.js +0 -152
  913. package/dist/core/__tests__/close.test.d.ts +0 -1
  914. package/dist/core/__tests__/close.test.js +0 -284
  915. package/dist/core/__tests__/collectible.test.d.ts +0 -1
  916. package/dist/core/__tests__/collectible.test.js +0 -89
  917. package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
  918. package/dist/core/__tests__/config-change-delta.test.js +0 -108
  919. package/dist/core/__tests__/context-intro.test.d.ts +0 -1
  920. package/dist/core/__tests__/context-intro.test.js +0 -123
  921. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
  922. package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
  923. package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
  924. package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
  925. package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
  926. package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
  927. package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
  928. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
  929. package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
  930. package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
  931. package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
  932. package/dist/core/__tests__/daemon-boot.test.js +0 -422
  933. package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
  934. package/dist/core/__tests__/daemon-wedge.test.js +0 -106
  935. package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
  936. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
  937. package/dist/core/__tests__/events-contract.test.d.ts +0 -1
  938. package/dist/core/__tests__/events-contract.test.js +0 -76
  939. package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
  940. package/dist/core/__tests__/extension-abort.test.js +0 -21
  941. package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
  942. package/dist/core/__tests__/fault-classifier.test.js +0 -138
  943. package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
  944. package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
  945. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
  946. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
  947. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
  948. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
  949. package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
  950. package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
  951. package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
  952. package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
  953. package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
  954. package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
  955. package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
  956. package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
  957. package/dist/core/__tests__/focuses.test.d.ts +0 -1
  958. package/dist/core/__tests__/focuses.test.js +0 -113
  959. package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
  960. package/dist/core/__tests__/fs-utils.test.js +0 -50
  961. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
  962. package/dist/core/__tests__/helpers/broker-clients.js +0 -174
  963. package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
  964. package/dist/core/__tests__/helpers/fleet.js +0 -50
  965. package/dist/core/__tests__/helpers/harness.d.ts +0 -124
  966. package/dist/core/__tests__/helpers/harness.js +0 -806
  967. package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
  968. package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
  969. package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
  970. package/dist/core/__tests__/history-inbox.test.js +0 -121
  971. package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
  972. package/dist/core/__tests__/human-action-delivery.test.js +0 -162
  973. package/dist/core/__tests__/human-actions.test.d.ts +0 -1
  974. package/dist/core/__tests__/human-actions.test.js +0 -120
  975. package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
  976. package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
  977. package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
  978. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
  979. package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
  980. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
  981. package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
  982. package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
  983. package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
  984. package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
  985. package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
  986. package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
  987. package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
  988. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
  989. package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
  990. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
  991. package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
  992. package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
  993. package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
  994. package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
  995. package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
  996. package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
  997. package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
  998. package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
  999. package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
  1000. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
  1001. package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
  1002. package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
  1003. package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
  1004. package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
  1005. package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
  1006. package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
  1007. package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
  1008. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
  1009. package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
  1010. package/dist/core/__tests__/integration/revive.test.js +0 -615
  1011. package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
  1012. package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
  1013. package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
  1014. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
  1015. package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
  1016. package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
  1017. package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
  1018. package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
  1019. package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
  1020. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
  1021. package/dist/core/__tests__/kickoff.test.d.ts +0 -1
  1022. package/dist/core/__tests__/kickoff.test.js +0 -196
  1023. package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
  1024. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
  1025. package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
  1026. package/dist/core/__tests__/lifecycle.test.js +0 -176
  1027. package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
  1028. package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
  1029. package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
  1030. package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
  1031. package/dist/core/__tests__/migration.test.d.ts +0 -1
  1032. package/dist/core/__tests__/migration.test.js +0 -946
  1033. package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
  1034. package/dist/core/__tests__/model-pin-durability.test.js +0 -195
  1035. package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
  1036. package/dist/core/__tests__/model-routes-config.test.js +0 -150
  1037. package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
  1038. package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
  1039. package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
  1040. package/dist/core/__tests__/node-outcome.test.js +0 -246
  1041. package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
  1042. package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
  1043. package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
  1044. package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
  1045. package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
  1046. package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
  1047. package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
  1048. package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
  1049. package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
  1050. package/dist/core/__tests__/passive-subscription.test.js +0 -120
  1051. package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
  1052. package/dist/core/__tests__/pid-identity-match.test.js +0 -145
  1053. package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
  1054. package/dist/core/__tests__/pid-zombie.test.js +0 -42
  1055. package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
  1056. package/dist/core/__tests__/plugin-kinds.test.js +0 -182
  1057. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
  1058. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
  1059. package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
  1060. package/dist/core/__tests__/plugin-page-components.test.js +0 -159
  1061. package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
  1062. package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
  1063. package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
  1064. package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
  1065. package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
  1066. package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
  1067. package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
  1068. package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
  1069. package/dist/core/__tests__/prune.test.d.ts +0 -1
  1070. package/dist/core/__tests__/prune.test.js +0 -243
  1071. package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
  1072. package/dist/core/__tests__/push-final-guard.test.js +0 -191
  1073. package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
  1074. package/dist/core/__tests__/relaunch-root.test.js +0 -249
  1075. package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
  1076. package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
  1077. package/dist/core/__tests__/repository-association.test.d.ts +0 -1
  1078. package/dist/core/__tests__/repository-association.test.js +0 -153
  1079. package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
  1080. package/dist/core/__tests__/repository-root-identity.test.js +0 -223
  1081. package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
  1082. package/dist/core/__tests__/respawn-throttle.test.js +0 -20
  1083. package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
  1084. package/dist/core/__tests__/review-model-floor.test.js +0 -83
  1085. package/dist/core/__tests__/revive-all.test.d.ts +0 -1
  1086. package/dist/core/__tests__/revive-all.test.js +0 -157
  1087. package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
  1088. package/dist/core/__tests__/revive-capacity.test.js +0 -184
  1089. package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
  1090. package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
  1091. package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
  1092. package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
  1093. package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
  1094. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
  1095. package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
  1096. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
  1097. package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
  1098. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
  1099. package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
  1100. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
  1101. package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
  1102. package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
  1103. package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
  1104. package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
  1105. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
  1106. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
  1107. package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
  1108. package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
  1109. package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
  1110. package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
  1111. package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
  1112. package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
  1113. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
  1114. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
  1115. package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
  1116. package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
  1117. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
  1118. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
  1119. package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
  1120. package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
  1121. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
  1122. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
  1123. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
  1124. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
  1125. package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
  1126. package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
  1127. package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
  1128. package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
  1129. package/dist/core/__tests__/secrets.test.d.ts +0 -1
  1130. package/dist/core/__tests__/secrets.test.js +0 -49
  1131. package/dist/core/__tests__/self-update.test.d.ts +0 -1
  1132. package/dist/core/__tests__/self-update.test.js +0 -46
  1133. package/dist/core/__tests__/session-branch.test.d.ts +0 -1
  1134. package/dist/core/__tests__/session-branch.test.js +0 -61
  1135. package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
  1136. package/dist/core/__tests__/session-cycles.test.js +0 -133
  1137. package/dist/core/__tests__/session-model.test.d.ts +0 -1
  1138. package/dist/core/__tests__/session-model.test.js +0 -111
  1139. package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
  1140. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
  1141. package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
  1142. package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
  1143. package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
  1144. package/dist/core/__tests__/stdout-errors.test.js +0 -16
  1145. package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
  1146. package/dist/core/__tests__/stop-guard.test.js +0 -237
  1147. package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
  1148. package/dist/core/__tests__/stream-watchdog.test.js +0 -154
  1149. package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
  1150. package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
  1151. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
  1152. package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
  1153. package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
  1154. package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
  1155. package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
  1156. package/dist/core/__tests__/worktree-landing.test.js +0 -11
  1157. package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
  1158. package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
  1159. package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
  1160. package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
  1161. package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
  1162. package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
  1163. package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
  1164. package/dist/core/canvas/__tests__/attention.test.js +0 -83
  1165. package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
  1166. package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
  1167. package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
  1168. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
  1169. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
  1170. package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
  1171. package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
  1172. package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
  1173. package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
  1174. package/dist/core/canvas/__tests__/session-window.test.js +0 -70
  1175. package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
  1176. package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
  1177. package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
  1178. package/dist/core/human/__tests__/page-catalog.test.js +0 -20
  1179. package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
  1180. package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
  1181. package/dist/core/human/__tests__/page.test.d.ts +0 -1
  1182. package/dist/core/human/__tests__/page.test.js +0 -92
  1183. package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
  1184. package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
  1185. package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
  1186. package/dist/core/profiles/__tests__/env-store.test.js +0 -99
  1187. package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
  1188. package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
  1189. package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
  1190. package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
  1191. package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
  1192. package/dist/core/review/__tests__/capture-origin.test.js +0 -150
  1193. package/dist/core/review/__tests__/comments.test.d.ts +0 -1
  1194. package/dist/core/review/__tests__/comments.test.js +0 -116
  1195. package/dist/core/review/__tests__/remap.test.d.ts +0 -1
  1196. package/dist/core/review/__tests__/remap.test.js +0 -177
  1197. package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
  1198. package/dist/core/review/__tests__/stage-identity.test.js +0 -150
  1199. package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
  1200. package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
  1201. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
  1202. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
  1203. package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
  1204. package/dist/core/runtime/__tests__/node-env.test.js +0 -73
  1205. package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
  1206. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
  1207. package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
  1208. package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
  1209. package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
  1210. package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
  1211. package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
  1212. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
  1213. package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
  1214. package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
  1215. package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
  1216. package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
  1217. package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
  1218. package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
  1219. package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
  1220. package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
  1221. package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
  1222. package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
  1223. package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
  1224. package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
  1225. package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
  1226. package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
  1227. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
  1228. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
  1229. package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
  1230. package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
  1231. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
  1232. package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
  1233. package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
  1234. package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
  1235. package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
  1236. package/dist/daemon/__tests__/thaw-order.test.js +0 -55
  1237. package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
  1238. package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
  1239. package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
  1240. package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
  1241. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
  1242. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
  1243. package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
  1244. package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
  1245. package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
  1246. package/dist/daemon/api/__tests__/model-config.test.js +0 -73
  1247. package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
  1248. package/dist/daemon/api/__tests__/node-create-description.test.js +0 -107
  1249. package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
  1250. package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
  1251. package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
  1252. package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
  1253. package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
  1254. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
  1255. package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
  1256. package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
  1257. package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
  1258. package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
  1259. package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
  1260. package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
  1261. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
  1262. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
  1263. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
  1264. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
  1265. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
  1266. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
  1267. package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
  1268. package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
  1269. package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
  1270. package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
  1271. package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
  1272. package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
  1273. package/dist/migrations/__tests__/activation.test.d.ts +0 -1
  1274. package/dist/migrations/__tests__/activation.test.js +0 -152
  1275. package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
  1276. package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
  1277. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
  1278. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
  1279. package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
  1280. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
  1281. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
  1282. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
  1283. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
  1284. package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
  1285. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
  1286. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
  1287. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
  1288. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
  1289. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
  1290. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
  1291. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
  1292. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
  1293. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
  1294. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
  1295. package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
  1296. package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
  1297. package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
  1298. package/dist/shared/__tests__/env-boundary.test.js +0 -95
  1299. package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
  1300. package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
  1301. package/docs/compat/hearth-crtr-v1.md +0 -179
  1302. package/docs/compat/hearth-crtr-v2.md +0 -177
  1303. package/docs/compat/hearth-crtr-v3.md +0 -176
  1304. package/docs/compat/hearth-crtr-v4.md +0 -182
  1305. 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};