@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
4
|
+
import { InputError } from '../../core/io.js';
|
|
5
|
+
import { checkMarkdown, renderMarkdown } from '../../core/termrender/termrender.js';
|
|
6
|
+
function markdownSource(input, context) {
|
|
7
|
+
const path = input['path'];
|
|
8
|
+
const body = input['body'];
|
|
9
|
+
const stdinProvided = context?.providedParams.has('body') === true;
|
|
10
|
+
if (path === undefined && !stdinProvided) {
|
|
11
|
+
throw new InputError({
|
|
12
|
+
error: 'missing_parameter',
|
|
13
|
+
message: 'provide exactly one markdown source: PATH or stdin',
|
|
14
|
+
next: 'Run `crtr human doc check -h` or `crtr human doc render -h` and provide a path or pipe markdown on stdin.',
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (path !== undefined && path !== '-' && stdinProvided && body.trim() !== '') {
|
|
18
|
+
throw new InputError({
|
|
19
|
+
error: 'bad_invocation',
|
|
20
|
+
message: 'both a positional path and piped stdin were provided',
|
|
21
|
+
field: 'path, body',
|
|
22
|
+
next: 'Pass exactly one markdown source: either PATH or piped stdin, not both.',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (path === undefined || path === '-')
|
|
26
|
+
return body;
|
|
27
|
+
const abs = resolve(path);
|
|
28
|
+
if (!existsSync(abs)) {
|
|
29
|
+
throw new InputError({
|
|
30
|
+
error: 'file_not_found',
|
|
31
|
+
message: `file not found: ${abs}`,
|
|
32
|
+
field: 'path',
|
|
33
|
+
next: 'Provide a path to an existing markdown file, or pipe markdown on stdin.',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return readFileSync(abs, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
const humanDocCheck = defineLeaf({
|
|
39
|
+
name: 'check',
|
|
40
|
+
description: 'validate a directive-flavored markdown body',
|
|
41
|
+
whenToUse: 'validating a deck or review body before submitting it.',
|
|
42
|
+
help: {
|
|
43
|
+
name: 'human doc check',
|
|
44
|
+
summary: 'validate directive-flavored markdown through the pinned managed renderer',
|
|
45
|
+
guide: 'The pinned renderer runs from a private managed venv and is not on PATH, so this is the only way to validate a deck or review body before submitting it.',
|
|
46
|
+
params: [
|
|
47
|
+
{ kind: 'positional', name: 'path', type: 'path', required: false, constraint: 'Markdown file to validate. Provide exactly one of PATH or stdin; use - to read stdin.' },
|
|
48
|
+
{ kind: 'stdin', name: 'body', required: false, constraint: 'Markdown to validate. Provide exactly one of piped stdin or PATH.' },
|
|
49
|
+
],
|
|
50
|
+
output: [
|
|
51
|
+
{ name: 'ok', type: 'boolean', required: true, constraint: 'True when the markdown is valid.' },
|
|
52
|
+
{ name: 'error', type: 'string', required: false, constraint: 'The renderer validation error when ok is false.' },
|
|
53
|
+
],
|
|
54
|
+
outputKind: 'object',
|
|
55
|
+
effects: ['Read-only: invokes the private managed renderer to validate the supplied body.'],
|
|
56
|
+
},
|
|
57
|
+
run: async (input, context) => checkMarkdown(markdownSource(input, context)),
|
|
58
|
+
});
|
|
59
|
+
const humanDocRender = defineLeaf({
|
|
60
|
+
name: 'render',
|
|
61
|
+
description: 'render a directive-flavored markdown body',
|
|
62
|
+
whenToUse: 'previewing how a deck or review body renders before submitting it.',
|
|
63
|
+
help: {
|
|
64
|
+
name: 'human doc render',
|
|
65
|
+
summary: 'render directive-flavored markdown through the pinned managed renderer',
|
|
66
|
+
guide: 'The pinned renderer runs from a private managed venv and is not on PATH, so this is the only way to render a deck or review body before submitting it.',
|
|
67
|
+
params: [
|
|
68
|
+
{ kind: 'positional', name: 'path', type: 'path', required: false, constraint: 'Markdown file to render. Provide exactly one of PATH or stdin; use - to read stdin.' },
|
|
69
|
+
{ kind: 'stdin', name: 'body', required: false, constraint: 'Markdown to render. Provide exactly one of piped stdin or PATH.' },
|
|
70
|
+
{ kind: 'flag', name: 'width', type: 'int', required: false, default: process.stdout.columns || 100, constraint: 'Render width in columns. Default: current stdout width, or 100.' },
|
|
71
|
+
{ kind: 'flag', name: 'color', type: 'bool', required: false, default: true, constraint: 'Emit ANSI color. Default true; false strips ANSI escape sequences.' },
|
|
72
|
+
],
|
|
73
|
+
output: [
|
|
74
|
+
{ name: 'lines', type: 'string[]', required: true, constraint: 'Rendered terminal lines in display order.' },
|
|
75
|
+
{ name: 'width', type: 'integer', required: true, constraint: 'The render width in columns.' },
|
|
76
|
+
],
|
|
77
|
+
outputKind: 'object',
|
|
78
|
+
effects: ['Read-only: invokes the private managed renderer to render the supplied body.'],
|
|
79
|
+
},
|
|
80
|
+
run: async (input, context) => {
|
|
81
|
+
const width = input['width'];
|
|
82
|
+
const color = input['color'];
|
|
83
|
+
const lines = renderMarkdown(markdownSource(input, context), width);
|
|
84
|
+
return { lines: color ? lines : lines.map((line) => line.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '')), width };
|
|
85
|
+
},
|
|
86
|
+
render: (result) => result['lines'].join('\n'),
|
|
87
|
+
});
|
|
88
|
+
export const humanDoc = defineBranch({
|
|
89
|
+
name: 'doc',
|
|
90
|
+
description: 'validate or render directive-flavored markdown bodies',
|
|
91
|
+
whenToUse: 'validating or previewing a directive-flavored markdown body before submitting it.',
|
|
92
|
+
help: {
|
|
93
|
+
name: 'human doc',
|
|
94
|
+
summary: 'validate and render directive-flavored markdown bodies',
|
|
95
|
+
model: 'Both leaves read exactly one body from a path or stdin through the private managed renderer.',
|
|
96
|
+
},
|
|
97
|
+
children: [humanDocCheck, humanDocRender],
|
|
98
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
2
|
+
import { currentTmux, displayClientMessage, liveViewerPanes, paneLocation, selectPane, selectWindow, sendAttachControl, switchClient, } from '../../core/runtime/placement-tmux.js';
|
|
3
|
+
const NO_VIEWER_MESSAGE = 'No crouter viewer is running — attach to a node first (crtr surface attach to <node>).';
|
|
4
|
+
function tmuxSocketFromEnvironment() {
|
|
5
|
+
const socket = process.env['TMUX']?.split(',')[0]?.trim();
|
|
6
|
+
return socket === undefined || socket === '' ? undefined : socket;
|
|
7
|
+
}
|
|
8
|
+
function paneForInvocation(explicit) {
|
|
9
|
+
if (explicit !== undefined && explicit !== '')
|
|
10
|
+
return explicit;
|
|
11
|
+
const fromEnv = process.env['TMUX_PANE'];
|
|
12
|
+
if (fromEnv !== undefined && fromEnv !== '')
|
|
13
|
+
return fromEnv;
|
|
14
|
+
return currentTmux()?.pane;
|
|
15
|
+
}
|
|
16
|
+
function newestViewer(a, b) {
|
|
17
|
+
if (a.stampMs !== b.stampMs)
|
|
18
|
+
return b.stampMs - a.stampMs;
|
|
19
|
+
if (a.pane === b.pane)
|
|
20
|
+
return 0;
|
|
21
|
+
return a.pane < b.pane ? -1 : 1;
|
|
22
|
+
}
|
|
23
|
+
function selectViewer(viewers, targetPane, clientSession) {
|
|
24
|
+
const targeted = targetPane === undefined ? undefined : viewers.find((viewer) => viewer.pane === targetPane);
|
|
25
|
+
if (targeted !== undefined)
|
|
26
|
+
return targeted;
|
|
27
|
+
const inClientSession = clientSession === undefined ? [] : viewers.filter((viewer) => viewer.session === clientSession);
|
|
28
|
+
return [...(inClientSession.length > 0 ? inClientSession : viewers)].sort(newestViewer)[0];
|
|
29
|
+
}
|
|
30
|
+
function focusViewer(viewer, targetPane, clientSession) {
|
|
31
|
+
if (viewer.pane === targetPane)
|
|
32
|
+
return;
|
|
33
|
+
const location = paneLocation(viewer.pane);
|
|
34
|
+
if (location === null) {
|
|
35
|
+
selectPane(viewer.pane);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (clientSession !== location.session)
|
|
39
|
+
switchClient(location.session);
|
|
40
|
+
selectWindow(location.session, location.window);
|
|
41
|
+
selectPane(viewer.pane);
|
|
42
|
+
}
|
|
43
|
+
const humanInboxToggle = defineLeaf({
|
|
44
|
+
name: 'toggle',
|
|
45
|
+
description: 'deliver the inbox toggle to a live viewer',
|
|
46
|
+
whenToUse: 'toggling the human inbox surface in a running crouter viewer; the selected viewer receives the private attach-control action and is focused afterward.',
|
|
47
|
+
help: {
|
|
48
|
+
name: 'human inbox toggle',
|
|
49
|
+
summary: 'deliver the human inbox toggle to a live viewer',
|
|
50
|
+
guide: 'Selection prefers the target pane, then the resolved client session by newest viewer stamp, then newest globally; ties use pane id. The viewer decides whether the delivered toggle opens or closes the surface.',
|
|
51
|
+
params: [
|
|
52
|
+
{ kind: 'flag', name: 'tmux-socket', type: 'path', required: false, constraint: 'Tmux server socket. Omit to use the first field of $TMUX.' },
|
|
53
|
+
{ kind: 'flag', name: 'tmux-client', type: 'string', required: false, constraint: 'Tmux client name for the status-line message and client-session context.' },
|
|
54
|
+
{ kind: 'flag', name: 'target-pane', type: 'string', required: false, constraint: 'Viewer pane to prefer. Omit to use $TMUX_PANE or the current tmux pane as the selection target.' },
|
|
55
|
+
{ kind: 'flag', name: 'quiet', type: 'bool', required: false, default: false, constraint: 'Suppress the structured command result. A no-viewer status-line message is still shown.' },
|
|
56
|
+
],
|
|
57
|
+
output: [
|
|
58
|
+
{ name: 'action', type: 'opened | skipped', required: true, constraint: 'opened means the private inbox toggle sequence was delivered to a live viewer; it does not assert that the surface is now open. skipped means delivery did not happen.' },
|
|
59
|
+
{ name: 'message', type: 'string', required: false, constraint: 'Present when action is skipped. With no live viewer, the same message is also shown in the tmux status line.' },
|
|
60
|
+
],
|
|
61
|
+
outputKind: 'object',
|
|
62
|
+
effects: ['Sends the private inbox attach-control sequence to one live viewer and focuses that viewer unless it is already the target pane. Never opens a popup, launches a viewer, or wakes a node. With --quiet, suppresses only the structured result.'],
|
|
63
|
+
},
|
|
64
|
+
run: async (input) => {
|
|
65
|
+
const quiet = input['quiet'];
|
|
66
|
+
const socket = input['tmuxSocket'] ?? tmuxSocketFromEnvironment();
|
|
67
|
+
const client = input['tmuxClient'];
|
|
68
|
+
const targetPane = paneForInvocation(input['targetPane']);
|
|
69
|
+
if (socket === undefined) {
|
|
70
|
+
const outcome = { action: 'skipped', message: 'the inbox needs tmux' };
|
|
71
|
+
return quiet ? undefined : outcome;
|
|
72
|
+
}
|
|
73
|
+
const viewers = liveViewerPanes(socket);
|
|
74
|
+
const targetViewer = targetPane === undefined ? undefined : viewers.find((viewer) => viewer.pane === targetPane);
|
|
75
|
+
const clientSession = targetViewer?.session ?? (targetPane === undefined ? undefined : paneLocation(targetPane)?.session) ?? currentTmux()?.session;
|
|
76
|
+
const viewer = selectViewer(viewers, targetPane, clientSession);
|
|
77
|
+
if (viewer === undefined) {
|
|
78
|
+
displayClientMessage(socket, client, NO_VIEWER_MESSAGE);
|
|
79
|
+
const outcome = { action: 'skipped', message: NO_VIEWER_MESSAGE };
|
|
80
|
+
return quiet ? undefined : outcome;
|
|
81
|
+
}
|
|
82
|
+
if (!sendAttachControl(socket, viewer.pane, 'crtr.attach.inbox.toggle')) {
|
|
83
|
+
const outcome = { action: 'skipped', message: 'could not deliver the inbox toggle to the selected viewer' };
|
|
84
|
+
return quiet ? undefined : outcome;
|
|
85
|
+
}
|
|
86
|
+
focusViewer(viewer, targetPane, clientSession);
|
|
87
|
+
const outcome = { action: 'opened' };
|
|
88
|
+
return quiet ? undefined : outcome;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
export const humanInbox = defineBranch({
|
|
92
|
+
name: 'inbox',
|
|
93
|
+
description: 'deliver the human inbox toggle to a live viewer',
|
|
94
|
+
whenToUse: 'answering, reviewing, or managing pending human tickets from a running crouter viewer.',
|
|
95
|
+
help: {
|
|
96
|
+
name: 'human inbox',
|
|
97
|
+
summary: 'deliver the human inbox toggle to a live viewer',
|
|
98
|
+
model: 'The toggle leaf sends a private viewer control action; it never hosts the inbox itself.',
|
|
99
|
+
},
|
|
100
|
+
children: [humanInboxToggle],
|
|
101
|
+
});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { DeckSource } from '
|
|
2
|
-
/**
|
|
1
|
+
import type { DeckSource } from '../../core/human/types.js';
|
|
2
|
+
/** Optional presentation label for crouter tickets. Ticket identity and attribution
|
|
3
3
|
* come from the bridge node directory and parent relation, never ticket data. */
|
|
4
4
|
export declare function sourceStamp(): Promise<DeckSource>;
|
|
5
5
|
export declare const humanAsk: import("../../core/command.js").LeafDef;
|
|
6
|
-
export declare const humanReview: import("../../core/command.js").LeafDef;
|
|
7
6
|
export declare const humanNotify: import("../../core/command.js").LeafDef;
|
|
8
7
|
export declare const humanShow: import("../../core/command.js").LeafDef;
|
|
@@ -6,21 +6,23 @@
|
|
|
6
6
|
import { defineLeaf } from '../../core/command.js';
|
|
7
7
|
import { InputError } from '../../core/io.js';
|
|
8
8
|
import { cliClient } from '../api-client.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
12
|
-
import { randomBytes, randomUUID } from 'node:crypto';
|
|
9
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
10
|
+
import { randomBytes } from 'node:crypto';
|
|
13
11
|
import { tmuxServerReachable } from '../../core/spawn.js';
|
|
14
|
-
import { BrokerClient, BrokerUnavailableError } from '../../core/broker-client/index.js';
|
|
15
12
|
import { markStopSignal } from '../../core/runtime/stop-signals.js';
|
|
16
|
-
import { validateDeck, resolveDeckBodyPaths
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
13
|
+
import { validateDeck, resolveDeckBodyPaths } from '../../core/human/deck-schema.js';
|
|
14
|
+
import { notifyDeck } from '../../core/human/deck-factories.js';
|
|
15
|
+
import { atomicWriteJson } from '../../core/human/convention.js';
|
|
16
|
+
import { ticketDir } from '../../core/human/root.js';
|
|
17
|
+
import { submitDeck } from '../../core/human/tickets.js';
|
|
18
|
+
import { display } from '../../core/termrender/display.js';
|
|
19
|
+
import { BODY_PATH_CONTRACT, DECK_SCHEMA_HINT, resolveMaxPanes } from './shared.js';
|
|
20
|
+
import { inboxHint, inboxOpenInstruction } from '../../core/keybindings/index.js';
|
|
19
21
|
/** The asking node's id, or null when run from a bare shell (no parent to route to). */
|
|
20
22
|
function askingNode() {
|
|
21
23
|
return process.env['CRTR_NODE_ID'] ?? null;
|
|
22
24
|
}
|
|
23
|
-
/**
|
|
25
|
+
/** Optional presentation label for crouter tickets. Ticket identity and attribution
|
|
24
26
|
* come from the bridge node directory and parent relation, never ticket data. */
|
|
25
27
|
export async function sourceStamp() {
|
|
26
28
|
const nodeId = askingNode();
|
|
@@ -88,7 +90,7 @@ function buildHumanAskDeck(title, subtitle, question) {
|
|
|
88
90
|
});
|
|
89
91
|
}
|
|
90
92
|
/** Crouter authors decision decks by default. Persist the explicit kind so
|
|
91
|
-
* consumers can rely on
|
|
93
|
+
* consumers can rely on the ticket store's strict interaction-kind contract. */
|
|
92
94
|
function canonicalizeAskKinds(deck) {
|
|
93
95
|
return {
|
|
94
96
|
...deck,
|
|
@@ -98,54 +100,6 @@ function canonicalizeAskKinds(deck) {
|
|
|
98
100
|
})),
|
|
99
101
|
};
|
|
100
102
|
}
|
|
101
|
-
const HUMAN_FORK_COORDINATES_TIMEOUT_MS = 10_000;
|
|
102
|
-
const EXACT_MODEL_SPEC = /^[^/\s:]+\/[^/\s:]+:(?:off|minimal|low|medium|high|xhigh|max)$/;
|
|
103
|
-
class InvalidHumanForkCoordinatesError extends Error {
|
|
104
|
-
}
|
|
105
|
-
class InvalidHumanForkModelError extends Error {
|
|
106
|
-
}
|
|
107
|
-
/** Read one pure ask-time coordinate from the source broker. Materialization is
|
|
108
|
-
* deliberately separate so this observer connection can never change its live
|
|
109
|
-
* session manager. */
|
|
110
|
-
function getHumanForkCoordinates(nodeId) {
|
|
111
|
-
return new Promise((resolve, reject) => {
|
|
112
|
-
const client = new BrokerClient(nodeId);
|
|
113
|
-
let settled = false;
|
|
114
|
-
const timer = setTimeout(() => finish(() => reject(new BrokerUnavailableError(nodeId))), HUMAN_FORK_COORDINATES_TIMEOUT_MS);
|
|
115
|
-
if (typeof timer.unref === 'function')
|
|
116
|
-
timer.unref();
|
|
117
|
-
function finish(act) {
|
|
118
|
-
if (settled)
|
|
119
|
-
return;
|
|
120
|
-
settled = true;
|
|
121
|
-
clearTimeout(timer);
|
|
122
|
-
client.close();
|
|
123
|
-
act();
|
|
124
|
-
}
|
|
125
|
-
client.on('error', () => finish(() => reject(new BrokerUnavailableError(nodeId))));
|
|
126
|
-
client.on('close', () => finish(() => reject(new BrokerUnavailableError(nodeId))));
|
|
127
|
-
client.on('connect', () => {
|
|
128
|
-
client.send({ type: 'hello', role: 'observer', client_id: randomUUID() });
|
|
129
|
-
client
|
|
130
|
-
.request({ type: 'get_human_fork_coordinates' })
|
|
131
|
-
.then((frame) => finish(() => resolve(frame)))
|
|
132
|
-
.catch(() => finish(() => reject(new BrokerUnavailableError(nodeId))));
|
|
133
|
-
});
|
|
134
|
-
client.connect();
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
function assertHumanForkCoordinates(coordinates) {
|
|
138
|
-
if (coordinates.kind !== 'human_fork_coordinates' || !isAbsolute(coordinates.sourceFile) || coordinates.sourceSessionId === '' || coordinates.leafId === '') {
|
|
139
|
-
throw new InvalidHumanForkCoordinatesError('broker returned invalid human fork coordinates');
|
|
140
|
-
}
|
|
141
|
-
if (coordinates.modelSpec === null || !EXACT_MODEL_SPEC.test(coordinates.modelSpec)) {
|
|
142
|
-
throw new InvalidHumanForkModelError('broker returned no exact human fork model');
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
function unavailableForkDetail(err) {
|
|
146
|
-
const detail = err instanceof Error ? err.message : String(err);
|
|
147
|
-
return detail === '' ? undefined : detail.slice(0, 240);
|
|
148
|
-
}
|
|
149
103
|
/** The non-blocking status peek returned by ask/review. Resolved per call so
|
|
150
104
|
* the inbox affordance reflects the human's current keybinding (or the CLI
|
|
151
105
|
* fallback when the toggle is disabled). */
|
|
@@ -161,8 +115,8 @@ export const humanAsk = defineLeaf({
|
|
|
161
115
|
whenToUse: 'you would otherwise lay a decision, a set of options, or a question out for the user as prose — reach for this instead, for anything from a quick yes/no to a judgment-heavy call: gating a handoff, merge, deploy, destructive/irreversible operation, or real budget on an explicit human sign-off (offer Yes/No options), reviewing all the requirements before building, choosing among implementation patterns, walking a list of risks and deciding what to do about each, settling a naming or scope question, picking which of several findings to act on. Works for open-ended asks too (set `allowFreetext`, offer a few `options` as starting points).',
|
|
162
116
|
help: {
|
|
163
117
|
name: 'human ask',
|
|
164
|
-
summary:
|
|
165
|
-
guide: 'Write every interaction as a self-contained decision brief for a supervisor who has not followed this agent or task: use the title to identify the inbox topic; write a one-sentence subtitle stating the decision, your recommendation, and what it changes; then give the minimum plain-language context and tradeoffs needed to decide in the body. Never coin a term, code name, or shorthand for a system, mechanism, or state, and expand any project-internal name you do use: name the thing plainly and say what it does. Invented vocabulary is not compression — the reader has to decode it before they can decide. Put supporting evidence, chronology, and technical detail under `## Details` so the person can answer without logs, screenshots, or prior conversation. For a simple open-text question, supply the short topic with --title, the required sentence with --subtitle, and pipe the markdown body on stdin. Use --context-file for a fully structured deck; its deck title and every interaction title and subtitle are required. The deck body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `
|
|
118
|
+
summary: "submit a decision ticket to crouter's inbox; returns a job handle immediately.",
|
|
119
|
+
guide: 'Write every interaction as a self-contained decision brief for a supervisor who has not followed this agent or task: use the title to identify the inbox topic; write a one-sentence subtitle stating the decision, your recommendation, and what it changes; then give the minimum plain-language context and tradeoffs needed to decide in the body. Never coin a term, code name, or shorthand for a system, mechanism, or state, and expand any project-internal name you do use: name the thing plainly and say what it does. Invented vocabulary is not compression — the reader has to decode it before they can decide. Put supporting evidence, chronology, and technical detail under `## Details` so the person can answer without logs, screenshots, or prior conversation. For a simple open-text question, supply the short topic with --title, the required sentence with --subtitle, and pipe the markdown body on stdin. Use --context-file for a fully structured deck; its deck title and every interaction title and subtitle are required. The deck body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc check` before authoring one. Ask only what materially changes your next step, and offer genuine alternatives as `options`.',
|
|
166
120
|
params: [
|
|
167
121
|
{ kind: 'flag', name: 'title', type: 'string', required: false, constraint: 'Required with stdin: a short ≤~4-word inbox topic. Mutually exclusive with --context-file, whose JSON carries its own required title.' },
|
|
168
122
|
{ kind: 'flag', name: 'subtitle', type: 'string', required: false, constraint: 'Required with stdin: one plain-English sentence stating the decision, recommendation, and stakes. Mutually exclusive with --context-file, whose JSON requires every interaction subtitle.' },
|
|
@@ -176,8 +130,8 @@ export const humanAsk = defineLeaf({
|
|
|
176
130
|
],
|
|
177
131
|
outputKind: 'object',
|
|
178
132
|
effects: [
|
|
179
|
-
'Creates a kind:"human" node under you and enqueues a decision deck in the
|
|
180
|
-
`Returns immediately; nothing opens on screen. The human answers from the inbox
|
|
133
|
+
'Creates a kind:"human" node under you and enqueues a decision deck in the human inbox.',
|
|
134
|
+
`Returns immediately; nothing opens on screen. The human answers from the inbox (${inboxHint()}) on their own time.`,
|
|
181
135
|
],
|
|
182
136
|
},
|
|
183
137
|
run: async (input, context) => {
|
|
@@ -228,125 +182,20 @@ export const humanAsk = defineLeaf({
|
|
|
228
182
|
}
|
|
229
183
|
// Crouter owns this provenance. Never synthesize labels from deck content:
|
|
230
184
|
// an unavailable daemon leaves only machine attribution for routing.
|
|
231
|
-
deck = { ...deck, source:
|
|
185
|
+
deck = { ...deck, source: await sourceStamp() };
|
|
232
186
|
const cwd = process.cwd();
|
|
233
187
|
const jobId = (await cliClient().createHumanBridge({ kind: 'human', parent: askingNode(), cwd, name: 'human-ask' })).node_id;
|
|
234
|
-
const idir =
|
|
235
|
-
mkdirSync(idir, { recursive: true });
|
|
188
|
+
const idir = ticketDir(jobId);
|
|
236
189
|
const rc = { mode: 'ask', job_id: jobId };
|
|
237
|
-
const capturedAt = new Date().toISOString();
|
|
238
|
-
const originNodeId = askingNode();
|
|
239
|
-
if (originNodeId === null) {
|
|
240
|
-
rc.conversation_fork = { status: 'unavailable', reason: 'no_origin', captured_at: capturedAt };
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
try {
|
|
244
|
-
const coordinates = await getHumanForkCoordinates(originNodeId);
|
|
245
|
-
assertHumanForkCoordinates(coordinates);
|
|
246
|
-
// Loaded on demand: session-branch pulls pi's SessionManager, whose
|
|
247
|
-
// module graph costs ~385ms. Only a conversation fork needs it, so a
|
|
248
|
-
// static import would charge that to EVERY `crtr human` invocation.
|
|
249
|
-
const { materializeSessionBranchAt } = await import('../../core/runtime/session-branch.js');
|
|
250
|
-
materializeSessionBranchAt(coordinates, join(idir, 'branch-point.jsonl'));
|
|
251
|
-
rc.conversation_fork = {
|
|
252
|
-
status: 'ready',
|
|
253
|
-
source_node_id: originNodeId,
|
|
254
|
-
source_file: coordinates.sourceFile,
|
|
255
|
-
source_session_id: coordinates.sourceSessionId,
|
|
256
|
-
leaf_id: coordinates.leafId,
|
|
257
|
-
model_spec: coordinates.modelSpec,
|
|
258
|
-
branch_point: 'branch-point.jsonl',
|
|
259
|
-
captured_at: new Date().toISOString(),
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
catch (err) {
|
|
263
|
-
const reason = err instanceof BrokerUnavailableError
|
|
264
|
-
? 'broker_unavailable'
|
|
265
|
-
: err instanceof InvalidHumanForkCoordinatesError
|
|
266
|
-
? 'invalid_coordinates'
|
|
267
|
-
: err instanceof InvalidHumanForkModelError
|
|
268
|
-
? 'invalid_model'
|
|
269
|
-
: 'materialization_failed';
|
|
270
|
-
rc.conversation_fork = {
|
|
271
|
-
status: 'unavailable',
|
|
272
|
-
reason,
|
|
273
|
-
detail: unavailableForkDetail(err),
|
|
274
|
-
captured_at: capturedAt,
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
190
|
atomicWriteJson(join(idir, 'run.json'), rc);
|
|
279
|
-
const
|
|
280
|
-
const
|
|
191
|
+
const { dir } = submitDeck({ dir: ticketDir(jobId), deck });
|
|
192
|
+
const originNodeId = askingNode();
|
|
281
193
|
if (originNodeId !== null && originNodeId !== '')
|
|
282
194
|
markStopSignal(originNodeId, 'askedHuman');
|
|
283
195
|
return { job_id: jobId, dir, follow_up: queuedFollowUp() };
|
|
284
196
|
},
|
|
285
197
|
});
|
|
286
198
|
// ---------------------------------------------------------------------------
|
|
287
|
-
// review
|
|
288
|
-
// ---------------------------------------------------------------------------
|
|
289
|
-
export const humanReview = defineLeaf({
|
|
290
|
-
name: 'review',
|
|
291
|
-
description: 'collect anchored comments on a document or source file',
|
|
292
|
-
whenToUse: 'a human should comment line-by-line on a document rather than give one overall answer: reviewing a plan or spec before you build it, marking up a draft, flagging specific sections to change. The comments come back anchored to the lines they touch. Use `ask` instead for a single yes/no sign-off on the whole thing, or to pose a discrete choice',
|
|
293
|
-
help: {
|
|
294
|
-
name: 'human review',
|
|
295
|
-
summary: "queue a .md artifact or a source file for anchored, line-by-line human comments; returns a job handle instantly (a non-blocking kickoff, like ask). The human opens it from the inbox popup, which previews the live doc and re-reads it on every save, so edit in place rather than re-presenting.",
|
|
296
|
-
guide: `A kickoff, not a blocking call: it returns at once and the human reviews on their own time from the inbox (${inboxPopupHint()}). When they submit, the FeedbackResult (anchored comments, plus any line edits they made) is pushed to your inbox — waking you — and autosaved to \`output\`. The inbox preview is a LIVE view of the file: keep editing it in place and it updates, so do not cancel and re-present to show a change. Write the subtitle and the document itself in plain words: no coined terms or internal shorthand for a system or concept — name it and explain what it does, with enough context for someone who has not followed this work. A .md file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see \`termrender doc -h\` for the directive set before authoring one. Any other UTF-8 text file (a .ts/.py/.sql source) is reviewed as a syntax-highlighted source panel anchored to its real line numbers; limits are 2 MB and 5,000 lines.`,
|
|
297
|
-
params: [
|
|
298
|
-
{ kind: 'positional', name: 'file', type: 'path', required: true, constraint: 'Absolute path to an existing UTF-8 text file: a .md artifact, or a source file to review as code.' },
|
|
299
|
-
{ kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating what review feedback is needed and why it matters.' },
|
|
300
|
-
{ kind: 'flag', name: 'output', type: 'path', required: false, constraint: 'Where the FeedbackResult JSON is written. Default: <dir>/feedback.json.' },
|
|
301
|
-
],
|
|
302
|
-
output: [
|
|
303
|
-
{ name: 'job_id', type: 'string', required: true, constraint: 'Node id of the kind:"human" node backing this review. Its FeedbackResult is pushed to your inbox when the human submits.' },
|
|
304
|
-
{ name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding run.json and the autosaved feedback.json.' },
|
|
305
|
-
{ name: 'output', type: 'string', required: true, constraint: 'Path the FeedbackResult JSON is autosaved to when the human submits.' },
|
|
306
|
-
{ name: 'follow_up', type: 'string', required: true, constraint: 'A non-blocking status peek; comments arrive via your inbox when the human submits.' },
|
|
307
|
-
],
|
|
308
|
-
outputKind: 'object',
|
|
309
|
-
effects: [
|
|
310
|
-
'Creates a kind:"human" node under you and enqueues an anchored review in the humanloop inbox.',
|
|
311
|
-
`Returns immediately; nothing opens on screen. The human reviews from the inbox popup (${inboxPopupHint()}); comments fan into your inbox when they submit.`,
|
|
312
|
-
],
|
|
313
|
-
},
|
|
314
|
-
run: async (input) => {
|
|
315
|
-
const fileArg = input['file'];
|
|
316
|
-
const abs = resolve(fileArg);
|
|
317
|
-
if (!existsSync(abs)) {
|
|
318
|
-
throw new InputError({
|
|
319
|
-
error: 'file_not_found',
|
|
320
|
-
message: `file not found: ${abs}`,
|
|
321
|
-
field: 'file',
|
|
322
|
-
next: 'Provide an absolute path to an existing file.',
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
const subtitle = requireSubtitle(input['subtitle']);
|
|
326
|
-
const cwd = process.cwd();
|
|
327
|
-
const jobId = (await cliClient().createHumanBridge({ kind: 'human', parent: askingNode(), cwd, name: 'human-review' })).node_id;
|
|
328
|
-
const idir = nodeDir(jobId);
|
|
329
|
-
mkdirSync(idir, { recursive: true });
|
|
330
|
-
const rc = { mode: 'review', job_id: jobId };
|
|
331
|
-
atomicWriteJson(join(idir, 'run.json'), rc);
|
|
332
|
-
const outputArg = input['output'];
|
|
333
|
-
const root = registerCrouterRoot();
|
|
334
|
-
const { dir } = submitReview({
|
|
335
|
-
root,
|
|
336
|
-
id: jobId,
|
|
337
|
-
review: {
|
|
338
|
-
file: abs,
|
|
339
|
-
...(outputArg !== undefined ? { output: resolve(outputArg) } : {}),
|
|
340
|
-
title: abs.split('/').pop() ?? abs,
|
|
341
|
-
subtitle,
|
|
342
|
-
source: await sourceStamp(),
|
|
343
|
-
},
|
|
344
|
-
});
|
|
345
|
-
const output = outputArg !== undefined ? resolve(outputArg) : join(dir, 'feedback.json');
|
|
346
|
-
return { job_id: jobId, dir, output, follow_up: queuedFollowUp() };
|
|
347
|
-
},
|
|
348
|
-
});
|
|
349
|
-
// ---------------------------------------------------------------------------
|
|
350
199
|
// notify (no job)
|
|
351
200
|
// ---------------------------------------------------------------------------
|
|
352
201
|
export const humanNotify = defineLeaf({
|
|
@@ -356,14 +205,14 @@ export const humanNotify = defineLeaf({
|
|
|
356
205
|
help: {
|
|
357
206
|
name: 'human notify',
|
|
358
207
|
summary: 'enqueue a fire-and-forget acknowledgement in the human inbox; creates no job',
|
|
359
|
-
guide: 'State what happened in plain words — no coined terms or internal shorthand for a system or concept; name it and say what it does. The body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `
|
|
208
|
+
guide: 'State what happened in plain words — no coined terms or internal shorthand for a system or concept; name it and say what it does. The body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc check` before authoring one.',
|
|
360
209
|
params: [
|
|
361
210
|
{ kind: 'positional', name: 'title', type: 'string', required: true, constraint: 'The notification headline.' },
|
|
362
211
|
{ kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating the notification status and stakes.' },
|
|
363
212
|
{ kind: 'flag', name: 'body', type: 'string', required: false, constraint: 'Optional markdown body.' },
|
|
364
213
|
],
|
|
365
214
|
output: [
|
|
366
|
-
{ name: 'queued', type: 'boolean', required: true, constraint: 'Always true — the notify deck is durable inbox state the human acknowledges from the
|
|
215
|
+
{ name: 'queued', type: 'boolean', required: true, constraint: 'Always true — the notify deck is durable inbox state the human acknowledges from the inbox.' },
|
|
367
216
|
{ name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding deck.json.' },
|
|
368
217
|
],
|
|
369
218
|
outputKind: 'object',
|
|
@@ -378,12 +227,10 @@ export const humanNotify = defineLeaf({
|
|
|
378
227
|
let deck = notifyDeck(title, { subtitle, ...(body !== undefined ? { body } : {}) });
|
|
379
228
|
deck = { ...deck, source: await sourceStamp() };
|
|
380
229
|
const id = `nfy-${randomBytes(4).toString('hex')}`;
|
|
381
|
-
const idir =
|
|
382
|
-
mkdirSync(idir, { recursive: true });
|
|
230
|
+
const idir = ticketDir(id);
|
|
383
231
|
const rc = { mode: 'notify' };
|
|
384
232
|
atomicWriteJson(join(idir, 'run.json'), rc);
|
|
385
|
-
const
|
|
386
|
-
const { dir } = submitDeck({ root, id, deck });
|
|
233
|
+
const { dir } = submitDeck({ dir: ticketDir(id), deck });
|
|
387
234
|
return { queued: true, dir };
|
|
388
235
|
},
|
|
389
236
|
});
|
|
@@ -398,8 +245,8 @@ export const humanShow = defineLeaf({
|
|
|
398
245
|
whenToUse: 'displaying a doc on screen while a human comments',
|
|
399
246
|
help: {
|
|
400
247
|
name: 'human show',
|
|
401
|
-
summary:
|
|
402
|
-
guide: 'The pane always watches the file and live-updates on every save — a displayed doc is a live view by definition, so point it at a file something keeps rewriting (a status board, a running summary) and it stays current. The file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `
|
|
248
|
+
summary: "put a file live on screen in a tmux pane with crouter's renderer",
|
|
249
|
+
guide: 'The pane always watches the file and live-updates on every save — a displayed doc is a live view by definition, so point it at a file something keeps rewriting (a status board, a running summary) and it stays current. The file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc render` before authoring one.',
|
|
403
250
|
params: [
|
|
404
251
|
{ kind: 'positional', name: 'path', type: 'path', required: true, constraint: 'Path to the file to render.' },
|
|
405
252
|
{ kind: 'flag', name: 'window', type: 'enum', choices: ['auto', 'split', 'new'], required: false, default: 'auto', constraint: 'Placement. Default auto.' },
|
|
@@ -416,7 +263,7 @@ export const humanShow = defineLeaf({
|
|
|
416
263
|
const windowArg = input['window'];
|
|
417
264
|
const window = windowArg !== undefined ? windowArg : 'auto';
|
|
418
265
|
// `human show` must never fail the caller: any display error degrades to
|
|
419
|
-
// {pane_id:null, reason} with exit 0 (matches
|
|
266
|
+
// {pane_id:null, reason} with exit 0 (matches crouter renderer display semantics).
|
|
420
267
|
let paneId;
|
|
421
268
|
try {
|
|
422
269
|
const r = display(path, { window, maxPanes: resolveMaxPanes() });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Deck, InteractionResponse } from '
|
|
1
|
+
import type { Deck, InteractionResponse } from '../../core/human/types.js';
|
|
2
2
|
export declare const humanList: import("../../core/command.js").LeafDef;
|
|
3
3
|
export declare const humanDeck: import("../../core/command.js").LeafDef;
|
|
4
4
|
/** Pure core of {@link coerceSingleSelect}, split out so it is testable without
|
|
@@ -6,7 +6,3 @@ export declare const humanDeck: import("../../core/command.js").LeafDef;
|
|
|
6
6
|
export declare function coerceSingleSelectAgainst(responses: InteractionResponse[], deck: Deck): InteractionResponse[];
|
|
7
7
|
export declare const humanResolve: import("../../core/command.js").LeafDef;
|
|
8
8
|
export declare const humanCancel: import("../../core/command.js").LeafDef;
|
|
9
|
-
export declare const humanDeliver: import("../../core/command.js").LeafDef;
|
|
10
|
-
export declare const humanConsult: import("../../core/command.js").LeafDef;
|
|
11
|
-
export declare const humanVisual: import("../../core/command.js").LeafDef;
|
|
12
|
-
export declare const humanFocus: import("../../core/command.js").LeafDef;
|