@north-light/crouter 0.3.318 → 0.3.319
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +5 -4
- package/runtime.lock.json +5 -5
- 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,262 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/seam/broker-attach-multiclient.test.ts
|
|
2
|
-
//
|
|
3
|
-
// COMPILED SEAM (real-boot-bound): tmux-free, but it boots a REAL broker process
|
|
4
|
-
// (~5s pi-SDK load), so it lives in seam/ (CI), not the fast local loop.
|
|
5
|
-
//
|
|
6
|
-
// The MULTI-CLIENT half of the `crtr surface attach` acceptance gate: everything
|
|
7
|
-
// whose contract is "more than one viewer is attached at once". One shared broker
|
|
8
|
-
// serves all four journeys.
|
|
9
|
-
//
|
|
10
|
-
// 3-PART HEADER (headless):
|
|
11
|
-
// (1) CONTRACT — every client that hellos as `controller` is welcomed writable,
|
|
12
|
-
// simultaneously and independently; each writable client may submit, every
|
|
13
|
-
// connected client (both writers plus a read-only observer) receives the
|
|
14
|
-
// merged stream of both submissions and the `model_changed` broadcast, and a
|
|
15
|
-
// client that hellos as `observer` is rejected with error{read_only} when it
|
|
16
|
-
// tries to drive. ONE blocking dialog fans to EVERY writable client, is
|
|
17
|
-
// handed to a writable client attaching MID-dialog via
|
|
18
|
-
// `welcome.pending_dialog`, is settled by the FIRST response with ITS value,
|
|
19
|
-
// dismisses every peer by id, and ignores a late peer answer. An in-place
|
|
20
|
-
// session mutation (`navigate_tree`) re-welcomes every viewer onto the
|
|
21
|
-
// rewound transcript. A late joiner's welcome is COMPLETE: retained display
|
|
22
|
-
// levels ride in `welcome.snapshot.display` and no display edge follows it.
|
|
23
|
-
// (2) WHY BROKER/SOCKET-LEVEL, NOT PANE/WINDOW — role admission, dialog fan-out,
|
|
24
|
-
// re-welcome fan-out and catch-up shape are broker-process and view.sock
|
|
25
|
-
// contracts, exercised over a pure Unix socket using the production
|
|
26
|
-
// ViewSocketClient with a real broker process and no tmux pane or window.
|
|
27
|
-
// (3) HOW THE HEADLESS DRIVE ASSERTS THE CONTRACT — the real socket responses
|
|
28
|
-
// provide the welcome roles, per-writer relay frames, the read-only
|
|
29
|
-
// rejection, the fanned dialog frames plus the value and latency recorded in
|
|
30
|
-
// fake-pi.dialog.jsonl, the second welcome after navigate_tree, and the
|
|
31
|
-
// welcome payload of a late joiner.
|
|
32
|
-
//
|
|
33
|
-
// One shared broker is booted in before() and reused across every test. There is
|
|
34
|
-
// no writer slot to hand off, so each test simply attaches at the role it wants;
|
|
35
|
-
// afterEach closes the prior sockets, which is also what leaves the broker
|
|
36
|
-
// VIEWERLESS for the display catch-up test.
|
|
37
|
-
import { test, before, after, afterEach } from 'node:test';
|
|
38
|
-
import assert from 'node:assert/strict';
|
|
39
|
-
import { createHeadlessHarness } from '../helpers/harness.js';
|
|
40
|
-
import { isPidAlive } from '../../canvas/pid.js';
|
|
41
|
-
import { createAttachKit, delay, tok, frameHas } from '../helpers/broker-clients.js';
|
|
42
|
-
let h;
|
|
43
|
-
let id; // ONE shared broker, reused across every test (1 real boot)
|
|
44
|
-
const kit = createAttachKit(() => h);
|
|
45
|
-
const { attach, attachUntil } = kit;
|
|
46
|
-
before(async () => {
|
|
47
|
-
h = await createHeadlessHarness({ sessionPrefix: 'crtr-brkmulti' });
|
|
48
|
-
const root = h.spawnRoot('broker-attach-multiclient suite root');
|
|
49
|
-
id = await h.spawnHeadlessChild(root, 'headless worker — multi-client gates');
|
|
50
|
-
});
|
|
51
|
-
after(async () => {
|
|
52
|
-
if (h !== undefined)
|
|
53
|
-
await h.dispose();
|
|
54
|
-
});
|
|
55
|
-
afterEach(() => {
|
|
56
|
-
kit.closeAll();
|
|
57
|
-
});
|
|
58
|
-
const brokerPid = () => h.node(id).pi_pid;
|
|
59
|
-
// Attach a writable client. Every `hello` claiming `controller` is admitted
|
|
60
|
-
// writable — attaching a peer never demotes an already-attached one.
|
|
61
|
-
const writer = async (cid) => {
|
|
62
|
-
const a = await attach(id, 'controller', cid);
|
|
63
|
-
assert.equal(a.welcome.role, 'controller', `${cid}: admitted writable, not demoted by an existing peer`);
|
|
64
|
-
return a;
|
|
65
|
-
};
|
|
66
|
-
const observer = async (cid) => {
|
|
67
|
-
const a = await attach(id, 'observer', cid);
|
|
68
|
-
assert.equal(a.welcome.role, 'observer', `${cid}: an observer hello stays read-only`);
|
|
69
|
-
return a;
|
|
70
|
-
};
|
|
71
|
-
// The broker handles one client's frames in order, so an `ack` for a get_commands
|
|
72
|
-
// sent AFTER some other frame proves that earlier frame was already processed.
|
|
73
|
-
// Used to make "a late peer answer changed nothing" a deterministic assertion
|
|
74
|
-
// instead of a sleep.
|
|
75
|
-
const barrier = async (c, label) => {
|
|
76
|
-
c.send({ type: 'get_commands' });
|
|
77
|
-
await c.waitFrame((f) => f.type === 'ack' && f.for === 'get_commands', label);
|
|
78
|
-
};
|
|
79
|
-
const isRequest = (f) => f.type === 'extension_ui_request';
|
|
80
|
-
const dismissFor = (reqId) => (f) => f.type === 'extension_ui_dismiss' && f.id === reqId;
|
|
81
|
-
const welcomes = (frames) => frames.filter((f) => f.type === 'welcome');
|
|
82
|
-
// G4 — multi-writer admission + read-only gating + broadcast fan-out. Guards: two
|
|
83
|
-
// simultaneous `controller` hellos are BOTH welcomed writable, each one's own
|
|
84
|
-
// submission reaches the engine, every connected client sees BOTH turns, an
|
|
85
|
-
// explicit observer that tries to drive is rejected with error{read_only}, and a
|
|
86
|
-
// model switch — for which pi emits no AgentSessionEvent at all — reaches EVERY
|
|
87
|
-
// viewer as a `model_changed` frame rather than only acking the requester
|
|
88
|
-
// (observed 2026-06-11: the status bar kept showing the old model).
|
|
89
|
-
// Failure mode: a singleton writer slot demoting the second client, a writer
|
|
90
|
-
// whose prompt is silently dropped, fan-out that misses a viewer, a read-only
|
|
91
|
-
// client that can drive the engine, or a model switch only its requester hears.
|
|
92
|
-
test('G4 — two simultaneous clients are both welcomed controller, each submits, all clients see both turns and the model switch; an observer drive → error{read_only}', async () => {
|
|
93
|
-
const [w1, w2] = await Promise.all([
|
|
94
|
-
attach(id, 'controller', 'g4-writer-1'),
|
|
95
|
-
attach(id, 'controller', 'g4-writer-2'),
|
|
96
|
-
]);
|
|
97
|
-
assert.equal(w1.welcome.role, 'controller', 'first client is welcomed writable');
|
|
98
|
-
assert.equal(w2.welcome.role, 'controller', 'second SIMULTANEOUS client is ALSO welcomed writable (no singleton slot)');
|
|
99
|
-
const obs = await attach(id, 'observer', 'g4-observer');
|
|
100
|
-
assert.equal(obs.welcome.role, 'observer', 'an explicit observer hello stays read-only');
|
|
101
|
-
// A read-only client may not drive the engine — the role is per-client and
|
|
102
|
-
// fixed by its own hello, so this rejection is independent of who else is
|
|
103
|
-
// attached.
|
|
104
|
-
obs.send({ type: 'prompt', text: 'a read-only client must not drive' });
|
|
105
|
-
const err = await obs.waitFrame((f) => f.type === 'error', 'G4 observer prompt rejected');
|
|
106
|
-
assert.equal(err.code, 'read_only', 'G4: observer prompt → error{read_only}');
|
|
107
|
-
// Each writer submits its OWN token. Submissions are sequenced (a prompt sent
|
|
108
|
-
// mid-stream routes as a steer and produces no second turn), so each turn is
|
|
109
|
-
// driven to its terminal agent_end before the next writer submits.
|
|
110
|
-
const tokenA = tok('G4-WRITER-1');
|
|
111
|
-
w1.send({ type: 'prompt', text: tokenA });
|
|
112
|
-
await w1.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenA), 'G4 writer 1 saw its own turn');
|
|
113
|
-
const tokenB = tok('G4-WRITER-2');
|
|
114
|
-
w2.send({ type: 'prompt', text: tokenB });
|
|
115
|
-
await w2.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenB), 'G4 writer 2 saw its own turn');
|
|
116
|
-
// The merged stream: EVERY connected client — both writers and the read-only
|
|
117
|
-
// observer — receives BOTH writers' turns.
|
|
118
|
-
await w2.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenA), 'G4 writer 2 ALSO received writer 1 turn');
|
|
119
|
-
await w1.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenB), 'G4 writer 1 ALSO received writer 2 turn');
|
|
120
|
-
await obs.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenA), 'G4 observer received writer 1 turn');
|
|
121
|
-
await obs.waitFrame((f) => f.type === 'agent_end' && frameHas(f, tokenB), 'G4 observer received writer 2 turn');
|
|
122
|
-
// A model switch has no AgentSessionEvent to ride: the broker mirrors
|
|
123
|
-
// snapshot.state.model to every client itself. Pre-fix only the requester's
|
|
124
|
-
// bare ack existed, so both model_changed waits time out.
|
|
125
|
-
w1.send({ type: 'set_model', model: 'anthropic/fake-fable' });
|
|
126
|
-
const ack = await w1.waitFrame((f) => f.type === 'ack' && f.for === 'set_model', 'G4 set_model ack');
|
|
127
|
-
assert.ok(ack.type === 'ack' && ack.ok, 'G4: set_model acked ok to the requester');
|
|
128
|
-
const cm = await w1.waitFrame((f) => f.type === 'model_changed', 'G4 requester receives model_changed');
|
|
129
|
-
assert.ok(cm.type === 'model_changed' && cm.model?.id === 'fake-fable', 'G4: the requester sees the new model id');
|
|
130
|
-
const om = await obs.waitFrame((f) => f.type === 'model_changed', 'G4 observer receives model_changed');
|
|
131
|
-
assert.ok(om.type === 'model_changed' && om.model?.id === 'fake-fable', 'G4: a read-only observer ALSO hears the switch');
|
|
132
|
-
});
|
|
133
|
-
// G5 — dialog fan-out, mid-dialog handoff, and first-response settlement.
|
|
134
|
-
// Guards: ONE blocking dialog reaches EVERY writable client (never a single
|
|
135
|
-
// owner), a writable client attaching MID-dialog is handed it via
|
|
136
|
-
// welcome.pending_dialog and becomes a full peer in the race to answer, the first
|
|
137
|
-
// answer unblocks the engine with ITS value (not the default), every fanned
|
|
138
|
-
// client gets the correlated extension_ui_dismiss, and a peer answering
|
|
139
|
-
// afterwards is a no-op. An observer is never fanned an answerable dialog.
|
|
140
|
-
// Failure modes: a dialog only one viewer can see (the others sit blind), a
|
|
141
|
-
// late-joining writable viewer blind to an in-flight dialog, peers left holding
|
|
142
|
-
// an overlay nothing can answer, or a late peer answer re-settling a dead dialog.
|
|
143
|
-
test('G5 — one dialog fans out to every writable client and to a mid-dialog joiner, the first response settles it, all are dismissed, and a late peer response is a no-op', async () => {
|
|
144
|
-
const base = h.dialogResults(id).length;
|
|
145
|
-
const a = await writer('g5-A');
|
|
146
|
-
const b = await writer('g5-B');
|
|
147
|
-
const obs = await observer('g5-obs'); // must never be fanned an answerable dialog
|
|
148
|
-
h.fakeCmd(id, { cmd: 'dialog', timeout: 30_000 }); // generous: a writable client answers first
|
|
149
|
-
const reqA = await a.waitFrame(isRequest, 'G5 dialog fanned out to writable A');
|
|
150
|
-
const reqB = await b.waitFrame(isRequest, 'G5 dialog fanned out to writable B');
|
|
151
|
-
const reqId = reqA.id;
|
|
152
|
-
assert.equal(reqB.id, reqId, 'G5: both writable clients were fanned the SAME dialog id, not two dialogs');
|
|
153
|
-
assert.equal(reqA.method, 'confirm', 'G5: the fanned dialog is the confirm() the engine raised');
|
|
154
|
-
// A writable client attaching MID-dialog is handed the pending dialog in its
|
|
155
|
-
// welcome (retry covers the beat between the raise and this attach); an
|
|
156
|
-
// observer attaching mid-dialog is not.
|
|
157
|
-
assert.equal(obs.welcome.pending_dialog, null, 'G5: an observer welcome never carries a pending dialog');
|
|
158
|
-
const late = await attachUntil(id, 'controller', 'g5-late', (x) => x.welcome.role === 'controller' && x.welcome.pending_dialog != null, 'G5 writable client attaches mid-dialog and is handed the pending dialog');
|
|
159
|
-
assert.equal(late.welcome.pending_dialog.id, reqId, 'G5: welcome.pending_dialog is the SAME dialog the peers hold');
|
|
160
|
-
assert.equal(late.welcome.pending_dialog.method, 'confirm', 'G5: the pending dialog is the confirm()');
|
|
161
|
-
// The mid-dialog joiner answers FIRST — the engine must proceed with its true,
|
|
162
|
-
// not the false default.
|
|
163
|
-
late.send({ type: 'extension_ui_response', id: reqId, confirmed: true });
|
|
164
|
-
await late.waitFrame(dismissFor(reqId), 'G5 answerer receives the correlated dismiss');
|
|
165
|
-
await a.waitFrame(dismissFor(reqId), 'G5 peer A receives the correlated dismiss for the dialog it never answered');
|
|
166
|
-
await b.waitFrame(dismissFor(reqId), 'G5 peer B receives the correlated dismiss for the dialog it never answered');
|
|
167
|
-
const results = await h.waitFor(() => (h.dialogResults(id).length > base ? h.dialogResults(id) : null), { label: 'G5 dialog settled by the first response', timeoutMs: 15_000 });
|
|
168
|
-
assert.equal(results[base].resolved, true, 'G5: the engine proceeded with the first answer (true), not the default (false)');
|
|
169
|
-
// The observer was attached the whole time: it saw the broadcast dismiss but was
|
|
170
|
-
// never handed the answerable request.
|
|
171
|
-
await obs.waitFrame(dismissFor(reqId), 'G5 observer sees the broadcast dismiss (ordering barrier)');
|
|
172
|
-
assert.equal(obs.frames.filter(isRequest).length, 0, 'G5: an observer is never fanned an answerable dialog');
|
|
173
|
-
// B answers the already-settled dialog. The broker deleted the entry on the first
|
|
174
|
-
// response, so this finds nothing and is a silent no-op: no second engine
|
|
175
|
-
// resolution, and the recorded answer stays the first answerer's.
|
|
176
|
-
b.send({ type: 'extension_ui_response', id: reqId, confirmed: false });
|
|
177
|
-
await barrier(b, 'G5 broker processed B late response (ordered ack)');
|
|
178
|
-
const settled = h.dialogResults(id);
|
|
179
|
-
assert.equal(settled.length, base + 1, 'G5: the late peer response resolved nothing — no second dialog entry');
|
|
180
|
-
assert.equal(settled[base].resolved, true, "G5: the late peer response did not overwrite the first answerer's value");
|
|
181
|
-
assert.equal(isPidAlive(brokerPid()), true, 'G5: the late no-op response did not fault the broker');
|
|
182
|
-
});
|
|
183
|
-
// G9 — re-welcome after an IN-PLACE session mutation (real bug, observed
|
|
184
|
-
// 2026-06-11 in `crtr surface attach`: double-Esc/`/tree` opened the session-tree
|
|
185
|
-
// picker, but SELECTING an entry visibly did nothing). session.navigateTree()
|
|
186
|
-
// rewinds in place — same session file, new leaf, NO relayed AgentSessionEvent —
|
|
187
|
-
// so unlike the session-REPLACING ops (new_session/switch_session/fork →
|
|
188
|
-
// runReplacement → reWelcomeAll) the handler used to only ack, leaving every
|
|
189
|
-
// attached client rendering the abandoned branch and dropping the navigated-to
|
|
190
|
-
// user message's editorText. Failure mode: no second welcome arrives at all, or
|
|
191
|
-
// the re-welcome serves a stale snapshot.
|
|
192
|
-
test('G9 — navigate_tree re-welcomes every viewer onto the rewound transcript and acks the editor text', async () => {
|
|
193
|
-
const c = await writer('nav-ctrl');
|
|
194
|
-
// Accrue one observable turn so the rewind has something to drop.
|
|
195
|
-
const token = tok('NAV-TURN');
|
|
196
|
-
c.send({ type: 'prompt', text: token });
|
|
197
|
-
await c.waitFrame((f) => f.type === 'agent_end' && frameHas(f, token), 'G9 turn relayed before navigate');
|
|
198
|
-
// The observer attaches AFTER the turn so its first welcome deterministically
|
|
199
|
-
// holds the token (the pre-navigate baseline).
|
|
200
|
-
const o = await attachUntil(id, 'observer', 'nav-obs', (a) => frameHas(a.welcome, token), 'G9 observer welcome holds the pre-navigate turn');
|
|
201
|
-
c.send({ type: 'navigate_tree', targetId: 'entry-x' });
|
|
202
|
-
// The ack carries the navigated-to user message's text in detail (the viewer
|
|
203
|
-
// restores it to the editor). Pre-fix: ack had no detail.
|
|
204
|
-
const ack = await c.waitFrame((f) => f.type === 'ack' && f.for === 'navigate_tree', 'G9 navigate_tree ack');
|
|
205
|
-
assert.ok(ack.type === 'ack' && ack.ok, 'G9: navigate_tree acked ok');
|
|
206
|
-
assert.equal(ack.type === 'ack' ? ack.detail : undefined, 'rewound-to:entry-x', 'G9: ack.detail carries the rewound-to editor text');
|
|
207
|
-
// BOTH viewers get re-welcomed onto the rewound history. Pre-fix: no second
|
|
208
|
-
// welcome ever arrives (navigate_tree only acked).
|
|
209
|
-
await h.waitFor(() => (welcomes(c.frames).length >= 2 ? true : null), { label: 'G9 controller re-welcomed' });
|
|
210
|
-
await h.waitFor(() => (welcomes(o.frames).length >= 2 ? true : null), { label: 'G9 observer re-welcomed' });
|
|
211
|
-
// The re-welcome serves the REWOUND transcript: the fake's navigateTree popped
|
|
212
|
-
// the last accrued turn, so the token present in the observer's first welcome
|
|
213
|
-
// must be gone from its second.
|
|
214
|
-
const [first, second] = welcomes(o.frames);
|
|
215
|
-
assert.ok(frameHas(first, token), 'G9: pre-navigate welcome holds the turn');
|
|
216
|
-
assert.ok(!frameHas(second, token), 'G9: re-welcome serves the rewound transcript (turn dropped)');
|
|
217
|
-
assert.equal(second.snapshot.messages.length, first.snapshot.messages.length - 2, 'G9: re-welcome history is exactly one turn shorter (a turn = user + assistant = 2 tree messages)');
|
|
218
|
-
});
|
|
219
|
-
// G10 — catch-up is ONE atomic frame. `ctx.ui.setStatus/setWidget/setTitle` are
|
|
220
|
-
// LEVELS with no pi getter, so the broker is their only holder; it ships that
|
|
221
|
-
// held state as `welcome.snapshot.display` and sends NO display edge after the
|
|
222
|
-
// welcome, so a late joiner renders complete chrome on its FIRST paint. Painting
|
|
223
|
-
// here happens with ZERO viewers attached (afterEach closed the previous test's
|
|
224
|
-
// clients), so only retention can carry it. Pre-2026-07-24 `sendWelcome`
|
|
225
|
-
// re-emitted N synthetic display frames after the snapshot: catch-up was
|
|
226
|
-
// non-atomic and the viewer had to clear-and-rebuild, painting blank chrome in
|
|
227
|
-
// the gap. Both halves of that cut fail this test.
|
|
228
|
-
test('G10 — retained extension display state rides IN welcome.snapshot.display, and no display edge follows the welcome', async () => {
|
|
229
|
-
const DISPLAY_METHODS = new Set(['setStatus', 'setWidget', 'setTitle']);
|
|
230
|
-
const isDisplayFrame = (f) => f.type === 'extension_ui_request' && f.method !== undefined && DISPLAY_METHODS.has(f.method);
|
|
231
|
-
h.fakeCmd(id, { cmd: 'display', text: 'crtr-brief', reason: 'painted while detached' });
|
|
232
|
-
const a = await attachUntil(id, 'observer', 'g10-late-joiner', (at) => at.welcome.snapshot.display?.statuses['crtr-brief'] !== undefined, 'G10 welcome.snapshot.display carries the retained status');
|
|
233
|
-
const display = a.welcome.snapshot.display;
|
|
234
|
-
assert.equal(display.statuses['crtr-brief'], 'painted while detached', 'G10: setStatus level survived in the snapshot');
|
|
235
|
-
assert.deepEqual(display.widgets['crtr-brief'], { lines: ['painted while detached'], placement: 'aboveEditor' }, 'G10: setWidget level survived in the snapshot, placement included');
|
|
236
|
-
assert.equal(display.title, 'painted while detached', 'G10: setTitle level survived in the snapshot');
|
|
237
|
-
// Atomicity: the welcome is COMPLETE. Give the broker a generous beat to emit a
|
|
238
|
-
// replay it must not emit, then assert nothing display-shaped arrived at all.
|
|
239
|
-
await delay(500);
|
|
240
|
-
assert.deepEqual(a.frames.filter((f) => isDisplayFrame(f)).map((f) => f.method), [], 'G10: catch-up is the welcome alone — no synthetic display edges replayed after it');
|
|
241
|
-
// A LIVE paint still arrives as an edge frame: the snapshot replaces the replay,
|
|
242
|
-
// not the ongoing relay.
|
|
243
|
-
h.fakeCmd(id, { cmd: 'display', text: 'crtr-live', reason: 'painted while attached' });
|
|
244
|
-
const live = (await a.waitFrame((f) => f.type === 'extension_ui_request' && f.statusKey === 'crtr-live', 'G10 a live setStatus still relays as an extension_ui_request edge'));
|
|
245
|
-
assert.equal(live.method, 'setStatus');
|
|
246
|
-
assert.equal(live.statusText, 'painted while attached');
|
|
247
|
-
});
|
|
248
|
-
// snapshot_tail — a viewer that asks for the last N messages gets exactly them,
|
|
249
|
-
// each with the stable id it needs to page the omitted history back in. The
|
|
250
|
-
// broker serves a tail only when the session yields those ids; it never invents
|
|
251
|
-
// one, so a tail can never strand its recipient on history it cannot reach.
|
|
252
|
-
test('snapshot_tail serves the last N messages with the stable ids that page the rest back', async () => {
|
|
253
|
-
const token = tok('snapshot-tail');
|
|
254
|
-
h.fakeCmd(id, { cmd: 'stream', text: token });
|
|
255
|
-
const full = await attachUntil(id, 'observer', 'snapshot-tail-full', (a) => JSON.stringify(a.welcome.snapshot.messages).includes(token), 'full snapshot after a tail-less attach');
|
|
256
|
-
const fullIds = full.welcome.snapshot.messageIds;
|
|
257
|
-
assert.ok(fullIds !== undefined && fullIds.length > 1, 'the session yields a stable id per message');
|
|
258
|
-
assert.equal(fullIds.length, full.welcome.snapshot.messages.length, 'every message in the welcome carries an id');
|
|
259
|
-
const tailed = await attach(id, 'observer', 'snapshot-tail-request', { snapshotTail: 1 });
|
|
260
|
-
assert.deepEqual(tailed.welcome.snapshot.messageIds, fullIds.slice(-1), 'the tail carries the ids of the messages it kept');
|
|
261
|
-
assert.deepEqual(tailed.welcome.snapshot.messages, full.welcome.snapshot.messages.slice(-1), 'the tail is the last message alone, not the whole history');
|
|
262
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/seam/broker-attach-stream.test.ts
|
|
2
|
-
//
|
|
3
|
-
// COMPILED SEAM (real-boot-bound): tmux-free, but it boots a REAL broker process
|
|
4
|
-
// (~5s pi-SDK load), so it lives in seam/ (CI), not the fast local loop.
|
|
5
|
-
//
|
|
6
|
-
// T8 — the `crtr surface attach` acceptance gate, gates G1/G1b/G2 (controller drive,
|
|
7
|
-
// relay/coalescing, detach survival) plus the deliver ack's truthfulness (G3).
|
|
8
|
-
// Split out of broker-lifecycle.test.ts; the gates are the original acceptance
|
|
9
|
-
// gate, unchanged.
|
|
10
|
-
//
|
|
11
|
-
// 3-PART HEADER (headless-retarget):
|
|
12
|
-
// (1) BUG IT LOCKS — the broker's client fan-out: a controller `prompt` must run
|
|
13
|
-
// the engine and the streamed AgentSessionEvents must relay VERBATIM and IN
|
|
14
|
-
// ORDER to every viewer (G1); message_update coalescing must flush BEFORE any
|
|
15
|
-
// other event so a stale update can never land after message_end, and the
|
|
16
|
-
// last coalesced update must not be dropped (G1b, the F2 typing-lag fix);
|
|
17
|
-
// detach (bye+close) must drop ONE listener, never the engine (G2).
|
|
18
|
-
// Regression = a viewer that sees nothing / sees stale text / kills the engine
|
|
19
|
-
// on detach.
|
|
20
|
-
// (2) WHY BROKER/SOCKET-LEVEL, NOT PANE/WINDOW — the relay is a pure unix-socket
|
|
21
|
-
// path: ViewSocketClient ⇄ broker view.sock ⇄ in-process fake engine's
|
|
22
|
-
// subscribe channel. No tmux pane, window, or pi session read is involved, so
|
|
23
|
-
// the lock holds headlessly (createHeadlessHarness, no tmux). It needs a REAL
|
|
24
|
-
// broker PROCESS (not just model state) because it proves the cross-process
|
|
25
|
-
// frame codec + fan-out + coalescer, which is why this file keeps ONE real
|
|
26
|
-
// boot shared across all three gates.
|
|
27
|
-
// (3) HOW THE HEADLESS DRIVE STILL FAILS ON REGRESSION — each gate attaches the
|
|
28
|
-
// PRODUCTION ViewSocketClient over the real socket and asserts on the frames
|
|
29
|
-
// the real broker relays (order, types, snapshot, pid stability). A broken
|
|
30
|
-
// relay/coalescer/detach path fails the frame assertions exactly as it would
|
|
31
|
-
// under tmux; nothing here depended on a pane.
|
|
32
|
-
//
|
|
33
|
-
// The engine is hosted IN-PROCESS by the broker, so engine pid == broker pid ==
|
|
34
|
-
// node.pi_pid == boot.pid; "engine pid unchanged" == broker pid unchanged + no new
|
|
35
|
-
// boot. ONE shared broker is booted in before() and reused across all three gates
|
|
36
|
-
// (each just attaches fresh clients) — 1 real boot total, not 3. Each gate attaches
|
|
37
|
-
// a fresh writable client; afterEach closes prior sockets before the next gate begins,
|
|
38
|
-
// and each client's role remains fixed for its socket.
|
|
39
|
-
import { test, before, after, afterEach } from 'node:test';
|
|
40
|
-
import assert from 'node:assert/strict';
|
|
41
|
-
import { createHeadlessHarness } from '../helpers/harness.js';
|
|
42
|
-
import { isPidAlive } from '../../canvas/pid.js';
|
|
43
|
-
import { createAttachKit, brokerLogText, delay, tok, frameHas } from '../helpers/broker-clients.js';
|
|
44
|
-
import { REJECT_PROMPT_CALL } from '../fixtures/fake-engine.js';
|
|
45
|
-
let h;
|
|
46
|
-
let id; // ONE shared broker, reused across G1/G1b/G2 (1 real boot, not 3)
|
|
47
|
-
const kit = createAttachKit(() => h);
|
|
48
|
-
const { attach, attachUntil } = kit;
|
|
49
|
-
// Attach a writable client for the gate; its role remains fixed for this socket.
|
|
50
|
-
const ctrl = (cid) => attachUntil(id, 'controller', cid, (a) => a.welcome.role === 'controller', `${cid} admitted controller`);
|
|
51
|
-
before(async () => {
|
|
52
|
-
h = await createHeadlessHarness({ sessionPrefix: 'crtr-brkstrm' });
|
|
53
|
-
const root = h.spawnRoot('broker-attach-stream suite root');
|
|
54
|
-
id = await h.spawnHeadlessChild(root, 'headless worker — attach-stream gates');
|
|
55
|
-
});
|
|
56
|
-
after(async () => {
|
|
57
|
-
if (h !== undefined)
|
|
58
|
-
await h.dispose();
|
|
59
|
-
});
|
|
60
|
-
afterEach(() => {
|
|
61
|
-
kit.closeAll();
|
|
62
|
-
});
|
|
63
|
-
const brokerPid = () => h.node(id).pi_pid;
|
|
64
|
-
// G1 — controller drive + live relay. Guards: a controller's `prompt` runs the
|
|
65
|
-
// engine AND the streaming AgentSessionEvents are fanned out to the client
|
|
66
|
-
// VERBATIM. Failure mode: a broken relay/fan-out (viewer sees nothing).
|
|
67
|
-
test('G1 — controller prompt runs the engine and the streamed AgentSessionEvents relay to the client', async () => {
|
|
68
|
-
const c = await attachUntil(id, 'controller', 'g1-ctrl', (a) => a.welcome.role === 'controller' && a.welcome.snapshot.state.isStreaming === false, 'G1 controller admitted while the engine is idle');
|
|
69
|
-
assert.equal(c.welcome.role, 'controller', 'first controller is admitted as controller');
|
|
70
|
-
const token = tok('G1-PROMPT');
|
|
71
|
-
c.send({ type: 'prompt', text: token });
|
|
72
|
-
// The full streaming turn relays: agent_end carrying the token proves the turn
|
|
73
|
-
// ran AND its terminal frame reached the client; the intermediate types prove
|
|
74
|
-
// the stream (not just a final blob) was fanned out.
|
|
75
|
-
await c.waitFrame((f) => f.type === 'agent_end' && frameHas(f, token), 'G1 agent_end carrying the prompt token');
|
|
76
|
-
for (const t of ['message_start', 'message_update', 'tool_execution_start', 'tool_execution_update', 'tool_execution_end', 'message_end', 'turn_end', 'agent_start', 'turn_start']) {
|
|
77
|
-
assert.ok(c.frames.some((f) => f.type === t), `G1: client received a relayed ${t} frame`);
|
|
78
|
-
}
|
|
79
|
-
assert.ok(c.frames.some((f) => f.type === 'message_start' && frameHas(f, token)), 'G1: a relayed message carries the prompt token');
|
|
80
|
-
});
|
|
81
|
-
// G1b — message_update coalescing preserves ordering (regression for the F2
|
|
82
|
-
// attach typing-lag fix, 2026-06-09). The broker holds the latest message_update
|
|
83
|
-
// on a ~75ms timer; any OTHER event must flush it FIRST, so a viewer can never
|
|
84
|
-
// observe message_update AFTER its message_end (which would resurrect stale
|
|
85
|
-
// streaming text over the final message), and the LAST coalesced update must not
|
|
86
|
-
// be silently dropped at end-of-turn. Failure modes: a flush ordered after the
|
|
87
|
-
// non-update event, or a pending update discarded when message_end wins the race.
|
|
88
|
-
test('G1b — coalesced message_update never arrives after message_end; updates still relayed', async () => {
|
|
89
|
-
const c = await ctrl('g1b-ctrl');
|
|
90
|
-
const token = tok('G1B');
|
|
91
|
-
// 12 updates at the fake engine's setImmediate pace — far faster than the 75ms
|
|
92
|
-
// coalesce window, so coalescing genuinely engages (fewer relayed than emitted).
|
|
93
|
-
h.fakeCmd(id, { cmd: 'stream', text: token, updates: 12 });
|
|
94
|
-
await c.waitFrame((f) => f.type === 'agent_end' && frameHas(f, token), 'G1b turn relayed');
|
|
95
|
-
const types = c.frames.map((f) => f.type);
|
|
96
|
-
const lastUpdate = types.lastIndexOf('message_update');
|
|
97
|
-
const msgEnd = types.indexOf('message_end');
|
|
98
|
-
assert.ok(lastUpdate >= 0, 'G1b: at least one message_update relayed (coalescing must not starve updates)');
|
|
99
|
-
assert.ok(msgEnd >= 0, 'G1b: message_end relayed');
|
|
100
|
-
const updates = c.frames.filter((frame) => frame.type === 'message_update');
|
|
101
|
-
assert.ok(updates.length < 12, `G1b: ${updates.length} relayed updates proves the 12-update burst was coalesced`);
|
|
102
|
-
for (const update of updates) {
|
|
103
|
-
assert.equal(update.message.role, 'assistant', 'G1b: crouter relays the in-process cumulative message_update contract');
|
|
104
|
-
assert.ok('partial' in update.assistantMessageEvent, 'G1b: crouter does not route pi JSON/RPC delta-only events through view.sock');
|
|
105
|
-
}
|
|
106
|
-
assert.ok(lastUpdate < msgEnd, `G1b: a message_update arrived AFTER message_end (update@${lastUpdate} vs end@${msgEnd}) — the coalescer flushed out of order`);
|
|
107
|
-
// tool/turn/agent frames must also never precede a stale held update.
|
|
108
|
-
for (const t of ['tool_execution_start', 'turn_end', 'agent_end']) {
|
|
109
|
-
const i = types.indexOf(t);
|
|
110
|
-
assert.ok(i < 0 || lastUpdate < i, `G1b: message_update relayed after ${t}`);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
// G2 — detach leaves the engine running. Guards: `bye`/close drops ONE listener,
|
|
114
|
-
// never the engine. Failure mode: a detach that disposes the broker/engine.
|
|
115
|
-
test('G2 — detach (bye+close) leaves the broker alive + the engine still emitting; engine pid unchanged', async () => {
|
|
116
|
-
const pid = brokerPid();
|
|
117
|
-
const boots = h.bootCount(id);
|
|
118
|
-
const c = await ctrl('g2-ctrl');
|
|
119
|
-
const p = tok('G2-PROMPT');
|
|
120
|
-
c.send({ type: 'prompt', text: p });
|
|
121
|
-
await c.waitFrame((f) => f.type === 'agent_end' && frameHas(f, p), 'G2 turn relayed before detach');
|
|
122
|
-
c.send({ type: 'bye' });
|
|
123
|
-
c.close();
|
|
124
|
-
await delay(300); // let the broker process the 'close'
|
|
125
|
-
assert.equal(isPidAlive(pid), true, 'G2: broker still alive after detach');
|
|
126
|
-
assert.equal(brokerPid(), pid, 'G2: engine (== broker) pid UNCHANGED across detach');
|
|
127
|
-
assert.equal(h.bootCount(id), boots, 'G2: no reboot — no second engine spawned');
|
|
128
|
-
// Still emitting: drive a turn with no client, then a fresh observer's snapshot
|
|
129
|
-
// carries it (the engine kept running and processing after the detach).
|
|
130
|
-
const after = tok('G2-AFTER-DETACH');
|
|
131
|
-
h.fakeCmd(id, { cmd: 'stream', text: after });
|
|
132
|
-
const o = await attachUntil(id, 'observer', 'g2-obs', (a) => JSON.stringify(a.welcome.snapshot.messages).includes(after), 'G2 post-detach message in snapshot');
|
|
133
|
-
assert.ok(o.welcome.snapshot.messages.length > 0, 'G2: the engine produced a message after the detach');
|
|
134
|
-
assert.equal(isPidAlive(pid), true, 'G2: broker still alive after the post-detach turn');
|
|
135
|
-
});
|
|
136
|
-
// G3 — the interactive `deliver` ack reports the ENGINE CALL's real outcome, not
|
|
137
|
-
// the fact that a call was routed. A `session.prompt()` that REJECTS outright —
|
|
138
|
-
// the shape a broker whose model resolved but whose provider has no installed
|
|
139
|
-
// credential produces ("No API key found for anthropic") — used to still ack
|
|
140
|
-
// ok:true, so crtrd returned `delivered:true, delivered_via:engine` for a message
|
|
141
|
-
// the engine had refused and the one-shot client closed before the error frame
|
|
142
|
-
// arrived: the message vanished with no trace. The ack now races acceptance (the
|
|
143
|
-
// engine's own agent_start) against rejection and records
|
|
144
|
-
// `broker.prompt.deliver_failed` in the node's job/log.jsonl. Shares this file's
|
|
145
|
-
// one broker: the contract is two frames on an attached controller.
|
|
146
|
-
test('G3 — a deliver whose prompt rejects acks ok:false and records deliver_failed; a succeeding deliver acks ok:true via prompt', async () => {
|
|
147
|
-
// Both delivers must route as `prompt` (idle), never `steer` — the steer route
|
|
148
|
-
// legitimately acks at routing time — so attach only once the engine is idle.
|
|
149
|
-
const c = await attachUntil(id, 'controller', 'g3-ctrl', (a) => a.welcome.role === 'controller' && a.welcome.snapshot.state.isStreaming === false, 'G3 controller admitted while the engine is idle');
|
|
150
|
-
// FAILURE: the engine refuses the call itself. Before the fix this acked
|
|
151
|
-
// ok:true and the rejection left no trace in the node's log.
|
|
152
|
-
c.send({ type: 'deliver', id: 'd-fail', text: `do a thing ${REJECT_PROMPT_CALL}` });
|
|
153
|
-
const failAck = await c.waitFrame((f) => f.type === 'ack' && f.for === 'deliver' && f.id === 'd-fail', 'G3 rejected deliver ack');
|
|
154
|
-
assert.equal(failAck.type === 'ack' && failAck.ok, false, 'G3: a rejected prompt must not ack delivered:true');
|
|
155
|
-
assert.match((failAck.type === 'ack' ? failAck.detail : undefined) ?? '', /No API key found/, 'G3: the ack detail carries the engine rejection');
|
|
156
|
-
await h.waitFor(() => (brokerLogText(h, id).includes('broker.prompt.deliver_failed') ? true : null), { label: 'G3 broker.prompt.deliver_failed recorded in job/log.jsonl' });
|
|
157
|
-
// POSITIVE CONTROL: an ordinary deliver still acks ok:true from acceptance
|
|
158
|
-
// (the engine's agent_start), detail naming the prompt route.
|
|
159
|
-
c.send({ type: 'deliver', id: 'd-ok', text: 'an ordinary interactive message' });
|
|
160
|
-
const okAck = await c.waitFrame((f) => f.type === 'ack' && f.for === 'deliver' && f.id === 'd-ok', 'G3 accepted deliver ack');
|
|
161
|
-
assert.equal(okAck.type === 'ack' && okAck.ok, true, 'G3: an accepted prompt acks delivered:true');
|
|
162
|
-
assert.equal(okAck.type === 'ack' ? okAck.detail : undefined, 'prompt');
|
|
163
|
-
});
|
|
164
|
-
// A message_end is only a broker/viewer relay. It must not depend on a daemon
|
|
165
|
-
// read: a daemon outage after boot leaves tool results and the run settlement intact.
|
|
166
|
-
test('G4 — a daemon read failure after boot does not interrupt a tool result or its settlement', async () => {
|
|
167
|
-
const c = await ctrl('g4-ctrl');
|
|
168
|
-
const pid = brokerPid();
|
|
169
|
-
await h.stopApiServer();
|
|
170
|
-
const token = tok('G4-TOOL-RESULT');
|
|
171
|
-
h.fakeCmd(id, { cmd: 'stream', text: token, updates: 0 });
|
|
172
|
-
await c.waitFrame((f) => f.type === 'tool_execution_end', 'G4 tool result relayed after the daemon server exits');
|
|
173
|
-
await c.waitFrame((f) => f.type === 'agent_settled', 'G4 run settles after the daemon server exits');
|
|
174
|
-
await delay(200);
|
|
175
|
-
assert.equal(isPidAlive(pid), true, 'G4: broker remains alive after relaying and settling the tool result');
|
|
176
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
// Run with: npm run build && node --test dist/core/__tests__/seam/broker-cap-freeze.test.js
|
|
2
|
-
//
|
|
3
|
-
// The cap as the host actually meets it: real broker processes, the real
|
|
4
|
-
// ledger, and the real supervision tick. With CRTR_MAX_LIVE_BROKERS=2 a third
|
|
5
|
-
// birth gets no engine at all — the row exists, carries the durable wait mark,
|
|
6
|
-
// and holds no pid — and it survives repeated saturated ticks rather than being
|
|
7
|
-
// written off as a boot failure. When a live node finishes and gives its slot
|
|
8
|
-
// back, the next tick spends that slot on the waiting row and retires the mark.
|
|
9
|
-
//
|
|
10
|
-
// This is the whole point of P3, and none of it is observable without real
|
|
11
|
-
// processes: the freeze is decided at the launch seam and the thaw is decided
|
|
12
|
-
// by the daemon pass, so it belongs in the compiled seam tier.
|
|
13
|
-
import { after, before, test } from 'node:test';
|
|
14
|
-
import assert from 'node:assert/strict';
|
|
15
|
-
import { createNode } from '../../canvas/canvas.js';
|
|
16
|
-
import { closeDb } from '../../canvas/db.js';
|
|
17
|
-
import { resetSession } from '../../canvas/sessions.js';
|
|
18
|
-
import { isPidAlive } from '../../canvas/pid.js';
|
|
19
|
-
import { enqueueNodeMail } from '../../feed/messages.js';
|
|
20
|
-
import { closeNode } from '../../runtime/close.js';
|
|
21
|
-
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
22
|
-
import { transition } from '../../runtime/lifecycle.js';
|
|
23
|
-
import { reviveNode } from '../../runtime/revive.js';
|
|
24
|
-
import { spawnChild } from '../../runtime/spawn.js';
|
|
25
|
-
import { createHarness } from '../helpers/harness.js';
|
|
26
|
-
let h;
|
|
27
|
-
let root;
|
|
28
|
-
before(async () => {
|
|
29
|
-
// Read per launch by brokerThresholdsForDaemon(), so setting it before the
|
|
30
|
-
// harness boots covers every launch this file drives.
|
|
31
|
-
process.env['CRTR_MAX_LIVE_BROKERS'] = '2';
|
|
32
|
-
h = await createHarness({ headless: true, sessionPrefix: 'crtr-broker-cap' });
|
|
33
|
-
root = h.spawnRoot('broker cap suite root');
|
|
34
|
-
});
|
|
35
|
-
after(async () => {
|
|
36
|
-
if (h !== undefined)
|
|
37
|
-
await h.dispose();
|
|
38
|
-
delete process.env['CRTR_MAX_LIVE_BROKERS'];
|
|
39
|
-
});
|
|
40
|
-
test('node new reports a frozen delegated birth without claiming its broker started', { timeout: 120_000 }, async () => {
|
|
41
|
-
const created = [];
|
|
42
|
-
try {
|
|
43
|
-
for (const prompt of ['first API child', 'second API child']) {
|
|
44
|
-
const result = h.cli(root, ['--json', 'node', 'new', '--kind', 'general', prompt]);
|
|
45
|
-
assert.equal(result.code, 0, `node new should succeed\n${result.stderr}`);
|
|
46
|
-
const nodeId = result.json.node_id;
|
|
47
|
-
created.push(nodeId);
|
|
48
|
-
await h.awaitBoot(nodeId);
|
|
49
|
-
}
|
|
50
|
-
const frozen = h.cli(root, ['--json', 'node', 'new', '--kind', 'general', 'frozen API child']);
|
|
51
|
-
assert.equal(frozen.code, 0, `node new should record the frozen birth\n${frozen.stderr}`);
|
|
52
|
-
const output = frozen.json;
|
|
53
|
-
created.push(output.node_id);
|
|
54
|
-
assert.ok(output.frozen_at !== undefined, 'JSON reports the durable frozen birth detail');
|
|
55
|
-
assert.match(output.follow_up, /Child row exists, but no broker started because capacity is full/);
|
|
56
|
-
const prose = h.cli(root, ['node', 'new', '--kind', 'general', 'another frozen API child']);
|
|
57
|
-
assert.equal(prose.code, 0, `node new should report capacity in prose\n${prose.stderr}`);
|
|
58
|
-
assert.match(prose.stdout, /Child row exists, but no broker started because capacity is full/);
|
|
59
|
-
const proseNode = prose.stdout.match(/\(([^)]+)\)/)?.[1];
|
|
60
|
-
assert.ok(proseNode !== undefined, 'prose names the created frozen row');
|
|
61
|
-
created.push(proseNode);
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
for (const nodeId of created)
|
|
65
|
-
h.cli(root, ['node', 'lifecycle', 'close', '--node', nodeId]);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
test('a birth at the cap freezes instead of booting, survives saturated ticks, and thaws when a slot frees', { timeout: 120_000 }, async () => {
|
|
69
|
-
const first = await h.spawnHeadlessChild(root, 'first live child');
|
|
70
|
-
const second = await h.spawnHeadlessChild(root, 'second live child');
|
|
71
|
-
assert.equal(h.fleet.size(), 2, 'precondition: both slots are held by real brokers');
|
|
72
|
-
// The third birth meets a full ledger. spawnChild returns rather than
|
|
73
|
-
// crashing the row: a node that only has to wait is not a failed launch.
|
|
74
|
-
const born = await spawnChild({
|
|
75
|
-
kind: 'general',
|
|
76
|
-
cwd: h.node(first).cwd,
|
|
77
|
-
prompt: 'third child, born at the cap',
|
|
78
|
-
parent: root,
|
|
79
|
-
});
|
|
80
|
-
closeDb();
|
|
81
|
-
const third = born.node.node_id;
|
|
82
|
-
assert.equal(born.frozen, true, 'the birth reports that it got no engine');
|
|
83
|
-
const frozenRow = h.node(third);
|
|
84
|
-
assert.ok(frozenRow.frozen_at != null, 'the row carries the durable wait mark');
|
|
85
|
-
assert.equal(frozenRow.pi_pid ?? null, null, 'no pid was ever recorded — status surfaces read frozen, not stale-active');
|
|
86
|
-
assert.equal(h.fleet.has(third), false, 'no broker process exists for the frozen row');
|
|
87
|
-
assert.equal(h.bootCount(third), 0, 'nothing booted');
|
|
88
|
-
// Six saturated ticks: the cap is not a failure, so nothing is charged
|
|
89
|
-
// against the row and nothing terminalizes it.
|
|
90
|
-
for (let i = 0; i < 6; i++)
|
|
91
|
-
await h.tick();
|
|
92
|
-
closeDb();
|
|
93
|
-
const survived = h.node(third);
|
|
94
|
-
assert.equal(survived.status, 'active', 'six saturated ticks leave the row alive and still owed an engine');
|
|
95
|
-
assert.equal(survived.respawn_failures ?? 0, 0, 'waiting for a slot is not a respawn failure');
|
|
96
|
-
assert.equal(survived.frozen_at, frozenRow.frozen_at, 'the original wait timestamp survives — the thaw order reads it');
|
|
97
|
-
assert.equal(h.fleet.size(), 2, 'the two live brokers were never disturbed');
|
|
98
|
-
// Finish one node: its broker exits and gives the slot back.
|
|
99
|
-
const firstPid = h.node(first).pi_pid;
|
|
100
|
-
closeNode(first, { rootEvent: 'finish' });
|
|
101
|
-
closeDb();
|
|
102
|
-
await h.awaitFleetExit(first);
|
|
103
|
-
assert.equal(h.fleet.size(), 1, 'the finished node released its slot');
|
|
104
|
-
// The next tick spends the freed slot on the waiting row.
|
|
105
|
-
await h.tick();
|
|
106
|
-
closeDb();
|
|
107
|
-
await h.awaitBoot(third);
|
|
108
|
-
closeDb();
|
|
109
|
-
const thawed = h.node(third);
|
|
110
|
-
assert.equal(thawed.frozen_at ?? null, null, 'the launch retired the wait mark');
|
|
111
|
-
assert.ok(thawed.pi_pid != null && isPidAlive(thawed.pi_pid), 'the thawed node holds a live broker');
|
|
112
|
-
assert.equal(h.fleet.has(third), true, 'the freed slot is now the thawed node\u2019s');
|
|
113
|
-
assert.equal(h.fleet.has(second), true, 'the untouched live node kept its slot throughout');
|
|
114
|
-
assert.notEqual(thawed.pi_pid, firstPid, 'the thaw is a real new broker, not the finished node\u2019s pid lingering');
|
|
115
|
-
transition(second, 'park');
|
|
116
|
-
headlessBrokerHost.teardown(second);
|
|
117
|
-
await h.awaitFleetExit(second);
|
|
118
|
-
const filler = await h.spawnHeadlessChild(root, 'terminal thaw filler');
|
|
119
|
-
assert.equal(h.fleet.size(), 2, 'the parked target is non-live while the cap remains full');
|
|
120
|
-
enqueueNodeMail(second, { senderNodeId: root, kind: 'message', label: 'durable wake', urgency: 'normal', wake: 1 });
|
|
121
|
-
assert.equal((await reviveNode(second, { resume: true, capacity: 'freeze' })).outcome, 'frozen');
|
|
122
|
-
closeDb();
|
|
123
|
-
const frozenTerminal = h.node(second);
|
|
124
|
-
assert.equal(frozenTerminal.status, 'done', 'freezing preserves the terminal status');
|
|
125
|
-
assert.equal(frozenTerminal.intent, 'parked', 'freezing preserves the terminal intent');
|
|
126
|
-
assert.ok(frozenTerminal.frozen_at != null, 'the durable wake remains in the bounded terminal tick population');
|
|
127
|
-
headlessBrokerHost.teardown(filler);
|
|
128
|
-
await h.awaitFleetExit(filler);
|
|
129
|
-
await h.tick();
|
|
130
|
-
await h.awaitBoot(second, { minCount: 2 });
|
|
131
|
-
closeDb();
|
|
132
|
-
assert.equal(h.node(second).frozen_at ?? null, null, 'a freed slot thaws the frozen terminal wake');
|
|
133
|
-
assert.equal(h.fleet.has(second), true, 'the terminal wake receives the freed slot');
|
|
134
|
-
createNode({
|
|
135
|
-
node_id: 'resident-drain',
|
|
136
|
-
name: 'resident drain',
|
|
137
|
-
kind: 'general',
|
|
138
|
-
mode: 'base',
|
|
139
|
-
lifecycle: 'resident',
|
|
140
|
-
status: 'done',
|
|
141
|
-
intent: 'parked',
|
|
142
|
-
cwd: h.node(third).cwd,
|
|
143
|
-
host_kind: 'broker',
|
|
144
|
-
parent: root,
|
|
145
|
-
created: new Date().toISOString(),
|
|
146
|
-
});
|
|
147
|
-
resetSession('resident-drain', { sessionId: 'resident-drain-session', transcriptPath: null });
|
|
148
|
-
assert.equal((await reviveNode('resident-drain', { resume: true, capacity: 'freeze' })).outcome, 'frozen');
|
|
149
|
-
await h.tick();
|
|
150
|
-
closeDb();
|
|
151
|
-
const drained = h.node('resident-drain');
|
|
152
|
-
assert.equal(drained.status, 'idle', 'an eligible resident drains to Dormant');
|
|
153
|
-
assert.equal(drained.frozen_at ?? null, null, 'draining retires the frozen mark');
|
|
154
|
-
assert.equal(h.fleet.size(), 2, 'the drain does not spend a live-broker slot');
|
|
155
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|