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,303 @@
|
|
|
1
|
+
import type { OAuthTokenEntry } from "../../shared/types"
|
|
2
|
+
|
|
3
|
+
export type TokenStatusPatch = Partial<Pick<OAuthTokenEntry,
|
|
4
|
+
"status" | "limitedUntil" | "lastUsedAt" | "lastErrorAt" | "lastErrorMessage"
|
|
5
|
+
>>
|
|
6
|
+
|
|
7
|
+
export type TokenUnavailability =
|
|
8
|
+
| { tokenId: string; label: string; reason: "available" }
|
|
9
|
+
| { tokenId: string; label: string; reason: "limited"; until: number }
|
|
10
|
+
| { tokenId: string; label: string; reason: "reserved"; byChatIds: string[]; ownedBySelf: boolean }
|
|
11
|
+
| { tokenId: string; label: string; reason: "error"; message: string | null }
|
|
12
|
+
| { tokenId: string; label: string; reason: "disabled" }
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Handle returned by `pickEphemeral()`. Callers MUST invoke `release()`
|
|
16
|
+
* when the ephemeral run completes (success or failure) so the
|
|
17
|
+
* underlying token is not pinned by an orphan reservation.
|
|
18
|
+
*/
|
|
19
|
+
export interface EphemeralLease {
|
|
20
|
+
token: OAuthTokenEntry
|
|
21
|
+
release(): void
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const ABSOLUTE_MIN_CAP = 1
|
|
25
|
+
const ABSOLUTE_MAX_CAP = 5
|
|
26
|
+
|
|
27
|
+
export class OAuthTokenPool {
|
|
28
|
+
// tokenId -> set of chat ids currently bound to that token. A token may
|
|
29
|
+
// be bound by up to `tokenCap(token)` chats concurrently (see ADR
|
|
30
|
+
// adr-20260522-oauth-token-share-cap). Sharing is opt-in per token via
|
|
31
|
+
// OAuthTokenEntry.maxConcurrent; pool-wide default comes from
|
|
32
|
+
// ClaudeAuthSettings.concurrencyDefault via the readGlobalCap closure.
|
|
33
|
+
private readonly reservedBy = new Map<string, Set<string>>()
|
|
34
|
+
|
|
35
|
+
// Monotonic counter for synthetic ephemeral reservation keys.
|
|
36
|
+
private ephemeralSeq = 0
|
|
37
|
+
|
|
38
|
+
constructor(
|
|
39
|
+
private readonly readTokens: () => OAuthTokenEntry[],
|
|
40
|
+
private readonly writeStatus: (id: string, patch: TokenStatusPatch) => void,
|
|
41
|
+
private readonly now: () => number = Date.now,
|
|
42
|
+
private readonly readGlobalCap: () => number = () => ABSOLUTE_MIN_CAP,
|
|
43
|
+
) {}
|
|
44
|
+
|
|
45
|
+
private tokenCap(t: OAuthTokenEntry): number {
|
|
46
|
+
const raw = typeof t.maxConcurrent === "number" && Number.isFinite(t.maxConcurrent)
|
|
47
|
+
? t.maxConcurrent
|
|
48
|
+
: this.readGlobalCap()
|
|
49
|
+
if (!Number.isFinite(raw)) return ABSOLUTE_MIN_CAP
|
|
50
|
+
const rounded = Math.round(raw)
|
|
51
|
+
if (rounded < ABSOLUTE_MIN_CAP) return ABSOLUTE_MIN_CAP
|
|
52
|
+
if (rounded > ABSOLUTE_MAX_CAP) return ABSOLUTE_MAX_CAP
|
|
53
|
+
return rounded
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private getOwners(tokenId: string): Set<string> {
|
|
57
|
+
return this.reservedBy.get(tokenId) ?? new Set()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Returns true iff the token is eligible at `now` for a caller with the
|
|
62
|
+
* given `reservedFor` identity. Single source of truth for
|
|
63
|
+
* `pickActive` + `hasUsable` so a preflight `hasUsable(chatId)` can't
|
|
64
|
+
* say "yes" while `pickActive(chatId)` returns null (TOCTOU gap closed).
|
|
65
|
+
*/
|
|
66
|
+
private isEligible(t: OAuthTokenEntry, now: number, reservedFor: string | undefined): boolean {
|
|
67
|
+
if (t.status === "error" || t.status === "disabled") return false
|
|
68
|
+
const owners = this.getOwners(t.id)
|
|
69
|
+
const reentrant = reservedFor !== undefined && owners.has(reservedFor)
|
|
70
|
+
if (!reentrant && owners.size >= this.tokenCap(t)) return false
|
|
71
|
+
if (t.status === "limited") {
|
|
72
|
+
if (t.limitedUntil !== null && t.limitedUntil > now) return false
|
|
73
|
+
}
|
|
74
|
+
return true
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
pickActive(reservedFor?: string): OAuthTokenEntry | null {
|
|
78
|
+
const now = this.now()
|
|
79
|
+
// Pure read loop: gather eligible candidates without mutating state.
|
|
80
|
+
// The previous implementation called writeStatus() inside the loop to
|
|
81
|
+
// revive elapsed-limited tokens. With a deferred / batched writeStatus
|
|
82
|
+
// the in-flight readTokens() snapshot could still report "limited"
|
|
83
|
+
// for a row we had already revived in the same call. Hoist the
|
|
84
|
+
// revival to a single post-pick step so the read pass is pure.
|
|
85
|
+
const candidates: OAuthTokenEntry[] = []
|
|
86
|
+
for (const t of this.readTokens()) {
|
|
87
|
+
if (!this.isEligible(t, now, reservedFor)) continue
|
|
88
|
+
candidates.push(t)
|
|
89
|
+
}
|
|
90
|
+
if (candidates.length === 0) return null
|
|
91
|
+
// Re-entrant call: if the caller already owns one of the eligible
|
|
92
|
+
// tokens, return that one. Avoids churn on repeated pickActive(chatId)
|
|
93
|
+
// calls from the same chat that today expect a stable answer.
|
|
94
|
+
if (reservedFor !== undefined) {
|
|
95
|
+
const owned = candidates.find((t) => this.getOwners(t.id).has(reservedFor))
|
|
96
|
+
if (owned) {
|
|
97
|
+
if (owned.status === "limited") {
|
|
98
|
+
this.writeStatus(owned.id, { status: "active", limitedUntil: null })
|
|
99
|
+
return { ...owned, status: "active", limitedUntil: null }
|
|
100
|
+
}
|
|
101
|
+
return owned
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Spread load before stacking: prefer the token with the smallest
|
|
105
|
+
// current owner count, then break ties by least-recently-used.
|
|
106
|
+
candidates.sort((a, b) => {
|
|
107
|
+
const oa = this.getOwners(a.id).size
|
|
108
|
+
const ob = this.getOwners(b.id).size
|
|
109
|
+
if (oa !== ob) return oa - ob
|
|
110
|
+
return (a.lastUsedAt ?? 0) - (b.lastUsedAt ?? 0)
|
|
111
|
+
})
|
|
112
|
+
const picked = candidates[0]
|
|
113
|
+
if (picked.status === "limited") {
|
|
114
|
+
this.writeStatus(picked.id, { status: "active", limitedUntil: null })
|
|
115
|
+
}
|
|
116
|
+
const result: OAuthTokenEntry = picked.status === "limited"
|
|
117
|
+
? { ...picked, status: "active", limitedUntil: null }
|
|
118
|
+
: picked
|
|
119
|
+
if (reservedFor !== undefined) {
|
|
120
|
+
// A chat owns at most one token at a time across the pool — drop the
|
|
121
|
+
// caller from any other token's owner set before binding to the new
|
|
122
|
+
// one, but DO NOT clobber other owners of the picked token.
|
|
123
|
+
this.removeOwnerExcept(reservedFor, result.id)
|
|
124
|
+
const owners = this.reservedBy.get(result.id) ?? new Set<string>()
|
|
125
|
+
owners.add(reservedFor)
|
|
126
|
+
this.reservedBy.set(result.id, owners)
|
|
127
|
+
}
|
|
128
|
+
return result
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Picks a token and binds it under a synthetic reservation key so
|
|
133
|
+
* concurrent ephemeral callers (quick-response, slash-command warmup,
|
|
134
|
+
* subagent runs) cannot all be handed the same token at once. The
|
|
135
|
+
* returned `release()` MUST be invoked when the ephemeral work
|
|
136
|
+
* completes. Idempotent.
|
|
137
|
+
*/
|
|
138
|
+
pickEphemeral(): EphemeralLease | null {
|
|
139
|
+
this.ephemeralSeq += 1
|
|
140
|
+
const key = `__ephemeral:${this.ephemeralSeq}`
|
|
141
|
+
const token = this.pickActive(key)
|
|
142
|
+
if (!token) return null
|
|
143
|
+
let released = false
|
|
144
|
+
return {
|
|
145
|
+
token,
|
|
146
|
+
release: () => {
|
|
147
|
+
if (released) return
|
|
148
|
+
released = true
|
|
149
|
+
this.releaseInternal(key)
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
release(reservedFor: string): void {
|
|
155
|
+
this.releaseInternal(reservedFor)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private releaseInternal(reservedFor: string): void {
|
|
159
|
+
for (const [tokenId, owners] of this.reservedBy) {
|
|
160
|
+
if (owners.delete(reservedFor) && owners.size === 0) {
|
|
161
|
+
this.reservedBy.delete(tokenId)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private removeOwnerExcept(reservedFor: string, exceptTokenId: string): void {
|
|
167
|
+
for (const [tokenId, owners] of this.reservedBy) {
|
|
168
|
+
if (tokenId === exceptTokenId) continue
|
|
169
|
+
if (owners.delete(reservedFor) && owners.size === 0) {
|
|
170
|
+
this.reservedBy.delete(tokenId)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
markLimited(id: string, resetAt: number): void {
|
|
176
|
+
this.writeStatus(id, { status: "limited", limitedUntil: resetAt })
|
|
177
|
+
// Limited token cannot serve any session. The rotation layer in
|
|
178
|
+
// agent.ts must call takeStaleOwners(id) BEFORE invoking markLimited
|
|
179
|
+
// so it learns which chats need a coordinated re-pick. We then clear
|
|
180
|
+
// the local reservation set so subsequent pickActive() does not see
|
|
181
|
+
// stale owners for the limited token.
|
|
182
|
+
this.reservedBy.delete(id)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
markUsed(id: string): void {
|
|
186
|
+
this.writeStatus(id, { lastUsedAt: this.now() })
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
markError(id: string, message: string): void {
|
|
190
|
+
this.writeStatus(id, { status: "error", lastErrorAt: this.now(), lastErrorMessage: message })
|
|
191
|
+
// Drop reservations — an errored token cannot serve sessions. The
|
|
192
|
+
// rotation layer must call takeStaleOwners(id) BEFORE markError for
|
|
193
|
+
// coordinated re-pick.
|
|
194
|
+
this.reservedBy.delete(id)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
markDisabled(id: string): void {
|
|
198
|
+
this.writeStatus(id, { status: "disabled" })
|
|
199
|
+
this.reservedBy.delete(id)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
markEnabled(id: string): void {
|
|
203
|
+
this.writeStatus(id, { status: "active" })
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Returns and clears the owner set associated with a token. The
|
|
208
|
+
* rotation layer in agent.ts calls this immediately BEFORE markLimited
|
|
209
|
+
* / markError so it learns which chats were sharing the token and can
|
|
210
|
+
* drive a coordinated, deduped, staggered re-pick for each. Mirrors
|
|
211
|
+
* release(chatId) lifetime semantics: a removed owner is no longer
|
|
212
|
+
* counted against the token's cap.
|
|
213
|
+
*/
|
|
214
|
+
takeStaleOwners(id: string): string[] {
|
|
215
|
+
const owners = this.reservedBy.get(id)
|
|
216
|
+
if (!owners || owners.size === 0) return []
|
|
217
|
+
const out = [...owners]
|
|
218
|
+
this.reservedBy.delete(id)
|
|
219
|
+
return out
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Read-only: does the pool contain any token entries at all, regardless
|
|
224
|
+
* of status? Distinguishes "user opted into pool auth but all tokens are
|
|
225
|
+
* unusable right now" (refuse spawn — avoid silent keychain fallback that
|
|
226
|
+
* returns 401 against an expired login) from "user has not configured
|
|
227
|
+
* pool, allow CLI keychain fallback".
|
|
228
|
+
*/
|
|
229
|
+
hasAnyToken(): boolean {
|
|
230
|
+
return this.readTokens().length > 0
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Read-only probe: does the pool have at least one token currently usable
|
|
235
|
+
* by a caller with the given `reservedFor` identity (or by an unreserved
|
|
236
|
+
* caller when omitted)? Unlike `pickActive`, does NOT mutate `status` for
|
|
237
|
+
* elapsed-limited tokens. Matches `pickActive`'s eligibility filter
|
|
238
|
+
* exactly so a preflight `hasUsable(chatId)` cannot say "yes" while the
|
|
239
|
+
* subsequent `pickActive(chatId)` returns null (TOCTOU gap closed).
|
|
240
|
+
*/
|
|
241
|
+
hasUsable(reservedFor?: string): boolean {
|
|
242
|
+
const now = this.now()
|
|
243
|
+
for (const t of this.readTokens()) {
|
|
244
|
+
if (this.isEligible(t, now, reservedFor)) return true
|
|
245
|
+
}
|
|
246
|
+
return false
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
allLimited(): boolean {
|
|
250
|
+
// Only considers non-disabled, non-error tokens — disabled accounts are
|
|
251
|
+
// intentionally excluded from the pool and do not affect rate-limit state.
|
|
252
|
+
const eligible = this.readTokens().filter((t) => t.status !== "disabled" && t.status !== "error")
|
|
253
|
+
if (eligible.length === 0) return false
|
|
254
|
+
const now = this.now()
|
|
255
|
+
return eligible.every((t) => t.status === "limited" && t.limitedUntil !== null && t.limitedUntil > now)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Per-token reason why this token is unusable by `reservedFor` right now.
|
|
260
|
+
* Returns one entry per token in the pool, used by callers to build a
|
|
261
|
+
* concrete refusal error ("Phong is in use by N chats") instead
|
|
262
|
+
* of the generic "all tokens unavailable" string.
|
|
263
|
+
*/
|
|
264
|
+
describeUnavailability(reservedFor?: string): TokenUnavailability[] {
|
|
265
|
+
const now = this.now()
|
|
266
|
+
const out: TokenUnavailability[] = []
|
|
267
|
+
for (const t of this.readTokens()) {
|
|
268
|
+
const base = { tokenId: t.id, label: t.label }
|
|
269
|
+
if (t.status === "disabled") {
|
|
270
|
+
out.push({ ...base, reason: "disabled" })
|
|
271
|
+
continue
|
|
272
|
+
}
|
|
273
|
+
if (t.status === "error") {
|
|
274
|
+
out.push({ ...base, reason: "error", message: t.lastErrorMessage ?? null })
|
|
275
|
+
continue
|
|
276
|
+
}
|
|
277
|
+
const owners = this.getOwners(t.id)
|
|
278
|
+
const ownedBySelf = reservedFor !== undefined && owners.has(reservedFor)
|
|
279
|
+
const atCap = owners.size >= this.tokenCap(t)
|
|
280
|
+
if (atCap && !ownedBySelf) {
|
|
281
|
+
out.push({ ...base, reason: "reserved", byChatIds: [...owners], ownedBySelf })
|
|
282
|
+
continue
|
|
283
|
+
}
|
|
284
|
+
if (t.status === "limited" && t.limitedUntil !== null && t.limitedUntil > now) {
|
|
285
|
+
out.push({ ...base, reason: "limited", until: t.limitedUntil })
|
|
286
|
+
continue
|
|
287
|
+
}
|
|
288
|
+
out.push({ ...base, reason: "available" })
|
|
289
|
+
}
|
|
290
|
+
return out
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
earliestUnlimit(): number | null {
|
|
294
|
+
const now = this.now()
|
|
295
|
+
let earliest: number | null = null
|
|
296
|
+
for (const t of this.readTokens()) {
|
|
297
|
+
if (t.status !== "limited") continue
|
|
298
|
+
if (t.limitedUntil === null || t.limitedUntil <= now) continue
|
|
299
|
+
if (earliest === null || t.limitedUntil < earliest) earliest = t.limitedUntil
|
|
300
|
+
}
|
|
301
|
+
return earliest
|
|
302
|
+
}
|
|
303
|
+
}
|