@north-light/crouter 0.3.172 → 0.3.174
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/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -85,48 +85,6 @@ function row(id) {
|
|
|
85
85
|
pane: null,
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
-
test('dashboardRowsAllFromSource shows a node watched through its live broker', async () => {
|
|
89
|
-
const localRow = row('watched');
|
|
90
|
-
mkdirSync(jobDir('watched'), { recursive: true });
|
|
91
|
-
writeFileSync(join(jobDir('watched'), 'attach.json'), JSON.stringify({ viewers: 1 }));
|
|
92
|
-
const source = {
|
|
93
|
-
getNode: async () => meta('watched'),
|
|
94
|
-
getRow: async () => localRow,
|
|
95
|
-
listNodes: async () => [localRow],
|
|
96
|
-
subscriptionsOf: async () => [],
|
|
97
|
-
subscribersOf: async () => [],
|
|
98
|
-
view: async () => [],
|
|
99
|
-
ticketCountsForView: async () => ({}),
|
|
100
|
-
hasActiveLiveSubscription: async () => false,
|
|
101
|
-
};
|
|
102
|
-
const rows = await dashboardRowsAllFromSource(source);
|
|
103
|
-
assert.equal(rows[0]?.viewed, true);
|
|
104
|
-
});
|
|
105
|
-
test('enrichRowsFromSource serializes a full dashboard source read', async () => {
|
|
106
|
-
const nodeRows = ['a', 'b', 'c'].map(row);
|
|
107
|
-
let inFlight = 0;
|
|
108
|
-
let maxInFlight = 0;
|
|
109
|
-
const source = {
|
|
110
|
-
getNode: async (id) => {
|
|
111
|
-
inFlight++;
|
|
112
|
-
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
113
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
114
|
-
inFlight--;
|
|
115
|
-
return meta(id);
|
|
116
|
-
},
|
|
117
|
-
getRow: async () => null,
|
|
118
|
-
listNodes: async () => nodeRows,
|
|
119
|
-
subscriptionsOf: async () => [],
|
|
120
|
-
subscribersOf: async () => [],
|
|
121
|
-
view: async () => [],
|
|
122
|
-
ticketCountsForView: async () => ({}),
|
|
123
|
-
hasActiveLiveSubscription: async () => false,
|
|
124
|
-
};
|
|
125
|
-
const rows = await dashboardRowsAllFromSource(source);
|
|
126
|
-
await enrichRowsFromSource(source, rows);
|
|
127
|
-
assert.equal(maxInFlight, 1);
|
|
128
|
-
assert.deepEqual(rows.map((entry) => entry.name), ['a', 'b', 'c']);
|
|
129
|
-
});
|
|
130
88
|
let home;
|
|
131
89
|
let localCwd;
|
|
132
90
|
let sessionFile;
|
|
@@ -207,8 +165,7 @@ test('dashboardRowsAllFromSource / enrichRowsFromSource / loadPreviewFromSource
|
|
|
207
165
|
return { status: 500, body: {} };
|
|
208
166
|
});
|
|
209
167
|
// Register the close BEFORE any assertion runs — a listening server left
|
|
210
|
-
// open by a thrown assertion keeps this test file's process alive forever
|
|
211
|
-
// (see the CI-hang postmortem on rebuild-coalescer.test.ts).
|
|
168
|
+
// open by a thrown assertion keeps this test file's process alive forever.
|
|
212
169
|
t.after(() => server.close());
|
|
213
170
|
const source = new RemoteCanvasSource(server.url, 'tok');
|
|
214
171
|
const rows = await dashboardRowsAllFromSource(source);
|
|
@@ -227,14 +184,12 @@ test('dashboardRowsAllFromSource / enrichRowsFromSource / loadPreviewFromSource
|
|
|
227
184
|
assert.equal(previewed.lastAssistant, undefined, 'a local session transcript must not leak into a remote preview');
|
|
228
185
|
assert.equal(previewed.previewLoaded, true);
|
|
229
186
|
});
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
// `
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
// telemetry/ask/fault reads into the static forest renderer specifically would
|
|
237
|
-
// pass that test while still leaking poisoned local state here.
|
|
187
|
+
// `renderForestFromSource` is a separate path from
|
|
188
|
+
// `dashboardRowsAllFromSource`/`enrichRowsFromSource`/`loadPreviewFromSource`
|
|
189
|
+
// above, with its own remote suppression in `renderTreeFromSource`/
|
|
190
|
+
// `nodeLineFromSource` (render.ts). The poisoned-state test above never
|
|
191
|
+
// exercises it, so a regression that reintroduced local telemetry/ask/fault
|
|
192
|
+
// reads into the static forest renderer would still leak poisoned local state.
|
|
238
193
|
test('renderForestFromSource suppresses local-read fields (ctx, asks, hanging) for a RemoteCanvasSource, even with conflicting local state for the same node id', async (t) => {
|
|
239
194
|
const sf = seedPoisonedLocalState();
|
|
240
195
|
const server = await startMockCrtrServer((args) => {
|
|
@@ -1,34 +1,19 @@
|
|
|
1
1
|
import type { CanvasSource } from '../source.js';
|
|
2
|
-
import type { RemoteEventStream } from '../remote-event-stream.js';
|
|
3
|
-
import { type CoalescedRebuilder } from './rebuild-coalescer.js';
|
|
4
2
|
import { type BindingId, type BindingResolution, type RawTerminalInput } from '../../keybindings/index.js';
|
|
5
3
|
declare const BROWSE_NAV_ACTIONS: readonly ["crtr.browse.quit", "crtr.browse.down", "crtr.browse.up", "crtr.browse.first", "crtr.browse.last", "crtr.browse.expand-or-child", "crtr.browse.collapse-or-parent", "crtr.browse.toggle-fold", "crtr.browse.tab-next", "crtr.browse.tab-previous", "crtr.browse.tab.1", "crtr.browse.tab.2", "crtr.browse.tab.3", "crtr.browse.tab.4", "crtr.browse.tab.5", "crtr.browse.close-subtree", "crtr.browse.sort", "crtr.browse.scope", "crtr.browse.profile", "crtr.browse.residents", "crtr.browse.preview", "crtr.browse.search", "crtr.browse.revive-now", "crtr.browse.focus", "crtr.browse.focus-background"];
|
|
6
4
|
declare const BROWSE_SEARCH_ACTIONS: readonly ["crtr.browse.search.cancel", "crtr.browse.search.commit", "crtr.browse.search.delete", "crtr.browse.search.quit"];
|
|
7
5
|
export declare function resolveBrowseNavAction(bindings: BindingResolution<BindingId>, raw: RawTerminalInput): (typeof BROWSE_NAV_ACTIONS)[number] | null;
|
|
8
6
|
export declare function resolveBrowseSearchAction(bindings: BindingResolution<BindingId>, raw: RawTerminalInput): (typeof BROWSE_SEARCH_ACTIONS)[number] | null;
|
|
9
|
-
/** Wires a RemoteEventStream's `nodes`/`inbox` events through the coalescer
|
|
10
|
-
* (`rebuild-coalescer.ts`) so a burst of SSE events collapses to ONE rebuild
|
|
11
|
-
* round, never one N+1 remote-subprocess rebuild per event. Exported (rather
|
|
12
|
-
* than left inline in `runBrowse`) so the coalescer integration test can
|
|
13
|
-
* drive this ACTUAL wiring, not just `createCoalescedRebuilder` in isolation
|
|
14
|
-
* — the test asserts this function routes through the coalescer rather than
|
|
15
|
-
* calling `rebuild()` directly per event. */
|
|
16
|
-
export declare function wireEventStreamRebuild(eventStream: Pick<RemoteEventStream, 'subscribe' | 'start'>, rebuild: () => Promise<void>): {
|
|
17
|
-
rebuilder: CoalescedRebuilder;
|
|
18
|
-
unsubscribe: () => void;
|
|
19
|
-
};
|
|
20
7
|
export declare function runBrowse(opts: {
|
|
21
8
|
returnPane?: string;
|
|
22
9
|
cwd?: string;
|
|
23
10
|
/** Profile to show initially. Undefined means no profile is selected, so the
|
|
24
11
|
* initial view includes all profiles and the profile toggle is unavailable. */
|
|
25
12
|
profileId?: string;
|
|
26
|
-
/** The read source
|
|
27
|
-
* (`cliCanvasSource`/remote); no in-process openDb fallback exists here. */
|
|
13
|
+
/** The local API-backed read source. No in-process openDb fallback exists here. */
|
|
28
14
|
source: CanvasSource;
|
|
29
|
-
eventStream?: RemoteEventStream;
|
|
30
15
|
/** Local viewer registry projection. Kept separate from CanvasSource because
|
|
31
|
-
* focus rows describe this machine's screens
|
|
16
|
+
* focus rows describe this machine's screens. */
|
|
32
17
|
viewedNodeIds?: () => Promise<ReadonlySet<string>>;
|
|
33
18
|
/** Route the `x` close-out through the daemon API (the CLI injects
|
|
34
19
|
* `cliClient().closeNode(id, { finish: true })`). Kept as a callback so this
|
|
@@ -10,11 +10,9 @@
|
|
|
10
10
|
import { execFileSync } from 'node:child_process';
|
|
11
11
|
import { resolve } from 'node:path';
|
|
12
12
|
import { dashboardRowsAllFromSource, enrichRowsFromSource, loadPreviewFromSource, renderForestFromSource } from '../render-source.js';
|
|
13
|
-
import { RemoteCanvasSource } from '../remote-canvas-source.js';
|
|
14
13
|
import { setupTerminal, restoreTerminal, getTerminalSize, parseKeypress, } from '../../tui/terminal.js';
|
|
15
14
|
import { buildTree, flatten, pruneNode, TABS } from './model.js';
|
|
16
15
|
import { loadPins, savePins } from './pins.js';
|
|
17
|
-
import { createCoalescedRebuilder } from './rebuild-coalescer.js';
|
|
18
16
|
import { matchesTerminalInput, resolveUserKeybindings, } from '../../keybindings/index.js';
|
|
19
17
|
const BROWSE_NAV_ACTIONS = [
|
|
20
18
|
'crtr.browse.quit', 'crtr.browse.down', 'crtr.browse.up', 'crtr.browse.first', 'crtr.browse.last',
|
|
@@ -49,22 +47,8 @@ function viewportHeight(rowsTotal, inputLine, previewOn) {
|
|
|
49
47
|
const previewH = previewOn ? PREVIEW_HEIGHT : 0;
|
|
50
48
|
return Math.max(1, rows - headerHeight(inputLine) - 1 /* footer */ - previewH);
|
|
51
49
|
}
|
|
52
|
-
/** Wires a RemoteEventStream's `nodes`/`inbox` events through the coalescer
|
|
53
|
-
* (`rebuild-coalescer.ts`) so a burst of SSE events collapses to ONE rebuild
|
|
54
|
-
* round, never one N+1 remote-subprocess rebuild per event. Exported (rather
|
|
55
|
-
* than left inline in `runBrowse`) so the coalescer integration test can
|
|
56
|
-
* drive this ACTUAL wiring, not just `createCoalescedRebuilder` in isolation
|
|
57
|
-
* — the test asserts this function routes through the coalescer rather than
|
|
58
|
-
* calling `rebuild()` directly per event. */
|
|
59
|
-
export function wireEventStreamRebuild(eventStream, rebuild) {
|
|
60
|
-
const rebuilder = createCoalescedRebuilder(rebuild);
|
|
61
|
-
const unsubscribe = eventStream.subscribe(() => rebuilder.trigger());
|
|
62
|
-
eventStream.start();
|
|
63
|
-
return { rebuilder, unsubscribe };
|
|
64
|
-
}
|
|
65
50
|
export async function runBrowse(opts) {
|
|
66
51
|
const source = opts.source;
|
|
67
|
-
const isRemote = source instanceof RemoteCanvasSource;
|
|
68
52
|
const bindings = resolveUserKeybindings();
|
|
69
53
|
// No TTY → print the static forest and exit 0 (no raw mode).
|
|
70
54
|
if (!process.stdin.isTTY) {
|
|
@@ -73,25 +57,20 @@ export async function runBrowse(opts) {
|
|
|
73
57
|
}
|
|
74
58
|
// Snapshot the canvas. Drop kind:'human' control-plane decks — they have no pi
|
|
75
59
|
// session, so `surface node focus` refuses them; they are never a navigation/resume
|
|
76
|
-
// target (mirrors the surface-node focus guard).
|
|
77
|
-
// listener below can re-pull the tree on a `nodes`/`inbox` event instead of
|
|
78
|
-
// recomputing over a stale snapshot.
|
|
60
|
+
// target (mirrors the surface-node focus guard).
|
|
79
61
|
let rows;
|
|
80
62
|
let nodeRows;
|
|
81
63
|
let rootIds;
|
|
82
64
|
let childIds;
|
|
83
65
|
let tree;
|
|
84
66
|
let totalNodes;
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
// does below) — fetched once per snapshot rebuild, not per flush/keystroke, so
|
|
90
|
-
// enrichRowsFromSource's per-row loop stays a pure sync-shaped map lookup.
|
|
91
|
-
let remoteAskCounts = {};
|
|
67
|
+
// Pending human-ticket counts per node, merged from one `ticketCountsForView`
|
|
68
|
+
// call per forest root. Fetch once per snapshot rebuild, not per flush or
|
|
69
|
+
// keystroke, so enrichRowsFromSource's per-row loop stays a pure map lookup.
|
|
70
|
+
let askCounts = {};
|
|
92
71
|
const rebuildSnapshot = async () => {
|
|
93
72
|
let viewedNodeIds = new Set();
|
|
94
|
-
if (
|
|
73
|
+
if (opts.viewedNodeIds !== undefined) {
|
|
95
74
|
try {
|
|
96
75
|
viewedNodeIds = await opts.viewedNodeIds();
|
|
97
76
|
}
|
|
@@ -110,11 +89,9 @@ export async function runBrowse(opts) {
|
|
|
110
89
|
tree = buildTree(rows, rootIds, (id) => childIds.get(id) ?? []);
|
|
111
90
|
totalNodes = tree.nodes.size;
|
|
112
91
|
// Ask counts per node, merged from one `ticketCountsForView` call per root
|
|
113
|
-
// (covers the whole canvas — rootIds is every non-human root).
|
|
114
|
-
// the local API source and a remote canvas, since neither can do a per-node
|
|
115
|
-
// openDb ticket scan; feeds enrichRowsFromSource's per-row map lookup.
|
|
92
|
+
// (covers the whole canvas — rootIds is every non-human root).
|
|
116
93
|
const maps = await Promise.all(rootIds.map((root) => source.ticketCountsForView(root).catch(() => ({}))));
|
|
117
|
-
|
|
94
|
+
askCounts = Object.assign({}, ...maps);
|
|
118
95
|
};
|
|
119
96
|
await rebuildSnapshot();
|
|
120
97
|
// The launch dir is retained only as the optional cwd filter target. Browse opens
|
|
@@ -164,43 +141,10 @@ export async function runBrowse(opts) {
|
|
|
164
141
|
restoreTerminal();
|
|
165
142
|
}
|
|
166
143
|
catch { /* best-effort */ }
|
|
167
|
-
unsubscribeEventStream?.();
|
|
168
|
-
rebuilder?.stop();
|
|
169
|
-
opts.eventStream?.stop();
|
|
170
144
|
};
|
|
171
145
|
// Safety net: an uncaught throw in the (un-unit-tested) keystroke path must
|
|
172
146
|
// never strand the tty in raw + alt-screen + hidden-cursor.
|
|
173
147
|
process.once('exit', cleanup);
|
|
174
|
-
// Remote-only live invalidation: `canvas browse` has no local fs-watch/poll to
|
|
175
|
-
// replace (there is none — this is a one-shot snapshot TUI, re-rendering only
|
|
176
|
-
// on keystrokes). This is net-new plumbing for the remote case only: when a
|
|
177
|
-
// pre-built RemoteEventStream is threaded in (canvas-browse.ts, once it has
|
|
178
|
-
// already resolved the target's credentials), a `nodes`/`inbox` SSE event
|
|
179
|
-
// invalidates the remote source's cache and triggers the same recompute +
|
|
180
|
-
// coalesced repaint a keystroke would. The local (no eventStream) path is
|
|
181
|
-
// untouched.
|
|
182
|
-
let unsubscribeEventStream;
|
|
183
|
-
let rebuilder;
|
|
184
|
-
if (opts.eventStream !== undefined) {
|
|
185
|
-
if (source instanceof RemoteCanvasSource)
|
|
186
|
-
source.invalidate();
|
|
187
|
-
// `trigger()` debounces a burst into one rebuild, and single-flights it
|
|
188
|
-
// against an already-in-flight rebuild — see wireEventStreamRebuild above.
|
|
189
|
-
const wired = wireEventStreamRebuild(opts.eventStream, async () => {
|
|
190
|
-
try {
|
|
191
|
-
if (source instanceof RemoteCanvasSource)
|
|
192
|
-
source.invalidate();
|
|
193
|
-
await rebuildSnapshot();
|
|
194
|
-
recompute(curRow()?.id);
|
|
195
|
-
scheduleFlush();
|
|
196
|
-
}
|
|
197
|
-
catch (err) {
|
|
198
|
-
logAsyncFailure('SSE rebuild failed', err);
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
rebuilder = wired.rebuilder;
|
|
202
|
-
unsubscribeEventStream = wired.unsubscribe;
|
|
203
|
-
}
|
|
204
148
|
const logAsyncFailure = (label, err) => {
|
|
205
149
|
process.stderr.write(`[crtr browse] ${label}: ${String(err?.message ?? err)}\n`);
|
|
206
150
|
};
|
|
@@ -287,7 +231,7 @@ export async function runBrowse(opts) {
|
|
|
287
231
|
if (r !== undefined)
|
|
288
232
|
slice.push(r);
|
|
289
233
|
}
|
|
290
|
-
await enrichRowsFromSource(source, slice,
|
|
234
|
+
await enrichRowsFromSource(source, slice, askCounts);
|
|
291
235
|
const cur = curRow();
|
|
292
236
|
if (cur !== undefined) {
|
|
293
237
|
const r = rowOf(cur.id);
|
|
@@ -302,7 +246,7 @@ export async function runBrowse(opts) {
|
|
|
302
246
|
pinned: state.pinned, help: state.help,
|
|
303
247
|
rename: state.rename, renameBuf: state.renameBuf,
|
|
304
248
|
message: state.message, messageBuf: state.messageBuf,
|
|
305
|
-
readOnly:
|
|
249
|
+
readOnly: false,
|
|
306
250
|
}, size, caps);
|
|
307
251
|
process.stdout.write(frame);
|
|
308
252
|
};
|
|
@@ -708,10 +652,7 @@ export async function runBrowse(opts) {
|
|
|
708
652
|
}
|
|
709
653
|
// Close-out the selected node (+ its exclusive subtree). If anything in that
|
|
710
654
|
// subtree is actively streaming, confirm first (y/n); otherwise close at once.
|
|
711
|
-
// No-op against a remote canvas — mutations are disabled (footer says so).
|
|
712
655
|
if (action === 'crtr.browse.close-subtree') {
|
|
713
|
-
if (isRemote)
|
|
714
|
-
return;
|
|
715
656
|
if (row === undefined) {
|
|
716
657
|
scheduleFlush();
|
|
717
658
|
return;
|
|
@@ -756,7 +697,7 @@ export async function runBrowse(opts) {
|
|
|
756
697
|
scheduleFlush();
|
|
757
698
|
return;
|
|
758
699
|
}
|
|
759
|
-
// Pin
|
|
700
|
+
// Pin or unpin in the local, view-only pin set.
|
|
760
701
|
if (input === 'f') {
|
|
761
702
|
if (row !== undefined)
|
|
762
703
|
togglePin(row.id);
|
|
@@ -769,10 +710,8 @@ export async function runBrowse(opts) {
|
|
|
769
710
|
scheduleFlush();
|
|
770
711
|
return;
|
|
771
712
|
}
|
|
772
|
-
// Rename the node inline
|
|
713
|
+
// Rename the node inline.
|
|
773
714
|
if (input === 'R') {
|
|
774
|
-
if (isRemote)
|
|
775
|
-
return;
|
|
776
715
|
if (row !== undefined) {
|
|
777
716
|
state.rename = true;
|
|
778
717
|
state.renameTarget = row.id;
|
|
@@ -781,10 +720,8 @@ export async function runBrowse(opts) {
|
|
|
781
720
|
scheduleFlush();
|
|
782
721
|
return;
|
|
783
722
|
}
|
|
784
|
-
// Message the node without resuming it
|
|
723
|
+
// Message the node without resuming it.
|
|
785
724
|
if (input === 'm') {
|
|
786
|
-
if (isRemote)
|
|
787
|
-
return;
|
|
788
725
|
if (row !== undefined) {
|
|
789
726
|
state.message = true;
|
|
790
727
|
state.messageTarget = row.id;
|
|
@@ -810,10 +747,7 @@ export async function runBrowse(opts) {
|
|
|
810
747
|
// waiting out the 5-min auto-revive grace. Shells `node lifecycle revive <id>
|
|
811
748
|
// --now` (browse goes through commands, never touching the runtime directly). 'k' is
|
|
812
749
|
// vim-up here, so the kick is on SHIFT-K.
|
|
813
|
-
// No-op against a remote canvas — mutations are disabled (footer says so).
|
|
814
750
|
if (action === 'crtr.browse.revive-now') {
|
|
815
|
-
if (isRemote)
|
|
816
|
-
return;
|
|
817
751
|
if (row !== undefined) {
|
|
818
752
|
const r = rowOf(row.id);
|
|
819
753
|
if (r?.hanging != null)
|
|
@@ -822,21 +756,15 @@ export async function runBrowse(opts) {
|
|
|
822
756
|
scheduleFlush();
|
|
823
757
|
return;
|
|
824
758
|
}
|
|
825
|
-
// Resume
|
|
826
|
-
// (footer says so).
|
|
759
|
+
// Resume the selected node.
|
|
827
760
|
if (action === 'crtr.browse.focus') {
|
|
828
|
-
if (isRemote)
|
|
829
|
-
return;
|
|
830
761
|
if (row !== undefined)
|
|
831
762
|
selectAndFocus(row.id);
|
|
832
763
|
return;
|
|
833
764
|
}
|
|
834
765
|
// Resume in the BACKGROUND (Shift+O): focus the node into the pane behind this
|
|
835
|
-
// popup but keep the navigator open so you can resume more nodes.
|
|
836
|
-
// guard as plain focus.
|
|
766
|
+
// popup but keep the navigator open so you can resume more nodes.
|
|
837
767
|
if (action === 'crtr.browse.focus-background') {
|
|
838
|
-
if (isRemote)
|
|
839
|
-
return;
|
|
840
768
|
if (row !== undefined)
|
|
841
769
|
selectAndFocusKeepOpen(row.id);
|
|
842
770
|
scheduleFlush();
|
|
@@ -877,7 +805,7 @@ export async function runBrowse(opts) {
|
|
|
877
805
|
return;
|
|
878
806
|
const end = Math.min(warmIdx + WARM_CHUNK, warmRows.length);
|
|
879
807
|
const slice = warmRows.slice(warmIdx, end);
|
|
880
|
-
await enrichRowsFromSource(source, slice,
|
|
808
|
+
await enrichRowsFromSource(source, slice, askCounts);
|
|
881
809
|
await Promise.all(slice.map((r) => loadPreviewFromSource(source, r)));
|
|
882
810
|
warmIdx = end;
|
|
883
811
|
// A live search may match the freshly-warmed prompts → recompute + repaint.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { DashboardRow } from '../render.js';
|
|
2
|
-
import type { NodeStatus } from '../types.js';
|
|
3
2
|
export type Tab = 'All' | 'Live' | 'Dormant' | 'Attention' | 'Pinned';
|
|
4
3
|
export declare const TABS: readonly Tab[];
|
|
5
4
|
/** How the visible rows are ordered.
|
|
@@ -28,9 +27,6 @@ export interface Tree {
|
|
|
28
27
|
roots: string[];
|
|
29
28
|
nodes: Map<string, TreeNode>;
|
|
30
29
|
}
|
|
31
|
-
/** Sort rank for roots/stragglers — live first (active, then idle), dormant
|
|
32
|
-
* after. Mirrors render.ts statusRank. */
|
|
33
|
-
export declare function statusRank(status: NodeStatus): number;
|
|
34
30
|
/**
|
|
35
31
|
* Build a spanning tree of the whole canvas.
|
|
36
32
|
* - `rows` — one DashboardRow per node (display text + status/asks).
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// it is exhaustively unit-testable. The app layer (app.ts) wires the canvas data
|
|
5
5
|
// access (dashboardRowsAll / listNodes / subscriptionsOf) into buildTree, then
|
|
6
6
|
// drives flatten() on each keystroke.
|
|
7
|
+
import { statusRank } from '../node-order.js';
|
|
7
8
|
export const TABS = ['All', 'Live', 'Dormant', 'Attention', 'Pinned'];
|
|
8
9
|
export const SORTS = ['tree', 'attention', 'relevance', 'recency'];
|
|
9
10
|
/** Does a node belong to this tab's slice?
|
|
@@ -21,18 +22,6 @@ export function tabPredicate(tab, row, isPinned = false) {
|
|
|
21
22
|
case 'Pinned': return isPinned;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
/** Sort rank for roots/stragglers — live first (active, then idle), dormant
|
|
25
|
-
* after. Mirrors render.ts statusRank. */
|
|
26
|
-
export function statusRank(status) {
|
|
27
|
-
switch (status) {
|
|
28
|
-
case 'active': return 0;
|
|
29
|
-
case 'idle': return 1;
|
|
30
|
-
case 'done': return 2;
|
|
31
|
-
case 'canceled': return 3;
|
|
32
|
-
case 'dead': return 4;
|
|
33
|
-
default: return 5;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
25
|
/**
|
|
37
26
|
* Build a spanning tree of the whole canvas.
|
|
38
27
|
* - `rows` — one DashboardRow per node (display text + status/asks).
|
|
@@ -316,9 +316,12 @@ function statusLine(state) {
|
|
|
316
316
|
const dim = (s) => `${DIM}${s}${RESET}`;
|
|
317
317
|
const profile = state.profileScope === undefined ? 'all profiles' : 'current';
|
|
318
318
|
const scope = state.cwdScope === null ? 'all dirs' : baseDir(state.cwdScope);
|
|
319
|
-
const segs = [
|
|
320
|
-
|
|
321
|
-
|
|
319
|
+
const segs = [
|
|
320
|
+
`${dim('profile')} ${profile}`,
|
|
321
|
+
`${dim('scope')} ${scope}`,
|
|
322
|
+
`${dim('sort')} ${state.sort}`,
|
|
323
|
+
`${dim('lifecycle')} ${state.residentsOnly ? 'residents' : 'all'}`,
|
|
324
|
+
];
|
|
322
325
|
if (!state.search && state.query !== '')
|
|
323
326
|
segs.push(`${dim('filter')} ${state.query}`);
|
|
324
327
|
return segs.join(dim(' · '));
|
|
@@ -138,11 +138,14 @@ export declare function listCrons(scope: {
|
|
|
138
138
|
}): Cron[];
|
|
139
139
|
/** DELETE one cron — the explicit user/surface cancel. Idempotent: an absent
|
|
140
140
|
* row is a no-op `false`. Kills any in-flight run process group before
|
|
141
|
-
* deleting
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
|
|
141
|
+
* deleting unless the daemon has proved the caller is that exact run; then
|
|
142
|
+
* the process must finish and deliver its already-produced output. The lease
|
|
143
|
+
* acquisition still linearizes before this selection (the run is observed
|
|
144
|
+
* and killed) or after the delete (and loses the lease). The FK cascade reaps
|
|
145
|
+
* the cron's run history with it. */
|
|
146
|
+
export declare function cancelCron(cron_id: string, options?: {
|
|
147
|
+
preserveRunningProcess?: boolean;
|
|
148
|
+
}): boolean;
|
|
146
149
|
/** DELETE one cron by id — one-shot consumption after its run settles.
|
|
147
150
|
* Returns whether a live row was removed, so a consumer racing an explicit
|
|
148
151
|
* cancel can no-op instead of double-settling. */
|
|
@@ -172,17 +172,18 @@ export function listCrons(scope) {
|
|
|
172
172
|
}
|
|
173
173
|
/** DELETE one cron — the explicit user/surface cancel. Idempotent: an absent
|
|
174
174
|
* row is a no-op `false`. Kills any in-flight run process group before
|
|
175
|
-
* deleting
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
|
|
175
|
+
* deleting unless the daemon has proved the caller is that exact run; then
|
|
176
|
+
* the process must finish and deliver its already-produced output. The lease
|
|
177
|
+
* acquisition still linearizes before this selection (the run is observed
|
|
178
|
+
* and killed) or after the delete (and loses the lease). The FK cascade reaps
|
|
179
|
+
* the cron's run history with it. */
|
|
180
|
+
export function cancelCron(cron_id, options) {
|
|
180
181
|
return withCanvasWrite((db) => {
|
|
181
182
|
const row = db.prepare('SELECT * FROM crons WHERE cron_id = ?').get(cron_id);
|
|
182
183
|
if (row === undefined)
|
|
183
184
|
return false;
|
|
184
185
|
const cron = cronFrom(row);
|
|
185
|
-
if (cron.run_state === 'running')
|
|
186
|
+
if (cron.run_state === 'running' && options?.preserveRunningProcess !== true)
|
|
186
187
|
killLeasedCronRun(cron);
|
|
187
188
|
db.prepare('DELETE FROM crons WHERE cron_id = ?').run(cron_id);
|
|
188
189
|
return true;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export declare const CANVAS_EXTENSION_NAMES: readonly ["canvas-inbox-watcher", "canvas-review-boundary", "canvas-stophook", "canvas-recap", "canvas-goal-capture", "canvas-passive-context", "canvas-context-intro", "canvas-tool-guide", "canvas-doc-substrate", "canvas-structured-output", "canvas-bash-valve"];
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
/** Structural shipped-hook identity: a canvas-hook stem directly under a
|
|
3
|
+
* `pi-extensions` directory. A user's own extension elsewhere may share the
|
|
4
|
+
* stem and is not shipped. */
|
|
5
|
+
export declare function isShippedCanvasExtension(path: string): boolean;
|
|
6
|
+
/** Remove persisted shipped canvas extensions while retaining genuine
|
|
7
|
+
* caller/kind extras, including a custom extension whose basename happens to
|
|
8
|
+
* resemble a canvas hook outside a pi-extensions directory. */
|
|
5
9
|
export declare function customExtensionPaths(extensions: readonly string[] | undefined): string[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extname } from 'node:path';
|
|
1
2
|
// Canvas-extension identity is structural, not basename-based: old runtime roots
|
|
2
3
|
// are recognized only when they carry a complete shipped canvas prefix.
|
|
3
4
|
// canvas-inbox-watcher must load before canvas-stophook: at agent_settled it
|
|
@@ -44,10 +45,21 @@ function extensionPrefixLength(extensions) {
|
|
|
44
45
|
const prefixes = [CANVAS_EXTENSION_NAMES, ...HISTORICAL_CANVAS_EXTENSION_PREFIXES];
|
|
45
46
|
return prefixes.find((names) => matchesExtensionPrefix(extensions, names))?.length ?? 0;
|
|
46
47
|
}
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
/** Structural shipped-hook identity: a canvas-hook stem directly under a
|
|
49
|
+
* `pi-extensions` directory. A user's own extension elsewhere may share the
|
|
50
|
+
* stem and is not shipped. */
|
|
51
|
+
export function isShippedCanvasExtension(path) {
|
|
52
|
+
const normalized = path.replaceAll('\\', '/');
|
|
53
|
+
const lastSlash = normalized.lastIndexOf('/');
|
|
54
|
+
const parent = normalized.slice(0, lastSlash).split('/').at(-1);
|
|
55
|
+
const filename = normalized.slice(lastSlash + 1);
|
|
56
|
+
const name = filename.slice(0, filename.length - extname(filename).length);
|
|
57
|
+
return parent === 'pi-extensions' && CANVAS_EXTENSION_NAMES.includes(name);
|
|
58
|
+
}
|
|
59
|
+
/** Remove persisted shipped canvas extensions while retaining genuine
|
|
60
|
+
* caller/kind extras, including a custom extension whose basename happens to
|
|
61
|
+
* resemble a canvas hook outside a pi-extensions directory. */
|
|
50
62
|
export function customExtensionPaths(extensions) {
|
|
51
63
|
const paths = extensions ?? [];
|
|
52
|
-
return paths.slice(extensionPrefixLength(paths));
|
|
64
|
+
return paths.slice(extensionPrefixLength(paths)).filter((path) => !isShippedCanvasExtension(path));
|
|
53
65
|
}
|
|
@@ -34,10 +34,6 @@ export declare function subtreeIds(root: string): string[];
|
|
|
34
34
|
* with navigable children (folded or not). In GRAPH the ▸ caret separately marks
|
|
35
35
|
* a collapsed row, so this stays a pure count and never doubles as a fold badge. */
|
|
36
36
|
export declare function childBadge(node: NodeMeta | null): string;
|
|
37
|
-
/** Sort rank for sibling ordering — live nodes (active, then idle) ahead of
|
|
38
|
-
* terminal ones, so sessions still running surface at the TOP of each child
|
|
39
|
-
* group instead of being buried under finished/failed ones. */
|
|
40
|
-
export declare function statusRank(id: string): number;
|
|
41
37
|
/** Direct children, live-first — the sibling order used both when flattening
|
|
42
38
|
* the tree and when stepping into a subtree (`l`). Array.sort is stable, so
|
|
43
39
|
* equal-status siblings keep their creation order. */
|
|
@@ -14,6 +14,7 @@ import { getNode, subscribersOf, subscriptionsOf } from './index.js';
|
|
|
14
14
|
import { activeFaultForDisplay } from './render.js';
|
|
15
15
|
import { readFault } from '../runtime/fault.js';
|
|
16
16
|
import { faultSummary } from './status-glyph.js';
|
|
17
|
+
import { statusRank } from './node-order.js';
|
|
17
18
|
import { beginFrameTelem, nodeGlyph, navLabel, shortId, tokensCell, activityCell, cycleBadge, askBadge, liveBelowBadge, truncate, fillBar, fillWidth, isAttached, BOLD, DIM, RESET, REVERSE, BG_ATTACHED, } from './nav-render.js';
|
|
18
19
|
// Re-export the pure render/telemetry half so existing nav-model importers
|
|
19
20
|
// (chrome/canvas-panels, overlays/graph, resume) keep resolving these here.
|
|
@@ -170,24 +171,11 @@ export function childBadge(node) {
|
|
|
170
171
|
const m = childCount(node.node_id);
|
|
171
172
|
return m > 0 ? ` ${DIM}⤳${m}${RESET}` : '';
|
|
172
173
|
}
|
|
173
|
-
/** Sort rank for sibling ordering — live nodes (active, then idle) ahead of
|
|
174
|
-
* terminal ones, so sessions still running surface at the TOP of each child
|
|
175
|
-
* group instead of being buried under finished/failed ones. */
|
|
176
|
-
export function statusRank(id) {
|
|
177
|
-
switch (cNode(id)?.status) {
|
|
178
|
-
case 'active': return 0;
|
|
179
|
-
case 'idle': return 1;
|
|
180
|
-
case 'done': return 2;
|
|
181
|
-
case 'canceled': return 3;
|
|
182
|
-
case 'dead': return 4;
|
|
183
|
-
default: return 5;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
174
|
/** Direct children, live-first — the sibling order used both when flattening
|
|
187
175
|
* the tree and when stepping into a subtree (`l`). Array.sort is stable, so
|
|
188
176
|
* equal-status siblings keep their creation order. */
|
|
189
177
|
export function sortedChildIds(id) {
|
|
190
|
-
return convoChildIds(id).sort((a, b) => statusRank(a) - statusRank(b));
|
|
178
|
+
return convoChildIds(id).sort((a, b) => statusRank(cNode(a)?.status) - statusRank(cNode(b)?.status));
|
|
191
179
|
}
|
|
192
180
|
// ---------------------------------------------------------------------------
|
|
193
181
|
// GRAPH model — flatten the local graph fold-aware. Rebuilt every render (cheap
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// node-order.ts — canonical live-first ordering for canvas node statuses.
|
|
2
|
+
/** Sort live work before terminal work; unknown statuses sort last. */
|
|
3
|
+
export function statusRank(status) {
|
|
4
|
+
switch (status) {
|
|
5
|
+
case 'active': return 0;
|
|
6
|
+
case 'idle': return 1;
|
|
7
|
+
case 'done': return 2;
|
|
8
|
+
case 'canceled': return 3;
|
|
9
|
+
case 'dead': return 4;
|
|
10
|
+
default: return 5;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CanvasSource } from './source.js';
|
|
2
2
|
import type { NodeMeta, NodeRow, NodeStatus, SubscriptionRef } from './types.js';
|
|
3
3
|
/** The exact JSON shape `crtr --json node inspect show <id>` emits (see
|
|
4
|
-
* `nodeShow`
|
|
4
|
+
* `nodeShow` in `src/commands/node/inspect.ts`) — mirrored here, not imported,
|
|
5
5
|
* to avoid a commands→canvas value dependency. */
|
|
6
6
|
export interface RemoteShowResponse {
|
|
7
7
|
node: NodeMeta;
|
|
@@ -28,7 +28,7 @@ export interface RemoteShowResponse {
|
|
|
28
28
|
paths: {
|
|
29
29
|
context_dir: string;
|
|
30
30
|
reports_dir: string;
|
|
31
|
-
session_file
|
|
31
|
+
session_file?: string | null;
|
|
32
32
|
};
|
|
33
33
|
follow_up: string;
|
|
34
34
|
}
|
|
@@ -40,13 +40,10 @@ export declare class RemoteCanvasSource implements CanvasSource {
|
|
|
40
40
|
private rosterCache;
|
|
41
41
|
private viewCache;
|
|
42
42
|
constructor(previewEndpoint: string, relayToken: string);
|
|
43
|
-
/** Drops every cached entry — called on a `RemoteEventStream` `'nodes'` (or
|
|
44
|
-
* `'inbox'`) event so the next read re-fetches fresh state. */
|
|
45
|
-
invalidate(): void;
|
|
46
43
|
private execJson;
|
|
47
44
|
private fetchShow;
|
|
48
45
|
/** The full passthrough object `node inspect show` produces — used by
|
|
49
|
-
* `nodeShow`'s remote branch (`src/commands/node.ts`) to return the exact
|
|
46
|
+
* `nodeShow`'s remote branch (`src/commands/node/inspect.ts`) to return the exact
|
|
50
47
|
* same shape a local read would, without re-deriving it. */
|
|
51
48
|
rawShow(id: string): Promise<RemoteShowResponse | null>;
|
|
52
49
|
getNode(id: string): Promise<NodeMeta | null>;
|