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,56 @@
|
|
|
1
|
+
import { describe, test, expect, afterEach } from "bun:test"
|
|
2
|
+
import { NatsServer } from "@lagz0ne/nats-embedded"
|
|
3
|
+
import { NatsConnector } from "./nats-connector"
|
|
4
|
+
|
|
5
|
+
describe("NatsConnector", () => {
|
|
6
|
+
let server: NatsServer | null = null
|
|
7
|
+
let connector: NatsConnector | null = null
|
|
8
|
+
|
|
9
|
+
afterEach(async () => {
|
|
10
|
+
await connector?.dispose()
|
|
11
|
+
connector = null
|
|
12
|
+
await server?.stop()
|
|
13
|
+
server = null
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test("connects to a running NATS server", async () => {
|
|
17
|
+
const token = "test-" + Date.now()
|
|
18
|
+
server = await NatsServer.start({ websocket: true, jetstream: true, token })
|
|
19
|
+
connector = await NatsConnector.connect({
|
|
20
|
+
natsUrl: server.url,
|
|
21
|
+
natsWsUrl: server.wsUrl!,
|
|
22
|
+
natsWsPort: server.wsPort!,
|
|
23
|
+
token,
|
|
24
|
+
})
|
|
25
|
+
expect(connector.nc).toBeDefined()
|
|
26
|
+
expect(connector.natsUrl).toBe(server.url)
|
|
27
|
+
expect(connector.natsWsUrl).toBe(server.wsUrl!)
|
|
28
|
+
expect(connector.natsWsPort).toBe(server.wsPort!)
|
|
29
|
+
expect(connector.authToken).toBe(token)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test("dispose drains the connection", async () => {
|
|
33
|
+
server = await NatsServer.start({ token: "t" })
|
|
34
|
+
connector = await NatsConnector.connect({
|
|
35
|
+
natsUrl: server.url,
|
|
36
|
+
natsWsUrl: server.wsUrl ?? "",
|
|
37
|
+
natsWsPort: server.wsPort ?? 0,
|
|
38
|
+
token: "t",
|
|
39
|
+
})
|
|
40
|
+
await connector.dispose()
|
|
41
|
+
// After dispose, connection should be closed
|
|
42
|
+
expect(connector.nc.isClosed()).toBe(true)
|
|
43
|
+
connector = null // prevent double-dispose in afterEach
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test("connect without token works on unauthenticated server", async () => {
|
|
47
|
+
server = await NatsServer.start({})
|
|
48
|
+
connector = await NatsConnector.connect({
|
|
49
|
+
natsUrl: server.url,
|
|
50
|
+
natsWsUrl: "",
|
|
51
|
+
natsWsPort: 0,
|
|
52
|
+
})
|
|
53
|
+
expect(connector.nc).toBeDefined()
|
|
54
|
+
expect(connector.authToken).toBeUndefined()
|
|
55
|
+
})
|
|
56
|
+
})
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { connect, type NatsConnection } from "@nats-io/transport-node"
|
|
2
|
+
import { LOG_PREFIX } from "../shared/branding"
|
|
3
|
+
|
|
4
|
+
export interface NatsConnectorOptions {
|
|
5
|
+
natsUrl: string
|
|
6
|
+
natsWsUrl: string
|
|
7
|
+
natsWsPort: number
|
|
8
|
+
token?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class NatsConnector {
|
|
12
|
+
readonly natsUrl: string
|
|
13
|
+
readonly natsWsUrl: string
|
|
14
|
+
readonly natsWsPort: number
|
|
15
|
+
readonly authToken: string | undefined
|
|
16
|
+
readonly nc: NatsConnection
|
|
17
|
+
private disposed = false
|
|
18
|
+
|
|
19
|
+
private constructor(
|
|
20
|
+
connection: NatsConnection,
|
|
21
|
+
natsUrl: string,
|
|
22
|
+
natsWsUrl: string,
|
|
23
|
+
natsWsPort: number,
|
|
24
|
+
token?: string
|
|
25
|
+
) {
|
|
26
|
+
this.nc = connection
|
|
27
|
+
this.natsUrl = natsUrl
|
|
28
|
+
this.natsWsUrl = natsWsUrl
|
|
29
|
+
this.natsWsPort = natsWsPort
|
|
30
|
+
this.authToken = token
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static async connect(options: NatsConnectorOptions): Promise<NatsConnector> {
|
|
34
|
+
const tokenOpt = options.token ? { token: options.token } : undefined
|
|
35
|
+
const connection = await connect({
|
|
36
|
+
servers: options.natsUrl,
|
|
37
|
+
...tokenOpt,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
console.warn(LOG_PREFIX, `NATS connector connected — ${options.natsUrl}`)
|
|
41
|
+
|
|
42
|
+
return new NatsConnector(
|
|
43
|
+
connection,
|
|
44
|
+
options.natsUrl,
|
|
45
|
+
options.natsWsUrl,
|
|
46
|
+
options.natsWsPort,
|
|
47
|
+
options.token
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async dispose(): Promise<void> {
|
|
52
|
+
if (this.disposed) return
|
|
53
|
+
this.disposed = true
|
|
54
|
+
try {
|
|
55
|
+
await this.nc.drain()
|
|
56
|
+
} catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
58
|
+
console.warn(LOG_PREFIX, `NATS connection drain failed: ${message}`)
|
|
59
|
+
}
|
|
60
|
+
console.warn(LOG_PREFIX, "NATS connector disconnected")
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getReadiness() {
|
|
64
|
+
return {
|
|
65
|
+
ok: !this.disposed && !this.nc.isClosed(),
|
|
66
|
+
natsUrl: this.natsUrl,
|
|
67
|
+
natsWsUrl: this.natsWsUrl,
|
|
68
|
+
natsWsPort: this.natsWsPort,
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from "bun:test"
|
|
2
|
+
import { connect } from "@nats-io/transport-node"
|
|
3
|
+
import { NatsDaemonManager } from "./nats-daemon-manager"
|
|
4
|
+
|
|
5
|
+
describe("NatsDaemonManager", () => {
|
|
6
|
+
let manager: NatsDaemonManager | null = null
|
|
7
|
+
let prevAuthMode: string | undefined
|
|
8
|
+
|
|
9
|
+
// These tests exercise the token-mode daemon path (they pass a token and
|
|
10
|
+
// connect with it). The server default is now NATS_AUTH_MODE=callout, which
|
|
11
|
+
// spawns the callout daemon (requires NATS_DATA_DIR + key material); the
|
|
12
|
+
// callout daemon path is covered by src/nats/auth-callout/callout.integration.test.ts.
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
prevAuthMode = process.env.NATS_AUTH_MODE
|
|
15
|
+
process.env.NATS_AUTH_MODE = "token"
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
afterEach(async () => {
|
|
19
|
+
await manager?.dispose()
|
|
20
|
+
manager = null
|
|
21
|
+
if (prevAuthMode === undefined) delete process.env.NATS_AUTH_MODE
|
|
22
|
+
else process.env.NATS_AUTH_MODE = prevAuthMode
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test("ensureDaemon starts daemon and returns connection info", async () => {
|
|
26
|
+
manager = NatsDaemonManager.embedded()
|
|
27
|
+
const info = await manager.ensureDaemon({ token: "test-" + Date.now() })
|
|
28
|
+
expect(info).toHaveProperty("url")
|
|
29
|
+
expect(info).toHaveProperty("wsUrl")
|
|
30
|
+
expect(info).toHaveProperty("wsPort")
|
|
31
|
+
expect(info).toHaveProperty("pid")
|
|
32
|
+
expect(info.url).toMatch(/^nats:\/\//)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test("ensureDaemon returns working NATS connection", async () => {
|
|
36
|
+
const token = "test-" + Date.now()
|
|
37
|
+
manager = NatsDaemonManager.embedded()
|
|
38
|
+
const info = await manager.ensureDaemon({ token })
|
|
39
|
+
|
|
40
|
+
const nc = await connect({ servers: info.url, token })
|
|
41
|
+
expect(nc).toBeDefined()
|
|
42
|
+
await nc.drain()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test("ensureDaemon reuses existing daemon on second call", async () => {
|
|
46
|
+
const token = "test-" + Date.now()
|
|
47
|
+
manager = NatsDaemonManager.embedded()
|
|
48
|
+
const info1 = await manager.ensureDaemon({ token })
|
|
49
|
+
const info2 = await manager.ensureDaemon({ token })
|
|
50
|
+
expect(info1.pid).toBe(info2.pid)
|
|
51
|
+
expect(info1.url).toBe(info2.url)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
test("dispose kills the daemon process", async () => {
|
|
55
|
+
const token = "test-" + Date.now()
|
|
56
|
+
manager = NatsDaemonManager.embedded()
|
|
57
|
+
const info = await manager.ensureDaemon({ token })
|
|
58
|
+
const pid = info.pid
|
|
59
|
+
|
|
60
|
+
await manager.dispose()
|
|
61
|
+
manager = null
|
|
62
|
+
|
|
63
|
+
// Give OS time to reap
|
|
64
|
+
await new Promise(r => setTimeout(r, 200))
|
|
65
|
+
|
|
66
|
+
// Process should be dead
|
|
67
|
+
try {
|
|
68
|
+
process.kill(pid, 0) // signal 0 = check if alive
|
|
69
|
+
// If we get here, process is still alive — fail
|
|
70
|
+
expect(true).toBe(false)
|
|
71
|
+
} catch {
|
|
72
|
+
// Expected — process is dead
|
|
73
|
+
expect(true).toBe(true)
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { LOG_PREFIX } from "../shared/branding"
|
|
2
|
+
|
|
3
|
+
export interface NatsDaemonInfo {
|
|
4
|
+
url: string
|
|
5
|
+
wsUrl: string
|
|
6
|
+
wsPort: number
|
|
7
|
+
pid: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface NatsDaemonReadiness extends NatsDaemonInfo {
|
|
11
|
+
ok: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class NatsDaemonManager {
|
|
15
|
+
private daemonProcess: ReturnType<typeof Bun.spawn> | null = null
|
|
16
|
+
private info: NatsDaemonInfo | null = null
|
|
17
|
+
private readonly external: boolean
|
|
18
|
+
|
|
19
|
+
private constructor(external: boolean) {
|
|
20
|
+
this.external = external
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Create a manager that spawns and owns the NATS daemon process. */
|
|
24
|
+
static embedded(): NatsDaemonManager {
|
|
25
|
+
return new NatsDaemonManager(false)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Create a manager that connects to an externally-managed NATS daemon (e.g. separate systemd unit). */
|
|
29
|
+
static fromExternal(opts: { natsUrl: string; wsPort: number }): NatsDaemonManager {
|
|
30
|
+
const mgr = new NatsDaemonManager(true)
|
|
31
|
+
const url = new URL(opts.natsUrl)
|
|
32
|
+
mgr.info = {
|
|
33
|
+
url: opts.natsUrl,
|
|
34
|
+
wsUrl: `ws://${url.hostname}:${opts.wsPort}`,
|
|
35
|
+
wsPort: opts.wsPort,
|
|
36
|
+
pid: 0, // external — no PID to track
|
|
37
|
+
}
|
|
38
|
+
console.warn(LOG_PREFIX, `Connected to external NATS — url: ${opts.natsUrl}, ws: ${opts.wsPort}`)
|
|
39
|
+
return mgr
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async ensureDaemon(options: {
|
|
43
|
+
token: string
|
|
44
|
+
host?: string
|
|
45
|
+
}): Promise<NatsDaemonInfo> {
|
|
46
|
+
if (this.external && this.info) return this.info
|
|
47
|
+
|
|
48
|
+
// Reuse if already running and alive
|
|
49
|
+
if (this.info && this.daemonProcess) {
|
|
50
|
+
try {
|
|
51
|
+
process.kill(this.info.pid, 0) // check alive
|
|
52
|
+
return this.info
|
|
53
|
+
} catch {
|
|
54
|
+
// Process died, restart
|
|
55
|
+
this.daemonProcess = null
|
|
56
|
+
this.info = null
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const authMode = process.env.NATS_AUTH_MODE ?? "callout"
|
|
61
|
+
const isCallout = authMode === "callout"
|
|
62
|
+
|
|
63
|
+
const daemonScript = isCallout
|
|
64
|
+
? new URL("../nats/nats-daemon-callout.ts", import.meta.url).pathname
|
|
65
|
+
: new URL("../nats/nats-daemon.ts", import.meta.url).pathname
|
|
66
|
+
|
|
67
|
+
const {
|
|
68
|
+
NATS_DATA_DIR: natsDataDir,
|
|
69
|
+
NATS_URL: _natsUrl,
|
|
70
|
+
NATS_MODE: _natsMode,
|
|
71
|
+
NATS_WS_PORT: _natsWsPort,
|
|
72
|
+
NATS_PORT: natsPort,
|
|
73
|
+
NATS_STORE_DIR: _natsStoreDir,
|
|
74
|
+
NATS_HTTP_PORT: _natsHttpPort,
|
|
75
|
+
...spawnEnv
|
|
76
|
+
} = process.env
|
|
77
|
+
|
|
78
|
+
const child = Bun.spawn(["bun", "run", daemonScript], {
|
|
79
|
+
env: {
|
|
80
|
+
...spawnEnv,
|
|
81
|
+
// In callout mode the daemon reads the token secret from disk; NATS_TOKEN
|
|
82
|
+
// is unused by the callout child but harmless to pass. In token mode it
|
|
83
|
+
// is the shared auth token.
|
|
84
|
+
NATS_TOKEN: options.token,
|
|
85
|
+
...(options.host ? { NATS_HOST: options.host } : {}),
|
|
86
|
+
// Callout mode: pass NATS_DATA_DIR so the child can load keys + secret.
|
|
87
|
+
// Token mode: strip it (was previous behaviour, preserve for compat).
|
|
88
|
+
...(isCallout && natsDataDir ? { NATS_DATA_DIR: natsDataDir } : {}),
|
|
89
|
+
// Pin the NATS TCP port when NATS_PORT is set, so a paired runner's stored
|
|
90
|
+
// credential (nats://host:port) survives server restarts instead of being
|
|
91
|
+
// invalidated by a new ephemeral port each boot. Unset => daemon picks an
|
|
92
|
+
// ephemeral port as before. (decision: docs/stories/nats-port-pin)
|
|
93
|
+
...(natsPort ? { NATS_PORT: natsPort } : {}),
|
|
94
|
+
},
|
|
95
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
// Read JSON info from stdout
|
|
99
|
+
const reader = child.stdout.getReader()
|
|
100
|
+
const { value } = await reader.read()
|
|
101
|
+
if (!value) {
|
|
102
|
+
child.kill("SIGTERM")
|
|
103
|
+
throw new Error("NATS daemon produced no output")
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const text = new TextDecoder().decode(value).trim()
|
|
107
|
+
let info: NatsDaemonInfo
|
|
108
|
+
try {
|
|
109
|
+
info = JSON.parse(text) as NatsDaemonInfo
|
|
110
|
+
} catch (error) {
|
|
111
|
+
child.kill("SIGTERM")
|
|
112
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
113
|
+
throw new Error(`Failed to parse NATS daemon output: ${message}`)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.daemonProcess = child
|
|
117
|
+
this.info = info
|
|
118
|
+
|
|
119
|
+
// Observability (decision 0012): forward the daemon child's stderr (which now
|
|
120
|
+
// carries the nats-server runtime logs) to this process's console, so it
|
|
121
|
+
// reaches VictoriaLogs via the console tee. Previously inherited to the
|
|
122
|
+
// terminal only, leaving the NATS layer invisible in the log store.
|
|
123
|
+
void (async () => {
|
|
124
|
+
try {
|
|
125
|
+
const decoder = new TextDecoder()
|
|
126
|
+
let buf = ""
|
|
127
|
+
for await (const chunk of child.stderr as unknown as AsyncIterable<Uint8Array>) {
|
|
128
|
+
buf += decoder.decode(chunk)
|
|
129
|
+
const lines = buf.split("\n")
|
|
130
|
+
buf = lines.pop() ?? ""
|
|
131
|
+
for (const line of lines) {
|
|
132
|
+
if (line.trim()) console.warn("[nats-daemon]", line)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
} catch {
|
|
136
|
+
// daemon exited or stderr closed — nothing to forward
|
|
137
|
+
}
|
|
138
|
+
})()
|
|
139
|
+
|
|
140
|
+
console.warn(LOG_PREFIX, `NATS daemon started — pid: ${info.pid}, url: ${info.url}`)
|
|
141
|
+
|
|
142
|
+
return info
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
getReadiness(): NatsDaemonReadiness | null {
|
|
146
|
+
if (!this.info) return null
|
|
147
|
+
if (this.external) {
|
|
148
|
+
// External daemon: no PID to check — rely on NATS connection health instead
|
|
149
|
+
return { ...this.info, ok: true }
|
|
150
|
+
}
|
|
151
|
+
let ok = false
|
|
152
|
+
try {
|
|
153
|
+
process.kill(this.info.pid, 0)
|
|
154
|
+
ok = true
|
|
155
|
+
} catch {
|
|
156
|
+
ok = false
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
...this.info,
|
|
160
|
+
ok,
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async dispose(): Promise<void> {
|
|
165
|
+
if (this.external) return // don't kill external daemon
|
|
166
|
+
if (this.daemonProcess) {
|
|
167
|
+
this.daemonProcess.kill("SIGTERM")
|
|
168
|
+
await this.daemonProcess.exited
|
|
169
|
+
this.daemonProcess = null
|
|
170
|
+
this.info = null
|
|
171
|
+
console.warn(LOG_PREFIX, "NATS daemon stopped")
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|