@north-light/crouter 0.3.318 → 0.3.320
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -3
- package/dist/api/client.js +2 -912
- package/dist/api/dto/attach.js +0 -13
- package/dist/api/dto/bash-jobs.js +1 -9
- package/dist/api/dto/broker-ops.js +0 -6
- package/dist/api/dto/broker.js +0 -20
- package/dist/api/dto/canvas.js +0 -2
- package/dist/api/dto/chat-inventory.js +0 -11
- package/dist/api/dto/common.js +1 -15
- package/dist/api/dto/config.js +0 -3
- package/dist/api/dto/crons.js +1 -10
- package/dist/api/dto/files.js +0 -7
- package/dist/api/dto/focus.js +0 -10
- package/dist/api/dto/health.js +0 -2
- package/dist/api/dto/human-requests.js +0 -4
- package/dist/api/dto/human.js +0 -4
- package/dist/api/dto/inbox.js +0 -4
- package/dist/api/dto/lifecycle.js +0 -3
- package/dist/api/dto/mail.js +0 -1
- package/dist/api/dto/memory.js +0 -6
- package/dist/api/dto/messages.js +0 -2
- package/dist/api/dto/model-config.js +0 -1
- package/dist/api/dto/modelauth.js +0 -4
- package/dist/api/dto/node-outcomes.js +0 -2
- package/dist/api/dto/nodes.js +0 -3
- package/dist/api/dto/profiles.js +1 -4
- package/dist/api/dto/recovery.js +0 -1
- package/dist/api/dto/reports.js +0 -2
- package/dist/api/dto/review-comments.js +0 -5
- package/dist/api/dto/reviews.js +0 -5
- package/dist/api/dto/subscriptions.js +0 -2
- package/dist/api/dto/worktree.js +0 -6
- package/dist/api/errors.js +1 -40
- package/dist/api/index.js +1 -33
- package/dist/api/plugin-manifest-schema.js +0 -23
- package/dist/api/routes.js +1 -147
- package/dist/build-root.js +1 -198
- package/dist/cli.js +3 -99
- package/dist/clients/attach/ansi-cells.js +1 -137
- package/dist/clients/attach/chrome/bash-jobs.js +1 -31
- package/dist/clients/attach/chrome/canvas-panels.js +1 -194
- package/dist/clients/attach/chrome/completion-bell.js +1 -89
- package/dist/clients/attach/chrome/cron-wait.js +1 -34
- package/dist/clients/attach/chrome/git-info.js +2 -44
- package/dist/clients/attach/chrome/header.js +1 -30
- package/dist/clients/attach/chrome/inbox-strip.js +1 -199
- package/dist/clients/attach/chrome/recap.js +1 -19
- package/dist/clients/attach/chrome/review-wait.js +1 -22
- package/dist/clients/attach/chrome/roster.js +4 -275
- package/dist/clients/attach/chrome/status-line.js +1 -117
- package/dist/clients/attach/chrome/ticket-panel.js +1 -280
- package/dist/clients/attach/chrome/widgets.js +1 -51
- package/dist/clients/attach/command.js +1 -107
- package/dist/clients/attach/config.js +1 -274
- package/dist/clients/attach/input/capabilities.js +1 -104
- package/dist/clients/attach/input/clipboard-image.js +3 -220
- package/dist/clients/attach/input/completion-frecency.js +1 -141
- package/dist/clients/attach/input/controller.js +7 -377
- package/dist/clients/attach/input/overlay-owner.js +1 -199
- package/dist/clients/attach/input/ref-autocomplete.js +2 -176
- package/dist/clients/attach/input/titled-editor.js +4 -859
- package/dist/clients/attach/overlays/auth.js +2 -271
- package/dist/clients/attach/overlays/dialogs.js +2 -102
- package/dist/clients/attach/overlays/file-review.js +2 -128
- package/dist/clients/attach/overlays/graph.js +1 -661
- package/dist/clients/attach/overlays/help.js +1 -211
- package/dist/clients/attach/overlays/mcp.js +1 -302
- package/dist/clients/attach/overlays/pickers.js +1 -163
- package/dist/clients/attach/render/activity-slot.js +1 -13
- package/dist/clients/attach/render/assistant-message.js +1 -56
- package/dist/clients/attach/render/card-presentation.js +5 -218
- package/dist/clients/attach/render/chat-view.js +5 -1708
- package/dist/clients/attach/render/condensed-history.js +1 -60
- package/dist/clients/attach/render/context-message.js +1 -63
- package/dist/clients/attach/render/crtr-output.js +17 -905
- package/dist/clients/attach/render/diagram.js +7 -111
- package/dist/clients/attach/render/edit-diff.js +5 -304
- package/dist/clients/attach/render/glyph-codepoints.js +1 -42
- package/dist/clients/attach/render/group-activity.js +2 -263
- package/dist/clients/attach/render/group-recap.js +1 -152
- package/dist/clients/attach/render/markdown-source.js +5 -266
- package/dist/clients/attach/render/measured-container.js +1 -322
- package/dist/clients/attach/render/page-block.js +1 -183
- package/dist/clients/attach/render/scroll-animation.js +1 -80
- package/dist/clients/attach/render/tool-calls.js +3 -361
- package/dist/clients/attach/render/transcript-copy.js +2 -81
- package/dist/clients/attach/render/transcript-search.js +1 -152
- package/dist/clients/attach/render/viewport.js +1 -184
- package/dist/clients/attach/session/banner.js +1 -29
- package/dist/clients/attach/session/bindings.js +1 -71
- package/dist/clients/attach/session/chrome-refresh.js +1 -94
- package/dist/clients/attach/session/connection.js +1 -186
- package/dist/clients/attach/session/context.js +0 -16
- package/dist/clients/attach/session/editor-frame.js +1 -142
- package/dist/clients/attach/session/editor-inventory.js +6 -160
- package/dist/clients/attach/session/file-links.js +1 -68
- package/dist/clients/attach/session/focus-events.js +1 -12
- package/dist/clients/attach/session/frame.js +1 -214
- package/dist/clients/attach/session/frames.js +1 -188
- package/dist/clients/attach/session/identity.js +1 -26
- package/dist/clients/attach/session/input-wiring.js +1 -140
- package/dist/clients/attach/session/invariant.js +1 -15
- package/dist/clients/attach/session/keys.js +1 -77
- package/dist/clients/attach/session/layout.js +1 -59
- package/dist/clients/attach/session/mouse.js +1 -78
- package/dist/clients/attach/session/pane-focus.js +1 -42
- package/dist/clients/attach/session/pane-tag.js +1 -112
- package/dist/clients/attach/session/pi-assets.js +1 -24
- package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
- package/dist/clients/attach/session/profile-files.js +1 -228
- package/dist/clients/attach/session/reconnect.js +1 -175
- package/dist/clients/attach/session/selection.js +3 -108
- package/dist/clients/attach/session/state-sync.js +1 -67
- package/dist/clients/attach/session/surface-frame.js +1 -73
- package/dist/clients/attach/session/surface-host.js +1 -255
- package/dist/clients/attach/session/teardown.js +5 -94
- package/dist/clients/attach/session/transcript-search.js +3 -151
- package/dist/clients/attach/session/whip-achievements.js +2 -145
- package/dist/clients/attach/session/whip.js +1 -362
- package/dist/clients/attach/slash/dispatch.js +1 -706
- package/dist/clients/attach/slash/prompt-preview.js +1 -121
- package/dist/clients/attach/viewer.js +441 -441
- package/dist/clients/conversation/projection.js +1 -324
- package/dist/clients/conversation/submit.js +1 -51
- package/dist/clients/inbox/controller.js +1 -701
- package/dist/clients/inbox/dto-adapt.js +1 -93
- package/dist/clients/inbox/layout.js +1 -9
- package/dist/clients/inbox/page-adapter.js +1 -55
- package/dist/clients/inbox/resolve.js +1 -35
- package/dist/clients/inbox/review/anchors.js +1 -89
- package/dist/clients/inbox/review/comments-client.js +1 -98
- package/dist/clients/inbox/review/companion-pane.js +1 -82
- package/dist/clients/inbox/review/document-surface.js +2 -1188
- package/dist/clients/inbox/review/frame.js +1 -216
- package/dist/clients/inbox/review/keys.js +1 -123
- package/dist/clients/inbox/review/launch.js +1 -151
- package/dist/clients/inbox/review/live-source.js +1 -160
- package/dist/clients/inbox/review/nvim.js +1 -44
- package/dist/clients/inbox/review/remap.js +1 -157
- package/dist/clients/inbox/review/review-client.js +1 -123
- package/dist/clients/inbox/review/roundtrip.js +3 -36
- package/dist/clients/inbox/review/state.js +4 -315
- package/dist/clients/inbox/review-adapter.js +1 -43
- package/dist/clients/inbox/surface.js +1 -152
- package/dist/clients/inbox/tui/ansi.js +3 -321
- package/dist/clients/inbox/tui/input.js +5 -392
- package/dist/clients/inbox/tui/keys.js +1 -104
- package/dist/clients/inbox/tui/page-body.js +1 -66
- package/dist/clients/inbox/tui/panel.js +1 -84
- package/dist/clients/inbox/tui/render.js +2 -368
- package/dist/clients/inbox/tui/slots.js +3 -134
- package/dist/clients/inbox/tui/types.js +0 -1
- package/dist/clients/inbox/tui.js +1 -86
- package/dist/clients/surfaces/host.js +0 -1
- package/dist/commands/api-client.js +4 -290
- package/dist/commands/attention.js +1 -215
- package/dist/commands/canvas-browse.js +1 -70
- package/dist/commands/canvas-config.js +2 -192
- package/dist/commands/canvas-history/grep.js +7 -85
- package/dist/commands/canvas-history/read.js +3 -50
- package/dist/commands/canvas-history/search.js +10 -99
- package/dist/commands/canvas-history/shared.js +1 -139
- package/dist/commands/canvas-history/stats.js +6 -68
- package/dist/commands/canvas-history.js +1 -32
- package/dist/commands/canvas-issue.js +14 -149
- package/dist/commands/canvas-prune.js +1 -108
- package/dist/commands/canvas-roster.js +1 -69
- package/dist/commands/canvas-snapshot.js +1 -34
- package/dist/commands/canvas-use.js +1 -61
- package/dist/commands/canvas.js +1 -49
- package/dist/commands/chord.js +1 -241
- package/dist/commands/cron.js +11 -534
- package/dist/commands/dashboard.js +1 -85
- package/dist/commands/human/components.js +3 -77
- package/dist/commands/human/feedback.js +1 -112
- package/dist/commands/human/prompts.js +1 -331
- package/dist/commands/human/queue.js +1 -191
- package/dist/commands/human/request.js +1 -266
- package/dist/commands/human/review.js +1 -288
- package/dist/commands/human/shared.js +1 -67
- package/dist/commands/human.js +4 -60
- package/dist/commands/memory/delete.js +1 -100
- package/dist/commands/memory/edit.js +21 -219
- package/dist/commands/memory/find.js +2 -244
- package/dist/commands/memory/history.js +5 -199
- package/dist/commands/memory/lint.js +1 -107
- package/dist/commands/memory/list.js +1 -142
- package/dist/commands/memory/move.js +1 -223
- package/dist/commands/memory/origin.js +1 -130
- package/dist/commands/memory/read.js +6 -232
- package/dist/commands/memory/shared.js +12 -802
- package/dist/commands/memory/write.js +13 -235
- package/dist/commands/memory.js +1 -30
- package/dist/commands/node/bash.js +5 -245
- package/dist/commands/node/create.js +3 -332
- package/dist/commands/node/inspect.js +12 -300
- package/dist/commands/node/lifecycle.js +2 -453
- package/dist/commands/node/message.js +1 -161
- package/dist/commands/node/outcome.js +4 -134
- package/dist/commands/node/pyramid.js +2 -79
- package/dist/commands/node/subscription.js +1 -78
- package/dist/commands/node/wait.js +7 -163
- package/dist/commands/node-context.js +2 -159
- package/dist/commands/node-inspect-artifacts.js +8 -109
- package/dist/commands/node-lifecycle-revive.js +1 -217
- package/dist/commands/node-snapshot.js +1 -37
- package/dist/commands/node-transcript.js +1 -62
- package/dist/commands/node-worktree.js +1 -138
- package/dist/commands/node.js +1 -29
- package/dist/commands/pkg/browse/actions.js +1 -198
- package/dist/commands/pkg/browse/catalog.js +1 -466
- package/dist/commands/pkg/browse/command-view.js +1 -191
- package/dist/commands/pkg/browse/detail-panel.js +1 -402
- package/dist/commands/pkg/browse/doc-view.js +1 -89
- package/dist/commands/pkg/browse/list-panel.js +2 -168
- package/dist/commands/pkg/browse/model.js +1 -36
- package/dist/commands/pkg/browse/shell.js +1 -640
- package/dist/commands/pkg/browse.js +1 -27
- package/dist/commands/pkg/market-inspect.js +1 -141
- package/dist/commands/pkg/market-manage.js +1 -327
- package/dist/commands/pkg/market.js +1 -14
- package/dist/commands/pkg/plugin-inspect.js +1 -168
- package/dist/commands/pkg/plugin-manage.js +17 -1109
- package/dist/commands/pkg/plugin.js +1 -14
- package/dist/commands/pkg/shared.js +1 -62
- package/dist/commands/pkg.js +1 -21
- package/dist/commands/profile/default.js +1 -139
- package/dist/commands/profile/delete.js +1 -66
- package/dist/commands/profile/env.js +3 -188
- package/dist/commands/profile/kind.js +2 -35
- package/dist/commands/profile/list.js +1 -43
- package/dist/commands/profile/meta.js +1 -67
- package/dist/commands/profile/new.js +1 -115
- package/dist/commands/profile/pause.js +1 -59
- package/dist/commands/profile/project.js +1 -113
- package/dist/commands/profile/rename.js +1 -38
- package/dist/commands/profile/show.js +1 -52
- package/dist/commands/profile.js +1 -35
- package/dist/commands/push.js +9 -265
- package/dist/commands/revive.js +10 -181
- package/dist/commands/surface/node/cycle.js +1 -83
- package/dist/commands/surface/node/focus.js +1 -81
- package/dist/commands/surface/node/id.js +1 -38
- package/dist/commands/surface/node/pin.js +1 -42
- package/dist/commands/surface/node/placement.js +1 -134
- package/dist/commands/surface-edit.js +1 -157
- package/dist/commands/surface-inbox.js +1 -98
- package/dist/commands/surface-inspect.js +1 -39
- package/dist/commands/surface-node.js +1 -19
- package/dist/commands/surface-reload.js +2 -134
- package/dist/commands/surface-tmux-spread.js +1 -214
- package/dist/commands/surface.js +1 -28
- package/dist/commands/sys/branch.js +1 -19
- package/dist/commands/sys/config.js +1 -353
- package/dist/commands/sys/context/admin/actions.js +2 -246
- package/dist/commands/sys/context/admin/detail-panel.js +1 -247
- package/dist/commands/sys/context/admin/docs-panel.js +1 -191
- package/dist/commands/sys/context/admin/list-view.js +1 -183
- package/dist/commands/sys/context/admin/model.js +1 -229
- package/dist/commands/sys/context/admin/rail-panel.js +1 -227
- package/dist/commands/sys/context/admin/read-view.js +2 -194
- package/dist/commands/sys/context/admin/shell.js +1 -910
- package/dist/commands/sys/context/admin.js +2 -126
- package/dist/commands/sys/context/doc.js +3 -197
- package/dist/commands/sys/context/prompt-review.js +11 -291
- package/dist/commands/sys/context/resolve.js +10 -489
- package/dist/commands/sys/context/sysprompt.js +5 -96
- package/dist/commands/sys/context.js +1 -20
- package/dist/commands/sys/daemon.js +1 -313
- package/dist/commands/sys/doctor.js +1 -617
- package/dist/commands/sys/feedback.js +7 -228
- package/dist/commands/sys/logs.js +3 -129
- package/dist/commands/sys/migrate.js +1 -94
- package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
- package/dist/commands/sys/panels/dependencies-panel.js +1 -80
- package/dist/commands/sys/panels/keybindings-panel.js +1 -703
- package/dist/commands/sys/panels/models-panel.js +1 -1133
- package/dist/commands/sys/panels/plugins-panel.js +1 -80
- package/dist/commands/sys/panels/prefs-panel.js +1 -85
- package/dist/commands/sys/panels/profiles-panel.js +1 -601
- package/dist/commands/sys/panels/provider-panel.js +1 -538
- package/dist/commands/sys/settings-shell.js +1 -400
- package/dist/commands/sys/settings.js +1 -46
- package/dist/commands/sys/setup-core.js +6 -579
- package/dist/commands/sys/setup-settings-runner.js +1 -16
- package/dist/commands/sys/setup-wizard.js +1 -279
- package/dist/commands/sys/setup.js +1 -34
- package/dist/commands/sys/shared.js +1 -81
- package/dist/commands/sys/support/prepare.js +3 -239
- package/dist/commands/sys/support/submit.js +6 -524
- package/dist/commands/sys/support.js +1 -18
- package/dist/commands/sys/sync-deps.js +15 -498
- package/dist/commands/sys/sync-project-guidance.js +4 -481
- package/dist/commands/sys/sync-shared.js +1 -49
- package/dist/commands/sys/sync-skills.js +2 -311
- package/dist/commands/sys/sync.js +1 -18
- package/dist/commands/sys/update.js +1 -147
- package/dist/commands/sys/worktrees.js +5 -53
- package/dist/commands/sys.js +1 -18
- package/dist/core/activity-signal.js +2 -38
- package/dist/core/asset-root.js +1 -18
- package/dist/core/auth-file.js +2 -179
- package/dist/core/auth-interaction.js +3 -94
- package/dist/core/auto-update.js +4 -94
- package/dist/core/bash-guard.js +11 -393
- package/dist/core/bash-jobs.js +7 -411
- package/dist/core/bootstrap.js +2 -53
- package/dist/core/broker-client/client.js +1 -184
- package/dist/core/broker-client/index.js +1 -13
- package/dist/core/broker-client/transport-relay.js +1 -157
- package/dist/core/broker-client/transport-socket.js +1 -179
- package/dist/core/broker-client/transport.js +1 -26
- package/dist/core/canvas/attention.js +1 -47
- package/dist/core/canvas/boot-id.js +1 -26
- package/dist/core/canvas/boot.js +1 -186
- package/dist/core/canvas/browse/app.js +3 -919
- package/dist/core/canvas/browse/model.js +1 -477
- package/dist/core/canvas/browse/pins.js +1 -29
- package/dist/core/canvas/browse/render.js +3 -1055
- package/dist/core/canvas/canvas.js +15 -922
- package/dist/core/canvas/crons.js +11 -481
- package/dist/core/canvas/daemon-owner.js +2 -146
- package/dist/core/canvas/db.js +2 -100
- package/dist/core/canvas/deliveries.js +22 -283
- package/dist/core/canvas/delivery-contract.js +1 -8
- package/dist/core/canvas/executions.js +1 -68
- package/dist/core/canvas/extensions.js +1 -83
- package/dist/core/canvas/focuses.js +1 -77
- package/dist/core/canvas/history.js +24 -860
- package/dist/core/canvas/index.js +1 -15
- package/dist/core/canvas/install-id.js +1 -84
- package/dist/core/canvas/labels.js +1 -43
- package/dist/core/canvas/meta-file.js +1 -89
- package/dist/core/canvas/migrations.js +41 -1150
- package/dist/core/canvas/nav-model.js +1 -231
- package/dist/core/canvas/nav-render.js +1 -260
- package/dist/core/canvas/node-order.js +1 -37
- package/dist/core/canvas/node-recap.js +2 -67
- package/dist/core/canvas/node-sql-migration.js +2 -209
- package/dist/core/canvas/paths.js +1 -153
- package/dist/core/canvas/pid.js +4 -683
- package/dist/core/canvas/recovery.js +3 -565
- package/dist/core/canvas/remote-canvas-source.js +1 -288
- package/dist/core/canvas/remote-transport.js +1 -57
- package/dist/core/canvas/render-source.js +10 -635
- package/dist/core/canvas/sessions.js +1 -78
- package/dist/core/canvas/source.js +1 -47
- package/dist/core/canvas/status-glyph.js +1 -132
- package/dist/core/canvas/telemetry.js +1 -35
- package/dist/core/canvas/types.js +1 -6
- package/dist/core/canvas/waits.js +4 -68
- package/dist/core/canvas/worktrees.js +1 -93
- package/dist/core/clipboard-text.js +1 -57
- package/dist/core/command-hooks/artifact.js +1 -145
- package/dist/core/command-hooks/catalog.js +1 -38
- package/dist/core/command-hooks/compose.js +1 -99
- package/dist/core/command-hooks/discovery.js +1 -228
- package/dist/core/command-hooks/help.js +1 -18
- package/dist/core/command-hooks/index.js +1 -7
- package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
- package/dist/core/command-hooks/lifecycle-create.js +1 -51
- package/dist/core/command-hooks/report.js +1 -28
- package/dist/core/command-hooks/schema.js +1 -157
- package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
- package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
- package/dist/core/command-manifests/manifest.js +1 -324
- package/dist/core/command-manifests/registry.js +1 -118
- package/dist/core/command-manifests/schema.js +1 -736
- package/dist/core/command-plugins/bundle.js +1 -261
- package/dist/core/command-plugins/compose.js +1 -65
- package/dist/core/command-plugins/discovery.js +1 -245
- package/dist/core/command-plugins/endpoint.js +1 -48
- package/dist/core/command-plugins/extensions.js +1 -166
- package/dist/core/command-plugins/help-addenda.js +1 -44
- package/dist/core/command-plugins/presence.js +1 -17
- package/dist/core/command-plugins/revalidate.js +2 -152
- package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
- package/dist/core/command-plugins/transport/http-fetch.js +1 -68
- package/dist/core/command-plugins/transport/http-invoke.js +3 -546
- package/dist/core/command.js +10 -739
- package/dist/core/config.js +1 -1059
- package/dist/core/document-lines.js +3 -6
- package/dist/core/env-name.js +1 -9
- package/dist/core/errors.js +1 -52
- package/dist/core/events/emit.js +1 -17
- package/dist/core/events/envelope.js +1 -84
- package/dist/core/events/errors.js +1 -69
- package/dist/core/events/index.js +1 -4
- package/dist/core/events/operation-id.js +1 -24
- package/dist/core/events/read.js +1 -623
- package/dist/core/events/serialize.js +1 -199
- package/dist/core/events/source.js +1 -31
- package/dist/core/events/types.js +1 -11
- package/dist/core/exclusive-lock.js +1 -197
- package/dist/core/fault-classifier.js +1 -96
- package/dist/core/feed/feed.js +7 -202
- package/dist/core/feed/inbox-migrate.js +3 -135
- package/dist/core/feed/inbox.js +10 -122
- package/dist/core/feed/messages.js +6 -212
- package/dist/core/frontmatter.js +1 -35
- package/dist/core/fs-utils.js +3 -202
- package/dist/core/git.js +2 -103
- package/dist/core/help.js +9 -310
- package/dist/core/host-exports/builtins.js +9 -68
- package/dist/core/host-exports/export.js +3 -124
- package/dist/core/human/action-binding.js +1 -40
- package/dist/core/human/answer-text.js +5 -100
- package/dist/core/human/answer.js +1 -119
- package/dist/core/human/claim.js +3 -67
- package/dist/core/human/completion.js +1 -27
- package/dist/core/human/component-docs.js +78 -272
- package/dist/core/human/convention.js +2 -82
- package/dist/core/human/feedback-companion.js +1 -106
- package/dist/core/human/feedback.js +1 -88
- package/dist/core/human/page-authoring.js +1 -19
- package/dist/core/human/page-catalog.js +1 -172
- package/dist/core/human/page-errors.js +1 -7
- package/dist/core/human/page-eval.js +1 -125
- package/dist/core/human/page-html-markdown.js +8 -260
- package/dist/core/human/page-markdown.js +17 -295
- package/dist/core/human/page-schema.js +1 -373
- package/dist/core/human/page-synth.js +8 -27
- package/dist/core/human/page.js +1 -198
- package/dist/core/human/requests.js +15 -466
- package/dist/core/human/review-schema.js +1 -34
- package/dist/core/human/root.js +1 -11
- package/dist/core/human/scan.js +1 -69
- package/dist/core/human/summary.js +1 -5
- package/dist/core/human/tickets.js +1 -171
- package/dist/core/human/types.js +0 -1
- package/dist/core/human/visible-paths.js +1 -77
- package/dist/core/human-actions.js +1 -101
- package/dist/core/inspector/chrome.js +1 -14
- package/dist/core/inspector/contract.js +0 -1
- package/dist/core/inspector/core.js +2 -295
- package/dist/core/inspector/host.js +4 -538
- package/dist/core/inspector/model.js +2 -226
- package/dist/core/inspector/text.js +6 -45
- package/dist/core/inspector/transport.js +1 -36
- package/dist/core/inspector/tui.js +2 -295
- package/dist/core/installed-plugins.js +1 -78
- package/dist/core/io.js +7 -356
- package/dist/core/keybindings/attach-control.js +1 -42
- package/dist/core/keybindings/background-bash.js +1 -33
- package/dist/core/keybindings/catalog.js +1 -256
- package/dist/core/keybindings/inbox.js +1 -25
- package/dist/core/keybindings/index.js +1 -7
- package/dist/core/keybindings/match.js +1 -127
- package/dist/core/keybindings/persistence.js +1 -49
- package/dist/core/keybindings/resolve.js +1 -348
- package/dist/core/keybindings/types.js +0 -1
- package/dist/core/locked-file.js +1 -118
- package/dist/core/log.js +3 -27
- package/dist/core/manifest-recovery.js +1 -72
- package/dist/core/manifest-stale.js +1 -39
- package/dist/core/manifest.js +1 -20
- package/dist/core/memory/doc-link-grammar.js +2 -109
- package/dist/core/memory/extensions.js +1 -221
- package/dist/core/memory/history.js +6 -268
- package/dist/core/memory/identity.js +1 -181
- package/dist/core/memory/inline-ref-grammar.js +1 -98
- package/dist/core/memory/inline-ref-guidance.js +2 -35
- package/dist/core/memory/inline-ref-inventory.js +1 -59
- package/dist/core/memory/lint.js +2 -671
- package/dist/core/memory/project-namespace.js +2 -85
- package/dist/core/memory/repository-association.js +1 -129
- package/dist/core/memory/tree.js +1 -93
- package/dist/core/memory-resolver.js +2 -611
- package/dist/core/model-config.js +1 -107
- package/dist/core/model-routes.js +1 -201
- package/dist/core/nested-stores.js +2 -166
- package/dist/core/output.js +7 -99
- package/dist/core/pagination.js +1 -88
- package/dist/core/plugin-swap-lock.js +1 -31
- package/dist/core/pool-credential-store.js +1 -116
- package/dist/core/predicate.js +1 -191
- package/dist/core/preview-registry.js +2 -411
- package/dist/core/preview-result-path.js +1 -26
- package/dist/core/profiles/default-binding.js +1 -24
- package/dist/core/profiles/deletion-reservation.js +1 -42
- package/dist/core/profiles/env-store.js +2 -162
- package/dist/core/profiles/fuzzy-match.js +1 -92
- package/dist/core/profiles/manifest.js +1 -574
- package/dist/core/profiles/select.js +35 -741
- package/dist/core/profiles/state-block.js +3 -17
- package/dist/core/provider-error-recognition.js +1 -74
- package/dist/core/provider-failure.js +1 -86
- package/dist/core/provider-management.js +1 -22
- package/dist/core/remote-canvas-target.js +1 -30
- package/dist/core/render.js +18 -138
- package/dist/core/resolver.js +1 -111
- package/dist/core/review/birth.js +1 -52
- package/dist/core/review/comments.js +5 -279
- package/dist/core/review/companion.js +1 -215
- package/dist/core/review/document.js +2 -138
- package/dist/core/review/project.js +1 -36
- package/dist/core/review/realize.js +1 -71
- package/dist/core/review/remap.js +4 -141
- package/dist/core/review/signal.js +1 -12
- package/dist/core/review/stage.js +1 -184
- package/dist/core/review/store.js +1 -168
- package/dist/core/review/types.js +1 -23
- package/dist/core/runtime/advertised-command-invocation.js +1 -233
- package/dist/core/runtime/auth-reload.js +1 -67
- package/dist/core/runtime/banner.js +1 -51
- package/dist/core/runtime/bearings-render.js +18 -250
- package/dist/core/runtime/bearings.js +7 -194
- package/dist/core/runtime/bin-contributions.js +2 -186
- package/dist/core/runtime/boot-root.js +1 -107
- package/dist/core/runtime/branded-host.js +2 -264
- package/dist/core/runtime/broker/auth-reload.js +1 -157
- package/dist/core/runtime/broker/client-registry.js +1 -179
- package/dist/core/runtime/broker/daemon-ops.js +1 -88
- package/dist/core/runtime/broker/engine-drive.js +1 -354
- package/dist/core/runtime/broker/engine-routing.js +1 -211
- package/dist/core/runtime/broker/event-projection.js +1 -193
- package/dist/core/runtime/broker/extension-abort.js +1 -36
- package/dist/core/runtime/broker/fault-retry.js +1 -588
- package/dist/core/runtime/broker/frame-client.js +1 -132
- package/dist/core/runtime/broker/frame-dispatch.js +1 -183
- package/dist/core/runtime/broker/frame-engine-control.js +1 -231
- package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
- package/dist/core/runtime/broker/frame-model-query.js +1 -69
- package/dist/core/runtime/broker/frame-read.js +1 -116
- package/dist/core/runtime/broker/frame-replies.js +1 -64
- package/dist/core/runtime/broker/frame-session.js +4 -203
- package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
- package/dist/core/runtime/broker/inbox.js +13 -163
- package/dist/core/runtime/broker/node-named.js +1 -27
- package/dist/core/runtime/broker/read-ops.js +1 -171
- package/dist/core/runtime/broker/rebind.js +1 -318
- package/dist/core/runtime/broker/tool-groups.js +1 -246
- package/dist/core/runtime/broker/turn-admission.js +1 -31
- package/dist/core/runtime/broker/turn-ignition.js +1 -84
- package/dist/core/runtime/broker-cli.js +3 -81
- package/dist/core/runtime/broker-extension-render.js +5 -135
- package/dist/core/runtime/broker-inventory.js +1 -116
- package/dist/core/runtime/broker-persona-guidance.js +4 -154
- package/dist/core/runtime/broker-protocol.js +3 -152
- package/dist/core/runtime/broker-request.js +1 -85
- package/dist/core/runtime/broker-sdk.js +1 -129
- package/dist/core/runtime/broker.js +1 -1214
- package/dist/core/runtime/canvas-extensions.js +1 -96
- package/dist/core/runtime/chat-inventory-rows.js +1 -105
- package/dist/core/runtime/close.js +1 -265
- package/dist/core/runtime/command-expansion.js +9 -104
- package/dist/core/runtime/command-surface.js +1 -117
- package/dist/core/runtime/connectivity.js +1 -73
- package/dist/core/runtime/deliver-live.js +1 -88
- package/dist/core/runtime/fault-recovery.js +1 -83
- package/dist/core/runtime/fault.js +1 -17
- package/dist/core/runtime/fleet.js +1 -58
- package/dist/core/runtime/front-door-env.js +1 -16
- package/dist/core/runtime/front-door.js +7 -183
- package/dist/core/runtime/headless-pi.js +1 -161
- package/dist/core/runtime/host.js +1 -457
- package/dist/core/runtime/interactive-deliver.js +1 -51
- package/dist/core/runtime/invocation.js +0 -10
- package/dist/core/runtime/kickoff.js +30 -327
- package/dist/core/runtime/launch-config-worker.js +1 -12
- package/dist/core/runtime/launch-prompt.js +4 -13
- package/dist/core/runtime/launch-target.js +1 -55
- package/dist/core/runtime/launch.js +1 -483
- package/dist/core/runtime/lifecycle.js +2 -213
- package/dist/core/runtime/managed-provider-cooling.js +1 -62
- package/dist/core/runtime/memory.js +1 -17
- package/dist/core/runtime/model-registry.js +1 -13
- package/dist/core/runtime/model-selection.js +1 -135
- package/dist/core/runtime/model-swap.js +1 -86
- package/dist/core/runtime/naming.js +14 -298
- package/dist/core/runtime/nerd-font.js +2 -127
- package/dist/core/runtime/node-read.js +2 -386
- package/dist/core/runtime/nodes.js +1 -331
- package/dist/core/runtime/outcome-document.js +1 -97
- package/dist/core/runtime/package-health.js +4 -99
- package/dist/core/runtime/persona.js +2 -55
- package/dist/core/runtime/pi-cli.js +1 -65
- package/dist/core/runtime/pi-vendored.js +1 -66
- package/dist/core/runtime/placement-tmux.js +1 -81
- package/dist/core/runtime/placement.js +1 -386
- package/dist/core/runtime/promote.js +1 -174
- package/dist/core/runtime/prospective-inventory-cli.js +3 -61
- package/dist/core/runtime/prospective-inventory.js +2 -88
- package/dist/core/runtime/recap.js +27 -103
- package/dist/core/runtime/recycle.js +1 -190
- package/dist/core/runtime/reopen.js +1 -138
- package/dist/core/runtime/reset.js +1 -245
- package/dist/core/runtime/resume-root.js +10 -290
- package/dist/core/runtime/revive-all.js +1 -107
- package/dist/core/runtime/revive.js +4 -544
- package/dist/core/runtime/roadmap.js +4 -38
- package/dist/core/runtime/session-branch.js +1 -46
- package/dist/core/runtime/session-cycles.js +1 -110
- package/dist/core/runtime/session-list-cache.js +1 -406
- package/dist/core/runtime/session-visibility.js +1 -99
- package/dist/core/runtime/shell-expansion.js +9 -100
- package/dist/core/runtime/situational-context.js +2 -67
- package/dist/core/runtime/situational-live.js +1 -41
- package/dist/core/runtime/spawn-env.js +1 -255
- package/dist/core/runtime/spawn.js +3 -577
- package/dist/core/runtime/stamp/channel.js +1 -76
- package/dist/core/runtime/stamp/protocol.js +1 -113
- package/dist/core/runtime/stop-guard.js +7 -116
- package/dist/core/runtime/stop-signals.js +1 -46
- package/dist/core/runtime/stream-watchdog.js +1 -134
- package/dist/core/runtime/structured-output.js +4 -156
- package/dist/core/runtime/surface-bg.js +1 -85
- package/dist/core/runtime/tmux-bindings.js +4 -730
- package/dist/core/runtime/tmux-chrome.js +1 -5
- package/dist/core/runtime/tmux-driver.js +7 -637
- package/dist/core/runtime/tool-group-summary.js +6 -85
- package/dist/core/runtime/turn-visibility.js +1 -31
- package/dist/core/runtime/view-socket.js +1 -83
- package/dist/core/runtime/warm-pool.js +1 -395
- package/dist/core/scope.js +1 -254
- package/dist/core/scoped-state/db.js +1 -135
- package/dist/core/scoped-state/migrate.js +3 -181
- package/dist/core/scoped-state/paths.js +1 -27
- package/dist/core/scoped-state/profiles.js +1 -62
- package/dist/core/scoped-state/providers.js +1 -8
- package/dist/core/scoped-state/schema.js +3 -16
- package/dist/core/scoped-state/settings.js +1 -82
- package/dist/core/secrets.js +2 -55
- package/dist/core/self-update.js +1 -71
- package/dist/core/session-model/session-state.js +1 -180
- package/dist/core/shell-segments.js +4 -169
- package/dist/core/spawn.js +1 -26
- package/dist/core/stdout-errors.js +1 -14
- package/dist/core/subscription-state.js +3 -193
- package/dist/core/substrate/frontmatter-validation.js +1 -105
- package/dist/core/substrate/gate-explain.js +1 -424
- package/dist/core/substrate/gate.js +1 -26
- package/dist/core/substrate/index.js +1 -30
- package/dist/core/substrate/injected-store.js +1 -249
- package/dist/core/substrate/listings.js +1 -115
- package/dist/core/substrate/on-read-node.js +1 -36
- package/dist/core/substrate/on-read.js +9 -315
- package/dist/core/substrate/plan.js +1 -266
- package/dist/core/substrate/render-node.js +1 -30
- package/dist/core/substrate/render.js +65 -689
- package/dist/core/substrate/schema.js +1 -186
- package/dist/core/substrate/session-cache.js +1 -83
- package/dist/core/substrate/subject-fields.js +1 -35
- package/dist/core/substrate/subject.js +1 -47
- package/dist/core/substrate/surface-match.js +1 -242
- package/dist/core/termrender/code-doc.js +5 -92
- package/dist/core/termrender/display.js +2 -56
- package/dist/core/termrender/termrender.js +14 -719
- package/dist/core/termrender/version.js +1 -1
- package/dist/core/timing.js +2 -94
- package/dist/core/tui/draw.js +2 -378
- package/dist/core/tui/fuzzy.js +1 -38
- package/dist/core/tui/markdown.js +3 -407
- package/dist/core/tui/page-host.js +1 -74
- package/dist/core/tui/panel.js +1 -137
- package/dist/core/tui/terminal.js +2 -100
- package/dist/core/user-settings.js +1 -454
- package/dist/core/wake.js +1 -296
- package/dist/core/worktree-close.js +6 -228
- package/dist/core/worktree-containment.js +3 -48
- package/dist/core/worktree-landing.js +4 -56
- package/dist/core/worktree-mutation-async.js +10 -280
- package/dist/core/worktree-quarantine.js +1 -54
- package/dist/core/worktree-sweep.js +6 -453
- package/dist/core/worktree.js +18 -899
- package/dist/daemon/api/bridge.js +8 -418
- package/dist/daemon/api/handlers/attach.js +1 -65
- package/dist/daemon/api/handlers/bash-jobs.js +2 -91
- package/dist/daemon/api/handlers/broker-ops.js +1 -447
- package/dist/daemon/api/handlers/broker-recovery.js +1 -251
- package/dist/daemon/api/handlers/canvas.js +6 -490
- package/dist/daemon/api/handlers/chat-inventory.js +1 -25
- package/dist/daemon/api/handlers/crons.js +1 -373
- package/dist/daemon/api/handlers/daemon.js +1 -76
- package/dist/daemon/api/handlers/feedback-comments.js +3 -199
- package/dist/daemon/api/handlers/files.js +1 -63
- package/dist/daemon/api/handlers/focus.js +1 -92
- package/dist/daemon/api/handlers/health.js +1 -76
- package/dist/daemon/api/handlers/human-requests.js +1 -379
- package/dist/daemon/api/handlers/human.js +1 -3
- package/dist/daemon/api/handlers/inbox-page.js +1 -89
- package/dist/daemon/api/handlers/inbox.js +1 -301
- package/dist/daemon/api/handlers/memory.js +1 -50
- package/dist/daemon/api/handlers/messages.js +2 -506
- package/dist/daemon/api/handlers/model-config.js +1 -44
- package/dist/daemon/api/handlers/modelauth.js +1 -165
- package/dist/daemon/api/handlers/node-outcomes.js +1 -181
- package/dist/daemon/api/handlers/nodes.js +1 -939
- package/dist/daemon/api/handlers/profiles.js +1 -140
- package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
- package/dist/daemon/api/handlers/reports.js +16 -332
- package/dist/daemon/api/handlers/review-comments.js +1 -465
- package/dist/daemon/api/handlers/reviews.js +1 -200
- package/dist/daemon/api/handlers/subscriptions.js +1 -53
- package/dist/daemon/api/handlers/validate.js +1 -58
- package/dist/daemon/api/handlers/worktree.js +1 -39
- package/dist/daemon/api/map.js +2 -735
- package/dist/daemon/api/router.js +1 -190
- package/dist/daemon/api/server.js +11 -408
- package/dist/daemon/boot-migrations.js +1 -31
- package/dist/daemon/companion-retire.js +1 -34
- package/dist/daemon/control.js +1 -22
- package/dist/daemon/cron/armed-context.js +1 -100
- package/dist/daemon/cron/capture.js +2 -45
- package/dist/daemon/cron/disposition.js +1 -55
- package/dist/daemon/cron/escalation.js +3 -124
- package/dist/daemon/cron/held.js +1 -20
- package/dist/daemon/cron/lease-recovery.js +1 -119
- package/dist/daemon/cron/live-runs.js +1 -23
- package/dist/daemon/cron/passes.js +1 -58
- package/dist/daemon/cron/settle.js +1 -61
- package/dist/daemon/cron/sinks.js +2 -59
- package/dist/daemon/cron-run.js +1 -405
- package/dist/daemon/crtrd-cli.js +1 -23
- package/dist/daemon/crtrd.js +8 -854
- package/dist/daemon/delivery/run-delivery.js +1 -164
- package/dist/daemon/fleet.js +17 -475
- package/dist/daemon/human/finish.js +10 -179
- package/dist/daemon/human/settle.js +1 -89
- package/dist/daemon/human/sweep.js +1 -66
- package/dist/daemon/manage.js +2 -595
- package/dist/daemon/messaging/node-message.js +1 -99
- package/dist/daemon/park-activity.js +1 -30
- package/dist/daemon/park-pending.js +1 -52
- package/dist/daemon/pidfile.js +1 -37
- package/dist/daemon/profile-delete.js +1 -306
- package/dist/daemon/reconcilers/bash-deadline.js +1 -80
- package/dist/daemon/reconcilers/broker-supervision.js +4 -761
- package/dist/daemon/reconcilers/controller-death.js +1 -14
- package/dist/daemon/reconcilers/cron-lane.js +1 -29
- package/dist/daemon/reconcilers/delivery-lane.js +1 -130
- package/dist/daemon/reconcilers/live-obligation.js +1 -87
- package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
- package/dist/daemon/reconcilers/node-deadline.js +1 -82
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
- package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
- package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
- package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
- package/dist/daemon/review/comment-notify.js +2 -109
- package/dist/daemon/review/companion.js +1 -29
- package/dist/daemon/review/deliver.js +3 -8
- package/dist/daemon/review/finish.js +1 -122
- package/dist/daemon/review/sweep.js +1 -18
- package/dist/daemon/startup-policy.js +1 -1
- package/dist/daemon/supervise-cadence.js +1 -6
- package/dist/hook-authoring.js +5 -447
- package/dist/hook-process.js +1 -34
- package/dist/index.js +1 -52
- package/dist/migrations/001-surfaces-frontmatter.js +1 -161
- package/dist/migrations/002-profile-project-memory.js +1 -72
- package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
- package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
- package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
- package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
- package/dist/migrations/activation.js +2 -89
- package/dist/migrations/convergent.js +2 -82
- package/dist/migrations/corpus.js +3 -483
- package/dist/migrations/frontmatter-splice.js +8 -176
- package/dist/migrations/profile-manifests.js +2 -70
- package/dist/migrations/registry.js +1 -42
- package/dist/migrations/runner.js +1 -85
- package/dist/migrations/types.js +0 -24
- package/dist/pi-extensions/broker-local.js +2 -106
- package/dist/pi-extensions/canvas-bash-valve.js +7 -461
- package/dist/pi-extensions/canvas-context-intro.js +2 -113
- package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
- package/dist/pi-extensions/canvas-goal-capture.js +1 -83
- package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
- package/dist/pi-extensions/canvas-passive-context.js +14 -203
- package/dist/pi-extensions/canvas-preview-result.js +2 -72
- package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
- package/dist/pi-extensions/canvas-recap.js +11 -405
- package/dist/pi-extensions/canvas-review-boundary.js +3 -63
- package/dist/pi-extensions/canvas-stamp.js +2 -77
- package/dist/pi-extensions/canvas-stophook.js +1 -643
- package/dist/pi-extensions/canvas-structured-output.js +13 -35
- package/dist/pi-extensions/canvas-tool-guide.js +9 -78
- package/dist/pi-extensions/envelope-merge.js +8 -29
- package/dist/prompts/review.js +20 -42
- package/dist/shared/birth-announcement.js +1 -25
- package/dist/shared/crtr-version.js +1 -18
- package/dist/shared/env.js +1 -214
- package/dist/shared/generated-context.js +11 -226
- package/dist/shared/predicates.js +1 -4
- package/dist/shared/shell-quote.js +1 -5
- package/dist/shared/tool-groups.js +1 -64
- package/dist/shared/working-activity.js +1 -27
- package/dist/suppress-experimental-warnings.js +1 -15
- package/dist/types.js +1 -185
- package/docs/public-api.md +10 -9
- package/package.json +6 -4
- package/runtime.lock.json +5 -5
- package/scripts/pack-minify.mjs +108 -0
- package/dist/api/__tests__/integration/client.test.d.ts +0 -1
- package/dist/api/__tests__/integration/client.test.js +0 -163
- package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
- package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
- package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
- package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
- package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
- package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/context-message.test.js +0 -130
- package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
- package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/diagram.test.js +0 -42
- package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
- package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
- package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
- package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
- package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
- package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
- package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
- package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
- package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
- package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
- package/dist/commands/__tests__/human.test.d.ts +0 -1
- package/dist/commands/__tests__/human.test.js +0 -172
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
- package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
- package/dist/commands/__tests__/node-message.test.d.ts +0 -1
- package/dist/commands/__tests__/node-message.test.js +0 -112
- package/dist/commands/__tests__/node-new.test.d.ts +0 -1
- package/dist/commands/__tests__/node-new.test.js +0 -58
- package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
- package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
- package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
- package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
- package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
- package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
- package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
- package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
- package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
- package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
- package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
- package/dist/core/__tests__/bash-guard.test.js +0 -190
- package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
- package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
- package/dist/core/__tests__/boot.test.d.ts +0 -1
- package/dist/core/__tests__/boot.test.js +0 -274
- package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
- package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
- package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
- package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
- package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
- package/dist/core/__tests__/broker-preflight.test.js +0 -95
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
- package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
- package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
- package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
- package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
- package/dist/core/__tests__/canvas.test.d.ts +0 -1
- package/dist/core/__tests__/canvas.test.js +0 -138
- package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
- package/dist/core/__tests__/child-death-wake.test.js +0 -153
- package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
- package/dist/core/__tests__/cli-help-contract.test.js +0 -152
- package/dist/core/__tests__/close.test.d.ts +0 -1
- package/dist/core/__tests__/close.test.js +0 -284
- package/dist/core/__tests__/collectible.test.d.ts +0 -1
- package/dist/core/__tests__/collectible.test.js +0 -89
- package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
- package/dist/core/__tests__/config-change-delta.test.js +0 -108
- package/dist/core/__tests__/context-intro.test.d.ts +0 -1
- package/dist/core/__tests__/context-intro.test.js +0 -123
- package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
- package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
- package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
- package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
- package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
- package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
- package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
- package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
- package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-boot.test.js +0 -422
- package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-wedge.test.js +0 -106
- package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
- package/dist/core/__tests__/events-contract.test.d.ts +0 -1
- package/dist/core/__tests__/events-contract.test.js +0 -76
- package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
- package/dist/core/__tests__/extension-abort.test.js +0 -21
- package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
- package/dist/core/__tests__/fault-classifier.test.js +0 -138
- package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
- package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
- package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
- package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
- package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
- package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
- package/dist/core/__tests__/focuses.test.d.ts +0 -1
- package/dist/core/__tests__/focuses.test.js +0 -113
- package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
- package/dist/core/__tests__/fs-utils.test.js +0 -50
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
- package/dist/core/__tests__/helpers/broker-clients.js +0 -174
- package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
- package/dist/core/__tests__/helpers/fleet.js +0 -50
- package/dist/core/__tests__/helpers/harness.d.ts +0 -124
- package/dist/core/__tests__/helpers/harness.js +0 -806
- package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
- package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
- package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
- package/dist/core/__tests__/history-inbox.test.js +0 -121
- package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/human-action-delivery.test.js +0 -162
- package/dist/core/__tests__/human-actions.test.d.ts +0 -1
- package/dist/core/__tests__/human-actions.test.js +0 -120
- package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
- package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
- package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
- package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
- package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
- package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
- package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
- package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
- package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
- package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
- package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
- package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
- package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
- package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
- package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
- package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
- package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
- package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
- package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
- package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
- package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
- package/dist/core/__tests__/integration/revive.test.js +0 -615
- package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
- package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
- package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
- package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
- package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
- package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
- package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
- package/dist/core/__tests__/kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/kickoff.test.js +0 -196
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
- package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle.test.js +0 -176
- package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
- package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
- package/dist/core/__tests__/migration.test.d.ts +0 -1
- package/dist/core/__tests__/migration.test.js +0 -946
- package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
- package/dist/core/__tests__/model-pin-durability.test.js +0 -195
- package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes-config.test.js +0 -150
- package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
- package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
- package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
- package/dist/core/__tests__/node-outcome.test.js +0 -246
- package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
- package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
- package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
- package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
- package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
- package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
- package/dist/core/__tests__/passive-subscription.test.js +0 -120
- package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
- package/dist/core/__tests__/pid-identity-match.test.js +0 -145
- package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
- package/dist/core/__tests__/pid-zombie.test.js +0 -42
- package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-kinds.test.js +0 -182
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
- package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-page-components.test.js +0 -159
- package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
- package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
- package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
- package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
- package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
- package/dist/core/__tests__/prune.test.d.ts +0 -1
- package/dist/core/__tests__/prune.test.js +0 -243
- package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
- package/dist/core/__tests__/push-final-guard.test.js +0 -191
- package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
- package/dist/core/__tests__/relaunch-root.test.js +0 -249
- package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
- package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
- package/dist/core/__tests__/repository-association.test.d.ts +0 -1
- package/dist/core/__tests__/repository-association.test.js +0 -153
- package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
- package/dist/core/__tests__/repository-root-identity.test.js +0 -223
- package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
- package/dist/core/__tests__/respawn-throttle.test.js +0 -20
- package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -83
- package/dist/core/__tests__/revive-all.test.d.ts +0 -1
- package/dist/core/__tests__/revive-all.test.js +0 -157
- package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
- package/dist/core/__tests__/revive-capacity.test.js +0 -184
- package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
- package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
- package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
- package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
- package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
- package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
- package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
- package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
- package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
- package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
- package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
- package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
- package/dist/core/__tests__/secrets.test.d.ts +0 -1
- package/dist/core/__tests__/secrets.test.js +0 -49
- package/dist/core/__tests__/self-update.test.d.ts +0 -1
- package/dist/core/__tests__/self-update.test.js +0 -46
- package/dist/core/__tests__/session-branch.test.d.ts +0 -1
- package/dist/core/__tests__/session-branch.test.js +0 -61
- package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
- package/dist/core/__tests__/session-cycles.test.js +0 -133
- package/dist/core/__tests__/session-model.test.d.ts +0 -1
- package/dist/core/__tests__/session-model.test.js +0 -111
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
- package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
- package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
- package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
- package/dist/core/__tests__/stdout-errors.test.js +0 -16
- package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
- package/dist/core/__tests__/stop-guard.test.js +0 -237
- package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
- package/dist/core/__tests__/stream-watchdog.test.js +0 -154
- package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
- package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
- package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
- package/dist/core/__tests__/worktree-landing.test.js +0 -11
- package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
- package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
- package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
- package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
- package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/attention.test.js +0 -83
- package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
- package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
- package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/session-window.test.js +0 -70
- package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
- package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
- package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-catalog.test.js +0 -20
- package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
- package/dist/core/human/__tests__/page.test.d.ts +0 -1
- package/dist/core/human/__tests__/page.test.js +0 -92
- package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
- package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/env-store.test.js +0 -99
- package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
- package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
- package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
- package/dist/core/review/__tests__/capture-origin.test.js +0 -150
- package/dist/core/review/__tests__/comments.test.d.ts +0 -1
- package/dist/core/review/__tests__/comments.test.js +0 -116
- package/dist/core/review/__tests__/remap.test.d.ts +0 -1
- package/dist/core/review/__tests__/remap.test.js +0 -177
- package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
- package/dist/core/review/__tests__/stage-identity.test.js +0 -150
- package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
- package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/node-env.test.js +0 -73
- package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
- package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
- package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
- package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
- package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
- package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
- package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
- package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
- package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
- package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
- package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
- package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
- package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
- package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
- package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
- package/dist/daemon/__tests__/thaw-order.test.js +0 -55
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
- package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
- package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
- package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/model-config.test.js +0 -73
- package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-create-description.test.js +0 -127
- package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
- package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
- package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
- package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
- package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
- package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
- package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
- package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
- package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
- package/dist/migrations/__tests__/activation.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation.test.js +0 -152
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
- package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
- package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
- package/dist/shared/__tests__/env-boundary.test.js +0 -95
- package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
- package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
- package/docs/compat/hearth-crtr-v1.md +0 -179
- package/docs/compat/hearth-crtr-v2.md +0 -177
- package/docs/compat/hearth-crtr-v3.md +0 -176
- package/docs/compat/hearth-crtr-v4.md +0 -182
- package/docs/compat/hearth-crtr-v5.md +0 -169
|
@@ -1,710 +0,0 @@
|
|
|
1
|
-
// Tests for the canvas-node inbox watcher pi extension, part 2 — the
|
|
2
|
-
// refresh-yield HOLD path and idle delivery. Split out of
|
|
3
|
-
// canvas-inbox-watcher.test.ts (see its header) so node:test's file-level
|
|
4
|
-
// parallelism applies; the tests and the scaffold are moved here UNCHANGED.
|
|
5
|
-
//
|
|
6
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/canvas-inbox-watcher-hold.test.ts
|
|
7
|
-
import { test, describe, before, after, afterEach } from 'node:test';
|
|
8
|
-
import assert from 'node:assert/strict';
|
|
9
|
-
import { mkdirSync, rmSync } from 'node:fs';
|
|
10
|
-
import { tmpdir } from 'node:os';
|
|
11
|
-
import { join } from 'node:path';
|
|
12
|
-
import registerCanvasInboxWatcher from '../../pi-extensions/canvas-inbox-watcher.js';
|
|
13
|
-
import { acknowledgedNodeMailCount, resetStaleExecutionMail } from '../canvas/deliveries.js';
|
|
14
|
-
import { beginExecution } from '../canvas/executions.js';
|
|
15
|
-
import { enqueueNodeMail } from '../feed/messages.js';
|
|
16
|
-
import { drainBearings } from '../runtime/kickoff.js';
|
|
17
|
-
import { appendSituationalContext } from '../runtime/situational-context.js';
|
|
18
|
-
import { createEngineDriver } from '../runtime/broker/engine-drive.js';
|
|
19
|
-
import { createTurnAdmissionGate } from '../runtime/broker/turn-admission.js';
|
|
20
|
-
import { BROKER_IDLE_TURN_START, heldDeferredInboxPromptJoin, } from '../runtime/broker/held-deferred-inbox.js';
|
|
21
|
-
import { createNode, getNode, setIntent } from '../canvas/canvas.js';
|
|
22
|
-
import { createProfile, pauseProfile, resumeProfile } from '../profiles/manifest.js';
|
|
23
|
-
import { closeDb, migrate, openDb } from '../canvas/db.js';
|
|
24
|
-
import { closeScopedStores } from '../scoped-state/db.js';
|
|
25
|
-
import { initializeFreshScopedStore } from '../scoped-state/migrate.js';
|
|
26
|
-
import { resetScopeCache } from '../scope.js';
|
|
27
|
-
import { createApiServer } from '../../daemon/api/server.js';
|
|
28
|
-
// Drive the watcher's injectable cadence seam (CRTR_WATCHER_TICK_MS /
|
|
29
|
-
// CRTR_WATCHER_DEBOUNCE_MS) at a fast tempo so the test sleeps milliseconds, not
|
|
30
|
-
// seconds. SETTLE_MS still allows a resolve+seed tick, a read tick, and the
|
|
31
|
-
// debounce window before asserting, exactly as against the real 800/1000 cadence.
|
|
32
|
-
const TICK_MS = 20;
|
|
33
|
-
const DEBOUNCE_MS = 25;
|
|
34
|
-
const SETTLE_MS = TICK_MS * 2 + DEBOUNCE_MS + 200;
|
|
35
|
-
let origHome;
|
|
36
|
-
let origUserHome;
|
|
37
|
-
let origNode;
|
|
38
|
-
let origExecution;
|
|
39
|
-
const homes = [];
|
|
40
|
-
const disposers = [];
|
|
41
|
-
let server;
|
|
42
|
-
/** Bind each case to isolated canvas and user SQL state. */
|
|
43
|
-
function freshNode(nodeId) {
|
|
44
|
-
closeDb();
|
|
45
|
-
closeScopedStores();
|
|
46
|
-
resetScopeCache();
|
|
47
|
-
const root = join(tmpdir(), `crtr-w-${Math.random().toString(36).slice(2, 8)}`);
|
|
48
|
-
const home = join(root, 'home');
|
|
49
|
-
const canvas = join(root, 'canvas');
|
|
50
|
-
mkdirSync(home, { recursive: true });
|
|
51
|
-
mkdirSync(canvas, { recursive: true });
|
|
52
|
-
homes.push(root);
|
|
53
|
-
process.env['HOME'] = home;
|
|
54
|
-
process.env['CRTR_HOME'] = canvas;
|
|
55
|
-
process.env['CRTR_NODE_ID'] = nodeId;
|
|
56
|
-
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
57
|
-
migrate(openDb());
|
|
58
|
-
server = createApiServer();
|
|
59
|
-
}
|
|
60
|
-
function makeFakePi() {
|
|
61
|
-
const handlers = {};
|
|
62
|
-
let resolveFirstInjection;
|
|
63
|
-
const firstInjection = new Promise((resolve) => { resolveFirstInjection = resolve; });
|
|
64
|
-
const pi = {
|
|
65
|
-
injected: [],
|
|
66
|
-
firstInjection,
|
|
67
|
-
sentMessages: [],
|
|
68
|
-
on(e, h) { handlers[e] = h; },
|
|
69
|
-
sendUserMessage(content, options) {
|
|
70
|
-
this.injected.push({ content, deliverAs: options?.deliverAs });
|
|
71
|
-
resolveFirstInjection?.();
|
|
72
|
-
},
|
|
73
|
-
sendMessage(message) { this.sentMessages.push(message); },
|
|
74
|
-
async fire(e, ev, ctx) { await handlers[e]?.(ev, ctx); },
|
|
75
|
-
};
|
|
76
|
-
globalThis[BROKER_IDLE_TURN_START] = (content) => pi.sendUserMessage(content);
|
|
77
|
-
return pi;
|
|
78
|
-
}
|
|
79
|
-
// Fire agent_settled — the authoritative durable-commit boundary in the
|
|
80
|
-
// at-least-once model. `pending` maps to pi's `hasPendingMessages()` and is
|
|
81
|
-
// passed through unused by the commit path: agent_settled commits
|
|
82
|
-
// unconditionally regardless of queue state, so `pending: true` exercises that
|
|
83
|
-
// the commit still lands rather than being vetoed. See `shutdown()` below for
|
|
84
|
-
// the one boundary where `hasPendingMessages()` still gates a commit.
|
|
85
|
-
async function settle(pi, opts = {}) {
|
|
86
|
-
const pending = opts.pending === true;
|
|
87
|
-
const idle = opts.idle ?? true;
|
|
88
|
-
await pi.fire('agent_settled', { type: 'agent_settled' }, { isIdle: () => idle, hasPendingMessages: () => pending });
|
|
89
|
-
}
|
|
90
|
-
// Fire session_shutdown — pi's graceful-teardown safety net for a settle that
|
|
91
|
-
// never fired before exit. The real handler takes NO event ctx of its own; it
|
|
92
|
-
// reads the module's captured `lastCtx`, last set by whichever named event
|
|
93
|
-
// fired most recently (session_start/turn_end/agent_start/agent_end/
|
|
94
|
-
// agent_settled — see captureCtx call sites). A session_shutdown with no prior
|
|
95
|
-
// settle is naturally preceded by an agent_end (the failure/abort path), so
|
|
96
|
-
// this fires that first to seed `lastCtx` before firing session_shutdown
|
|
97
|
-
// itself. `pending` maps to pi's `hasPendingMessages()`: true exercises the
|
|
98
|
-
// retained HOLD (an unconsumed queued send would die with the process, so the
|
|
99
|
-
// commit is declined); false (default) commits normally.
|
|
100
|
-
async function shutdown(pi, opts = {}) {
|
|
101
|
-
const pending = opts.pending === true;
|
|
102
|
-
await pi.fire('agent_end', { type: 'agent_end', messages: [] }, { isIdle: () => false, hasPendingMessages: () => pending });
|
|
103
|
-
await pi.fire('session_shutdown', {}, undefined);
|
|
104
|
-
}
|
|
105
|
-
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
106
|
-
async function waitForFirstInjection(pi, timeoutMs = 2_000) {
|
|
107
|
-
const timeout = new Promise((_, reject) => {
|
|
108
|
-
const timer = setTimeout(() => reject(new Error('watcher did not inject the inbox handoff')), timeoutMs);
|
|
109
|
-
timer.unref();
|
|
110
|
-
});
|
|
111
|
-
await Promise.race([pi.firstInjection, timeout]);
|
|
112
|
-
}
|
|
113
|
-
// Register the watcher, then fire session_start — the real lifecycle gate
|
|
114
|
-
// that arms its poll interval and initial tick (see canvas-inbox-watcher.ts).
|
|
115
|
-
// registerCanvasInboxWatcher() alone only wires up handlers; without this the
|
|
116
|
-
// watcher never polls or sends anything.
|
|
117
|
-
function ensureWatcherNode() {
|
|
118
|
-
const nodeId = process.env['CRTR_NODE_ID'];
|
|
119
|
-
if (nodeId === undefined || getNode(nodeId) !== null)
|
|
120
|
-
return;
|
|
121
|
-
createNode({
|
|
122
|
-
node_id: nodeId,
|
|
123
|
-
name: nodeId,
|
|
124
|
-
created: new Date().toISOString(),
|
|
125
|
-
cwd: '/tmp',
|
|
126
|
-
kind: 'general',
|
|
127
|
-
mode: 'base',
|
|
128
|
-
lifecycle: 'resident',
|
|
129
|
-
status: 'active',
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
function publishMail(nodeId, input) {
|
|
133
|
-
const priorNode = process.env['CRTR_NODE_ID'];
|
|
134
|
-
process.env['CRTR_NODE_ID'] = nodeId;
|
|
135
|
-
ensureWatcherNode();
|
|
136
|
-
if (priorNode === undefined)
|
|
137
|
-
delete process.env['CRTR_NODE_ID'];
|
|
138
|
-
else
|
|
139
|
-
process.env['CRTR_NODE_ID'] = priorNode;
|
|
140
|
-
return enqueueNodeMail(nodeId, {
|
|
141
|
-
kind: input.kind,
|
|
142
|
-
label: input.label,
|
|
143
|
-
senderNodeId: input.from,
|
|
144
|
-
bodyRef: input.ref,
|
|
145
|
-
bodyJson: input.data,
|
|
146
|
-
disposition: input.disposition,
|
|
147
|
-
urgency: input.tier,
|
|
148
|
-
wake: 1,
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
function startWatcherExecution(nodeId) {
|
|
152
|
-
process.env['CRTR_EXECUTION_ID'] = beginExecution(nodeId, { daemonEpoch: 'test' });
|
|
153
|
-
resetStaleExecutionMail(Date.now());
|
|
154
|
-
}
|
|
155
|
-
function registerWatcher(pi) {
|
|
156
|
-
ensureWatcherNode();
|
|
157
|
-
const nodeId = process.env['CRTR_NODE_ID'];
|
|
158
|
-
startWatcherExecution(nodeId);
|
|
159
|
-
const dispose = registerCanvasInboxWatcher(pi);
|
|
160
|
-
void server.ready.then(() => pi.fire('session_start', { type: 'session_start' }, undefined));
|
|
161
|
-
return dispose;
|
|
162
|
-
}
|
|
163
|
-
let origTick;
|
|
164
|
-
let origDebounce;
|
|
165
|
-
before(() => {
|
|
166
|
-
origHome = process.env['CRTR_HOME'];
|
|
167
|
-
origUserHome = process.env['HOME'];
|
|
168
|
-
origNode = process.env['CRTR_NODE_ID'];
|
|
169
|
-
origExecution = process.env['CRTR_EXECUTION_ID'];
|
|
170
|
-
origTick = process.env['CRTR_WATCHER_TICK_MS'];
|
|
171
|
-
origDebounce = process.env['CRTR_WATCHER_DEBOUNCE_MS'];
|
|
172
|
-
process.env['CRTR_WATCHER_TICK_MS'] = String(TICK_MS);
|
|
173
|
-
process.env['CRTR_WATCHER_DEBOUNCE_MS'] = String(DEBOUNCE_MS);
|
|
174
|
-
});
|
|
175
|
-
afterEach(async () => {
|
|
176
|
-
while (disposers.length > 0)
|
|
177
|
-
disposers.pop()();
|
|
178
|
-
await server?.close();
|
|
179
|
-
server = undefined;
|
|
180
|
-
closeDb();
|
|
181
|
-
closeScopedStores();
|
|
182
|
-
resetScopeCache();
|
|
183
|
-
});
|
|
184
|
-
after(() => {
|
|
185
|
-
if (origHome === undefined)
|
|
186
|
-
delete process.env['CRTR_HOME'];
|
|
187
|
-
else
|
|
188
|
-
process.env['CRTR_HOME'] = origHome;
|
|
189
|
-
if (origUserHome === undefined)
|
|
190
|
-
delete process.env['HOME'];
|
|
191
|
-
else
|
|
192
|
-
process.env['HOME'] = origUserHome;
|
|
193
|
-
if (origNode === undefined)
|
|
194
|
-
delete process.env['CRTR_NODE_ID'];
|
|
195
|
-
else
|
|
196
|
-
process.env['CRTR_NODE_ID'] = origNode;
|
|
197
|
-
if (origExecution === undefined)
|
|
198
|
-
delete process.env['CRTR_EXECUTION_ID'];
|
|
199
|
-
else
|
|
200
|
-
process.env['CRTR_EXECUTION_ID'] = origExecution;
|
|
201
|
-
if (origTick === undefined)
|
|
202
|
-
delete process.env['CRTR_WATCHER_TICK_MS'];
|
|
203
|
-
else
|
|
204
|
-
process.env['CRTR_WATCHER_TICK_MS'] = origTick;
|
|
205
|
-
if (origDebounce === undefined)
|
|
206
|
-
delete process.env['CRTR_WATCHER_DEBOUNCE_MS'];
|
|
207
|
-
else
|
|
208
|
-
process.env['CRTR_WATCHER_DEBOUNCE_MS'] = origDebounce;
|
|
209
|
-
resetScopeCache();
|
|
210
|
-
for (const h of homes) {
|
|
211
|
-
try {
|
|
212
|
-
rmSync(h, { recursive: true, force: true });
|
|
213
|
-
}
|
|
214
|
-
catch { /* noop */ }
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
describe('canvas inbox watcher — hold + idle delivery', () => {
|
|
218
|
-
test('refresh-yield in flight: a handoff remains uncommitted for the replacement conversation', async () => {
|
|
219
|
-
freshNode('node-refresh');
|
|
220
|
-
closeDb(); // rebind the canvas db to this test's fresh home
|
|
221
|
-
const meta = {
|
|
222
|
-
node_id: 'node-refresh', name: 'r', created: new Date().toISOString(),
|
|
223
|
-
cwd: '/tmp', kind: 'general', mode: 'base', lifecycle: 'resident',
|
|
224
|
-
status: 'active',
|
|
225
|
-
};
|
|
226
|
-
createNode(meta);
|
|
227
|
-
const pi = makeFakePi();
|
|
228
|
-
disposers.push(registerWatcher(pi));
|
|
229
|
-
// Streaming (mid-turn) when a child finishes — normally this would steer.
|
|
230
|
-
pi.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
231
|
-
await wait(TICK_MS + 100);
|
|
232
|
-
publishMail('node-refresh', { from: 'child-x', tier: 'urgent', kind: 'final', label: 'done' });
|
|
233
|
-
await waitForFirstInjection(pi);
|
|
234
|
-
assert.equal(pi.injected.length, 1, 'the live broker receives the handoff before its delivery receipt');
|
|
235
|
-
// The delivery receipt decides the refresh hold; clearing intent does not
|
|
236
|
-
// manufacture a second handoff.
|
|
237
|
-
setIntent('node-refresh', 'refresh');
|
|
238
|
-
setIntent('node-refresh', null);
|
|
239
|
-
await wait(SETTLE_MS);
|
|
240
|
-
assert.equal(pi.injected.length, 1, 'the same handoff is not delivered twice');
|
|
241
|
-
});
|
|
242
|
-
test('refresh-yield replays a handoff that reached the discarded conversation', async () => {
|
|
243
|
-
freshNode('node-refresh-handoff');
|
|
244
|
-
closeDb();
|
|
245
|
-
const meta = {
|
|
246
|
-
node_id: 'node-refresh-handoff', name: 'r', created: new Date().toISOString(),
|
|
247
|
-
cwd: '/tmp', kind: 'general', mode: 'base', lifecycle: 'resident',
|
|
248
|
-
status: 'active',
|
|
249
|
-
};
|
|
250
|
-
createNode(meta);
|
|
251
|
-
const pi = makeFakePi();
|
|
252
|
-
disposers.push(registerWatcher(pi));
|
|
253
|
-
pi.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
254
|
-
await wait(TICK_MS + 100);
|
|
255
|
-
publishMail(meta.node_id, { from: 'child-x', tier: 'normal', kind: 'update', label: 'handoff at yield' });
|
|
256
|
-
await waitForFirstInjection(pi);
|
|
257
|
-
assert.equal(pi.injected.length, 1, 'the active conversation received the handoff before yield');
|
|
258
|
-
// Yield discards that conversation before it can act on the queued handoff.
|
|
259
|
-
// Its settle must leave the entry durable for the fresh revive's kickoff.
|
|
260
|
-
setIntent(meta.node_id, 'refresh');
|
|
261
|
-
await settle(pi);
|
|
262
|
-
assert.equal(acknowledgedNodeMailCount(meta.node_id), 0, 'the discarded conversation cannot commit its inbox handoff');
|
|
263
|
-
const replacementExecution = beginExecution(meta.node_id, { daemonEpoch: 'test' });
|
|
264
|
-
resetStaleExecutionMail(Date.now());
|
|
265
|
-
const bearings = drainBearings(getNode(meta.node_id), replacementExecution);
|
|
266
|
-
assert.match(bearings.unreadDigest ?? '', /handoff at yield/, 'the fresh revive receives the uncommitted handoff');
|
|
267
|
-
});
|
|
268
|
-
test('idle: a finished node triggers a fresh turn (no deliverAs)', async () => {
|
|
269
|
-
freshNode('node-idle');
|
|
270
|
-
const pi = makeFakePi();
|
|
271
|
-
disposers.push(registerWatcher(pi));
|
|
272
|
-
// No agent_start fired → watcher treats the node as idle.
|
|
273
|
-
await wait(TICK_MS + 100);
|
|
274
|
-
publishMail('node-idle', { from: 'child-3', tier: 'normal', kind: 'final', label: 'done while idle' });
|
|
275
|
-
await waitForFirstInjection(pi);
|
|
276
|
-
assert.equal(pi.injected.length, 1);
|
|
277
|
-
assert.equal(pi.injected[0].deliverAs, undefined, 'idle → sendUserMessage triggers a turn, no deliverAs');
|
|
278
|
-
});
|
|
279
|
-
test('the broker prompt boundary prepends held deferred mail before the human body', async () => {
|
|
280
|
-
freshNode('node-deferred-engine-prompt');
|
|
281
|
-
const pi = makeFakePi();
|
|
282
|
-
disposers.push(registerWatcher(pi));
|
|
283
|
-
await wait(TICK_MS + 100);
|
|
284
|
-
const entry = publishMail('node-deferred-engine-prompt', {
|
|
285
|
-
from: 'child-4',
|
|
286
|
-
tier: 'deferred',
|
|
287
|
-
kind: 'update',
|
|
288
|
-
label: 'held update',
|
|
289
|
-
});
|
|
290
|
-
await wait(SETTLE_MS);
|
|
291
|
-
const order = [];
|
|
292
|
-
const session = {
|
|
293
|
-
isStreaming: false,
|
|
294
|
-
sendCustomMessage: async ({ content }) => { order.push(content); },
|
|
295
|
-
prompt: async (text, options) => {
|
|
296
|
-
order.push(text);
|
|
297
|
-
options.preflightResult?.(true);
|
|
298
|
-
},
|
|
299
|
-
};
|
|
300
|
-
const drive = createEngineDriver({
|
|
301
|
-
registry: { sendFrame: () => undefined, broadcast: () => undefined },
|
|
302
|
-
replies: {},
|
|
303
|
-
session: () => session,
|
|
304
|
-
dispatches: { track: (promise) => promise },
|
|
305
|
-
memoryRefs: { guidanceFor: () => null },
|
|
306
|
-
authReloadGate: { inFlight: () => undefined },
|
|
307
|
-
rebind: { installedGeneration: () => 0 },
|
|
308
|
-
projection: {},
|
|
309
|
-
toolGroups: {},
|
|
310
|
-
turnAdmission: createTurnAdmissionGate(),
|
|
311
|
-
});
|
|
312
|
-
await drive({}, { type: 'prompt', text: 'where are we?' });
|
|
313
|
-
assert.equal(order.length, 2, 'one held card and the one human prompt share the admitted operation');
|
|
314
|
-
assert.match(order[0], /held update/, 'the held inbox card is first');
|
|
315
|
-
assert.equal(order[1], 'where are we?', 'the human body follows the held card');
|
|
316
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-engine-prompt'), 0, 'the joined handoff waits for settlement');
|
|
317
|
-
await pi.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
318
|
-
await settle(pi);
|
|
319
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-engine-prompt'), 1, 'agent_settled commits the broker-joined handoff');
|
|
320
|
-
const staleFollowUpEntry = publishMail('node-deferred-engine-prompt', {
|
|
321
|
-
from: 'child-4',
|
|
322
|
-
tier: 'deferred',
|
|
323
|
-
kind: 'update',
|
|
324
|
-
label: 'held after a stale client snapshot',
|
|
325
|
-
});
|
|
326
|
-
await wait(SETTLE_MS);
|
|
327
|
-
const beforeFollowUp = order.length;
|
|
328
|
-
await drive({}, { type: 'follow_up', text: 'continue from there' });
|
|
329
|
-
assert.equal(order.length, beforeFollowUp + 2, 'an idle-routed follow_up shares the same prompt boundary');
|
|
330
|
-
assert.match(order.at(-2), /held after a stale client snapshot/, 'the held card still precedes the stale follow_up body');
|
|
331
|
-
assert.equal(order.at(-1), 'continue from there');
|
|
332
|
-
await pi.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
333
|
-
await settle(pi);
|
|
334
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-engine-prompt'), 2, 'the follow-up prompt settles its joined handoff too');
|
|
335
|
-
});
|
|
336
|
-
test('a held deferred batch is prepended to an admitted human prompt and replays if that prompt reloads before settlement', async () => {
|
|
337
|
-
freshNode('node-deferred-human-prompt');
|
|
338
|
-
const pi = makeFakePi();
|
|
339
|
-
disposers.push(registerWatcher(pi));
|
|
340
|
-
await wait(TICK_MS + 100);
|
|
341
|
-
const entry = publishMail('node-deferred-human-prompt', {
|
|
342
|
-
from: 'child-4',
|
|
343
|
-
tier: 'deferred',
|
|
344
|
-
kind: 'update',
|
|
345
|
-
label: 'held update',
|
|
346
|
-
});
|
|
347
|
-
await wait(SETTLE_MS);
|
|
348
|
-
assert.equal(pi.injected.length, 0, 'deferred-only mail remains held while no turn starts');
|
|
349
|
-
const firstPromptPrefix = [];
|
|
350
|
-
await heldDeferredInboxPromptJoin()?.({
|
|
351
|
-
sendCustomMessage: async ({ content }) => { firstPromptPrefix.push(content); },
|
|
352
|
-
});
|
|
353
|
-
assert.equal(firstPromptPrefix.length, 1, 'the held card is sent before the human prompt starts');
|
|
354
|
-
assert.match(firstPromptPrefix[0], /held update/);
|
|
355
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-human-prompt'), 0, 'the pre-prompt handoff is not committed');
|
|
356
|
-
await shutdown(pi);
|
|
357
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-human-prompt'), 0, 'a reload before agent_settled leaves the held entry replayable');
|
|
358
|
-
const replacement = makeFakePi();
|
|
359
|
-
disposers.push(registerWatcher(replacement));
|
|
360
|
-
await wait(SETTLE_MS);
|
|
361
|
-
const replayedPrefix = [];
|
|
362
|
-
await heldDeferredInboxPromptJoin()?.({
|
|
363
|
-
sendCustomMessage: async ({ content }) => { replayedPrefix.push(content); },
|
|
364
|
-
});
|
|
365
|
-
assert.equal(replayedPrefix.length, 1, 'the replacement prompt receives the uncommitted held card again');
|
|
366
|
-
assert.match(replayedPrefix[0], /held update/);
|
|
367
|
-
await replacement.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
368
|
-
await settle(replacement);
|
|
369
|
-
assert.equal(acknowledgedNodeMailCount('node-deferred-human-prompt'), 1, 'only agent_settled commits the prompt-joined handoff');
|
|
370
|
-
});
|
|
371
|
-
// Pause makes the profile inert while its broker is still alive: the entry
|
|
372
|
-
// must be RETAINED, not consumed. A critical entry is the sharpest case —
|
|
373
|
-
// its route aborts the live turn, exactly the punch-through pause forbids.
|
|
374
|
-
test('a paused profile holds queued entries in a live broker until resume', async () => {
|
|
375
|
-
freshNode('node-paused-profile');
|
|
376
|
-
const origProfile = process.env['CRTR_PROFILE_ID'];
|
|
377
|
-
try {
|
|
378
|
-
const profile = createProfile('paused watcher', [{ path: '/tmp', memory: 'content' }]);
|
|
379
|
-
pauseProfile(profile.profileId);
|
|
380
|
-
process.env['CRTR_PROFILE_ID'] = profile.profileId;
|
|
381
|
-
const pi = makeFakePi();
|
|
382
|
-
disposers.push(registerWatcher(pi));
|
|
383
|
-
await wait(TICK_MS + 100);
|
|
384
|
-
publishMail('node-paused-profile', { from: 'child-1', tier: 'critical', kind: 'update', label: 'sent while paused' });
|
|
385
|
-
await wait(SETTLE_MS);
|
|
386
|
-
assert.equal(pi.injected.length, 0, 'a paused profile delivers nothing to its live broker');
|
|
387
|
-
assert.equal(acknowledgedNodeMailCount('node-paused-profile'), 0, 'the held entry stays unconsumed');
|
|
388
|
-
resumeProfile(profile.profileId);
|
|
389
|
-
await waitForFirstInjection(pi);
|
|
390
|
-
assert.equal(pi.injected.length, 1, 'resume delivers the entry that waited');
|
|
391
|
-
assert.match(pi.injected[0].content, /sent while paused/);
|
|
392
|
-
}
|
|
393
|
-
finally {
|
|
394
|
-
if (origProfile === undefined)
|
|
395
|
-
delete process.env['CRTR_PROFILE_ID'];
|
|
396
|
-
else
|
|
397
|
-
process.env['CRTR_PROFILE_ID'] = origProfile;
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
// Lifecycle-ordering regression (the live inbox-delivery startup loop): pi
|
|
402
|
-
// deliberately makes action methods (sendUserMessage/sendMessage) throw until
|
|
403
|
-
// the session binds the shared extension runtime, and it only emits
|
|
404
|
-
// session_start once that bind has happened. registerCanvasInboxWatcher()'s
|
|
405
|
-
// factory must therefore make zero action calls on its own — arming the poll
|
|
406
|
-
// interval and the initial tick is deferred to the session_start handler,
|
|
407
|
-
// which must itself be idempotent (a resume/fork/second session_start must not
|
|
408
|
-
// re-arm a second interval or re-deliver).
|
|
409
|
-
describe('canvas inbox watcher — action-gated startup (session_start arm)', () => {
|
|
410
|
-
test('factory registration makes zero action calls; only session_start arms delivery, and a repeat session_start is harmless', async () => {
|
|
411
|
-
freshNode('node-action-gate');
|
|
412
|
-
const pi = makeFakePi();
|
|
413
|
-
let actionsReady = false;
|
|
414
|
-
let sendAttempts = 0;
|
|
415
|
-
const realSendUserMessage = pi.sendUserMessage.bind(pi);
|
|
416
|
-
pi.sendUserMessage = (content, options) => {
|
|
417
|
-
sendAttempts += 1;
|
|
418
|
-
if (!actionsReady)
|
|
419
|
-
throw new Error('Extension runtime not initialized: session not yet bound');
|
|
420
|
-
realSendUserMessage(content, options);
|
|
421
|
-
};
|
|
422
|
-
// An unread entry already sits in the inbox before the watcher is even
|
|
423
|
-
// registered — the same shape as a revived broker with pre-existing work.
|
|
424
|
-
const entry = publishMail('node-action-gate', { from: 'child-1', tier: 'normal', kind: 'update', label: 'pre-bind entry' });
|
|
425
|
-
// Registration alone (the extension factory, before Pi has bound actions)
|
|
426
|
-
// must be side-effect-free: no timer armed, no tick run, no action attempted
|
|
427
|
-
// — even across several tick+debounce windows.
|
|
428
|
-
ensureWatcherNode();
|
|
429
|
-
startWatcherExecution('node-action-gate');
|
|
430
|
-
disposers.push(registerCanvasInboxWatcher(pi));
|
|
431
|
-
await wait(TICK_MS * 5 + DEBOUNCE_MS + 50);
|
|
432
|
-
assert.equal(sendAttempts, 0, 'no action call is attempted before session_start arms the watcher');
|
|
433
|
-
assert.equal(pi.injected.length, 0, 'nothing handed off before session_start');
|
|
434
|
-
assert.equal(acknowledgedNodeMailCount('node-action-gate'), 0, 'no delivery is acknowledged before session_start');
|
|
435
|
-
// session_start is pi's real bind signal: actions work from here on. Arming
|
|
436
|
-
// now must pick up the already-buffered pre-bind entry.
|
|
437
|
-
actionsReady = true;
|
|
438
|
-
pi.fire('session_start', { type: 'session_start' }, undefined);
|
|
439
|
-
await waitForFirstInjection(pi);
|
|
440
|
-
assert.equal(sendAttempts, 1, 'exactly one action attempt once session_start arms the watcher');
|
|
441
|
-
assert.equal(pi.injected.length, 1, 'exactly one handoff once actions are bound');
|
|
442
|
-
assert.equal(acknowledgedNodeMailCount('node-action-gate'), 0, 'still uncommitted until agent_settled');
|
|
443
|
-
await settle(pi);
|
|
444
|
-
assert.equal(acknowledgedNodeMailCount('node-action-gate'), 1, 'agent_settled acknowledges the delivery');
|
|
445
|
-
// A repeated session_start (e.g. a resume) must not re-arm a second
|
|
446
|
-
// interval or re-run the initial tick — no duplicate delivery.
|
|
447
|
-
pi.fire('session_start', { type: 'session_start' }, undefined);
|
|
448
|
-
await wait(SETTLE_MS);
|
|
449
|
-
assert.equal(sendAttempts, 1, 'a repeated session_start does not re-arm or re-attempt delivery');
|
|
450
|
-
assert.equal(pi.injected.length, 1, 'a repeated session_start does not re-deliver');
|
|
451
|
-
});
|
|
452
|
-
test('disposal before any session_start is safe (no timer to leak, no action ever attempted)', async () => {
|
|
453
|
-
freshNode('node-dispose-before-start');
|
|
454
|
-
const pi = makeFakePi();
|
|
455
|
-
publishMail('node-dispose-before-start', { from: 'child-1', tier: 'normal', kind: 'update', label: 'never armed' });
|
|
456
|
-
startWatcherExecution('node-dispose-before-start');
|
|
457
|
-
const dispose = registerCanvasInboxWatcher(pi);
|
|
458
|
-
// Dispose immediately, before session_start ever fires — models a reload
|
|
459
|
-
// that discards this generation before Pi finishes binding.
|
|
460
|
-
dispose();
|
|
461
|
-
await wait(TICK_MS * 3 + DEBOUNCE_MS + 50);
|
|
462
|
-
assert.equal(pi.injected.length, 0, 'a watcher disposed before session_start never delivers');
|
|
463
|
-
assert.equal(acknowledgedNodeMailCount('node-dispose-before-start'), 0, 'disposal before start commits nothing');
|
|
464
|
-
// A session_start firing after disposal (a stale handler on a discarded
|
|
465
|
-
// generation) must also be inert.
|
|
466
|
-
pi.fire('session_start', { type: 'session_start' }, undefined);
|
|
467
|
-
await wait(SETTLE_MS);
|
|
468
|
-
assert.equal(pi.injected.length, 0, 'session_start after disposal does not resurrect the discarded generation');
|
|
469
|
-
});
|
|
470
|
-
});
|
|
471
|
-
// SQL delivery receipts preserve at-least-once delivery. A claimed delivery is
|
|
472
|
-
// acknowledged only at agent_settled, never at the fire-and-forget send return
|
|
473
|
-
// or agent_end. A watcher that exits before acknowledgment leaves its claim for
|
|
474
|
-
// the replacement execution to inherit and deliver again. session_shutdown
|
|
475
|
-
// retains a claim when Pi still has pending messages, because that queued send
|
|
476
|
-
// would otherwise die with the process.
|
|
477
|
-
describe('canvas inbox watcher — SQL delivery receipts (at-least-once)', () => {
|
|
478
|
-
test('mid-turn handoff, crash before settle: delivery remains unacknowledged and a fresh watcher re-delivers', async () => {
|
|
479
|
-
freshNode('node-receipt-crash');
|
|
480
|
-
const pi1 = makeFakePi();
|
|
481
|
-
disposers.push(registerWatcher(pi1));
|
|
482
|
-
// Streaming (mid-turn) so this delivers via followUp, not the idle path.
|
|
483
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
484
|
-
await wait(TICK_MS + 100);
|
|
485
|
-
publishMail('node-receipt-crash', { from: 'child-1', tier: 'normal', kind: 'update', label: 'still working' });
|
|
486
|
-
await waitForFirstInjection(pi1);
|
|
487
|
-
assert.equal(pi1.injected.length, 1, 'delivered mid-turn as a followUp');
|
|
488
|
-
assert.equal(pi1.injected[0].deliverAs, 'followUp');
|
|
489
|
-
// The delivery remains handed off until settle; a send return alone must not acknowledge it.
|
|
490
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-crash'), 0, 'delivery is not acknowledged before a settle');
|
|
491
|
-
// Simulate the watcher dying without a graceful session_shutdown — never
|
|
492
|
-
// settle OR fire session_shutdown on pi1. The broker's SIGTERM handler DOES
|
|
493
|
-
// run a JS handler (disposeAndExit: session.dispose() + process.exit), but
|
|
494
|
-
// that path never emits this extension's session_shutdown, so its safety-net
|
|
495
|
-
// commit does not run on a kill. Registering a fresh watcher clears pi1's
|
|
496
|
-
// timer (the module-level liveTimer guard) without running its teardown,
|
|
497
|
-
// modeling crash-then-revive rather than a clean stop.
|
|
498
|
-
const pi2 = makeFakePi();
|
|
499
|
-
disposers.push(registerWatcher(pi2));
|
|
500
|
-
await waitForFirstInjection(pi2);
|
|
501
|
-
assert.equal(pi2.injected.length, 1, 'a fresh watcher re-reads and re-delivers the same uncommitted entry');
|
|
502
|
-
assert.match(pi2.injected[0].content, /still working/);
|
|
503
|
-
});
|
|
504
|
-
test('mid-turn handoff + agent_settled: delivery acknowledged, fresh watcher does NOT redeliver', async () => {
|
|
505
|
-
freshNode('node-receipt-committed');
|
|
506
|
-
const pi1 = makeFakePi();
|
|
507
|
-
disposers.push(registerWatcher(pi1));
|
|
508
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
509
|
-
await wait(TICK_MS + 100);
|
|
510
|
-
const entry = publishMail('node-receipt-committed', { from: 'child-2', tier: 'normal', kind: 'update', label: 'still working' });
|
|
511
|
-
await waitForFirstInjection(pi1);
|
|
512
|
-
assert.equal(pi1.injected.length, 1);
|
|
513
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-committed'), 0, 'not yet committed before the settle');
|
|
514
|
-
// The turn settles with pi's queue drained (the followUp was consumed) —
|
|
515
|
-
// THAT acknowledges the delivery.
|
|
516
|
-
await settle(pi1);
|
|
517
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-committed'), 1, 'delivery acknowledged at agent_settled');
|
|
518
|
-
const pi2 = makeFakePi();
|
|
519
|
-
disposers.push(registerWatcher(pi2));
|
|
520
|
-
await wait(SETTLE_MS);
|
|
521
|
-
assert.equal(pi2.injected.length, 0, 'a fresh watcher does not redeliver an already-committed entry');
|
|
522
|
-
});
|
|
523
|
-
test('idle-path delivery: NOT committed on the void send, committed at agent_settled', async () => {
|
|
524
|
-
freshNode('node-receipt-idle');
|
|
525
|
-
const pi = makeFakePi();
|
|
526
|
-
disposers.push(registerWatcher(pi));
|
|
527
|
-
// No agent_start fired → watcher treats the node as idle.
|
|
528
|
-
await wait(TICK_MS + 100);
|
|
529
|
-
const entry = publishMail('node-receipt-idle', { from: 'child-3', tier: 'normal', kind: 'update', label: 'idle update' });
|
|
530
|
-
await waitForFirstInjection(pi);
|
|
531
|
-
assert.equal(pi.injected.length, 1);
|
|
532
|
-
assert.equal(pi.injected[0].deliverAs, undefined, 'idle delivery has no deliverAs');
|
|
533
|
-
// The idle send triggers a turn, but its void return is a handoff, not proof
|
|
534
|
-
// of acceptance — the delivery remains handed off until the turn settles.
|
|
535
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-idle'), 0, 'idle send does not commit on the fire-and-forget return');
|
|
536
|
-
await settle(pi);
|
|
537
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-idle'), 1, 'idle-path delivery commits at the turn it started settling');
|
|
538
|
-
});
|
|
539
|
-
test('synchronous send throw then agent_settled: re-buffered delivery remains unacknowledged and a fresh watcher re-delivers', async () => {
|
|
540
|
-
freshNode('node-receipt-failsend');
|
|
541
|
-
const pi1 = makeFakePi();
|
|
542
|
-
// Persistent synchronous send failure: the entry is read + buffered, flush
|
|
543
|
-
// throws, it is re-buffered and never handed off.
|
|
544
|
-
pi1.sendUserMessage = () => { throw new Error('send always fails'); };
|
|
545
|
-
disposers.push(registerWatcher(pi1));
|
|
546
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
547
|
-
await wait(TICK_MS + 100);
|
|
548
|
-
publishMail('node-receipt-failsend', { from: 'child-1', tier: 'normal', kind: 'update', label: 'never delivered' });
|
|
549
|
-
await wait(SETTLE_MS);
|
|
550
|
-
assert.equal(pi1.injected.length, 0, 'the failing send delivered nothing');
|
|
551
|
-
// agent_settled must NOT commit past the still-re-buffered (never-handed-off) entry.
|
|
552
|
-
await settle(pi1);
|
|
553
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-failsend'), 0, 're-buffered, never-delivered mail is not acknowledged');
|
|
554
|
-
const pi2 = makeFakePi();
|
|
555
|
-
disposers.push(registerWatcher(pi2));
|
|
556
|
-
await waitForFirstInjection(pi2);
|
|
557
|
-
assert.equal(pi2.injected.length, 1, 'a fresh watcher re-reads and re-delivers the never-committed entry');
|
|
558
|
-
assert.match(pi2.injected[0].content, /never delivered/);
|
|
559
|
-
});
|
|
560
|
-
test('critical abort then abort-generated settle: pending critical entry NOT committed, fresh watcher re-delivers', async () => {
|
|
561
|
-
freshNode('node-receipt-critical');
|
|
562
|
-
const pi1 = makeFakePi();
|
|
563
|
-
let aborted = 0;
|
|
564
|
-
disposers.push(registerWatcher(pi1));
|
|
565
|
-
// Mid-turn streaming, with an abort() seam on the ctx (a critical entry
|
|
566
|
-
// preempts via ctx.abort()).
|
|
567
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false, abort: () => { aborted += 1; } });
|
|
568
|
-
await wait(TICK_MS + 100);
|
|
569
|
-
publishMail('node-receipt-critical', { from: 'child-1', tier: 'critical', kind: 'update', label: 'critical work' });
|
|
570
|
-
await wait(SETTLE_MS);
|
|
571
|
-
assert.ok(aborted >= 1, 'the critical entry aborted the live turn');
|
|
572
|
-
assert.equal(pi1.injected.length, 0, 'the critical path re-buffers, it does not deliver mid-stream');
|
|
573
|
-
// The abort-generated agent_end/settle must not commit the pending critical
|
|
574
|
-
// entry (it is re-buffered, never handed off).
|
|
575
|
-
pi1.fire('agent_end', { type: 'agent_end', messages: [] }, { isIdle: () => false });
|
|
576
|
-
await settle(pi1, { idle: false });
|
|
577
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-critical'), 0, 'abort-generated settle does not commit the pending critical entry before its retry');
|
|
578
|
-
const pi2 = makeFakePi();
|
|
579
|
-
disposers.push(registerWatcher(pi2));
|
|
580
|
-
await waitForFirstInjection(pi2);
|
|
581
|
-
assert.equal(pi2.injected.length, 1, 'a fresh watcher re-delivers the critical entry');
|
|
582
|
-
assert.match(pi2.injected[0].content, /critical work/);
|
|
583
|
-
});
|
|
584
|
-
test('batch A settles while batch B still debounces: commit stops at A, fresh watcher re-delivers B', async () => {
|
|
585
|
-
freshNode('node-receipt-batchB');
|
|
586
|
-
// Wide debounce for THIS watcher so B stays buffered-but-unflushed when we
|
|
587
|
-
// settle A; the watcher captures the cadence at registration, so restore the
|
|
588
|
-
// file default immediately after for the fresh (pi2) watcher.
|
|
589
|
-
process.env['CRTR_WATCHER_DEBOUNCE_MS'] = '200';
|
|
590
|
-
const pi1 = makeFakePi();
|
|
591
|
-
disposers.push(registerWatcher(pi1));
|
|
592
|
-
process.env['CRTR_WATCHER_DEBOUNCE_MS'] = String(DEBOUNCE_MS);
|
|
593
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
594
|
-
await wait(TICK_MS + 60);
|
|
595
|
-
const a = publishMail('node-receipt-batchB', { from: 'child-a', tier: 'normal', kind: 'update', label: 'batch A' });
|
|
596
|
-
await waitForFirstInjection(pi1);
|
|
597
|
-
assert.equal(pi1.injected.length, 1, 'batch A delivered mid-turn');
|
|
598
|
-
assert.equal(pi1.injected[0].deliverAs, 'followUp');
|
|
599
|
-
const b = publishMail('node-receipt-batchB', { from: 'child-b', tier: 'normal', kind: 'update', label: 'batch B' });
|
|
600
|
-
await wait(70); // B read into the buffer but < 200ms debounce → not yet flushed
|
|
601
|
-
// A's turn settles while B is still debouncing in the buffer. The commit must
|
|
602
|
-
// clamp below the still-buffered B and land on A only.
|
|
603
|
-
await settle(pi1);
|
|
604
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-batchB'), 1, 'commit lands on handed-off batch A');
|
|
605
|
-
const pi2 = makeFakePi();
|
|
606
|
-
disposers.push(registerWatcher(pi2));
|
|
607
|
-
await waitForFirstInjection(pi2);
|
|
608
|
-
assert.equal(pi2.injected.length, 1, 'a fresh watcher re-reads from A and re-delivers B');
|
|
609
|
-
assert.match(pi2.injected[0].content, /batch B/);
|
|
610
|
-
assert.doesNotMatch(pi2.injected[0].content, /batch A/, 'A is already committed, only B is re-delivered');
|
|
611
|
-
});
|
|
612
|
-
// agent_settled is authoritative: pi's documented contract guarantees no
|
|
613
|
-
// queued continuation remains once it fires, so the commit is unconditional
|
|
614
|
-
// — a context reporting pending sends (hasPendingMessages() = true) no longer
|
|
615
|
-
// vetoes it. This is the exact real-incident invariant behind #353/#362: a
|
|
616
|
-
// settle-time veto that declines the sole commit, followed by cooperative
|
|
617
|
-
// idle-release exit, permanently leaves the mail handed off with no later settle.
|
|
618
|
-
test('agent_settled commits unconditionally even when hasPendingMessages() reports pending', async () => {
|
|
619
|
-
freshNode('node-receipt-failhold');
|
|
620
|
-
const pi1 = makeFakePi();
|
|
621
|
-
disposers.push(registerWatcher(pi1));
|
|
622
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
623
|
-
await wait(TICK_MS + 100);
|
|
624
|
-
const entry = publishMail('node-receipt-failhold', { from: 'child-1', tier: 'normal', kind: 'update', label: 'queued across a failure' });
|
|
625
|
-
await waitForFirstInjection(pi1);
|
|
626
|
-
assert.equal(pi1.injected.length, 1, 'delivered mid-turn as a followUp');
|
|
627
|
-
assert.equal(pi1.injected[0].deliverAs, 'followUp');
|
|
628
|
-
// A failure/aborted agent_end is never a commit point regardless of queue
|
|
629
|
-
// state, so it must NOT commit.
|
|
630
|
-
pi1.fire('agent_end', { type: 'agent_end', messages: [] }, { isIdle: () => false });
|
|
631
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-failhold'), 0, 'a failure agent_end does not commit');
|
|
632
|
-
// The settle commits even though the context reports pending sends —
|
|
633
|
-
// agent_settled no longer declines on hasPendingMessages().
|
|
634
|
-
await settle(pi1, { pending: true });
|
|
635
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-failhold'), 1, 'agent_settled commits unconditionally, even when hasPendingMessages() reports pending');
|
|
636
|
-
const pi2 = makeFakePi();
|
|
637
|
-
disposers.push(registerWatcher(pi2));
|
|
638
|
-
await wait(SETTLE_MS);
|
|
639
|
-
assert.equal(pi2.injected.length, 0, 'a fresh watcher does not redeliver an already-committed entry');
|
|
640
|
-
});
|
|
641
|
-
// session_shutdown retains the conservative hold this test file used to pin
|
|
642
|
-
// at agent_settled: it is pi's graceful-teardown safety net for a settle that
|
|
643
|
-
// never fired before exit, so an unconsumed queued send there would die with
|
|
644
|
-
// the process — committing past it would durably lose a message pi never
|
|
645
|
-
// delivered.
|
|
646
|
-
test('session_shutdown keeps a refresh handoff replayable when no messages are pending', async () => {
|
|
647
|
-
freshNode('node-receipt-refresh-shutdown');
|
|
648
|
-
closeDb();
|
|
649
|
-
const meta = {
|
|
650
|
-
node_id: 'node-receipt-refresh-shutdown', name: 'r', created: new Date().toISOString(),
|
|
651
|
-
cwd: '/tmp', kind: 'general', mode: 'base', lifecycle: 'resident',
|
|
652
|
-
status: 'active',
|
|
653
|
-
};
|
|
654
|
-
createNode(meta);
|
|
655
|
-
const pi = makeFakePi();
|
|
656
|
-
disposers.push(registerWatcher(pi));
|
|
657
|
-
pi.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
658
|
-
await wait(TICK_MS + 100);
|
|
659
|
-
publishMail(meta.node_id, { from: 'child-x', tier: 'normal', kind: 'update', label: 'handoff at shutdown' });
|
|
660
|
-
await waitForFirstInjection(pi);
|
|
661
|
-
assert.equal(pi.injected.length, 1, 'the active conversation received the handoff before refresh');
|
|
662
|
-
setIntent(meta.node_id, 'refresh');
|
|
663
|
-
await shutdown(pi, { pending: false });
|
|
664
|
-
assert.equal(acknowledgedNodeMailCount(meta.node_id), 0, 'a refresh keeps the shutdown handoff uncommitted for replay');
|
|
665
|
-
});
|
|
666
|
-
test('session_shutdown still holds while hasPendingMessages() reports pending (no agent_settled fired)', async () => {
|
|
667
|
-
freshNode('node-receipt-shutdownhold');
|
|
668
|
-
const pi1 = makeFakePi();
|
|
669
|
-
const dispose = registerWatcher(pi1);
|
|
670
|
-
pi1.fire('agent_start', { type: 'agent_start' }, { isIdle: () => false });
|
|
671
|
-
await wait(TICK_MS + 100);
|
|
672
|
-
const entry = publishMail('node-receipt-shutdownhold', { from: 'child-1', tier: 'normal', kind: 'update', label: 'still queued at shutdown' });
|
|
673
|
-
await waitForFirstInjection(pi1);
|
|
674
|
-
assert.equal(pi1.injected.length, 1, 'delivered mid-turn as a followUp');
|
|
675
|
-
// session_shutdown fires with no prior agent_settled, and the context
|
|
676
|
-
// reports an unconsumed queued send — the hold declines the commit.
|
|
677
|
-
await shutdown(pi1, { pending: true });
|
|
678
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-shutdownhold'), 0, 'session_shutdown declines to commit while pi reports pending sends');
|
|
679
|
-
dispose();
|
|
680
|
-
// A fresh watcher re-reads and re-delivers, then a drained settle commits.
|
|
681
|
-
const pi2 = makeFakePi();
|
|
682
|
-
disposers.push(registerWatcher(pi2));
|
|
683
|
-
await waitForFirstInjection(pi2);
|
|
684
|
-
assert.equal(pi2.injected.length, 1, 'a fresh watcher re-reads and re-delivers the never-committed entry');
|
|
685
|
-
assert.match(pi2.injected[0].content, /still queued at shutdown/);
|
|
686
|
-
await settle(pi2);
|
|
687
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-shutdownhold'), 1, 'the redelivered entry commits once the fresh watcher settles cleanly');
|
|
688
|
-
});
|
|
689
|
-
// Situational custom sends do not enter pi's user steer/followUp queue, so
|
|
690
|
-
// hasPendingMessages() never reflects them: a situational handoff commits at
|
|
691
|
-
// the next drained settle (a situational send that async-rejected is the
|
|
692
|
-
// accepted silent-loss window, not held).
|
|
693
|
-
test('situational custom send: committed at the next drained agent_settled', async () => {
|
|
694
|
-
freshNode('node-receipt-situational');
|
|
695
|
-
appendSituationalContext('node-receipt-situational', 'ambient checkout state');
|
|
696
|
-
const pi1 = makeFakePi();
|
|
697
|
-
disposers.push(registerWatcher(pi1));
|
|
698
|
-
// Idle so the situational-only entry delivers as a hidden custom message.
|
|
699
|
-
await wait(TICK_MS + 100);
|
|
700
|
-
const entry = publishMail('node-receipt-situational', {
|
|
701
|
-
from: null, tier: 'normal', kind: 'message', label: '(ambient context updated)',
|
|
702
|
-
data: { situational: true, situationalOnly: true },
|
|
703
|
-
});
|
|
704
|
-
await wait(SETTLE_MS);
|
|
705
|
-
assert.equal(pi1.sentMessages.length, 1, 'the hidden custom message was sent');
|
|
706
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-situational'), 0, 'not committed before the settle');
|
|
707
|
-
await settle(pi1);
|
|
708
|
-
assert.equal(acknowledgedNodeMailCount('node-receipt-situational'), 1, 'the situational handoff commits at the drained settle');
|
|
709
|
-
});
|
|
710
|
-
});
|