@north-light/crouter 0.3.173 → 0.3.175
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/memory/write.js +13 -12
- 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,277 +1,13 @@
|
|
|
1
|
+
// Pure boundaries behind `crtr sys setup`: which pi CLI crouter launches, how a
|
|
2
|
+
// failed provider login is classified, and how a concrete model reference maps
|
|
3
|
+
// back onto a portable provider/strength selection.
|
|
1
4
|
import { test } from 'node:test';
|
|
2
5
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { existsSync
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
6
7
|
import { resolveBundledPiCliPath } from '../../../core/runtime/pi-cli.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { applyTheme } from '../../../clients/attach/config.js';
|
|
11
|
-
import { createSetupRuntime } from './helpers/setup-runtime.js';
|
|
12
|
-
import { stripVTControlCharacters } from 'node:util';
|
|
13
|
-
// The provider panel only touches the TUI on async OAuth transitions (never in
|
|
14
|
-
// these keybindings-tab render/input tests) and reads auth from `agentDir`; a
|
|
15
|
-
// no-op TUI stub and an empty temp agent dir keep the wizard headless.
|
|
16
|
-
const stubTui = { requestRender() { } };
|
|
17
|
-
const agentDir = mkdtempSync(join(tmpdir(), 'setup-wizard-test-'));
|
|
18
|
-
const { runtime, registry } = await createSetupRuntime(agentDir);
|
|
19
|
-
test('setup keybinding draft edits, disables, resets, and discards transactionally', () => {
|
|
20
|
-
const draft = new SetupKeybindingsDraft({ 'crtr.attach.graph.toggle': ['alt+x'] });
|
|
21
|
-
assert.equal(draft.expression('crtr.attach.graph.toggle'), 'alt+x');
|
|
22
|
-
assert.equal(draft.dirty, false);
|
|
23
|
-
// M-U (not M-Y): alt+shift+y is now the crtr.attach.copy.message default, so
|
|
24
|
-
// the uppercase-normalization probe must use a gesture no catalog entry owns.
|
|
25
|
-
assert.equal(draft.edit('crtr.attach.graph.toggle', 'M-U, ctrl+g').ok, true);
|
|
26
|
-
assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['alt+shift+u', 'ctrl+g']);
|
|
27
|
-
assert.equal(draft.dirty, true);
|
|
28
|
-
assert.equal(draft.unbind('crtr.attach.graph.toggle').ok, true);
|
|
29
|
-
assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], []);
|
|
30
|
-
draft.resetRow('crtr.attach.graph.toggle');
|
|
31
|
-
assert.equal(Object.hasOwn(draft.overrides(), 'crtr.attach.graph.toggle'), false);
|
|
32
|
-
draft.edit('crtr.attach.graph.toggle', 'alt+y');
|
|
33
|
-
draft.discard();
|
|
34
|
-
assert.deepEqual(draft.overrides(), { 'crtr.attach.graph.toggle': ['alt+x'] });
|
|
35
|
-
assert.equal(draft.dirty, false);
|
|
36
|
-
});
|
|
37
|
-
test('setup keybinding draft binds the comma key, which doubles as the gesture separator', () => {
|
|
38
|
-
const draft = new SetupKeybindingsDraft(undefined);
|
|
39
|
-
// A comma with nothing on one side is the comma KEY, not a separator. Bound
|
|
40
|
-
// onto a menu selector whose default is NOT the comma (settings already
|
|
41
|
-
// defaults to it), so the draft records a real override.
|
|
42
|
-
assert.equal(draft.edit('crtr.tmux.menu.attach.whip', ',').ok, true);
|
|
43
|
-
assert.deepEqual(draft.overrides()['crtr.tmux.menu.attach.whip'], [',']);
|
|
44
|
-
// A list containing the comma key round-trips through the rendered expression.
|
|
45
|
-
assert.equal(draft.edit('crtr.attach.graph.toggle', ', , ctrl+g').ok, true);
|
|
46
|
-
assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], [',', 'ctrl+g']);
|
|
47
|
-
assert.equal(draft.expression('crtr.attach.graph.toggle'), ',, ctrl+g');
|
|
48
|
-
assert.equal(draft.edit('crtr.attach.graph.toggle', ',, ctrl+g').ok, true);
|
|
49
|
-
assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], [',', 'ctrl+g']);
|
|
50
|
-
});
|
|
51
|
-
test('setup keybinding draft drops a member when the committed value equals the catalog default (N2 sparseness)', () => {
|
|
52
|
-
const draft = new SetupKeybindingsDraft(undefined);
|
|
53
|
-
const definition = BINDING_CATALOG.find((entry) => entry.id === 'crtr.attach.graph.toggle');
|
|
54
|
-
const defaultExpression = draft.expression(definition.id);
|
|
55
|
-
// Committing the seeded default verbatim must NOT record an override: the row
|
|
56
|
-
// stays sparse (no member) and the draft stays clean — no spurious unsaved/dot.
|
|
57
|
-
const result = draft.edit(definition.id, defaultExpression);
|
|
58
|
-
assert.equal(result.ok, true);
|
|
59
|
-
assert.equal(Object.hasOwn(draft.overrides(), definition.id), false);
|
|
60
|
-
assert.equal(draft.dirty, false);
|
|
61
|
-
// Editing to a real value records the member; re-committing the default drops it.
|
|
62
|
-
assert.equal(draft.edit(definition.id, 'ctrl+g').ok, true);
|
|
63
|
-
assert.deepEqual(draft.overrides()[definition.id], ['ctrl+g']);
|
|
64
|
-
assert.equal(draft.dirty, true);
|
|
65
|
-
assert.equal(draft.edit(definition.id, defaultExpression).ok, true);
|
|
66
|
-
assert.equal(Object.hasOwn(draft.overrides(), definition.id), false);
|
|
67
|
-
assert.equal(draft.dirty, false);
|
|
68
|
-
});
|
|
69
|
-
test('setup keybinding draft keeps the last valid cell value on syntax, collision, and safety errors', () => {
|
|
70
|
-
const draft = new SetupKeybindingsDraft(undefined);
|
|
71
|
-
const syntax = draft.edit('crtr.attach.graph.toggle', 'ctrl+not-a-key');
|
|
72
|
-
assert.equal(syntax.ok, false);
|
|
73
|
-
assert.deepEqual(draft.overrides(), {});
|
|
74
|
-
const collision = draft.edit('crtr.attach.graph.toggle', 'alt+m');
|
|
75
|
-
assert.equal(collision.ok, false);
|
|
76
|
-
assert.match(collision.diagnostics[0].message, /crtr\.attach\.model-ladder\.next/);
|
|
77
|
-
assert.deepEqual(draft.overrides(), {});
|
|
78
|
-
const unsafe = draft.unbind('crtr.setup.keybindings.save');
|
|
79
|
-
assert.equal(unsafe.ok, false);
|
|
80
|
-
assert.match(unsafe.diagnostics[0].message, /save-keybindings/);
|
|
81
|
-
assert.deepEqual(draft.overrides(), {});
|
|
82
|
-
});
|
|
83
|
-
test('setup reset-all removes invalid and unknown raw members without cataloging pi bindings', () => {
|
|
84
|
-
const invalidRoot = new SetupKeybindingsDraft('alt+x');
|
|
85
|
-
assert.equal(invalidRoot.resolution().diagnostics[0]?.code, 'invalid-keybindings');
|
|
86
|
-
invalidRoot.resetAll();
|
|
87
|
-
assert.equal(invalidRoot.dirty, true);
|
|
88
|
-
assert.equal(invalidRoot.resolution().diagnostics.length, 0);
|
|
89
|
-
const draft = new SetupKeybindingsDraft({
|
|
90
|
-
'crtr.unknown': ['x'],
|
|
91
|
-
'crtr.attach.graph.toggle': 'alt+x',
|
|
92
|
-
});
|
|
93
|
-
assert.equal(draft.resolution().diagnostics.length, 2);
|
|
94
|
-
draft.resetAll();
|
|
95
|
-
assert.deepEqual(draft.overrides(), {});
|
|
96
|
-
assert.equal(draft.resolution().diagnostics.length, 0);
|
|
97
|
-
assert.equal(BINDING_CATALOG.some((entry) => entry.id.includes('app.') || entry.id.includes('tui.')), false);
|
|
98
|
-
});
|
|
99
|
-
test('setup keybinding draft memoizes resolution() and only recomputes after a state change', () => {
|
|
100
|
-
const draft = new SetupKeybindingsDraft({ 'crtr.attach.graph.toggle': ['alt+x'] });
|
|
101
|
-
// Repeated reads of unchanged state must reuse the same resolution instance
|
|
102
|
-
// (this is the m4 navigation path: reads never mutate the draft).
|
|
103
|
-
const first = draft.resolution();
|
|
104
|
-
const second = draft.resolution();
|
|
105
|
-
assert.equal(first, second);
|
|
106
|
-
// A state-changing operation must invalidate the cache and recompute.
|
|
107
|
-
draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
|
|
108
|
-
const afterEdit = draft.resolution();
|
|
109
|
-
assert.notEqual(afterEdit, first);
|
|
110
|
-
assert.equal(draft.resolution(), afterEdit);
|
|
111
|
-
draft.resetRow('crtr.attach.graph.toggle');
|
|
112
|
-
const afterReset = draft.resolution();
|
|
113
|
-
assert.notEqual(afterReset, afterEdit);
|
|
114
|
-
draft.discard();
|
|
115
|
-
const afterDiscard = draft.resolution();
|
|
116
|
-
assert.notEqual(afterDiscard, afterReset);
|
|
117
|
-
draft.resetAll();
|
|
118
|
-
const afterResetAll = draft.resolution();
|
|
119
|
-
assert.notEqual(afterResetAll, afterDiscard);
|
|
120
|
-
draft.markSaved({});
|
|
121
|
-
const afterMarkSaved = draft.resolution();
|
|
122
|
-
assert.notEqual(afterMarkSaved, afterResetAll);
|
|
123
|
-
});
|
|
124
|
-
test('setup keybinding draft refuses edits while the raw root is invalid until reset-all', () => {
|
|
125
|
-
const draft = new SetupKeybindingsDraft('alt+x');
|
|
126
|
-
assert.equal(draft.hasInvalidRoot(), true);
|
|
127
|
-
// An edit against an invalid root must NOT commit (the prior bug: it returned
|
|
128
|
-
// ok:true against an empty `current` while the row kept showing the default).
|
|
129
|
-
const rejected = draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
|
|
130
|
-
assert.equal(rejected.ok, false);
|
|
131
|
-
assert.equal(rejected.diagnostics[0].code, 'invalid-keybindings');
|
|
132
|
-
assert.deepEqual(draft.overrides(), {});
|
|
133
|
-
// reset-all clears the invalid root; edits then succeed and display.
|
|
134
|
-
draft.resetAll();
|
|
135
|
-
assert.equal(draft.hasInvalidRoot(), false);
|
|
136
|
-
const accepted = draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
|
|
137
|
-
assert.equal(accepted.ok, true);
|
|
138
|
-
assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['ctrl+g']);
|
|
139
|
-
});
|
|
140
|
-
test('setup keybindings editor stays visible while paging moves the selection (m3)', () => {
|
|
141
|
-
applyTheme({ cwd: process.cwd() });
|
|
142
|
-
const openingBindings = resolveKeybindings(undefined);
|
|
143
|
-
// A short terminal forces a small scroll window so paging past the edit row
|
|
144
|
-
// is the reproducible m3 scenario (editor was blind-typing off-screen before).
|
|
145
|
-
const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, openingBindings, undefined, () => 14);
|
|
146
|
-
wizard.focused = true;
|
|
147
|
-
const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
|
|
148
|
-
// Drive to the Keybindings tab (tab-next = Tab), open the editor on row 0 (Enter).
|
|
149
|
-
for (let i = 0; i < 4; i += 1)
|
|
150
|
-
wizard.handleInput('\t');
|
|
151
|
-
assert.match(render(), /Keybindings/);
|
|
152
|
-
wizard.handleInput('\r');
|
|
153
|
-
// Type a distinctive marker into the live editor buffer.
|
|
154
|
-
wizard.handleInput('zzz');
|
|
155
|
-
assert.match(render(), /zzz/, 'editor should echo typed input before paging');
|
|
156
|
-
// PageDown twice: selection moves off, but the editor row must remain on screen.
|
|
157
|
-
wizard.handleInput('\x1b[6~');
|
|
158
|
-
wizard.handleInput('\x1b[6~');
|
|
159
|
-
assert.match(render(), /zzz/, 'editor must stay visible (and keep capturing) after paging');
|
|
160
|
-
});
|
|
161
|
-
test('setup keybindings q-cancel with a dirty draft routes through discard-confirm, not a silent exit (N3)', () => {
|
|
162
|
-
applyTheme({ cwd: process.cwd() });
|
|
163
|
-
const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
|
|
164
|
-
wizard.focused = true;
|
|
165
|
-
let cancelled = false;
|
|
166
|
-
wizard.onCancel = () => { cancelled = true; };
|
|
167
|
-
const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
|
|
168
|
-
for (let i = 0; i < 4; i += 1)
|
|
169
|
-
wizard.handleInput('\t');
|
|
170
|
-
// Make the draft dirty: unbind the selected row (delete key) so it has a real
|
|
171
|
-
// pending override.
|
|
172
|
-
wizard.handleInput('\x1b[3~');
|
|
173
|
-
assert.match(render(), /unsaved/, 'draft should be dirty after unbind');
|
|
174
|
-
// q (crtr.setup.cancel) in list mode must NOT drop the edits: it opens the same
|
|
175
|
-
// discard-confirm the Escape path uses.
|
|
176
|
-
wizard.handleInput('q');
|
|
177
|
-
assert.equal(cancelled, false, 'dirty draft must not silently exit on q');
|
|
178
|
-
assert.match(render(), /Discard every unsaved keybinding change\?/);
|
|
179
|
-
// A clean draft still exits on q (cancel elsewhere is unchanged).
|
|
180
|
-
const clean = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
|
|
181
|
-
let cleanCancelled = false;
|
|
182
|
-
clean.onCancel = () => { cleanCancelled = true; };
|
|
183
|
-
clean.focused = true;
|
|
184
|
-
for (let i = 0; i < 4; i += 1)
|
|
185
|
-
clean.handleInput('\t');
|
|
186
|
-
clean.handleInput('q');
|
|
187
|
-
assert.equal(cleanCancelled, true, 'clean draft still exits on q');
|
|
188
|
-
});
|
|
189
|
-
test('setup keybindings selection always renders across group boundaries in a short window (m4 residual)', () => {
|
|
190
|
-
applyTheme({ cwd: process.cwd() });
|
|
191
|
-
// Small viewport so a window spans several group headings + a diagnostic line —
|
|
192
|
-
// the fixed-reserve page math used to let the selected row fail to render here.
|
|
193
|
-
const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 13);
|
|
194
|
-
wizard.focused = true;
|
|
195
|
-
const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
|
|
196
|
-
for (let i = 0; i < 4; i += 1)
|
|
197
|
-
wizard.handleInput('\t');
|
|
198
|
-
// Render only at the first/final rows and around each group transition. Every
|
|
199
|
-
// intermediate row still goes through production navigation, but does not pay
|
|
200
|
-
// for a redundant full viewport render.
|
|
201
|
-
const groupStarts = BINDING_CATALOG.flatMap((entry, index) => (index === 0 || entry.group !== BINDING_CATALOG[index - 1]?.group ? [index] : []));
|
|
202
|
-
const samples = [...new Set([
|
|
203
|
-
0,
|
|
204
|
-
BINDING_CATALOG.length - 1,
|
|
205
|
-
...groupStarts.flatMap((start) => [start - 1, start, start + 1]),
|
|
206
|
-
].filter((index) => index >= 0 && index < BINDING_CATALOG.length))].sort((a, b) => a - b);
|
|
207
|
-
let current = 0;
|
|
208
|
-
for (const sample of samples) {
|
|
209
|
-
while (current < sample) {
|
|
210
|
-
wizard.handleInput('j');
|
|
211
|
-
current += 1;
|
|
212
|
-
}
|
|
213
|
-
assert.match(render(), /\u25b6/, `selection marker must render at sample ${sample}`);
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
test('setup Broker limits tab persists positive user-scope thresholds and rejects invalid values', () => {
|
|
217
|
-
applyTheme({ cwd: process.cwd() });
|
|
218
|
-
const home = mkdtempSync(join(tmpdir(), 'setup-broker-limits-home-'));
|
|
219
|
-
const previousHome = process.env.HOME;
|
|
220
|
-
process.env.HOME = home;
|
|
221
|
-
try {
|
|
222
|
-
// Setup must show the same fallback the daemon receives: an inverted pair
|
|
223
|
-
// is invalid as a whole even though each individual number is positive.
|
|
224
|
-
mkdirSync(join(home, '.crouter'), { recursive: true });
|
|
225
|
-
writeFileSync(join(home, '.crouter', 'config.json'), JSON.stringify({
|
|
226
|
-
brokerThresholds: { warning: 300, automaticReviveCap: 200 },
|
|
227
|
-
}));
|
|
228
|
-
const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
|
|
229
|
-
wizard.focused = true;
|
|
230
|
-
const render = () => stripVTControlCharacters(wizard.render(200).join('\n'));
|
|
231
|
-
const overridePrecedence = 'Valid CRTR_WARN_LIVE_BROKERS and CRTR_MAX_LIVE_BROKERS environment overrides take precedence over their corresponding configured limits.';
|
|
232
|
-
// Walk to the Broker limits tab by content rather than a fixed press count:
|
|
233
|
-
// the tab strip itself always contains the label, so the loop keys off the
|
|
234
|
-
// tab body and stays correct however many tabs precede it.
|
|
235
|
-
for (let i = 0; i < 20 && !render().includes('Warning threshold'); i += 1)
|
|
236
|
-
wizard.handleInput('\t');
|
|
237
|
-
assert.match(render(), /Warning threshold/);
|
|
238
|
-
assert.match(render(), /defaults 128 \/ 256/);
|
|
239
|
-
assert.match(render(), /> 128/);
|
|
240
|
-
assert.match(render(), /> 256/);
|
|
241
|
-
assert.ok(render().includes(`Configured limits apply next tick. ${overridePrecedence}`));
|
|
242
|
-
// Seeded values behave like the other setup editors: a new digit appends
|
|
243
|
-
// rather than prepending before the displayed default.
|
|
244
|
-
wizard.handleInput('9');
|
|
245
|
-
assert.match(render(), /1289/);
|
|
246
|
-
const remapped = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings({ 'crtr.setup.tab-next': ['1'] }), undefined, () => 40);
|
|
247
|
-
remapped.focused = true;
|
|
248
|
-
remapped.setTab(6);
|
|
249
|
-
remapped.handleInput('1');
|
|
250
|
-
assert.match(stripVTControlCharacters(remapped.render(120).join('\n')), /1281/, 'a digit must not trigger a remapped tab binding');
|
|
251
|
-
const inputs = wizard;
|
|
252
|
-
inputs.brokerWarningInput.setValue('192');
|
|
253
|
-
inputs.brokerHardCapInput.setValue('384');
|
|
254
|
-
wizard.handleInput('\r');
|
|
255
|
-
assert.deepEqual(JSON.parse(readFileSync(join(home, '.crouter', 'config.json'), 'utf8')).brokerThresholds, {
|
|
256
|
-
warning: 192,
|
|
257
|
-
automaticReviveCap: 384,
|
|
258
|
-
});
|
|
259
|
-
assert.ok(render().includes(`Saved to user config. Applies next tick. ${overridePrecedence}`));
|
|
260
|
-
inputs.brokerWarningInput.setValue('0');
|
|
261
|
-
wizard.handleInput('\r');
|
|
262
|
-
assert.match(render(), /Both broker limits must be positive integers/);
|
|
263
|
-
assert.deepEqual(JSON.parse(readFileSync(join(home, '.crouter', 'config.json'), 'utf8')).brokerThresholds, {
|
|
264
|
-
warning: 192,
|
|
265
|
-
automaticReviveCap: 384,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
finally {
|
|
269
|
-
if (previousHome === undefined)
|
|
270
|
-
delete process.env.HOME;
|
|
271
|
-
else
|
|
272
|
-
process.env.HOME = previousHome;
|
|
273
|
-
}
|
|
274
|
-
});
|
|
8
|
+
import { inferPortableModelSelection } from '../../../core/runtime/launch.js';
|
|
9
|
+
import { defaultModelLaddersConfig } from '../../../types.js';
|
|
10
|
+
import { classifyLoginFailure } from '../panels/provider-panel.js';
|
|
275
11
|
test('resolveBundledPiCliPath uses crouter bundled pi instead of a standalone pi on PATH', () => {
|
|
276
12
|
const prevPath = process.env.PATH;
|
|
277
13
|
process.env.PATH = '';
|
|
@@ -293,3 +29,14 @@ test('classifyLoginFailure treats an abort as authoritative', () => {
|
|
|
293
29
|
assert.equal(classifyLoginFailure(new Error('network exploded'), false), 'Login error: network exploded');
|
|
294
30
|
assert.equal(classifyLoginFailure('not an Error object', false), 'Login error: not an Error object');
|
|
295
31
|
});
|
|
32
|
+
test('portable kind selection preserves provider across tokens and concrete ladder refs', () => {
|
|
33
|
+
const ladders = defaultModelLaddersConfig();
|
|
34
|
+
ladders.defaultProvider = 'openai';
|
|
35
|
+
ladders.openai.strong = 'openai-codex/gpt-shared:high';
|
|
36
|
+
assert.deepEqual(inferPortableModelSelection('anthropic/strong', ladders), { provider: 'anthropic', strength: 'strong' });
|
|
37
|
+
assert.deepEqual(inferPortableModelSelection('strong', ladders), { provider: 'openai', strength: 'strong' });
|
|
38
|
+
assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:high', ladders), { provider: 'openai', strength: 'strong' });
|
|
39
|
+
assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:medium', ladders), { provider: 'openai', strength: 'strong' });
|
|
40
|
+
assert.deepEqual(inferPortableModelSelection('openai-codex/off-ladder:high', ladders), { provider: 'openai', strength: 'ultra' });
|
|
41
|
+
assert.deepEqual(inferPortableModelSelection('unknown-provider/off-ladder', ladders), { provider: 'openai', strength: 'ultra' });
|
|
42
|
+
});
|
|
@@ -105,7 +105,7 @@ function setNestedValue(cfg, key, rawValue, value) {
|
|
|
105
105
|
return;
|
|
106
106
|
}
|
|
107
107
|
if (topKey === 'keybindings') {
|
|
108
|
-
throw usage('keybindings are edited only through `crtr sys
|
|
108
|
+
throw usage('keybindings are edited only through `crtr sys settings`');
|
|
109
109
|
}
|
|
110
110
|
if (topKey === 'modelLadders') {
|
|
111
111
|
throw usage('modelLadders keys are written through persistModelLadders, not this path');
|
|
@@ -142,12 +142,12 @@ function setNestedValue(cfg, key, rawValue, value) {
|
|
|
142
142
|
const configGet = defineLeaf({
|
|
143
143
|
name: 'get',
|
|
144
144
|
description: 'read a config value by key',
|
|
145
|
-
whenToUse: 'you want to inspect one config value — including the whole user keybindings object — optionally from a specific scope. Use sys
|
|
145
|
+
whenToUse: 'you want to inspect one config value — including the whole user keybindings object — optionally from a specific scope. Use sys settings to edit keybindings and sys config set for supported scalar settings.',
|
|
146
146
|
help: {
|
|
147
147
|
name: 'sys config get',
|
|
148
148
|
summary: 'read a config value by dotted key',
|
|
149
149
|
params: [
|
|
150
|
-
{ kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. Top-level keys: ${CONFIG_TOP_LEVEL_HELP}. brokerThresholds is user-only; keybindings is readable only as the whole user-scope object and editable only through sys
|
|
150
|
+
{ kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. Top-level keys: ${CONFIG_TOP_LEVEL_HELP}. brokerThresholds is user-only; keybindings is readable only as the whole user-scope object and editable only through sys settings.` },
|
|
151
151
|
{ kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope to read from. Default: user.' },
|
|
152
152
|
],
|
|
153
153
|
output: [
|
|
@@ -176,12 +176,12 @@ const configGet = defineLeaf({
|
|
|
176
176
|
const configSet = defineLeaf({
|
|
177
177
|
name: 'set',
|
|
178
178
|
description: 'write a config value by key',
|
|
179
|
-
whenToUse: 'you want to change a supported crtr setting in user or project scope. Use sys
|
|
179
|
+
whenToUse: 'you want to change a supported crtr setting in user or project scope. Use sys settings instead for keybindings, and sys config get to inspect values.',
|
|
180
180
|
help: {
|
|
181
181
|
name: 'sys config set',
|
|
182
182
|
summary: 'write a config value by dotted key',
|
|
183
183
|
params: [
|
|
184
|
-
{ kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: working_gerunds and whip_messages (non-empty JSON string arrays), brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys
|
|
184
|
+
{ kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: working_gerunds and whip_messages (non-empty JSON string arrays), brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys settings.` },
|
|
185
185
|
{ kind: 'flag', name: 'value', type: 'string', required: true, constraint: 'value VALUE — string, required. working_gerunds and whip_messages accept JSON arrays; other values are stored as-is if quoted and coerced to number or boolean when unambiguous.' },
|
|
186
186
|
{ kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope to write to. Default: user. Project scope is supported only for modelLadders.' },
|
|
187
187
|
],
|
|
@@ -258,7 +258,7 @@ const configPath = defineLeaf({
|
|
|
258
258
|
export const configBranch = defineBranch({
|
|
259
259
|
name: 'config',
|
|
260
260
|
description: 'read and write configuration',
|
|
261
|
-
whenToUse: 'inspecting crtr settings, changing supported scalar values, or locating config.json. Keybinding changes belong in sys
|
|
261
|
+
whenToUse: 'inspecting crtr settings, changing supported scalar values, or locating config.json. Keybinding changes belong in sys settings.',
|
|
262
262
|
help: {
|
|
263
263
|
name: 'sys config',
|
|
264
264
|
summary: 'read and write crtr configuration, including model ladders',
|
|
@@ -76,7 +76,7 @@ export const sysLogsLeaf = defineLeaf({
|
|
|
76
76
|
summary: 'show the latest 200 matching local event and raw-residue records, oldest first',
|
|
77
77
|
params: [
|
|
78
78
|
{ kind: 'flag', name: 'node', type: 'string', required: false, constraint: 'Safe node ID; the node need not still be active.' },
|
|
79
|
-
{ kind: 'flag', name: 'component', type: 'enum', choices: ['daemon', 'broker'
|
|
79
|
+
{ kind: 'flag', name: 'component', type: 'enum', choices: ['daemon', 'broker'], required: false, constraint: 'Owning runtime component.' },
|
|
80
80
|
{ kind: 'flag', name: 'operation', type: 'string', required: false, constraint: 'Exact 32-character lowercase non-zero hexadecimal operation ID.' },
|
|
81
81
|
{ kind: 'flag', name: 'since', type: 'string', required: false, constraint: 'Inclusive ISO 8601 lower bound with a timezone.' },
|
|
82
82
|
{ kind: 'flag', name: 'until', type: 'string', required: false, constraint: 'Inclusive ISO 8601 upper bound with a timezone; cannot precede --since.' },
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Input } from "@earendil-works/pi-tui";
|
|
2
|
+
import { type SetupPanel } from "./panel.js";
|
|
3
|
+
export declare class BrokerLimitsPanel implements SetupPanel {
|
|
4
|
+
private readonly onChange;
|
|
5
|
+
readonly warningInput: Input;
|
|
6
|
+
readonly hardCapInput: Input;
|
|
7
|
+
private index;
|
|
8
|
+
private notice;
|
|
9
|
+
private _focused;
|
|
10
|
+
constructor(onChange: () => void);
|
|
11
|
+
set focused(value: boolean);
|
|
12
|
+
private selected;
|
|
13
|
+
private move;
|
|
14
|
+
private save;
|
|
15
|
+
handleInput(data: string, matches?: (id: string, input: string) => boolean): boolean;
|
|
16
|
+
render(width: number): string[];
|
|
17
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Input, truncateToWidth } from "@earendil-works/pi-tui";
|
|
2
|
+
import { readConfig, updateRawConfigAtomically } from "../../../core/config.js";
|
|
3
|
+
import { BROKER_LIMIT_OVERRIDE_PRECEDENCE } from "../setup.js";
|
|
4
|
+
import { padAnsi, theme, wrapText } from "./panel.js";
|
|
5
|
+
function positive(value) {
|
|
6
|
+
return /^\d+$/.test(value) &&
|
|
7
|
+
Number.isSafeInteger(Number(value)) &&
|
|
8
|
+
Number(value) >= 1
|
|
9
|
+
? Number(value)
|
|
10
|
+
: undefined;
|
|
11
|
+
}
|
|
12
|
+
export class BrokerLimitsPanel {
|
|
13
|
+
onChange;
|
|
14
|
+
warningInput = new Input();
|
|
15
|
+
hardCapInput = new Input();
|
|
16
|
+
index = 0;
|
|
17
|
+
notice;
|
|
18
|
+
_focused = false;
|
|
19
|
+
constructor(onChange) {
|
|
20
|
+
this.onChange = onChange;
|
|
21
|
+
const thresholds = readConfig("user").brokerThresholds;
|
|
22
|
+
this.warningInput.setValue(String(thresholds.warning));
|
|
23
|
+
this.warningInput.handleInput("\x05");
|
|
24
|
+
this.hardCapInput.setValue(String(thresholds.automaticReviveCap));
|
|
25
|
+
this.hardCapInput.handleInput("\x05");
|
|
26
|
+
this.warningInput.onSubmit = () => this.save();
|
|
27
|
+
this.hardCapInput.onSubmit = () => this.save();
|
|
28
|
+
}
|
|
29
|
+
set focused(value) {
|
|
30
|
+
this._focused = value;
|
|
31
|
+
this.warningInput.focused = value && this.index === 0;
|
|
32
|
+
this.hardCapInput.focused = value && this.index === 1;
|
|
33
|
+
}
|
|
34
|
+
selected() {
|
|
35
|
+
return this.index === 0 ? this.warningInput : this.hardCapInput;
|
|
36
|
+
}
|
|
37
|
+
move(delta) {
|
|
38
|
+
this.index = ((this.index + delta + 2) % 2);
|
|
39
|
+
this.focused = this._focused;
|
|
40
|
+
this.notice = undefined;
|
|
41
|
+
}
|
|
42
|
+
save() {
|
|
43
|
+
const warning = positive(this.warningInput.getValue());
|
|
44
|
+
const cap = positive(this.hardCapInput.getValue());
|
|
45
|
+
if (warning === undefined || cap === undefined)
|
|
46
|
+
this.notice = "Both broker limits must be positive integers.";
|
|
47
|
+
else if (warning > cap)
|
|
48
|
+
this.notice =
|
|
49
|
+
"Warning threshold cannot exceed the automatic-revive hard cap.";
|
|
50
|
+
else {
|
|
51
|
+
updateRawConfigAtomically("user", (latest) => ({
|
|
52
|
+
...latest,
|
|
53
|
+
brokerThresholds: { warning, automaticReviveCap: cap },
|
|
54
|
+
}));
|
|
55
|
+
this.notice = `Saved to user config. Applies next tick. ${BROKER_LIMIT_OVERRIDE_PRECEDENCE}`;
|
|
56
|
+
}
|
|
57
|
+
this.onChange();
|
|
58
|
+
}
|
|
59
|
+
handleInput(data, matches) {
|
|
60
|
+
if (/^\d+$/.test(data)) {
|
|
61
|
+
this.selected().handleInput(data);
|
|
62
|
+
this.notice = undefined;
|
|
63
|
+
this.onChange();
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (!matches)
|
|
67
|
+
return false;
|
|
68
|
+
if (matches("crtr.setup.list-down", data))
|
|
69
|
+
this.move(1);
|
|
70
|
+
else if (matches("crtr.setup.list-up", data))
|
|
71
|
+
this.move(-1);
|
|
72
|
+
else if (data.length > 0 &&
|
|
73
|
+
[...data].every((char) => char.codePointAt(0) >= 32))
|
|
74
|
+
this.notice = "Broker limits accept digits only.";
|
|
75
|
+
else {
|
|
76
|
+
this.selected().handleInput(data);
|
|
77
|
+
if (data !== "\r" && data !== "\n")
|
|
78
|
+
this.notice = undefined;
|
|
79
|
+
}
|
|
80
|
+
this.onChange();
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
render(width) {
|
|
84
|
+
const out = [
|
|
85
|
+
truncateToWidth(`${theme.fg("accent", theme.bold("Broker limits"))}${theme.fg("dim", " user scope · defaults 128 / 256")}`, width),
|
|
86
|
+
truncateToWidth(theme.fg("dim", "These bounds govern daemon automatic revive; explicit node revives remain available."), width),
|
|
87
|
+
"",
|
|
88
|
+
];
|
|
89
|
+
const line = (index, label, description, input) => {
|
|
90
|
+
const selected = index === this.index;
|
|
91
|
+
out.push(truncateToWidth(`${selected ? theme.fg("accent", "▶") : " "} ${padAnsi(selected ? theme.fg("accent", label) : label, 24)} ${input.render(Math.max(8, width - 28))[0] ?? ""}`, width));
|
|
92
|
+
out.push(truncateToWidth(theme.fg("dim", ` ${description}`), width));
|
|
93
|
+
};
|
|
94
|
+
line(0, "Warning threshold", "Warn when live brokers reach this count. Default: 128.", this.warningInput);
|
|
95
|
+
line(1, "Automatic-revive hard cap", "Defer automatic revives at this count. Default: 256.", this.hardCapInput);
|
|
96
|
+
out.push("");
|
|
97
|
+
for (const text of wrapText(`Configured limits apply next tick. ${BROKER_LIMIT_OVERRIDE_PRECEDENCE}`, width))
|
|
98
|
+
out.push(theme.fg("dim", text));
|
|
99
|
+
if (this.notice)
|
|
100
|
+
for (const text of wrapText(this.notice, width))
|
|
101
|
+
out.push(theme.fg(this.notice.startsWith("Saved") ? "success" : "warning", text));
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SetupSystemInstallPlan } from "../setup-core.js";
|
|
2
|
+
import { type SetupPanel } from "./panel.js";
|
|
3
|
+
export declare class DependenciesPanel implements SetupPanel {
|
|
4
|
+
private readonly plans;
|
|
5
|
+
private readonly onChange;
|
|
6
|
+
private readonly selectedTools;
|
|
7
|
+
private index;
|
|
8
|
+
constructor(plans: SetupSystemInstallPlan[], onChange: () => void);
|
|
9
|
+
badge(): string;
|
|
10
|
+
get selected(): readonly SetupSystemInstallPlan[];
|
|
11
|
+
private current;
|
|
12
|
+
handleInput(data: string, matches?: (id: string, input: string) => boolean): boolean;
|
|
13
|
+
render(width: number): string[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { truncateToWidth } from "@earendil-works/pi-tui";
|
|
2
|
+
import { theme } from "./panel.js";
|
|
3
|
+
function toolLabel(tool) {
|
|
4
|
+
return tool === "nvim" ? "nvim" : tool === "nerd-font" ? "Nerd Font" : "tmux";
|
|
5
|
+
}
|
|
6
|
+
export class DependenciesPanel {
|
|
7
|
+
plans;
|
|
8
|
+
onChange;
|
|
9
|
+
selectedTools = new Set();
|
|
10
|
+
index = 0;
|
|
11
|
+
constructor(plans, onChange) {
|
|
12
|
+
this.plans = plans;
|
|
13
|
+
this.onChange = onChange;
|
|
14
|
+
for (const plan of plans)
|
|
15
|
+
if (!plan.installed && plan.autoInstall)
|
|
16
|
+
this.selectedTools.add(plan.tool);
|
|
17
|
+
const firstMissing = plans.findIndex((plan) => !plan.installed);
|
|
18
|
+
this.index = firstMissing >= 0 ? firstMissing : 0;
|
|
19
|
+
}
|
|
20
|
+
badge() {
|
|
21
|
+
const missing = this.plans.filter((plan) => !plan.installed).length;
|
|
22
|
+
return missing === 0 ? "\u2713" : `${missing} missing`;
|
|
23
|
+
}
|
|
24
|
+
get selected() {
|
|
25
|
+
return this.plans.filter((tool) => !tool.installed && this.selectedTools.has(tool.tool));
|
|
26
|
+
}
|
|
27
|
+
current() {
|
|
28
|
+
return this.plans[this.index];
|
|
29
|
+
}
|
|
30
|
+
handleInput(data, matches) {
|
|
31
|
+
if (!matches)
|
|
32
|
+
return false;
|
|
33
|
+
if (matches("crtr.setup.list-down", data) ||
|
|
34
|
+
matches("crtr.setup.list-up", data)) {
|
|
35
|
+
const entries = this.plans
|
|
36
|
+
.map((tool, index) => ({ tool, index }))
|
|
37
|
+
.filter(({ tool }) => !tool.installed);
|
|
38
|
+
if (entries.length === 0)
|
|
39
|
+
return true;
|
|
40
|
+
const current = entries.findIndex(({ index }) => index === this.index);
|
|
41
|
+
const delta = matches("crtr.setup.list-down", data) ? 1 : -1;
|
|
42
|
+
this.index =
|
|
43
|
+
entries[((current >= 0 ? current : 0) + delta + entries.length) %
|
|
44
|
+
entries.length].index;
|
|
45
|
+
}
|
|
46
|
+
else if (matches("crtr.setup.toggle", data)) {
|
|
47
|
+
const tool = this.current();
|
|
48
|
+
if (tool && !tool.installed)
|
|
49
|
+
this.selectedTools.has(tool.tool)
|
|
50
|
+
? this.selectedTools.delete(tool.tool)
|
|
51
|
+
: this.selectedTools.add(tool.tool);
|
|
52
|
+
}
|
|
53
|
+
else
|
|
54
|
+
return false;
|
|
55
|
+
this.onChange();
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
render(width) {
|
|
59
|
+
const out = [
|
|
60
|
+
truncateToWidth(`${theme.fg("accent", theme.bold("System deps"))}${theme.fg("dim", " tmux + nvim + Nerd Font check")}`, width),
|
|
61
|
+
];
|
|
62
|
+
for (const [index, tool] of this.plans.entries()) {
|
|
63
|
+
const selected = index === this.index;
|
|
64
|
+
const marker = selected ? theme.fg("accent", "▶") : theme.fg("dim", " ");
|
|
65
|
+
if (tool.installed) {
|
|
66
|
+
out.push(truncateToWidth(`${marker} ${theme.fg("success", "✓ installed")} ${theme.fg("muted", toolLabel(tool.tool))}`, width));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const checked = this.selectedTools.has(tool.tool)
|
|
70
|
+
? theme.fg("success", "[x]")
|
|
71
|
+
: theme.fg("dim", "[ ]");
|
|
72
|
+
const label = tool.command ?? tool.hint;
|
|
73
|
+
const name = selected
|
|
74
|
+
? theme.fg("accent", `Install ${toolLabel(tool.tool)}`)
|
|
75
|
+
: `Install ${toolLabel(tool.tool)}`;
|
|
76
|
+
out.push(truncateToWidth(`${marker} ${checked} ${name} ${theme.fg("dim", "—")} ${theme.fg("muted", label)} ${theme.fg("warning", "not installed")}`, width));
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type BindingId, type BindingResolution } from "../../../core/keybindings/index.js";
|
|
2
|
+
export declare class KeybindingsPanel {
|
|
3
|
+
private readonly openingBindings;
|
|
4
|
+
private readonly terminalRows;
|
|
5
|
+
private readonly onChange;
|
|
6
|
+
private readonly keyInput;
|
|
7
|
+
private readonly keyDraft;
|
|
8
|
+
private keyIndex;
|
|
9
|
+
private keyFieldIndex;
|
|
10
|
+
private keyScroll;
|
|
11
|
+
private keyFilter;
|
|
12
|
+
private filteringKeys;
|
|
13
|
+
private editingKey;
|
|
14
|
+
private keyEditError;
|
|
15
|
+
private keyDiagnostics;
|
|
16
|
+
private keyConfirm;
|
|
17
|
+
private keyNotice;
|
|
18
|
+
private keyTmuxOccupancy;
|
|
19
|
+
private _focused;
|
|
20
|
+
constructor(openingBindings: BindingResolution<BindingId>, rawKeybindings: unknown, rawTmuxPassthrough: unknown, terminalRows: () => number, onChange: () => void);
|
|
21
|
+
set focused(value: boolean);
|
|
22
|
+
get focused(): boolean;
|
|
23
|
+
get dirty(): boolean;
|
|
24
|
+
badge(): string;
|
|
25
|
+
get takesPriorityInput(): boolean;
|
|
26
|
+
requestDiscard(): void;
|
|
27
|
+
private invalidate;
|
|
28
|
+
private matches;
|
|
29
|
+
private label;
|
|
30
|
+
private filteredKeybindings;
|
|
31
|
+
private selectedKeyRow;
|
|
32
|
+
private selectedKeybinding;
|
|
33
|
+
private tmuxPassthroughOffer;
|
|
34
|
+
private toggleTmuxPassthrough;
|
|
35
|
+
private moveKey;
|
|
36
|
+
private moveKeyField;
|
|
37
|
+
private keyViewportLines;
|
|
38
|
+
private keyPageSize;
|
|
39
|
+
private beginKeyEdit;
|
|
40
|
+
private commitKeyEdit;
|
|
41
|
+
private cancelKeyEdit;
|
|
42
|
+
private saveKeybindings;
|
|
43
|
+
private refreshTmuxBindingsAfterSave;
|
|
44
|
+
private confirmKeyAction;
|
|
45
|
+
private handleKeybindingsInput;
|
|
46
|
+
private keyRowMessage;
|
|
47
|
+
/** Number of lines needed to keep the active paired field legible. A narrow
|
|
48
|
+
* row stacks the action and field instead of sacrificing the action name,
|
|
49
|
+
* selected-field identity, or value to fixed columns. */
|
|
50
|
+
private keyRowBodyLineCount;
|
|
51
|
+
private keyLineCost;
|
|
52
|
+
private renderKeybindings;
|
|
53
|
+
handleInput(data: string): boolean;
|
|
54
|
+
render(width: number, _height?: number): string[];
|
|
55
|
+
footerHint(): string;
|
|
56
|
+
}
|