@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,686 +0,0 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/seam/broker-provider-retry.test.ts
2
- //
3
- // Broker-level regression coverage for turn-time provider rotation, context
4
- // overflow settlement, model-choice durability, and the model-less launch
5
- // re-drive. The fake engine emits pi's actual lifecycle events over
6
- // session.subscribe, so this exercises runBroker's live handlers rather than
7
- // its helpers in isolation.
8
- import { test, before, after, afterEach } from 'node:test';
9
- import assert from 'node:assert/strict';
10
- import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
11
- import { join } from 'node:path';
12
- import { createHeadlessHarness, readLines } from '../helpers/harness.js';
13
- import { createAttachKit } from '../helpers/broker-clients.js';
14
- import { openDb } from '../../canvas/db.js';
15
- import { defaultModelLaddersConfig } from '../../../types.js';
16
- import { admitEpisode, readEpisode as readProviderRetryEpisode, readFault, recordPendingEpisode } from '../../canvas/recovery.js';
17
- import { buildPiArgv, normalizeModel } from '../../runtime/launch.js';
18
- import { writeRawConfig } from '../../config.js';
19
- import { encodeFrame } from '../../runtime/broker-protocol.js';
20
- import { CONNECTION_FAULT_RECOVERY_BODY, PROVIDER_FAULT_RECOVERY_BODY, generatedContextText, parseCard } from '../../../shared/generated-context.js';
21
- import { RUNTIME_RESTART_CONTINUATION } from '../../runtime/kickoff.js';
22
- import { writeSubscriptionPool } from '../../subscription-state.js';
23
- const MODEL_LADDERS = defaultModelLaddersConfig();
24
- function resolvedModel(spec) {
25
- const normalized = normalizeModel(spec, MODEL_LADDERS);
26
- const modelSpec = normalized.replace(/:(?:off|minimal|low|medium|high|xhigh|max)$/, '');
27
- const slash = modelSpec.indexOf('/');
28
- assert.notEqual(slash, -1, `${spec} must normalize to a qualified provider/model spec`);
29
- const provider = modelSpec.slice(0, slash);
30
- const id = modelSpec.slice(slash + 1);
31
- return { spec: normalized, model: { provider, id } };
32
- }
33
- const OPENAI_STRONG = resolvedModel('openai/strong');
34
- let h;
35
- const kit = createAttachKit(() => h);
36
- const { attachUntil } = kit;
37
- function episodeSessionId(episode) {
38
- assert.ok(episode.sessionId !== null, 'a provider retry episode is bound to a session');
39
- return episode.sessionId;
40
- }
41
- function admitProviderRetryEpisode(nodeId, episode, fault) {
42
- return admitEpisode(nodeId, { sessionId: episodeSessionId(episode), faultId: fault.faultId, retry: fault.retry });
43
- }
44
- function setActiveFaultAnchor(nodeId, anchorEntryId) {
45
- const result = openDb().prepare('UPDATE node_faults SET anchor_entry_id = ? WHERE node_id = ? AND active = 1').run(anchorEntryId, nodeId);
46
- assert.equal(result.changes, 1, 'the fixture changes exactly one active fault');
47
- }
48
- function restoreAdmittedProviderRetryEpisode(nodeId, episode, fault) {
49
- const stored = recordPendingEpisode(nodeId, {
50
- sessionId: episodeSessionId(episode),
51
- input: {
52
- link: fault.link,
53
- op: fault.op,
54
- kind: fault.kind,
55
- retry: fault.retry,
56
- message: fault.message,
57
- since: fault.since,
58
- operation_id: fault.operation_id,
59
- ...(fault.anchorEntryId === undefined ? {} : { anchorEntryId: fault.anchorEntryId }),
60
- ...(fault.providerError === undefined ? {} : { providerError: fault.providerError }),
61
- },
62
- });
63
- assert.ok(stored !== null, 'the bound session accepts a pending recovery episode');
64
- assert.equal(admitProviderRetryEpisode(nodeId, episode, stored), true, 'the pending recovery episode becomes admitted');
65
- }
66
- async function seedPool(provider, cooling) {
67
- await writeSubscriptionPool(provider, [{
68
- label: 'test-account', refresh: 'refresh', access: 'access', expires: Date.now() + 60_000,
69
- rateLimitedUntil: cooling ? Date.now() + 60_000 : 0, lastAttemptAt: 0, lastRateLimitedAt: 0,
70
- }]);
71
- }
72
- function modelRoute(spec) {
73
- return { ultra: spec, strong: spec, medium: spec, light: spec };
74
- }
75
- function seedCapacityFallbackRoutes() {
76
- writeRawConfig('user', {
77
- kinds: { 'test/capacity-fallback': { whenToUse: 'Capacity fallback regression.', model: 'anthropic/medium' } },
78
- modelRoutes: {
79
- primary: { family: 'anthropic', credentialSource: 'user', providerId: 'fake-primary', models: modelRoute('fake-primary/primary') },
80
- fallback: { family: 'anthropic', credentialSource: 'northlight', providerId: 'fake-small', models: modelRoute('fake-small/small') },
81
- largerFallback: { family: 'anthropic', credentialSource: 'third', providerId: 'fake-large', models: modelRoute('fake-large/large') },
82
- },
83
- modelRouting: { credentialSourceOrder: ['user', 'northlight', 'third'], familyOrder: ['anthropic'], strengthFallback: ['medium'] },
84
- });
85
- }
86
- function seedCapacityFixture(id, largeContextWindow = 999) {
87
- const dir = join(h.home, 'nodes', id);
88
- writeFileSync(join(dir, 'fake-pi.context-tokens'), '1000');
89
- writeFileSync(join(dir, 'fake-pi.model-capacities.json'), JSON.stringify({
90
- 'fake-primary/primary': 2000,
91
- 'fake-small/small': 999,
92
- 'fake-large/large': largeContextWindow,
93
- }));
94
- }
95
- // The node's recorded model (fake-pi.model.json, written by the fake's
96
- // recordModel) — `null` for a model-less boot. A disk read, so it survives the
97
- // broker exiting after its kickoff turn idle-releases.
98
- function model(id) {
99
- return JSON.parse(readFileSync(join(h.home, 'nodes', id, 'fake-pi.model.json'), 'utf8'));
100
- }
101
- // The fake engine records each settled overflow episode's outcome in
102
- // fake-pi.overflow.json, OVERWRITING it per episode. Two episodes on one broker
103
- // must therefore gate on the parsed `outcome`, never on file existence.
104
- function overflowOutcome(id) {
105
- try {
106
- const raw = readFileSync(join(h.home, 'nodes', id, 'fake-pi.overflow.json'), 'utf8');
107
- return JSON.parse(raw).outcome ?? null;
108
- }
109
- catch {
110
- return null;
111
- }
112
- }
113
- // Every fired lifecycle event is appended to fake-pi.events.jsonl. A broker
114
- // re-drive is a fresh session.prompt → emitTurn, which fires one 'agent_start';
115
- // counting them is the observable proof of how many times the turn was re-driven.
116
- function agentStartCount(id) {
117
- return readLines(join(h.home, 'nodes', id, 'fake-pi.events.jsonl'))
118
- .filter((line) => JSON.parse(line).event === 'agent_start').length;
119
- }
120
- async function crashAndRespawn(id, boots) {
121
- const pid = h.node(id)?.pi_pid;
122
- assert.ok(pid != null, 'the broker has a live pid before its physical death');
123
- process.kill(pid, 'SIGKILL');
124
- await h.awaitFleetExit(id);
125
- await h.tick();
126
- const deferred = h.node(id);
127
- assert.ok(deferred.respawn_not_before != null, 'the daemon records respawn backoff after the broker exit');
128
- await h.tick(Date.parse(deferred.respawn_not_before) + 1);
129
- await h.awaitBoot(id, { minCount: boots + 1 });
130
- await h.waitFor(() => existsSync(h.brokerSock(id)), { label: 'replacement broker listener bound' });
131
- }
132
- before(async () => {
133
- h = await createHeadlessHarness({ sessionPrefix: 'crtr-provider-retry' });
134
- });
135
- after(async () => {
136
- if (h !== undefined)
137
- await h.dispose();
138
- });
139
- afterEach(() => {
140
- kit.closeAll();
141
- });
142
- test('a normalized 503 survives into a durable provider fault and re-drives the turn', { timeout: 30_000 }, async () => {
143
- const parent = h.spawnRoot('structured provider failure parent');
144
- await seedPool('anthropic', false);
145
- await seedPool('openai-codex', false);
146
- const child = await h.spawnHeadlessChild(parent, 'structured provider failure', { model: OPENAI_STRONG.spec });
147
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'initial structured-failure fixture turn started' });
148
- const kickoffObserver = await attachUntil(child, 'observer', 'structured-503-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'structured 503 kickoff settled');
149
- kickoffObserver.close();
150
- const baselineStarts = agentStartCount(child);
151
- h.fakeCmd(child, {
152
- cmd: 'stop',
153
- reason: 'error',
154
- errorMessage: 'Request failed',
155
- providerFailure: { status: 503 },
156
- });
157
- const fault = await h.waitFor(() => {
158
- const current = readFault(child);
159
- return current?.kind === 'overloaded' && current.retry.disposition === 'auto' ? current : undefined;
160
- }, { label: 'structured 503 published as an automatic provider fault' });
161
- assert.equal(fault.providerError?.provider, OPENAI_STRONG.model.provider);
162
- assert.equal(fault.providerError?.model, OPENAI_STRONG.model.id);
163
- assert.equal(fault.providerError?.status, 503);
164
- await h.waitFor(() => agentStartCount(child) >= baselineStarts + 1, {
165
- label: 'structured 503 automatic recovery turn started',
166
- });
167
- await h.waitFor(() => readFault(child) === null, { label: 'successful recovery clears the structured provider fault' });
168
- });
169
- test('a managed-cooling terminal authors a rate-limit auto fault whose deadline drives exactly one broker re-drive', { timeout: 30_000 }, async () => {
170
- const parent = h.spawnRoot('cooling terminal parent');
171
- // The terminal fault path is pool-independent — the stophook classifies purely
172
- // off the errorMessage text + the cooling diagnostic, so pool state is inert.
173
- await seedPool('anthropic', false);
174
- await seedPool('openai-codex', false);
175
- const child = await h.spawnHeadlessChild(parent, 'cooling terminal', { model: OPENAI_STRONG.spec });
176
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'initial cooling fixture turn started' });
177
- const kickoffObserver = await attachUntil(child, 'observer', 'cooling-terminal-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'cooling terminal kickoff settled');
178
- kickoffObserver.close();
179
- const baselineStarts = agentStartCount(child);
180
- // A terminal managed-cooling error at agent_end: its explanatory prose avoids
181
- // rate-limit words entirely; the typed diagnostic alone must classify the
182
- // fault as rate-limit/auto and carry its exact deadline.
183
- const deadline = Date.now() + 2000;
184
- h.fakeCmd(child, {
185
- cmd: 'stop',
186
- reason: 'error',
187
- errorMessage: 'Managed provider pools are temporarily unavailable; switch to a direct API key. (tried anthropic, openai-codex)',
188
- deadline,
189
- });
190
- // (1) the REAL stophook authored the pi→provider fault, stamping nextAt from
191
- // the cooling diagnostic — this is the whole point of the runtime fix.
192
- const fault = await h.waitFor(() => {
193
- const f = readFault(child);
194
- return f !== null && f.link === 'pi→provider' ? f : undefined;
195
- }, { label: 'cooling fault authored by stophook' });
196
- assert.equal(fault.kind, 'rate-limit', 'the typed cooling terminal classifies as rate-limit without prose matching');
197
- assert.equal(fault.retry.disposition, 'auto', 'a rate-limit fault is auto-retryable');
198
- assert.equal(fault.retry.by, 'daemon', 'the broker/daemon owns the re-drive');
199
- assert.equal(fault.retry.nextAt, new Date(deadline).toISOString(), 'the earliest cooling deadline becomes retry.nextAt');
200
- // (2) the broker's own fault-retry timer fires exactly ONE re-drive at the
201
- // deadline. A completed re-drive turn clears the pi→provider fault at
202
- // turn_end, so no second timer is ever armed.
203
- await h.waitFor(() => agentStartCount(child) >= baselineStarts + 1, {
204
- label: 'broker re-drove the turn at the deadline',
205
- timeoutMs: 10_000,
206
- });
207
- // A persistent fault would re-arm immediately (nextAt is now in the past), so a
208
- // spurious second re-drive would land within a poll interval. Wait past that.
209
- await new Promise((resolve) => setTimeout(resolve, 2500));
210
- assert.equal(agentStartCount(child), baselineStarts + 1, 'the fault-retry timer re-drives the turn exactly once');
211
- });
212
- test('a crashed broker re-drives a pending episode and a no-progress admitted one, never a progressed or invalidated episode', { timeout: 90_000 }, async () => {
213
- const parent = h.spawnRoot('durable provider episode parent');
214
- await seedPool('anthropic', false);
215
- await seedPool('openai-codex', false);
216
- const pendingNode = await h.spawnHeadlessChild(parent, 'pending provider episode', { model: OPENAI_STRONG.spec });
217
- await h.waitFor(() => agentStartCount(pendingNode) >= 1, { label: 'pending episode fixture started' });
218
- const pendingKickoffObserver = await attachUntil(pendingNode, 'observer', 'pending-provider-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'pending provider episode kickoff settled');
219
- pendingKickoffObserver.close();
220
- const pendingStarts = agentStartCount(pendingNode);
221
- h.fakeCmd(pendingNode, {
222
- cmd: 'stop', reason: 'error', errorMessage: 'Managed provider pools are temporarily unavailable.', deadline: Date.now() + 2_000,
223
- });
224
- const pending = await h.waitFor(() => readProviderRetryEpisode(pendingNode)?.state === 'pending' ? readProviderRetryEpisode(pendingNode) : null, { label: 'pending provider episode persisted before crash' });
225
- assert.equal(pending.sessionId, h.node(pendingNode).pi_session_id, 'the pending episode is tied to its bound session');
226
- await crashAndRespawn(pendingNode, h.bootCount(pendingNode));
227
- await h.waitFor(() => agentStartCount(pendingNode) >= pendingStarts + 1, { label: 'replacement re-drove the pending episode' });
228
- await new Promise((resolve) => setTimeout(resolve, 300));
229
- assert.equal(agentStartCount(pendingNode), pendingStarts + 1, 'a pending episode re-drives exactly once after broker death');
230
- // An admitted episode is re-openable, guarded by a no-progress proof: the
231
- // branch segment strictly after its anchor must carry no assistant content
232
- // and no tool activity. Case A proves the no-progress half re-drives exactly
233
- // once, one attempt higher, with the restart continuation suppressed. Case B
234
- // proves an admitted episode whose dead attempt DID produce real work is
235
- // never replayed — the ordinary continuation delivers instead, unchanged.
236
- const admittedNode = await h.spawnHeadlessChild(parent, 'admitted provider episode (no progress)', { model: OPENAI_STRONG.spec });
237
- await h.waitFor(() => agentStartCount(admittedNode) >= 1, { label: 'admitted episode fixture started' });
238
- const admittedKickoffObserver = await attachUntil(admittedNode, 'observer', 'admitted-provider-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'admitted provider episode kickoff settled');
239
- admittedKickoffObserver.close();
240
- const admittedStarts = agentStartCount(admittedNode);
241
- h.fakeCmd(admittedNode, {
242
- cmd: 'stop', reason: 'error', errorMessage: 'Managed provider pools are temporarily unavailable.', deadline: Date.now() + 60_000,
243
- });
244
- const admittedPending = await h.waitFor(() => readProviderRetryEpisode(admittedNode)?.state === 'pending' ? readProviderRetryEpisode(admittedNode) : null, { label: 'admitted episode pending record persisted' });
245
- const admittedFault = readFault(admittedNode);
246
- assert.ok(admittedFault !== null, 'the pending episode retains its retry fault before admission');
247
- // The 60s-future deadline above keeps the ORIGINAL process's own in-process
248
- // timer from firing before this synthetic admission runs. The episode's own
249
- // fault gets its nextAt rewritten into the past, matching production: by the
250
- // time a REAL replacement broker boots, the original deadline has typically
251
- // already elapsed (see the design's "effectively zero delay" note), so this
252
- // proves the re-drive without a real ~60s wait.
253
- const admittedFaultForEpisode = { ...admittedFault, retry: { ...admittedFault.retry, nextAt: new Date(Date.now() - 1_000).toISOString() } };
254
- assert.equal(admitProviderRetryEpisode(admittedNode, admittedPending, admittedFaultForEpisode), true, 'the dispatch boundary durably admits the matching episode');
255
- assert.equal(readProviderRetryEpisode(admittedNode)?.state, 'admitted');
256
- await crashAndRespawn(admittedNode, h.bootCount(admittedNode));
257
- await h.waitFor(() => agentStartCount(admittedNode) >= admittedStarts + 1, { label: 'replacement re-drove the no-progress admitted episode' });
258
- // A persistent re-arm would re-drive again immediately (nextAt is now in the
259
- // past), so a spurious second re-drive would land within a poll interval.
260
- await new Promise((resolve) => setTimeout(resolve, 2500));
261
- assert.equal(agentStartCount(admittedNode), admittedStarts + 1, 'a no-progress admitted episode re-drives exactly once, never more');
262
- const admittedBranch = JSON.parse(readFileSync(join(h.home, 'nodes', admittedNode, 'fake-pi.tree.json'), 'utf8')).activeBranch;
263
- const admittedUserMessages = admittedBranch.filter((message) => message.role === 'user');
264
- const newestAdmittedUserMessage = admittedUserMessages[admittedUserMessages.length - 1];
265
- assert.ok(newestAdmittedUserMessage !== undefined, 'the re-drive delivers a user-role recovery message');
266
- const expectedRecoveryBody = admittedFault.kind === 'connection' ? CONNECTION_FAULT_RECOVERY_BODY : PROVIDER_FAULT_RECOVERY_BODY;
267
- const redriveCard = parseCard(newestAdmittedUserMessage);
268
- assert.equal(redriveCard?.kind, 'recovery', 'the re-drive delivers the recovery card, not a duplicate failure entry');
269
- assert.equal(redriveCard?.body, expectedRecoveryBody, 'the recovery card carries the body matching the fault kind');
270
- // Every superseded attempt leaves the active branch, so this card is the only
271
- // visible record of the sequence — it must name which attempt it is. The
272
- // exact number depends on how far the ladder had already advanced, so assert
273
- // that the facts are present and coherent rather than pinning a literal.
274
- const redriveAttempt = Number(redriveCard?.facts['attempt']);
275
- const redriveMax = Number(redriveCard?.facts['max']);
276
- assert.ok(Number.isInteger(redriveAttempt) && redriveAttempt >= 1, 'the recovery card names which attempt it is');
277
- assert.ok(Number.isInteger(redriveMax) && redriveMax >= redriveAttempt, 'the recovery card names the ladder length it counts against');
278
- assert.ok(!admittedBranch.some((message) => generatedContextText(message) === RUNTIME_RESTART_CONTINUATION), 'a no-progress re-drive suppresses the restart continuation entirely');
279
- // The fake engine's recovery-card prompt runs a genuine successful turn (no
280
- // forced failure is queued for it), so the episode clears at settlement —
281
- // Flow A's success ending, not another failure round. `nextFaultRetry`
282
- // already advances `fault.retry.attempt` on every admission regardless of
283
- // this design (unchanged, pre-existing ladder logic); this settle just
284
- // proves the sequence can end cleanly through the reopened path too.
285
- assert.equal(readProviderRetryEpisode(admittedNode), null, 'the successful re-drive clears the episode at settlement');
286
- const progressNode = await h.spawnHeadlessChild(parent, 'admitted provider episode (progress)', { model: OPENAI_STRONG.spec });
287
- await h.waitFor(() => agentStartCount(progressNode) >= 1, { label: 'progress episode fixture started' });
288
- const progressKickoffObserver = await attachUntil(progressNode, 'observer', 'progress-provider-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'progress episode kickoff settled');
289
- progressKickoffObserver.close();
290
- h.fakeCmd(progressNode, {
291
- cmd: 'stop', reason: 'error', errorMessage: 'Managed provider pools are temporarily unavailable.', deadline: Date.now() + 60_000,
292
- });
293
- const progressPending = await h.waitFor(() => readProviderRetryEpisode(progressNode)?.state === 'pending' ? readProviderRetryEpisode(progressNode) : null, { label: 'progress episode pending record persisted' });
294
- const progressFault = readFault(progressNode);
295
- assert.ok(progressFault !== null, 'the pending episode retains its retry fault before admission');
296
- assert.equal(admitProviderRetryEpisode(progressNode, progressPending, progressFault), true, 'the dispatch boundary durably admits the matching episode');
297
- assert.equal(readProviderRetryEpisode(progressNode)?.state, 'admitted');
298
- // A real successful turn past the anchor: proves the dead attempt's slot is
299
- // no longer the branch tail, so recoverOnStartup's no-progress proof must
300
- // find this assistant content and refuse to roll it back.
301
- const progressController = await kit.attach(progressNode, 'controller', 'progress-provider-episode');
302
- progressController.send({ type: 'prompt', text: `progress past anchor ${Date.now()}` });
303
- await progressController.waitFrame((f) => f.type === 'agent_end', 'the progress turn settles');
304
- progressController.close();
305
- // The natural settle above clears the episode. Restore the same admitted SQL
306
- // record so the crash below tests the no-progress proof against a genuine
307
- // post-anchor assistant turn rather than an unreliable real-crash race.
308
- await h.waitFor(() => readProviderRetryEpisode(progressNode) === null, { label: 'the settled turn cleared the episode' });
309
- restoreAdmittedProviderRetryEpisode(progressNode, progressPending, progressFault);
310
- assert.equal(readProviderRetryEpisode(progressNode)?.state, 'admitted', 'the SQL fixture restores the admitted episode for the crash below');
311
- const progressStartsBeforeCrash = agentStartCount(progressNode);
312
- await crashAndRespawn(progressNode, h.bootCount(progressNode));
313
- await new Promise((resolve) => setTimeout(resolve, 300));
314
- assert.equal(agentStartCount(progressNode), progressStartsBeforeCrash, 'progress past the anchor is never replayed by replacement startup');
315
- assert.equal(readProviderRetryEpisode(progressNode), null, 'the progress branch clears the episode rather than leaving it inert');
316
- const invalidatedNode = await h.spawnHeadlessChild(parent, 'invalidated provider episode', { model: OPENAI_STRONG.spec });
317
- await h.waitFor(() => agentStartCount(invalidatedNode) >= 1, { label: 'invalidated episode fixture started' });
318
- const invalidatedKickoffObserver = await attachUntil(invalidatedNode, 'observer', 'invalidated-provider-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'invalidated provider episode kickoff settled');
319
- invalidatedKickoffObserver.close();
320
- const invalidatedStarts = agentStartCount(invalidatedNode);
321
- h.fakeCmd(invalidatedNode, {
322
- cmd: 'stop', reason: 'error', errorMessage: 'Managed provider pools are temporarily unavailable.', deadline: Date.now() + 60_000,
323
- });
324
- await h.waitFor(() => readProviderRetryEpisode(invalidatedNode)?.state === 'pending' ? true : null, { label: 'invalidated episode pending record persisted' });
325
- const controller = await kit.attach(invalidatedNode, 'controller', 'invalidated-provider-episode');
326
- controller.send({ type: 'new_session' });
327
- await controller.waitFrame((frame) => frame.type === 'ack' && frame.for === 'new_session', 'replacement session acknowledged');
328
- assert.equal(readFault(invalidatedNode), null, 'replacement discards the old daemon-owned auto fault instead of inheriting its anchor');
329
- await h.waitFor(() => readProviderRetryEpisode(invalidatedNode)?.state === 'invalidated' ? true : null, { label: 'rebind durably invalidated the old episode' });
330
- controller.close();
331
- await crashAndRespawn(invalidatedNode, h.bootCount(invalidatedNode));
332
- await new Promise((resolve) => setTimeout(resolve, 300));
333
- assert.equal(agentStartCount(invalidatedNode), invalidatedStarts, 'an invalidated rebound-session episode is never replayed by replacement startup');
334
- const cyclingNode = await h.spawnHeadlessChild(parent, 'fresh-cycle provider episode', { model: OPENAI_STRONG.spec });
335
- await h.waitFor(() => agentStartCount(cyclingNode) >= 1, { label: 'fresh-cycle episode fixture started' });
336
- const cyclingKickoffObserver = await attachUntil(cyclingNode, 'observer', 'fresh-cycle-provider-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'fresh-cycle provider episode kickoff settled');
337
- cyclingKickoffObserver.close();
338
- h.fakeCmd(cyclingNode, {
339
- cmd: 'stop', reason: 'error', errorMessage: 'Managed provider pools are temporarily unavailable.', deadline: Date.now() + 2_000,
340
- });
341
- await h.waitFor(() => readProviderRetryEpisode(cyclingNode)?.state === 'pending' ? true : null, { label: 'fresh-cycle episode pending record persisted' });
342
- const cyclingStarts = agentStartCount(cyclingNode);
343
- const cyclingBoots = h.bootCount(cyclingNode);
344
- const yieldResult = h.cli(cyclingNode, ['node', 'yield', 'begin a fresh cycle']);
345
- assert.equal(yieldResult.code, 0, `node yield should succeed\n--stderr--\n${yieldResult.stderr}`);
346
- const cyclingPid = h.node(cyclingNode)?.pi_pid;
347
- assert.ok(cyclingPid != null, 'the refresh-pending broker remains live until its physical death');
348
- process.kill(cyclingPid, 'SIGKILL');
349
- await h.awaitFleetExit(cyclingNode);
350
- await h.tick();
351
- const cyclingBackoff = h.node(cyclingNode);
352
- assert.ok(cyclingBackoff.respawn_not_before != null, 'the fresh-cycle relaunch receives daemon backoff');
353
- await h.tick(Date.parse(cyclingBackoff.respawn_not_before) + 1);
354
- await h.awaitBoot(cyclingNode, { minCount: cyclingBoots + 1 });
355
- await h.waitFor(() => existsSync(h.brokerSock(cyclingNode)), { label: 'fresh-cycle replacement broker listener bound' });
356
- await h.waitFor(() => readProviderRetryEpisode(cyclingNode) === null, { label: 'fresh-cycle kickoff settled successfully' });
357
- assert.equal(readProviderRetryEpisode(cyclingNode), null, 'the settled fresh-cycle kickoff clears the old provider episode');
358
- assert.equal(agentStartCount(cyclingNode), cyclingStarts + 1, 'the fresh-cycle kickoff starts exactly once');
359
- // A retained episode would re-arm immediately once its deadline becomes due.
360
- // Wait past that poll interval to prove the completed kickoff cannot replay.
361
- await new Promise((resolve) => setTimeout(resolve, 2500));
362
- assert.equal(agentStartCount(cyclingNode), cyclingStarts + 1, 'the cleared fresh-cycle episode never replays');
363
- });
364
- test('reload_auth re-drives a parked fatal provider-auth turn exactly once', { timeout: 30_000 }, async () => {
365
- const parent = h.spawnRoot('auth reload parent');
366
- await seedPool('anthropic', false);
367
- await seedPool('openai-codex', false);
368
- const child = await h.spawnHeadlessChild(parent, 'auth reload child', { model: OPENAI_STRONG.spec });
369
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'initial auth fixture turn started' });
370
- const kickoffObserver = await attachUntil(child, 'observer', 'auth-reload-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'auth reload kickoff settled');
371
- kickoffObserver.close();
372
- const baselineStarts = agentStartCount(child);
373
- h.fakeCmd(child, {
374
- cmd: 'stop',
375
- reason: 'error',
376
- errorMessage: 'Provider authentication failed (invalid_grant) for anthropic/test-account',
377
- });
378
- const fault = await h.waitFor(() => {
379
- const current = readFault(child);
380
- return current?.kind === 'auth' ? current : undefined;
381
- }, { label: 'fatal auth fault authored by stophook' });
382
- assert.equal(fault.link, 'pi→provider');
383
- assert.equal(fault.retry.disposition, 'fatal');
384
- const observer = await kit.attach(child, 'observer', 'auth-reload-test');
385
- observer.send({ type: 'reload_auth' });
386
- observer.send({ type: 'reload_auth' });
387
- await observer.waitFrame((frame) => frame.type === 'ack' && frame.for === 'reload_auth', 'reload_auth acknowledged');
388
- await h.waitFor(() => agentStartCount(child) >= baselineStarts + 1, {
389
- label: 'fresh auth re-drove the parked turn',
390
- });
391
- await new Promise((resolve) => setTimeout(resolve, 250));
392
- assert.equal(readFault(child), null, 'the auth fault is cleared before the recovery prompt');
393
- assert.equal(agentStartCount(child), baselineStarts + 1, 'overlapping auth reloads produce one recovery turn');
394
- observer.close();
395
- });
396
- test('reload_auth leaves a parked auth fault with its original session when navigation is overtaken by replacement', { timeout: 30_000 }, async () => {
397
- const parent = h.spawnRoot('auth replacement parent');
398
- await seedPool('anthropic', false);
399
- await seedPool('openai-codex', false);
400
- const child = await h.spawnHeadlessChild(parent, 'auth replacement child', { model: OPENAI_STRONG.spec });
401
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'initial replacement fixture turn started' });
402
- const kickoffObserver = await attachUntil(child, 'observer', 'auth-replacement-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'auth replacement kickoff settled');
403
- kickoffObserver.close();
404
- h.fakeCmd(child, {
405
- cmd: 'stop',
406
- reason: 'error',
407
- errorMessage: 'Provider authentication failed (invalid_grant) for anthropic/test-account',
408
- });
409
- const fault = await h.waitFor(() => {
410
- const current = readFault(child);
411
- return current?.kind === 'auth' ? current : undefined;
412
- }, { label: 'replacement fixture auth fault authored by stophook' });
413
- const baselineStarts = agentStartCount(child);
414
- const nodeDir = join(h.home, 'nodes', child);
415
- // Force the redrive's leaf/anchor comparison to diverge so it actually enters
416
- // navigateTree (a matching leaf/anchor legitimately skips the rewind) — the
417
- // fixture's fault otherwise anchors to the leaf already current.
418
- setActiveFaultAnchor(child, 'auth-replacement-anchor-mismatch');
419
- writeFileSync(join(nodeDir, 'fake-pi.navigate-hold'), '');
420
- const controller = await kit.attach(child, 'controller', 'auth-replacement-test');
421
- controller.send({ type: 'reload_auth' });
422
- await h.waitFor(() => existsSync(join(nodeDir, 'fake-pi.navigate-started')) ? true : null, { label: 'auth redrive entered held navigation' });
423
- controller.send({ type: 'new_session' });
424
- await controller.waitFrame((frame) => frame.type === 'ack' && frame.for === 'new_session', 'replacement session acknowledged');
425
- writeFileSync(join(nodeDir, 'fake-pi.navigate-release'), '');
426
- await new Promise((resolve) => setTimeout(resolve, 250));
427
- assert.equal(readFault(child)?.since, fault.since, 'the original auth fault remains for its original session');
428
- assert.equal(agentStartCount(child), baselineStarts, 'the replacement session receives no stale recovery prompt');
429
- controller.close();
430
- });
431
- // Both overflow outcomes on ONE broker, in order: Pi's compact-and-retry
432
- // recovers (nothing is committed, the child lives), and only then does a
433
- // definitive failure make the episode terminal.
434
- test('a recovered compact-and-retry commits nothing, while a definitive failure publishes one structured overflow fault and terminal notice', { timeout: 30_000 }, async () => {
435
- const parent = h.spawnRoot('overflow parent');
436
- await seedPool('anthropic', false);
437
- await seedPool('openai-codex', false);
438
- const child = await h.spawnHeadlessChild(parent, 'overflow child', { model: OPENAI_STRONG.spec });
439
- h.fakeCmd(child, { cmd: 'overflow', outcome: 'recover' });
440
- await h.waitFor(() => overflowOutcome(child) === 'recover' ? true : null, { label: 'recovered overflow reached agent_settled' });
441
- await h.tick();
442
- assert.equal(readFault(child), null, 'raw overflow is never committed before Pi recovery settles');
443
- assert.notEqual(h.status(child), 'dead', 'a recovered child remains live');
444
- assert.doesNotMatch(h.inbox(parent).map((entry) => entry.label).join('\n'), /context window|will not recover/i, 'recovery publishes no fatal parent notice');
445
- // A settled ordinary provider failure leaves an active daemon-owned retry
446
- // marker in place while the next turn runs. The later terminal overflow must
447
- // supersede that marker rather than lose to its priority in fault storage.
448
- h.fakeCmd(child, {
449
- cmd: 'stop',
450
- reason: 'error',
451
- errorMessage: 'Managed provider pools are temporarily unavailable.',
452
- deadline: Date.now() + 60_000,
453
- });
454
- const autoFault = await h.waitFor(() => {
455
- const f = readFault(child);
456
- return f?.retry.disposition === 'auto' ? f : undefined;
457
- }, { label: 'ordinary settled provider fault published' });
458
- assert.equal(autoFault.kind, 'rate-limit', 'ordinary settled provider failures retain broker-owned retry behavior');
459
- h.fakeCmd(child, { cmd: 'overflow', outcome: 'fail' });
460
- await h.waitFor(() => overflowOutcome(child) === 'fail' ? true : null, { label: 'failed overflow reached agent_settled' });
461
- const fault = await h.waitFor(() => {
462
- const current = readFault(child);
463
- return current?.kind === 'context-overflow' ? current : null;
464
- }, { label: 'failed overflow publishes its definitive context-overflow fault' });
465
- assert.equal(fault.kind, 'context-overflow');
466
- assert.equal(fault.op, 'context overflow recovery');
467
- assert.equal(fault.retry.disposition, 'fatal');
468
- assert.match(fault.message, /failed after one compact-and-retry attempt/i);
469
- await h.tick();
470
- assert.equal(h.status(child), 'dead', 'the daemon applies one terminal child transition');
471
- const notices = h.inbox(parent).filter((entry) => /exceeded its model context window/i.test(entry.label));
472
- assert.equal(notices.length, 1, 'the parent receives exactly one structured overflow notice');
473
- });
474
- test('provider-retry and model-not-found fallback both terminate when every available target has a smaller known context window', { timeout: 30_000 }, async () => {
475
- seedCapacityFallbackRoutes();
476
- try {
477
- const parent = h.spawnRoot('capacity fallback parent');
478
- const providerRetry = await h.spawnHeadlessChild(parent, 'provider retry capacity fallback', { kind: 'test/capacity-fallback' });
479
- await h.waitFor(() => agentStartCount(providerRetry) >= 1, { label: 'provider retry capacity fixture started' });
480
- seedCapacityFixture(providerRetry, 2000);
481
- h.fakeCmd(providerRetry, { cmd: 'auto_retry', errorMessage: 'rate limit exceeded' });
482
- await h.waitFor(() => model(providerRetry)?.provider === 'fake-large' ? true : null, { label: 'provider retry skips the too-small target for the large enough target' });
483
- assert.equal(model(providerRetry).provider, 'fake-large', 'a large enough fallback remains eligible after the smaller route is rejected');
484
- const exhaustedProviderRetry = await h.spawnHeadlessChild(parent, 'exhausted provider retry capacity fallback', { kind: 'test/capacity-fallback' });
485
- await h.waitFor(() => agentStartCount(exhaustedProviderRetry) >= 1, { label: 'exhausted provider retry capacity fixture started' });
486
- seedCapacityFixture(exhaustedProviderRetry);
487
- h.fakeCmd(exhaustedProviderRetry, { cmd: 'auto_retry', errorMessage: 'rate limit exceeded' });
488
- const providerRetryFault = await h.waitFor(() => readFault(exhaustedProviderRetry)?.kind === 'context-overflow' ? readFault(exhaustedProviderRetry) : null, { label: 'provider retry rejects every too-small fallback target' });
489
- assert.equal(providerRetryFault.retry.disposition, 'fatal', 'all known-too-small provider retry targets produce a fatal context-overflow fault');
490
- assert.match(providerRetryFault.message, /1000 tokens/, 'the terminal fault identifies the current conversation size');
491
- assert.equal(JSON.parse(readFileSync(join(h.home, 'nodes', exhaustedProviderRetry, 'fake-pi.auto-retry.json'), 'utf8')).aborted, true, 'the retry delay is cancelled after Pi creates its retry controller');
492
- const modelNotFound = await h.spawnHeadlessChild(parent, 'model-not-found capacity fallback', { kind: 'test/capacity-fallback' });
493
- await h.waitFor(() => agentStartCount(modelNotFound) >= 1, { label: 'model-not-found capacity fixture started' });
494
- seedCapacityFixture(modelNotFound);
495
- h.fakeCmd(modelNotFound, { cmd: 'stop', reason: 'error', errorMessage: 'Model not found' });
496
- const modelNotFoundFault = await h.waitFor(() => readFault(modelNotFound)?.kind === 'context-overflow' ? readFault(modelNotFound) : null, { label: 'model-not-found rejects the too-small fallback target' });
497
- assert.equal(modelNotFoundFault.retry.disposition, 'fatal', 'all known-too-small model-not-found targets produce a fatal context-overflow fault');
498
- assert.match(modelNotFoundFault.message, /1000 tokens/, 'the terminal fault survives ordinary settlement staging');
499
- }
500
- finally {
501
- writeRawConfig('user', {});
502
- }
503
- });
504
- // Two real logical launches keep both user paths non-vacuous: the picker first
505
- // proves an explicit concrete choice pins and clears routing, while Alt+M runs
506
- // directly against still-present logical intent before Shift+Tab and replay.
507
- test("picker and Alt+M choices each clear logical routing, and Alt+M / Shift+Tab become the durable restart recipe", { timeout: 30_000 }, async () => {
508
- const parent = h.spawnRoot('model durability parent');
509
- await seedPool('anthropic', false);
510
- await seedPool('openai-codex', false);
511
- writeRawConfig('user', {
512
- kinds: { 'test/logical-openai': { whenToUse: 'Logical OpenAI routing test.', model: 'openai/strong' } },
513
- });
514
- const pickerNode = await h.spawnHeadlessChild(parent, 'picker durability child', { kind: 'test/logical-openai' });
515
- const pickerBefore = h.node(pickerNode);
516
- assert.deepEqual(pickerBefore.launch?.modelIntent, { family: 'openai', strength: 'strong' }, 'picker fixture starts from a logical launch preference');
517
- assert.equal(pickerBefore.launch?.env.CRTR_MODEL_INTENT, 'openai/strong');
518
- const pickerCtrl = await kit.attach(pickerNode, 'controller', 'picker-durability-test');
519
- pickerCtrl.send({ type: 'set_model', model: OPENAI_STRONG.spec }); // exactly what buildModelPicker sends — no `pinned`
520
- await pickerCtrl.waitFrame((f) => f.type === 'ack' && f.for === 'set_model', 'picker set_model acked');
521
- let pickerState = h.node(pickerNode);
522
- assert.equal(pickerState.launch?.modelProviderPinned, true, 'the omitted-pinned frame derives pinned from the real openai-codex registry namespace');
523
- assert.equal(pickerState.launch?.modelIntent, undefined, 'the explicit concrete choice clears the logical launch intent');
524
- assert.equal(pickerState.launch?.env.CRTR_MODEL_INTENT, undefined, 'a revive cannot restore the stale logical route intent');
525
- // `cycle_ladder` carries no raw model/pin token. Running it after the picker
526
- // proves that this internal change preserves the concrete provider pin.
527
- pickerCtrl.send({ type: 'cycle_ladder', direction: 'forward' });
528
- await pickerCtrl.waitFrame((f) => f.type === 'ack' && f.for === 'cycle_ladder', 'post-picker Alt+M cycle_ladder acked');
529
- pickerState = h.node(pickerNode);
530
- assert.equal(pickerState.launch?.modelProviderPinned, true, 'an internal no-raw-token ladder change preserves the explicit picker pin');
531
- pickerCtrl.close();
532
- // A separate logical launch reaches Alt+M with BOTH intent representations
533
- // still populated. This is the regression path: a user-selected ladder rung
534
- // must clear them before a restart can resolve the stale route over it.
535
- const ladderNode = await h.spawnHeadlessChild(parent, 'ladder durability child', { kind: 'test/logical-openai' });
536
- const ladderBefore = h.node(ladderNode);
537
- assert.deepEqual(ladderBefore.launch?.modelIntent, { family: 'openai', strength: 'strong' }, 'Alt+M starts with durable logical modelIntent present');
538
- assert.equal(ladderBefore.launch?.env.CRTR_MODEL_INTENT, 'openai/strong', 'Alt+M starts with the launch environment intent present');
539
- const ladderCtrl = await kit.attach(ladderNode, 'controller', 'ladder-durability-test');
540
- ladderCtrl.send({ type: 'cycle_ladder', direction: 'forward' });
541
- await ladderCtrl.waitFrame((f) => f.type === 'ack' && f.for === 'cycle_ladder', 'logical-launch Alt+M cycle_ladder acked');
542
- let after = h.node(ladderNode);
543
- assert.equal(after.launch?.modelIntent, undefined, 'Alt+M clears the durable logical launch intent');
544
- assert.equal(after.launch?.env.CRTR_MODEL_INTENT, undefined, 'Alt+M clears the logical intent from the restart environment');
545
- assert.equal(after.launch?.modelProviderPinned, ladderBefore.launch?.modelProviderPinned, 'Alt+M preserves the existing pin state verbatim');
546
- assert.equal(after.launch?.model, after.model_override, 'the selected model and thinking rung is the durable revive recipe');
547
- const rung = after.launch?.model;
548
- assert.ok(rung, 'Alt+M persisted a concrete model rung');
549
- const thinkingFrameOffset = ladderCtrl.frames.length;
550
- ladderCtrl.send({ type: 'cycle_thinking' });
551
- const thinkingChanged = await h.waitFor(() => ladderCtrl.frames.slice(thinkingFrameOffset).find((f) => f.type === 'thinking_level_changed') ?? null, { label: 'Shift+Tab thinking change relayed' });
552
- await ladderCtrl.waitFrame((f) => f.type === 'ack' && f.for === 'cycle_thinking', 'Shift+Tab cycle acked');
553
- after = h.node(ladderNode);
554
- const level = thinkingChanged.type === 'thinking_level_changed' ? thinkingChanged.level : 'off';
555
- const bareRung = rung.replace(/:(?:off|minimal|low|medium|high|xhigh|max)$/, '');
556
- const expected = `${bareRung}${level === 'off' ? '' : `:${level}`}`;
557
- assert.equal(after.launch?.model, expected, 'Shift+Tab persists the new thinking level with the selected model');
558
- assert.equal(after.model_override, expected, 'polymorphs preserve the same user-selected model and thinking level');
559
- const replay = buildPiArgv(after, { resumeSessionPath: after.pi_session_file ?? undefined });
560
- const modelArg = replay.argv.indexOf('--model');
561
- assert.notEqual(modelArg, -1, 'a daemon revive replays a model argument');
562
- assert.equal(replay.argv[modelArg + 1], expected, 'the replayed model argument carries both choices');
563
- assert.equal(replay.env.CRTR_MODEL_INTENT, undefined, 'the stale logical intent is absent from the restarted broker environment');
564
- ladderCtrl.close();
565
- writeRawConfig('user', {});
566
- });
567
- test('reload_auth restores a newly authenticated personal route before the next idle prompt', { timeout: 30_000 }, async () => {
568
- const personal = { provider: 'personal-anthropic', id: 'claude-personal' };
569
- const funded = { provider: 'northlight-openai', id: 'gpt-funded' };
570
- const personalSpec = `${personal.provider}/${personal.id}:xhigh`;
571
- const unauthenticatedProvider = join(h.home, 'fake-pi.unauthenticated-provider');
572
- writeRawConfig('user', {
573
- // A fixture-private kind, never `general`: the child launches with the
574
- // package root as cwd, so an ambient project-scope config above the repo
575
- // (`~/.crouter/config.json`) overrides this user-scope `general` and the
576
- // child boots on that machine's default strength instead of medium.
577
- kinds: { 'test/logical-anthropic': { whenToUse: 'Logical Anthropic routing test.', model: 'anthropic/medium' } },
578
- modelRoutes: {
579
- personal: { family: 'anthropic', credentialSource: 'user', providerId: personal.provider, models: { ultra: personalSpec, strong: personalSpec, medium: personalSpec, light: personalSpec } },
580
- funded: { family: 'anthropic', credentialSource: 'northlight', providerId: funded.provider, models: { ultra: `${funded.provider}/${funded.id}:medium`, strong: `${funded.provider}/${funded.id}:medium`, medium: `${funded.provider}/${funded.id}:medium`, light: `${funded.provider}/${funded.id}:medium` } },
581
- },
582
- modelRouting: { credentialSourceOrder: ['user', 'northlight'], familyOrder: ['anthropic'], strengthFallback: ['medium'] },
583
- });
584
- writeFileSync(unauthenticatedProvider, personal.provider);
585
- try {
586
- const parent = h.spawnRoot('auth route reconciliation parent');
587
- const child = await h.spawnHeadlessChild(parent, 'auth route reconciliation child', { kind: 'test/logical-anthropic' });
588
- assert.deepEqual(model(child), funded, 'the logical request starts on the funded route while personal auth is absent');
589
- const controller = await kit.connectRaw(child, { read: true });
590
- controller.send({ type: 'hello', role: 'controller', client_id: 'auth-route-reconciliation' });
591
- await h.waitFor(() => controller.frames.some((frame) => frame.type === 'welcome') ? true : null, { label: 'route reconciliation controller welcomed' });
592
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'route reconciliation kickoff started' });
593
- const kickoffObserver = await attachUntil(child, 'observer', 'route-reconciliation-kickoff-settled', (a) => a.welcome.snapshot.state.isStreaming === false, 'route reconciliation kickoff settled');
594
- kickoffObserver.close();
595
- rmSync(unauthenticatedProvider, { force: true });
596
- const frameStart = controller.frames.length;
597
- controller.writeRaw(encodeFrame({ type: 'reload_auth' })
598
- + encodeFrame({ type: 'prompt', text: 'continue after login' }));
599
- await h.waitFor(() => {
600
- const frames = controller.frames.slice(frameStart);
601
- const changed = frames.some((frame) => frame.type === 'model_changed' && frame.spec === personalSpec);
602
- const started = frames.some((frame) => frame.type === 'agent_start');
603
- return changed && started ? true : null;
604
- }, { label: 'personal route adopted before queued prompt starts' });
605
- const frames = controller.frames.slice(frameStart);
606
- const modelChangedIndex = frames.findIndex((frame) => frame.type === 'model_changed' && frame.spec === personalSpec);
607
- const agentStartIndex = frames.findIndex((frame) => frame.type === 'agent_start');
608
- assert.ok(modelChangedIndex >= 0 && modelChangedIndex < agentStartIndex, 'route reconciliation completes before the next idle prompt starts');
609
- assert.deepEqual(model(child), personal, 'the live session adopts the newly authenticated personal route');
610
- const persisted = await h.waitFor(() => {
611
- const node = h.node(child);
612
- return node?.launch?.model === personalSpec ? node : null;
613
- }, { label: 'personal route persisted without clearing logical intent' });
614
- assert.deepEqual(persisted.launch?.modelIntent, { family: 'anthropic', strength: 'medium' });
615
- assert.equal(persisted.launch?.env.CRTR_MODEL_INTENT, 'anthropic/medium', 'algorithmic reconciliation preserves the durable logical intent');
616
- }
617
- finally {
618
- rmSync(unauthenticatedProvider, { force: true });
619
- writeRawConfig('user', {});
620
- }
621
- });
622
- // MODEL-LESS LAUNCH RE-DRIVE — MUST REMAIN THE LAST TEST IN THIS FILE. Its
623
- // zero-auth seam, <CRTR_HOME>/fake-pi.no-auth, is HOME-GLOBAL: while it exists
624
- // the fake engine's modelRegistry reports a genuine zero-auth boot, so no other
625
- // boot may overlap it. Arming it before the spawn is race-free against the
626
- // broker's boot-time registry read, and deleting it mid-test is a live auth-on
627
- // flip that reload_auth's modelRegistry.refresh() re-reads (fake-engine.ts,
628
- // createAgentSessionServices).
629
- //
630
- // Locks two broker.ts launch-model fixes:
631
- // 0b unknown-stub detection — the SDK hands a model-less session an
632
- // unknown-stub model (never `undefined`), so sessionHasNoModel() must defer
633
- // the kickoff instead of prompting a keyless engine.
634
- // 0a self-healing model-less registry — the construction-time mask that
635
- // suppresses the SDK's findInitialModel must reveal() the instant
636
- // construction returns, or list_models stays broken forever for a
637
- // model-less-booted node even after a /login. The auth-on list_models
638
- // assertion below is the ONLY one that discriminates that bug: with the
639
- // mask never revealed, getAvailable() returns [] forever.
640
- //
641
- // The request is LOGICAL (`anthropic/medium`), deliberately. A CONCRETE pin can
642
- // never reach a model-less boot: both `node new`'s assertLaunchModelRegistered
643
- // and resolveLaunchModel's own unregisteredConcreteModel gate treat a concrete
644
- // spec absent from the serving registry as a FATAL model-not-found, and under
645
- // the zero-auth sentinel every spec is absent. A logical request skips both
646
- // gates by design, so the zero-auth window produces the tier-3 model-less boot
647
- // this test exists to cover. After the flip its candidate tail includes the
648
- // fake registry's non-managed `fake/fake-model`, whose hasConfiguredAuth() the
649
- // sentinel controls — so the re-drive resolves without needing managed
650
- // subscription-pool occupancy (broker-sdk-wiring's scope).
651
- test('login re-drive → list_models self-heals (0a) and reload_auth resolves a model + fires the deferred kickoff', { timeout: 30_000 }, async () => {
652
- const noAuthSentinel = join(h.home, 'fake-pi.no-auth');
653
- writeRawConfig('user', {
654
- kinds: { general: { whenToUse: 'General work.', model: 'anthropic/medium' } },
655
- });
656
- writeFileSync(noAuthSentinel, '1');
657
- try {
658
- const parent = h.spawnRoot('login re-drive parent');
659
- const child = await h.spawnHeadlessChild(parent, 'login re-drive');
660
- assert.equal(model(child), null, 'boots model-less under zero-auth');
661
- assert.equal(agentStartCount(child), 0, 'kickoff deferred at boot');
662
- const c = await attachUntil(child, 'controller', 'redrive-ctrl', (a) => a.welcome.role === 'controller', 'redrive controller admitted');
663
- // A read-op reply is a correlated `data` frame the client swallows into
664
- // request()'s by-id resolver (NEVER a generic 'frame'), so we MUST use
665
- // client.request(), not send()+waitFrame.
666
- // Baseline: under zero-auth the registry reports nothing available.
667
- const lm0 = await c.client.request({ type: 'list_models' });
668
- assert.ok(lm0.kind === 'list_models' && lm0.availableIds.length === 0, 'zero-auth: no models available');
669
- // FLIP AUTH ON, then re-query while the broker is still alive (no turn has run
670
- // yet). getAvailable() flows through the revealed construction proxy →
671
- // NON-empty. With the mask never revealed it would still be [].
672
- rmSync(noAuthSentinel, { force: true });
673
- const lm1 = await c.client.request({ type: 'list_models' });
674
- assert.ok(lm1.kind === 'list_models' && lm1.availableIds.length > 0, 'auth on: list_models reports an available model (0a self-heal — the construction mask revealed)');
675
- // reload_auth re-drives the launch policy → resolves a model and fires the
676
- // deferred kickoff. Disk reads, so they survive the broker idle-releasing
677
- // once that kickoff turn ends.
678
- c.send({ type: 'reload_auth' });
679
- await h.waitFor(() => model(child) !== null, { label: 're-drive selected a model' });
680
- await h.waitFor(() => agentStartCount(child) >= 1, { label: 'deferred kickoff fired after re-drive' });
681
- }
682
- finally {
683
- rmSync(noAuthSentinel, { force: true });
684
- writeRawConfig('user', {});
685
- }
686
- });