@north-light/crouter 0.3.173 → 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} +27 -179
- 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 +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- 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
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { TUI } from '@earendil-works/pi-tui';
|
|
2
|
-
import type { CanvasSource } from '../../core/canvas/source.js';
|
|
3
|
-
import type { SurfaceRegion } from '../surfaces/region.js';
|
|
4
|
-
export interface CompanionRegionOptions {
|
|
5
|
-
companionNodeId: string;
|
|
6
|
-
tui: TUI;
|
|
7
|
-
canvasSource: CanvasSource;
|
|
8
|
-
reopenDormantCompanion(): Promise<void>;
|
|
9
|
-
onRequestClose(): void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* A companion conversation region for a composed review. Renders connection
|
|
13
|
-
* state, editor, and transcript in a bounded viewport. The only repaint channel
|
|
14
|
-
* is onDirty; geometry is always pushed.
|
|
15
|
-
*/
|
|
16
|
-
export declare class CompanionRegion implements SurfaceRegion {
|
|
17
|
-
private readonly editor;
|
|
18
|
-
private readonly conversation;
|
|
19
|
-
private cols;
|
|
20
|
-
private rows;
|
|
21
|
-
private focused;
|
|
22
|
-
private isDirty;
|
|
23
|
-
private renderCache;
|
|
24
|
-
private unreadCount;
|
|
25
|
-
private connectionState;
|
|
26
|
-
private noticeText;
|
|
27
|
-
private onDirtyCallback?;
|
|
28
|
-
constructor(opts: CompanionRegionOptions);
|
|
29
|
-
setViewport(cols: number, rows: number): void;
|
|
30
|
-
render(): string[];
|
|
31
|
-
handleInput(data: string): boolean;
|
|
32
|
-
handleWheel(direction: 'up' | 'down', lines: number): boolean;
|
|
33
|
-
setFocused(value: boolean): void;
|
|
34
|
-
summary(): string;
|
|
35
|
-
onDirty(fn: () => void): void;
|
|
36
|
-
close(): void;
|
|
37
|
-
/** Open the connection to the companion broker. */
|
|
38
|
-
open(): Promise<void>;
|
|
39
|
-
/** Submit text to the companion. */
|
|
40
|
-
submit(text: string): void;
|
|
41
|
-
private renderStateLine;
|
|
42
|
-
private fitLine;
|
|
43
|
-
private padLine;
|
|
44
|
-
private stripMarkers;
|
|
45
|
-
private onConnectionChange;
|
|
46
|
-
private showNotice;
|
|
47
|
-
private isHidden;
|
|
48
|
-
/** One arriving message while the composition gives this region no rectangle. */
|
|
49
|
-
private countUnread;
|
|
50
|
-
private dirty;
|
|
51
|
-
}
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
// conversation/region.ts — the broker-backed companion region in a composed review.
|
|
2
|
-
//
|
|
3
|
-
// CompanionRegion implements SurfaceRegion to render a companion conversation
|
|
4
|
-
// within a bounded rectangle. It owns a SurfaceConversation (broker connection),
|
|
5
|
-
// an editor, and a transcript viewport. Geometry is pushed; repaint flows only
|
|
6
|
-
// through onDirty.
|
|
7
|
-
import { getSelectListTheme } from '@earendil-works/pi-coding-agent';
|
|
8
|
-
import { CURSOR_MARKER } from '@earendil-works/pi-tui';
|
|
9
|
-
import { attachPalette, createKeybindingsManager } from '../attach/config.js';
|
|
10
|
-
import { TitledEditor } from '../attach/input/titled-editor.js';
|
|
11
|
-
import { cropAroundCursor, MIN_TRANSCRIPT_ROWS } from '../attach/session/frame.js';
|
|
12
|
-
import { clipLine, visibleWidth } from '../inbox/tui/ansi.js';
|
|
13
|
-
import { SurfaceConversation } from './conversation.js';
|
|
14
|
-
const EDITOR_MAX_FRACTION = 0.5;
|
|
15
|
-
/**
|
|
16
|
-
* A companion conversation region for a composed review. Renders connection
|
|
17
|
-
* state, editor, and transcript in a bounded viewport. The only repaint channel
|
|
18
|
-
* is onDirty; geometry is always pushed.
|
|
19
|
-
*/
|
|
20
|
-
export class CompanionRegion {
|
|
21
|
-
editor;
|
|
22
|
-
conversation;
|
|
23
|
-
cols = 0;
|
|
24
|
-
rows = 0;
|
|
25
|
-
focused = false;
|
|
26
|
-
isDirty = true;
|
|
27
|
-
renderCache = {};
|
|
28
|
-
unreadCount = 0;
|
|
29
|
-
connectionState = 'connecting';
|
|
30
|
-
noticeText;
|
|
31
|
-
onDirtyCallback;
|
|
32
|
-
constructor(opts) {
|
|
33
|
-
// Reuse the attach viewer's initialized theme and full keybinding
|
|
34
|
-
// definitions. TitledEditor only needs invalidation plus the terminal handle,
|
|
35
|
-
// so its own repaint requests return through this region's onDirty channel.
|
|
36
|
-
const pal = attachPalette();
|
|
37
|
-
const editorTheme = { borderColor: pal.border, selectList: getSelectListTheme() };
|
|
38
|
-
const keybindings = createKeybindingsManager();
|
|
39
|
-
const editorTui = {
|
|
40
|
-
requestRender: () => this.dirty(),
|
|
41
|
-
terminal: opts.tui.terminal,
|
|
42
|
-
};
|
|
43
|
-
this.editor = new TitledEditor(editorTui, editorTheme, keybindings, { paddingX: 1 });
|
|
44
|
-
this.editor.title = opts.companionNodeId;
|
|
45
|
-
this.editor.onSubmit = (text) => this.submit(text);
|
|
46
|
-
// Conversation owns the broker connection and chat state
|
|
47
|
-
this.conversation = new SurfaceConversation({
|
|
48
|
-
nodeId: opts.companionNodeId,
|
|
49
|
-
tui: opts.tui,
|
|
50
|
-
canvasSource: opts.canvasSource,
|
|
51
|
-
reopenDormantCompanion: opts.reopenDormantCompanion,
|
|
52
|
-
onDirty: () => this.dirty(),
|
|
53
|
-
onConnection: (state) => this.onConnectionChange(state),
|
|
54
|
-
onMessage: () => this.countUnread(),
|
|
55
|
-
notice: (text) => this.showNotice(text),
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
setViewport(cols, rows) {
|
|
59
|
-
const cols2 = Math.max(0, Math.floor(cols));
|
|
60
|
-
const rows2 = Math.max(0, Math.floor(rows));
|
|
61
|
-
if (this.cols === cols2 && this.rows === rows2)
|
|
62
|
-
return;
|
|
63
|
-
const wasHidden = this.isHidden();
|
|
64
|
-
this.cols = cols2;
|
|
65
|
-
this.rows = rows2;
|
|
66
|
-
if (wasHidden && !this.isHidden())
|
|
67
|
-
this.unreadCount = 0;
|
|
68
|
-
this.isDirty = true;
|
|
69
|
-
if (this.onDirtyCallback)
|
|
70
|
-
this.onDirtyCallback();
|
|
71
|
-
}
|
|
72
|
-
render() {
|
|
73
|
-
const { cols, rows } = this;
|
|
74
|
-
// Return cached result if geometry hasn't changed
|
|
75
|
-
if (this.renderCache.cols === cols && this.renderCache.rows === rows && !this.isDirty) {
|
|
76
|
-
return this.renderCache.lines ?? [];
|
|
77
|
-
}
|
|
78
|
-
if (cols === 0 || rows === 0) {
|
|
79
|
-
this.renderCache = { cols, rows, lines: [] };
|
|
80
|
-
this.isDirty = false;
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
const lines = [];
|
|
84
|
-
// 1. State line at the top (1 row)
|
|
85
|
-
lines.push(this.renderStateLine());
|
|
86
|
-
// 2. Editor section
|
|
87
|
-
const availableRows = rows - 1; // -1 for state line
|
|
88
|
-
const editorMaxRows = Math.max(1, Math.floor(availableRows * EDITOR_MAX_FRACTION));
|
|
89
|
-
const transcriptMinRows = MIN_TRANSCRIPT_ROWS;
|
|
90
|
-
// Calculate actual editor allocation
|
|
91
|
-
const editorRows = Math.max(1, Math.min(editorMaxRows, availableRows - transcriptMinRows));
|
|
92
|
-
const transcriptRows = Math.max(0, availableRows - editorRows);
|
|
93
|
-
// Render and crop editor
|
|
94
|
-
const editorLines = this.editor.render(cols);
|
|
95
|
-
const croppedEditor = cropAroundCursor(editorLines, editorRows);
|
|
96
|
-
// Pad or clip to exact allocation
|
|
97
|
-
while (croppedEditor.length < editorRows) {
|
|
98
|
-
croppedEditor.push('');
|
|
99
|
-
}
|
|
100
|
-
if (croppedEditor.length > editorRows) {
|
|
101
|
-
croppedEditor.length = editorRows;
|
|
102
|
-
}
|
|
103
|
-
lines.push(...croppedEditor);
|
|
104
|
-
// 3. Transcript section
|
|
105
|
-
if (transcriptRows > 0) {
|
|
106
|
-
const transcriptLines = this.conversation.viewport.renderSlice(cols, transcriptRows);
|
|
107
|
-
// Pad to exact allocation
|
|
108
|
-
while (transcriptLines.length < transcriptRows) {
|
|
109
|
-
transcriptLines.push('');
|
|
110
|
-
}
|
|
111
|
-
if (transcriptLines.length > transcriptRows) {
|
|
112
|
-
transcriptLines.length = transcriptRows;
|
|
113
|
-
}
|
|
114
|
-
lines.push(...transcriptLines);
|
|
115
|
-
}
|
|
116
|
-
// Ensure we have exactly `rows` lines, each clipped to `cols` display cells
|
|
117
|
-
while (lines.length < rows) {
|
|
118
|
-
lines.push('');
|
|
119
|
-
}
|
|
120
|
-
if (lines.length > rows) {
|
|
121
|
-
lines.length = rows;
|
|
122
|
-
}
|
|
123
|
-
// Fit each line to the exact column width without splitting ANSI or the
|
|
124
|
-
// zero-width cursor marker. An unfocused region must emit no marker.
|
|
125
|
-
const clipped = lines.map((line) => this.fitLine(line, cols));
|
|
126
|
-
if (!this.focused) {
|
|
127
|
-
for (let i = 0; i < clipped.length; i++) {
|
|
128
|
-
clipped[i] = this.stripMarkers(clipped[i]);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
this.renderCache = { cols, rows, lines: clipped };
|
|
132
|
-
this.isDirty = false;
|
|
133
|
-
return clipped;
|
|
134
|
-
}
|
|
135
|
-
handleInput(data) {
|
|
136
|
-
if (this.focused) {
|
|
137
|
-
// TitledEditor's handleInput returns void, so we route all input to it
|
|
138
|
-
// when focused and assume it was consumed
|
|
139
|
-
this.editor.handleInput(data);
|
|
140
|
-
this.dirty();
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
handleWheel(direction, lines) {
|
|
146
|
-
// Scroll the transcript: negative = toward older, positive = toward newer
|
|
147
|
-
const scrollLines = direction === 'up' ? -lines : lines;
|
|
148
|
-
this.conversation.viewport.scrollBy(scrollLines);
|
|
149
|
-
this.dirty();
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
setFocused(value) {
|
|
153
|
-
if (this.focused === value && this.editor.focused === value)
|
|
154
|
-
return;
|
|
155
|
-
this.focused = value;
|
|
156
|
-
this.editor.focused = value;
|
|
157
|
-
if (value)
|
|
158
|
-
this.unreadCount = 0;
|
|
159
|
-
this.isDirty = true;
|
|
160
|
-
if (this.onDirtyCallback)
|
|
161
|
-
this.onDirtyCallback();
|
|
162
|
-
}
|
|
163
|
-
summary() {
|
|
164
|
-
const parts = [];
|
|
165
|
-
// A zero viewport is the composition's hidden-region signal in single mode.
|
|
166
|
-
if (this.isHidden() && this.unreadCount > 0)
|
|
167
|
-
parts.push(`${this.unreadCount}✉`);
|
|
168
|
-
// Show connection state
|
|
169
|
-
if (this.connectionState === 'connecting') {
|
|
170
|
-
parts.push('connecting…');
|
|
171
|
-
}
|
|
172
|
-
else if (this.connectionState === 'reconnecting') {
|
|
173
|
-
parts.push('reconnecting…');
|
|
174
|
-
}
|
|
175
|
-
else if (this.connectionState === 'dormant') {
|
|
176
|
-
parts.push('dormant');
|
|
177
|
-
}
|
|
178
|
-
else if (this.connectionState === 'finished') {
|
|
179
|
-
parts.push('finished');
|
|
180
|
-
}
|
|
181
|
-
else if (this.connectionState === 'gone') {
|
|
182
|
-
parts.push('gone');
|
|
183
|
-
}
|
|
184
|
-
return parts.join(' · ');
|
|
185
|
-
}
|
|
186
|
-
onDirty(fn) {
|
|
187
|
-
this.onDirtyCallback = fn;
|
|
188
|
-
}
|
|
189
|
-
close() {
|
|
190
|
-
this.conversation.close();
|
|
191
|
-
}
|
|
192
|
-
/** Open the connection to the companion broker. */
|
|
193
|
-
async open() {
|
|
194
|
-
try {
|
|
195
|
-
await this.conversation.open();
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
// Already handled by the conversation's notice callback
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** Submit text to the companion. */
|
|
202
|
-
submit(text) {
|
|
203
|
-
this.editor.setText('');
|
|
204
|
-
this.conversation.submit(text);
|
|
205
|
-
}
|
|
206
|
-
renderStateLine() {
|
|
207
|
-
const parts = [];
|
|
208
|
-
if (this.connectionState === 'connecting') {
|
|
209
|
-
parts.push('connecting…');
|
|
210
|
-
}
|
|
211
|
-
else if (this.connectionState === 'reconnecting') {
|
|
212
|
-
parts.push('reconnecting…');
|
|
213
|
-
}
|
|
214
|
-
else if (this.connectionState === 'dormant') {
|
|
215
|
-
parts.push('dormant');
|
|
216
|
-
}
|
|
217
|
-
else if (this.connectionState === 'finished') {
|
|
218
|
-
parts.push('finished');
|
|
219
|
-
}
|
|
220
|
-
else if (this.connectionState === 'gone') {
|
|
221
|
-
parts.push('gone');
|
|
222
|
-
}
|
|
223
|
-
if (this.noticeText)
|
|
224
|
-
parts.push(this.noticeText);
|
|
225
|
-
return this.fitLine(parts.join(' · '), this.cols);
|
|
226
|
-
}
|
|
227
|
-
fitLine(line, cols) {
|
|
228
|
-
const markerAt = line.indexOf(CURSOR_MARKER);
|
|
229
|
-
const fitted = this.padLine(clipLine(line, cols), cols);
|
|
230
|
-
if (markerAt === -1)
|
|
231
|
-
return fitted;
|
|
232
|
-
// The shared clipper preserves both ANSI and pi-tui APC sequences whole.
|
|
233
|
-
// Keep the zero-width marker only when its cursor cell remains inside this
|
|
234
|
-
// region's rectangle.
|
|
235
|
-
return visibleWidth(line.slice(0, markerAt)) < cols ? fitted : this.stripMarkers(fitted);
|
|
236
|
-
}
|
|
237
|
-
padLine(line, cols) {
|
|
238
|
-
return line + ' '.repeat(Math.max(0, cols - visibleWidth(this.stripMarkers(line))));
|
|
239
|
-
}
|
|
240
|
-
stripMarkers(line) {
|
|
241
|
-
return line.split(CURSOR_MARKER).join('');
|
|
242
|
-
}
|
|
243
|
-
onConnectionChange(state) {
|
|
244
|
-
this.connectionState = state;
|
|
245
|
-
this.isDirty = true;
|
|
246
|
-
if (this.onDirtyCallback)
|
|
247
|
-
this.onDirtyCallback();
|
|
248
|
-
}
|
|
249
|
-
showNotice(text) {
|
|
250
|
-
this.noticeText = text || undefined;
|
|
251
|
-
}
|
|
252
|
-
isHidden() {
|
|
253
|
-
return this.cols === 0 || this.rows === 0;
|
|
254
|
-
}
|
|
255
|
-
/** One arriving message while the composition gives this region no rectangle. */
|
|
256
|
-
countUnread() {
|
|
257
|
-
if (this.isHidden())
|
|
258
|
-
this.unreadCount++;
|
|
259
|
-
}
|
|
260
|
-
dirty() {
|
|
261
|
-
this.isDirty = true;
|
|
262
|
-
if (this.onDirtyCallback)
|
|
263
|
-
this.onDirtyCallback();
|
|
264
|
-
}
|
|
265
|
-
}
|
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { createServer } from 'node:http';
|
|
3
|
-
import { existsSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
import { claimExists, claimTicket } from '#core/human/claim';
|
|
7
|
-
import { atomicWriteJson, deckPath } from '#core/human/convention';
|
|
8
|
-
import { ticketDir } from '#core/human/root';
|
|
9
|
-
import { cancelTicket, completeDeck, submitDeck, submitReview, takeoverAndCompleteDeck } from '#core/human/tickets';
|
|
10
|
-
import { inboxLayout } from '../layout.js';
|
|
11
|
-
import { InboxController } from '../controller.js';
|
|
12
|
-
import { buildInboxLines } from '../tui.js';
|
|
13
|
-
const key = (part = {}) => ({ ctrl: false, meta: false, upArrow: false, downArrow: false, leftArrow: false, rightArrow: false, wordLeft: false, wordRight: false, home: false, end: false, pageUp: false, pageDown: false, del: false, return: false, newline: false, escape: false, tab: false, backspace: false, ...part });
|
|
14
|
-
function fakeHost() {
|
|
15
|
-
let closed = false;
|
|
16
|
-
const cleanup = [];
|
|
17
|
-
const handle = {
|
|
18
|
-
close() {
|
|
19
|
-
if (closed)
|
|
20
|
-
return;
|
|
21
|
-
closed = true;
|
|
22
|
-
for (const fn of cleanup)
|
|
23
|
-
void fn();
|
|
24
|
-
cleanup.length = 0;
|
|
25
|
-
},
|
|
26
|
-
invalidate() { },
|
|
27
|
-
onClose(fn) {
|
|
28
|
-
if (!closed)
|
|
29
|
-
cleanup.push(fn);
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
return {
|
|
33
|
-
host: {
|
|
34
|
-
capabilities: { remote: false, canFocusNode: false },
|
|
35
|
-
mount() { return handle; },
|
|
36
|
-
notice() { },
|
|
37
|
-
suspendForChild() { return () => { }; },
|
|
38
|
-
focusNode: async () => false,
|
|
39
|
-
pickReviewFile: async () => null,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
const tui = {};
|
|
44
|
-
const canvasSource = {};
|
|
45
|
-
const makeController = (options) => {
|
|
46
|
-
const harness = fakeHost();
|
|
47
|
-
const controller = new InboxController({
|
|
48
|
-
host: harness.host,
|
|
49
|
-
tui,
|
|
50
|
-
canvasSource,
|
|
51
|
-
onDirty: () => { },
|
|
52
|
-
onClosed: () => { },
|
|
53
|
-
...options,
|
|
54
|
-
});
|
|
55
|
-
return controller;
|
|
56
|
-
};
|
|
57
|
-
const item = (id) => ({ dir: `/tickets/${id}`, id, kind: 'deck', title: id, subtitle: `${id} requires your attention.`, interactionCount: 1, source: {}, blockedSince: '2025-01-01T00:00:00.000Z' });
|
|
58
|
-
const tick = () => new Promise((resolve) => setImmediate(resolve));
|
|
59
|
-
function select(controller, dir) {
|
|
60
|
-
const count = controller.snapshot().items.length;
|
|
61
|
-
const matches = () => {
|
|
62
|
-
const selected = controller.snapshot().selectedDir;
|
|
63
|
-
return selected !== undefined && realpathSync(selected) === realpathSync(dir);
|
|
64
|
-
};
|
|
65
|
-
for (let i = 0; i < count && !matches(); i++)
|
|
66
|
-
controller.handleKey('j', key());
|
|
67
|
-
assert.ok(matches(), `expected ${dir} to be selectable`);
|
|
68
|
-
}
|
|
69
|
-
async function waitFor(predicate, message) {
|
|
70
|
-
const deadline = Date.now() + 1_000;
|
|
71
|
-
while (!predicate()) {
|
|
72
|
-
if (Date.now() >= deadline)
|
|
73
|
-
throw new Error(message);
|
|
74
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
assert.deepEqual(inboxLayout(120, 30), { mode: 'two-column', listWidth: 40, detailWidth: 79, height: 30 });
|
|
78
|
-
assert.equal(inboxLayout(80, 24).mode, 'list');
|
|
79
|
-
assert.equal(inboxLayout(80, 24, 'detail').mode, 'detail');
|
|
80
|
-
assert.equal(inboxLayout(59, 18).mode, 'minimum');
|
|
81
|
-
const crowded = Array.from({ length: 20 }, (_, index) => item(`ticket-${index}`));
|
|
82
|
-
const visibleRows = buildInboxLines(crowded, 40, 10, 8).join('\n');
|
|
83
|
-
assert.ok(visibleRows.includes('ticket-10'), 'list viewport keeps the selected ticket visible');
|
|
84
|
-
assert.ok(visibleRows.includes('↑') && visibleRows.includes('↓'), 'list viewport signals tickets above and below');
|
|
85
|
-
const claimedRows = buildInboxLines([{ ...item('claimed'), subtitle: 'Approve the deployment because production is blocked.', claim: { owner: 'silas', claimedAt: '2025-01-01T00:00:00.000Z', heartbeatAt: '2025-01-01T00:00:00.000Z' } }], 120, 0).join('\n');
|
|
86
|
-
assert.ok(claimedRows.includes('claimed by silas · Approve the deployment because production is blocked.'), 'claimed rows compose claim status with the required subtitle');
|
|
87
|
-
let rows = [item('b'), item('a')];
|
|
88
|
-
const stable = makeController({ cols: 100, rows: 24, scan: () => rows });
|
|
89
|
-
assert.ok(!stable.render().join('\n').includes('unknown source'), 'passive detail omits missing source labels instead of rendering a fallback');
|
|
90
|
-
stable.handleKey('j', key());
|
|
91
|
-
assert.equal(stable.snapshot().selectedDir, '/tickets/a');
|
|
92
|
-
rows = [item('new'), ...rows];
|
|
93
|
-
stable.rescan();
|
|
94
|
-
assert.equal(stable.snapshot().selectedDir, '/tickets/a', 'prepend preserves selected ticket id');
|
|
95
|
-
rows = [item('new'), item('b')];
|
|
96
|
-
stable.rescan();
|
|
97
|
-
assert.equal(stable.snapshot().selectedDir, '/tickets/b', 'removed selection chooses the prior index');
|
|
98
|
-
let mode = 'success';
|
|
99
|
-
async function startDaemon() {
|
|
100
|
-
const server = createServer(async (req, res) => {
|
|
101
|
-
if (!req.url?.endsWith('/resolve')) {
|
|
102
|
-
res.statusCode = 404;
|
|
103
|
-
res.end(JSON.stringify({ error: { code: 'not_found', message: 'not found' } }));
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
if (mode === 'unreachable') {
|
|
107
|
-
res.statusCode = 503;
|
|
108
|
-
res.end(JSON.stringify({ error: { code: 'daemon_unavailable', message: 'offline' } }));
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const body = await new Promise((resolve) => {
|
|
112
|
-
let text = '';
|
|
113
|
-
req.on('data', (chunk) => { text += chunk; });
|
|
114
|
-
req.on('end', () => resolve(text));
|
|
115
|
-
});
|
|
116
|
-
const nodeId = req.url.split('/').at(-2);
|
|
117
|
-
if (mode === 'already_resolved') {
|
|
118
|
-
res.statusCode = 409;
|
|
119
|
-
res.end(JSON.stringify({ error: { code: 'ticket_already_resolved', message: 'ticket already resolved' } }));
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const request = JSON.parse(body);
|
|
123
|
-
if (request.responses === undefined)
|
|
124
|
-
throw new Error('expected a deck resolution');
|
|
125
|
-
takeoverAndCompleteDeck(ticketDir(nodeId), request.responses, { host: 'daemon', pid: 1 });
|
|
126
|
-
if (mode === 'delivery_failed') {
|
|
127
|
-
res.statusCode = 500;
|
|
128
|
-
res.end(JSON.stringify({ error: { code: 'delivery_failed', message: 'final report delivery failed' } }));
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
res.end(JSON.stringify({ delivered: true, kind: 'deck' }));
|
|
132
|
-
});
|
|
133
|
-
await new Promise((resolve) => server.listen(join(process.env['CRTR_HOME'], 'crtrd.sock'), resolve));
|
|
134
|
-
return server;
|
|
135
|
-
}
|
|
136
|
-
const temp = mkdtempSync(join(tmpdir(), 'crtr-inbox-controller-'));
|
|
137
|
-
process.env['CRTR_HOME'] = temp;
|
|
138
|
-
const server = await startDaemon();
|
|
139
|
-
const deck = (id) => ({ title: id, source: { blockedSince: new Date().toISOString(), sessionName: 'Release planning', nodeId: 'node-private-123' }, interactions: [{ id: 'answer', title: 'Answer', subtitle: 'Answer requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] }] });
|
|
140
|
-
try {
|
|
141
|
-
const first = submitDeck({ dir: ticketDir('first'), deck: deck('first') });
|
|
142
|
-
const active = makeController({ cols: 100, rows: 24 });
|
|
143
|
-
const initialInbox = active.render().join('\n');
|
|
144
|
-
assert.ok(initialInbox.includes('Answer requires your attention.'), 'the selected ticket preview renders its required subtitle');
|
|
145
|
-
assert.ok(initialInbox.includes('1 question'), 'the selected ticket preview renders its question count');
|
|
146
|
-
assert.ok(!initialInbox.includes('Release planning') && !initialInbox.includes('node-private-123'), 'the selected ticket preview omits source metadata');
|
|
147
|
-
active.activate();
|
|
148
|
-
active.handleKey('y', key());
|
|
149
|
-
await waitFor(() => existsSync(join(first.dir, 'response.json')), 'a deck resolution crosses the controller daemon seam');
|
|
150
|
-
assert.equal(existsSync(join(first.dir, 'response.json')), true, 'a deck resolution crosses the controller daemon seam');
|
|
151
|
-
await waitFor(() => active.snapshot().screen === 'list', 'a successful daemon resolution unmounts the ticket');
|
|
152
|
-
assert.equal(active.snapshot().screen, 'list', 'a successful daemon resolution unmounts the ticket');
|
|
153
|
-
active.close();
|
|
154
|
-
const editing = submitDeck({ dir: ticketDir('editing'), deck: { title: 'Editing', interactions: [{ id: 'note', title: 'Notes', subtitle: 'Notes require your attention.', options: [], allowFreetext: true }] } });
|
|
155
|
-
const editingController = makeController({ cols: 100, rows: 24 });
|
|
156
|
-
select(editingController, editing.dir);
|
|
157
|
-
editingController.activate();
|
|
158
|
-
editingController.handleKey('r', key());
|
|
159
|
-
for (const char of 'draft')
|
|
160
|
-
editingController.handleKey(char, key());
|
|
161
|
-
submitDeck({ dir: ticketDir('arrival'), deck: deck('arrival') });
|
|
162
|
-
editingController.rescan();
|
|
163
|
-
assert.equal(realpathSync(editingController.snapshot().selectedDir), realpathSync(editing.dir), 'arrival does not steal active selection');
|
|
164
|
-
assert.equal(editingController.snapshot().inputBuffer, 'draft', 'arrival does not alter freetext input');
|
|
165
|
-
cancelTicket(editing.dir, { reason: 'canceled while editing' });
|
|
166
|
-
editingController.rescan();
|
|
167
|
-
assert.equal(editingController.snapshot().screen, 'list', 'cancellation invalidation returns to list');
|
|
168
|
-
assert.notEqual(editingController.snapshot().selectedDir, editing.dir, 'cancellation moves selection away from the resolved ticket');
|
|
169
|
-
editingController.close();
|
|
170
|
-
const reviewSourcePreview = join(temp, 'review-preview.ts');
|
|
171
|
-
writeFileSync(reviewSourcePreview, 'export const reviewPreview = true;\n');
|
|
172
|
-
const reviewPreview = submitReview({ dir: ticketDir('review-preview'), review: { file: reviewSourcePreview, title: 'Review source', subtitle: 'Review this source before approving the release.', source: {} } });
|
|
173
|
-
const reviewPreviewController = makeController({ cols: 100, rows: 24 });
|
|
174
|
-
select(reviewPreviewController, reviewPreview.dir);
|
|
175
|
-
const renderedReviewPreview = reviewPreviewController.render().join('\n');
|
|
176
|
-
assert.ok(renderedReviewPreview.includes('Review this source before approving the release.'), 'passive review detail renders its authored subtitle');
|
|
177
|
-
assert.ok(renderedReviewPreview.includes('1 file to review'), 'passive review detail identifies the compact review payload');
|
|
178
|
-
assert.ok(!renderedReviewPreview.includes('reviewPreview = true'), 'passive review detail omits the source document');
|
|
179
|
-
reviewPreviewController.close();
|
|
180
|
-
const already = submitDeck({ dir: ticketDir('already'), deck: deck('already') });
|
|
181
|
-
const alreadyController = makeController({ cols: 100, rows: 24 });
|
|
182
|
-
alreadyController.activate();
|
|
183
|
-
cancelTicket(already.dir, { reason: 'resolved elsewhere' });
|
|
184
|
-
mode = 'already_resolved';
|
|
185
|
-
alreadyController.handleKey('y', key());
|
|
186
|
-
await waitFor(() => alreadyController.snapshot().screen === 'list', 'already_resolved unmounts instead of offering a stale resubmit');
|
|
187
|
-
assert.equal(alreadyController.snapshot().screen, 'list', 'already_resolved unmounts instead of offering a stale resubmit');
|
|
188
|
-
assert.equal(claimExists(already.dir), true, 'already_resolved retains the daemon-taken claim');
|
|
189
|
-
alreadyController.close();
|
|
190
|
-
const delivery = submitDeck({ dir: ticketDir('delivery'), deck: deck('delivery') });
|
|
191
|
-
mode = 'delivery_failed';
|
|
192
|
-
const deliveryController = makeController({ cols: 100, rows: 24 });
|
|
193
|
-
deliveryController.activate();
|
|
194
|
-
deliveryController.handleKey('y', key());
|
|
195
|
-
await waitFor(() => deliveryController.snapshot().screen === 'list', 'delivery_failed unmounts because the canonical answer is already recorded');
|
|
196
|
-
assert.equal(deliveryController.snapshot().screen, 'list', 'delivery_failed unmounts because the canonical answer is already recorded');
|
|
197
|
-
assert.equal(existsSync(join(delivery.dir, 'response.json')), true, 'delivery_failed still leaves the canonical response on disk');
|
|
198
|
-
deliveryController.close();
|
|
199
|
-
const retry = submitDeck({ dir: ticketDir('retry'), deck: deck('retry') });
|
|
200
|
-
mode = 'unreachable';
|
|
201
|
-
const retryController = makeController({ cols: 100, rows: 24 });
|
|
202
|
-
retryController.activate();
|
|
203
|
-
retryController.handleKey('y', key());
|
|
204
|
-
await tick();
|
|
205
|
-
assert.equal(retryController.snapshot().screen, 'detail', 'unreachable keeps the mounted answer available for retry');
|
|
206
|
-
assert.equal(existsSync(join(retry.dir, 'response.json')), false, 'unreachable does not manufacture a local completion');
|
|
207
|
-
retryController.close();
|
|
208
|
-
// Notification acknowledgement remains explicit: opening or abandoning a
|
|
209
|
-
// notification does not create a response, while its canonical completion
|
|
210
|
-
// still rejects a missing acknowledgement.
|
|
211
|
-
mode = 'success';
|
|
212
|
-
const notification = submitDeck({ dir: ticketDir('notification'), deck: { title: 'Notice', interactions: [{ id: 'notice', title: 'Notice', subtitle: 'Read the complete notice.', kind: 'notify', body: 'Notification body that must be visible before acknowledgement.', options: [{ id: 'ok', label: 'OK' }] }] } });
|
|
213
|
-
const notificationController = makeController({ cols: 100, rows: 24 });
|
|
214
|
-
select(notificationController, notification.dir);
|
|
215
|
-
const renderedNotificationPreview = notificationController.render().join('\n');
|
|
216
|
-
assert.ok(renderedNotificationPreview.includes('Read the complete notice') && renderedNotificationPreview.includes('1 question'), 'passive deck preview renders only its subtitle and question count');
|
|
217
|
-
assert.ok(!renderedNotificationPreview.includes('Notification body'), 'passive deck preview omits interaction bodies');
|
|
218
|
-
assert.ok(renderedNotificationPreview.includes('Enter') && renderedNotificationPreview.includes('c comment'), 'preview keeps full-ticket controls visible');
|
|
219
|
-
notificationController.activate();
|
|
220
|
-
notificationController.handleKey('q', key());
|
|
221
|
-
assert.equal(existsSync(join(notification.dir, 'response.json')), false, 'leaving a notification never acknowledges it');
|
|
222
|
-
notificationController.close();
|
|
223
|
-
const notificationClaim = claimTicket(notification.dir);
|
|
224
|
-
assert.notEqual(notificationClaim, null);
|
|
225
|
-
assert.throws(() => completeDeck(notification.dir, [], notificationClaim.token), /explicit acknowledgement/, 'canonical completion rejects a notification without acknowledgement');
|
|
226
|
-
assert.throws(() => completeDeck(notification.dir, [{ id: 'notice' }], notificationClaim.token), /explicit acknowledgement/, 'an empty notification response is not acknowledgement');
|
|
227
|
-
assert.equal(completeDeck(notification.dir, [{ id: 'notice', selectedOptionId: 'ok' }], notificationClaim.token).won, true, 'an explicit acknowledgement completes the notification');
|
|
228
|
-
const replacement = submitDeck({ dir: ticketDir('replacement'), deck: { title: 'Replacement', interactions: [
|
|
229
|
-
{ id: 'keep', title: 'Keep', subtitle: 'Keep requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] },
|
|
230
|
-
{ id: 'drop', title: 'Drop', subtitle: 'Drop requires your attention.', options: [{ id: 'no', label: 'No', shortcut: 'n' }] },
|
|
231
|
-
] } });
|
|
232
|
-
const replacementController = makeController({ cols: 100, rows: 24 });
|
|
233
|
-
select(replacementController, replacement.dir);
|
|
234
|
-
replacementController.activate();
|
|
235
|
-
replacementController.handleKey('y', key());
|
|
236
|
-
atomicWriteJson(deckPath(replacement.dir), { title: 'Replacement', interactions: [{ id: 'keep', title: 'Keep', subtitle: 'Keep requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] }] });
|
|
237
|
-
replacementController.reloadSelectedDeck();
|
|
238
|
-
assert.ok(replacementController.render().join('\n').includes('Current: Yes'), 'deck replacement keeps a surviving answer');
|
|
239
|
-
replacementController.close();
|
|
240
|
-
}
|
|
241
|
-
finally {
|
|
242
|
-
server.closeAllConnections();
|
|
243
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
244
|
-
rmSync(temp, { recursive: true, force: true });
|
|
245
|
-
delete process.env['CRTR_HOME'];
|
|
246
|
-
}
|
|
247
|
-
console.log('inbox controller tests passed');
|