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,412 @@
|
|
|
1
|
+
import { createSdkMcpServer, tool, type SdkMcpToolDefinition } from "@anthropic-ai/claude-agent-sdk"
|
|
2
|
+
import { z } from "zod"
|
|
3
|
+
import path from "node:path"
|
|
4
|
+
import { randomUUID } from "node:crypto"
|
|
5
|
+
import { statPathOrNull } from "./fs-stat.adapter"
|
|
6
|
+
import { KANNA_MCP_SERVER_NAME } from "../../shared/tools"
|
|
7
|
+
import { buildProjectFileContentUrl } from "../../shared/projectFileUrl"
|
|
8
|
+
import { inferProjectFileContentType } from "./uploads"
|
|
9
|
+
import type { TranscriptEntry } from "../../shared/types"
|
|
10
|
+
import type { TunnelGateway } from "../claude-pty/tunnel-gateway"
|
|
11
|
+
import { createAskUserQuestionTool } from "./tools/ask-user-question"
|
|
12
|
+
import { createExitPlanModeTool } from "./tools/exit-plan-mode"
|
|
13
|
+
import { createReadTool } from "./tools/read.adapter"
|
|
14
|
+
import { createGlobTool } from "./tools/glob.adapter"
|
|
15
|
+
import { createGrepTool } from "./tools/grep.adapter"
|
|
16
|
+
import { createBashTool } from "./tools/bash.adapter"
|
|
17
|
+
import { createEditTool } from "./tools/edit.adapter"
|
|
18
|
+
import { createWriteTool } from "./tools/write.adapter"
|
|
19
|
+
import { createWebFetchTool } from "./tools/webfetch"
|
|
20
|
+
import { createWebSearchTool } from "./tools/websearch"
|
|
21
|
+
import {
|
|
22
|
+
createDelegateSubagentTool,
|
|
23
|
+
DELEGATE_SUBAGENT_DESCRIPTION,
|
|
24
|
+
type DelegateSubagentContext,
|
|
25
|
+
} from "./tools/delegate-subagent"
|
|
26
|
+
import type { SubagentOrchestrator } from "../claude-pty/subagent-orchestrator"
|
|
27
|
+
import type { ToolCallbackService } from "../claude-pty/tool-callback"
|
|
28
|
+
import type { ChatPermissionPolicy } from "../../shared/permission-policy"
|
|
29
|
+
import { POLICY_DEFAULT } from "../../shared/permission-policy"
|
|
30
|
+
|
|
31
|
+
export interface OfferDownloadArgs {
|
|
32
|
+
projectId: string
|
|
33
|
+
localPath: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Per-spawn delegation context for `mcp__kanna__delegate_subagent`.
|
|
38
|
+
* Main-agent spawns set `depth: 0`, `parentSubagentId: null`,
|
|
39
|
+
* `parentRunId: null`, `ancestorSubagentIds: []`. Subagent spawns set
|
|
40
|
+
* the caller's own run context so cycle / depth checks apply.
|
|
41
|
+
*/
|
|
42
|
+
export interface KannaMcpDelegationContext {
|
|
43
|
+
parentSubagentId: string | null
|
|
44
|
+
parentRunId: string | null
|
|
45
|
+
ancestorSubagentIds: string[]
|
|
46
|
+
depth: number
|
|
47
|
+
getParentUserMessageId: () => string | null
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface KannaMcpArgs extends OfferDownloadArgs {
|
|
51
|
+
chatId?: string
|
|
52
|
+
sessionId?: string
|
|
53
|
+
tunnelGateway?: TunnelGateway | null
|
|
54
|
+
toolCallback?: ToolCallbackService
|
|
55
|
+
chatPolicy?: ChatPermissionPolicy
|
|
56
|
+
/** Required for delegate_subagent. Omit when subagent registry is unavailable; the tool will then be hidden from the model. */
|
|
57
|
+
subagentOrchestrator?: SubagentOrchestrator
|
|
58
|
+
/** Required alongside `subagentOrchestrator`. Defaults to a stub returning null when omitted. */
|
|
59
|
+
delegationContext?: KannaMcpDelegationContext
|
|
60
|
+
/**
|
|
61
|
+
* Forces the `ask_user_question` / `exit_plan_mode` shims to register
|
|
62
|
+
* even when `KANNA_MCP_TOOL_CALLBACKS` is unset. The PTY driver sets
|
|
63
|
+
* this because the durable approval protocol is the only host path
|
|
64
|
+
* for interactive tools under PTY (no `canUseTool` hook). Does NOT
|
|
65
|
+
* register the 8 built-in shims — those stay gated on the env flag.
|
|
66
|
+
*/
|
|
67
|
+
forceInteractiveToolCallbacks?: boolean
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ResolvedOfferDownload {
|
|
71
|
+
contentUrl: string
|
|
72
|
+
relativePath: string
|
|
73
|
+
fileName: string
|
|
74
|
+
displayName: string
|
|
75
|
+
size: number
|
|
76
|
+
mimeType: string
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function resolveOfferDownload(
|
|
80
|
+
args: OfferDownloadArgs,
|
|
81
|
+
input: { path: string; label?: string },
|
|
82
|
+
): Promise<{ ok: true; payload: ResolvedOfferDownload } | { ok: false; error: string }> {
|
|
83
|
+
const rawPath = (input.path ?? "").trim()
|
|
84
|
+
if (!rawPath) {
|
|
85
|
+
return { ok: false, error: "path is required" }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const relativePath = path.posix.normalize(rawPath.replaceAll("\\", "/"))
|
|
89
|
+
if (
|
|
90
|
+
!relativePath
|
|
91
|
+
|| relativePath === "."
|
|
92
|
+
|| relativePath.startsWith("../")
|
|
93
|
+
|| relativePath.includes("/../")
|
|
94
|
+
|| path.posix.isAbsolute(relativePath)
|
|
95
|
+
) {
|
|
96
|
+
return { ok: false, error: `Invalid project file path: ${input.path}` }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const projectRoot = path.resolve(args.localPath)
|
|
100
|
+
const absolutePath = path.resolve(args.localPath, relativePath)
|
|
101
|
+
if (absolutePath !== projectRoot && !absolutePath.startsWith(`${projectRoot}${path.sep}`)) {
|
|
102
|
+
return { ok: false, error: "Path resolves outside the project root" }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const info = await statPathOrNull(absolutePath)
|
|
106
|
+
if (!info) {
|
|
107
|
+
return { ok: false, error: `File not found: ${relativePath}` }
|
|
108
|
+
}
|
|
109
|
+
if (!info.isFile()) {
|
|
110
|
+
return { ok: false, error: `Not a file: ${relativePath}` }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const fileName = path.posix.basename(relativePath)
|
|
114
|
+
const mimeType = inferProjectFileContentType(fileName)
|
|
115
|
+
const contentUrl = buildProjectFileContentUrl(args.projectId, relativePath)
|
|
116
|
+
if (!contentUrl) {
|
|
117
|
+
return { ok: false, error: "Failed to build project file URL" }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
ok: true,
|
|
122
|
+
payload: {
|
|
123
|
+
contentUrl,
|
|
124
|
+
relativePath,
|
|
125
|
+
fileName,
|
|
126
|
+
displayName: input.label?.trim() || fileName,
|
|
127
|
+
size: info.size,
|
|
128
|
+
mimeType,
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const OFFER_DOWNLOAD_DESCRIPTION = `Offer a file from the user's project workspace as an inline downloadable link in the Kanna chat UI.
|
|
134
|
+
|
|
135
|
+
Use this when you have created or generated a file the user is likely to want to download (build artifact, exported report, generated document, etc.).
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
- path: workspace-relative path to the file (must stay inside the project root)
|
|
139
|
+
- label: optional human-readable label shown next to the download link
|
|
140
|
+
`
|
|
141
|
+
|
|
142
|
+
const EXPOSE_PORT_DESCRIPTION = `Propose a Cloudflare Tunnel for a local port so the user can share or test the running service from outside their machine.
|
|
143
|
+
|
|
144
|
+
Call this proactively right after you start a local dev server, preview server, or any process that listens on a TCP port the user might want to expose. Pass the exact port the service is listening on. The user always sees a confirmation card in the Kanna chat UI and decides whether to accept; this tool only proposes — it never starts the tunnel itself.
|
|
145
|
+
|
|
146
|
+
Skip calling for: one-off scripts that exit immediately, internal-only databases, processes that don't accept HTTP, or ports the user has explicitly said not to expose.
|
|
147
|
+
|
|
148
|
+
Returns one of:
|
|
149
|
+
- proposed: a confirmation card was shown to the user (always-ask mode)
|
|
150
|
+
- auto_exposed: the user enabled auto-expose; cloudflared has been spawned and a URL will appear in the tunnel card shortly
|
|
151
|
+
- already_live: a tunnel for this port is already proposed or active in this chat
|
|
152
|
+
- disabled: the user has not enabled Cloudflare Tunnel in settings
|
|
153
|
+
- invalid_port: the port is outside the valid range
|
|
154
|
+
`
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Adapt the SDK MCP `extra` argument into a per-entry callback that emits
|
|
158
|
+
* `notifications/progress` for each persisted subagent transcript entry.
|
|
159
|
+
*
|
|
160
|
+
* The Claude CLI MCP client arms a transport-error watchdog (`armedAt`)
|
|
161
|
+
* on any control-channel error and, after 90s without recovery, drops
|
|
162
|
+
* the in-flight tool call with `"transport dropped mid-call; response
|
|
163
|
+
* for tool X was lost"`. The progress callback on the CLI side resets
|
|
164
|
+
* `armedAt = 0`, so a single notification every few seconds keeps a
|
|
165
|
+
* multi-minute `delegate_subagent` call alive even if the underlying
|
|
166
|
+
* transport blips. Returns `undefined` (no-op) when the caller did not
|
|
167
|
+
* supply a `progressToken` or the MCP runtime did not expose
|
|
168
|
+
* `sendNotification`.
|
|
169
|
+
*/
|
|
170
|
+
export function buildDelegateProgressEmitter(
|
|
171
|
+
extra: unknown,
|
|
172
|
+
): ((entry: TranscriptEntry) => void) | undefined {
|
|
173
|
+
if (extra == null || typeof extra !== "object") return undefined
|
|
174
|
+
const meta = (extra as { _meta?: { progressToken?: string | number } })._meta
|
|
175
|
+
const progressToken = meta?.progressToken
|
|
176
|
+
if (progressToken === undefined) return undefined
|
|
177
|
+
const sendNotification = (extra as {
|
|
178
|
+
sendNotification?: (notification: {
|
|
179
|
+
method: string
|
|
180
|
+
params: Record<string, unknown>
|
|
181
|
+
}) => Promise<void>
|
|
182
|
+
}).sendNotification
|
|
183
|
+
if (typeof sendNotification !== "function") return undefined
|
|
184
|
+
let progress = 0
|
|
185
|
+
return (entry) => {
|
|
186
|
+
progress += 1
|
|
187
|
+
sendNotification({
|
|
188
|
+
method: "notifications/progress",
|
|
189
|
+
params: {
|
|
190
|
+
progressToken,
|
|
191
|
+
progress,
|
|
192
|
+
message: entry.kind === "tool_call"
|
|
193
|
+
? `tool_call:${entry.tool.toolName}`
|
|
194
|
+
: entry.kind,
|
|
195
|
+
},
|
|
196
|
+
}).catch(() => {
|
|
197
|
+
/* notification is advisory; drop on send failure */
|
|
198
|
+
})
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function buildDelegateSubagentToolList(args: {
|
|
203
|
+
orchestrator?: SubagentOrchestrator
|
|
204
|
+
delegationContext?: KannaMcpDelegationContext
|
|
205
|
+
chatId: string | null
|
|
206
|
+
}): SdkMcpToolDefinition<any>[] {
|
|
207
|
+
if (!args.orchestrator || !args.delegationContext || !args.chatId) return []
|
|
208
|
+
const ctx = args.delegationContext
|
|
209
|
+
const chatId = args.chatId
|
|
210
|
+
const delegate = createDelegateSubagentTool({ orchestrator: args.orchestrator })
|
|
211
|
+
return [
|
|
212
|
+
tool(
|
|
213
|
+
delegate.name,
|
|
214
|
+
DELEGATE_SUBAGENT_DESCRIPTION,
|
|
215
|
+
delegate.schema.shape,
|
|
216
|
+
async (input, extra) => {
|
|
217
|
+
const onEntry = buildDelegateProgressEmitter(extra)
|
|
218
|
+
const handlerCtx: DelegateSubagentContext = {
|
|
219
|
+
chatId,
|
|
220
|
+
parentSubagentId: ctx.parentSubagentId,
|
|
221
|
+
parentRunId: ctx.parentRunId,
|
|
222
|
+
ancestorSubagentIds: ctx.ancestorSubagentIds,
|
|
223
|
+
depth: ctx.depth,
|
|
224
|
+
getParentUserMessageId: ctx.getParentUserMessageId,
|
|
225
|
+
onEntry,
|
|
226
|
+
}
|
|
227
|
+
return await delegate.handler(input, handlerCtx)
|
|
228
|
+
},
|
|
229
|
+
),
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function buildKannaMcpTools(args: KannaMcpArgs): SdkMcpToolDefinition<any>[] {
|
|
234
|
+
const tunnelGateway = args.tunnelGateway ?? null
|
|
235
|
+
const chatId = args.chatId ?? null
|
|
236
|
+
const sessionId = args.sessionId ?? ""
|
|
237
|
+
const chatPolicy = args.chatPolicy ?? POLICY_DEFAULT
|
|
238
|
+
const cwd = args.localPath
|
|
239
|
+
|
|
240
|
+
const tools: SdkMcpToolDefinition<any>[] = [
|
|
241
|
+
tool(
|
|
242
|
+
"offer_download",
|
|
243
|
+
OFFER_DOWNLOAD_DESCRIPTION,
|
|
244
|
+
{
|
|
245
|
+
path: z.string().describe("Workspace-relative path to the file to offer for download"),
|
|
246
|
+
label: z.string().optional().describe("Optional human-readable label for the download link"),
|
|
247
|
+
},
|
|
248
|
+
async (input) => {
|
|
249
|
+
const result = await resolveOfferDownload(args, input)
|
|
250
|
+
if (!result.ok) {
|
|
251
|
+
return {
|
|
252
|
+
content: [{ type: "text" as const, text: result.error }],
|
|
253
|
+
isError: true,
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
content: [{
|
|
258
|
+
type: "text" as const,
|
|
259
|
+
text: JSON.stringify({ kind: "download_offer", ...result.payload }),
|
|
260
|
+
}],
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
),
|
|
264
|
+
...buildDelegateSubagentToolList({
|
|
265
|
+
orchestrator: args.subagentOrchestrator,
|
|
266
|
+
delegationContext: args.delegationContext,
|
|
267
|
+
chatId: chatId,
|
|
268
|
+
}),
|
|
269
|
+
tool(
|
|
270
|
+
"expose_port",
|
|
271
|
+
EXPOSE_PORT_DESCRIPTION,
|
|
272
|
+
{
|
|
273
|
+
port: z.number().int().min(1).max(65535).describe("Local TCP port the running service is listening on"),
|
|
274
|
+
reason: z.string().optional().describe("Brief description of the service (e.g. \"vite dev server\") shown to the user"),
|
|
275
|
+
},
|
|
276
|
+
async (input) => {
|
|
277
|
+
if (!tunnelGateway || !chatId) {
|
|
278
|
+
return {
|
|
279
|
+
content: [{ type: "text" as const, text: "expose_port is not available in this context" }],
|
|
280
|
+
isError: true,
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const outcome = await tunnelGateway.proposeFromTool({ chatId, port: input.port })
|
|
284
|
+
if (outcome.status === "invalid_port") {
|
|
285
|
+
return {
|
|
286
|
+
content: [{ type: "text" as const, text: outcome.reason }],
|
|
287
|
+
isError: true,
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (outcome.status === "no_tunnel" || outcome.status === "error") {
|
|
291
|
+
return {
|
|
292
|
+
content: [{ type: "text" as const, text: outcome.reason }],
|
|
293
|
+
isError: true,
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
content: [{
|
|
298
|
+
type: "text" as const,
|
|
299
|
+
text: JSON.stringify({ kind: "expose_port_result", ...outcome, reason: input.reason ?? null }),
|
|
300
|
+
}],
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
),
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
// Two independent gates:
|
|
307
|
+
// • interactive (ask_user_question / exit_plan_mode): on when the env
|
|
308
|
+
// flag is set OR the caller forces it. The PTY driver forces it
|
|
309
|
+
// because the durable approval protocol is the only host path for
|
|
310
|
+
// interactive tools under PTY (no canUseTool hook). See issue #215.
|
|
311
|
+
// • built-in shims (read/glob/grep/bash/edit/write/webfetch/websearch):
|
|
312
|
+
// gated on the env flag ONLY. Never force-registered — under PTY they
|
|
313
|
+
// would duplicate the native CLI built-ins and route every bash/edit
|
|
314
|
+
// through an approval prompt, contradicting --dangerously-skip-permissions.
|
|
315
|
+
const envCallbacksEnabled = process.env.KANNA_MCP_TOOL_CALLBACKS === "1"
|
|
316
|
+
const interactiveEnabled =
|
|
317
|
+
(envCallbacksEnabled || args.forceInteractiveToolCallbacks === true) && Boolean(args.toolCallback)
|
|
318
|
+
const builtinShimsEnabled = envCallbacksEnabled && Boolean(args.toolCallback)
|
|
319
|
+
|
|
320
|
+
if (interactiveEnabled && args.toolCallback) {
|
|
321
|
+
const askTool = createAskUserQuestionTool({ toolCallback: args.toolCallback })
|
|
322
|
+
const exitPlanTool = createExitPlanModeTool({ toolCallback: args.toolCallback })
|
|
323
|
+
|
|
324
|
+
tools.push(
|
|
325
|
+
tool(
|
|
326
|
+
askTool.name,
|
|
327
|
+
"Ask the user a question with multiple choice answers",
|
|
328
|
+
askTool.schema.shape,
|
|
329
|
+
async (input, extra) => {
|
|
330
|
+
const requestId = (extra as { requestId?: string | number } | undefined)?.requestId
|
|
331
|
+
const toolUseId = requestId != null ? String(requestId) : randomUUID()
|
|
332
|
+
return await askTool.handler(input, {
|
|
333
|
+
chatId: chatId ?? "",
|
|
334
|
+
sessionId,
|
|
335
|
+
toolUseId,
|
|
336
|
+
cwd,
|
|
337
|
+
chatPolicy,
|
|
338
|
+
})
|
|
339
|
+
},
|
|
340
|
+
),
|
|
341
|
+
tool(
|
|
342
|
+
exitPlanTool.name,
|
|
343
|
+
"Submit a plan for user approval before continuing",
|
|
344
|
+
exitPlanTool.schema.shape,
|
|
345
|
+
async (input, extra) => {
|
|
346
|
+
const requestId = (extra as { requestId?: string | number } | undefined)?.requestId
|
|
347
|
+
const toolUseId = requestId != null ? String(requestId) : randomUUID()
|
|
348
|
+
return await exitPlanTool.handler(input, {
|
|
349
|
+
chatId: chatId ?? "",
|
|
350
|
+
sessionId,
|
|
351
|
+
toolUseId,
|
|
352
|
+
cwd,
|
|
353
|
+
chatPolicy,
|
|
354
|
+
})
|
|
355
|
+
},
|
|
356
|
+
),
|
|
357
|
+
)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (builtinShimsEnabled && args.toolCallback) {
|
|
361
|
+
const readTool = createReadTool({ toolCallback: args.toolCallback })
|
|
362
|
+
const globTool = createGlobTool({ toolCallback: args.toolCallback })
|
|
363
|
+
const grepTool = createGrepTool({ toolCallback: args.toolCallback })
|
|
364
|
+
const bashTool = createBashTool({ toolCallback: args.toolCallback })
|
|
365
|
+
const editTool = createEditTool({ toolCallback: args.toolCallback })
|
|
366
|
+
const writeTool = createWriteTool({ toolCallback: args.toolCallback })
|
|
367
|
+
const webfetchTool = createWebFetchTool({ toolCallback: args.toolCallback })
|
|
368
|
+
const websearchTool = createWebSearchTool({ toolCallback: args.toolCallback })
|
|
369
|
+
|
|
370
|
+
function registerShim<I>(shim: {
|
|
371
|
+
name: string
|
|
372
|
+
schema: { shape: Record<string, z.ZodTypeAny> }
|
|
373
|
+
handler: (input: I, ctx: import("./tools/tool-callback-shim").ToolHandlerContext) => Promise<import("./tools/tool-callback-shim").ToolHandlerResult>
|
|
374
|
+
}) {
|
|
375
|
+
tools.push(
|
|
376
|
+
tool(
|
|
377
|
+
shim.name,
|
|
378
|
+
`Kanna built-in replacement for ${shim.name}.`,
|
|
379
|
+
shim.schema.shape,
|
|
380
|
+
async (input, extra) => {
|
|
381
|
+
const requestId = (extra as { requestId?: string | number } | undefined)?.requestId
|
|
382
|
+
const toolUseId = requestId != null ? String(requestId) : randomUUID()
|
|
383
|
+
return await shim.handler(input as I, {
|
|
384
|
+
chatId: chatId ?? "",
|
|
385
|
+
sessionId,
|
|
386
|
+
toolUseId,
|
|
387
|
+
cwd,
|
|
388
|
+
chatPolicy,
|
|
389
|
+
})
|
|
390
|
+
},
|
|
391
|
+
),
|
|
392
|
+
)
|
|
393
|
+
}
|
|
394
|
+
registerShim(readTool)
|
|
395
|
+
registerShim(globTool)
|
|
396
|
+
registerShim(grepTool)
|
|
397
|
+
registerShim(bashTool)
|
|
398
|
+
registerShim(editTool)
|
|
399
|
+
registerShim(writeTool)
|
|
400
|
+
registerShim(webfetchTool)
|
|
401
|
+
registerShim(websearchTool)
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return tools
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export function createKannaMcpServer(args: KannaMcpArgs) {
|
|
408
|
+
return createSdkMcpServer({
|
|
409
|
+
name: KANNA_MCP_SERVER_NAME,
|
|
410
|
+
tools: buildKannaMcpTools(args),
|
|
411
|
+
})
|
|
412
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Subagent } from "../../shared/types"
|
|
2
|
+
import { createAgentMentionRegex } from "../../shared/mention-pattern"
|
|
3
|
+
|
|
4
|
+
export type ParsedMention =
|
|
5
|
+
| { kind: "subagent"; subagentId: string; raw: string }
|
|
6
|
+
| { kind: "unknown-subagent"; name: string; raw: string }
|
|
7
|
+
|
|
8
|
+
export function parseMentions(text: string, subagents: Subagent[]): ParsedMention[] {
|
|
9
|
+
const subagentsByName = new Map<string, Subagent>()
|
|
10
|
+
for (const subagent of subagents) {
|
|
11
|
+
subagentsByName.set(subagent.name.toLowerCase(), subagent)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const mentions: ParsedMention[] = []
|
|
15
|
+
for (const match of text.matchAll(createAgentMentionRegex())) {
|
|
16
|
+
const name = match[2]
|
|
17
|
+
if (!name) continue
|
|
18
|
+
const raw = `@agent/${name}`
|
|
19
|
+
const subagent = subagentsByName.get(name.toLowerCase())
|
|
20
|
+
mentions.push(subagent
|
|
21
|
+
? { kind: "subagent", subagentId: subagent.id, raw }
|
|
22
|
+
: { kind: "unknown-subagent", name, raw })
|
|
23
|
+
}
|
|
24
|
+
return mentions
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { homedir } from "node:os"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
|
|
4
|
+
export function resolveLocalPath(localPath: string) {
|
|
5
|
+
const trimmed = localPath.trim()
|
|
6
|
+
if (!trimmed) {
|
|
7
|
+
throw new Error("Project path is required")
|
|
8
|
+
}
|
|
9
|
+
if (trimmed === "~") {
|
|
10
|
+
return homedir()
|
|
11
|
+
}
|
|
12
|
+
if (trimmed.startsWith("~/")) {
|
|
13
|
+
return path.join(homedir(), trimmed.slice(2))
|
|
14
|
+
}
|
|
15
|
+
return path.resolve(trimmed)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getProjectUploadDir(localPath: string) {
|
|
19
|
+
return path.join(resolveLocalPath(localPath), ".kanna", "uploads")
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function getProjectExportDir(localPath: string) {
|
|
23
|
+
return path.join(resolveLocalPath(localPath), ".kanna", "exports")
|
|
24
|
+
}
|