@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,1330 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { spawnSync } from 'node:child_process';
3
- import { existsSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { dirname, join, relative } from 'node:path';
6
- import { fileURLToPath, pathToFileURL } from 'node:url';
7
- import test from 'node:test';
8
- import { parse as parseYaml } from 'yaml';
9
- import { onDiskMigrationIdentity } from '../../../migrations/registry.js';
10
- import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
11
- import { userStore } from '../../../core/scoped-state/paths.js';
12
- import { writeRawSettings } from '../../../core/scoped-state/settings.js';
13
- import { createSourceDaemonFixture, startSourceDaemon, waitForHealth, } from '../../../daemon/__tests__/helpers/source-daemon.js';
14
- const HERE = dirname(fileURLToPath(import.meta.url));
15
- const CLI = join(HERE, '../../../cli.ts');
16
- const TSX_LOADER = import.meta.resolve('tsx/esm');
17
- const OLD_DOC = `---
18
- kind: knowledge
19
- system-prompt-visibility: content
20
- file-read-visibility: none
21
- ---
22
- # Old format
23
- `;
24
- const CURRENT_DOC = `---
25
- kind: knowledge
26
- ---
27
- # Current format
28
- `;
29
- /** The exact bytes the superseded per-store migration 003 wrote when it created
30
- * a nested store's synthetic root index. A corpus that already carries one is
31
- * the second convergence start state, and the identity-only template is the
32
- * only nested index this cut is allowed to delete. */
33
- function supersededSyntheticIndex(namespace) {
34
- return `---
35
- kind: knowledge
36
- namespace: ${namespace}
37
- when-and-why-to-read: When working in \`${namespace}\`, this knowledge should be read because it names the namespace every document in this project answers under.
38
- surfaces:
39
- - on: workspace-open
40
- at: content
41
- - on: read
42
- match: "./**"
43
- at: content
44
- ---
45
- # ${namespace}
46
-
47
- This project's memory store. Every document here answers at \`${namespace}/<local name>\`.
48
- `;
49
- }
50
- function write(path, content) {
51
- mkdirSync(dirname(path), { recursive: true });
52
- writeFileSync(path, content);
53
- }
54
- /** Store keys and target ids are realpaths, so the fixture must be one too:
55
- * macOS hands `mkdtemp` a `/var/folders` path whose realpath is `/private/...`. */
56
- const migrateCanvasHomes = new Map();
57
- function fixtureHome(prefix) {
58
- const home = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
59
- initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
60
- const root = mkdtempSync(join(tmpdir(), 'crtr-sys-migrate-daemon-'));
61
- migrateCanvasHomes.set(home, join(root, 'canvas'));
62
- return home;
63
- }
64
- function writeUserConfig(home, raw) {
65
- const store = userStore(join(home, '.crouter'));
66
- writeRawSettings({ store, key: 'user', kind: 'user', root: store.root }, raw);
67
- }
68
- /** Fixture git, with identity and signing pinned so the ambient user's global
69
- * config cannot fail a commit this test needs. */
70
- function git(cwd, ...args) {
71
- const result = spawnSync('git', ['-c', 'user.email=test@example.com', '-c', 'user.name=Test', '-c', 'commit.gpgsign=false', ...args], { cwd, encoding: 'utf8' });
72
- assert.equal(result.status, 0, `git ${args.join(' ')} in ${cwd}: ${result.stderr}`);
73
- }
74
- /** A git checkout with one commit — the minimum `git worktree add` needs. */
75
- function initRepo(dir) {
76
- mkdirSync(dir, { recursive: true });
77
- git(dir, 'init', '-b', 'main');
78
- writeFileSync(join(dir, 'README.md'), '# fixture\n');
79
- git(dir, 'add', 'README.md');
80
- git(dir, 'commit', '-m', 'fixture');
81
- }
82
- function canvasHomeFor(home) {
83
- return migrateDaemons.get(home)?.fixture.canvasHome ?? migrateCanvasHomes.get(home) ?? join(home, '.crouter', 'canvas');
84
- }
85
- function markerPath(home) {
86
- return join(canvasHomeFor(home), 'on-disk-migrations.json');
87
- }
88
- function readMarker(home) {
89
- return JSON.parse(readFileSync(markerPath(home), 'utf8'));
90
- }
91
- /** Every file under `dir`, by path, so a run that must write NOTHING can be
92
- * proved byte for byte rather than by a changed counter. */
93
- function snapshotTree(dir) {
94
- const files = new Map();
95
- const walk = (current) => {
96
- for (const entry of readdirSync(current, { withFileTypes: true })) {
97
- const path = join(current, entry.name);
98
- if (entry.isDirectory())
99
- walk(path);
100
- else if (entry.isFile())
101
- files.set(path, readFileSync(path, 'utf8'));
102
- }
103
- };
104
- walk(dir);
105
- return files;
106
- }
107
- /** The same tree keyed by home-relative path, with the home's own absolute path
108
- * replaced by a token in every file's bytes — a profile manifest stores project
109
- * paths absolutely — so two fixtures seeded in two temp homes can be compared
110
- * byte for byte. */
111
- function relativeTree(dir) {
112
- const rebased = new Map();
113
- for (const [path, content] of snapshotTree(dir))
114
- rebased.set(relative(dir, path), content.split(dir).join('<home>'));
115
- return rebased;
116
- }
117
- function assertTreeUnchanged(before, after) {
118
- assert.deepEqual([...after.keys()].sort(), [...before.keys()].sort());
119
- for (const [path, content] of before)
120
- assert.equal(after.get(path), content, `${path} changed`);
121
- }
122
- /** A home the ambient node's own CRTR_* environment cannot leak into: every
123
- * crtr variable is dropped, so the fixture's canvas/profile/node state is the
124
- * only state the run can see. */
125
- function migrateEnv(home, profileId) {
126
- const env = { ...process.env, HOME: home };
127
- for (const key of Object.keys(env)) {
128
- if (key.startsWith('CRTR_'))
129
- delete env[key];
130
- }
131
- env['CRTR_HOME'] = canvasHomeFor(home);
132
- env['CRTR_PROFILE_ID'] = profileId;
133
- env['CRTR_NO_DAEMON_AUTOSTART'] = '1';
134
- env['CRTR_NO_AUTO_INIT'] = '1';
135
- env['CRTR_NO_AUTO_UPDATE'] = '1';
136
- return env;
137
- }
138
- const migrateDaemons = new Map();
139
- async function startMigrateDaemon(home) {
140
- const canvasHome = migrateCanvasHomes.get(home);
141
- assert.ok(canvasHome, `fixture has no canvas home: ${home}`);
142
- const fixture = await createSourceDaemonFixture({
143
- root: dirname(canvasHome),
144
- home,
145
- cwd: home,
146
- canvasHome,
147
- });
148
- const process = startSourceDaemon(fixture, { CRTR_PROFILE_ID: 'root-00000000' });
149
- try {
150
- await waitForHealth(process, fixture.tcpPort);
151
- }
152
- catch (error) {
153
- await process.stop();
154
- fixture.dispose();
155
- throw error;
156
- }
157
- migrateDaemons.set(home, { fixture, process });
158
- }
159
- async function stopMigrateDaemon(home) {
160
- const daemon = migrateDaemons.get(home);
161
- if (daemon === undefined)
162
- return;
163
- migrateDaemons.delete(home);
164
- const exit = await daemon.process.stop();
165
- daemon.fixture.dispose();
166
- migrateCanvasHomes.delete(home);
167
- assert.deepEqual(exit, { code: 0, signal: null }, `migration daemon must stop cleanly; stderr:\n${daemon.process.stderr()}`);
168
- }
169
- function seedNodeMemoryTarget(home, target) {
170
- const canvas = pathToFileURL(join(HERE, '../../../core/canvas/canvas.ts')).href;
171
- const program = `
172
- import { createNode } from ${JSON.stringify(canvas)};
173
- const target = JSON.parse(process.argv[1]);
174
- createNode({
175
- node_id: target.nodeId,
176
- name: target.nodeId,
177
- created: new Date().toISOString(),
178
- cwd: target.cwd,
179
- kind: 'developer',
180
- mode: 'base',
181
- lifecycle: 'terminal',
182
- status: 'done',
183
- profile_id: target.profileId,
184
- });
185
- `;
186
- const result = spawnSync(process.execPath, ['--conditions=crtr-src', '--import', TSX_LOADER, '--input-type=module', '--eval', program, JSON.stringify(target)], { cwd: home, env: migrateEnv(home, target.profileId ?? 'root-00000000'), encoding: 'utf8' });
187
- assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
188
- }
189
- function runMigrate(home, opts = {}) {
190
- const result = spawnSync(process.execPath, [
191
- '--conditions=crtr-src',
192
- '--import',
193
- TSX_LOADER,
194
- CLI,
195
- 'sys',
196
- 'migrate',
197
- '--json',
198
- ...(opts.dryRun === true ? ['--dry-run'] : []),
199
- ...(opts.dirs ?? []).flatMap((dir) => ['--dir', dir]),
200
- ], { cwd: home, env: migrateEnv(home, opts.profileId ?? 'root-00000000'), encoding: 'utf8' });
201
- return { status: result.status, stdout: result.stdout, stderr: result.stderr };
202
- }
203
- function migrateJson(home, opts = {}) {
204
- const result = runMigrate(home, opts);
205
- assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
206
- const output = JSON.parse(result.stdout);
207
- assertReportInvariants(output);
208
- return output;
209
- }
210
- /** The report-schema rules every run obeys: a declaration is always the
211
- * repository root's own INDEX.md, a nested store's effective prefix is never
212
- * reported as one, and only a repository-root row can carry a front door. */
213
- function assertReportInvariants(output) {
214
- const declarationRoots = new Set();
215
- for (const row of output.repository_namespaces) {
216
- assert.equal(row.declaration_path, join(row.repository_root, '.crouter', 'memory', 'INDEX.md'), 'a declaration path is always the repository root\'s own INDEX.md');
217
- assert.equal(declarationRoots.has(row.repository_root), false, `two decisions for ${row.repository_root}`);
218
- declarationRoots.add(row.repository_root);
219
- }
220
- const declaredNamespaces = new Set(output.repository_namespaces.map((row) => row.namespace));
221
- for (const row of output.store_prefixes) {
222
- if (row.owner_relative_path === '') {
223
- assert.equal(row.owner_dir, row.repository_root);
224
- continue;
225
- }
226
- assert.equal(row.front_door_action, 'none', `${row.store_root} is nested and cannot own a front door`);
227
- assert.equal(declarationRoots.has(row.owner_dir), false, `${row.owner_dir} is nested, not a repository root`);
228
- assert.equal(row.effective_prefix.endsWith(`/${row.owner_relative_path}`), true, `${row.effective_prefix} must compose the owner path`);
229
- assert.equal(declaredNamespaces.has(row.effective_prefix), false, `${row.effective_prefix} is derived from a path, never a declaration`);
230
- }
231
- }
232
- function repositoryRow(output, repositoryRoot) {
233
- const row = output.repository_namespaces.find((candidate) => candidate.repository_root === repositoryRoot);
234
- assert.ok(row, `no repository decision for ${repositoryRoot} in ${JSON.stringify(output.repository_namespaces)}`);
235
- return row;
236
- }
237
- function prefixRow(output, ownerDir) {
238
- const row = output.store_prefixes.find((candidate) => candidate.owner_dir === ownerDir);
239
- assert.ok(row, `no store prefix for ${ownerDir} in ${JSON.stringify(output.store_prefixes)}`);
240
- return row;
241
- }
242
- function migrateBlocked(home, opts = {}) {
243
- const result = runMigrate(home, opts);
244
- assert.notEqual(result.status, 0, `${result.stdout}\n${result.stderr}`);
245
- return JSON.parse(result.stdout);
246
- }
247
- function manifest(name, projects) {
248
- const first = projects[0];
249
- return JSON.stringify({
250
- schema_version: 1,
251
- name,
252
- projects,
253
- home: (typeof first === 'string' ? first : first?.path) ?? null,
254
- created_at: '2026-01-01T00:00:00.000Z',
255
- last_used_at: null,
256
- });
257
- }
258
- test('sys migrate converges manifests, documents, and the whole repository-root corpus', async () => {
259
- const home = fixtureHome('crtr-sys-migrate-');
260
- const userRoot = join(home, '.crouter');
261
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
262
- const appletProfile = join(userRoot, 'profiles', 'applet-deadbeef');
263
- const appletProject = join(home, 'inactive-applet-project');
264
- const nestedOnlyProject = join(home, 'nested-only-project');
265
- const extraProject = join(home, 'extra-dir-project');
266
- const deepOwner = join(appletProject, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
267
- const deepRoot = join(deepOwner, '.crouter');
268
- const pluginRoot = join(deepRoot, 'plugins', 'deep-memory');
269
- const embeddedPluginRoot = join(nestedOnlyProject, 'embedded', '.crouter', 'plugins', 'embedded-memory');
270
- const disabledPluginRoot = join(userRoot, 'plugins', 'disabled-memory');
271
- const nodeId = 'node-aaaa1111';
272
- const nodeStore = join(canvasHomeFor(home), 'nodes', nodeId, 'context', 'memory');
273
- const userDoc = join(userRoot, 'memory', 'user-link.md');
274
- const rootDoc = join(rootProfile, 'memory', 'root.md');
275
- const appletDoc = join(appletProfile, 'memory', 'identity.md');
276
- const projectIndex = join(appletProject, '.crouter', 'memory', 'INDEX.md');
277
- const projectDoc = join(appletProject, '.crouter', 'memory', 'project.md');
278
- const projectPlain = join(appletProject, '.crouter', 'memory', 'plain.md');
279
- const projectReference = join(appletProject, '.crouter', 'memory', 'notes', 'reference.md');
280
- const deepDoc = join(deepRoot, 'memory', 'deep.md');
281
- const deepIndex = join(deepRoot, 'memory', 'INDEX.md');
282
- const pluginDoc = join(pluginRoot, 'memory', 'plugin.md');
283
- const embeddedPluginDoc = join(embeddedPluginRoot, 'memory', 'plugin.md');
284
- const disabledPluginDoc = join(disabledPluginRoot, 'memory', 'guide.md');
285
- const nodeDoc = join(nodeStore, 'note.md');
286
- try {
287
- await startMigrateDaemon(home);
288
- seedNodeMemoryTarget(home, { nodeId, cwd: appletProject, profileId: 'applet-deadbeef' });
289
- // Root's string entries migrate to `preview`; every other profile's to
290
- // `content`. The applet manifest is mixed: its already-current entry must
291
- // survive untouched while the string beside it converts.
292
- write(join(rootProfile, 'profile.json'), manifest('root', [appletProject]));
293
- write(join(appletProfile, 'profile.json'), manifest('applet-inactive', [{ path: appletProject, memory: 'name' }, nestedOnlyProject]));
294
- // User store: `[[user/scoped]]` names no document under either identity
295
- // rule, so it is a pre-existing dangling link the cut never touches.
296
- write(userDoc, `${OLD_DOC}\nSee [[user/scoped]].\n`);
297
- write(join(userRoot, 'memory', 'scoped', 'INDEX.md'), CURRENT_DOC);
298
- // Root profile store: an INDEX spelling to collapse, an unqualified project
299
- // name outside its own target stack, and a name its own target stack cannot see.
300
- write(rootDoc, `${OLD_DOC}\nSee [[notes/INDEX]], [[project]], and [[shared]].\n`);
301
- write(join(rootProfile, 'memory', 'notes', 'INDEX.md'), CURRENT_DOC);
302
- write(appletDoc, `${OLD_DOC}\nSee [[shared]].\n`);
303
- write(join(appletProfile, 'memory', 'shared', 'INDEX.md'), CURRENT_DOC);
304
- // Repository-root store: a root document that gains the repository
305
- // declaration AND carries both a link and a route rewrite, so one file
306
- // lands in both write phases; an explicit name to strip; a redundant
307
- // explicit name to drop. The route's `match:` is a BLOCK SEQUENCE: this root
308
- // owes a front door, and completing one re-renders the whole `surfaces:`
309
- // list, so the translated glob must survive that round trip.
310
- write(projectIndex, `---
311
- kind: knowledge
312
- surfaces:
313
- - on: memory-read
314
- match:
315
- - topics/*
316
- at: content
317
- ---
318
- # Applet Project
319
-
320
- See [[project]].
321
- `);
322
- write(projectDoc, OLD_DOC);
323
- write(join(appletProject, '.crouter', 'memory', 'scoped', 'INDEX.md'), CURRENT_DOC);
324
- write(projectPlain, `---\nkind: knowledge\nname: plain\n---\n# Redundant name\n`);
325
- // A FOLDED explicit name: its value spans two lines, so rewriting it must
326
- // stop at the value's last character and leave the next key standing.
327
- write(projectReference, `---\nname: >-\n applet-project/reference\nkind: knowledge\n---\n# Namespaced name\n`);
328
- write(join(appletProject, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
329
- write(join(appletProject, '.crouter', 'memory', 'topics', 'two.md'), CURRENT_DOC);
330
- // A nested store eight directories below the repository root: it declares
331
- // nothing, needs no root index, and answers under the repository namespace
332
- // composed with its own path.
333
- write(deepDoc, OLD_DOC);
334
- write(join(pluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'deep-memory', version: '1.0.0' }));
335
- write(pluginDoc, OLD_DOC);
336
- write(join(embeddedPluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'embedded-memory', version: '1.0.0' }));
337
- write(join(nestedOnlyProject, 'embedded', '.git', 'HEAD'), 'ref: refs/heads/main\n');
338
- write(embeddedPluginDoc, OLD_DOC);
339
- // A DISABLED plugin: no target mounts it, so its references resolve against
340
- // its own store alone — and it is still migrated.
341
- writeUserConfig(home, { plugins: { 'disabled-memory': { enabled: false } } });
342
- write(join(disabledPluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'disabled-memory', version: '1.0.0' }));
343
- write(join(disabledPluginRoot, 'memory', 'notes', 'INDEX.md'), CURRENT_DOC);
344
- write(disabledPluginDoc, `${CURRENT_DOC}\nSee [[disabled-memory/notes/INDEX]].\n`);
345
- // A node store whose SQL row was seeded before its documents. No meta.json
346
- // exists: corpus discovery must use the daemon-owned roster.
347
- write(nodeDoc, `${CURRENT_DOC}\nSee [[project]].\n`);
348
- // Reached by --dir only: no manifest names it and it is under no discovered
349
- // project root. Its `name:` is the FIRST frontmatter key, so the removal and
350
- // the `namespace:` insert share one offset — the shape that corrupts the
351
- // file if the two splices apply in the wrong order.
352
- write(join(extraProject, '.crouter', 'memory', 'INDEX.md'), `---\nname: extra-dir-project\nkind: knowledge\n---\n# Extra Dir Project\n`);
353
- write(join(extraProject, '.crouter', 'memory', 'topic.md'), CURRENT_DOC);
354
- const invisible = migrateJson(home, { dryRun: true });
355
- assert.deepEqual(readMarker(home), onDiskMigrationIdentity(), 'the daemon completed its empty-corpus startup before fixture bytes were seeded');
356
- assert.equal(invisible.discovered_stores.some((row) => row.store.startsWith(extraProject)), false, 'the --dir project must be outside the ambient discovery frontier');
357
- const output = migrateJson(home, { dirs: [extraProject] });
358
- assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
359
- assert.equal(output.profiles, 2);
360
- assert.equal(output.stores, 11);
361
- assert.equal(output.blockers.length, 0);
362
- // 002 — profile manifests.
363
- const readProjects = (dir) => JSON.parse(readFileSync(join(dir, 'profile.json'), 'utf8')).projects;
364
- assert.deepEqual(readProjects(rootProfile), [{ path: appletProject, memory: 'preview' }]);
365
- assert.deepEqual(readProjects(appletProfile), [
366
- { path: appletProject, memory: 'name' },
367
- { path: nestedOnlyProject, memory: 'content' },
368
- ]);
369
- // 001 — every old-format document, in every store kind, converged.
370
- for (const path of [userDoc, rootDoc, appletDoc, projectDoc, deepDoc, pluginDoc, embeddedPluginDoc]) {
371
- const migrated = readFileSync(path, 'utf8');
372
- assert.doesNotMatch(migrated, /system-prompt-visibility|file-read-visibility/);
373
- assert.match(migrated, /surfaces:\n - on: boot\n at: content/);
374
- }
375
- const nodeTarget = output.discovered_targets.find((row) => row.kind === 'node');
376
- assert.equal(nodeTarget?.node_id, nodeId);
377
- assert.equal(nodeTarget?.origin, nodeId);
378
- // A disabled plugin: discovered, mounted by no target, migrated anyway.
379
- const disabledStore = output.discovered_stores.find((row) => row.store.startsWith(disabledPluginRoot));
380
- assert.equal(disabledStore?.writable, true);
381
- assert.deepEqual(disabledStore?.targets, []);
382
- assert.match(readFileSync(disabledPluginDoc, 'utf8'), /\[\[disabled-memory\/notes\]\]/);
383
- // The --dir project entered discovery as an explicit root, and is its own
384
- // repository: home is fenced out of the non-git ancestor walk.
385
- const extraStore = output.discovered_stores.find((row) => row.store.startsWith(extraProject));
386
- assert.equal(extraStore?.reasons.includes('explicit-dir'), true);
387
- assert.deepEqual(repositoryRow(output, extraProject), {
388
- repository_root: extraProject,
389
- repository_key: `path:${extraProject}`,
390
- declaration_path: join(extraProject, '.crouter', 'memory', 'INDEX.md'),
391
- namespace: 'extra-dir-project',
392
- source: 'root-name',
393
- action: 'kept',
394
- });
395
- // The declaration replaces the first-key `name:`, byte for byte, and the
396
- // root gains the front door the repository owes.
397
- assert.equal(readFileSync(join(extraProject, '.crouter', 'memory', 'INDEX.md'), 'utf8'), `---
398
- namespace: extra-dir-project
399
- kind: knowledge
400
- surfaces:
401
- - on: workspace-open
402
- at: content
403
- - on: read
404
- match: ./**
405
- at: content
406
- ---
407
- # Extra Dir Project
408
- `);
409
- // ONE repository decision for the applet repository, derived from the root
410
- // guide's H1 — the eight-deep descendant store adds no second decision.
411
- assert.deepEqual(output.repository_namespaces.filter((row) => row.repository_root.startsWith(appletProject)), [
412
- {
413
- repository_root: appletProject,
414
- repository_key: `path:${appletProject}`,
415
- declaration_path: projectIndex,
416
- namespace: 'applet-project',
417
- source: 'root-guide-h1',
418
- action: 'kept',
419
- },
420
- ]);
421
- // One store-prefix row per project store: the repository root at `''`, the
422
- // descendant at its normalized path under it. Plugin, user, profile, and
423
- // node stores are not project stores and carry no row.
424
- assert.deepEqual(output.store_prefixes.map((row) => [row.owner_dir, row.owner_relative_path, row.effective_prefix, row.front_door_action]).sort(), [
425
- [appletProject, '', 'applet-project', 'created-root'],
426
- [deepOwner, 'a/b/c/d/e/f/g/h', 'applet-project/a/b/c/d/e/f/g/h', 'none'],
427
- [extraProject, '', 'extra-dir-project', 'created-root'],
428
- ].sort());
429
- assert.equal(prefixRow(output, deepOwner).nested_declaration_action, 'none');
430
- assert.equal(prefixRow(output, deepOwner).old_rule, 'pre-003');
431
- // A nested store owes no root index and is never handed a synthetic one.
432
- assert.equal(existsSync(deepIndex), false);
433
- // Discovery reports each store as the run FOUND it: before this cut nothing
434
- // up the tree declares a namespace, so the deep store mounts nowhere.
435
- const deepStoreBefore = output.discovered_stores.find((row) => row.store === join(deepRoot, 'memory'));
436
- assert.equal(deepStoreBefore?.namespace, '');
437
- assert.equal(deepStoreBefore?.mount_status, 'undeclared');
438
- assert.equal(output.renames.some((row) => row.path === deepDoc && row.from === 'deep' && row.to === 'applet-project/a/b/c/d/e/f/g/h/deep'), true, JSON.stringify(output.renames));
439
- // Identity rewrites in the repository-root store.
440
- const projectIndexText = readFileSync(projectIndex, 'utf8');
441
- assert.match(projectIndexText, /^---\nnamespace: applet-project\n/);
442
- assert.equal(readFileSync(projectPlain, 'utf8'), `---\nkind: knowledge\n---\n# Redundant name\n`);
443
- assert.equal(readFileSync(projectReference, 'utf8'), `---\nname: reference\nkind: knowledge\n---\n# Namespaced name\n`);
444
- assert.equal(output.renames.some((row) => row.path === projectDoc && row.from === 'project' && row.to === 'applet-project/project'), true);
445
- // Reference rewrites: qualification across stores, one INDEX collapse, and
446
- // an absolute memory-read route split-proof — the route and the link ride
447
- // the same file as its own identity rewrite and its own front-door
448
- // completion.
449
- const rootDocText = readFileSync(rootDoc, 'utf8');
450
- assert.match(rootDocText, /\[\[notes\]\]/);
451
- assert.match(rootDocText, /\[\[project\]\]/);
452
- assert.match(rootDocText, /\[\[shared\]\]/);
453
- assert.match(readFileSync(userDoc, 'utf8'), /\[\[user\/scoped\]\]/);
454
- assert.match(readFileSync(appletDoc, 'utf8'), /\[\[shared\]\]/);
455
- assert.match(readFileSync(nodeDoc, 'utf8'), /\[\[applet-project\/project\]\]/);
456
- assert.equal(projectIndexText, `---
457
- namespace: applet-project
458
- kind: knowledge
459
- surfaces:
460
- - on: memory-read
461
- match: applet-project/topics/*
462
- at: content
463
- - on: workspace-open
464
- at: content
465
- - on: read
466
- match: ./**
467
- at: content
468
- ---
469
- # Applet Project
470
-
471
- See [[applet-project/project]].
472
- `);
473
- assert.equal(output.references.some((row) => row.kind === 'memory-read' && row.from === 'topics/*' && row.to === 'applet-project/topics/*'), true);
474
- // A second run over converged state writes nothing.
475
- const converged = snapshotTree(home);
476
- // A no-change forced run still replaces an outdated completion marker.
477
- writeFileSync(markerPath(home), JSON.stringify([{ id: 'older-migration', lane: 'convergent' }]));
478
- const second = migrateJson(home, { dirs: [extraProject] });
479
- assert.equal(second.changed, 0);
480
- assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
481
- assert.deepEqual(second.applied, []);
482
- assert.deepEqual(second.references, []);
483
- // The old side is reconstructed from FILE TRUTH alone, and a cut corpus is
484
- // final authority, not old authority: the repository root's kept declaration
485
- // is what the deep store already answers under, and no document there
486
- // carries an explicit name this cut would rewrite. So the deep store's row
487
- // reports that same prefix as its old one and NOTHING moves — no rename, no
488
- // reference rewrite, no splice, and a byte-identical tree.
489
- assert.deepEqual(second.renames, []);
490
- assert.equal(prefixRow(second, deepOwner).old_rule, 'per-store-declaration');
491
- assert.equal(prefixRow(second, deepOwner).old_prefix, 'applet-project/a/b/c/d/e/f/g/h');
492
- assert.equal(repositoryRow(second, appletProject).source, 'declared');
493
- assert.equal(prefixRow(second, appletProject).front_door_action, 'kept-root');
494
- // The runtime resolver composes exactly the prefix the migration reported:
495
- // the deep store now mounts under the repository namespace plus its path.
496
- const deepStoreAfter = second.discovered_stores.find((row) => row.store === join(deepRoot, 'memory'));
497
- assert.equal(deepStoreAfter?.namespace, 'applet-project/a/b/c/d/e/f/g/h');
498
- assert.equal(deepStoreAfter?.mount_status, 'ready');
499
- assertTreeUnchanged(converged, snapshotTree(home));
500
- const currentMarker = readFileSync(markerPath(home), 'utf8');
501
- const preview = migrateJson(home, { dirs: [extraProject], dryRun: true });
502
- assert.equal(preview.changed, 0);
503
- assert.equal(readFileSync(markerPath(home), 'utf8'), currentMarker);
504
- // Interruption-shaped state under a current marker: the explicit command
505
- // must still finish the cut from file truth alone.
506
- writeFileSync(projectIndex, projectIndexText.replace('namespace: applet-project\n', ''));
507
- writeFileSync(projectPlain, readFileSync(projectPlain, 'utf8').replace('kind: knowledge\n', 'kind: knowledge\nname: plain\n'));
508
- const resumed = migrateJson(home, { dirs: [extraProject] });
509
- assert.equal(resumed.blockers.length, 0);
510
- assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
511
- assertTreeUnchanged(converged, snapshotTree(home));
512
- }
513
- finally {
514
- await stopMigrateDaemon(home);
515
- rmSync(home, { recursive: true, force: true });
516
- }
517
- });
518
- /** The identity state a corpus can start from: never migrated at all, or
519
- * carrying the superseded per-store 003 output plus its completion marker. */
520
- function seedConvergenceFixture(home, start) {
521
- const userRoot = join(home, '.crouter');
522
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
523
- const project = join(home, 'conv-project');
524
- const nestedOwner = join(project, 'pkg');
525
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
526
- write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
527
- write(join(nestedOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
528
- if (start === 'pre-003') {
529
- // Nothing declares a namespace, so both documents answer under their own
530
- // local names and the user store's links name them that way.
531
- write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[guide]] and [[note]].\n`);
532
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Conv Project\n`);
533
- return;
534
- }
535
- // Exactly what the superseded migration wrote: a per-store declaration on the
536
- // repository root, a synthetic identity-only index on the nested store whose
537
- // namespace is its own bare directory name, the links it translated to those
538
- // two per-store prefixes, and the old id in the completion marker.
539
- write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[conv-project/guide]] and [[pkg/note]].\n`);
540
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: conv-project\nkind: knowledge\n---\n# Conv Project\n`);
541
- write(join(nestedOwner, '.crouter', 'memory', 'INDEX.md'), supersededSyntheticIndex('pkg'));
542
- write(markerPath(home), JSON.stringify([{ id: '003-workspace-qualified-memory-identity', lane: 'corpus' }]));
543
- }
544
- test('pre-003 and superseded-003 corpora converge to the same bytes and the same current marker', async () => {
545
- const preHome = fixtureHome('crtr-sys-migrate-conv-pre-');
546
- const oldHome = fixtureHome('crtr-sys-migrate-conv-old-');
547
- try {
548
- await startMigrateDaemon(preHome);
549
- await startMigrateDaemon(oldHome);
550
- seedConvergenceFixture(preHome, 'pre-003');
551
- seedConvergenceFixture(oldHome, 'superseded-003');
552
- const fromPre = migrateJson(preHome);
553
- const fromOld = migrateJson(oldHome);
554
- assert.deepEqual(fromPre.blockers, []);
555
- assert.deepEqual(fromOld.blockers, []);
556
- assert.deepEqual(readMarker(preHome), onDiskMigrationIdentity());
557
- assert.deepEqual(readMarker(oldHome), onDiskMigrationIdentity());
558
- // The superseded run's synthetic nested index is identity-only and is
559
- // deleted, not emptied — so both corpora hold the same files.
560
- assert.equal(existsSync(join(oldHome, 'conv-project', 'pkg', '.crouter', 'memory', 'INDEX.md')), false);
561
- assertTreeUnchanged(relativeTree(preHome), relativeTree(oldHome));
562
- // Both start states' links land on the one composed name: the local name the
563
- // pre-003 corpus used and the bare per-store prefix the superseded one used
564
- // are the SAME document, and it now answers under the repository.
565
- assert.equal(readFileSync(join(preHome, '.crouter', 'memory', 'pointer.md'), 'utf8'), `${CURRENT_DOC}\nSee [[conv-project/guide]] and [[conv-project/pkg/note]].\n`);
566
- // Both report the same identity facts even though they started differently,
567
- // and each proves the move its own legacy state owed: the nested document
568
- // answered at a bare local name pre-003 and at its own per-store declaration
569
- // after the superseded run, and lands on the repository-composed name from
570
- // either. The second run over that finished corpus is the convergence proof
571
- // — nothing moved, so nothing is renamed or rewritten.
572
- for (const [home, output, oldRule, nestedOldName] of [
573
- [preHome, fromPre, 'pre-003', 'note'],
574
- [oldHome, fromOld, 'per-store-declaration', 'pkg/note'],
575
- ]) {
576
- const project = join(home, 'conv-project');
577
- assert.equal(repositoryRow(output, project).namespace, 'conv-project');
578
- assert.equal(prefixRow(output, join(project, 'pkg')).effective_prefix, 'conv-project/pkg');
579
- assert.equal(prefixRow(output, join(project, 'pkg')).old_rule, oldRule);
580
- assert.equal(output.renames.some((row) => row.path === join(project, 'pkg', '.crouter', 'memory', 'note.md') &&
581
- row.from === nestedOldName &&
582
- row.to === 'conv-project/pkg/note'), true, JSON.stringify(output.renames));
583
- const converged = snapshotTree(home);
584
- const secondRun = migrateJson(home);
585
- assert.equal(secondRun.changed, 0);
586
- assert.deepEqual(secondRun.renames, []);
587
- assert.deepEqual(secondRun.references, []);
588
- assertTreeUnchanged(converged, snapshotTree(home));
589
- }
590
- assert.equal(prefixRow(fromOld, join(oldHome, 'conv-project', 'pkg')).nested_declaration_action, 'synthetic-index-removed');
591
- assert.equal(prefixRow(fromPre, join(preHome, 'conv-project', 'pkg')).nested_declaration_action, 'none');
592
- }
593
- finally {
594
- await stopMigrateDaemon(preHome);
595
- await stopMigrateDaemon(oldHome);
596
- rmSync(preHome, { recursive: true, force: true });
597
- rmSync(oldHome, { recursive: true, force: true });
598
- }
599
- });
600
- test('a repository declaration is kept when declared, derived from the root guide, or created when no root index exists', async () => {
601
- const home = fixtureHome('crtr-sys-migrate-decisions-');
602
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
603
- const kept = join(home, 'kept-project');
604
- const derived = join(home, 'derived-project');
605
- const created = join(home, 'created-project');
606
- try {
607
- await startMigrateDaemon(home);
608
- write(join(rootProfile, 'profile.json'), manifest('root', [kept, derived, created].map((path) => ({ path, memory: 'content' }))));
609
- write(join(kept, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: kept-ns\nkind: knowledge\n---\n# Kept\n`);
610
- write(join(kept, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
611
- write(join(derived, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Derived Title\n`);
612
- // No root index at all: the declaration is created rather than edited.
613
- write(join(created, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
614
- const output = migrateJson(home);
615
- assert.deepEqual(output.blockers, []);
616
- assert.deepEqual(output.repository_namespaces.map((row) => [row.repository_root, row.namespace, row.source, row.action]).sort(), [
617
- [created, 'created-project', 'owner-basename', 'created'],
618
- [derived, 'derived-title', 'root-guide-h1', 'kept'],
619
- [kept, 'kept-ns', 'declared', 'kept'],
620
- ].sort());
621
- assert.equal(readFileSync(join(kept, '.crouter', 'memory', 'INDEX.md'), 'utf8').startsWith('---\nnamespace: kept-ns\n'), true, 'a valid declaration is never rewritten');
622
- assert.equal(readFileSync(join(created, '.crouter', 'memory', 'INDEX.md'), 'utf8'), `---
623
- namespace: "created-project"
624
- kind: knowledge
625
- when-and-why-to-read: When working in \`created-project\`, this knowledge should be read because it names the namespace every document in this repository answers under.
626
- surfaces:
627
- - on: workspace-open
628
- at: content
629
- - on: read
630
- match: "./**"
631
- at: content
632
- ---
633
-
634
- # created-project
635
-
636
- This project's memory store. Every document here answers at \`created-project/<local name>\`.
637
- `);
638
- assert.equal(migrateJson(home).changed, 0);
639
- }
640
- finally {
641
- await stopMigrateDaemon(home);
642
- rmSync(home, { recursive: true, force: true });
643
- }
644
- });
645
- test('a git repository whose only stores are descendants gets its repository-root declaration created', async () => {
646
- const home = fixtureHome('crtr-sys-migrate-git-descendant-');
647
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
648
- const repo = join(home, 'pkg-repo');
649
- const nestedOwner = join(repo, 'pkg');
650
- try {
651
- await startMigrateDaemon(home);
652
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: repo, memory: 'content' }]));
653
- initRepo(repo);
654
- write(join(nestedOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
655
- const output = migrateJson(home);
656
- assert.deepEqual(output.blockers, []);
657
- assert.deepEqual(output.repository_namespaces, [
658
- {
659
- repository_root: repo,
660
- repository_key: `git:${join(repo, '.git')}`,
661
- declaration_path: join(repo, '.crouter', 'memory', 'INDEX.md'),
662
- namespace: 'pkg-repo',
663
- source: 'git-worktree',
664
- action: 'created',
665
- },
666
- ]);
667
- assert.deepEqual(output.store_prefixes.map((row) => [row.owner_dir, row.owner_relative_path, row.effective_prefix]), [[nestedOwner, 'pkg', 'pkg-repo/pkg']]);
668
- assert.match(readFileSync(join(repo, '.crouter', 'memory', 'INDEX.md'), 'utf8'), /^---\nnamespace: "pkg-repo"\n/);
669
- assert.equal(output.renames.some((row) => row.from === 'note' && row.to === 'pkg-repo/pkg/note'), true, JSON.stringify(output.renames));
670
- const second = migrateJson(home);
671
- assert.equal(second.changed, 0, JSON.stringify(second.applied));
672
- }
673
- finally {
674
- await stopMigrateDaemon(home);
675
- rmSync(home, { recursive: true, force: true });
676
- }
677
- });
678
- test('linked worktrees agree on one declaration, and a linked root missing one is filled from it', async () => {
679
- for (const mode of ['agree', 'fill']) {
680
- const home = fixtureHome(`crtr-sys-migrate-worktree-${mode}-`);
681
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
682
- const main = join(home, 'shared-main');
683
- const linked = join(home, 'shared-linked');
684
- try {
685
- await startMigrateDaemon(home);
686
- write(join(rootProfile, 'profile.json'), manifest('root', [main, linked].map((path) => ({ path, memory: 'content' }))));
687
- initRepo(main);
688
- git(main, 'worktree', 'add', linked, '-b', 'linked');
689
- // Written after the worktree exists, so each checkout carries its own
690
- // untracked declaration rather than a copy of the other's.
691
- write(join(main, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: shared-code\nkind: knowledge\n---\n# Shared\n`);
692
- write(join(main, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
693
- write(join(linked, '.crouter', 'memory', 'INDEX.md'), mode === 'agree'
694
- ? `---\nnamespace: shared-code\nkind: knowledge\n---\n# Shared\n`
695
- : `---\nkind: knowledge\n---\n# Shared\n`);
696
- const output = migrateJson(home);
697
- assert.deepEqual(output.blockers, []);
698
- const mainRow = repositoryRow(output, main);
699
- const linkedRow = repositoryRow(output, linked);
700
- // One repository key, two physical roots, one namespace.
701
- assert.equal(mainRow.repository_key, `git:${join(main, '.git')}`);
702
- assert.equal(linkedRow.repository_key, mainRow.repository_key);
703
- assert.equal(mainRow.namespace, 'shared-code');
704
- assert.equal(linkedRow.namespace, 'shared-code');
705
- assert.equal(mainRow.action, 'kept');
706
- assert.equal(linkedRow.action, mode === 'agree' ? 'kept' : 'filled-linked-root');
707
- assert.match(readFileSync(join(linked, '.crouter', 'memory', 'INDEX.md'), 'utf8'), /^---\nnamespace: shared-code\n/);
708
- assert.equal(migrateJson(home).changed, 0);
709
- }
710
- finally {
711
- await stopMigrateDaemon(home);
712
- rmSync(home, { recursive: true, force: true });
713
- }
714
- }
715
- });
716
- test('linked worktree roots declaring different namespaces block the corpus', async () => {
717
- const home = fixtureHome('crtr-sys-migrate-worktree-conflict-');
718
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
719
- const main = join(home, 'shared-main');
720
- const linked = join(home, 'shared-linked');
721
- try {
722
- await startMigrateDaemon(home);
723
- write(join(rootProfile, 'profile.json'), manifest('root', [main, linked].map((path) => ({ path, memory: 'content' }))));
724
- initRepo(main);
725
- git(main, 'worktree', 'add', linked, '-b', 'linked');
726
- write(join(main, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: main-ns\nkind: knowledge\n---\n# Shared\n`);
727
- write(join(linked, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: linked-ns\nkind: knowledge\n---\n# Shared\n`);
728
- const before = snapshotTree(main);
729
- const payload = migrateBlocked(home);
730
- const blocker = payload.received.blockers.find((row) => /declare different namespaces/.test(row.message));
731
- assert.ok(blocker, JSON.stringify(payload.received.blockers));
732
- assert.equal(blocker.kind, 'namespace');
733
- assert.deepEqual(blocker.paths?.sort(), [
734
- join(linked, '.crouter', 'memory', 'INDEX.md'),
735
- join(main, '.crouter', 'memory', 'INDEX.md'),
736
- ].sort());
737
- assert.equal(payload.received.corpus_phase, 'not-started');
738
- assertTreeUnchanged(before, snapshotTree(main));
739
- }
740
- finally {
741
- await stopMigrateDaemon(home);
742
- rmSync(home, { recursive: true, force: true });
743
- }
744
- });
745
- test('a nested declaration is removed, an exact synthetic index is deleted, and a substantive one is kept', async () => {
746
- const home = fixtureHome('crtr-sys-migrate-nested-declarations-');
747
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
748
- const project = join(home, 'nest-repo');
749
- const syntheticOwner = join(project, 'syn');
750
- const substantiveOwner = join(project, 'sub');
751
- const syntheticIndex = join(syntheticOwner, '.crouter', 'memory', 'INDEX.md');
752
- const substantiveIndex = join(substantiveOwner, '.crouter', 'memory', 'INDEX.md');
753
- try {
754
- await startMigrateDaemon(home);
755
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
756
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: nest-repo\nkind: knowledge\n---\n# Nest Repo\n`);
757
- write(syntheticIndex, supersededSyntheticIndex('syn'));
758
- write(join(syntheticOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
759
- write(substantiveIndex, `---\nnamespace: sub\nkind: knowledge\n---\n# Sub package\n\nReal guidance a reader loses if this file is deleted.\n`);
760
- const output = migrateJson(home);
761
- assert.deepEqual(output.blockers, []);
762
- assert.equal(prefixRow(output, syntheticOwner).nested_declaration_action, 'synthetic-index-removed');
763
- assert.equal(prefixRow(output, substantiveOwner).nested_declaration_action, 'removed');
764
- assert.equal(existsSync(syntheticIndex), false, 'the identity-only template is deleted, not emptied');
765
- assert.equal(readFileSync(substantiveIndex, 'utf8'), `---\nkind: knowledge\n---\n# Sub package\n\nReal guidance a reader loses if this file is deleted.\n`);
766
- assert.equal(output.renames.some((row) => row.from === 'syn/note' && row.to === 'nest-repo/syn/note'), true, JSON.stringify(output.renames));
767
- assert.equal(output.renames.some((row) => row.path === substantiveIndex && row.from === 'sub' && row.to === 'nest-repo/sub'), true, JSON.stringify(output.renames));
768
- assert.equal(migrateJson(home).changed, 0);
769
- }
770
- finally {
771
- await stopMigrateDaemon(home);
772
- rmSync(home, { recursive: true, force: true });
773
- }
774
- });
775
- test('a rootless repository takes its front door from the one legacy guide that owns it', async () => {
776
- const home = fixtureHome('crtr-sys-migrate-front-door-');
777
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
778
- const project = join(home, 'fd-root');
779
- const guide = join(project, '.crouter', 'memory', 'guide.md');
780
- const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
781
- try {
782
- await startMigrateDaemon(home);
783
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
784
- write(guide, `---
785
- kind: knowledge
786
- name: project-guide
787
- surfaces:
788
- - on: workspace-open
789
- at: content
790
- - on: read
791
- match: "./**"
792
- at: content
793
- ---
794
- # FD Root guide
795
-
796
- The authored body, preserved byte for byte.
797
- `);
798
- const output = migrateJson(home);
799
- assert.deepEqual(output.blockers, []);
800
- assert.equal(repositoryRow(output, project).action, 'created');
801
- assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:.crouter/memory/guide.md');
802
- // The created root links the leaf's FINAL canonical name.
803
- assert.equal(readFileSync(rootIndex, 'utf8'), `---
804
- namespace: "fd-root"
805
- kind: knowledge
806
- when-and-why-to-read: When working in \`fd-root\`, this knowledge should be read because it names the namespace every document in this repository answers under.
807
- surfaces:
808
- - on: workspace-open
809
- at: content
810
- - on: read
811
- match: "./**"
812
- at: content
813
- ---
814
-
815
- # fd-root
816
-
817
- This project's memory store. Every document here answers at \`fd-root/<local name>\`. Read [[fd-root/project-guide]] for the detailed project guide.
818
- `);
819
- // The leaf keeps its path, local name, read route, and body — only the
820
- // workspace-open entry leaves.
821
- assert.equal(readFileSync(guide, 'utf8'), `---
822
- kind: knowledge
823
- name: project-guide
824
- surfaces:
825
- - on: read
826
- match: "./**"
827
- at: content
828
- ---
829
- # FD Root guide
830
-
831
- The authored body, preserved byte for byte.
832
- `);
833
- const converged = snapshotTree(home);
834
- const second = migrateJson(home);
835
- assert.equal(second.changed, 0);
836
- assert.equal(prefixRow(second, project).front_door_action, 'kept-root');
837
- assertTreeUnchanged(converged, snapshotTree(home));
838
- }
839
- finally {
840
- await stopMigrateDaemon(home);
841
- rmSync(home, { recursive: true, force: true });
842
- }
843
- });
844
- test('repository-relative ordering prefixes do not block migration and derive canonical owner paths', async () => {
845
- const home = fixtureHome('crtr-sys-migrate-ordering-prefix-');
846
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
847
- const repository = join(home, 'ordered-repository');
848
- const nestedOwner = join(repository, '01-api');
849
- const rootIndex = join(repository, '.crouter', 'memory', 'INDEX.md');
850
- const nestedDoc = join(nestedOwner, '.crouter', 'memory', 'guide.md');
851
- try {
852
- await startMigrateDaemon(home);
853
- initRepo(repository);
854
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: repository, memory: 'content' }]));
855
- write(rootIndex, '---\nnamespace: acme\nkind: knowledge\n---\n# Repository\n');
856
- write(nestedDoc, '---\nkind: knowledge\n---\n# API guide\n');
857
- const output = migrateJson(home);
858
- assert.deepEqual(output.blockers, []);
859
- assert.equal(prefixRow(output, nestedOwner).owner_relative_path, 'api');
860
- assert.equal(prefixRow(output, nestedOwner).effective_prefix, 'acme/api');
861
- }
862
- finally {
863
- await stopMigrateDaemon(home);
864
- rmSync(home, { recursive: true, force: true });
865
- }
866
- });
867
- test('the legacy front door is found in a nested store of the same repository, and a half-done transfer finishes', async () => {
868
- const home = fixtureHome('crtr-sys-migrate-front-door-nested-');
869
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
870
- const project = join(home, 'fd-nested');
871
- const nestedOwner = join(project, 'pkg');
872
- const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
873
- const guide = join(nestedOwner, '.crouter', 'memory', 'guide.md');
874
- const legacyNamed = join(nestedOwner, '.crouter', 'memory', 'deep-note.md');
875
- try {
876
- await startMigrateDaemon(home);
877
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
878
- write(rootIndex, `---\nnamespace: fd-nested\nkind: knowledge\n---\n# FD Nested\n`);
879
- write(guide, `---
880
- kind: knowledge
881
- surfaces:
882
- - on: workspace-open
883
- at: content
884
- - on: read
885
- match: "./**"
886
- at: content
887
- ---
888
- # Nested guide
889
- `);
890
- // The nested store declares nothing under a root that already does — the
891
- // shape a cut corpus is also in. This fully qualified `name:` is one this
892
- // cut never leaves behind, so it proves the store is still pre-003 and its
893
- // documents answered at bare local names.
894
- write(legacyNamed, `---\nname: fd-nested/pkg/legacy-note\nkind: knowledge\n---\n# Legacy named\n`);
895
- const output = migrateJson(home);
896
- assert.deepEqual(output.blockers, []);
897
- assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:pkg/.crouter/memory/guide.md');
898
- assert.equal(prefixRow(output, nestedOwner).front_door_action, 'none');
899
- assert.equal(prefixRow(output, nestedOwner).old_rule, 'pre-003');
900
- assert.equal(output.renames.some((row) => row.path === guide && row.from === 'guide' && row.to === 'fd-nested/pkg/guide'), true, JSON.stringify(output.renames));
901
- // Its address never moved — only the spelling of the name that carried it.
902
- assert.equal(output.renames.some((row) => row.path === legacyNamed), false, JSON.stringify(output.renames));
903
- assert.equal(readFileSync(legacyNamed, 'utf8'), `---\nname: legacy-note\nkind: knowledge\n---\n# Legacy named\n`);
904
- // The repository root now carries the door; the nested leaf keeps its own
905
- // owner-anchored read route.
906
- assert.match(readFileSync(rootIndex, 'utf8'), /surfaces:\n {2}- on: workspace-open\n {4}at: content\n/);
907
- assert.equal(readFileSync(guide, 'utf8'), `---
908
- kind: knowledge
909
- surfaces:
910
- - on: read
911
- match: "./**"
912
- at: content
913
- ---
914
- # Nested guide
915
- `);
916
- // Nothing legacy is left in the nested store, so the second run reads the
917
- // root declaration it already answers under as its old prefix too.
918
- const second = migrateJson(home);
919
- assert.equal(second.changed, 0);
920
- assert.deepEqual(second.renames, []);
921
- assert.equal(prefixRow(second, nestedOwner).old_rule, 'per-store-declaration');
922
- assert.equal(prefixRow(second, nestedOwner).old_prefix, 'fd-nested/pkg');
923
- // Interruption shape: the root already owns the pair while the leaf still
924
- // carries workspace-open. State is read from the two documents alone, so
925
- // the run re-detects the transfer and finishes it.
926
- write(guide, `---
927
- kind: knowledge
928
- surfaces:
929
- - on: workspace-open
930
- at: content
931
- - on: read
932
- match: "./**"
933
- at: content
934
- ---
935
- # Nested guide
936
- `);
937
- const resumed = migrateJson(home);
938
- assert.deepEqual(resumed.blockers, []);
939
- assert.equal(prefixRow(resumed, project).front_door_action, 'transferred-from:pkg/.crouter/memory/guide.md');
940
- assert.doesNotMatch(readFileSync(guide, 'utf8'), /workspace-open/);
941
- }
942
- finally {
943
- await stopMigrateDaemon(home);
944
- rmSync(home, { recursive: true, force: true });
945
- }
946
- });
947
- test('two legacy front doors, and a root workspace-open that is not at content, each block the corpus', async () => {
948
- for (const shape of ['two-leaves', 'root-predicate']) {
949
- const home = fixtureHome(`crtr-sys-migrate-front-door-${shape}-`);
950
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
951
- const project = join(home, 'fd-blocked');
952
- const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
953
- const frontDoor = `surfaces:
954
- - on: workspace-open
955
- at: content
956
- - on: read
957
- match: "./**"
958
- at: content`;
959
- try {
960
- await startMigrateDaemon(home);
961
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
962
- if (shape === 'two-leaves') {
963
- write(rootIndex, `---\nnamespace: fd-blocked\nkind: knowledge\n---\n# FD Blocked\n`);
964
- write(join(project, '.crouter', 'memory', 'one.md'), `---\nkind: knowledge\n${frontDoor}\n---\n# One\n`);
965
- write(join(project, 'pkg', '.crouter', 'memory', 'two.md'), `---\nkind: knowledge\n${frontDoor}\n---\n# Two\n`);
966
- }
967
- else {
968
- write(rootIndex, `---\nnamespace: fd-blocked\nkind: knowledge\nsurfaces:\n - on: workspace-open\n at: preview\n---\n# FD Blocked\n`);
969
- write(join(project, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
970
- }
971
- const before = snapshotTree(project);
972
- const payload = migrateBlocked(home);
973
- const blocker = payload.received.blockers.find((row) => row.kind === 'front-door');
974
- assert.ok(blocker, JSON.stringify(payload.received.blockers));
975
- if (shape === 'two-leaves') {
976
- assert.match(blocker.message, /more than one non-root document carrying the complete workspace front door/);
977
- assert.deepEqual(blocker.paths?.sort(), [
978
- join(project, '.crouter', 'memory', 'one.md'),
979
- join(project, 'pkg', '.crouter', 'memory', 'two.md'),
980
- ].sort());
981
- }
982
- else {
983
- assert.match(blocker.message, /workspace-open route that migration cannot make authoritative/);
984
- assert.deepEqual(blocker.paths, [rootIndex]);
985
- }
986
- assert.equal(payload.received.corpus_phase, 'not-started');
987
- assert.equal(existsSync(markerPath(home)), false);
988
- assertTreeUnchanged(before, snapshotTree(project));
989
- }
990
- finally {
991
- await stopMigrateDaemon(home);
992
- rmSync(home, { recursive: true, force: true });
993
- }
994
- }
995
- });
996
- test('a leaf carrying both the legacy front door and a translated route keeps every retained authored byte', async () => {
997
- const home = fixtureHome('crtr-sys-migrate-front-door-compose-');
998
- const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
999
- const project = join(home, 'compose-repo');
1000
- const workspaceDoc = join(project, '.crouter', 'memory', 'workspace.md');
1001
- try {
1002
- await startMigrateDaemon(home);
1003
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
1004
- // Pre-003 identity: nothing declares a namespace, so `topics/*` still names
1005
- // the store's own documents and must be translated in the same pass that
1006
- // strips this document's workspace-open entry.
1007
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Compose Repo\n`);
1008
- write(join(project, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
1009
- write(join(project, '.crouter', 'memory', 'topics', 'two.md'), CURRENT_DOC);
1010
- write(join(project, '.crouter', 'memory', 'guides', 'setup.md'), CURRENT_DOC);
1011
- write(workspaceDoc, `---
1012
- kind: knowledge
1013
- name: project-guide
1014
- surfaces:
1015
- - on: workspace-open
1016
- at: content
1017
- - on: read
1018
- match: "./**"
1019
- at: content
1020
- - on: memory-read
1021
- match:
1022
- - topics/*
1023
- - guides/*
1024
- at: content
1025
- ---
1026
- # Compose workspace
1027
-
1028
- Body bytes that must survive both transforms.
1029
- `);
1030
- const output = migrateJson(home);
1031
- assert.deepEqual(output.blockers, []);
1032
- assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:.crouter/memory/workspace.md');
1033
- // The front-door removal and the consumer route rewrite compose: the
1034
- // workspace-open entry is gone, the route is translated, the read route and
1035
- // the body are untouched.
1036
- assert.equal(readFileSync(workspaceDoc, 'utf8'), `---
1037
- kind: knowledge
1038
- name: project-guide
1039
- surfaces:
1040
- - on: read
1041
- match: "./**"
1042
- at: content
1043
- - on: memory-read
1044
- match:
1045
- ["compose-repo/topics/*", "compose-repo/guides/*"]
1046
- at: content
1047
- ---
1048
- # Compose workspace
1049
-
1050
- Body bytes that must survive both transforms.
1051
- `);
1052
- // Those bytes are YAML the runtime can read, not just text that looks right.
1053
- assert.deepEqual(parseYaml(readFileSync(workspaceDoc, 'utf8').split('---\n')[1] ?? '')?.surfaces, [
1054
- { on: 'read', match: './**', at: 'content' },
1055
- { on: 'memory-read', match: ['compose-repo/topics/*', 'compose-repo/guides/*'], at: 'content' },
1056
- ]);
1057
- for (const [from, to] of [['topics/*', 'compose-repo/topics/*'], ['guides/*', 'compose-repo/guides/*']]) {
1058
- assert.equal(output.references.some((row) => row.path === workspaceDoc && row.kind === 'memory-read' && row.from === from && row.to === to), true, JSON.stringify(output.references));
1059
- }
1060
- assert.equal(migrateJson(home).changed, 0);
1061
- }
1062
- finally {
1063
- await stopMigrateDaemon(home);
1064
- rmSync(home, { recursive: true, force: true });
1065
- }
1066
- });
1067
- test('an unreadable profile manifest blocks forced completion and remains in skipped output', async () => {
1068
- const home = fixtureHome('crtr-sys-migrate-unreadable-profile-');
1069
- const userRoot = join(home, '.crouter');
1070
- const profileId = 'bad-deadbeef';
1071
- const profilePath = join(userRoot, 'profiles', profileId, 'profile.json');
1072
- try {
1073
- await startMigrateDaemon(home);
1074
- write(profilePath, '{not json');
1075
- write(markerPath(home), JSON.stringify(onDiskMigrationIdentity()));
1076
- const payload = migrateBlocked(home);
1077
- assert.equal(payload.received.blockers.length, 1);
1078
- assert.equal(payload.received.blockers[0]?.kind, 'parse-failure');
1079
- assert.equal(payload.received.blockers[0]?.path, profilePath);
1080
- assert.match(payload.received.blockers[0]?.message ?? '', /profile manifest is not valid JSON/);
1081
- assert.match(payload.received.blockers[0]?.message ?? '', /crtr sys migrate/);
1082
- assert.equal(payload.received.skipped.length, 1);
1083
- assert.equal(payload.received.skipped[0]?.store, join(userRoot, 'profiles'));
1084
- assert.equal(payload.received.skipped[0]?.relPath, `${profileId}/profile.json`);
1085
- assert.ok(payload.received.skipped[0]?.error);
1086
- assert.match(payload.next, /crtr sys migrate/);
1087
- assert.equal(existsSync(markerPath(home)), false);
1088
- }
1089
- finally {
1090
- await stopMigrateDaemon(home);
1091
- rmSync(home, { recursive: true, force: true });
1092
- }
1093
- });
1094
- test('sys migrate blocks the whole corpus when one link names different documents per target, and writes nothing', async () => {
1095
- const home = fixtureHome('crtr-sys-migrate-divergent-');
1096
- const userRoot = join(home, '.crouter');
1097
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
1098
- const alpha = join(home, 'alpha-project');
1099
- const beta = join(home, 'beta-project');
1100
- try {
1101
- await startMigrateDaemon(home);
1102
- // Already current for the manifest and document lanes: the only thing this
1103
- // run could write is the corpus cut, so "nothing was written" is provable
1104
- // byte for byte.
1105
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: alpha, memory: 'content' }, { path: beta, memory: 'content' }]));
1106
- write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[guide]].\n`);
1107
- for (const [project, title] of [[alpha, 'Alpha Project'], [beta, 'Beta Project']]) {
1108
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# ${title}\n`);
1109
- write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
1110
- }
1111
- const before = snapshotTree(home);
1112
- const payload = migrateBlocked(home);
1113
- assert.match(payload.message, /corpus migration blocked by 1 finding\(s\) — nothing was written/);
1114
- assert.equal(payload.received.blockers.length, 1);
1115
- assert.equal(payload.received.blockers[0]?.kind, 'divergent-reference');
1116
- assert.equal(payload.received.blockers[0]?.name, 'guide');
1117
- assert.match(payload.received.blockers[0]?.message ?? '', /different documents depending on the target view/);
1118
- // The claim in the message is the claim in the payload: nothing on disk.
1119
- assert.equal(payload.received.corpus_phase, 'not-started');
1120
- assert.equal(payload.received.changed, 0);
1121
- assert.deepEqual(payload.received.wrote, {
1122
- profile_manifests: [],
1123
- documents: [],
1124
- corpus_consumers: [],
1125
- corpus_identities: [],
1126
- });
1127
- assert.deepEqual(payload.received.applied, []);
1128
- assert.equal(existsSync(markerPath(home)), false);
1129
- assertTreeUnchanged(before, snapshotTree(home));
1130
- // A blocked planner stays inspectable: the failure payload carries the same
1131
- // report body a converged run returns, so the plan that WOULD have been
1132
- // written can be read straight off the blocker.
1133
- assertReportInvariants(payload.received);
1134
- assert.equal(payload.received.dryRun, false);
1135
- assert.ok(payload.received.discovery_roots.length > 0, JSON.stringify(payload.received.discovery_roots));
1136
- assert.equal(payload.received.stores, payload.received.discovered_stores.length);
1137
- for (const project of [alpha, beta]) {
1138
- const store = join(project, '.crouter', 'memory');
1139
- assert.ok(payload.received.discovered_stores.some((row) => row.store === store), JSON.stringify(payload.received.discovered_stores));
1140
- assert.ok(payload.received.discovered_targets.some((row) => row.stores.includes(store)));
1141
- assert.equal(repositoryRow(payload.received, project).namespace, relative(home, project));
1142
- assert.equal(prefixRow(payload.received, project).effective_prefix, relative(home, project));
1143
- assert.ok(payload.received.renames.some((row) => row.store_root === store && row.to.startsWith(`${relative(home, project)}/`)), JSON.stringify(payload.received.renames));
1144
- }
1145
- assert.ok(Array.isArray(payload.received.references));
1146
- }
1147
- finally {
1148
- await stopMigrateDaemon(home);
1149
- rmSync(home, { recursive: true, force: true });
1150
- }
1151
- });
1152
- test('a corpus blocker never claims nothing was written when the earlier lanes already wrote', async () => {
1153
- const home = fixtureHome('crtr-sys-migrate-earlier-writes-');
1154
- const userRoot = join(home, '.crouter');
1155
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
1156
- const alpha = join(home, 'alpha-project');
1157
- const beta = join(home, 'beta-project');
1158
- const userDoc = join(userRoot, 'memory', 'pointer.md');
1159
- try {
1160
- await startMigrateDaemon(home);
1161
- // A PRE-migration manifest and an old-format document, so the manifest and
1162
- // convergent lanes both write before the corpus lane plans — and then one
1163
- // `[[guide]]` naming a different document per target blocks that lane.
1164
- write(join(rootProfile, 'profile.json'), manifest('root', [alpha, beta]));
1165
- write(userDoc, `${OLD_DOC}\nSee [[guide]].\n`);
1166
- for (const [project, title] of [[alpha, 'Alpha Project'], [beta, 'Beta Project']]) {
1167
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# ${title}\n`);
1168
- write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
1169
- }
1170
- const projectsBefore = snapshotTree(alpha);
1171
- const payload = migrateBlocked(home);
1172
- assert.match(payload.message, /corpus migration blocked by 1 finding\(s\) before any corpus write/);
1173
- assert.match(payload.message, /the corpus is unchanged, but 2 earlier manifest\/document rewrite\(s\) are already on disk/);
1174
- assert.equal(payload.received.corpus_phase, 'not-started');
1175
- assert.equal(payload.received.changed, 2);
1176
- assert.deepEqual(payload.received.wrote.profile_manifests, [join(rootProfile, 'profile.json')]);
1177
- assert.deepEqual(payload.received.wrote.documents, [userDoc]);
1178
- assert.deepEqual(payload.received.wrote.corpus_consumers, []);
1179
- assert.deepEqual(payload.received.wrote.corpus_identities, []);
1180
- // Every file the payload names as written really did change, and every file
1181
- // only the corpus lane could have touched did not.
1182
- assert.doesNotMatch(readFileSync(userDoc, 'utf8'), /system-prompt-visibility/);
1183
- assert.match(readFileSync(userDoc, 'utf8'), /See \[\[guide\]\]\.\n/);
1184
- assert.deepEqual(JSON.parse(readFileSync(join(rootProfile, 'profile.json'), 'utf8')).projects, [{ path: alpha, memory: 'preview' }, { path: beta, memory: 'preview' }]);
1185
- assertTreeUnchanged(projectsBefore, snapshotTree(alpha));
1186
- }
1187
- finally {
1188
- await stopMigrateDaemon(home);
1189
- rmSync(home, { recursive: true, force: true });
1190
- }
1191
- });
1192
- test('a verification failure after both write phases reports the rewrites that are on disk', async () => {
1193
- const home = fixtureHome('crtr-sys-migrate-verification-');
1194
- const userRoot = join(home, '.crouter');
1195
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
1196
- const project = join(home, 'verify-project');
1197
- const projectIndex = join(project, '.crouter', 'memory', 'INDEX.md');
1198
- const strayDoc = join(project, '.crouter', 'memory', 'stray.md');
1199
- try {
1200
- await startMigrateDaemon(home);
1201
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
1202
- write(projectIndex, `---\nkind: knowledge\n---\n# Verify Project\n`);
1203
- // `namespace:` on a NON-root document: not an identity field this lane
1204
- // rewrites, so the plan is clean and the writes land — and the post-write
1205
- // lint against file truth then refuses the store.
1206
- write(strayDoc, `---\nkind: knowledge\nnamespace: verify-project\n---\n# Stray declaration\n`);
1207
- const payload = migrateBlocked(home);
1208
- assert.match(payload.message, /corpus migration verification failed with 1 finding\(s\) after both write phases/);
1209
- assert.match(payload.message, /identity rewrite\(s\) are on disk and are NOT rolled back/);
1210
- assert.equal(payload.received.blockers[0]?.kind, 'verification');
1211
- assert.match(payload.received.blockers[0]?.message ?? '', /namespace-placement/);
1212
- assert.equal(payload.received.corpus_phase, 'written');
1213
- assert.deepEqual(payload.received.wrote.corpus_identities, [projectIndex]);
1214
- assert.equal(payload.received.changed, 1);
1215
- assert.equal(payload.received.applied.some((row) => row.lane === 'corpus' && row.files.includes(projectIndex)), true);
1216
- assert.match(payload.next, /re-run `crtr sys migrate`/);
1217
- assert.equal(existsSync(markerPath(home)), false);
1218
- // The inventory is true of the bytes: the declaration and the repository's
1219
- // front door really are on disk.
1220
- assert.equal(readFileSync(projectIndex, 'utf8'), `---
1221
- namespace: verify-project
1222
- kind: knowledge
1223
- surfaces:
1224
- - on: workspace-open
1225
- at: content
1226
- - on: read
1227
- match: ./**
1228
- at: content
1229
- ---
1230
- # Verify Project
1231
- `);
1232
- }
1233
- finally {
1234
- await stopMigrateDaemon(home);
1235
- rmSync(home, { recursive: true, force: true });
1236
- }
1237
- });
1238
- test('a nested store reached only through a node target inherits the ancestor repository declaration', async () => {
1239
- const home = fixtureHome('crtr-sys-migrate-node-nested-');
1240
- const userRoot = join(home, '.crouter');
1241
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
1242
- const nodeId = 'node-bbbb2222';
1243
- const nodeStore = join(canvasHomeFor(home), 'nodes', nodeId, 'context', 'memory');
1244
- const nodeProject = join(home, 'node-cwd-project');
1245
- const nestedOwner = join(nodeProject, 'nested');
1246
- try {
1247
- await startMigrateDaemon(home);
1248
- seedNodeMemoryTarget(home, { nodeId, cwd: nodeProject, profileId: 'root-00000000' });
1249
- // No project in any manifest and none above the cwd: the daemon's SQL row
1250
- // is the ONLY path to this project root.
1251
- write(join(rootProfile, 'profile.json'), manifest('root', []));
1252
- write(join(nodeStore, 'note.md'), CURRENT_DOC);
1253
- write(join(nodeProject, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Node Cwd Project\n`);
1254
- write(join(nestedOwner, '.crouter', 'memory', 'topic.md'), CURRENT_DOC);
1255
- const output = migrateJson(home, { dryRun: true });
1256
- const storeRoots = output.discovered_stores.map((row) => row.store);
1257
- assert.equal(storeRoots.includes(join(nodeProject, '.crouter', 'memory')), true, JSON.stringify(storeRoots));
1258
- assert.equal(storeRoots.includes(join(nestedOwner, '.crouter', 'memory')), true, JSON.stringify(storeRoots));
1259
- // The nested owner takes the ancestor repository's namespace composed with
1260
- // its own path — and declares nothing of its own.
1261
- assert.deepEqual(output.repository_namespaces.map((row) => row.repository_root), [nodeProject], JSON.stringify(output.repository_namespaces));
1262
- const nested = prefixRow(output, nestedOwner);
1263
- assert.equal(nested.repository_root, nodeProject);
1264
- assert.equal(nested.owner_relative_path, 'nested');
1265
- assert.equal(nested.effective_prefix, 'node-cwd-project/nested');
1266
- assert.equal(nested.nested_declaration_action, 'none');
1267
- assert.equal(nested.front_door_action, 'none');
1268
- assert.equal(output.discovered_targets.some((row) => row.kind === 'project' && row.origin === nestedOwner), true);
1269
- }
1270
- finally {
1271
- await stopMigrateDaemon(home);
1272
- rmSync(home, { recursive: true, force: true });
1273
- }
1274
- });
1275
- test('a memory-read route translates through an INDEX collapse and a root-plus-descendant split', async () => {
1276
- const home = fixtureHome('crtr-sys-migrate-routes-');
1277
- const userRoot = join(home, '.crouter');
1278
- const rootProfile = join(userRoot, 'profiles', 'root-00000000');
1279
- const project = join(home, 'route-project');
1280
- const carrier = join(project, '.crouter', 'memory', 'carrier.md');
1281
- try {
1282
- await startMigrateDaemon(home);
1283
- write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
1284
- write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Route Project\n`);
1285
- // `topics/INDEX` collapses onto `route-project/topics`, and `topics/**`
1286
- // named that same directory document plus its leaf — post-cut the leaf is
1287
- // under `route-project/topics/**` and the directory document is not, so the
1288
- // one entry splits into the exact pair.
1289
- write(join(project, '.crouter', 'memory', 'topics', 'INDEX.md'), CURRENT_DOC);
1290
- write(join(project, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
1291
- write(carrier, `---
1292
- kind: knowledge
1293
- surfaces:
1294
- - on: memory-read
1295
- match: topics/INDEX
1296
- at: content
1297
- - on: memory-read
1298
- match: topics/**
1299
- at: content
1300
- ---
1301
- # Carrier
1302
- `);
1303
- const output = migrateJson(home);
1304
- assert.deepEqual(output.blockers, []);
1305
- assert.equal(readFileSync(carrier, 'utf8'), `---
1306
- kind: knowledge
1307
- surfaces:
1308
- - on: memory-read
1309
- match: "route-project/topics"
1310
- at: content
1311
- - on: memory-read
1312
- match: ["route-project/topics/**", "route-project/topics"]
1313
- at: content
1314
- ---
1315
- # Carrier
1316
- `);
1317
- assert.equal(output.references.some((row) => row.kind === 'memory-read' && row.from === 'topics/INDEX' && row.to === 'route-project/topics'), true, JSON.stringify(output.references));
1318
- assert.equal(output.references.some((row) => row.kind === 'memory-read' &&
1319
- row.from === 'topics/**' &&
1320
- row.to === 'route-project/topics/**, route-project/topics'), true, JSON.stringify(output.references));
1321
- // A second run over the translated routes plans nothing.
1322
- const second = migrateJson(home);
1323
- assert.equal(second.changed, 0);
1324
- assert.deepEqual(second.references, []);
1325
- }
1326
- finally {
1327
- await stopMigrateDaemon(home);
1328
- rmSync(home, { recursive: true, force: true });
1329
- }
1330
- });