@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
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CustomEditor } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { Component, KeybindingsManager, TUI } from '@earendil-works/pi-tui';
|
|
3
|
+
import type { BrokerDataFrame, BrokerSnapshot, ClientToBroker, RpcExtensionUIRequest, RpcExtensionUIResponse } from '../../../core/runtime/broker-protocol.js';
|
|
4
|
+
import type { ReadOpRequest } from '../../../core/broker-client/index.js';
|
|
5
|
+
import { type Picker, type PickerControls } from '../overlays/pickers.js';
|
|
6
|
+
export interface InputOverlayHooks {
|
|
7
|
+
send: (frame: ClientToBroker) => void;
|
|
8
|
+
notify: (message: string) => void;
|
|
9
|
+
onDialogResponse: (response: RpcExtensionUIResponse) => void;
|
|
10
|
+
onRequest?: (frame: ReadOpRequest) => Promise<BrokerDataFrame>;
|
|
11
|
+
onMountPicker?: (component: Component) => void;
|
|
12
|
+
onUnmountPicker?: () => void;
|
|
13
|
+
state: () => BrokerSnapshot['state'] | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Owns transient dialog and picker lifetime. Editor submission remains with
|
|
16
|
+
* InputController; this collaborator owns mount, replacement, dismissal, and
|
|
17
|
+
* focus restoration for every transient input surface. */
|
|
18
|
+
export declare class InputOverlayOwner {
|
|
19
|
+
private readonly tui;
|
|
20
|
+
private readonly editor;
|
|
21
|
+
private readonly keybindings;
|
|
22
|
+
private readonly hooks;
|
|
23
|
+
private dialog;
|
|
24
|
+
private dialogId;
|
|
25
|
+
private picker;
|
|
26
|
+
private openSeq;
|
|
27
|
+
constructor(tui: TUI, editor: CustomEditor, keybindings: KeybindingsManager, hooks: InputOverlayHooks);
|
|
28
|
+
attachDialog(request: RpcExtensionUIRequest): void;
|
|
29
|
+
dismissDialog(id: string): void;
|
|
30
|
+
openModelPicker(): Promise<void>;
|
|
31
|
+
openSessionPicker(): Promise<void>;
|
|
32
|
+
openTreePicker(): Promise<void>;
|
|
33
|
+
openForkPicker(): Promise<void>;
|
|
34
|
+
openSettingsPicker(): Promise<void>;
|
|
35
|
+
openScopedModelsPicker(): Promise<void>;
|
|
36
|
+
openMcpPicker(serverName?: string): void;
|
|
37
|
+
openFileReviewPicker(candidates: string[], cwd: string, onChoose: (file: string) => void): void;
|
|
38
|
+
openAuthPicker(prepare: () => Promise<(controls: PickerControls) => Picker>): Promise<void>;
|
|
39
|
+
private openPicker;
|
|
40
|
+
private showPicker;
|
|
41
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { isBlockingDialog, renderDialog } from '../overlays/dialogs.js';
|
|
2
|
+
import { buildForkPicker, buildModelPicker, buildScopedModelsPicker, buildSessionPicker, buildSettingsPicker, buildTreePicker, } from '../overlays/pickers.js';
|
|
3
|
+
import { buildMcpPicker, readMcpServers, startMcpServerAction, MCP_EMPTY_STATE_HINT } from '../overlays/mcp.js';
|
|
4
|
+
import { buildFileReviewPicker } from '../overlays/file-review.js';
|
|
5
|
+
const PICKER_OVERLAY_OPTIONS = { anchor: 'center', width: '80%', maxHeight: '85%' };
|
|
6
|
+
/** Owns transient dialog and picker lifetime. Editor submission remains with
|
|
7
|
+
* InputController; this collaborator owns mount, replacement, dismissal, and
|
|
8
|
+
* focus restoration for every transient input surface. */
|
|
9
|
+
export class InputOverlayOwner {
|
|
10
|
+
tui;
|
|
11
|
+
editor;
|
|
12
|
+
keybindings;
|
|
13
|
+
hooks;
|
|
14
|
+
dialog;
|
|
15
|
+
dialogId;
|
|
16
|
+
picker;
|
|
17
|
+
openSeq = 0;
|
|
18
|
+
constructor(tui, editor, keybindings, hooks) {
|
|
19
|
+
this.tui = tui;
|
|
20
|
+
this.editor = editor;
|
|
21
|
+
this.keybindings = keybindings;
|
|
22
|
+
this.hooks = hooks;
|
|
23
|
+
}
|
|
24
|
+
attachDialog(request) {
|
|
25
|
+
if (request.method === 'notify') {
|
|
26
|
+
const prefix = request.notifyType === 'error' ? 'Error: ' : request.notifyType === 'warning' ? 'Warning: ' : '';
|
|
27
|
+
this.hooks.notify(`${prefix}${request.message}`);
|
|
28
|
+
this.tui.requestRender();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!isBlockingDialog(request))
|
|
32
|
+
return;
|
|
33
|
+
this.dialog?.dismiss();
|
|
34
|
+
this.dialogId = request.id;
|
|
35
|
+
this.dialog = renderDialog(this.tui, request, (response) => {
|
|
36
|
+
this.dialog = undefined;
|
|
37
|
+
this.dialogId = undefined;
|
|
38
|
+
this.hooks.onDialogResponse(response);
|
|
39
|
+
}, this.keybindings);
|
|
40
|
+
this.tui.requestRender();
|
|
41
|
+
}
|
|
42
|
+
dismissDialog(id) {
|
|
43
|
+
if (this.dialogId !== id)
|
|
44
|
+
return;
|
|
45
|
+
this.dialog?.dismiss();
|
|
46
|
+
this.dialog = undefined;
|
|
47
|
+
this.dialogId = undefined;
|
|
48
|
+
this.tui.requestRender();
|
|
49
|
+
}
|
|
50
|
+
openModelPicker() {
|
|
51
|
+
return this.openPicker({ type: 'list_models' }, 'list_models', 'model', (data, close) => buildModelPicker(this.tui, data, this.hooks.send, close));
|
|
52
|
+
}
|
|
53
|
+
openSessionPicker() {
|
|
54
|
+
const request = this.hooks.onRequest;
|
|
55
|
+
if (request === undefined) {
|
|
56
|
+
this.hooks.notify("The session picker isn't available in this viewer");
|
|
57
|
+
return Promise.resolve();
|
|
58
|
+
}
|
|
59
|
+
this.openSeq++;
|
|
60
|
+
this.showPicker((controls) => buildSessionPicker(this.tui, this.hooks.state()?.sessionFile, request, this.keybindings, this.hooks.send, controls.close));
|
|
61
|
+
return Promise.resolve();
|
|
62
|
+
}
|
|
63
|
+
openTreePicker() {
|
|
64
|
+
return this.openPicker({ type: 'get_tree' }, 'get_tree', 'tree', (data, close) => buildTreePicker(this.tui, data, this.hooks.send, close));
|
|
65
|
+
}
|
|
66
|
+
openForkPicker() {
|
|
67
|
+
return this.openPicker({ type: 'get_tree' }, 'get_tree', 'fork', (data, close) => buildForkPicker(data, this.hooks.send, close));
|
|
68
|
+
}
|
|
69
|
+
openSettingsPicker() {
|
|
70
|
+
return this.openPicker({ type: 'get_settings' }, 'get_settings', 'settings', (data, close) => buildSettingsPicker(data, this.hooks.send, close, this.hooks.notify));
|
|
71
|
+
}
|
|
72
|
+
openScopedModelsPicker() {
|
|
73
|
+
return this.openPicker({ type: 'list_scoped_models' }, 'list_scoped_models', 'scoped-models', (data, close) => buildScopedModelsPicker(data, close, this.hooks.notify));
|
|
74
|
+
}
|
|
75
|
+
openMcpPicker(serverName) {
|
|
76
|
+
const rows = readMcpServers();
|
|
77
|
+
if (rows.length === 0) {
|
|
78
|
+
this.hooks.notify(MCP_EMPTY_STATE_HINT);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (serverName !== undefined) {
|
|
82
|
+
const row = rows.find((candidate) => candidate.name === serverName);
|
|
83
|
+
if (row === undefined) {
|
|
84
|
+
this.hooks.notify(`No MCP server named ${JSON.stringify(serverName)} — usage: /mcp [server]`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
startMcpServerAction(row, this.hooks.send, this.hooks.notify);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.showPicker((controls) => buildMcpPicker(rows, this.hooks.send, controls.close, this.hooks.notify));
|
|
91
|
+
}
|
|
92
|
+
openFileReviewPicker(candidates, cwd, onChoose) {
|
|
93
|
+
this.showPicker((controls) => buildFileReviewPicker(candidates, cwd, (file) => {
|
|
94
|
+
controls.close();
|
|
95
|
+
onChoose(file);
|
|
96
|
+
}, controls.close, this.hooks.notify));
|
|
97
|
+
}
|
|
98
|
+
async openAuthPicker(prepare) {
|
|
99
|
+
const seq = ++this.openSeq;
|
|
100
|
+
let build;
|
|
101
|
+
try {
|
|
102
|
+
build = await prepare();
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.hooks.notify(`Could not open the auth picker: ${error instanceof Error ? error.message : String(error)}`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (seq !== this.openSeq)
|
|
109
|
+
return;
|
|
110
|
+
this.showPicker(build);
|
|
111
|
+
}
|
|
112
|
+
async openPicker(frame, kind, label, build) {
|
|
113
|
+
const request = this.hooks.onRequest;
|
|
114
|
+
if (request === undefined) {
|
|
115
|
+
this.hooks.notify(`The ${label} picker isn't available in this viewer`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const seq = ++this.openSeq;
|
|
119
|
+
let reply;
|
|
120
|
+
try {
|
|
121
|
+
reply = await request(frame);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
this.hooks.notify(`Could not open the ${label} picker: ${error instanceof Error ? error.message : String(error)}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (seq !== this.openSeq)
|
|
128
|
+
return;
|
|
129
|
+
if (reply.kind !== kind) {
|
|
130
|
+
this.hooks.notify(`Unexpected reply building the ${label} picker`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
this.showPicker((controls) => build(reply, controls.close));
|
|
134
|
+
}
|
|
135
|
+
showPicker(build) {
|
|
136
|
+
this.picker?.dismiss();
|
|
137
|
+
const inline = this.hooks.onMountPicker !== undefined && this.hooks.onUnmountPicker !== undefined;
|
|
138
|
+
let handle;
|
|
139
|
+
let current;
|
|
140
|
+
let done = false;
|
|
141
|
+
const disposeCurrent = () => {
|
|
142
|
+
const disposable = current?.component;
|
|
143
|
+
try {
|
|
144
|
+
disposable?.dispose?.();
|
|
145
|
+
}
|
|
146
|
+
catch { /* ignore teardown errors */ }
|
|
147
|
+
};
|
|
148
|
+
const mount = (picker) => {
|
|
149
|
+
if (inline)
|
|
150
|
+
this.hooks.onMountPicker(picker.component);
|
|
151
|
+
else
|
|
152
|
+
handle = this.tui.showOverlay(picker.component, PICKER_OVERLAY_OPTIONS);
|
|
153
|
+
this.tui.setFocus(picker.focus);
|
|
154
|
+
};
|
|
155
|
+
const unmount = () => {
|
|
156
|
+
if (inline)
|
|
157
|
+
this.hooks.onUnmountPicker?.();
|
|
158
|
+
else
|
|
159
|
+
handle?.hide();
|
|
160
|
+
};
|
|
161
|
+
const replace = (component, focus) => {
|
|
162
|
+
if (done)
|
|
163
|
+
return;
|
|
164
|
+
disposeCurrent();
|
|
165
|
+
unmount();
|
|
166
|
+
current = { component, focus };
|
|
167
|
+
mount(current);
|
|
168
|
+
this.tui.requestRender();
|
|
169
|
+
};
|
|
170
|
+
const close = () => {
|
|
171
|
+
if (done)
|
|
172
|
+
return;
|
|
173
|
+
done = true;
|
|
174
|
+
disposeCurrent();
|
|
175
|
+
unmount();
|
|
176
|
+
this.picker = undefined;
|
|
177
|
+
this.tui.setFocus(this.editor);
|
|
178
|
+
this.tui.requestRender();
|
|
179
|
+
};
|
|
180
|
+
try {
|
|
181
|
+
current = build({ close, replace });
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
this.hooks.notify(`Could not open picker: ${error instanceof Error ? error.message : String(error)}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
mount(current);
|
|
188
|
+
this.picker = {
|
|
189
|
+
dismiss: () => {
|
|
190
|
+
if (done)
|
|
191
|
+
return;
|
|
192
|
+
done = true;
|
|
193
|
+
disposeCurrent();
|
|
194
|
+
unmount();
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
this.tui.requestRender();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import type { TUI } from '@earendil-works/pi-tui';
|
|
2
|
-
import type { CanvasSource } from '../../../core/canvas/source.js';
|
|
3
1
|
import type { SurfaceHost } from '../../surfaces/host.js';
|
|
4
2
|
import type { Picker } from './pickers.js';
|
|
5
3
|
import { extractFilePaths } from '#core/human/visible-paths';
|
|
6
4
|
export declare function buildFileReviewPicker(candidates: readonly string[], cwd: string, onChoose: (file: string) => void, close: () => void, notify: (message: string) => void): Picker;
|
|
7
5
|
export declare function launchFileReview(host: SurfaceHost, file: string, opts: {
|
|
8
6
|
originNodeId: string;
|
|
9
|
-
tui: TUI;
|
|
10
|
-
canvasSource: CanvasSource;
|
|
11
7
|
onNotice: (message: string) => void;
|
|
12
8
|
}): Promise<void>;
|
|
13
9
|
export { extractFilePaths };
|
|
@@ -2,8 +2,8 @@ import { homedir } from 'node:os';
|
|
|
2
2
|
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
3
3
|
import { Input, SelectList, getKeybindings, } from '@earendil-works/pi-tui';
|
|
4
4
|
import { getSelectListTheme } from '@earendil-works/pi-coding-agent';
|
|
5
|
-
import {
|
|
6
|
-
import { createReviewClient } from '../../inbox/review/review-client.js';
|
|
5
|
+
import { openReviewSurface } from '../../inbox/review/launch.js';
|
|
6
|
+
import { createReviewClient, ReviewTerminalError, terminalRefusalNotice } from '../../inbox/review/review-client.js';
|
|
7
7
|
import { checkReviewableFile, extractFilePaths } from '#core/human/visible-paths';
|
|
8
8
|
const MAX_VISIBLE_ROWS = 12;
|
|
9
9
|
function labelForPath(file, cwd) {
|
|
@@ -109,12 +109,20 @@ export function buildFileReviewPicker(candidates, cwd, onChoose, close, notify)
|
|
|
109
109
|
return { component: picker, focus: picker };
|
|
110
110
|
}
|
|
111
111
|
export async function launchFileReview(host, file, opts) {
|
|
112
|
+
// The refusal precedes the record creation: a remote viewer can reach neither
|
|
113
|
+
// the reviewed file nor the companion's pane.
|
|
114
|
+
if (host.capabilities.remote) {
|
|
115
|
+
opts.onNotice('The review is unavailable in a remote attach — the file and companion live on the host.');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let review;
|
|
112
119
|
try {
|
|
113
|
-
|
|
114
|
-
await openComposedReview(host, { reviewId: review.reviewId, tui: opts.tui, canvasSource: opts.canvasSource });
|
|
120
|
+
review = await createReviewClient().createInline({ originNodeId: opts.originNodeId, file });
|
|
115
121
|
}
|
|
116
122
|
catch (err) {
|
|
117
|
-
opts.onNotice(err instanceof Error ? err.message : String(err));
|
|
123
|
+
opts.onNotice(err instanceof ReviewTerminalError ? terminalRefusalNotice(err) : err instanceof Error ? err.message : String(err));
|
|
124
|
+
return;
|
|
118
125
|
}
|
|
126
|
+
await openReviewSurface(host, { review });
|
|
119
127
|
}
|
|
120
128
|
export { extractFilePaths };
|
|
@@ -40,6 +40,7 @@ import { readFault } from '../../../core/runtime/fault.js';
|
|
|
40
40
|
import { faultSummary } from '../../../core/canvas/status-glyph.js';
|
|
41
41
|
import { RemoteCanvasSource } from '../../../core/canvas/remote-canvas-source.js';
|
|
42
42
|
import { cliClient } from '../../../commands/api-client.js';
|
|
43
|
+
import { statusRank } from '../../../core/canvas/node-order.js';
|
|
43
44
|
import { beginFrameTelem, navLabel, nodeGlyph, tokensCell, cycleBadge, askBadge, activityCell, shortId, visibleWidth, fillBar, fillWidth, truncate, isAttached, VIEWPORT_FALLBACK_ROWS, DIM, RESET, BOLD, YELLOW, REVERSE, BG_ATTACHED, GREEN, } from '../../../core/canvas/nav-render.js';
|
|
44
45
|
// A BOUNDED, centered modal (CTO ruling: not full-bleed). Width/height are capped
|
|
45
46
|
// at ~72% of the terminal; the overlay clips our lines to maxHeight, and render()
|
|
@@ -267,16 +268,7 @@ export class GraphOverlay {
|
|
|
267
268
|
}
|
|
268
269
|
return cur;
|
|
269
270
|
};
|
|
270
|
-
const rank = async (id) =>
|
|
271
|
-
switch ((await node(id))?.status) {
|
|
272
|
-
case 'active': return 0;
|
|
273
|
-
case 'idle': return 1;
|
|
274
|
-
case 'done': return 2;
|
|
275
|
-
case 'canceled': return 3;
|
|
276
|
-
case 'dead': return 4;
|
|
277
|
-
default: return 5;
|
|
278
|
-
}
|
|
279
|
-
};
|
|
271
|
+
const rank = async (id) => statusRank((await node(id))?.status);
|
|
280
272
|
const sortedChildren = async (id) => {
|
|
281
273
|
const cached = sortedChildIds.get(id);
|
|
282
274
|
if (cached !== undefined)
|
|
@@ -130,6 +130,9 @@ export declare class ChatView {
|
|
|
130
130
|
private bashComponent;
|
|
131
131
|
/** The single active activity loader (working/compaction/retry), if any. */
|
|
132
132
|
private activityLoader;
|
|
133
|
+
/** The shared broker transcript state; this renderer projects it into pi TUI
|
|
134
|
+
* components while retaining terminal-only folding and virtualization. */
|
|
135
|
+
private projection;
|
|
133
136
|
/** Broker-selected normal label for this turn; compaction/retry temporarily
|
|
134
137
|
* replace it and restore it when the run remains active. */
|
|
135
138
|
private workingActivity;
|
|
@@ -149,8 +152,6 @@ export declare class ChatView {
|
|
|
149
152
|
* snapshot AND the live event stream so `/copy` (getLastAssistantText) works
|
|
150
153
|
* whether the message arrived before or after attach. */
|
|
151
154
|
private lastAssistantText;
|
|
152
|
-
/** Recent transcript text, oldest → newest, for the file-review path picker. */
|
|
153
|
-
private readonly transcriptTexts;
|
|
154
155
|
/** Existing file paths found anywhere in the rendered transcript, newest first. */
|
|
155
156
|
private readonly transcriptFilePaths;
|
|
156
157
|
/** Canonical copyable transcript blocks, in their rendered visual order. */
|
|
@@ -188,7 +189,7 @@ export declare class ChatView {
|
|
|
188
189
|
/** Replay deferred live frames in wire order. The gate is already open, so each
|
|
189
190
|
* closure re-enters its entry point and dispatches immediately. */
|
|
190
191
|
private replayDeferredFrames;
|
|
191
|
-
/**
|
|
192
|
+
/** Apply the broker's random choice for a newly received user message. */
|
|
192
193
|
setWorkingActivity(activity: string): void;
|
|
193
194
|
/** Clear live turn state after the broker reports completion or the viewer observes dormancy. */
|
|
194
195
|
settleRun(): void;
|
|
@@ -27,7 +27,7 @@ import { ContextMessageComponent } from './context-message.js';
|
|
|
27
27
|
import { CRTR_OUTPUT_CUSTOM_TYPE, CrtrOutputMessageComponent, createCrtrBashToolDefinition, } from './crtr-output.js';
|
|
28
28
|
import { CRTR_CYCLE_DIVIDER_CUSTOM_TYPE } from '../../../core/runtime/session-cycles.js';
|
|
29
29
|
import { generatedContextExpandedBody, generatedContextPresentation, isRuntimeRestartContinuation, } from '../../../shared/generated-context.js';
|
|
30
|
-
import { assistantVisibleText, isTrueUserMessage,
|
|
30
|
+
import { assistantVisibleText, isTrueUserMessage, } from '../../../shared/tool-groups.js';
|
|
31
31
|
import { transformMessageDiagrams } from './diagram.js';
|
|
32
32
|
import { transformMessageHtml } from './html-markdown.js';
|
|
33
33
|
import { styleAttachMarkdownHeadings, styleAttachMessageMarkdown, styleAttachSummaryMarkdown, } from './markdown-headings.js';
|
|
@@ -42,7 +42,7 @@ import { ViewerAssistantMessageComponent } from './assistant-message.js';
|
|
|
42
42
|
import { CompositeViewportSource, MeasuredContainer, } from './measured-container.js';
|
|
43
43
|
import { readConfig, updateRawConfigAtomically } from '../../../core/config.js';
|
|
44
44
|
import { DEFAULT_CONDENSED_HISTORY, DEFAULT_LIVE_CYCLES } from '../../../types.js';
|
|
45
|
-
import {
|
|
45
|
+
import { applySnapshot as projectSnapshot, applyToolGroupSummary as projectToolGroupSummary, applyWorkingActivity as projectWorkingActivity, bashEnd as projectBashEnd, bashOutput as projectBashOutput, bashStart as projectBashStart, initialConvState, reduce as projectEvent, } from '../../conversation/projection.js';
|
|
46
46
|
/** Theme-derived chrome colors (spinner / dim / error) are supplied by the
|
|
47
47
|
* attach command via `ChatViewOptions.palette` (built from the live theme in
|
|
48
48
|
* config.ts). pi does not re-export the raw `theme` instance, so standalone
|
|
@@ -324,9 +324,12 @@ export class ChatView {
|
|
|
324
324
|
bashComponent;
|
|
325
325
|
/** The single active activity loader (working/compaction/retry), if any. */
|
|
326
326
|
activityLoader;
|
|
327
|
+
/** The shared broker transcript state; this renderer projects it into pi TUI
|
|
328
|
+
* components while retaining terminal-only folding and virtualization. */
|
|
329
|
+
projection = initialConvState();
|
|
327
330
|
/** Broker-selected normal label for this turn; compaction/retry temporarily
|
|
328
331
|
* replace it and restore it when the run remains active. */
|
|
329
|
-
workingActivity =
|
|
332
|
+
workingActivity = this.projection.workingActivity;
|
|
330
333
|
runActive = false;
|
|
331
334
|
// -- Single-writer snapshot ordering -------------------------------------
|
|
332
335
|
// A non-streaming catch-up yields to the event loop mid-build (so queued stdin
|
|
@@ -351,8 +354,6 @@ export class ChatView {
|
|
|
351
354
|
* snapshot AND the live event stream so `/copy` (getLastAssistantText) works
|
|
352
355
|
* whether the message arrived before or after attach. */
|
|
353
356
|
lastAssistantText;
|
|
354
|
-
/** Recent transcript text, oldest → newest, for the file-review path picker. */
|
|
355
|
-
transcriptTexts = [];
|
|
356
357
|
/** Existing file paths found anywhere in the rendered transcript, newest first. */
|
|
357
358
|
transcriptFilePaths = [];
|
|
358
359
|
/** Canonical copyable transcript blocks, in their rendered visual order. */
|
|
@@ -419,13 +420,12 @@ export class ChatView {
|
|
|
419
420
|
this.applyingSnapshot = true;
|
|
420
421
|
this.deferredFrames.length = 0;
|
|
421
422
|
this.resetChat();
|
|
422
|
-
this.
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
this.
|
|
426
|
-
this.seedToolGroupSummaries(snapshot.toolGroupSummaries);
|
|
423
|
+
this.projection = projectSnapshot(snapshot, this.projection);
|
|
424
|
+
this.workingActivity = this.projection.workingActivity;
|
|
425
|
+
this.runActive = this.projection.isStreaming;
|
|
426
|
+
this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails);
|
|
427
427
|
const renderedPendingTools = new Map();
|
|
428
|
-
const messages =
|
|
428
|
+
const messages = this.projection.messages;
|
|
429
429
|
const lastIndex = messages.length - 1;
|
|
430
430
|
// Cycles older than the trailing `live_cycles` are condensed into one nested
|
|
431
431
|
// container before the live region is built. It retains only configured prose
|
|
@@ -447,7 +447,7 @@ export class ChatView {
|
|
|
447
447
|
// snapshot: its in-flight tail + pending tools must be bound before any
|
|
448
448
|
// relayed message_update/message_end lands, so it builds synchronously
|
|
449
449
|
// (no await → no broker frame can interleave and freeze the live bubble).
|
|
450
|
-
if (!
|
|
450
|
+
if (!this.projection.isStreaming &&
|
|
451
451
|
i > liveStart &&
|
|
452
452
|
(i - liveStart) % SNAPSHOT_YIELD_EVERY === 0) {
|
|
453
453
|
await new Promise((resolve) => setImmediate(resolve));
|
|
@@ -472,7 +472,7 @@ export class ChatView {
|
|
|
472
472
|
// message would freeze at its snapshot value until the next turn — the
|
|
473
473
|
// common case, since you typically attach to a node that is working.
|
|
474
474
|
const isStreamingTail = i === lastIndex &&
|
|
475
|
-
|
|
475
|
+
this.projection.isStreaming &&
|
|
476
476
|
message.stopReason !== 'aborted' &&
|
|
477
477
|
message.stopReason !== 'error';
|
|
478
478
|
const hasProse = assistantVisibleText(message).trim() !== '';
|
|
@@ -550,7 +550,7 @@ export class ChatView {
|
|
|
550
550
|
// If we attached mid-turn, the `agent_start` that spins up the working loader
|
|
551
551
|
// already fired before we connected — restore it from the snapshot's streaming
|
|
552
552
|
// state so an actively-working node shows the spinner right away.
|
|
553
|
-
if (
|
|
553
|
+
if (this.projection.isStreaming)
|
|
554
554
|
this.setActivity(this.makeLoader(this.workingActivity));
|
|
555
555
|
this.tui.requestRender();
|
|
556
556
|
// Build complete and still current (a mismatch would have returned above):
|
|
@@ -617,11 +617,15 @@ export class ChatView {
|
|
|
617
617
|
for (const replay of frames)
|
|
618
618
|
replay();
|
|
619
619
|
}
|
|
620
|
-
/**
|
|
620
|
+
/** Apply the broker's random choice for a newly received user message. */
|
|
621
621
|
setWorkingActivity(activity) {
|
|
622
622
|
if (this.deferIfBuilding(() => this.setWorkingActivity(activity)))
|
|
623
623
|
return;
|
|
624
|
-
|
|
624
|
+
const wasShowingWorkingActivity = this.projection.activity === this.workingActivity;
|
|
625
|
+
this.projection = projectWorkingActivity(this.projection, activity);
|
|
626
|
+
this.workingActivity = this.projection.workingActivity;
|
|
627
|
+
if (this.runActive && wasShowingWorkingActivity)
|
|
628
|
+
this.setActivity(this.makeLoader(this.workingActivity));
|
|
625
629
|
}
|
|
626
630
|
/** Clear live turn state after the broker reports completion or the viewer observes dormancy. */
|
|
627
631
|
settleRun() {
|
|
@@ -727,9 +731,10 @@ export class ChatView {
|
|
|
727
731
|
// welcome is still building is replayed after it, never interleaved into it.
|
|
728
732
|
if (this.deferIfBuilding(() => this.handleEvent(event)))
|
|
729
733
|
return;
|
|
734
|
+
this.projection = projectEvent(this.projection, event);
|
|
730
735
|
switch (event.type) {
|
|
731
736
|
case 'agent_start': {
|
|
732
|
-
this.runActive =
|
|
737
|
+
this.runActive = this.projection.isStreaming;
|
|
733
738
|
for (const component of this.pendingTools.values())
|
|
734
739
|
this.settleGroupTool(component);
|
|
735
740
|
this.pendingTools.clear();
|
|
@@ -880,23 +885,25 @@ export class ChatView {
|
|
|
880
885
|
break;
|
|
881
886
|
}
|
|
882
887
|
case 'tool_execution_update': {
|
|
883
|
-
this.
|
|
888
|
+
const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.partialResult;
|
|
889
|
+
this.pushTranscriptValue(result);
|
|
884
890
|
const component = this.pendingTools.get(event.toolCallId);
|
|
885
891
|
if (component) {
|
|
886
|
-
component.updateResult(
|
|
887
|
-
this.registerCopyBlock(component, 'tool', this.toolResultText(
|
|
892
|
+
component.updateResult(result, true);
|
|
893
|
+
this.registerCopyBlock(component, 'tool', this.toolResultText(result));
|
|
888
894
|
this.historyContainer.markDirty(component);
|
|
889
895
|
}
|
|
890
896
|
break;
|
|
891
897
|
}
|
|
892
898
|
case 'tool_execution_end': {
|
|
893
|
-
this.
|
|
899
|
+
const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.result;
|
|
900
|
+
this.pushTranscriptValue(result);
|
|
894
901
|
const component = this.pendingTools.get(event.toolCallId);
|
|
895
902
|
if (component) {
|
|
896
|
-
component.updateResult(
|
|
897
|
-
this.registerCopyBlock(component, 'tool', this.toolResultText(
|
|
903
|
+
component.updateResult(result);
|
|
904
|
+
this.registerCopyBlock(component, 'tool', this.toolResultText(result));
|
|
898
905
|
this.pendingTools.delete(event.toolCallId);
|
|
899
|
-
this.settleGroupTool(component,
|
|
906
|
+
this.settleGroupTool(component, result, event.isError);
|
|
900
907
|
this.applyToolDisplay();
|
|
901
908
|
this.historyContainer.markDirty(component);
|
|
902
909
|
}
|
|
@@ -971,6 +978,7 @@ export class ChatView {
|
|
|
971
978
|
bashStart(command, excludeFromContext) {
|
|
972
979
|
if (this.deferIfBuilding(() => this.bashStart(command, excludeFromContext)))
|
|
973
980
|
return;
|
|
981
|
+
this.projection = projectBashStart(this.projection, command, excludeFromContext);
|
|
974
982
|
this.closeOpenGroup();
|
|
975
983
|
this.settleBashComponent();
|
|
976
984
|
let component;
|
|
@@ -982,6 +990,7 @@ export class ChatView {
|
|
|
982
990
|
bashOutput(chunk) {
|
|
983
991
|
if (this.deferIfBuilding(() => this.bashOutput(chunk)))
|
|
984
992
|
return;
|
|
993
|
+
this.projection = projectBashOutput(this.projection, chunk);
|
|
985
994
|
this.pushTranscriptText(chunk);
|
|
986
995
|
if (this.bashComponent) {
|
|
987
996
|
this.bashComponent.appendOutput(chunk);
|
|
@@ -992,6 +1001,7 @@ export class ChatView {
|
|
|
992
1001
|
bashEnd(result) {
|
|
993
1002
|
if (this.deferIfBuilding(() => this.bashEnd(result)))
|
|
994
1003
|
return;
|
|
1004
|
+
this.projection = projectBashEnd(this.projection, result);
|
|
995
1005
|
this.settleBashComponent(result);
|
|
996
1006
|
this.tui.requestRender();
|
|
997
1007
|
}
|
|
@@ -1269,9 +1279,8 @@ export class ChatView {
|
|
|
1269
1279
|
}
|
|
1270
1280
|
seedToolGroupSummaries(summaries) {
|
|
1271
1281
|
this.groupSummaries.clear();
|
|
1272
|
-
for (const [key, summary] of Object.entries(
|
|
1282
|
+
for (const [key, summary] of Object.entries(summaries))
|
|
1273
1283
|
this.groupSummaries.set(key, summary);
|
|
1274
|
-
}
|
|
1275
1284
|
}
|
|
1276
1285
|
/** Broker frames can arrive before or after their group's events, and snapshot
|
|
1277
1286
|
* rebuilding defers them through the single-writer gate, so this stores first
|
|
@@ -1279,10 +1288,11 @@ export class ChatView {
|
|
|
1279
1288
|
applyToolGroupSummary(key, summary) {
|
|
1280
1289
|
if (this.deferIfBuilding(() => this.applyToolGroupSummary(key, summary)))
|
|
1281
1290
|
return;
|
|
1282
|
-
|
|
1283
|
-
|
|
1291
|
+
this.projection = projectToolGroupSummary(this.projection, key, summary);
|
|
1292
|
+
const projected = this.projection.toolGroupSummaryDetails[key];
|
|
1293
|
+
if (projected === undefined)
|
|
1284
1294
|
return;
|
|
1285
|
-
this.groupSummaries.set(key,
|
|
1295
|
+
this.groupSummaries.set(key, projected);
|
|
1286
1296
|
this.applyToolDisplay();
|
|
1287
1297
|
}
|
|
1288
1298
|
applyGroupDisplay(group) {
|
|
@@ -1416,7 +1426,6 @@ export class ChatView {
|
|
|
1416
1426
|
this.lastAssistantText = undefined;
|
|
1417
1427
|
this.copyBlockRecords.length = 0;
|
|
1418
1428
|
this.copyIndex.clear();
|
|
1419
|
-
this.transcriptTexts.length = 0;
|
|
1420
1429
|
this.transcriptFilePaths.length = 0;
|
|
1421
1430
|
this.historyContainer.clear();
|
|
1422
1431
|
}
|
|
@@ -1604,9 +1613,6 @@ export class ChatView {
|
|
|
1604
1613
|
const trimmed = text.trim();
|
|
1605
1614
|
if (trimmed === '')
|
|
1606
1615
|
return;
|
|
1607
|
-
this.transcriptTexts.push(trimmed.slice(0, 8 * 1024));
|
|
1608
|
-
if (this.transcriptTexts.length > 200)
|
|
1609
|
-
this.transcriptTexts.splice(0, this.transcriptTexts.length - 200);
|
|
1610
1616
|
const paths = extractFilePaths([trimmed], this.cwd);
|
|
1611
1617
|
if (paths.length === 0)
|
|
1612
1618
|
return;
|
|
@@ -77,7 +77,7 @@ function shellTokens(segment) {
|
|
|
77
77
|
}
|
|
78
78
|
/** Deliberately match an executable token, not a result-shaped string or a
|
|
79
79
|
* quoted command fragment. */
|
|
80
|
-
function
|
|
80
|
+
function invokesMemoryCommand(args, verb) {
|
|
81
81
|
const command = object(args)?.command;
|
|
82
82
|
if (typeof command !== 'string')
|
|
83
83
|
return false;
|
|
@@ -86,20 +86,22 @@ function invokesMemoryRead(args) {
|
|
|
86
86
|
while (/^[A-Za-z_][A-Za-z0-9_]*=\S+$/.test(tokens[0] ?? ''))
|
|
87
87
|
tokens.shift();
|
|
88
88
|
const executable = tokens[0]?.split('/').at(-1);
|
|
89
|
-
return (executable === 'crtr' || executable === 'crouter') && tokens[1] === 'memory' && tokens[2] ===
|
|
89
|
+
return (executable === 'crtr' || executable === 'crouter') && tokens[1] === 'memory' && tokens[2] === verb;
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
/** A resolved read
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
function resolvedMemories(result) {
|
|
92
|
+
/** A resolved read/write begins with the identity fields emitted by its leaf.
|
|
93
|
+
* The write receipt also requires `created`, so result-shaped read output can
|
|
94
|
+
* never be reported as a saved memory. */
|
|
95
|
+
function resolvedMemories(result, action) {
|
|
96
96
|
const memories = [];
|
|
97
|
-
const identity =
|
|
97
|
+
const identity = action === 'read'
|
|
98
|
+
? /^- name:\s*([^\r\n]+)\r?\n- kind:\s*[^\r\n]+\r?\n- scope:\s*[^\r\n]+(?:\r?\n- path:\s*([^\r\n]+)|\r?\n\r?\n\*\*path:\*\*\s*([^\r\n]+))?/gm
|
|
99
|
+
: /^- name:\s*([^\r\n]+)\r?\n- kind:\s*[^\r\n]+\r?\n- scope:\s*[^\r\n]+\r?\n- created:\s*(?:true|false)(?:\r?\n- path:\s*([^\r\n]+)|\r?\n\r?\n\*\*path:\*\*\s*([^\r\n]+))?/gm;
|
|
98
100
|
for (const match of resultText(result).matchAll(identity)) {
|
|
99
101
|
const name = match[1]?.trim();
|
|
100
102
|
const path = (match[2] ?? match[3])?.trim();
|
|
101
103
|
if (name)
|
|
102
|
-
memories.push(path ? { name, path } : { name });
|
|
104
|
+
memories.push(path ? { action, name, path } : { action, name });
|
|
103
105
|
}
|
|
104
106
|
return memories;
|
|
105
107
|
}
|
|
@@ -168,11 +170,16 @@ export class GroupActivityRecorder {
|
|
|
168
170
|
return Object.freeze({ files: Object.freeze(files), memories: Object.freeze(memories) });
|
|
169
171
|
}
|
|
170
172
|
extract(entry, result) {
|
|
171
|
-
if (entry.name === 'bash'
|
|
172
|
-
for (const
|
|
173
|
-
if (!
|
|
174
|
-
|
|
175
|
-
|
|
173
|
+
if (entry.name === 'bash') {
|
|
174
|
+
for (const action of ['read', 'write']) {
|
|
175
|
+
if (!invokesMemoryCommand(entry.args, action))
|
|
176
|
+
continue;
|
|
177
|
+
for (const memory of resolvedMemories(result, action)) {
|
|
178
|
+
const key = `${action}:${memory.path ?? memory.name}`;
|
|
179
|
+
if (!this.memorySet.has(key)) {
|
|
180
|
+
this.memorySet.add(key);
|
|
181
|
+
this.memories.push(memory);
|
|
182
|
+
}
|
|
176
183
|
}
|
|
177
184
|
}
|
|
178
185
|
return;
|