airaknit 1.1.2-rc.9
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/LICENSE +84 -0
- package/README.md +202 -0
- package/bin/airaknit +9 -0
- package/bin/airaknit-project +14 -0
- package/bin/kanna +9 -0
- package/dist/client/assets/CompactSummaryMessage-Yw0BDWEJ.js +1 -0
- package/dist/client/assets/ExitPlanModeMessage-DIdkQ4uF.js +1 -0
- package/dist/client/assets/LocalFilePreviewDialog-DQx2eiCc.js +3 -0
- package/dist/client/assets/LocalProjectsSection-C4xlWkgS.js +1 -0
- package/dist/client/assets/TextMessage-B5G39DEJ.js +1 -0
- package/dist/client/assets/UserMessage-CIkWk-0L.js +1 -0
- package/dist/client/assets/_basePickBy-CVrAFfnZ.js +1 -0
- package/dist/client/assets/_baseUniq-JL-aaF4P.js +1 -0
- package/dist/client/assets/arc-B07zg7ol.js +1 -0
- package/dist/client/assets/architecture-YZFGNWBL-PSLVJL3p.js +1 -0
- package/dist/client/assets/architectureDiagram-Q4EWVU46-DfWIF1G_.js +36 -0
- package/dist/client/assets/array-BGFCBI0e.js +1 -0
- package/dist/client/assets/blockDiagram-DXYQGD6D-CzwIeo_B.js +132 -0
- package/dist/client/assets/bundle-mjs-BDE2gWbQ.js +1 -0
- package/dist/client/assets/button-DO50qOGv.js +1 -0
- package/dist/client/assets/c4Diagram-AHTNJAMY-CR8DCQRE.js +10 -0
- package/dist/client/assets/channel-Dj-UUfaF.js +1 -0
- package/dist/client/assets/chunk-2KRD3SAO-dznP-cn8.js +1 -0
- package/dist/client/assets/chunk-336JU56O-Dqss5Vu6.js +2 -0
- package/dist/client/assets/chunk-426QAEUC-CEKis_0_.js +1 -0
- package/dist/client/assets/chunk-4BX2VUAB-BYOv0Gm1.js +1 -0
- package/dist/client/assets/chunk-4TB4RGXK-BxzubH5S.js +206 -0
- package/dist/client/assets/chunk-55IACEB6-BSlTj03a.js +1 -0
- package/dist/client/assets/chunk-5FUZZQ4R-9Au93Bi1.js +62 -0
- package/dist/client/assets/chunk-5PVQY5BW-BhksHFEZ.js +2 -0
- package/dist/client/assets/chunk-67CJDMHE-BFwhz-8t.js +1 -0
- package/dist/client/assets/chunk-7N4EOEYR-BDUPds87.js +1 -0
- package/dist/client/assets/chunk-AA7GKIK3-CEWTdyXO.js +1 -0
- package/dist/client/assets/chunk-BO2N2NFS-D0LvxnhU.js +103 -0
- package/dist/client/assets/chunk-BSJP7CBP-BNJnK6sq.js +1 -0
- package/dist/client/assets/chunk-Bj-mKKzh.js +1 -0
- package/dist/client/assets/chunk-CIAEETIT-CYhfoCeN.js +1 -0
- package/dist/client/assets/chunk-EDXVE4YY-C5ovJLc0.js +1 -0
- package/dist/client/assets/chunk-ENJZ2VHE-HOhYaeGr.js +10 -0
- package/dist/client/assets/chunk-FMBD7UC4-BLCiKcAQ.js +15 -0
- package/dist/client/assets/chunk-FOC6F5B3-B6GtY2ek.js +1 -0
- package/dist/client/assets/chunk-ICPOFSXX-DPoIZoC5.js +122 -0
- package/dist/client/assets/chunk-K5T4RW27-BsKN63rv.js +94 -0
- package/dist/client/assets/chunk-KGLVRYIC-BUGn9uuY.js +1 -0
- package/dist/client/assets/chunk-LIHQZDEY-DhaZyo03.js +1 -0
- package/dist/client/assets/chunk-ORNJ4GCN-DlpeeJyi.js +1 -0
- package/dist/client/assets/chunk-OYMX7WX6-Dc9q7aYA.js +231 -0
- package/dist/client/assets/chunk-QZHKN3VN-BEdrPoSb.js +1 -0
- package/dist/client/assets/chunk-U2HBQHQK-CIB3Bjjd.js +70 -0
- package/dist/client/assets/chunk-X2U36JSP-CtB-o8Yp.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-C6iHhX_8.js +32 -0
- package/dist/client/assets/chunk-YZCP3GAM-CTmKr6ZH.js +1 -0
- package/dist/client/assets/chunk-ZZ45TVLE-BgU8A2RF.js +1 -0
- package/dist/client/assets/classDiagram-6PBFFD2Q-Bqk5e679.js +1 -0
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-6pSaZOkC.js +1 -0
- package/dist/client/assets/client-BrKWI4CM.js +1 -0
- package/dist/client/assets/client-CGgNRU9w.js +1 -0
- package/dist/client/assets/client-DMSLRzg9.js +6 -0
- package/dist/client/assets/clone-DWcL7whJ.js +1 -0
- package/dist/client/assets/cose-bilkent-S5V4N54A-CrV5wsV_.js +1 -0
- package/dist/client/assets/cytoscape.esm--aLzKuep.js +321 -0
- package/dist/client/assets/dagre-CuRxWcrj.js +1 -0
- package/dist/client/assets/dagre-KV5264BT-BIDiVnkA.js +4 -0
- package/dist/client/assets/defaultLocale-CRZydyG6.js +1 -0
- package/dist/client/assets/diagram-5BDNPKRD-i1kjKRCB.js +10 -0
- package/dist/client/assets/diagram-G4DWMVQ6-9ZSLuhbl.js +24 -0
- package/dist/client/assets/diagram-MMDJMWI5-B4_CUjgv.js +43 -0
- package/dist/client/assets/diagram-TYMM5635-Ct5eTGS8.js +24 -0
- package/dist/client/assets/dist-CuB4kiSK.js +1 -0
- package/dist/client/assets/erDiagram-SMLLAGMA-Cy38ercc.js +85 -0
- package/dist/client/assets/flowDiagram-DWJPFMVM-CZKuYl0V.js +162 -0
- package/dist/client/assets/ganttDiagram-T4ZO3ILL-DLPjCh7a.js +292 -0
- package/dist/client/assets/gitGraph-7Q5UKJZL-DqbrtEp9.js +1 -0
- package/dist/client/assets/gitGraphDiagram-UUTBAWPF-BoRBkDhQ.js +106 -0
- package/dist/client/assets/graphlib-BcQ6qlQh.js +1 -0
- package/dist/client/assets/highlighted-body-OFNGDK62-BEpBVDTX.js +1 -0
- package/dist/client/assets/index-CetCiuqP.js +105 -0
- package/dist/client/assets/index-N29Mip7A.css +1 -0
- package/dist/client/assets/info-OMHHGYJF-D98DRBJX.js +1 -0
- package/dist/client/assets/infoDiagram-42DDH7IO-BAcdTWbt.js +2 -0
- package/dist/client/assets/init-B8gtcn7T.js +1 -0
- package/dist/client/assets/isArrayLikeObject-D8SJFmkN.js +1 -0
- package/dist/client/assets/isEmpty-BF3YX5Jk.js +1 -0
- package/dist/client/assets/ishikawaDiagram-UXIWVN3A-Ynu2VKdC.js +70 -0
- package/dist/client/assets/journeyDiagram-VCZTEJTY-BjfhQaN3.js +139 -0
- package/dist/client/assets/jsx-runtime-CyI9ICYU.js +1 -0
- package/dist/client/assets/kanban-definition-6JOO6SKY-JLXH9zUJ.js +89 -0
- package/dist/client/assets/katex-B94qP8b6.js +265 -0
- package/dist/client/assets/lib--QVjyxmL.js +29 -0
- package/dist/client/assets/lib-B6rgJiZ9.js +1 -0
- package/dist/client/assets/line-DCrYfLBn.js +1 -0
- package/dist/client/assets/linear-_4upLmeo.js +1 -0
- package/dist/client/assets/mermaid-GHXKKRXX-rwJHYUmW.js +1 -0
- package/dist/client/assets/mermaid-parser.core-KZinfW8o.js +4 -0
- package/dist/client/assets/mermaid.core-QqY9gSNe.js +11 -0
- package/dist/client/assets/mindmap-definition-QFDTVHPH-TWgHDAzp.js +96 -0
- package/dist/client/assets/ordinal-CCj7PWgZ.js +1 -0
- package/dist/client/assets/packet-4T2RLAQJ-DEvfkn3F.js +1 -0
- package/dist/client/assets/path-DZF-JdEe.js +1 -0
- package/dist/client/assets/pie-ZZUOXDRM-72e6WVjb.js +1 -0
- package/dist/client/assets/pieDiagram-DEJITSTG-Cl8PCsoj.js +30 -0
- package/dist/client/assets/preload-helper-rov5CBGT.js +1 -0
- package/dist/client/assets/pty-client-DZ27IS00.js +1 -0
- package/dist/client/assets/ptyInstancesStore-D9ag7SYd.js +1 -0
- package/dist/client/assets/quadrantDiagram-34T5L4WZ-CHyVGp9E.js +7 -0
- package/dist/client/assets/radar-PYXPWWZC-Cp7xd_EY.js +1 -0
- package/dist/client/assets/react-CClhXMB2.js +1 -0
- package/dist/client/assets/react-Dd6D81m0.js +1 -0
- package/dist/client/assets/react-dom--G6_6fQ_.js +1 -0
- package/dist/client/assets/requirementDiagram-MS252O5E-DaanG2iM.js +84 -0
- package/dist/client/assets/rough.esm-BsmKo2S5.js +1 -0
- package/dist/client/assets/sankeyDiagram-XADWPNL6-B_fhLY36.js +10 -0
- package/dist/client/assets/sequenceDiagram-FGHM5R23-C5FNrveI.js +157 -0
- package/dist/client/assets/src-DeTlMJAU.js +1 -0
- package/dist/client/assets/stateDiagram-FHFEXIEX-nTTcdjjQ.js +1 -0
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-Dw0632j_.js +1 -0
- package/dist/client/assets/timeline-definition-GMOUNBTQ-DkQV1yP8.js +120 -0
- package/dist/client/assets/treeView-SZITEDCU-ZLIgC7_K.js +1 -0
- package/dist/client/assets/treemap-W4RFUUIX-BqaMbB6N.js +1 -0
- package/dist/client/assets/uiIdentityOverlay-Ba7GNj7m.js +1 -0
- package/dist/client/assets/vennDiagram-DHZGUBPP-DbZ2xgs6.js +34 -0
- package/dist/client/assets/wardley-RL74JXVD-DXQS8zf4.js +1 -0
- package/dist/client/assets/wardleyDiagram-NUSXRM2D-BzCJ6MAu.js +20 -0
- package/dist/client/assets/xychartDiagram-5P7HB3ND-BSlFecop.js +7 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/favicon.svg +15 -0
- package/dist/client/fonts/body-medium.woff2 +0 -0
- package/dist/client/fonts/body-regular-italic.woff2 +0 -0
- package/dist/client/fonts/body-regular.woff2 +0 -0
- package/dist/client/fonts/body-semibold.woff2 +0 -0
- package/dist/client/index.html +31 -0
- package/dist/client/manifest.webmanifest +12 -0
- package/dist/client/sw.js +32 -0
- package/package.json +122 -0
- package/src/nats/auth-callout/callout-config.test.ts +93 -0
- package/src/nats/auth-callout/callout-config.ts +109 -0
- package/src/nats/auth-callout/callout.integration.test.ts +332 -0
- package/src/nats/auth-callout/keys.ts +103 -0
- package/src/nats/auth-callout/responder.ts +241 -0
- package/src/nats/auth-callout/scope-policy.test.ts +159 -0
- package/src/nats/auth-callout/scope-policy.ts +210 -0
- package/src/nats/auth-callout/token.test.ts +163 -0
- package/src/nats/auth-callout/token.ts +157 -0
- package/src/nats/nats-daemon-callout.ts +194 -0
- package/src/nats/nats-daemon.test.ts +77 -0
- package/src/nats/nats-daemon.ts +50 -0
- package/src/nats/nats-token.test.ts +61 -0
- package/src/nats/nats-token.ts +59 -0
- package/src/runner/coordination-mcp-integration.test.ts +134 -0
- package/src/runner/nats-coordination-client.test.ts +49 -0
- package/src/runner/nats-coordination-client.ts +94 -0
- package/src/runner/runner-agent.test.ts +469 -0
- package/src/runner/runner-agent.ts +453 -0
- package/src/runner/runner-credential.test.ts +93 -0
- package/src/runner/runner-credential.ts +82 -0
- package/src/runner/runner-nats.test.ts +495 -0
- package/src/runner/runner-nats.ts +323 -0
- package/src/runner/runner-pair.test.ts +107 -0
- package/src/runner/runner-pair.ts +81 -0
- package/src/runner/runner.test.ts +135 -0
- package/src/runner/runner.ts +212 -0
- package/src/runner/turn-factories.test.ts +97 -0
- package/src/runner/turn-factories.ts +475 -0
- package/src/server/agent-config-journey.test.ts +106 -0
- package/src/server/agent.ts +8 -0
- package/src/server/auto-continue/auth-error-detector.ts +66 -0
- package/src/server/auto-continue/limit-detector.ts +194 -0
- package/src/server/bm25.test.ts +92 -0
- package/src/server/bm25.ts +101 -0
- package/src/server/chat-events-jetstream.test.ts +135 -0
- package/src/server/claude-harness.ts +360 -0
- package/src/server/claude-pty/agent-normalizers.ts +309 -0
- package/src/server/claude-pty/auth.test.ts +38 -0
- package/src/server/claude-pty/auth.ts +32 -0
- package/src/server/claude-pty/claude-session-registry.adapter.ts +81 -0
- package/src/server/claude-pty/claude-session-registry.test.ts +149 -0
- package/src/server/claude-pty/driver.test.ts +902 -0
- package/src/server/claude-pty/driver.ts +807 -0
- package/src/server/claude-pty/jsonl-path.adapter.ts +57 -0
- package/src/server/claude-pty/jsonl-path.test.ts +114 -0
- package/src/server/claude-pty/jsonl-to-event.test.ts +241 -0
- package/src/server/claude-pty/jsonl-to-event.ts +174 -0
- package/src/server/claude-pty/output-ring.test.ts +35 -0
- package/src/server/claude-pty/output-ring.ts +25 -0
- package/src/server/claude-pty/parity-matrix.test.ts +227 -0
- package/src/server/claude-pty/pid-registry.adapter.ts +135 -0
- package/src/server/claude-pty/pid-registry.test.ts +122 -0
- package/src/server/claude-pty/preflight/binary-fingerprint.adapter.ts +20 -0
- package/src/server/claude-pty/preflight/binary-fingerprint.test.ts +32 -0
- package/src/server/claude-pty/pty-instance-registry.test.ts +177 -0
- package/src/server/claude-pty/pty-instance-registry.ts +166 -0
- package/src/server/claude-pty/pty-memory-sampler.adapter.test.ts +103 -0
- package/src/server/claude-pty/pty-memory-sampler.adapter.ts +85 -0
- package/src/server/claude-pty/pty-process.adapter.ts +66 -0
- package/src/server/claude-pty/pty-process.test.ts +49 -0
- package/src/server/claude-pty/resolve-binary.adapter.ts +106 -0
- package/src/server/claude-pty/resolve-binary.test.ts +118 -0
- package/src/server/claude-pty/runtime-dir.adapter.ts +19 -0
- package/src/server/claude-pty/settings-writer.adapter.ts +27 -0
- package/src/server/claude-pty/settings-writer.test.ts +22 -0
- package/src/server/claude-pty/smoke-test-io.adapter.ts +28 -0
- package/src/server/claude-pty/smoke-test.test.ts +191 -0
- package/src/server/claude-pty/smoke-test.ts +185 -0
- package/src/server/claude-pty/subagent-orchestrator.ts +887 -0
- package/src/server/claude-pty/tool-callback.ts +274 -0
- package/src/server/claude-pty/tui-control.test.ts +272 -0
- package/src/server/claude-pty/tui-control.ts +182 -0
- package/src/server/claude-pty/tui-source.adapter.test.ts +360 -0
- package/src/server/claude-pty/tui-source.adapter.ts +343 -0
- package/src/server/claude-pty/tunnel-gateway.ts +12 -0
- package/src/server/claude-pty-mcp/canonical-args.ts +15 -0
- package/src/server/claude-pty-mcp/fs-stat.adapter.ts +8 -0
- package/src/server/claude-pty-mcp/history-primer.ts +90 -0
- package/src/server/claude-pty-mcp/http-server.adapter.ts +33 -0
- package/src/server/claude-pty-mcp/mcp-http.ts +177 -0
- package/src/server/claude-pty-mcp/mcp.ts +412 -0
- package/src/server/claude-pty-mcp/mention-parser.ts +25 -0
- package/src/server/claude-pty-mcp/paths.ts +24 -0
- package/src/server/claude-pty-mcp/permission-gate.ts +243 -0
- package/src/server/claude-pty-mcp/terminal-pid-registry.adapter.ts +107 -0
- package/src/server/claude-pty-mcp/tools/ask-user-question.test.ts +119 -0
- package/src/server/claude-pty-mcp/tools/ask-user-question.ts +61 -0
- package/src/server/claude-pty-mcp/tools/bash.adapter.ts +76 -0
- package/src/server/claude-pty-mcp/tools/bash.test.ts +56 -0
- package/src/server/claude-pty-mcp/tools/delegate-subagent.test.ts +155 -0
- package/src/server/claude-pty-mcp/tools/delegate-subagent.ts +111 -0
- package/src/server/claude-pty-mcp/tools/edit.adapter.ts +95 -0
- package/src/server/claude-pty-mcp/tools/edit.test.ts +93 -0
- package/src/server/claude-pty-mcp/tools/exit-plan-mode.test.ts +61 -0
- package/src/server/claude-pty-mcp/tools/exit-plan-mode.ts +50 -0
- package/src/server/claude-pty-mcp/tools/glob.adapter.ts +86 -0
- package/src/server/claude-pty-mcp/tools/glob.test.ts +61 -0
- package/src/server/claude-pty-mcp/tools/grep.adapter.ts +126 -0
- package/src/server/claude-pty-mcp/tools/grep.test.ts +62 -0
- package/src/server/claude-pty-mcp/tools/read.adapter.ts +58 -0
- package/src/server/claude-pty-mcp/tools/read.test.ts +62 -0
- package/src/server/claude-pty-mcp/tools/tool-callback-shim.ts +42 -0
- package/src/server/claude-pty-mcp/tools/webfetch.test.ts +81 -0
- package/src/server/claude-pty-mcp/tools/webfetch.ts +82 -0
- package/src/server/claude-pty-mcp/tools/websearch.test.ts +40 -0
- package/src/server/claude-pty-mcp/tools/websearch.ts +42 -0
- package/src/server/claude-pty-mcp/tools/write.adapter.ts +60 -0
- package/src/server/claude-pty-mcp/tools/write.test.ts +52 -0
- package/src/server/claude-pty-mcp/uploads.adapter.ts +98 -0
- package/src/server/claude-pty-mcp/uploads.ts +38 -0
- package/src/server/claude-turn.test.ts +176 -0
- package/src/server/cli-runtime.test.ts +456 -0
- package/src/server/cli-runtime.ts +374 -0
- package/src/server/cli-supervisor.ts +81 -0
- package/src/server/cli.ts +78 -0
- package/src/server/client-log-forwarder.test.ts +74 -0
- package/src/server/client-log-forwarder.ts +75 -0
- package/src/server/codex-app-server-protocol.ts +449 -0
- package/src/server/codex-app-server.test.ts +2990 -0
- package/src/server/codex-app-server.ts +1713 -0
- package/src/server/coordination-integration.test.ts +63 -0
- package/src/server/coordination-mcp.test.ts +149 -0
- package/src/server/coordination-mcp.ts +197 -0
- package/src/server/delegation-coordinator.test.ts +675 -0
- package/src/server/delegation-coordinator.ts +454 -0
- package/src/server/discovery.test.ts +211 -0
- package/src/server/discovery.ts +301 -0
- package/src/server/event-store-agent-config.test.ts +124 -0
- package/src/server/event-store-coordination.test.ts +149 -0
- package/src/server/event-store-profile.test.ts +132 -0
- package/src/server/event-store-repo.test.ts +154 -0
- package/src/server/event-store-runner-team.test.ts +104 -0
- package/src/server/event-store.test.ts +342 -0
- package/src/server/event-store.ts +2208 -0
- package/src/server/events.ts +379 -0
- package/src/server/extension-router.test.ts +183 -0
- package/src/server/extension-router.ts +114 -0
- package/src/server/extensions/agents/server.test.ts +191 -0
- package/src/server/extensions/agents/server.ts +108 -0
- package/src/server/extensions/c3/server.test.ts +284 -0
- package/src/server/extensions/c3/server.ts +212 -0
- package/src/server/extensions/code/server.test.ts +200 -0
- package/src/server/extensions/code/server.ts +150 -0
- package/src/server/extensions.config.ts +10 -0
- package/src/server/external-open.ts +69 -0
- package/src/server/generate-fork-context.ts +58 -0
- package/src/server/generate-merge-context.test.ts +290 -0
- package/src/server/generate-merge-context.ts +141 -0
- package/src/server/generate-title.ts +36 -0
- package/src/server/git-clone-policy.test.ts +138 -0
- package/src/server/git-clone-policy.ts +27 -0
- package/src/server/harness-types.ts +1 -0
- package/src/server/journey-verification.test.ts +640 -0
- package/src/server/journey-verification.ts +195 -0
- package/src/server/machine-name.ts +22 -0
- package/src/server/nats-auth.test.ts +92 -0
- package/src/server/nats-auth.ts +6 -0
- package/src/server/nats-bind-guard.test.ts +71 -0
- package/src/server/nats-bind-guard.ts +42 -0
- package/src/server/nats-bridge.test.ts +141 -0
- package/src/server/nats-bridge.ts +111 -0
- package/src/server/nats-connector.test.ts +56 -0
- package/src/server/nats-connector.ts +71 -0
- package/src/server/nats-daemon-manager.test.ts +76 -0
- package/src/server/nats-daemon-manager.ts +174 -0
- package/src/server/nats-publisher.test.ts +356 -0
- package/src/server/nats-publisher.ts +271 -0
- package/src/server/nats-responders.test.ts +1018 -0
- package/src/server/nats-responders.ts +925 -0
- package/src/server/nats-streams.test.ts +112 -0
- package/src/server/nats-streams.ts +129 -0
- package/src/server/oauth-pool/oauth-responders.ts +185 -0
- package/src/server/oauth-pool/oauth-settings-store.ts +173 -0
- package/src/server/oauth-pool/oauth-token-pool.ts +303 -0
- package/src/server/orchestration.test.ts +1063 -0
- package/src/server/orchestration.ts +716 -0
- package/src/server/pairing-endpoints.test.ts +171 -0
- package/src/server/pairing-store.test.ts +154 -0
- package/src/server/pairing-store.ts +124 -0
- package/src/server/paths.ts +27 -0
- package/src/server/pr3-liveness.test.ts +252 -0
- package/src/server/process-utils.ts +10 -0
- package/src/server/project-cli.ts +180 -0
- package/src/server/provider-catalog.test.ts +177 -0
- package/src/server/provider-catalog.ts +146 -0
- package/src/server/pty-responders.ts +345 -0
- package/src/server/push-notifications.test.ts +234 -0
- package/src/server/push-notifications.ts +188 -0
- package/src/server/quick-response.test.ts +196 -0
- package/src/server/quick-response.ts +154 -0
- package/src/server/read-models-agent-config.test.ts +59 -0
- package/src/server/read-models-coordination.test.ts +69 -0
- package/src/server/read-models.test.ts +332 -0
- package/src/server/read-models.ts +258 -0
- package/src/server/repo-journey.test.ts +96 -0
- package/src/server/repo-manager.test.ts +118 -0
- package/src/server/repo-manager.ts +97 -0
- package/src/server/repo-status.test.ts +54 -0
- package/src/server/repo-status.ts +82 -0
- package/src/server/restart.test.ts +27 -0
- package/src/server/restart.ts +30 -0
- package/src/server/runner-incompatible-gate.test.ts +383 -0
- package/src/server/runner-manager.test.ts +72 -0
- package/src/server/runner-manager.ts +312 -0
- package/src/server/runner-pairing-urls.test.ts +59 -0
- package/src/server/runner-pairing-urls.ts +67 -0
- package/src/server/runner-proxy.test.ts +456 -0
- package/src/server/runner-proxy.ts +494 -0
- package/src/server/runner-router.test.ts +429 -0
- package/src/server/runner-router.ts +212 -0
- package/src/server/runner-routing.test.ts +584 -0
- package/src/server/runtime-registry.test.ts +436 -0
- package/src/server/runtime-registry.ts +307 -0
- package/src/server/sandbox-health.test.ts +127 -0
- package/src/server/sandbox-health.ts +94 -0
- package/src/server/sandbox-journey.test.ts +232 -0
- package/src/server/sandbox-manager.test.ts +146 -0
- package/src/server/sandbox-manager.ts +159 -0
- package/src/server/server.test.ts +287 -0
- package/src/server/server.ts +1108 -0
- package/src/server/session-discovery.test.ts +129 -0
- package/src/server/session-discovery.ts +475 -0
- package/src/server/session-index.test.ts +362 -0
- package/src/server/session-index.ts +119 -0
- package/src/server/session-seed.ts +288 -0
- package/src/server/share.test.ts +108 -0
- package/src/server/share.ts +113 -0
- package/src/server/skill-discovery.test.ts +201 -0
- package/src/server/skill-discovery.ts +77 -0
- package/src/server/storage/test-helpers.ts +67 -0
- package/src/server/terminal-manager.test.ts +309 -0
- package/src/server/terminal-manager.ts +354 -0
- package/src/server/transcript-consumer.test.ts +339 -0
- package/src/server/transcript-consumer.ts +162 -0
- package/src/server/transcript-search.test.ts +193 -0
- package/src/server/transcript-search.ts +83 -0
- package/src/server/transcript-utils.ts +52 -0
- package/src/server/update-manager.test.ts +107 -0
- package/src/server/update-manager.ts +230 -0
- package/src/server/workflow-engine.test.ts +251 -0
- package/src/server/workflow-engine.ts +169 -0
- package/src/server/workflow-mcp.ts +49 -0
- package/src/server/workflow-store.test.ts +155 -0
- package/src/server/workflow-store.ts +139 -0
- package/src/server/workspace-agent-integration.test.ts +167 -0
- package/src/server/workspace-agent-routes.test.ts +127 -0
- package/src/server/workspace-agent-routes.ts +89 -0
- package/src/server/workspace-agent.test.ts +103 -0
- package/src/server/workspace-agent.ts +102 -0
- package/src/server/workspace-cli.test.ts +79 -0
- package/src/server/workspace-config-manager.test.ts +109 -0
- package/src/server/workspace-config-manager.ts +83 -0
- package/src/server/workspace-directory-policy.test.ts +109 -0
- package/src/server/workspace-directory-policy.ts +56 -0
- package/src/shared/agent-config-types.ts +25 -0
- package/src/shared/branding.test.ts +42 -0
- package/src/shared/branding.ts +54 -0
- package/src/shared/compression.test.ts +85 -0
- package/src/shared/compression.ts +42 -0
- package/src/shared/coordination-store.test.ts +24 -0
- package/src/shared/coordination-store.ts +26 -0
- package/src/shared/dev-ports.test.ts +84 -0
- package/src/shared/dev-ports.ts +100 -0
- package/src/shared/extension-types.ts +45 -0
- package/src/shared/fork-presets.ts +54 -0
- package/src/shared/harness-types.test.ts +15 -0
- package/src/shared/harness-types.ts +21 -0
- package/src/shared/log-sink.test.ts +112 -0
- package/src/shared/log-sink.ts +185 -0
- package/src/shared/mention-pattern.ts +7 -0
- package/src/shared/merge-presets.ts +41 -0
- package/src/shared/nats-subjects.test.ts +61 -0
- package/src/shared/nats-subjects.ts +131 -0
- package/src/shared/permission-policy.ts +136 -0
- package/src/shared/ports.ts +3 -0
- package/src/shared/preset-types.ts +15 -0
- package/src/shared/profile-types.ts +49 -0
- package/src/shared/projectFileUrl.ts +36 -0
- package/src/shared/protocol.ts +153 -0
- package/src/shared/pty-instance.ts +43 -0
- package/src/shared/puggy/diagnostics/result.ts +18 -0
- package/src/shared/puggy/expressions/evaluate.ts +292 -0
- package/src/shared/puggy/index.test.ts +101 -0
- package/src/shared/puggy/index.ts +69 -0
- package/src/shared/puggy/parser/ast.ts +110 -0
- package/src/shared/puggy/parser/parser.ts +624 -0
- package/src/shared/puggy/renderer/html.ts +447 -0
- package/src/shared/runner-protocol.test.ts +277 -0
- package/src/shared/runner-protocol.ts +210 -0
- package/src/shared/runner-team-types.ts +73 -0
- package/src/shared/runtime-types.ts +48 -0
- package/src/shared/sandbox-types.ts +53 -0
- package/src/shared/tailwind-build.test.ts +12 -0
- package/src/shared/tinkaria-system-prompt.ts +101 -0
- package/src/shared/tools.test.ts +335 -0
- package/src/shared/tools.ts +397 -0
- package/src/shared/transcript-entries.ts +27 -0
- package/src/shared/transcript-render.test.ts +225 -0
- package/src/shared/transcript-render.ts +467 -0
- package/src/shared/types.ts +1031 -0
- package/src/shared/vite-config.test.ts +47 -0
- package/src/shared/web-context.test.ts +110 -0
- package/src/shared/web-context.ts +76 -0
- package/src/shared/workflow-types.ts +51 -0
- package/src/shared/workspace-types.ts +100 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { homedir } from "node:os"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
import { LOG_PREFIX } from "../shared/branding"
|
|
4
|
+
import { readToken } from "../nats/nats-token"
|
|
5
|
+
import { generateTitleForChat } from "../server/generate-title"
|
|
6
|
+
import { RunnerAgent, type TurnFactory } from "./runner-agent"
|
|
7
|
+
import { NatsCoordinationClient } from "./nats-coordination-client"
|
|
8
|
+
import { RunnerNatsHandler, connectRunner, shutdownConnection } from "./runner-nats"
|
|
9
|
+
import {
|
|
10
|
+
startClaudeTurn,
|
|
11
|
+
startClaudePtyTurn,
|
|
12
|
+
startCodexTurn,
|
|
13
|
+
stopAllCodexSessions,
|
|
14
|
+
stopAllClaudePtySessions,
|
|
15
|
+
stopClaudePtySession,
|
|
16
|
+
sweepIdleClaudePtySessions,
|
|
17
|
+
configureClaudePtyFactory,
|
|
18
|
+
} from "./turn-factories"
|
|
19
|
+
import { OAuthSettingsStore } from "../server/oauth-pool/oauth-settings-store"
|
|
20
|
+
import { OAuthTokenPool } from "../server/oauth-pool/oauth-token-pool"
|
|
21
|
+
import { ClaudePtyRegistry } from "../server/claude-pty/pid-registry.adapter"
|
|
22
|
+
import { ALL_OAUTH_EVENTS } from "../shared/nats-subjects"
|
|
23
|
+
import { pairRunner } from "./runner-pair"
|
|
24
|
+
import { readRunnerCredential } from "./runner-credential"
|
|
25
|
+
import { installConsoleTee } from "../shared/log-sink"
|
|
26
|
+
|
|
27
|
+
// Observability (decision 0012): tee runner console output to VictoriaLogs when
|
|
28
|
+
// VICTORIALOGS_URL is set; no-op otherwise. A remote runner only ships if it can
|
|
29
|
+
// reach the URL (localhost VL is server-machine-only) — see story design notes.
|
|
30
|
+
installConsoleTee(process.env, "runner")
|
|
31
|
+
|
|
32
|
+
// ── Subcommand dispatch ───────────────────────────────────────────────────────
|
|
33
|
+
//
|
|
34
|
+
// Usage: bun run src/runner/runner.ts pair --server <url> --code <code>
|
|
35
|
+
//
|
|
36
|
+
// Any other invocation (or no args) falls through to the normal runner start.
|
|
37
|
+
|
|
38
|
+
if (process.argv[2] === "pair") {
|
|
39
|
+
// Minimal arg parsing — enough to be useful; full packaging is PR8.
|
|
40
|
+
const args = process.argv.slice(3)
|
|
41
|
+
function argValue(flag: string): string | undefined {
|
|
42
|
+
const idx = args.indexOf(flag)
|
|
43
|
+
return idx !== -1 ? args[idx + 1] : undefined
|
|
44
|
+
}
|
|
45
|
+
const serverUrl = argValue("--server")
|
|
46
|
+
const code = argValue("--code")
|
|
47
|
+
if (!serverUrl || !code) {
|
|
48
|
+
console.error(LOG_PREFIX, "Usage: bun run src/runner/runner.ts pair --server <url> --code <code>")
|
|
49
|
+
process.exit(1)
|
|
50
|
+
}
|
|
51
|
+
await pairRunner({ serverUrl, code })
|
|
52
|
+
process.exit(0)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ── Normal runner start ───────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
// Resolve NATS connection parameters: env vars win (server-spawned runners);
|
|
58
|
+
// otherwise fall back to the stored credential file (externally-launched runners).
|
|
59
|
+
let natsUrl = process.env.NATS_URL
|
|
60
|
+
let natsToken = process.env.NATS_TOKEN
|
|
61
|
+
const natsDataDir = process.env.NATS_DATA_DIR
|
|
62
|
+
let runnerId = process.env.RUNNER_ID ?? `runner-${process.pid}`
|
|
63
|
+
|
|
64
|
+
if (!natsUrl) {
|
|
65
|
+
// No env — try the credential file written by the pair flow.
|
|
66
|
+
const cred = await readRunnerCredential()
|
|
67
|
+
if (cred) {
|
|
68
|
+
// Prefer the /nats-ws proxy URL (WS over the tunneled HTTP port) when present
|
|
69
|
+
// — it's the reliable path the browser uses. Fall back to the raw TCP natsUrl
|
|
70
|
+
// for older credentials paired before this field existed.
|
|
71
|
+
natsUrl = cred.natsWsProxyUrl ?? cred.natsUrl
|
|
72
|
+
natsToken = cred.token
|
|
73
|
+
runnerId = cred.runnerId
|
|
74
|
+
console.warn(LOG_PREFIX, `Loading credential from file — runnerId: ${runnerId}`)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (!natsUrl) {
|
|
79
|
+
console.error(LOG_PREFIX, "NATS_URL environment variable is required (or run 'pair' to set up a credential file)")
|
|
80
|
+
process.exit(1)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Safety net: prevent stray unhandled rejections from crashing the runner.
|
|
84
|
+
process.on("unhandledRejection", (reason) => {
|
|
85
|
+
const message = reason instanceof Error ? reason.message : String(reason)
|
|
86
|
+
console.warn(LOG_PREFIX, "unhandled rejection (swallowed):", message)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Resolve NATS auth token: env var takes precedence, then file-based via NATS_DATA_DIR
|
|
90
|
+
const resolvedToken = natsToken ?? (natsDataDir ? await readToken(natsDataDir) : undefined)
|
|
91
|
+
const nc = await connectRunner({ natsUrl, token: resolvedToken })
|
|
92
|
+
|
|
93
|
+
console.warn(LOG_PREFIX, `Runner ${runnerId} connected to NATS at ${natsUrl}`)
|
|
94
|
+
|
|
95
|
+
// ── OAuth pool + PTY registry (PTY lifecycle ownership) ───────────────
|
|
96
|
+
//
|
|
97
|
+
// Both live for the runner process lifetime. The pool is the single
|
|
98
|
+
// source of truth for token reservation/rotation in this runner. The
|
|
99
|
+
// registry persists live PTY pids so a non-graceful crash can SIGKILL
|
|
100
|
+
// orphans on the next boot.
|
|
101
|
+
|
|
102
|
+
const oauthSettings = new OAuthSettingsStore()
|
|
103
|
+
await oauthSettings.load()
|
|
104
|
+
const oauthPool = new OAuthTokenPool(
|
|
105
|
+
() => oauthSettings.getTokens(),
|
|
106
|
+
(id, patch) => oauthSettings.mutateTokenStatus(id, patch),
|
|
107
|
+
Date.now,
|
|
108
|
+
() => oauthSettings.getConcurrencyDefault(),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
const ptyRegistryPath = path.join(homedir(), ".tinkaria", "cache", "runner-pty-pids.json")
|
|
112
|
+
const ptyRegistry = new ClaudePtyRegistry(ptyRegistryPath)
|
|
113
|
+
try {
|
|
114
|
+
const reaped = await ptyRegistry.reapStale()
|
|
115
|
+
if (reaped.length > 0) {
|
|
116
|
+
console.warn(LOG_PREFIX, `Runner reaped ${reaped.length} orphan PTY child(ren) from previous boot`)
|
|
117
|
+
}
|
|
118
|
+
} catch (err) {
|
|
119
|
+
console.warn(LOG_PREFIX, "ptyRegistry.reapStale failed:", err instanceof Error ? err.message : String(err))
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
configureClaudePtyFactory({ pool: oauthPool, registry: ptyRegistry })
|
|
123
|
+
|
|
124
|
+
// Reload settings when the server publishes oauth.changed so the runner
|
|
125
|
+
// pool sees user-added tokens without a restart.
|
|
126
|
+
;(async () => {
|
|
127
|
+
try {
|
|
128
|
+
const sub = nc.subscribe(ALL_OAUTH_EVENTS)
|
|
129
|
+
for await (const _ of sub) {
|
|
130
|
+
try { await oauthSettings.load() } catch (err) {
|
|
131
|
+
console.warn(LOG_PREFIX, "oauthSettings.load on oauth.changed failed:", err instanceof Error ? err.message : String(err))
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
console.warn(LOG_PREFIX, "oauth.changed subscription terminated:", err instanceof Error ? err.message : String(err))
|
|
136
|
+
}
|
|
137
|
+
})()
|
|
138
|
+
|
|
139
|
+
// Idle session sweeper. Defaults: TTL = 10 min, sweep every 60 s. Override
|
|
140
|
+
// via env so operators can tune for memory pressure.
|
|
141
|
+
const claudeIdleMs = positiveIntFromEnv(process.env.TINKARIA_CLAUDE_SESSION_IDLE_MS, 10 * 60 * 1000)
|
|
142
|
+
const claudeSweepMs = positiveIntFromEnv(process.env.TINKARIA_CLAUDE_SESSION_SWEEP_INTERVAL_MS, 60 * 1000)
|
|
143
|
+
const claudeSweepTimer = claudeSweepMs > 0
|
|
144
|
+
? setInterval(() => {
|
|
145
|
+
try {
|
|
146
|
+
const closed = sweepIdleClaudePtySessions(Date.now(), claudeIdleMs)
|
|
147
|
+
if (closed > 0) console.log(LOG_PREFIX, `idle sweep closed ${closed} PTY session(s)`)
|
|
148
|
+
} catch (err) {
|
|
149
|
+
console.warn(LOG_PREFIX, "idle sweep failed:", err instanceof Error ? err.message : String(err))
|
|
150
|
+
}
|
|
151
|
+
}, claudeSweepMs)
|
|
152
|
+
: null
|
|
153
|
+
claudeSweepTimer?.unref?.()
|
|
154
|
+
|
|
155
|
+
function positiveIntFromEnv(raw: string | undefined, fallback: number): number {
|
|
156
|
+
if (raw === undefined) return fallback
|
|
157
|
+
const n = Number(raw)
|
|
158
|
+
if (!Number.isFinite(n) || n <= 0) return fallback
|
|
159
|
+
return Math.round(n)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const createTurn: TurnFactory = async (args) => {
|
|
163
|
+
if (args.provider === "claude") {
|
|
164
|
+
return startClaudeTurn({ ...args, extraEnv: args.extraEnv })
|
|
165
|
+
}
|
|
166
|
+
if (args.provider === "claude-pty") {
|
|
167
|
+
return startClaudePtyTurn({ ...args, nc })
|
|
168
|
+
}
|
|
169
|
+
if (args.provider === "codex") {
|
|
170
|
+
return startCodexTurn({ ...args, extraEnv: args.extraEnv })
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`Provider ${args.provider} not supported in runner`)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const coordinationStore = new NatsCoordinationClient(nc)
|
|
176
|
+
const agent = new RunnerAgent({
|
|
177
|
+
nc,
|
|
178
|
+
createTurn,
|
|
179
|
+
generateTitle: generateTitleForChat,
|
|
180
|
+
coordinationStore,
|
|
181
|
+
stopClaudePtySession,
|
|
182
|
+
})
|
|
183
|
+
const handler = new RunnerNatsHandler({ nc, agent, runnerId })
|
|
184
|
+
await handler.start()
|
|
185
|
+
|
|
186
|
+
console.warn(LOG_PREFIX, `Runner ${runnerId} ready (pid: ${process.pid})`)
|
|
187
|
+
|
|
188
|
+
// Graceful shutdown
|
|
189
|
+
let shuttingDown = false
|
|
190
|
+
async function shutdown() {
|
|
191
|
+
if (shuttingDown) return
|
|
192
|
+
shuttingDown = true
|
|
193
|
+
console.warn(LOG_PREFIX, `Runner ${runnerId} shutting down...`)
|
|
194
|
+
|
|
195
|
+
handler.dispose()
|
|
196
|
+
|
|
197
|
+
// Cancel all active turns
|
|
198
|
+
for (const chatId of [...agent.activeTurns.keys()]) {
|
|
199
|
+
await agent.cancel(chatId)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (claudeSweepTimer) clearInterval(claudeSweepTimer)
|
|
203
|
+
stopAllCodexSessions()
|
|
204
|
+
stopAllClaudePtySessions()
|
|
205
|
+
|
|
206
|
+
await shutdownConnection(nc)
|
|
207
|
+
console.warn(LOG_PREFIX, `Runner ${runnerId} stopped`)
|
|
208
|
+
process.exit(0)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
process.on("SIGTERM", shutdown)
|
|
212
|
+
process.on("SIGINT", shutdown)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR4 Stage 1 — turn-factories shape tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that startCodexTurn and startClaudeTurn no longer accept a
|
|
5
|
+
* binaryPath argument and that runner-side binary resolution is in place.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, expect, test } from "bun:test"
|
|
8
|
+
import { startCodexTurn, startClaudeTurn } from "./turn-factories"
|
|
9
|
+
import type { ResolveClaudeBinaryResult } from "../server/claude-pty/resolve-binary.adapter"
|
|
10
|
+
|
|
11
|
+
// ── Shape: no binaryPath in startCodexTurn params ───────────────────
|
|
12
|
+
|
|
13
|
+
describe("startCodexTurn signature (PR4 — no binaryPath)", () => {
|
|
14
|
+
test("startCodexTurn parameters do not include binaryPath", () => {
|
|
15
|
+
// Compile-time: if binaryPath existed, assigning its type would be an error.
|
|
16
|
+
// Runtime: verify the function itself exists and is callable with extraEnv only.
|
|
17
|
+
type StartCodexTurnArgs = Parameters<typeof startCodexTurn>[0]
|
|
18
|
+
const _typeCheck: keyof StartCodexTurnArgs extends
|
|
19
|
+
"chatId" | "content" | "localPath" | "model" | "effort" | "serviceTier" | "planMode" | "sessionToken" | "onToolRequest" | "extraEnv"
|
|
20
|
+
? true : false = true
|
|
21
|
+
expect(_typeCheck).toBe(true)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test("startCodexTurn params type has no binaryPath key", () => {
|
|
25
|
+
// We use a type-level trick: "binaryPath" should not be assignable to keyof Args.
|
|
26
|
+
type Args = Parameters<typeof startCodexTurn>[0]
|
|
27
|
+
type HasBinaryPath = "binaryPath" extends keyof Args ? true : false
|
|
28
|
+
const hasIt: HasBinaryPath = false
|
|
29
|
+
expect(hasIt).toBe(false)
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// ── Shape: no binaryPath in startClaudeTurn params ──────────────────
|
|
34
|
+
|
|
35
|
+
describe("startClaudeTurn signature (PR4 — no binaryPath)", () => {
|
|
36
|
+
test("startClaudeTurn params type has no binaryPath key", () => {
|
|
37
|
+
type Args = Parameters<typeof startClaudeTurn>[0]
|
|
38
|
+
type HasBinaryPath = "binaryPath" extends keyof Args ? true : false
|
|
39
|
+
const hasIt: HasBinaryPath = false
|
|
40
|
+
expect(hasIt).toBe(false)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test("startClaudeTurn accepts _resolveBinary override for testability", () => {
|
|
44
|
+
type Args = Parameters<typeof startClaudeTurn>[0]
|
|
45
|
+
type HasResolver = "_resolveBinary" extends keyof Args ? true : false
|
|
46
|
+
const hasIt: HasResolver = true
|
|
47
|
+
expect(hasIt).toBe(true)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
test("startClaudeTurn resolves binary through injected resolver (no PATH/fs)", async () => {
|
|
51
|
+
const resolvedPaths: string[] = []
|
|
52
|
+
const fakeResolver = async (): Promise<ResolveClaudeBinaryResult> => {
|
|
53
|
+
const p = "/runner-resolved/claude"
|
|
54
|
+
resolvedPaths.push(p)
|
|
55
|
+
return { path: p, source: "PATH", triedPaths: [] }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Minimal fake SDK that captures pathToClaudeCodeExecutable from options.
|
|
59
|
+
let capturedExecutablePath: string | undefined
|
|
60
|
+
const fakeSdk = {
|
|
61
|
+
query(args: { prompt: string; options?: Record<string, unknown> }) {
|
|
62
|
+
capturedExecutablePath = args.options?.pathToClaudeCodeExecutable as string | undefined
|
|
63
|
+
return {
|
|
64
|
+
async *[Symbol.asyncIterator]() {
|
|
65
|
+
yield {
|
|
66
|
+
type: "result",
|
|
67
|
+
subtype: "success",
|
|
68
|
+
is_error: false,
|
|
69
|
+
duration_ms: 0,
|
|
70
|
+
result: "",
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
accountInfo: async () => null,
|
|
74
|
+
getContextUsage: async () => null,
|
|
75
|
+
interrupt: async () => {},
|
|
76
|
+
close: () => {},
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const turn = await startClaudeTurn({
|
|
82
|
+
content: "test",
|
|
83
|
+
localPath: "/tmp/workspace",
|
|
84
|
+
model: "claude-sonnet-4-6",
|
|
85
|
+
planMode: false,
|
|
86
|
+
sessionToken: null,
|
|
87
|
+
onToolRequest: async () => ({}),
|
|
88
|
+
sdk: fakeSdk as never,
|
|
89
|
+
_resolveBinary: fakeResolver,
|
|
90
|
+
})
|
|
91
|
+
// Drain the stream so the SDK query is actually invoked
|
|
92
|
+
for await (const _ of turn.stream) { /* drain */ }
|
|
93
|
+
|
|
94
|
+
expect(resolvedPaths).toHaveLength(1)
|
|
95
|
+
expect(capturedExecutablePath).toBe("/runner-resolved/claude")
|
|
96
|
+
})
|
|
97
|
+
})
|