@north-light/crouter 0.3.170 → 0.3.172
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/dist/api/client.d.ts +37 -11
- package/dist/api/client.js +84 -15
- package/dist/api/dto/human.d.ts +53 -39
- package/dist/api/dto/human.js +2 -3
- package/dist/api/dto/inbox.d.ts +0 -1
- package/dist/api/dto/nodes.d.ts +12 -0
- package/dist/api/dto/review-comments.d.ts +137 -0
- package/dist/api/dto/review-comments.js +5 -0
- package/dist/api/dto/reviews.d.ts +109 -0
- package/dist/api/dto/reviews.js +5 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/routes.d.ts +17 -4
- package/dist/api/routes.js +21 -5
- package/dist/build-root.d.ts +1 -16
- package/dist/build-root.js +1 -25
- package/dist/builtin-memory/00-runtime-base.md +7 -5
- package/dist/builtin-memory/04-base-worker.md +1 -1
- package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
- package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
- package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
- package/dist/builtin-memory/design.md +2 -2
- package/dist/builtin-memory/insights/capture.md +50 -0
- package/dist/builtin-memory/insights/init.md +45 -0
- package/dist/builtin-memory/insights/listen.md +9 -0
- package/dist/builtin-memory/internal/agent-shaping.md +2 -2
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +12 -11
- package/dist/builtin-memory/internal/storage-tiers.md +2 -2
- package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
- package/dist/builtin-memory/plan.md +19 -0
- package/dist/builtin-memory/spec/guide.md +38 -0
- package/dist/builtin-memory/spec/requirements.md +31 -0
- package/dist/builtin-memory/spec/roadmap.md +35 -0
- package/dist/builtin-memory/spec.md +10 -86
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
- package/dist/cli.js +2 -6
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
- package/dist/clients/attach/__tests__/context-message.test.js +142 -6
- package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
- package/dist/clients/attach/__tests__/diagram.test.js +1 -1
- package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
- package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
- package/dist/clients/attach/chrome/header.d.ts +10 -0
- package/dist/clients/attach/chrome/header.js +30 -0
- package/dist/clients/attach/chrome/recap.d.ts +7 -0
- package/dist/clients/attach/chrome/recap.js +19 -0
- package/dist/clients/attach/chrome/status-line.d.ts +3 -0
- package/dist/clients/attach/chrome/status-line.js +5 -0
- package/dist/clients/attach/chrome/widgets.js +11 -21
- package/dist/clients/attach/command.js +11 -7
- package/dist/clients/attach/config.d.ts +4 -0
- package/dist/clients/attach/config.js +3 -0
- package/dist/clients/attach/input/controller.d.ts +19 -0
- package/dist/clients/attach/input/controller.js +62 -28
- package/dist/clients/attach/input/titled-editor.d.ts +0 -4
- package/dist/clients/attach/input/titled-editor.js +2 -10
- package/dist/clients/attach/overlays/file-review.d.ts +9 -5
- package/dist/clients/attach/overlays/file-review.js +9 -70
- package/dist/clients/attach/overlays/help.d.ts +33 -0
- package/dist/clients/attach/overlays/help.js +204 -0
- package/dist/clients/attach/render/activity-slot.d.ts +4 -0
- package/dist/clients/attach/render/activity-slot.js +13 -0
- package/dist/clients/attach/render/chat-view.d.ts +117 -12
- package/dist/clients/attach/render/chat-view.js +604 -135
- package/dist/clients/attach/render/context-message.d.ts +2 -1
- package/dist/clients/attach/render/context-message.js +17 -13
- package/dist/clients/attach/render/crtr-output.js +1 -3
- package/dist/clients/attach/render/diagram.js +2 -2
- package/dist/clients/attach/render/edit-diff.d.ts +4 -1
- package/dist/clients/attach/render/edit-diff.js +7 -11
- package/dist/clients/attach/render/group-activity.d.ts +32 -0
- package/dist/clients/attach/render/group-activity.js +206 -0
- package/dist/clients/attach/render/group-recap.d.ts +10 -0
- package/dist/clients/attach/render/group-recap.js +93 -0
- package/dist/clients/attach/render/html-markdown.d.ts +17 -0
- package/dist/clients/attach/render/html-markdown.js +228 -0
- package/dist/clients/attach/render/measured-container.d.ts +96 -0
- package/dist/clients/attach/render/measured-container.js +322 -0
- package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
- package/dist/clients/attach/render/scroll-animation.js +80 -0
- package/dist/clients/attach/render/tool-calls.js +6 -6
- package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
- package/dist/clients/attach/render/transcript-copy.js +81 -0
- package/dist/clients/attach/render/viewport.d.ts +29 -0
- package/dist/clients/attach/render/viewport.js +159 -0
- package/dist/clients/attach/session/bindings.d.ts +10 -7
- package/dist/clients/attach/session/bindings.js +23 -8
- package/dist/clients/attach/session/connection.js +4 -5
- package/dist/clients/attach/session/context.d.ts +6 -4
- package/dist/clients/attach/session/frame.d.ts +34 -0
- package/dist/clients/attach/session/frame.js +176 -0
- package/dist/clients/attach/session/frames.d.ts +4 -1
- package/dist/clients/attach/session/frames.js +14 -1
- package/dist/clients/attach/session/identity.js +4 -3
- package/dist/clients/attach/session/input-wiring.d.ts +14 -4
- package/dist/clients/attach/session/input-wiring.js +15 -13
- package/dist/clients/attach/session/invariant.d.ts +9 -0
- package/dist/clients/attach/session/invariant.js +15 -0
- package/dist/clients/attach/session/keys.d.ts +10 -2
- package/dist/clients/attach/session/keys.js +13 -5
- package/dist/clients/attach/session/layout.d.ts +10 -8
- package/dist/clients/attach/session/layout.js +33 -34
- package/dist/clients/attach/session/mouse.d.ts +18 -0
- package/dist/clients/attach/session/mouse.js +64 -0
- package/dist/clients/attach/session/pane-tag.d.ts +3 -0
- package/dist/clients/attach/session/pane-tag.js +51 -8
- package/dist/clients/attach/session/reconnect.d.ts +3 -0
- package/dist/clients/attach/session/reconnect.js +42 -5
- package/dist/clients/attach/session/surface-frame.d.ts +20 -0
- package/dist/clients/attach/session/surface-frame.js +73 -0
- package/dist/clients/attach/session/surface-host.d.ts +64 -0
- package/dist/clients/attach/session/surface-host.js +255 -0
- package/dist/clients/attach/session/whip.d.ts +17 -0
- package/dist/clients/attach/session/whip.js +334 -0
- package/dist/clients/attach/slash/dispatch.d.ts +13 -1
- package/dist/clients/attach/slash/dispatch.js +51 -29
- package/dist/clients/attach/viewer.js +907 -819
- package/dist/clients/conversation/conversation.d.ts +65 -0
- package/dist/clients/conversation/conversation.js +318 -0
- package/dist/clients/conversation/frames.d.ts +30 -0
- package/dist/clients/conversation/frames.js +52 -0
- package/dist/clients/conversation/region.d.ts +51 -0
- package/dist/clients/conversation/region.js +265 -0
- package/dist/clients/conversation/submit.d.ts +38 -0
- package/dist/clients/conversation/submit.js +51 -0
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
- package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
- package/dist/clients/inbox/controller.d.ts +79 -0
- package/dist/clients/inbox/controller.js +448 -0
- package/dist/clients/inbox/deck-adapter.d.ts +29 -0
- package/dist/clients/inbox/deck-adapter.js +62 -0
- package/dist/clients/inbox/layout.d.ts +8 -0
- package/dist/clients/inbox/layout.js +9 -0
- package/dist/clients/inbox/resolve.d.ts +10 -0
- package/dist/clients/inbox/resolve.js +34 -0
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
- package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
- package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
- package/dist/clients/inbox/review/anchors.d.ts +41 -0
- package/dist/clients/inbox/review/anchors.js +89 -0
- package/dist/clients/inbox/review/columns.d.ts +22 -0
- package/dist/clients/inbox/review/columns.js +40 -0
- package/dist/clients/inbox/review/comments-client.d.ts +66 -0
- package/dist/clients/inbox/review/comments-client.js +98 -0
- package/dist/clients/inbox/review/composition.d.ts +60 -0
- package/dist/clients/inbox/review/composition.js +278 -0
- package/dist/clients/inbox/review/document-region.d.ts +120 -0
- package/dist/clients/inbox/review/document-region.js +902 -0
- package/dist/clients/inbox/review/frame.d.ts +45 -0
- package/dist/clients/inbox/review/frame.js +215 -0
- package/dist/clients/inbox/review/keys.d.ts +67 -0
- package/dist/clients/inbox/review/keys.js +130 -0
- package/dist/clients/inbox/review/launch.d.ts +10 -0
- package/dist/clients/inbox/review/launch.js +129 -0
- package/dist/clients/inbox/review/live-source.d.ts +24 -0
- package/dist/clients/inbox/review/live-source.js +160 -0
- package/dist/clients/inbox/review/nvim.d.ts +13 -0
- package/dist/clients/inbox/review/nvim.js +42 -0
- package/dist/clients/inbox/review/remap.d.ts +51 -0
- package/dist/clients/inbox/review/remap.js +157 -0
- package/dist/clients/inbox/review/review-client.d.ts +30 -0
- package/dist/clients/inbox/review/review-client.js +107 -0
- package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
- package/dist/clients/inbox/review/roundtrip.js +36 -0
- package/dist/clients/inbox/review/state.d.ts +143 -0
- package/dist/clients/inbox/review/state.js +282 -0
- package/dist/clients/inbox/review-adapter.d.ts +29 -0
- package/dist/clients/inbox/review-adapter.js +92 -0
- package/dist/clients/inbox/review-visibility.d.ts +5 -0
- package/dist/clients/inbox/review-visibility.js +19 -0
- package/dist/clients/inbox/surface.d.ts +19 -0
- package/dist/clients/inbox/surface.js +128 -0
- package/dist/clients/inbox/tui/ansi.d.ts +66 -0
- package/dist/clients/inbox/tui/ansi.js +317 -0
- package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
- package/dist/clients/inbox/tui/clipboard.js +26 -0
- package/dist/clients/inbox/tui/input.d.ts +7 -0
- package/dist/clients/inbox/tui/input.js +653 -0
- package/dist/clients/inbox/tui/keys.d.ts +28 -0
- package/dist/clients/inbox/tui/keys.js +111 -0
- package/dist/clients/inbox/tui/panel.d.ts +2 -0
- package/dist/clients/inbox/tui/panel.js +217 -0
- package/dist/clients/inbox/tui/render.d.ts +37 -0
- package/dist/clients/inbox/tui/render.js +476 -0
- package/dist/clients/inbox/tui/types.d.ts +57 -0
- package/dist/clients/inbox/tui/types.js +1 -0
- package/dist/clients/inbox/tui.d.ts +6 -0
- package/dist/clients/inbox/tui.js +74 -0
- package/dist/clients/surfaces/host.d.ts +66 -0
- package/dist/clients/surfaces/host.js +1 -0
- package/dist/clients/surfaces/region.d.ts +16 -0
- package/dist/clients/surfaces/region.js +1 -0
- package/dist/clients/web/__tests__/push-engine.test.js +14 -158
- package/dist/clients/web/dev-server.d.ts +3 -3
- package/dist/clients/web/dev-server.js +9 -23
- package/dist/clients/web/events.js +4 -6
- package/dist/clients/web/push-engine.d.ts +2 -66
- package/dist/clients/web/push-engine.js +30 -161
- package/dist/clients/web/push-registry.d.ts +0 -4
- package/dist/clients/web/push-registry.js +2 -7
- package/dist/clients/web/server.js +3 -35
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
- package/dist/clients/web/web-cmd.js +2 -2
- package/dist/commands/__tests__/human.test.js +27 -15
- package/dist/commands/api-client.js +3 -3
- package/dist/commands/canvas-browse.js +1 -1
- package/dist/commands/canvas-issue.js +1 -1
- package/dist/commands/canvas-use.js +1 -1
- package/dist/commands/human/doc.d.ts +2 -0
- package/dist/commands/human/doc.js +98 -0
- package/dist/commands/human/inbox.d.ts +2 -0
- package/dist/commands/human/inbox.js +101 -0
- package/dist/commands/human/prompts.d.ts +2 -3
- package/dist/commands/human/prompts.js +27 -180
- package/dist/commands/human/queue.d.ts +1 -5
- package/dist/commands/human/queue.js +54 -216
- package/dist/commands/human/review.d.ts +2 -0
- package/dist/commands/human/review.js +298 -0
- package/dist/commands/human/shared.d.ts +2 -69
- package/dist/commands/human/shared.js +1 -181
- package/dist/commands/human.js +15 -20
- package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
- package/dist/commands/memory/__tests__/lint.test.js +15 -0
- package/dist/commands/memory/delete.js +2 -2
- package/dist/commands/memory/lint.d.ts +1 -0
- package/dist/commands/memory/lint.js +21 -3
- package/dist/commands/memory/read.js +4 -4
- package/dist/commands/node.js +8 -7
- package/dist/commands/pkg/plugin-manage.js +143 -68
- package/dist/commands/surface-inspect.js +2 -2
- package/dist/commands/surface.js +6 -12
- package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
- package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
- package/dist/commands/sys/config.js +29 -3
- package/dist/commands/sys/feedback.js +1 -1
- package/dist/commands/sys/setup-core.d.ts +12 -11
- package/dist/commands/sys/setup-core.js +55 -46
- package/dist/commands/sys/setup-wizard.d.ts +4 -1
- package/dist/commands/sys/setup-wizard.js +50 -9
- package/dist/commands/sys/sync-deps.js +1 -1
- package/dist/commands/sys.js +4 -6
- package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
- package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
- package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
- package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
- package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
- package/dist/core/__tests__/full/detach-focus.test.js +1 -1
- package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
- package/dist/core/__tests__/human-deliver.test.js +71 -345
- package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
- package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
- package/dist/core/__tests__/migration.test.js +10 -0
- package/dist/core/__tests__/model-pin-durability.test.js +14 -0
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
- package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-store.test.js +143 -0
- package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
- package/dist/core/__tests__/revive.test.js +22 -53
- package/dist/core/__tests__/session-cycles.test.js +48 -18
- package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
- package/dist/core/__tests__/stop-guard.test.js +16 -1
- package/dist/core/__tests__/tmux-surface.test.js +21 -25
- package/dist/core/asset-root.d.ts +7 -0
- package/dist/core/asset-root.js +18 -0
- package/dist/core/broker-client/client.d.ts +0 -7
- package/dist/core/broker-client/client.js +4 -10
- package/dist/core/broker-client/transport-relay.d.ts +3 -4
- package/dist/core/broker-client/transport-relay.js +3 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
- package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
- package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
- package/dist/core/canvas/attention.js +4 -4
- package/dist/core/canvas/canvas.d.ts +6 -11
- package/dist/core/canvas/canvas.js +11 -33
- package/dist/core/canvas/db.js +207 -38
- package/dist/core/canvas/extensions.d.ts +1 -1
- package/dist/core/canvas/extensions.js +8 -1
- package/dist/core/canvas/index.d.ts +0 -1
- package/dist/core/canvas/index.js +0 -1
- package/dist/core/canvas/nav-model.d.ts +1 -1
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/paths.d.ts +5 -0
- package/dist/core/canvas/paths.js +16 -0
- package/dist/core/canvas/remote-canvas-source.js +2 -2
- package/dist/core/canvas/remote-transport.d.ts +7 -0
- package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
- package/dist/core/canvas/source.js +1 -1
- package/dist/core/canvas/status-glyph.js +4 -12
- package/dist/core/canvas/types.d.ts +10 -35
- package/dist/core/clipboard-text.d.ts +8 -0
- package/dist/core/clipboard-text.js +18 -0
- package/dist/core/command-manifests/registry.d.ts +1 -3
- package/dist/core/command-plugins/bundle.d.ts +29 -0
- package/dist/core/command-plugins/bundle.js +198 -0
- package/dist/core/command-plugins/discovery.d.ts +0 -8
- package/dist/core/command-plugins/discovery.js +2 -39
- package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
- package/dist/core/command-plugins/transport/http-fetch.js +17 -95
- package/dist/core/command.d.ts +1 -13
- package/dist/core/command.js +1 -16
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.js +28 -3
- package/dist/core/document-lines.d.ts +4 -0
- package/dist/core/document-lines.js +6 -0
- package/dist/core/feed/feed.d.ts +2 -0
- package/dist/core/feed/feed.js +11 -7
- package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
- package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
- package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-core.test.js +144 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
- package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
- package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
- package/dist/core/human/claim.d.ts +23 -0
- package/dist/core/human/claim.js +67 -0
- package/dist/core/human/convention.d.ts +30 -0
- package/dist/core/human/convention.js +202 -0
- package/dist/core/human/deck-factories.d.ts +8 -0
- package/dist/core/human/deck-factories.js +15 -0
- package/dist/core/human/deck-schema.d.ts +70 -0
- package/dist/core/human/deck-schema.js +92 -0
- package/dist/core/human/root.d.ts +7 -0
- package/dist/core/human/root.js +37 -0
- package/dist/core/human/scan.d.ts +3 -0
- package/dist/core/human/scan.js +76 -0
- package/dist/core/human/summary.d.ts +8 -0
- package/dist/core/human/summary.js +44 -0
- package/dist/core/human/tickets.d.ts +49 -0
- package/dist/core/human/tickets.js +190 -0
- package/dist/core/human/types.d.ts +136 -0
- package/dist/core/human/types.js +5 -0
- package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
- package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
- package/dist/core/inspector/chrome.d.ts +6 -0
- package/dist/core/inspector/chrome.js +14 -0
- package/dist/core/inspector/contract.d.ts +105 -0
- package/dist/core/inspector/contract.js +1 -0
- package/dist/core/inspector/core.d.ts +4 -5
- package/dist/core/inspector/core.js +3 -5
- package/dist/core/inspector/host.d.ts +46 -0
- package/dist/core/{tui → inspector}/host.js +42 -208
- package/dist/core/inspector/text.d.ts +2 -2
- package/dist/core/inspector/transport.d.ts +6 -0
- package/dist/core/inspector/transport.js +36 -0
- package/dist/core/inspector/tui.d.ts +2 -2
- package/dist/core/inspector/tui.js +15 -15
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
- package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
- package/dist/core/keybindings/attach-control.d.ts +9 -3
- package/dist/core/keybindings/attach-control.js +3 -1
- package/dist/core/keybindings/catalog.d.ts +6 -5
- package/dist/core/keybindings/catalog.js +61 -133
- package/dist/core/keybindings/inbox.d.ts +5 -6
- package/dist/core/keybindings/inbox.js +9 -10
- package/dist/core/keybindings/index.d.ts +3 -3
- package/dist/core/keybindings/index.js +3 -3
- package/dist/core/keybindings/persistence.d.ts +5 -1
- package/dist/core/keybindings/persistence.js +24 -6
- package/dist/core/keybindings/resolve.d.ts +6 -0
- package/dist/core/keybindings/resolve.js +10 -3
- package/dist/core/memory/inline-ref-grammar.js +2 -3
- package/dist/core/memory-resolver.d.ts +27 -29
- package/dist/core/memory-resolver.js +45 -39
- package/dist/core/model-routes.d.ts +33 -0
- package/dist/core/model-routes.js +42 -3
- package/dist/core/preview-registry.js +17 -55
- package/dist/core/profiles/select.js +3 -3
- package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
- package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
- package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
- package/dist/core/review/__tests__/capture-origin.test.js +139 -0
- package/dist/core/review/__tests__/comments.test.d.ts +1 -0
- package/dist/core/review/__tests__/comments.test.js +98 -0
- package/dist/core/review/__tests__/project.test.d.ts +1 -0
- package/dist/core/review/__tests__/project.test.js +71 -0
- package/dist/core/review/__tests__/remap.test.d.ts +1 -0
- package/dist/core/review/__tests__/remap.test.js +159 -0
- package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
- package/dist/core/review/__tests__/stage-identity.test.js +140 -0
- package/dist/core/review/birth.d.ts +7 -0
- package/dist/core/review/birth.js +23 -0
- package/dist/core/review/comments.d.ts +69 -0
- package/dist/core/review/comments.js +295 -0
- package/dist/core/review/companion.d.ts +35 -0
- package/dist/core/review/companion.js +205 -0
- package/dist/core/review/document.d.ts +27 -0
- package/dist/core/review/document.js +138 -0
- package/dist/core/review/project.d.ts +13 -0
- package/dist/core/review/project.js +58 -0
- package/dist/core/review/realize.d.ts +19 -0
- package/dist/core/review/realize.js +217 -0
- package/dist/core/review/remap.d.ts +24 -0
- package/dist/core/review/remap.js +156 -0
- package/dist/core/review/signal.d.ts +5 -0
- package/dist/core/review/signal.js +31 -0
- package/dist/core/review/stage.d.ts +26 -0
- package/dist/core/review/stage.js +184 -0
- package/dist/core/review/store.d.ts +46 -0
- package/dist/core/review/store.js +163 -0
- package/dist/core/review/ticket-filter.d.ts +17 -0
- package/dist/core/review/ticket-filter.js +32 -0
- package/dist/core/review/types.d.ts +130 -0
- package/dist/core/review/types.js +23 -0
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
- package/dist/core/runtime/bearings.d.ts +5 -17
- package/dist/core/runtime/bearings.js +88 -71
- package/dist/core/runtime/broker-protocol.d.ts +31 -8
- package/dist/core/runtime/broker.d.ts +15 -1
- package/dist/core/runtime/broker.js +573 -141
- package/dist/core/runtime/canvas-extensions.d.ts +4 -5
- package/dist/core/runtime/canvas-extensions.js +5 -5
- package/dist/core/runtime/front-door.js +4 -4
- package/dist/core/runtime/headless-pi.d.ts +24 -0
- package/dist/core/runtime/headless-pi.js +152 -0
- package/dist/core/runtime/kickoff.d.ts +1 -5
- package/dist/core/runtime/kickoff.js +1 -5
- package/dist/core/runtime/model-registry.d.ts +3 -0
- package/dist/core/runtime/model-registry.js +13 -0
- package/dist/core/runtime/naming-persist.d.ts +4 -0
- package/dist/core/runtime/naming-persist.js +27 -1
- package/dist/core/runtime/naming.d.ts +17 -12
- package/dist/core/runtime/naming.js +91 -140
- package/dist/core/runtime/node-read.js +19 -10
- package/dist/core/runtime/nodes.d.ts +9 -14
- package/dist/core/runtime/nodes.js +3 -53
- package/dist/core/runtime/package-health.d.ts +6 -21
- package/dist/core/runtime/package-health.js +12 -123
- package/dist/core/runtime/placement-tmux.d.ts +2 -1
- package/dist/core/runtime/placement-tmux.js +6 -4
- package/dist/core/runtime/placement.d.ts +1 -0
- package/dist/core/runtime/placement.js +4 -8
- package/dist/core/runtime/promote.js +3 -0
- package/dist/core/runtime/recap.d.ts +2 -7
- package/dist/core/runtime/recap.js +35 -69
- package/dist/core/runtime/revive.js +34 -77
- package/dist/core/runtime/session-cycles.d.ts +4 -0
- package/dist/core/runtime/session-cycles.js +14 -1
- package/dist/core/runtime/session-visibility.d.ts +37 -0
- package/dist/core/runtime/session-visibility.js +83 -0
- package/dist/core/runtime/spawn.js +10 -22
- package/dist/core/runtime/stop-guard.d.ts +1 -1
- package/dist/core/runtime/stop-guard.js +18 -13
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux-chrome.d.ts +1 -1
- package/dist/core/runtime/tmux-chrome.js +1 -1
- package/dist/core/runtime/tmux.d.ts +35 -7
- package/dist/core/runtime/tmux.js +439 -62
- package/dist/core/runtime/tool-group-summary.d.ts +19 -0
- package/dist/core/runtime/tool-group-summary.js +88 -0
- package/dist/core/scope.d.ts +2 -7
- package/dist/core/scope.js +9 -35
- package/dist/core/substrate/schema.d.ts +2 -2
- package/dist/core/termrender/code-doc.d.ts +12 -0
- package/dist/core/termrender/code-doc.js +92 -0
- package/dist/core/termrender/display.d.ts +12 -0
- package/dist/core/termrender/display.js +19 -0
- package/dist/core/termrender/termrender.d.ts +73 -0
- package/dist/core/termrender/termrender.js +795 -0
- package/dist/core/termrender/version.d.ts +1 -0
- package/dist/core/termrender/version.js +1 -0
- package/dist/core/tui/terminal.js +1 -2
- package/dist/core/user-settings.d.ts +71 -3
- package/dist/core/user-settings.js +83 -1
- package/dist/daemon/api/__tests__/inbox.test.js +44 -133
- package/dist/daemon/api/handlers/human.d.ts +0 -10
- package/dist/daemon/api/handlers/human.js +104 -702
- package/dist/daemon/api/handlers/inbox.js +113 -142
- package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
- package/dist/daemon/api/handlers/review-comments.js +500 -0
- package/dist/daemon/api/handlers/reviews.d.ts +2 -0
- package/dist/daemon/api/handlers/reviews.js +287 -0
- package/dist/daemon/api/map.d.ts +22 -7
- package/dist/daemon/api/map.js +159 -11
- package/dist/daemon/api/server.js +4 -0
- package/dist/daemon/cron-run.js +6 -9
- package/dist/daemon/crtrd.js +17 -33
- package/dist/daemon/fleet.d.ts +1 -8
- package/dist/daemon/fleet.js +4 -30
- package/dist/daemon/human/finish.d.ts +14 -0
- package/dist/daemon/human/finish.js +115 -0
- package/dist/daemon/human/sweep.d.ts +6 -0
- package/dist/daemon/human/sweep.js +49 -0
- package/dist/daemon/messaging/node-message.d.ts +18 -0
- package/dist/daemon/messaging/node-message.js +70 -0
- package/dist/daemon/review/comment-notify.d.ts +26 -0
- package/dist/daemon/review/comment-notify.js +107 -0
- package/dist/daemon/review/deliver.d.ts +7 -0
- package/dist/daemon/review/deliver.js +56 -0
- package/dist/daemon/review/finish.d.ts +22 -0
- package/dist/daemon/review/finish.js +254 -0
- package/dist/daemon/review/sweep.d.ts +11 -0
- package/dist/daemon/review/sweep.js +120 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
- package/dist/pi-extensions/canvas-context-intro.js +50 -104
- package/dist/pi-extensions/canvas-recap.d.ts +15 -2
- package/dist/pi-extensions/canvas-recap.js +192 -69
- package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
- package/dist/pi-extensions/canvas-review-boundary.js +81 -0
- package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
- package/dist/pi-extensions/canvas-stophook.js +78 -128
- package/dist/pi-extensions/canvas-structured-output.js +52 -8
- package/dist/shared/generated-context.d.ts +29 -4
- package/dist/shared/generated-context.js +122 -7
- package/dist/shared/tool-groups.d.ts +23 -0
- package/dist/shared/tool-groups.js +60 -0
- package/dist/shared/working-activity.d.ts +8 -0
- package/dist/shared/working-activity.js +26 -0
- package/dist/types.d.ts +36 -2
- package/dist/types.js +51 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
- package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
- package/dist/web-client/index.html +2 -2
- package/dist/web-client/sw.js +1 -1
- package/docs/compat/hearth-crtr-v4.md +2 -2
- package/docs/compat/hearth-crtr-v5.md +4 -2
- package/docs/public-api.md +3 -3
- package/package.json +21 -14
- package/runtime.lock.json +4661 -1453
- package/scripts/postinstall.mjs +15 -2
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
- package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
- package/dist/builtin-views/_lib/states.mjs +0 -161
- package/dist/builtin-views/canvas/core.mjs +0 -657
- package/dist/builtin-views/canvas/text.mjs +0 -58
- package/dist/builtin-views/canvas/tui.mjs +0 -168
- package/dist/builtin-views/canvas/web.jsx +0 -121
- package/dist/builtin-views/chat/core.mjs +0 -684
- package/dist/builtin-views/chat/text.mjs +0 -101
- package/dist/builtin-views/chat/tui.mjs +0 -360
- package/dist/builtin-views/chat/web.jsx +0 -362
- package/dist/builtin-views/git-pr/core.mjs +0 -673
- package/dist/builtin-views/git-pr/text.mjs +0 -84
- package/dist/builtin-views/git-pr/tui.mjs +0 -301
- package/dist/builtin-views/git-pr/web.jsx +0 -216
- package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
- package/dist/builtin-views/inbox/core.mjs +0 -1273
- package/dist/builtin-views/inbox/text.mjs +0 -73
- package/dist/builtin-views/inbox/tui.mjs +0 -314
- package/dist/builtin-views/inbox/web.jsx +0 -188
- package/dist/builtin-views/linkedin/core.mjs +0 -906
- package/dist/builtin-views/linkedin/text.mjs +0 -69
- package/dist/builtin-views/linkedin/tui.mjs +0 -413
- package/dist/builtin-views/linkedin/web.jsx +0 -206
- package/dist/builtin-views/prompt-review/core.mjs +0 -735
- package/dist/builtin-views/prompt-review/text.mjs +0 -15
- package/dist/builtin-views/prompt-review/tui.mjs +0 -196
- package/dist/builtin-views/prompt-review/web.jsx +0 -484
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
- package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
- package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
- package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
- package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
- package/dist/clients/attach/session/mode.d.ts +0 -25
- package/dist/clients/attach/session/mode.js +0 -97
- package/dist/commands/sys/promptstudio.d.ts +0 -2
- package/dist/commands/sys/promptstudio.js +0 -65
- package/dist/commands/view-cycle.d.ts +0 -2
- package/dist/commands/view-cycle.js +0 -130
- package/dist/commands/view-list.d.ts +0 -2
- package/dist/commands/view-list.js +0 -66
- package/dist/commands/view-new.d.ts +0 -2
- package/dist/commands/view-new.js +0 -74
- package/dist/commands/view-pick.d.ts +0 -6
- package/dist/commands/view-pick.js +0 -129
- package/dist/commands/view-run.d.ts +0 -2
- package/dist/commands/view-run.js +0 -214
- package/dist/commands/view.d.ts +0 -2
- package/dist/commands/view.js +0 -31
- package/dist/commands/workspace.d.ts +0 -2
- package/dist/commands/workspace.js +0 -165
- package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
- package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
- package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
- package/dist/core/canvas/human-work-outbox.d.ts +0 -73
- package/dist/core/canvas/human-work-outbox.js +0 -261
- package/dist/core/command-plugins/store.d.ts +0 -16
- package/dist/core/command-plugins/store.js +0 -64
- package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
- package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
- package/dist/core/runtime/fault-recovery-nudge.js +0 -3
- package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
- package/dist/core/tui/host.d.ts +0 -66
- package/dist/core/view/__tests__/transport-cache.test.js +0 -62
- package/dist/core/view/bridge.d.ts +0 -10
- package/dist/core/view/bridge.js +0 -31
- package/dist/core/view/chrome.d.ts +0 -9
- package/dist/core/view/chrome.js +0 -22
- package/dist/core/view/contract.d.ts +0 -205
- package/dist/core/view/contract.js +0 -23
- package/dist/core/view/loader.d.ts +0 -31
- package/dist/core/view/loader.js +0 -188
- package/dist/core/view/stream-local.d.ts +0 -3
- package/dist/core/view/stream-local.js +0 -231
- package/dist/core/view/transport-cache.d.ts +0 -8
- package/dist/core/view/transport-cache.js +0 -38
- package/dist/core/view/transport-local.d.ts +0 -7
- package/dist/core/view/transport-local.js +0 -83
- package/dist/core/view/transport-remote.d.ts +0 -2
- package/dist/core/view/transport.d.ts +0 -10
- package/dist/core/view/transport.js +0 -15
- package/dist/pi-extensions/naming-tool.d.ts +0 -24
- package/dist/pi-extensions/naming-tool.js +0 -67
- package/dist/prompts/view.d.ts +0 -7
- package/dist/prompts/view.js +0 -172
- package/dist/web/ViewChrome.d.ts +0 -7
- package/dist/web/ViewChrome.js +0 -28
- package/dist/web/ViewPane.d.ts +0 -39
- package/dist/web/ViewPane.js +0 -48
- package/dist/web/index.d.ts +0 -8
- package/dist/web/index.js +0 -22
- package/dist/web/runtime.d.ts +0 -39
- package/dist/web/runtime.js +0 -232
- package/dist/web/states.d.ts +0 -24
- package/dist/web/states.js +0 -24
- package/dist/web/transport-http.d.ts +0 -5
- package/dist/web/transport-http.js +0 -34
- package/dist/web/transport-stream.d.ts +0 -3
- package/dist/web/transport-stream.js +0 -204
- package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
- package/dist/web-client/assets/index-aaeu4adv.css +0 -2
- /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
- /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
- /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
- /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
- /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
|
@@ -1,28 +1,17 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { ApiError } from '../../api/index.js';
|
|
1
4
|
import { defineLeaf } from '../../core/command.js';
|
|
5
|
+
import { ticketDir } from '../../core/human/root.js';
|
|
6
|
+
import { scanInbox } from '../../core/human/scan.js';
|
|
7
|
+
import { parseDeck } from '../../core/human/deck-schema.js';
|
|
8
|
+
import { deckPath, isResolved, readJson, reviewPath } from '../../core/human/convention.js';
|
|
2
9
|
import { InputError } from '../../core/io.js';
|
|
3
|
-
import { ApiError } from '../../api/index.js';
|
|
4
|
-
import { cliClient, rethrowAsCliError } from '../api-client.js';
|
|
5
|
-
import { nodeDir, nodesRoot } from '../../core/canvas/paths.js';
|
|
6
10
|
import { paginate } from '../../core/pagination.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { scanInbox, parseDeck, deckPath, reviewPath, isResolved, readJson, claimTicket, completeDeck, cancelTicket, listInboxRoots, } from '@crouton-kit/humanloop';
|
|
10
|
-
import { crouterFocusHandler } from './shared.js';
|
|
11
|
-
import { focusViewer } from '../node.js';
|
|
12
|
-
/** Canonicalize a completion-event path the same way humanloop's registry does
|
|
13
|
-
* (realpath-resolved), falling back to a plain `resolve()` when the path no
|
|
14
|
-
* longer exists on disk, so the `_focus` containment/registration checks
|
|
15
|
-
* compare like against like regardless of symlinked path components. */
|
|
16
|
-
function canonicalPath(p) {
|
|
17
|
-
try {
|
|
18
|
-
return realpathSync(p);
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return resolve(p);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
11
|
+
import { cliClient, rethrowAsCliError } from '../api-client.js';
|
|
12
|
+
import { filterVisibleReviewTickets } from '../../clients/inbox/review-visibility.js';
|
|
24
13
|
function toRef(n) {
|
|
25
|
-
return { node_id: n.node_id, name: n.name, cwd: n.cwd, parent: n.parent };
|
|
14
|
+
return { node_id: n.node_id, name: n.name, cwd: n.cwd, parent: n.parent, status: n.status };
|
|
26
15
|
}
|
|
27
16
|
/** The canvas roster, fetched ONCE per leaf run through the API and threaded
|
|
28
17
|
* into the sync provenance helpers below (they used to call `listNodes()`/
|
|
@@ -96,10 +85,17 @@ function summarizeTicket(summary, nodes, byId) {
|
|
|
96
85
|
};
|
|
97
86
|
}
|
|
98
87
|
function interactionDirForJob(jobId, byId) {
|
|
99
|
-
|
|
100
|
-
|
|
88
|
+
const node = byId.get(jobId);
|
|
89
|
+
if (node !== undefined)
|
|
90
|
+
return { dir: ticketDir(jobId), node };
|
|
101
91
|
throw new InputError({ error: 'not_found', message: `no interaction node: ${jobId}`, field: 'job_id', next: 'Pass a job_id from `crtr human list`.' });
|
|
102
92
|
}
|
|
93
|
+
function isTerminalBridge(status) {
|
|
94
|
+
return status === 'done' || status === 'dead' || status === 'canceled';
|
|
95
|
+
}
|
|
96
|
+
function isAlreadyResolvedConflict(error) {
|
|
97
|
+
return error instanceof ApiError && error.status === 409 && error.code === 'ticket_already_resolved';
|
|
98
|
+
}
|
|
103
99
|
// ---------------------------------------------------------------------------
|
|
104
100
|
// list (read-only, paginated)
|
|
105
101
|
// ---------------------------------------------------------------------------
|
|
@@ -126,9 +122,10 @@ export const humanList = defineLeaf({
|
|
|
126
122
|
const limitRaw = input['limit'];
|
|
127
123
|
const limit = Math.min(Math.max(1, limitRaw), 100);
|
|
128
124
|
const cursor = input['cursor'];
|
|
125
|
+
const { tickets } = await cliClient().listHumanInbox();
|
|
126
|
+
const raw = filterVisibleReviewTickets(scanInbox(), new Set(tickets.map((ticket) => ticket.ticket_id)));
|
|
129
127
|
const nodes = await fetchNodeRefs();
|
|
130
128
|
const byId = new Map(nodes.map((n) => [n.node_id, n]));
|
|
131
|
-
const raw = scanInbox([nodesRoot()]);
|
|
132
129
|
const items = raw
|
|
133
130
|
.flatMap((s) => {
|
|
134
131
|
const item = summarizeTicket(s, nodes, byId);
|
|
@@ -153,7 +150,7 @@ export const humanList = defineLeaf({
|
|
|
153
150
|
// ---------------------------------------------------------------------------
|
|
154
151
|
export const humanDeck = defineLeaf({
|
|
155
152
|
name: 'deck',
|
|
156
|
-
description: 'read one pending
|
|
153
|
+
description: 'read one pending human deck',
|
|
157
154
|
whenToUse: 'you need the full questions/options for a pending human interaction',
|
|
158
155
|
help: {
|
|
159
156
|
name: 'human deck',
|
|
@@ -236,13 +233,13 @@ function parseResolveBody(raw) {
|
|
|
236
233
|
});
|
|
237
234
|
}
|
|
238
235
|
/**
|
|
239
|
-
* Translate web-shaped answers into
|
|
240
|
-
* always send `selectedOptionIds` (an array) for every option pick, but
|
|
241
|
-
*
|
|
236
|
+
* Translate web-shaped answers into the ticket response contract. Web clients
|
|
237
|
+
* always send `selectedOptionIds` (an array) for every option pick, but the
|
|
238
|
+
* strict deck validator rejects an array on any non-multiSelect
|
|
242
239
|
* interaction. For a single-select interaction we faithfully fold a
|
|
243
240
|
* single-element array down to `selectedOptionId` (deterministic given the
|
|
244
241
|
* deck's own multiSelect flag — not a lenient guess). Multi-select and freetext
|
|
245
|
-
* responses pass through untouched; an unreadable deck is left to
|
|
242
|
+
* responses pass through untouched; an unreadable deck is left to the daemon.
|
|
246
243
|
*/
|
|
247
244
|
function coerceSingleSelect(responses, dir) {
|
|
248
245
|
const deck = readJson(deckPath(dir));
|
|
@@ -260,58 +257,54 @@ export function coerceSingleSelectAgainst(responses, deck) {
|
|
|
260
257
|
if (r.selectedOptionId !== undefined || r.selectedOptionIds === undefined)
|
|
261
258
|
return r;
|
|
262
259
|
if (r.selectedOptionIds.length !== 1)
|
|
263
|
-
return r; // 0 or >1 stays →
|
|
260
|
+
return r; // 0 or >1 stays → the validator rejects
|
|
264
261
|
const { selectedOptionIds, ...keep } = r;
|
|
265
262
|
return { ...keep, selectedOptionId: selectedOptionIds[0] };
|
|
266
263
|
});
|
|
267
264
|
}
|
|
268
265
|
export const humanResolve = defineLeaf({
|
|
269
266
|
name: 'resolve',
|
|
270
|
-
description: 'resolve one
|
|
271
|
-
whenToUse: 'a browser or local tool is submitting answers for a pending human interaction
|
|
267
|
+
description: 'resolve one human deck from stdin answers',
|
|
268
|
+
whenToUse: 'a browser or local tool is submitting answers for a pending human interaction.',
|
|
272
269
|
tier: 'hidden',
|
|
273
270
|
help: {
|
|
274
271
|
name: 'human resolve',
|
|
275
|
-
summary: '
|
|
272
|
+
summary: 'resolve a pending deck with the given answers and deliver them to the asking node',
|
|
276
273
|
params: [
|
|
277
274
|
{ kind: 'positional', name: 'job_id', type: 'string', required: true, constraint: 'job_id from human ask/review/list.' },
|
|
278
275
|
{ kind: 'stdin', name: 'body', required: true, constraint: 'JSON {responses:[{interaction_id, selected_option_ids?, freetext?}]}.' },
|
|
279
276
|
],
|
|
280
277
|
output: [
|
|
281
|
-
{ name: 'resolved', type: 'boolean', required: true, constraint: 'True when this call
|
|
278
|
+
{ name: 'resolved', type: 'boolean', required: true, constraint: 'True when this call answered and delivered the deck to the asking node.' },
|
|
282
279
|
{ name: 'job_id', type: 'string', required: true, constraint: 'Interaction job id.' },
|
|
283
280
|
{ name: 'reason', type: 'string', required: false, constraint: 'already_resolved or claimed when resolved is false.' },
|
|
284
281
|
],
|
|
285
282
|
outputKind: 'object',
|
|
286
|
-
effects: ['
|
|
283
|
+
effects: ['The daemon publishes the answer, delivers it to the asking node, and retires the bridge before this call returns.'],
|
|
287
284
|
},
|
|
288
285
|
run: async (input) => {
|
|
289
286
|
const jobId = input['job_id'];
|
|
290
287
|
const nodes = await fetchNodeRefs();
|
|
291
288
|
const byId = new Map(nodes.map((n) => [n.node_id, n]));
|
|
292
|
-
const { dir } = interactionDirForJob(jobId, byId);
|
|
289
|
+
const { dir, node } = interactionDirForJob(jobId, byId);
|
|
293
290
|
if (!existsSync(deckPath(dir))) {
|
|
294
291
|
throw new InputError({ error: 'not_found', message: `no deck for interaction: ${jobId}`, field: 'job_id', next: 'Pass a pending job_id from `crtr human list`.' });
|
|
295
292
|
}
|
|
296
293
|
const responses = coerceSingleSelect(parseResolveBody(input['body']), dir);
|
|
297
|
-
|
|
294
|
+
// A published result on a live bridge may be an interrupted delivery. The
|
|
295
|
+
// daemon re-drives that delivery before it returns its 409, so only bypass
|
|
296
|
+
// it when the bridge is already terminal.
|
|
297
|
+
if (isResolved(dir) && isTerminalBridge(node.status)) {
|
|
298
298
|
return { resolved: false, job_id: jobId, reason: 'already_resolved' };
|
|
299
|
-
const claim = claimTicket(dir);
|
|
300
|
-
if (claim === null) {
|
|
301
|
-
return { resolved: false, job_id: jobId, reason: isResolved(dir) ? 'already_resolved' : 'claimed' };
|
|
302
299
|
}
|
|
303
|
-
let won;
|
|
304
300
|
try {
|
|
305
|
-
|
|
301
|
+
await cliClient().resolveHumanTicket(jobId, { responses });
|
|
306
302
|
}
|
|
307
303
|
catch (e) {
|
|
308
|
-
|
|
304
|
+
if (isAlreadyResolvedConflict(e))
|
|
305
|
+
return { resolved: false, job_id: jobId, reason: 'already_resolved' };
|
|
306
|
+
rethrowAsCliError(e);
|
|
309
307
|
}
|
|
310
|
-
if (!won)
|
|
311
|
-
return { resolved: false, job_id: jobId, reason: 'already_resolved' };
|
|
312
|
-
// Finalization won. Delivery back to the asking node is humanloop's
|
|
313
|
-
// completion-boundary responsibility (may lag or fail → delivery-error.json),
|
|
314
|
-
// so we do NOT claim delivery here — only that the deck was finalized.
|
|
315
308
|
return { resolved: true, job_id: jobId };
|
|
316
309
|
},
|
|
317
310
|
});
|
|
@@ -325,7 +318,7 @@ export const humanCancel = defineLeaf({
|
|
|
325
318
|
help: {
|
|
326
319
|
name: 'human cancel',
|
|
327
320
|
summary: 'retract a pending ask/review you posed — drops it from the human inbox and retires the bridge node. Reach for this the moment a question goes stale (you answered it yourself, the situation changed) so a human is not left resolving a prompt whose answer no longer matters',
|
|
328
|
-
guide: 'Pass the job_id returned by `human ask`/`review`. Best-effort and idempotent: if the human already answered, or it was already canceled, it reports canceled:false with reason "already_resolved" and changes nothing. Cancellation races the human\'s submit
|
|
321
|
+
guide: 'Pass the job_id returned by `human ask`/`review`. Best-effort and idempotent: if the human already answered, or it was already canceled, it reports canceled:false with reason "already_resolved" and changes nothing. Cancellation races the human\'s submit; whichever wins is authoritative. The agent that posed the deck is almost always the one canceling it, so the caller is never messaged — only OTHER subscribers get a quiet deferred note that no answer is coming.',
|
|
329
322
|
params: [
|
|
330
323
|
{ kind: 'positional', name: 'job_id', type: 'string', required: true, constraint: 'Node id of the interaction to cancel — the job_id returned by ask/review.' },
|
|
331
324
|
{ kind: 'flag', name: 'reason', type: 'string', required: false, constraint: 'Optional short note delivered to subscribers explaining why it was retracted.' },
|
|
@@ -337,8 +330,7 @@ export const humanCancel = defineLeaf({
|
|
|
337
330
|
],
|
|
338
331
|
outputKind: 'object',
|
|
339
332
|
effects: [
|
|
340
|
-
'
|
|
341
|
-
'On a winning cancellation, humanloop invokes crouter\'s completion handler, which retires the bridge node and drops a deferred no-answer note to waiting subscribers other than the caller.',
|
|
333
|
+
'The daemon retires the bridge and notifies subscribers other than the caller that no answer is coming.',
|
|
342
334
|
],
|
|
343
335
|
},
|
|
344
336
|
run: async (input) => {
|
|
@@ -353,179 +345,25 @@ export const humanCancel = defineLeaf({
|
|
|
353
345
|
next: 'Pass the job_id from human ask/review, or list pending with `crtr human list`.',
|
|
354
346
|
});
|
|
355
347
|
}
|
|
356
|
-
const idir =
|
|
357
|
-
// Nothing live to cancel: already
|
|
358
|
-
// never carried a request descriptor
|
|
348
|
+
const idir = ticketDir(jobId);
|
|
349
|
+
// Nothing live to cancel: the bridge is already terminal, or the ticket
|
|
350
|
+
// never carried a request descriptor.
|
|
359
351
|
const hasDescriptor = existsSync(deckPath(idir)) || existsSync(reviewPath(idir));
|
|
360
|
-
if (node.status
|
|
352
|
+
if (isTerminalBridge(node.status) || !hasDescriptor) {
|
|
361
353
|
return { canceled: false, job_id: jobId, reason: 'already_resolved' };
|
|
362
354
|
}
|
|
363
355
|
const actor = process.env['CRTR_NODE_ID'] ?? 'human';
|
|
364
|
-
const { status } = await cancelTicket(idir, { ...(reason !== undefined && reason !== '' ? { reason } : {}), actor });
|
|
365
|
-
if (status === 'already_resolved') {
|
|
366
|
-
return { canceled: false, job_id: jobId, reason: 'already_resolved' };
|
|
367
|
-
}
|
|
368
|
-
// The winning cancellation dispatched completion → `_deliver` synchronously
|
|
369
|
-
// retired the bridge and notified subscribers. Nothing to do here.
|
|
370
|
-
return { canceled: true, job_id: jobId };
|
|
371
|
-
},
|
|
372
|
-
render: (r) => r['canceled'] === true
|
|
373
|
-
? `Canceled human interaction ${r['job_id']} — it left the human inbox and subscribers were notified no answer is coming.`
|
|
374
|
-
: `Nothing to cancel for ${r['job_id']} — ${r['reason'] ?? 'nothing to cancel'}.`,
|
|
375
|
-
});
|
|
376
|
-
// ---------------------------------------------------------------------------
|
|
377
|
-
// _deliver / _consult / _visual (hidden completion handlers; not listed in
|
|
378
|
-
// branch help) — thin forwarders to crtrd.
|
|
379
|
-
//
|
|
380
|
-
// humanloop invokes `node dist/cli.js human _deliver|_consult|_visual` with the
|
|
381
|
-
// event JSON on stdin (registered via `registerCrouterRoot`). The handler body
|
|
382
|
-
// — every canvas mutation (spawnNode/reviveNode/transition/pushFinal/arm/claim/
|
|
383
|
-
// retire/reconcile) plus the FULL trust binding re-verification — lives
|
|
384
|
-
// server-side in `src/daemon/api/handlers/human.ts`. These leaves just parse
|
|
385
|
-
// the stdin event and POST it to the daemon, which re-verifies the trust
|
|
386
|
-
// binding before acting. Keeping ZERO canvas imports here is what lets the CLI
|
|
387
|
-
// import graph stay clear of canvas.db (spec §1/§10).
|
|
388
|
-
// ---------------------------------------------------------------------------
|
|
389
|
-
/** Parse a humanloop event off stdin. A malformed body is the caller's error
|
|
390
|
-
* (humanloop always sends valid JSON), surfaced as a clean InputError rather
|
|
391
|
-
* than a raw SyntaxError. */
|
|
392
|
-
function parseEvent(body) {
|
|
393
|
-
try {
|
|
394
|
-
return JSON.parse(body);
|
|
395
|
-
}
|
|
396
|
-
catch (e) {
|
|
397
|
-
throw new InputError({ error: 'invalid_json', message: `stdin is not valid JSON: ${String(e)}`, field: 'stdin', next: 'Only humanloop invokes this handler.' });
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
export const humanDeliver = defineLeaf({
|
|
401
|
-
name: '_deliver',
|
|
402
|
-
tier: 'hidden',
|
|
403
|
-
help: {
|
|
404
|
-
name: 'human _deliver',
|
|
405
|
-
summary: 'internal: the registered humanloop completion handler — turns a resolved/canceled ticket into the existing pushFinal delivery and bridge finalization',
|
|
406
|
-
params: [
|
|
407
|
-
{ kind: 'stdin', name: 'body', required: true, constraint: 'A humanloop.completion/v1 event JSON on stdin. Not for manual use.' },
|
|
408
|
-
],
|
|
409
|
-
output: [{ name: 'delivered', type: 'boolean', required: true, constraint: 'True once the bridge is delivered/retired (or already terminal).' }],
|
|
410
|
-
outputKind: 'object',
|
|
411
|
-
effects: ['Reads the completion event, forwards it to crtrd, which verifies root registration/containment then pushFinals the answer (ask/review) or retires the bridge (canceled). Idempotent: replay after a crash is safe.'],
|
|
412
|
-
},
|
|
413
|
-
run: async (input) => {
|
|
414
|
-
const event = parseEvent(input['body']);
|
|
415
356
|
try {
|
|
416
|
-
|
|
357
|
+
await cliClient().cancelHumanTicket(jobId, { ...(reason !== undefined && reason !== '' ? { reason } : {}), actor });
|
|
417
358
|
}
|
|
418
359
|
catch (e) {
|
|
360
|
+
if (isAlreadyResolvedConflict(e))
|
|
361
|
+
return { canceled: false, job_id: jobId, reason: 'already_resolved' };
|
|
419
362
|
rethrowAsCliError(e);
|
|
420
363
|
}
|
|
364
|
+
return { canceled: true, job_id: jobId };
|
|
421
365
|
},
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
tier: 'hidden',
|
|
426
|
-
help: {
|
|
427
|
-
name: 'human _consult',
|
|
428
|
-
summary: 'internal: the registered humanloop follow-up handler — verifies capability + a live running request, then launches (or cancels) a private consult fork answering privately back to the ticket',
|
|
429
|
-
params: [
|
|
430
|
-
{ kind: 'stdin', name: 'body', required: true, constraint: 'A humanloop.followup-request/v1 event JSON on stdin. Not for manual use.' },
|
|
431
|
-
],
|
|
432
|
-
output: [
|
|
433
|
-
{
|
|
434
|
-
name: 'handled',
|
|
435
|
-
type: 'boolean',
|
|
436
|
-
required: true,
|
|
437
|
-
constraint: 'True when the start/cancel action was actually acted on; false when trust/currency checks rejected it as stale (already superseded/canceled/unregistered/not an ask ticket). Humanloop always gets a fast exit 0 either way — this never throws for a stale event.',
|
|
438
|
-
},
|
|
439
|
-
],
|
|
440
|
-
outputKind: 'object',
|
|
441
|
-
effects: [
|
|
442
|
-
"action:start — crtrd verifies owner+capability+registration identity+run.json(ask)+a live running request, arms a receipted outbox row, launches a detached parent=null consult fork at the exact captured model from the captured branch point, then re-checks the request is still current and cancels the fork if it was superseded/canceled during launch.",
|
|
443
|
-
'action:cancel — crtrd cancels the request-bound consult fork (if any) and marks its outbox row canceled.',
|
|
444
|
-
'Once trust and request currency are both established, a missing/unreadable captured branch, a missing captured model, or a synchronous launch fault all publish an error follow-up result immediately instead of declining silently, so the ticket never sticks on "consulting\u2026".',
|
|
445
|
-
],
|
|
446
|
-
},
|
|
447
|
-
run: async (input) => {
|
|
448
|
-
const event = parseEvent(input['body']);
|
|
449
|
-
try {
|
|
450
|
-
return await cliClient().consultHuman(event);
|
|
451
|
-
}
|
|
452
|
-
catch (e) {
|
|
453
|
-
rethrowAsCliError(e);
|
|
454
|
-
}
|
|
455
|
-
},
|
|
456
|
-
});
|
|
457
|
-
export const humanVisual = defineLeaf({
|
|
458
|
-
name: '_visual',
|
|
459
|
-
tier: 'hidden',
|
|
460
|
-
help: {
|
|
461
|
-
name: 'human _visual',
|
|
462
|
-
summary: 'internal: validates and launches or retires one exact Humanloop Visual fork',
|
|
463
|
-
params: [{ kind: 'stdin', name: 'body', required: true, constraint: 'A humanloop.visual-request-event/v1 event JSON. Not for manual use.' }],
|
|
464
|
-
output: [{ name: 'handled', type: 'boolean', required: true, constraint: 'True when the exact Visual delivery was acknowledged.' }],
|
|
465
|
-
outputKind: 'object',
|
|
466
|
-
effects: ['Forwards the event to crtrd, which creates at most one lifecycle-owned exact-model Visual child, or retires only its immutable matching child.'],
|
|
467
|
-
},
|
|
468
|
-
run: async (input) => {
|
|
469
|
-
const event = parseEvent(input['body']);
|
|
470
|
-
try {
|
|
471
|
-
return await cliClient().visualHuman(event);
|
|
472
|
-
}
|
|
473
|
-
catch (e) {
|
|
474
|
-
rethrowAsCliError(e);
|
|
475
|
-
}
|
|
476
|
-
},
|
|
477
|
-
});
|
|
478
|
-
// ---------------------------------------------------------------------------
|
|
479
|
-
// _focus (hidden inbox-source handler; not listed in branch help)
|
|
480
|
-
//
|
|
481
|
-
// Unlike _deliver/_consult/_visual, focus is a pure VIEWER/tmux placement — it
|
|
482
|
-
// reveals the originating conversation beside the inbox popup pane. tmux
|
|
483
|
-
// placement is client-side in this architecture (crtrd owns canvas state, not
|
|
484
|
-
// the viewer surface), so this leaf stays in the CLI: the canvas read routes
|
|
485
|
-
// through `getNodeOrNull` (the API) and the revive + view.sock wait happen
|
|
486
|
-
// inside `focusViewer` via `cliClient().ensureAttach()`.
|
|
487
|
-
// ---------------------------------------------------------------------------
|
|
488
|
-
export const humanFocus = defineLeaf({
|
|
489
|
-
name: '_focus',
|
|
490
|
-
tier: 'hidden',
|
|
491
|
-
help: {
|
|
492
|
-
name: 'human _focus',
|
|
493
|
-
summary: 'internal: reveal the conversation that created a humanloop ticket',
|
|
494
|
-
params: [{ kind: 'stdin', name: 'body', required: true, constraint: 'A humanloop.focus/v1 event JSON on stdin. Not for manual use.' }],
|
|
495
|
-
output: [{ name: 'focused', type: 'boolean', required: true, constraint: 'True once the originating conversation viewer is visible.' }],
|
|
496
|
-
outputKind: 'object',
|
|
497
|
-
effects: ['Verifies the registered ticket and focuses its source node beside the tmux pane underneath the inbox popup, opening a viewer when needed.'],
|
|
498
|
-
},
|
|
499
|
-
run: async (input) => {
|
|
500
|
-
const event = JSON.parse(input['body']);
|
|
501
|
-
if (event.schema !== 'humanloop.focus/v1') {
|
|
502
|
-
throw new InputError({ error: 'invalid_field', message: 'not a humanloop.focus/v1 event', field: 'stdin', next: 'Only humanloop invokes this handler.' });
|
|
503
|
-
}
|
|
504
|
-
const root = canonicalPath(event.root);
|
|
505
|
-
const dir = canonicalPath(event.dir);
|
|
506
|
-
if (resolve(dir, '..') !== root || basename(dir) !== event.ticketId) {
|
|
507
|
-
throw new InputError({ error: 'invalid_field', message: 'focus event does not identify a ticket directly beneath its root', field: 'stdin', next: 'Only humanloop invokes this handler.' });
|
|
508
|
-
}
|
|
509
|
-
const registration = listInboxRoots().find((candidate) => candidate.root === root && candidate.owner === 'crouter');
|
|
510
|
-
if (registration === undefined || JSON.stringify(registration.focusHandler) !== JSON.stringify(crouterFocusHandler())) {
|
|
511
|
-
throw new InputError({ error: 'invalid_field', message: `root has no trusted crouter focus handler: ${root}`, field: 'stdin', next: 'Only humanloop invokes this handler.' });
|
|
512
|
-
}
|
|
513
|
-
if (!/^%\d+$/.test(event.targetPane)) {
|
|
514
|
-
throw new InputError({ error: 'invalid_field', message: 'focus event has an invalid tmux target pane', field: 'stdin', next: 'Only humanloop invokes this handler.' });
|
|
515
|
-
}
|
|
516
|
-
const bridge = await getNodeOrNull(event.ticketId);
|
|
517
|
-
const sourceNodeId = bridge?.parent;
|
|
518
|
-
if (sourceNodeId === null || sourceNodeId === undefined || sourceNodeId === '') {
|
|
519
|
-
throw new InputError({ error: 'not_found', message: 'ticket has no originating canvas conversation', field: 'stdin', next: 'Close the inbox normally; this ticket was created outside a canvas conversation.' });
|
|
520
|
-
}
|
|
521
|
-
const source = await getNodeOrNull(sourceNodeId);
|
|
522
|
-
if (source === null || source.kind === 'human' || (source.status !== 'active' && source.status !== 'idle')) {
|
|
523
|
-
throw new InputError({ error: 'not_focusable', message: `originating conversation ${sourceNodeId} is no longer live`, field: 'stdin', next: 'Close the inbox normally; completed conversations are available through canvas history.' });
|
|
524
|
-
}
|
|
525
|
-
const result = await focusViewer(sourceNodeId, { pane: event.targetPane, cwd: source.cwd, name: source.name });
|
|
526
|
-
if (!result.focused) {
|
|
527
|
-
throw new InputError({ error: 'focus_failed', message: `could not bring originating conversation ${sourceNodeId} into view`, next: 'Close the inbox and focus the node from the canvas.' });
|
|
528
|
-
}
|
|
529
|
-
return { focused: true };
|
|
530
|
-
},
|
|
366
|
+
render: (r) => r['canceled'] === true
|
|
367
|
+
? `Canceled human interaction ${r['job_id']} — it left the human inbox and subscribers were notified no answer is coming.`
|
|
368
|
+
: `Nothing to cancel for ${r['job_id']} — ${r['reason'] ?? 'nothing to cancel'}.`,
|
|
531
369
|
});
|