remoteclaw 0.1.0-next.87fb2cd → 0.1.0-next.9f7caba
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accounts-B5BNJ_lk.js +36 -0
- package/dist/accounts-BnkzjNsj.js +32 -0
- package/dist/accounts-DOwpPNpJ.js +47 -0
- package/dist/accounts-Y6fBCsx_.js +272 -0
- package/dist/ack-reactions-DndoGKeN.js +446 -0
- package/dist/ack-reactions-XQPdJAzb.js +446 -0
- package/dist/acp-cli-C2sAKfGR.js +1326 -0
- package/dist/acp-cli-DSmofBAf.js +1320 -0
- package/dist/active-listener-D4pocaWh.js +37 -0
- package/dist/agent-BA1XT2jG.js +728 -0
- package/dist/agent-CyVs7WvP.js +727 -0
- package/dist/agent-helpers-DlqwUqOd.js +606 -0
- package/dist/agent-scope-BDF8U7HM.js +99 -0
- package/dist/agent-scope-Dzc3Pxwr.js +101 -0
- package/dist/agents-GDnr7rw4.js +788 -0
- package/dist/agents.config-Ba4A6sdg.js +116 -0
- package/dist/agents.config-CeN3byLA.js +116 -0
- package/dist/audio-preflight-BFPZB_BA.js +69 -0
- package/dist/audio-preflight-CowiaUIn.js +64 -0
- package/dist/audit-BHUOvUJw.js +3149 -0
- package/dist/audit-oXRhFtwT.js +3149 -0
- package/dist/auth-0nvm_vu0.js +448 -0
- package/dist/auth-DCGEkWB5.js +448 -0
- package/dist/auth-profiles-DJsaxEsz.js +281 -0
- package/dist/banner--jCLPIfU.js +294 -0
- package/dist/binaries-DEBQrQj9.js +13 -0
- package/dist/bindings-C6J0GYWO.js +69 -0
- package/dist/bindings-D0yqi_XP.js +69 -0
- package/dist/bonjour-discovery-JS2eV51P.js +378 -0
- package/dist/bonjour-discovery-hfRH88nW.js +378 -0
- package/dist/boot/handler.js +30 -33
- package/dist/browser-cli-BABicrdh.js +1692 -0
- package/dist/browser-cli-Qa_1PYDv.js +1687 -0
- package/dist/build-info.json +3 -3
- package/dist/call-fGA-3SDL.js +2828 -0
- package/dist/call-jLXWNKPQ.js +2829 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/catalog-BzeCPOus.js +185 -0
- package/dist/catalog-oYxNmkeA.js +185 -0
- package/dist/channel-account-context-BVnz5r1H.js +550 -0
- package/dist/channel-account-context-BcPTaTZb.js +550 -0
- package/dist/channel-activity-BuZbH6WD.js +94 -0
- package/dist/channel-activity-CDdk0baN.js +94 -0
- package/dist/channel-activity-hL4KZrCz.js +292 -0
- package/dist/channel-options-XhTwtBf5.js +33 -0
- package/dist/channel-options-ctxY53Lc.js +32 -0
- package/dist/channel-selection-CMK4YLlO.js +51 -0
- package/dist/channel-selection-_eCHA2U9.js +51 -0
- package/dist/channel-web-BZpC6hhV.js +2134 -0
- package/dist/channel-web-CQ6_87Mm.js +2136 -0
- package/dist/channels-cli-BNl9vUWn.js +1421 -0
- package/dist/channels-cli-DZR57uHI.js +1426 -0
- package/dist/channels-status-issues-CVIgTe2p.js +18 -0
- package/dist/channels-status-issues-DcC43ljl.js +18 -0
- package/dist/chat-envelope-CRqgofiw.js +248 -0
- package/dist/chrome-8vydo3dJ.js +1733 -0
- package/dist/chrome-B_rPhRU5.js +1732 -0
- package/dist/chunk-Cx-gs159.js +341 -0
- package/dist/clack-prompter-BzCKGyUs.js +121 -0
- package/dist/clack-prompter-D7MCzOPT.js +122 -0
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/cli-CpAjRQ-P.js +125 -0
- package/dist/cli-DUXK9wJZ.js +130 -0
- package/dist/clipboard-DIewy_WG.js +31 -0
- package/dist/command-logger/handler.js +1 -1
- package/dist/command-registry-DJNQEtnc.js +215 -0
- package/dist/commands-CX-o6Gzn.js +41 -0
- package/dist/commands-ChY7s9hy.js +41 -0
- package/dist/commands-registry-C-NFTH7P.js +891 -0
- package/dist/commands-registry-C_sd8Lmg.js +892 -0
- package/dist/common-Gc07uSGw.js +156 -0
- package/dist/completion-cli-DhuIE5Go.js +452 -0
- package/dist/completion-cli-DpaiSYzH.js +452 -0
- package/dist/config-BzYPJgWg.js +6919 -0
- package/dist/config-CxSZl93L.js +6917 -0
- package/dist/config-cli-CWeRxEJK.js +241 -0
- package/dist/config-cli-CYQ2SdRU.js +246 -0
- package/dist/config-guard-CYJDizl5.js +97 -0
- package/dist/config-guard-D1Q3ZQbe.js +75 -0
- package/dist/config-validation-BQqpcnJj.js +18 -0
- package/dist/config-validation-DFt9nI1w.js +18 -0
- package/dist/configure-BQw2dIdc.js +891 -0
- package/dist/configure-CXTvRKTB.js +889 -0
- package/dist/constants-CMq8PtHp.js +70 -0
- package/dist/constants-tLOgmZZ1.js +70 -0
- package/dist/control-auth-DWYlgWkO.js +397 -0
- package/dist/control-auth-pDCKtSlm.js +397 -0
- package/dist/control-ui/assets/index-D8iWlx90.js +7738 -0
- package/dist/control-ui/assets/index-D8iWlx90.js.map +1 -0
- package/dist/control-ui/assets/index-D_fjkN3g.css +1 -0
- package/dist/control-ui/index.html +2 -2
- package/dist/control-ui-assets-BQiFibyu.js +186 -0
- package/dist/control-ui-assets-DvQAtkDy.js +186 -0
- package/dist/cron-cli-B06geKKo.js +490 -0
- package/dist/cron-cli-Ct2y3uRB.js +495 -0
- package/dist/daemon-cli-Bt5Kcq3U.js +1197 -0
- package/dist/daemon-cli-Cd0bKq3g.js +1199 -0
- package/dist/daemon-cli.js +29 -69
- package/dist/daemon-install-C3Q8Jcx3.js +55 -0
- package/dist/daemon-install-helpers-B7UgD_mo.js +462 -0
- package/dist/daemon-install-helpers-Crqe5m8B.js +462 -0
- package/dist/daemon-install-oa7I86B_.js +60 -0
- package/dist/deliver-04fDIQb1.js +481 -0
- package/dist/deliver-D4QqtgMj.js +481 -0
- package/dist/delivery-queue-BM3aWQIK.js +244 -0
- package/dist/devices-cli-B7jdFjR6.js +316 -0
- package/dist/devices-cli-D-YMJZn1.js +321 -0
- package/dist/diagnostics-lMmEIZdJ.js +46 -0
- package/dist/diagnostics-rgiIJEXZ.js +46 -0
- package/dist/directory-cli-DWHQF2VD.js +222 -0
- package/dist/directory-cli-D_pT4Je0.js +217 -0
- package/dist/dm-policy-shared-BHRB2wzi.js +22 -0
- package/dist/dm-policy-shared-BTzThzqQ.js +22 -0
- package/dist/dns-cli-BbdtaLDe.js +202 -0
- package/dist/dns-cli-DghCMHgj.js +197 -0
- package/dist/dock-BtLbLczG.js +928 -0
- package/dist/dock-_qq4sBie.js +929 -0
- package/dist/doctor-completion-Cs6sL_IA.js +92 -0
- package/dist/doctor-completion-Cx2tN3vQ.js +92 -0
- package/dist/doctor-config-flow-CilyEptw.js +1934 -0
- package/dist/doctor-config-flow-PRWWIepI.js +1933 -0
- package/dist/enable-BEScoJBZ.js +59 -0
- package/dist/enable-Dt27_ZMm.js +59 -0
- package/dist/entry.js +1 -3
- package/dist/env-DUb5GiQe.js +60 -0
- package/dist/exec-D6PvFXKb.js +164 -0
- package/dist/export-html/template.css +0 -36
- package/dist/export-html/template.js +0 -26
- package/dist/extensionAPI.js +78 -77
- package/dist/fetch-Duxh68Ws.js +67 -0
- package/dist/fs-safe-S3Zvbabd.js +98 -0
- package/dist/gateway-cli-Mo6X1-yC.js +23756 -0
- package/dist/gateway-cli-P6QI1rgs.js +23761 -0
- package/dist/gateway-rpc-AYvHI3Um.js +28 -0
- package/dist/gateway-rpc-Bsz_VM32.js +28 -0
- package/dist/gmail-setup-utils-D_g2PQOA.js +423 -0
- package/dist/gmail-setup-utils-ni_zkMpC.js +422 -0
- package/dist/health-C903Uthy.js +1423 -0
- package/dist/health-vO9pggEr.js +1420 -0
- package/dist/heartbeat-visibility-BHb-m9Fu.js +125 -0
- package/dist/heartbeat-visibility-DgRcKpeV.js +125 -0
- package/dist/helpers-DkUEDuKD.js +10 -0
- package/dist/hook-runner-global-CyIDoO1Z.js +527 -0
- package/dist/hooks-cli-B5oVqP3O.js +1222 -0
- package/dist/hooks-cli-xRelj3fq.js +1217 -0
- package/dist/image-ops-XoE9nn-z.js +354 -0
- package/dist/import-buqTDG9j.js +250 -0
- package/dist/import-j_5xbT7b.js +248 -0
- package/dist/inbound-path-policy-gHabNHWN.js +250 -0
- package/dist/index.js +93 -93
- package/dist/inspect-CV7o4EFm.js +559 -0
- package/dist/inspect-CkEMQlFE.js +559 -0
- package/dist/installs--lvmS_5X.js +325 -0
- package/dist/installs-BA3T7VAz.js +325 -0
- package/dist/ir-BaHZnJJM.js +940 -0
- package/dist/loader-8b9zCJni.js +22621 -0
- package/dist/loader-FZXIZr3R.js +22624 -0
- package/dist/local-roots-CWQNmgUt.js +313 -0
- package/dist/local-roots-DJo8GN9l.js +314 -0
- package/dist/logger-BiVcvOhw.js +49 -0
- package/dist/login-9iJ6gWZk.js +61 -0
- package/dist/login-EqnFreqS.js +62 -0
- package/dist/login-qr-C-iNjUWs.js +327 -0
- package/dist/login-qr-WMfGy6v_.js +322 -0
- package/dist/logs-cli-DFZz2ger.js +238 -0
- package/dist/logs-cli-gX4_EMx4.js +233 -0
- package/dist/markdown-tables-Bry8gXRC.js +29 -0
- package/dist/markdown-tables-vq6-CCk-.js +29 -0
- package/dist/media-C0_rYTSG.js +10455 -0
- package/dist/media-DNm8s1nv.js +940 -0
- package/dist/message-action-names-BMv6kUc8.js +2521 -0
- package/dist/message-action-names-DSrGq84w.js +2521 -0
- package/dist/message-channel-DF4I2vOK.js +91 -0
- package/dist/net-Dl7oQfqm.js +225 -0
- package/dist/node-cli-Cv_2cuVQ.js +24 -0
- package/dist/nodes-cli-Bh5kE7rx.js +1343 -0
- package/dist/nodes-cli-C1nJHXNR.js +1348 -0
- package/dist/note-CAx7Id1-.js +92 -0
- package/dist/note-CpSd8qLI.js +92 -0
- package/dist/npm-registry-spec-CaHkYE_x.js +786 -0
- package/dist/npm-registry-spec-CocXp7ba.js +786 -0
- package/dist/npm-resolution-DQS5ZVqD.js +86 -0
- package/dist/npm-resolution-w3878lun.js +86 -0
- package/dist/onboard-BCal_4Gv.js +407 -0
- package/dist/onboard-YnHnBbNe.js +405 -0
- package/dist/onboard-channels-B87Gz5qD.js +2547 -0
- package/dist/onboard-channels-RBADpVYy.js +2548 -0
- package/dist/onboard-config-DgTNC3ZT.js +39 -0
- package/dist/onboard-config-x054Cod3.js +39 -0
- package/dist/onboard-helpers-CoKiZn8s.js +363 -0
- package/dist/onboard-helpers-DKApDaN3.js +362 -0
- package/dist/onboard-remote-B1RsWyDT.js +127 -0
- package/dist/onboard-remote-BKJJgiD6.js +127 -0
- package/dist/onboarding-B4xiRmix.js +534 -0
- package/dist/onboarding-CBzaoGrg.js +532 -0
- package/dist/onboarding.finalize-CmKkVYDg.js +401 -0
- package/dist/onboarding.finalize-Deue-iB5.js +398 -0
- package/dist/onboarding.gateway-config-CVzVE8Em.js +191 -0
- package/dist/onboarding.gateway-config-Z5kbnB3s.js +198 -0
- package/dist/outbound-BFD5_jba.js +221 -0
- package/dist/outbound-Cnqvf0fO.js +220 -0
- package/dist/outbound-attachment-BnqWk5_B.js +18 -0
- package/dist/outbound-attachment-D05iLA7W.js +18 -0
- package/dist/outbound-attachment-DEyKzFjb.js +18 -0
- package/dist/pairing-cli-Blm356D6.js +122 -0
- package/dist/pairing-cli-h_rEV_wP.js +127 -0
- package/dist/pairing-labels-D1m2vZ16.js +9 -0
- package/dist/pairing-labels-DtbcpHbW.js +9 -0
- package/dist/pairing-store-3EoUkpJk.js +459 -0
- package/dist/pairing-store-DlhFf9Sd.js +460 -0
- package/dist/path-env-BHe995Zs.js +89 -0
- package/dist/path-env-Dt0Pot3Y.js +89 -0
- package/dist/path-safety-BlhW64vx.js +14 -0
- package/dist/plugin-auto-enable-CAXV8TAD.js +301 -0
- package/dist/plugin-auto-enable-SoRyAF_8.js +302 -0
- package/dist/plugin-registry-B3Ovot-q.js +33 -0
- package/dist/plugin-registry-CLs2mk9g.js +33 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner-execution.d.ts +0 -1
- package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +0 -7
- package/dist/plugin-sdk/auto-reply/reply/session-updates.d.ts +0 -10
- package/dist/plugin-sdk/auto-reply/status.d.ts +1 -3
- package/dist/plugin-sdk/config/defaults.d.ts +0 -1
- package/dist/plugin-sdk/config/sessions/types.d.ts +0 -6
- package/dist/plugin-sdk/config/types.agent-defaults.d.ts +21 -101
- package/dist/plugin-sdk/config/zod-schema.agent-defaults.d.ts +8 -63
- package/dist/plugin-sdk/config/zod-schema.agent-runtime.d.ts +2 -10
- package/dist/plugin-sdk/config/zod-schema.agents.d.ts +10 -71
- package/dist/plugin-sdk/config/zod-schema.d.ts +10 -71
- package/dist/plugin-sdk/daemon/constants.d.ts +2 -2
- package/dist/plugin-sdk/index.js +34 -67
- package/dist/plugin-sdk/middleware/channel-bridge.d.ts +4 -0
- package/dist/plugin-sdk/middleware/runtime-factory.d.ts +42 -0
- package/dist/plugin-sdk/middleware/types.d.ts +4 -0
- package/dist/plugins-BtMu6L8i.js +453 -0
- package/dist/plugins-HyUNaoYP.js +455 -0
- package/dist/plugins-cli-Bfz5q2Eu.js +793 -0
- package/dist/plugins-cli-IC5XEIJP.js +798 -0
- package/dist/ports-B5ckNet-.js +96 -0
- package/dist/ports-Bd3hoh8b.js +96 -0
- package/dist/ports-BookgaRI.js +370 -0
- package/dist/ports-UXImZGj6.js +316 -0
- package/dist/program-DHHHUVxq.js +244 -0
- package/dist/program-context-CJ5VtH21.js +474 -0
- package/dist/progress-WaSih6uF.js +124 -0
- package/dist/prompt-select-styled-CvndflSu.js +1647 -0
- package/dist/prompt-select-styled-DRpXaDjZ.js +1650 -0
- package/dist/provider-dispatcher-BtSfIQn3.js +659 -0
- package/dist/provider-dispatcher-CUXHJBTf.js +660 -0
- package/dist/push-apns-BH90TRlq.js +713 -0
- package/dist/pw-ai-89JDYEsx.js +1906 -0
- package/dist/pw-ai-DLMRJYTF.js +1910 -0
- package/dist/qr-cli-B-vXl2tJ.js +352 -0
- package/dist/qr-cli-CPLEROlB.js +347 -0
- package/dist/redact-snapshot-D6v5Y3cH.js +2016 -0
- package/dist/redact-snapshot-DRkh_GXw.js +2016 -0
- package/dist/register.agent-6t54SCKS.js +1043 -0
- package/dist/register.agent-CrTeig6j.js +286 -0
- package/dist/register.configure-CLKO7CBz.js +124 -0
- package/dist/register.configure-CYhzeMUN.js +130 -0
- package/dist/register.import-CwB3CVmx.js +30 -0
- package/dist/register.import-DuMlmKVZ.js +27 -0
- package/dist/register.maintenance-BywvjbLM.js +494 -0
- package/dist/register.maintenance-CmZiik6M.js +497 -0
- package/dist/register.message-C4uOmrmu.js +681 -0
- package/dist/register.message-_xLO9io6.js +686 -0
- package/dist/register.onboard-D70dDDQi.js +262 -0
- package/dist/register.onboard-FyyzQnPJ.js +257 -0
- package/dist/register.setup-D6gZLMvn.js +114 -0
- package/dist/register.setup-PQ_egL-s.js +109 -0
- package/dist/register.status-health-sessions-CPGqgxER.js +668 -0
- package/dist/register.status-health-sessions-D0hrBo9e.js +423 -0
- package/dist/register.subclis-B4JkPvWw.js +267 -0
- package/dist/replies-DwXyI317.js +136 -0
- package/dist/replies-vM-49F7Z.js +136 -0
- package/dist/reply-DO3tkAbl.js +13717 -0
- package/dist/reply-directives-BSHSMfOP.js +182 -0
- package/dist/reply-directives-Bd8xCxw5.js +182 -0
- package/dist/reply-gX7Zk9R8.js +13720 -0
- package/dist/reply-payloads-BzxytLE1.js +527 -0
- package/dist/reply-prefix-BPUsoqRv.js +38 -0
- package/dist/reply-prefix-Cz79Mk_9.js +38 -0
- package/dist/resolve-route-CbxnmqSZ.js +249 -0
- package/dist/resolve-route-RsSFZfEu.js +249 -0
- package/dist/response-prefix-template-BqmQwHFv.js +136 -0
- package/dist/response-prefix-template-oS-m4x5k.js +136 -0
- package/dist/retry-BMUvSHT-.js +77 -0
- package/dist/run-main-D_Yvs705.js +302 -0
- package/dist/runner-BvtNyNts.js +2294 -0
- package/dist/runner-bzffxuwY.js +2294 -0
- package/dist/runtime-guard-B43sm9Yk.js +60 -0
- package/dist/secure-random-CsKN1dAJ.js +44 -0
- package/dist/security-cli-ClDV4uPt.js +484 -0
- package/dist/security-cli-D578rt9i.js +478 -0
- package/dist/send-16QFH4iu.js +492 -0
- package/dist/send-1ch3HEta.js +29 -0
- package/dist/send-B5mtDLya.js +492 -0
- package/dist/send-BA-OQAbS.js +547 -0
- package/dist/send-BAki96aY.js +547 -0
- package/dist/send-BzYdvFV2.js +1775 -0
- package/dist/send-C-Vix83b.js +374 -0
- package/dist/send-C2vPu8jr.js +2245 -0
- package/dist/send-CCpFrPS3.js +426 -0
- package/dist/send-CXoL2Zzi.js +349 -0
- package/dist/send-Cp7xKp6y.js +2245 -0
- package/dist/send-DmR0m7rx.js +332 -0
- package/dist/send-MwvIhKYv.js +11 -0
- package/dist/send-YjzTu9Vf.js +1778 -0
- package/dist/send-jlq_MH8C.js +1174 -0
- package/dist/send-ysN09khs.js +349 -0
- package/dist/server-02ElXzP1.js +200 -0
- package/dist/server-lifecycle-B8xKnzsQ.js +2437 -0
- package/dist/server-lifecycle-CEvhrc0-.js +2437 -0
- package/dist/server-node-events-DU4X16h1.js +398 -0
- package/dist/server-node-events-DrH58PI5.js +393 -0
- package/dist/server-ur9b1Yzm.js +205 -0
- package/dist/service-CiiOMO48.js +670 -0
- package/dist/service-Csa_Zp8l.js +670 -0
- package/dist/session-BtRSSNK_.js +170 -0
- package/dist/session-cost-usage-Cd5Heqqu.js +627 -0
- package/dist/session-cost-usage-CnPZY4id.js +627 -0
- package/dist/session-dirs-DhnTK_rA.js +947 -0
- package/dist/session-dirs-Ii3gbgos.js +947 -0
- package/dist/session-utils-Cs0dVU0y.js +624 -0
- package/dist/session-utils-DuK3Cyeh.js +624 -0
- package/dist/sessions-B3mSpWqX.js +2568 -0
- package/dist/sessions-BKYYI9GY.js +251 -0
- package/dist/status-B2d7Lmls.js +2067 -0
- package/dist/status-DSrcpDkP.js +2071 -0
- package/dist/status.update-BdkJ6oB8.js +79 -0
- package/dist/status.update-Cx6moscN.js +79 -0
- package/dist/store-COXTNbLU.js +53 -0
- package/dist/store-DdUK8zTC.js +2570 -0
- package/dist/subagent-registry-CpaLEiLw.js +4860 -0
- package/dist/subagent-registry-CwfHcOru.js +4858 -0
- package/dist/subsystem-BgxIzx7w.js +1137 -0
- package/dist/system-cli-C_3mdl-Y.js +75 -0
- package/dist/system-cli-Cg3uYNSx.js +70 -0
- package/dist/systemd-C9CRJ1Vh.js +547 -0
- package/dist/systemd-Clsb90Zg.js +547 -0
- package/dist/systemd-linger-CeBq5lTN.js +75 -0
- package/dist/systemd-linger-D70Sc4ia.js +75 -0
- package/dist/table-DVVqt1iT.js +279 -0
- package/dist/tables-6RxRFEl1.js +55 -0
- package/dist/tables-CamcS9gx.js +55 -0
- package/dist/tables-CmbvfFUi.js +55 -0
- package/dist/tailscale-C_8-YaZu.js +230 -0
- package/dist/targets--D1Sgq6T.js +220 -0
- package/dist/targets-BEON1rlZ.js +650 -0
- package/dist/targets-DRd0Al1y.js +650 -0
- package/dist/targets-DzGG0A-J.js +2245 -0
- package/dist/targets-IkURIBGL.js +53 -0
- package/dist/targets-NcJOa0-P.js +2244 -0
- package/dist/tool-images-BLldmoMO.js +263 -0
- package/dist/trash-CLx3VKz0.js +125 -0
- package/dist/tui-BqrwhnqU.js +3392 -0
- package/dist/tui-D1yYpK5L.js +3392 -0
- package/dist/tui-cli-DSoJ3FKB.js +58 -0
- package/dist/tui-cli-DmT2z3u-.js +63 -0
- package/dist/update-Bqxd57w0.js +349 -0
- package/dist/update-DNLS8oRs.js +349 -0
- package/dist/update-cli-CU9ZXQY3.js +1373 -0
- package/dist/update-cli-CVyu40ky.js +1370 -0
- package/dist/usage-DmDjx45Z.js +5337 -0
- package/dist/web-BUwk0Z14.js +3065 -0
- package/dist/web-D0Q23mS6.js +70 -0
- package/dist/web-Dbsn7rM8.js +76 -0
- package/dist/webhooks-cli-CVkKq_i_.js +328 -0
- package/dist/webhooks-cli-DUcnf7Eh.js +333 -0
- package/dist/whatsapp-actions-Drtn7JXc.js +128 -0
- package/dist/whatsapp-actions-OYitul5l.js +122 -0
- package/dist/workspace-CZ3yxyNd.js +447 -0
- package/dist/workspace-DJ7hsM9r.js +449 -0
- package/package.json +3 -3
- package/dist/accounts-B1aJFYXr.js +0 -272
- package/dist/accounts-Bexa80SB.js +0 -32
- package/dist/accounts-Cl_cFv9X.js +0 -47
- package/dist/accounts-Dn9h7HHT.js +0 -36
- package/dist/ack-reactions-B11TAC2D.js +0 -446
- package/dist/ack-reactions-CDUSdN8O.js +0 -446
- package/dist/acp-cli-CA1xMmVo.js +0 -1320
- package/dist/acp-cli-Dr83tqAg.js +0 -1326
- package/dist/active-listener-VzhWW8W6.js +0 -37
- package/dist/agent-CFKgqSEH.js +0 -732
- package/dist/agent-D2RVoS5g.js +0 -731
- package/dist/agent-helpers-D_9mS2Ti.js +0 -606
- package/dist/agent-scope-9WY5O-KK.js +0 -121
- package/dist/agent-scope-C50VuLKh.js +0 -119
- package/dist/agents-BBXCuDMp.js +0 -788
- package/dist/agents.config-BPGQ3Qyn.js +0 -116
- package/dist/agents.config-p3V3b9u6.js +0 -116
- package/dist/audio-preflight-BwmCYeuM.js +0 -64
- package/dist/audio-preflight-Dj6hBcFR.js +0 -69
- package/dist/audit-DhIKIeXD.js +0 -3138
- package/dist/audit-qgtCT3ik.js +0 -3138
- package/dist/auth-C6VDYgb7.js +0 -448
- package/dist/auth-Deh9i9Eg.js +0 -448
- package/dist/auth-profiles-CeDgZz_7.js +0 -281
- package/dist/banner-HCssFZcB.js +0 -294
- package/dist/binaries-X6FW-wD4.js +0 -13
- package/dist/bindings-B582pDIa.js +0 -69
- package/dist/bindings-CRU_udk8.js +0 -69
- package/dist/bonjour-discovery-BtPaR8vb.js +0 -378
- package/dist/bonjour-discovery-DuhiIZZx.js +0 -378
- package/dist/browser-cli-HH45lxP0.js +0 -1687
- package/dist/browser-cli-TB-GNoZq.js +0 -1692
- package/dist/call-BbwtB9Y-.js +0 -2828
- package/dist/call-ByOzoLDI.js +0 -2829
- package/dist/catalog-BY7OPtnz.js +0 -185
- package/dist/catalog-BqO6yem_.js +0 -185
- package/dist/channel-account-context-CjXyzMXE.js +0 -550
- package/dist/channel-account-context-CvIDAtHS.js +0 -550
- package/dist/channel-activity-BeRrcCd8.js +0 -94
- package/dist/channel-activity-DTKGf3j5.js +0 -94
- package/dist/channel-activity-hPfValKp.js +0 -292
- package/dist/channel-options-BLdLu0xk.js +0 -33
- package/dist/channel-options-BQ61blla.js +0 -32
- package/dist/channel-selection-CJXZTxae.js +0 -51
- package/dist/channel-selection-NNPbxnyZ.js +0 -51
- package/dist/channel-web-D1_mlyPg.js +0 -2136
- package/dist/channel-web-DmhVkWbP.js +0 -2134
- package/dist/channels-cli-C4O8pp1S.js +0 -1426
- package/dist/channels-cli-DAu1TXTH.js +0 -1421
- package/dist/channels-status-issues-BDAHISWe.js +0 -18
- package/dist/channels-status-issues-DwRDzwrV.js +0 -18
- package/dist/chat-envelope-el7Uo-Fe.js +0 -248
- package/dist/chrome-CNDtczoM.js +0 -1733
- package/dist/chrome-CdcwZN9t.js +0 -1732
- package/dist/chunk-DAjFKt2g.js +0 -341
- package/dist/clack-prompter-CCFnKP_1.js +0 -121
- package/dist/clack-prompter-CabwzmG4.js +0 -122
- package/dist/cli-BuMX-jRY.js +0 -130
- package/dist/cli-Ci4DmAyk.js +0 -125
- package/dist/clipboard-B2j4qGIl.js +0 -31
- package/dist/command-registry-DxsFXB5t.js +0 -215
- package/dist/commands-C2uNKRTf.js +0 -41
- package/dist/commands-CDonBOrw.js +0 -41
- package/dist/commands-registry-BvESmXoK.js +0 -893
- package/dist/commands-registry-CWJv6xe2.js +0 -892
- package/dist/common-Cp3rsBqx.js +0 -156
- package/dist/completion-cli-B-X5nwdT.js +0 -452
- package/dist/completion-cli-DD3pVpPn.js +0 -452
- package/dist/config-BqY7k-L8.js +0 -6953
- package/dist/config-FHu9Bn4R.js +0 -6951
- package/dist/config-cli-CPH_PfVk.js +0 -241
- package/dist/config-cli-Czvt02PC.js +0 -246
- package/dist/config-guard-5oI2BiSY.js +0 -97
- package/dist/config-guard-cB5a_ANg.js +0 -75
- package/dist/config-validation-BPNyd9_3.js +0 -18
- package/dist/config-validation-J3cJ0OCa.js +0 -18
- package/dist/configure-Bi_9d94n.js +0 -889
- package/dist/configure-DiQaHI3s.js +0 -891
- package/dist/constants-BmRFoHl0.js +0 -67
- package/dist/constants-C9WPAluB.js +0 -67
- package/dist/control-auth-D0tpV3ts.js +0 -397
- package/dist/control-auth-q4zZXaoS.js +0 -397
- package/dist/control-ui/assets/index-B4ZM1lW1.js +0 -7738
- package/dist/control-ui/assets/index-B4ZM1lW1.js.map +0 -1
- package/dist/control-ui/assets/index-PED72sKF.css +0 -1
- package/dist/control-ui-assets-Cx_mw4D0.js +0 -186
- package/dist/control-ui-assets-D4yaD8jm.js +0 -186
- package/dist/cron-cli-Bfh7ftYz.js +0 -495
- package/dist/cron-cli-C8j_uslU.js +0 -490
- package/dist/daemon-cli-DQFZB1yM.js +0 -1197
- package/dist/daemon-cli-lTsfNeDm.js +0 -1199
- package/dist/daemon-install-CcohRvKV.js +0 -55
- package/dist/daemon-install-DrTvAWhM.js +0 -60
- package/dist/daemon-install-helpers-CFGAfRlj.js +0 -462
- package/dist/daemon-install-helpers-DIUzSFG1.js +0 -462
- package/dist/defaults-B5KStIBg.js +0 -7
- package/dist/defaults-xUAL2Z-F.js +0 -7
- package/dist/deliver-912khjLK.js +0 -481
- package/dist/deliver-D78pwuPC.js +0 -481
- package/dist/delivery-queue-CxVRi4tw.js +0 -244
- package/dist/devices-cli-0qDhTgZR.js +0 -316
- package/dist/devices-cli-CstkYXzr.js +0 -321
- package/dist/diagnostics-HGkN467d.js +0 -46
- package/dist/diagnostics-VC0cz7kX.js +0 -46
- package/dist/directory-cli-5YXdoVdn.js +0 -217
- package/dist/directory-cli-duhBZl2c.js +0 -222
- package/dist/dm-policy-shared-BBfEyAN1.js +0 -22
- package/dist/dm-policy-shared-D8lgnmrC.js +0 -22
- package/dist/dns-cli-11CtErVU.js +0 -197
- package/dist/dns-cli-Sr6SB9ei.js +0 -202
- package/dist/dock-BqNINg7k.js +0 -928
- package/dist/dock-O8ArYwed.js +0 -929
- package/dist/doctor-completion-B1UlvZFx.js +0 -92
- package/dist/doctor-completion-C0j7b_f8.js +0 -92
- package/dist/doctor-config-flow-BVkHcvoj.js +0 -1933
- package/dist/doctor-config-flow-BiShkCxs.js +0 -1934
- package/dist/enable-DMIq6evt.js +0 -59
- package/dist/enable-ibNq4UWy.js +0 -59
- package/dist/env-Br2Bl6Ht.js +0 -60
- package/dist/exec-C6ACg_Mn.js +0 -164
- package/dist/fetch-Bmv93nu9.js +0 -67
- package/dist/fs-safe-DkBhNAc3.js +0 -98
- package/dist/gateway-cli-D4cDhvZx.js +0 -23747
- package/dist/gateway-cli-DuMjB8Ff.js +0 -23742
- package/dist/gateway-rpc-B4jTtupy.js +0 -28
- package/dist/gateway-rpc-Dq44SkOv.js +0 -28
- package/dist/gmail-setup-utils-BPmUIqso.js +0 -423
- package/dist/gmail-setup-utils-Cnx8A5pW.js +0 -422
- package/dist/health-SOuaKNRa.js +0 -1420
- package/dist/health-wr-JDHlc.js +0 -1423
- package/dist/heartbeat-visibility-BxkZjE5m.js +0 -125
- package/dist/heartbeat-visibility-ossI_l4t.js +0 -125
- package/dist/helpers-kkeXif0Q.js +0 -10
- package/dist/hook-runner-global-DJ14gXFP.js +0 -527
- package/dist/hooks-cli-BUTtESiX.js +0 -1217
- package/dist/hooks-cli-eqPYjw4l.js +0 -1222
- package/dist/image-ops-DRdKC0uO.js +0 -354
- package/dist/import-Be73VPF2.js +0 -170
- package/dist/import-DQ6NI4Fz.js +0 -168
- package/dist/inbound-path-policy-C_Qo8rqg.js +0 -250
- package/dist/inspect-B1Fq39RC.js +0 -559
- package/dist/inspect-Dt8hogS3.js +0 -559
- package/dist/installs-C8apg11p.js +0 -325
- package/dist/installs-pWdqG8HL.js +0 -325
- package/dist/ir-Ch9FC9Z_.js +0 -940
- package/dist/loader-Cuq-saEl.js +0 -22621
- package/dist/loader-u9FC6kYG.js +0 -22624
- package/dist/local-roots-BrH0Q63K.js +0 -313
- package/dist/local-roots-z2u_s7jG.js +0 -314
- package/dist/logger-pznB_IdT.js +0 -49
- package/dist/login-CYq-visu.js +0 -62
- package/dist/login-DOmWDMeP.js +0 -61
- package/dist/login-qr-CXU0wC5K.js +0 -322
- package/dist/login-qr-D85vVatX.js +0 -327
- package/dist/logs-cli-Cu2S08Y3.js +0 -238
- package/dist/logs-cli-D7ayUvz_.js +0 -233
- package/dist/markdown-tables-hhOWaw8L.js +0 -29
- package/dist/markdown-tables-jrnSPvZ6.js +0 -29
- package/dist/media-DN7yRfrH.js +0 -940
- package/dist/media-DOQIalam.js +0 -10492
- package/dist/message-action-names-Dk9kxwRd.js +0 -2521
- package/dist/message-action-names-EsOcuFpq.js +0 -2521
- package/dist/message-channel-BlYrtmIp.js +0 -91
- package/dist/net-D6D0wgcF.js +0 -225
- package/dist/node-cli-Q2-n3Fgv.js +0 -24
- package/dist/nodes-cli-BDq-4dHm.js +0 -1348
- package/dist/nodes-cli-C2SoKfCv.js +0 -1343
- package/dist/note-DR8A0G5H.js +0 -92
- package/dist/note-Dlv4NmlQ.js +0 -92
- package/dist/npm-registry-spec-COvUzy5J.js +0 -786
- package/dist/npm-registry-spec-Cobb5KYR.js +0 -786
- package/dist/npm-resolution-BmgD7x45.js +0 -86
- package/dist/npm-resolution-DNYcV-Br.js +0 -86
- package/dist/onboard-Dy0q82Mj.js +0 -405
- package/dist/onboard-channels-9QS_7iph.js +0 -2548
- package/dist/onboard-channels-EH2wvu6Y.js +0 -2547
- package/dist/onboard-config-BCTthQ7J.js +0 -24
- package/dist/onboard-config-y-2cgT0V.js +0 -24
- package/dist/onboard-helpers-ChPmr3lh.js +0 -363
- package/dist/onboard-helpers-Jy3345Jk.js +0 -362
- package/dist/onboard-remote-CM6Yl1oL.js +0 -127
- package/dist/onboard-remote-Id80PV28.js +0 -127
- package/dist/onboard-uvDMehqu.js +0 -407
- package/dist/onboarding-BVtzeopT.js +0 -534
- package/dist/onboarding-DlXBAIDc.js +0 -532
- package/dist/onboarding.finalize-Dve-3p-y.js +0 -398
- package/dist/onboarding.finalize-GIK3ktiW.js +0 -401
- package/dist/onboarding.gateway-config-BCV5T35-.js +0 -198
- package/dist/onboarding.gateway-config-DW-09FX5.js +0 -191
- package/dist/outbound-CFfJC1j5.js +0 -220
- package/dist/outbound-CjFRpudN.js +0 -221
- package/dist/outbound-attachment-BxMSma9v.js +0 -18
- package/dist/outbound-attachment-DIiKB_mP.js +0 -18
- package/dist/outbound-attachment-o0seS0CP.js +0 -18
- package/dist/pairing-cli-BeydfoF9.js +0 -122
- package/dist/pairing-cli-GgwzEWJX.js +0 -127
- package/dist/pairing-labels-B_53dY5L.js +0 -9
- package/dist/pairing-labels-BiSZLitI.js +0 -9
- package/dist/pairing-store-BgAv4uN8.js +0 -460
- package/dist/pairing-store-CTkD51uW.js +0 -459
- package/dist/path-env-ErEKbxOI.js +0 -89
- package/dist/path-env-qRJbjJzj.js +0 -89
- package/dist/path-safety-juI2XbO1.js +0 -14
- package/dist/plugin-auto-enable-CloCFyTz.js +0 -302
- package/dist/plugin-auto-enable-DuPS9XiJ.js +0 -301
- package/dist/plugin-registry-D5QsH-IS.js +0 -33
- package/dist/plugin-registry-DnO3azwy.js +0 -33
- package/dist/plugin-sdk/agents/defaults.d.ts +0 -3
- package/dist/plugin-sdk/auto-reply/model-runtime.d.ts +0 -17
- package/dist/plugin-sdk/config/model-input.d.ts +0 -9
- package/dist/plugin-sdk/config/zod-schema.agent-model.d.ts +0 -5
- package/dist/plugin-sdk/sessions/model-overrides.d.ts +0 -14
- package/dist/plugins-BXkDApVh.js +0 -455
- package/dist/plugins-BflZz0sp.js +0 -453
- package/dist/plugins-cli-Cf_RP_bn.js +0 -798
- package/dist/plugins-cli-DmbjYnO9.js +0 -793
- package/dist/ports-DIYJq-SY.js +0 -370
- package/dist/ports-DPL-Pzfh.js +0 -96
- package/dist/ports-NPqtlfp0.js +0 -316
- package/dist/ports-QMI4-F9m.js +0 -96
- package/dist/program-BaATq6CL.js +0 -244
- package/dist/program-context-C7b5MQbg.js +0 -474
- package/dist/progress--dapuyZA.js +0 -124
- package/dist/prompt-select-styled-BAsxl6hj.js +0 -1650
- package/dist/prompt-select-styled-aqjxCbwP.js +0 -1647
- package/dist/provider-dispatcher-B4QMe-I6.js +0 -659
- package/dist/provider-dispatcher-mAkRbPyH.js +0 -660
- package/dist/push-apns-CLmNS5AZ.js +0 -713
- package/dist/pw-ai-DuK87zsJ.js +0 -1906
- package/dist/pw-ai-ulOU3Ya1.js +0 -1910
- package/dist/qr-cli-9WQBnauO.js +0 -352
- package/dist/qr-cli-hSLixZCe.js +0 -347
- package/dist/redact-snapshot-BZYLIqe-.js +0 -2028
- package/dist/redact-snapshot-D2P_lRgf.js +0 -2028
- package/dist/register.agent-CquY2yLI.js +0 -286
- package/dist/register.agent-DZL_fw2K.js +0 -1043
- package/dist/register.configure-C2HjaKO0.js +0 -124
- package/dist/register.configure-D7Di47Lb.js +0 -130
- package/dist/register.import-Bs-UkOs-.js +0 -27
- package/dist/register.import-CaJ0DS1t.js +0 -30
- package/dist/register.maintenance-CslelbHK.js +0 -497
- package/dist/register.maintenance-Dd4fn6oX.js +0 -494
- package/dist/register.message-D2xmx0xB.js +0 -681
- package/dist/register.message-_Q8ehgQP.js +0 -686
- package/dist/register.onboard-BFSwh5g4.js +0 -262
- package/dist/register.onboard-CIupEYmX.js +0 -257
- package/dist/register.setup-7pk1r-54.js +0 -114
- package/dist/register.setup-Bm1Jtx0c.js +0 -109
- package/dist/register.status-health-sessions-C-Pbi-qq.js +0 -669
- package/dist/register.status-health-sessions-Cn4yWBWw.js +0 -423
- package/dist/register.subclis-DXmLofHX.js +0 -267
- package/dist/replies-BKrzM0QI.js +0 -136
- package/dist/replies-BkXDql3c.js +0 -136
- package/dist/reply-DSKC8kyS.js +0 -13897
- package/dist/reply-directives-CBeNSCHL.js +0 -182
- package/dist/reply-directives-CD2WycBM.js +0 -182
- package/dist/reply-n8KWtBQB.js +0 -13900
- package/dist/reply-payloads-CeL_cBnD.js +0 -527
- package/dist/reply-prefix-4zLS7A1Y.js +0 -38
- package/dist/reply-prefix-DBLCYiup.js +0 -38
- package/dist/resolve-route-BDGdM-l3.js +0 -249
- package/dist/resolve-route-CBVbY0xS.js +0 -249
- package/dist/response-prefix-template-CSxp9HN5.js +0 -136
- package/dist/response-prefix-template-up4REfuR.js +0 -136
- package/dist/retry-C81p7BZU.js +0 -77
- package/dist/run-main-CuA7VmAq.js +0 -320
- package/dist/runner-BbLPl1dz.js +0 -2294
- package/dist/runner-z92MWZ3m.js +0 -2294
- package/dist/runtime-guard-DZ_xuCc4.js +0 -60
- package/dist/secure-random-D2IOpBkk.js +0 -44
- package/dist/security-cli-BR3Y1FBJ.js +0 -484
- package/dist/security-cli-DP5QJpa5.js +0 -478
- package/dist/send-0uEtKwU_.js +0 -2245
- package/dist/send-B3O7bzYU.js +0 -1174
- package/dist/send-BWSo3i3H.js +0 -1778
- package/dist/send-BkSUAGj6.js +0 -349
- package/dist/send-Bx9bUGav.js +0 -492
- package/dist/send-CBGSXjfD.js +0 -2245
- package/dist/send-CRS-OcnW.js +0 -29
- package/dist/send-DPttDPIR.js +0 -374
- package/dist/send-D_DUQJ6H.js +0 -349
- package/dist/send-DyftOlFD.js +0 -332
- package/dist/send-Lij9A7lk.js +0 -547
- package/dist/send-YRVDWfSs.js +0 -547
- package/dist/send-dzS4fa9O.js +0 -492
- package/dist/send-uchxcHYC.js +0 -11
- package/dist/send-xUPOqzUr.js +0 -426
- package/dist/send-xnwty9cY.js +0 -1775
- package/dist/server-BE5lybcS.js +0 -205
- package/dist/server-LdLsvPPw.js +0 -200
- package/dist/server-lifecycle-B3Rdmq7-.js +0 -2437
- package/dist/server-lifecycle-CFmE_Adm.js +0 -2437
- package/dist/server-node-events-De4WZQQD.js +0 -393
- package/dist/server-node-events-d7eK4LBW.js +0 -398
- package/dist/service-BHos7oX8.js +0 -670
- package/dist/service-Bjqii5nW.js +0 -670
- package/dist/session-aUptxSVD.js +0 -170
- package/dist/session-cost-usage-DX09eTPU.js +0 -627
- package/dist/session-cost-usage-yYi525j3.js +0 -627
- package/dist/session-dirs-BADAi9Iz.js +0 -947
- package/dist/session-dirs-DdF6TDsE.js +0 -947
- package/dist/session-key-5YLnn_qf.js +0 -235
- package/dist/session-utils-CEtEq6bi.js +0 -625
- package/dist/session-utils-CiXbZkM2.js +0 -625
- package/dist/sessions--PykPynp.js +0 -2593
- package/dist/sessions-Bw4LRnSr.js +0 -252
- package/dist/status-CrGLegI6.js +0 -2072
- package/dist/status-D_3sszaS.js +0 -2068
- package/dist/status.update-C55QM2xs.js +0 -79
- package/dist/status.update-CVnonGHu.js +0 -79
- package/dist/store-C6w1sB5x.js +0 -53
- package/dist/store-DoOPG3rl.js +0 -2595
- package/dist/subagent-registry-C-xI2uK4.js +0 -4860
- package/dist/subagent-registry-Db4Ho_2Y.js +0 -4858
- package/dist/subsystem-CrJCqjAh.js +0 -1139
- package/dist/system-cli-CCKzF3uh.js +0 -75
- package/dist/system-cli-eAk5wVbP.js +0 -70
- package/dist/systemd-B5lyaCc3.js +0 -547
- package/dist/systemd-DSnlM3jX.js +0 -547
- package/dist/systemd-linger-DRPSEQVw.js +0 -75
- package/dist/systemd-linger-_0_-RY4v.js +0 -75
- package/dist/table-CpmqqcxJ.js +0 -279
- package/dist/tables-DI5LGEr1.js +0 -55
- package/dist/tables-D_PTzthR.js +0 -55
- package/dist/tables-DcQUNIvB.js +0 -55
- package/dist/tailscale-Dxyz13fn.js +0 -230
- package/dist/targets-B2vBpQdr.js +0 -2173
- package/dist/targets-B54vK3wc.js +0 -220
- package/dist/targets-Cm1X3IyA.js +0 -650
- package/dist/targets-D7OKVXMI.js +0 -650
- package/dist/targets-DB4vBpIQ.js +0 -2172
- package/dist/targets-DyybKefq.js +0 -53
- package/dist/tool-images-DVrUJEqc.js +0 -263
- package/dist/trash-DzrtBoP1.js +0 -125
- package/dist/tui-CyHwc2uX.js +0 -3392
- package/dist/tui-cHd20SZm.js +0 -3392
- package/dist/tui-cli-C7kQj9ef.js +0 -63
- package/dist/tui-cli-C9I18SfW.js +0 -58
- package/dist/update-DeQGoaIC.js +0 -349
- package/dist/update-IX7vdqA8.js +0 -349
- package/dist/update-cli-C52dmo3x.js +0 -1370
- package/dist/update-cli-DY_iE1E5.js +0 -1373
- package/dist/usage-B--dL37U.js +0 -5279
- package/dist/web-CMxp78WA.js +0 -76
- package/dist/web-DMweaNnG.js +0 -3065
- package/dist/web-Dquzwqf4.js +0 -70
- package/dist/webhooks-cli-BpZHQlVd.js +0 -328
- package/dist/webhooks-cli-CqFX8Ywl.js +0 -333
- package/dist/whatsapp-actions-C31Zdwez.js +0 -128
- package/dist/whatsapp-actions-DaA291Ya.js +0 -122
- package/dist/workspace-B4ZvVYT9.js +0 -447
- package/dist/workspace-B8qk__ff.js +0 -449
- /package/dist/{ansi-D04X81yq.js → ansi-aRwLYlzD.js} +0 -0
- /package/dist/{api-BeQMq2iS.js → api-B5a-GhRx.js} +0 -0
- /package/dist/{api-CxX8-gGz.js → api-CIseA2oL.js} +0 -0
- /package/dist/{argv-Co-b9Zsc.js → argv-BpnfFual.js} +0 -0
- /package/dist/{audio-DPOuhNq7.js → audio-B_mzy948.js} +0 -0
- /package/dist/{audio-VBcVDa08.js → audio-DDvXRwh-.js} +0 -0
- /package/dist/{brew-DbSbN8sD.js → brew-DJ_dfLHZ.js} +0 -0
- /package/dist/{brew-C4zKZsHX.js → brew-j-qOseim.js} +0 -0
- /package/dist/{cleanup-utils-CwQvD73q.js → cleanup-utils-CELo1uhg.js} +0 -0
- /package/dist/{cleanup-utils-o2MM9xyf.js → cleanup-utils-iC7eNxVL.js} +0 -0
- /package/dist/{cli-utils-BhXbz2UF.js → cli-utils-BRpudJBb.js} +0 -0
- /package/dist/{cli-utils-DZe_rVkZ.js → cli-utils-DJwgT-LP.js} +0 -0
- /package/dist/{client-C61M8zI3.js → client-Ck9_YeG3.js} +0 -0
- /package/dist/{client-DdpmATKq.js → client-CwnX0nXo.js} +0 -0
- /package/dist/{clipboard-Dzkx6Q2K.js → clipboard-DT-6OtUP.js} +0 -0
- /package/dist/{command-options-C4paWSGf.js → command-options-BOLa_fOM.js} +0 -0
- /package/dist/{command-options-CA30lfLK.js → command-options-DbRrl8qF.js} +0 -0
- /package/dist/{config-eval-CjGZtLwx.js → config-eval-BsrVpg0A.js} +0 -0
- /package/dist/{config-eval-H_wlEYIG.js → config-eval-BzDtybYL.js} +0 -0
- /package/dist/{constants-ChptG3d7.js → constants-B1UiXFxs.js} +0 -0
- /package/dist/{constants-DY6b-_Wl.js → constants-DKUEbLZr.js} +0 -0
- /package/dist/{credentials-DFsi1_e8.js → credentials-C82aU5z-.js} +0 -0
- /package/dist/{daemon-runtime-CMnbwryP.js → daemon-runtime-BOcdJaFy.js} +0 -0
- /package/dist/{daemon-runtime-CvqE4ysg.js → daemon-runtime-CbyS9Xgu.js} +0 -0
- /package/dist/{dangerous-name-matching-BzmiLXmA.js → dangerous-name-matching-C2i9AEgf.js} +0 -0
- /package/dist/{dangerous-name-matching-DaVRgwer.js → dangerous-name-matching-CCBwBn49.js} +0 -0
- /package/dist/{dangerous-tools-BOLoCRv4.js → dangerous-tools-BRtX1d_K.js} +0 -0
- /package/dist/{dangerous-tools-Baq7Q-i6.js → dangerous-tools-D8hrp16Q.js} +0 -0
- /package/dist/{delivery-queue-Cfa9Wmxp.js → delivery-queue-CgAgO5_a.js} +0 -0
- /package/dist/{errors-DZ199hOo.js → errors-Dblex1kc.js} +0 -0
- /package/dist/{fetch-C6XKGA11.js → fetch-Du9BJ20J.js} +0 -0
- /package/dist/{fetch-CEDsOiql.js → fetch-KSHIFKGH.js} +0 -0
- /package/dist/{format-duration-CqUERz51.js → format-duration-BRNiDrqx.js} +0 -0
- /package/dist/{format-duration-Ct-yiwkS.js → format-duration-C11mR8D_.js} +0 -0
- /package/dist/{format-relative-79_Y1n2Y.js → format-relative-C6kUHuOj.js} +0 -0
- /package/dist/{format-relative-CxLpEQOX.js → format-relative-CEWK-aoC.js} +0 -0
- /package/dist/{health-format-B_QRD8Si.js → health-format-D-AQZK4v.js} +0 -0
- /package/dist/{health-format-Bygse7KA.js → health-format-DGyISuUh.js} +0 -0
- /package/dist/{heartbeat-wake-LGEgcXjs.js → heartbeat-wake-BtRrOB-t.js} +0 -0
- /package/dist/{heartbeat-wake-Y97geucO.js → heartbeat-wake-SJ-JCo-E.js} +0 -0
- /package/dist/{help-format-sqWgYEdL.js → help-format-BjjZaoq3.js} +0 -0
- /package/dist/{help-format-NNm_Ov4H.js → help-format-DB1wv6bQ.js} +0 -0
- /package/dist/{helpers-R7bU5IBz.js → helpers-BVw8gMr-.js} +0 -0
- /package/dist/{helpers-BAsMXprO.js → helpers-D-8vB6NY.js} +0 -0
- /package/dist/{helpers-DLgbkcEn.js → helpers-D04-Gim7.js} +0 -0
- /package/dist/{inbound-context-DS_kpIYI.js → inbound-context-D94rw0Oq.js} +0 -0
- /package/dist/{input-provenance-Bn6thJNm.js → input-provenance-BDPOaXFk.js} +0 -0
- /package/dist/{ipv4-CDQpx1A7.js → ipv4-Bp2lJpEb.js} +0 -0
- /package/dist/{ipv4--2WXMVtE.js → ipv4-D73_qHXL.js} +0 -0
- /package/dist/{is-main-DN8-sNR5.js → is-main-CqNDOs3L.js} +0 -0
- /package/dist/{json-files-CmpYSF4G.js → json-files-Ct2lDInr.js} +0 -0
- /package/dist/{lanes-ByWMUgrz.js → lanes-DKkroN9D.js} +0 -0
- /package/dist/{links-Cm43Vcft.js → links-BWZPW7Lq.js} +0 -0
- /package/dist/{links-Bz4V7R_p.js → links-Y3epeqjH.js} +0 -0
- /package/dist/{location-DBWCGNLq.js → location-BcldrVN7.js} +0 -0
- /package/dist/{location-GbZ0bBRU.js → location-BrkAgrz9.js} +0 -0
- /package/dist/{logger-DyL5G2DO.js → logger-BuGfr7KR.js} +0 -0
- /package/dist/{logger-GvipVDfh.js → logger-TzwNwShm.js} +0 -0
- /package/dist/{logging-D8-Kozjc.js → logging-BiGr95aB.js} +0 -0
- /package/dist/{logging-D8R0sLY9.js → logging-DZhZ5xLX.js} +0 -0
- /package/dist/{mutable-allowlist-detectors-DiZDtmlZ.js → mutable-allowlist-detectors-BaVrnZS3.js} +0 -0
- /package/dist/{mutable-allowlist-detectors-U5ThQr9V.js → mutable-allowlist-detectors-NtI6s4TE.js} +0 -0
- /package/dist/{node-cli-Uf6lAntf.js → node-cli-DFKT5s4K.js} +0 -0
- /package/dist/{nodes-screen-Bmp1l9wY.js → nodes-screen-ByJHtT0R.js} +0 -0
- /package/dist/{nodes-screen-Cw7Hv7M2.js → nodes-screen-C17NdAyR.js} +0 -0
- /package/dist/{parse-log-line-enq8pduH.js → parse-log-line-CM1cOe-W.js} +0 -0
- /package/dist/{parse-log-line-mz9TG6ig.js → parse-log-line-DXE28Ti3.js} +0 -0
- /package/dist/{parse-timeout-BMP8a0_a.js → parse-timeout-DFxbkOgy.js} +0 -0
- /package/dist/{parse-timeout-CDkco8kd.js → parse-timeout-dIdCY9EB.js} +0 -0
- /package/dist/{path-guards-CrQOUlsq.js → path-guards-DJteVA0d.js} +0 -0
- /package/dist/{path-safety-DkT9RmTG.js → path-safety-BGnQWeUs.js} +0 -0
- /package/dist/{plugins-allowlist-BbTQ5Z2k.js → plugins-allowlist-Bvd3WXPX.js} +0 -0
- /package/dist/{plugins-allowlist-C20oaESO.js → plugins-allowlist-DyoGDzwZ.js} +0 -0
- /package/dist/{polls-B0CCBDeR.js → polls-DXd67TD8.js} +0 -0
- /package/dist/{ports-lsof-Wteul3ju.js → ports-lsof-BNQJW1Qu.js} +0 -0
- /package/dist/{program-context-jqeI5alP.js → program-context-DpJ5udOA.js} +0 -0
- /package/dist/{progress-C1kUfYL-.js → progress-Dvx-ExOb.js} +0 -0
- /package/dist/{prompt-Yn2yClg1.js → prompt-DRT7xYvH.js} +0 -0
- /package/dist/{prompt-BVZVovoB.js → prompt-YAKpM1vg.js} +0 -0
- /package/dist/{prompt-style-D0LUnqXi.js → prompt-style-BsR0RICZ.js} +0 -0
- /package/dist/{prompt-style-DjEYC_s-.js → prompt-style-inF3A_oX.js} +0 -0
- /package/dist/{proxy-DL3MD6-P.js → proxy-GJkoUC6V.js} +0 -0
- /package/dist/{proxy-DpNv2cSV.js → proxy-yk1Oqe9p.js} +0 -0
- /package/dist/{push-apns-DuG95AKC.js → push-apns-Ak1TkhPj.js} +0 -0
- /package/dist/{pw-ai-state-CGfLv6nV.js → pw-ai-state-D2Fjn4L6.js} +0 -0
- /package/dist/{pw-ai-state-Dynx20hr.js → pw-ai-state-Ds_-5nzI.js} +0 -0
- /package/dist/{redact-identifier-CAagcfWA.js → redact-identifier-CKA9ZTIc.js} +0 -0
- /package/dist/{remoteclaw-root-DybYl8PL.js → remoteclaw-root-BbqPSH6q.js} +0 -0
- /package/dist/{remoteclaw-root-C2HV2VeC.js → remoteclaw-root-dHyfh_2E.js} +0 -0
- /package/dist/{render-CCLsW6Lz.js → render-CUAKPmvZ.js} +0 -0
- /package/dist/{retry-DnqPAqWp.js → retry-0uBjohL-.js} +0 -0
- /package/dist/{retry-CxXVRdes.js → retry-BbVJvOUo.js} +0 -0
- /package/dist/{runtime-DJNp29jv.js → runtime-Ds3E9SqF.js} +0 -0
- /package/dist/{runtime-guard-U-ewY_QH.js → runtime-guard-Dw19MuxF.js} +0 -0
- /package/dist/{secret-equal-BbHdTtqY.js → secret-equal-DgjJcvjv.js} +0 -0
- /package/dist/{secure-random-CS2mSdTn.js → secure-random-Bla7VjVG.js} +0 -0
- /package/dist/{session-DBL5nHDy.js → session-C7PLQQMA.js} +0 -0
- /package/dist/{stagger-BXv_apuy.js → stagger-Cu9_3JD_.js} +0 -0
- /package/dist/{stagger-MI9gd2rQ.js → stagger-NmUOU1S6.js} +0 -0
- /package/dist/{status-BmtCS3T1.js → status-BNw-xk6B.js} +0 -0
- /package/dist/{status-BrwHRn2B.js → status-D98glect.js} +0 -0
- /package/dist/{store-BPZo49zT.js → store-CmRidfgp.js} +0 -0
- /package/dist/{store-v3P-OWhi.js → store-oxFp4Iqf.js} +0 -0
- /package/dist/{strip-inbound-meta-jy3bkUab.js → strip-inbound-meta-B21Qdh8I.js} +0 -0
- /package/dist/{subsystem-CDhxwtDd.js → subsystem-SgROXN1v.js} +0 -0
- /package/dist/{table-C1rdyYl9.js → table-DhGVhmP-.js} +0 -0
- /package/dist/{tailnet-PnMrjwGT.js → tailnet-wUV6epIk.js} +0 -0
- /package/dist/{tailscale-Dbyahx0J.js → tailscale-DAa9lokU.js} +0 -0
- /package/dist/{target-errors-BDpPcwh5.js → target-errors-BDipwemU.js} +0 -0
- /package/dist/{targets-C-2xwh9f.js → targets-DfXObWaL.js} +0 -0
- /package/dist/{targets-UncQvCVs.js → targets-PM39J-YL.js} +0 -0
- /package/dist/{text-format-BQ3z_OXA.js → text-format-CFm4X8Ze.js} +0 -0
- /package/dist/{text-format-oWqzVmah.js → text-format-Cy1bnk2A.js} +0 -0
- /package/dist/{tool-display-B-nr7cSF.js → tool-display-BAIuLbtW.js} +0 -0
- /package/dist/{trash-DPi0aCCQ.js → trash-BS86zpVy.js} +0 -0
- /package/dist/{usage-BdhBT0Vz.js → usage-BvSX010R.js} +0 -0
- /package/dist/{usage-format-C3mNLfhI.js → usage-format-C6Iz_Ws9.js} +0 -0
- /package/dist/{usage-format-DAaPzr_z.js → usage-format-CHBrzgvG.js} +0 -0
- /package/dist/{usage-BtQcAnf6.js → usage-sF5tij7A.js} +0 -0
- /package/dist/{widearea-dns-CsmBVbez.js → widearea-dns-CsqvX85g.js} +0 -0
- /package/dist/{widearea-dns-BXGCmXnD.js → widearea-dns-DtACcM7M.js} +0 -0
- /package/dist/{workspace-BzPeZDew.js → workspace-DpbQppPf.js} +0 -0
- /package/dist/{wsl-B_sPlzWw.js → wsl-B5ccPr42.js} +0 -0
- /package/dist/{wsl-BCnYV9O0.js → wsl-BJW8nTyL.js} +0 -0
|
@@ -0,0 +1,1326 @@
|
|
|
1
|
+
import "./paths-BTaH3rLn.js";
|
|
2
|
+
import { L as theme, _ as resolveUserPath, b as shortenHomePath } from "./utils-C5daYcFn.js";
|
|
3
|
+
import "./subsystem-BgxIzx7w.js";
|
|
4
|
+
import { n as defaultRuntime } from "./runtime-Ds3E9SqF.js";
|
|
5
|
+
import "./ansi-aRwLYlzD.js";
|
|
6
|
+
import "./agent-scope-Dzc3Pxwr.js";
|
|
7
|
+
import { f as GATEWAY_CLIENT_MODES, p as GATEWAY_CLIENT_NAMES } from "./message-channel-DF4I2vOK.js";
|
|
8
|
+
import { i as loadConfig } from "./config-BzYPJgWg.js";
|
|
9
|
+
import "./env-DUb5GiQe.js";
|
|
10
|
+
import "./host-env-security-Bms2_EMV.js";
|
|
11
|
+
import "./inbound-path-policy-gHabNHWN.js";
|
|
12
|
+
import { r as VERSION } from "./env-vars-CLGbxdpL.js";
|
|
13
|
+
import "./logger-BiVcvOhw.js";
|
|
14
|
+
import "./ip-C9q3Oq20.js";
|
|
15
|
+
import { f as GatewayClient, t as buildGatewayConnectionDetails } from "./call-jLXWNKPQ.js";
|
|
16
|
+
import "./net-Dl7oQfqm.js";
|
|
17
|
+
import "./tailnet-wUV6epIk.js";
|
|
18
|
+
import { t as resolveGatewayCredentialsFromConfig } from "./credentials-C82aU5z-.js";
|
|
19
|
+
import { t as isMainModule } from "./is-main-CqNDOs3L.js";
|
|
20
|
+
import { t as ensureRemoteClawCliOnPath } from "./path-env-Dt0Pot3Y.js";
|
|
21
|
+
import { t as formatDocsLink } from "./links-BWZPW7Lq.js";
|
|
22
|
+
import { a as isKnownCoreToolId, t as DANGEROUS_ACP_TOOLS } from "./dangerous-tools-D8hrp16Q.js";
|
|
23
|
+
import { n as inheritOptionFromParent } from "./command-options-DbRrl8qF.js";
|
|
24
|
+
import { fileURLToPath } from "node:url";
|
|
25
|
+
import fs from "node:fs";
|
|
26
|
+
import path from "node:path";
|
|
27
|
+
import { randomUUID } from "node:crypto";
|
|
28
|
+
import { spawn } from "node:child_process";
|
|
29
|
+
import * as readline$1 from "node:readline";
|
|
30
|
+
import { Readable, Writable } from "node:stream";
|
|
31
|
+
import { AgentSideConnection, ClientSideConnection, PROTOCOL_VERSION, ndJsonStream } from "@agentclientprotocol/sdk";
|
|
32
|
+
|
|
33
|
+
//#region src/acp/client.ts
|
|
34
|
+
const SAFE_AUTO_APPROVE_TOOL_IDS = new Set(["search"]);
|
|
35
|
+
const TRUSTED_SAFE_TOOL_ALIASES = new Set(["search"]);
|
|
36
|
+
const TOOL_NAME_MAX_LENGTH = 128;
|
|
37
|
+
const TOOL_NAME_PATTERN = /^[a-z0-9._-]+$/;
|
|
38
|
+
const TOOL_KIND_BY_ID = new Map([["search", "search"]]);
|
|
39
|
+
function asRecord(value) {
|
|
40
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
41
|
+
}
|
|
42
|
+
function readFirstStringValue(source, keys) {
|
|
43
|
+
if (!source) return;
|
|
44
|
+
for (const key of keys) {
|
|
45
|
+
const value = source[key];
|
|
46
|
+
if (typeof value === "string" && value.trim()) return value.trim();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function normalizeToolName(value) {
|
|
50
|
+
const normalized = value.trim().toLowerCase();
|
|
51
|
+
if (!normalized || normalized.length > TOOL_NAME_MAX_LENGTH) return;
|
|
52
|
+
if (!TOOL_NAME_PATTERN.test(normalized)) return;
|
|
53
|
+
return normalized;
|
|
54
|
+
}
|
|
55
|
+
function parseToolNameFromTitle(title) {
|
|
56
|
+
if (!title) return;
|
|
57
|
+
const head = title.split(":", 1)[0]?.trim();
|
|
58
|
+
if (!head) return;
|
|
59
|
+
return normalizeToolName(head);
|
|
60
|
+
}
|
|
61
|
+
function resolveToolKindForPermission(toolName) {
|
|
62
|
+
if (!toolName) return;
|
|
63
|
+
return TOOL_KIND_BY_ID.get(toolName) ?? "other";
|
|
64
|
+
}
|
|
65
|
+
function resolveToolNameForPermission(params) {
|
|
66
|
+
const toolCall = params.toolCall;
|
|
67
|
+
const toolMeta = asRecord(toolCall?._meta);
|
|
68
|
+
const rawInput = asRecord(toolCall?.rawInput);
|
|
69
|
+
const fromMeta = readFirstStringValue(toolMeta, [
|
|
70
|
+
"toolName",
|
|
71
|
+
"tool_name",
|
|
72
|
+
"name"
|
|
73
|
+
]);
|
|
74
|
+
const fromRawInput = readFirstStringValue(rawInput, [
|
|
75
|
+
"tool",
|
|
76
|
+
"toolName",
|
|
77
|
+
"tool_name",
|
|
78
|
+
"name"
|
|
79
|
+
]);
|
|
80
|
+
const fromTitle = parseToolNameFromTitle(toolCall?.title);
|
|
81
|
+
return normalizeToolName(fromMeta ?? fromRawInput ?? fromTitle ?? "");
|
|
82
|
+
}
|
|
83
|
+
function shouldAutoApproveToolCall(toolName) {
|
|
84
|
+
const isTrustedToolId = typeof toolName === "string" && (isKnownCoreToolId(toolName) || TRUSTED_SAFE_TOOL_ALIASES.has(toolName));
|
|
85
|
+
if (!toolName || !isTrustedToolId || !SAFE_AUTO_APPROVE_TOOL_IDS.has(toolName)) return false;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
function pickOption(options, kinds) {
|
|
89
|
+
for (const kind of kinds) {
|
|
90
|
+
const match = options.find((option) => option.kind === kind);
|
|
91
|
+
if (match) return match;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function selectedPermission(optionId) {
|
|
95
|
+
return { outcome: {
|
|
96
|
+
outcome: "selected",
|
|
97
|
+
optionId
|
|
98
|
+
} };
|
|
99
|
+
}
|
|
100
|
+
function cancelledPermission() {
|
|
101
|
+
return { outcome: { outcome: "cancelled" } };
|
|
102
|
+
}
|
|
103
|
+
function promptUserPermission(toolName, toolTitle) {
|
|
104
|
+
if (!process.stdin.isTTY || !process.stderr.isTTY) {
|
|
105
|
+
console.error(`[permission denied] ${toolName ?? "unknown"}: non-interactive terminal`);
|
|
106
|
+
return Promise.resolve(false);
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
let settled = false;
|
|
110
|
+
const rl = readline$1.createInterface({
|
|
111
|
+
input: process.stdin,
|
|
112
|
+
output: process.stderr
|
|
113
|
+
});
|
|
114
|
+
const finish = (approved) => {
|
|
115
|
+
if (settled) return;
|
|
116
|
+
settled = true;
|
|
117
|
+
clearTimeout(timeout);
|
|
118
|
+
rl.close();
|
|
119
|
+
resolve(approved);
|
|
120
|
+
};
|
|
121
|
+
const timeout = setTimeout(() => {
|
|
122
|
+
console.error(`\n[permission timeout] denied: ${toolName ?? "unknown"}`);
|
|
123
|
+
finish(false);
|
|
124
|
+
}, 3e4);
|
|
125
|
+
const label = toolTitle ? toolName ? `${toolTitle} (${toolName})` : toolTitle : toolName ?? "unknown tool";
|
|
126
|
+
rl.question(`\n[permission] Allow "${label}"? (y/N) `, (answer) => {
|
|
127
|
+
const approved = answer.trim().toLowerCase() === "y";
|
|
128
|
+
console.error(`[permission ${approved ? "approved" : "denied"}] ${toolName ?? "unknown"}`);
|
|
129
|
+
finish(approved);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async function resolvePermissionRequest(params, deps = {}) {
|
|
134
|
+
const log = deps.log ?? ((line) => console.error(line));
|
|
135
|
+
const prompt = deps.prompt ?? promptUserPermission;
|
|
136
|
+
const options = params.options ?? [];
|
|
137
|
+
const toolTitle = params.toolCall?.title ?? "tool";
|
|
138
|
+
const toolName = resolveToolNameForPermission(params);
|
|
139
|
+
const toolKind = resolveToolKindForPermission(toolName);
|
|
140
|
+
if (options.length === 0) {
|
|
141
|
+
log(`[permission cancelled] ${toolName ?? "unknown"}: no options available`);
|
|
142
|
+
return cancelledPermission();
|
|
143
|
+
}
|
|
144
|
+
const allowOption = pickOption(options, ["allow_once", "allow_always"]);
|
|
145
|
+
const rejectOption = pickOption(options, ["reject_once", "reject_always"]);
|
|
146
|
+
const autoApproveAllowed = shouldAutoApproveToolCall(toolName);
|
|
147
|
+
if (!(!toolName || !autoApproveAllowed || DANGEROUS_ACP_TOOLS.has(toolName))) {
|
|
148
|
+
const option = allowOption ?? options[0];
|
|
149
|
+
if (!option) {
|
|
150
|
+
log(`[permission cancelled] ${toolName}: no selectable options`);
|
|
151
|
+
return cancelledPermission();
|
|
152
|
+
}
|
|
153
|
+
log(`[permission auto-approved] ${toolName} (${toolKind ?? "unknown"})`);
|
|
154
|
+
return selectedPermission(option.optionId);
|
|
155
|
+
}
|
|
156
|
+
log(`\n[permission requested] ${toolTitle}${toolName ? ` (${toolName})` : ""}${toolKind ? ` [${toolKind}]` : ""}`);
|
|
157
|
+
const approved = await prompt(toolName, toolTitle);
|
|
158
|
+
if (approved && allowOption) return selectedPermission(allowOption.optionId);
|
|
159
|
+
if (!approved && rejectOption) return selectedPermission(rejectOption.optionId);
|
|
160
|
+
log(`[permission cancelled] ${toolName ?? "unknown"}: missing ${approved ? "allow" : "reject"} option`);
|
|
161
|
+
return cancelledPermission();
|
|
162
|
+
}
|
|
163
|
+
function toArgs(value) {
|
|
164
|
+
if (!value) return [];
|
|
165
|
+
return Array.isArray(value) ? value : [value];
|
|
166
|
+
}
|
|
167
|
+
function buildServerArgs(opts) {
|
|
168
|
+
const args = ["acp", ...toArgs(opts.serverArgs)];
|
|
169
|
+
if (opts.serverVerbose && !args.includes("--verbose") && !args.includes("-v")) args.push("--verbose");
|
|
170
|
+
return args;
|
|
171
|
+
}
|
|
172
|
+
function resolveSelfEntryPath() {
|
|
173
|
+
try {
|
|
174
|
+
const here = fileURLToPath(import.meta.url);
|
|
175
|
+
const candidate = path.resolve(path.dirname(here), "..", "entry.js");
|
|
176
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
177
|
+
} catch {}
|
|
178
|
+
const argv1 = process.argv[1]?.trim();
|
|
179
|
+
if (argv1) return path.isAbsolute(argv1) ? argv1 : path.resolve(process.cwd(), argv1);
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
function printSessionUpdate(notification) {
|
|
183
|
+
const update = notification.update;
|
|
184
|
+
if (!("sessionUpdate" in update)) return;
|
|
185
|
+
switch (update.sessionUpdate) {
|
|
186
|
+
case "agent_message_chunk":
|
|
187
|
+
if (update.content?.type === "text") process.stdout.write(update.content.text);
|
|
188
|
+
return;
|
|
189
|
+
case "tool_call":
|
|
190
|
+
console.log(`\n[tool] ${update.title} (${update.status})`);
|
|
191
|
+
return;
|
|
192
|
+
case "tool_call_update":
|
|
193
|
+
if (update.status) console.log(`[tool update] ${update.toolCallId}: ${update.status}`);
|
|
194
|
+
return;
|
|
195
|
+
case "available_commands_update": {
|
|
196
|
+
const names = update.availableCommands?.map((cmd) => `/${cmd.name}`).join(" ");
|
|
197
|
+
if (names) console.log(`\n[commands] ${names}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
default: return;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function createAcpClient(opts = {}) {
|
|
204
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
205
|
+
const log = Boolean(opts.verbose) ? (msg) => console.error(`[acp-client] ${msg}`) : () => {};
|
|
206
|
+
ensureRemoteClawCliOnPath();
|
|
207
|
+
const serverArgs = buildServerArgs(opts);
|
|
208
|
+
const entryPath = resolveSelfEntryPath();
|
|
209
|
+
const serverCommand = opts.serverCommand ?? (entryPath ? process.execPath : "remoteclaw");
|
|
210
|
+
const effectiveArgs = opts.serverCommand || !entryPath ? serverArgs : [entryPath, ...serverArgs];
|
|
211
|
+
log(`spawning: ${serverCommand} ${effectiveArgs.join(" ")}`);
|
|
212
|
+
const agent = spawn(serverCommand, effectiveArgs, {
|
|
213
|
+
stdio: [
|
|
214
|
+
"pipe",
|
|
215
|
+
"pipe",
|
|
216
|
+
"inherit"
|
|
217
|
+
],
|
|
218
|
+
cwd
|
|
219
|
+
});
|
|
220
|
+
if (!agent.stdin || !agent.stdout) throw new Error("Failed to create ACP stdio pipes");
|
|
221
|
+
const client = new ClientSideConnection(() => ({
|
|
222
|
+
sessionUpdate: async (params) => {
|
|
223
|
+
printSessionUpdate(params);
|
|
224
|
+
},
|
|
225
|
+
requestPermission: async (params) => {
|
|
226
|
+
return resolvePermissionRequest(params, { cwd });
|
|
227
|
+
}
|
|
228
|
+
}), ndJsonStream(Writable.toWeb(agent.stdin), Readable.toWeb(agent.stdout)));
|
|
229
|
+
log("initializing");
|
|
230
|
+
await client.initialize({
|
|
231
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
232
|
+
clientCapabilities: {
|
|
233
|
+
fs: {
|
|
234
|
+
readTextFile: true,
|
|
235
|
+
writeTextFile: true
|
|
236
|
+
},
|
|
237
|
+
terminal: true
|
|
238
|
+
},
|
|
239
|
+
clientInfo: {
|
|
240
|
+
name: "remoteclaw-acp-client",
|
|
241
|
+
version: "1.0.0"
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
log("creating session");
|
|
245
|
+
return {
|
|
246
|
+
client,
|
|
247
|
+
agent,
|
|
248
|
+
sessionId: (await client.newSession({
|
|
249
|
+
cwd,
|
|
250
|
+
mcpServers: []
|
|
251
|
+
})).sessionId
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
async function runAcpClientInteractive(opts = {}) {
|
|
255
|
+
const { client, agent, sessionId } = await createAcpClient(opts);
|
|
256
|
+
const rl = readline$1.createInterface({
|
|
257
|
+
input: process.stdin,
|
|
258
|
+
output: process.stdout
|
|
259
|
+
});
|
|
260
|
+
console.log("RemoteClaw ACP client");
|
|
261
|
+
console.log(`Session: ${sessionId}`);
|
|
262
|
+
console.log("Type a prompt, or \"exit\" to quit.\n");
|
|
263
|
+
const prompt = () => {
|
|
264
|
+
rl.question("> ", async (input) => {
|
|
265
|
+
const text = input.trim();
|
|
266
|
+
if (!text) {
|
|
267
|
+
prompt();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (text === "exit" || text === "quit") {
|
|
271
|
+
agent.kill();
|
|
272
|
+
rl.close();
|
|
273
|
+
process.exit(0);
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
const response = await client.prompt({
|
|
277
|
+
sessionId,
|
|
278
|
+
prompt: [{
|
|
279
|
+
type: "text",
|
|
280
|
+
text
|
|
281
|
+
}]
|
|
282
|
+
});
|
|
283
|
+
console.log(`\n[${response.stopReason}]\n`);
|
|
284
|
+
} catch (err) {
|
|
285
|
+
console.error(`\n[error] ${String(err)}\n`);
|
|
286
|
+
}
|
|
287
|
+
prompt();
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
prompt();
|
|
291
|
+
agent.on("exit", (code) => {
|
|
292
|
+
console.log(`\nAgent exited with code ${code ?? 0}`);
|
|
293
|
+
rl.close();
|
|
294
|
+
process.exit(code ?? 0);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
//#endregion
|
|
299
|
+
//#region src/acp/secret-file.ts
|
|
300
|
+
function readSecretFromFile(filePath, label) {
|
|
301
|
+
const resolvedPath = resolveUserPath(filePath.trim());
|
|
302
|
+
if (!resolvedPath) throw new Error(`${label} file path is empty.`);
|
|
303
|
+
let raw = "";
|
|
304
|
+
try {
|
|
305
|
+
raw = fs.readFileSync(resolvedPath, "utf8");
|
|
306
|
+
} catch (err) {
|
|
307
|
+
throw new Error(`Failed to read ${label} file at ${resolvedPath}: ${String(err)}`, { cause: err });
|
|
308
|
+
}
|
|
309
|
+
const secret = raw.trim();
|
|
310
|
+
if (!secret) throw new Error(`${label} file at ${resolvedPath} is empty.`);
|
|
311
|
+
return secret;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region src/infra/fixed-window-rate-limit.ts
|
|
316
|
+
function createFixedWindowRateLimiter(params) {
|
|
317
|
+
const maxRequests = Math.max(1, Math.floor(params.maxRequests));
|
|
318
|
+
const windowMs = Math.max(1, Math.floor(params.windowMs));
|
|
319
|
+
const now = params.now ?? Date.now;
|
|
320
|
+
let count = 0;
|
|
321
|
+
let windowStartMs = 0;
|
|
322
|
+
return {
|
|
323
|
+
consume() {
|
|
324
|
+
const nowMs = now();
|
|
325
|
+
if (nowMs - windowStartMs >= windowMs) {
|
|
326
|
+
windowStartMs = nowMs;
|
|
327
|
+
count = 0;
|
|
328
|
+
}
|
|
329
|
+
if (count >= maxRequests) return {
|
|
330
|
+
allowed: false,
|
|
331
|
+
retryAfterMs: Math.max(0, windowStartMs + windowMs - nowMs),
|
|
332
|
+
remaining: 0
|
|
333
|
+
};
|
|
334
|
+
count += 1;
|
|
335
|
+
return {
|
|
336
|
+
allowed: true,
|
|
337
|
+
retryAfterMs: 0,
|
|
338
|
+
remaining: Math.max(0, maxRequests - count)
|
|
339
|
+
};
|
|
340
|
+
},
|
|
341
|
+
reset() {
|
|
342
|
+
count = 0;
|
|
343
|
+
windowStartMs = 0;
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
//#endregion
|
|
349
|
+
//#region src/acp/commands.ts
|
|
350
|
+
function getAvailableCommands() {
|
|
351
|
+
return [
|
|
352
|
+
{
|
|
353
|
+
name: "help",
|
|
354
|
+
description: "Show help and common commands."
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: "commands",
|
|
358
|
+
description: "List available commands."
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: "status",
|
|
362
|
+
description: "Show current status."
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: "context",
|
|
366
|
+
description: "Explain context usage (list|detail|json).",
|
|
367
|
+
input: { hint: "list | detail | json" }
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: "whoami",
|
|
371
|
+
description: "Show sender id (alias: /id)."
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: "id",
|
|
375
|
+
description: "Alias for /whoami."
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: "subagents",
|
|
379
|
+
description: "List or manage sub-agents."
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: "config",
|
|
383
|
+
description: "Read or write config (owner-only)."
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
name: "debug",
|
|
387
|
+
description: "Set runtime-only overrides (owner-only)."
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: "usage",
|
|
391
|
+
description: "Toggle usage footer (off|tokens|full)."
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: "stop",
|
|
395
|
+
description: "Stop the current run."
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
name: "restart",
|
|
399
|
+
description: "Restart the gateway (if enabled)."
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
name: "dock-telegram",
|
|
403
|
+
description: "Route replies to Telegram."
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: "dock-discord",
|
|
407
|
+
description: "Route replies to Discord."
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
name: "dock-slack",
|
|
411
|
+
description: "Route replies to Slack."
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: "activation",
|
|
415
|
+
description: "Set group activation (mention|always)."
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
name: "send",
|
|
419
|
+
description: "Set send mode (on|off|inherit)."
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
name: "reset",
|
|
423
|
+
description: "Reset the session (/new)."
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
name: "new",
|
|
427
|
+
description: "Reset the session (/reset)."
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
name: "think",
|
|
431
|
+
description: "Set thinking level (off|minimal|low|medium|high|xhigh)."
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
name: "verbose",
|
|
435
|
+
description: "Set verbose mode (on|full|off)."
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
name: "reasoning",
|
|
439
|
+
description: "Toggle reasoning output (on|off|stream)."
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: "elevated",
|
|
443
|
+
description: "Toggle elevated mode (on|off)."
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
name: "model",
|
|
447
|
+
description: "Select a model (list|status|<name>)."
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
name: "queue",
|
|
451
|
+
description: "Adjust queue mode and options."
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
name: "bash",
|
|
455
|
+
description: "Run a host command (if enabled)."
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
name: "compact",
|
|
459
|
+
description: "Compact the session history."
|
|
460
|
+
}
|
|
461
|
+
];
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
//#endregion
|
|
465
|
+
//#region src/acp/event-mapper.ts
|
|
466
|
+
const INLINE_CONTROL_ESCAPE_MAP = {
|
|
467
|
+
"\0": "\\0",
|
|
468
|
+
"\r": "\\r",
|
|
469
|
+
"\n": "\\n",
|
|
470
|
+
" ": "\\t",
|
|
471
|
+
"\v": "\\v",
|
|
472
|
+
"\f": "\\f",
|
|
473
|
+
"\u2028": "\\u2028",
|
|
474
|
+
"\u2029": "\\u2029"
|
|
475
|
+
};
|
|
476
|
+
function escapeInlineControlChars(value) {
|
|
477
|
+
let escaped = "";
|
|
478
|
+
for (const char of value) {
|
|
479
|
+
const codePoint = char.codePointAt(0);
|
|
480
|
+
if (codePoint === void 0) {
|
|
481
|
+
escaped += char;
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
if (!(codePoint <= 31 || codePoint >= 127 && codePoint <= 159 || codePoint === 8232 || codePoint === 8233)) {
|
|
485
|
+
escaped += char;
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
const mapped = INLINE_CONTROL_ESCAPE_MAP[char];
|
|
489
|
+
if (mapped) {
|
|
490
|
+
escaped += mapped;
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
escaped += codePoint <= 255 ? `\\x${codePoint.toString(16).padStart(2, "0")}` : `\\u${codePoint.toString(16).padStart(4, "0")}`;
|
|
494
|
+
}
|
|
495
|
+
return escaped;
|
|
496
|
+
}
|
|
497
|
+
function escapeResourceTitle(value) {
|
|
498
|
+
return escapeInlineControlChars(value).replace(/[()[\]]/g, (char) => `\\${char}`);
|
|
499
|
+
}
|
|
500
|
+
function extractTextFromPrompt(prompt, maxBytes) {
|
|
501
|
+
const parts = [];
|
|
502
|
+
let totalBytes = 0;
|
|
503
|
+
for (const block of prompt) {
|
|
504
|
+
let blockText;
|
|
505
|
+
if (block.type === "text") blockText = block.text;
|
|
506
|
+
else if (block.type === "resource") {
|
|
507
|
+
const resource = block.resource;
|
|
508
|
+
if (resource?.text) blockText = resource.text;
|
|
509
|
+
} else if (block.type === "resource_link") {
|
|
510
|
+
const title = block.title ? ` (${escapeResourceTitle(block.title)})` : "";
|
|
511
|
+
const uri = block.uri ? escapeInlineControlChars(block.uri) : "";
|
|
512
|
+
blockText = uri ? `[Resource link${title}] ${uri}` : `[Resource link${title}]`;
|
|
513
|
+
}
|
|
514
|
+
if (blockText !== void 0) {
|
|
515
|
+
if (maxBytes !== void 0) {
|
|
516
|
+
const separatorBytes = parts.length > 0 ? 1 : 0;
|
|
517
|
+
totalBytes += separatorBytes + Buffer.byteLength(blockText, "utf-8");
|
|
518
|
+
if (totalBytes > maxBytes) throw new Error(`Prompt exceeds maximum allowed size of ${maxBytes} bytes`);
|
|
519
|
+
}
|
|
520
|
+
parts.push(blockText);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return parts.join("\n");
|
|
524
|
+
}
|
|
525
|
+
function extractAttachmentsFromPrompt(prompt) {
|
|
526
|
+
const attachments = [];
|
|
527
|
+
for (const block of prompt) {
|
|
528
|
+
if (block.type !== "image") continue;
|
|
529
|
+
const image = block;
|
|
530
|
+
if (!image.data || !image.mimeType) continue;
|
|
531
|
+
attachments.push({
|
|
532
|
+
type: "image",
|
|
533
|
+
mimeType: image.mimeType,
|
|
534
|
+
content: image.data
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
return attachments;
|
|
538
|
+
}
|
|
539
|
+
function formatToolTitle(name, args) {
|
|
540
|
+
const base = name ?? "tool";
|
|
541
|
+
if (!args || Object.keys(args).length === 0) return base;
|
|
542
|
+
return `${base}: ${Object.entries(args).map(([key, value]) => {
|
|
543
|
+
const raw = typeof value === "string" ? value : JSON.stringify(value);
|
|
544
|
+
return `${key}: ${raw.length > 100 ? `${raw.slice(0, 100)}...` : raw}`;
|
|
545
|
+
}).join(", ")}`;
|
|
546
|
+
}
|
|
547
|
+
function inferToolKind(name) {
|
|
548
|
+
if (!name) return "other";
|
|
549
|
+
const normalized = name.toLowerCase();
|
|
550
|
+
if (normalized.includes("read")) return "read";
|
|
551
|
+
if (normalized.includes("edit")) return "edit";
|
|
552
|
+
if (normalized.includes("delete") || normalized.includes("remove")) return "delete";
|
|
553
|
+
if (normalized.includes("move") || normalized.includes("rename")) return "move";
|
|
554
|
+
if (normalized.includes("search") || normalized.includes("find")) return "search";
|
|
555
|
+
if (normalized.includes("run") || normalized.includes("bash")) return "execute";
|
|
556
|
+
if (normalized.includes("fetch") || normalized.includes("http")) return "fetch";
|
|
557
|
+
return "other";
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
//#endregion
|
|
561
|
+
//#region src/acp/meta.ts
|
|
562
|
+
function readString(meta, keys) {
|
|
563
|
+
if (!meta) return;
|
|
564
|
+
for (const key of keys) {
|
|
565
|
+
const value = meta[key];
|
|
566
|
+
if (typeof value === "string" && value.trim()) return value.trim();
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
function readBool(meta, keys) {
|
|
570
|
+
if (!meta) return;
|
|
571
|
+
for (const key of keys) {
|
|
572
|
+
const value = meta[key];
|
|
573
|
+
if (typeof value === "boolean") return value;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
function readNumber(meta, keys) {
|
|
577
|
+
if (!meta) return;
|
|
578
|
+
for (const key of keys) {
|
|
579
|
+
const value = meta[key];
|
|
580
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
//#endregion
|
|
585
|
+
//#region src/acp/session-mapper.ts
|
|
586
|
+
function parseSessionMeta(meta) {
|
|
587
|
+
if (!meta || typeof meta !== "object") return {};
|
|
588
|
+
const record = meta;
|
|
589
|
+
return {
|
|
590
|
+
sessionKey: readString(record, [
|
|
591
|
+
"sessionKey",
|
|
592
|
+
"session",
|
|
593
|
+
"key"
|
|
594
|
+
]),
|
|
595
|
+
sessionLabel: readString(record, ["sessionLabel", "label"]),
|
|
596
|
+
resetSession: readBool(record, ["resetSession", "reset"]),
|
|
597
|
+
requireExisting: readBool(record, ["requireExistingSession", "requireExisting"]),
|
|
598
|
+
prefixCwd: readBool(record, ["prefixCwd"])
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
async function resolveSessionKey(params) {
|
|
602
|
+
const requestedLabel = params.meta.sessionLabel ?? params.opts.defaultSessionLabel;
|
|
603
|
+
const requestedKey = params.meta.sessionKey ?? params.opts.defaultSessionKey;
|
|
604
|
+
const requireExisting = params.meta.requireExisting ?? params.opts.requireExistingSession ?? false;
|
|
605
|
+
if (params.meta.sessionLabel) {
|
|
606
|
+
const resolved = await params.gateway.request("sessions.resolve", { label: params.meta.sessionLabel });
|
|
607
|
+
if (!resolved?.key) throw new Error(`Unable to resolve session label: ${params.meta.sessionLabel}`);
|
|
608
|
+
return resolved.key;
|
|
609
|
+
}
|
|
610
|
+
if (params.meta.sessionKey) {
|
|
611
|
+
if (!requireExisting) return params.meta.sessionKey;
|
|
612
|
+
const resolved = await params.gateway.request("sessions.resolve", { key: params.meta.sessionKey });
|
|
613
|
+
if (!resolved?.key) throw new Error(`Session key not found: ${params.meta.sessionKey}`);
|
|
614
|
+
return resolved.key;
|
|
615
|
+
}
|
|
616
|
+
if (requestedLabel) {
|
|
617
|
+
const resolved = await params.gateway.request("sessions.resolve", { label: requestedLabel });
|
|
618
|
+
if (!resolved?.key) throw new Error(`Unable to resolve session label: ${requestedLabel}`);
|
|
619
|
+
return resolved.key;
|
|
620
|
+
}
|
|
621
|
+
if (requestedKey) {
|
|
622
|
+
if (!requireExisting) return requestedKey;
|
|
623
|
+
const resolved = await params.gateway.request("sessions.resolve", { key: requestedKey });
|
|
624
|
+
if (!resolved?.key) throw new Error(`Session key not found: ${requestedKey}`);
|
|
625
|
+
return resolved.key;
|
|
626
|
+
}
|
|
627
|
+
return params.fallbackKey;
|
|
628
|
+
}
|
|
629
|
+
async function resetSessionIfNeeded(params) {
|
|
630
|
+
if (!(params.meta.resetSession ?? params.opts.resetSession ?? false)) return;
|
|
631
|
+
await params.gateway.request("sessions.reset", { key: params.sessionKey });
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
//#endregion
|
|
635
|
+
//#region src/acp/session.ts
|
|
636
|
+
const DEFAULT_MAX_SESSIONS = 5e3;
|
|
637
|
+
const DEFAULT_IDLE_TTL_MS = 1440 * 60 * 1e3;
|
|
638
|
+
function createInMemorySessionStore(options = {}) {
|
|
639
|
+
const maxSessions = Math.max(1, options.maxSessions ?? DEFAULT_MAX_SESSIONS);
|
|
640
|
+
const idleTtlMs = Math.max(1e3, options.idleTtlMs ?? DEFAULT_IDLE_TTL_MS);
|
|
641
|
+
const now = options.now ?? Date.now;
|
|
642
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
643
|
+
const runIdToSessionId = /* @__PURE__ */ new Map();
|
|
644
|
+
const touchSession = (session, nowMs) => {
|
|
645
|
+
session.lastTouchedAt = nowMs;
|
|
646
|
+
};
|
|
647
|
+
const removeSession = (sessionId) => {
|
|
648
|
+
const session = sessions.get(sessionId);
|
|
649
|
+
if (!session) return false;
|
|
650
|
+
if (session.activeRunId) runIdToSessionId.delete(session.activeRunId);
|
|
651
|
+
session.abortController?.abort();
|
|
652
|
+
sessions.delete(sessionId);
|
|
653
|
+
return true;
|
|
654
|
+
};
|
|
655
|
+
const reapIdleSessions = (nowMs) => {
|
|
656
|
+
const idleBefore = nowMs - idleTtlMs;
|
|
657
|
+
for (const [sessionId, session] of sessions.entries()) {
|
|
658
|
+
if (session.activeRunId || session.abortController) continue;
|
|
659
|
+
if (session.lastTouchedAt > idleBefore) continue;
|
|
660
|
+
removeSession(sessionId);
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
const evictOldestIdleSession = () => {
|
|
664
|
+
let oldestSessionId = null;
|
|
665
|
+
let oldestLastTouchedAt = Number.POSITIVE_INFINITY;
|
|
666
|
+
for (const [sessionId, session] of sessions.entries()) {
|
|
667
|
+
if (session.activeRunId || session.abortController) continue;
|
|
668
|
+
if (session.lastTouchedAt >= oldestLastTouchedAt) continue;
|
|
669
|
+
oldestLastTouchedAt = session.lastTouchedAt;
|
|
670
|
+
oldestSessionId = sessionId;
|
|
671
|
+
}
|
|
672
|
+
if (!oldestSessionId) return false;
|
|
673
|
+
return removeSession(oldestSessionId);
|
|
674
|
+
};
|
|
675
|
+
const createSession = (params) => {
|
|
676
|
+
const nowMs = now();
|
|
677
|
+
const sessionId = params.sessionId ?? randomUUID();
|
|
678
|
+
const existingSession = sessions.get(sessionId);
|
|
679
|
+
if (existingSession) {
|
|
680
|
+
existingSession.sessionKey = params.sessionKey;
|
|
681
|
+
existingSession.cwd = params.cwd;
|
|
682
|
+
touchSession(existingSession, nowMs);
|
|
683
|
+
return existingSession;
|
|
684
|
+
}
|
|
685
|
+
reapIdleSessions(nowMs);
|
|
686
|
+
if (sessions.size >= maxSessions && !evictOldestIdleSession()) throw new Error(`ACP session limit reached (max ${maxSessions}). Close idle ACP clients and retry.`);
|
|
687
|
+
const session = {
|
|
688
|
+
sessionId,
|
|
689
|
+
sessionKey: params.sessionKey,
|
|
690
|
+
cwd: params.cwd,
|
|
691
|
+
createdAt: nowMs,
|
|
692
|
+
lastTouchedAt: nowMs,
|
|
693
|
+
abortController: null,
|
|
694
|
+
activeRunId: null
|
|
695
|
+
};
|
|
696
|
+
sessions.set(sessionId, session);
|
|
697
|
+
return session;
|
|
698
|
+
};
|
|
699
|
+
const hasSession = (sessionId) => sessions.has(sessionId);
|
|
700
|
+
const getSession = (sessionId) => {
|
|
701
|
+
const session = sessions.get(sessionId);
|
|
702
|
+
if (session) touchSession(session, now());
|
|
703
|
+
return session;
|
|
704
|
+
};
|
|
705
|
+
const getSessionByRunId = (runId) => {
|
|
706
|
+
const sessionId = runIdToSessionId.get(runId);
|
|
707
|
+
if (!sessionId) return;
|
|
708
|
+
const session = sessions.get(sessionId);
|
|
709
|
+
if (session) touchSession(session, now());
|
|
710
|
+
return session;
|
|
711
|
+
};
|
|
712
|
+
const setActiveRun = (sessionId, runId, abortController) => {
|
|
713
|
+
const session = sessions.get(sessionId);
|
|
714
|
+
if (!session) return;
|
|
715
|
+
session.activeRunId = runId;
|
|
716
|
+
session.abortController = abortController;
|
|
717
|
+
runIdToSessionId.set(runId, sessionId);
|
|
718
|
+
touchSession(session, now());
|
|
719
|
+
};
|
|
720
|
+
const clearActiveRun = (sessionId) => {
|
|
721
|
+
const session = sessions.get(sessionId);
|
|
722
|
+
if (!session) return;
|
|
723
|
+
if (session.activeRunId) runIdToSessionId.delete(session.activeRunId);
|
|
724
|
+
session.activeRunId = null;
|
|
725
|
+
session.abortController = null;
|
|
726
|
+
touchSession(session, now());
|
|
727
|
+
};
|
|
728
|
+
const cancelActiveRun = (sessionId) => {
|
|
729
|
+
const session = sessions.get(sessionId);
|
|
730
|
+
if (!session?.abortController) return false;
|
|
731
|
+
session.abortController.abort();
|
|
732
|
+
if (session.activeRunId) runIdToSessionId.delete(session.activeRunId);
|
|
733
|
+
session.abortController = null;
|
|
734
|
+
session.activeRunId = null;
|
|
735
|
+
touchSession(session, now());
|
|
736
|
+
return true;
|
|
737
|
+
};
|
|
738
|
+
const clearAllSessionsForTest = () => {
|
|
739
|
+
for (const session of sessions.values()) session.abortController?.abort();
|
|
740
|
+
sessions.clear();
|
|
741
|
+
runIdToSessionId.clear();
|
|
742
|
+
};
|
|
743
|
+
return {
|
|
744
|
+
createSession,
|
|
745
|
+
hasSession,
|
|
746
|
+
getSession,
|
|
747
|
+
getSessionByRunId,
|
|
748
|
+
setActiveRun,
|
|
749
|
+
clearActiveRun,
|
|
750
|
+
cancelActiveRun,
|
|
751
|
+
clearAllSessionsForTest
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
const defaultAcpSessionStore = createInMemorySessionStore();
|
|
755
|
+
|
|
756
|
+
//#endregion
|
|
757
|
+
//#region src/acp/types.ts
|
|
758
|
+
const ACP_AGENT_INFO = {
|
|
759
|
+
name: "remoteclaw-acp",
|
|
760
|
+
title: "RemoteClaw ACP Gateway",
|
|
761
|
+
version: VERSION
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
//#endregion
|
|
765
|
+
//#region src/acp/translator.ts
|
|
766
|
+
const MAX_PROMPT_BYTES = 2 * 1024 * 1024;
|
|
767
|
+
const SESSION_CREATE_RATE_LIMIT_DEFAULT_MAX_REQUESTS = 120;
|
|
768
|
+
const SESSION_CREATE_RATE_LIMIT_DEFAULT_WINDOW_MS = 1e4;
|
|
769
|
+
var AcpGatewayAgent = class {
|
|
770
|
+
constructor(connection, gateway, opts = {}) {
|
|
771
|
+
this.pendingPrompts = /* @__PURE__ */ new Map();
|
|
772
|
+
this.connection = connection;
|
|
773
|
+
this.gateway = gateway;
|
|
774
|
+
this.opts = opts;
|
|
775
|
+
this.log = opts.verbose ? (msg) => process.stderr.write(`[acp] ${msg}\n`) : () => {};
|
|
776
|
+
this.sessionStore = opts.sessionStore ?? defaultAcpSessionStore;
|
|
777
|
+
this.sessionCreateRateLimiter = createFixedWindowRateLimiter({
|
|
778
|
+
maxRequests: Math.max(1, opts.sessionCreateRateLimit?.maxRequests ?? SESSION_CREATE_RATE_LIMIT_DEFAULT_MAX_REQUESTS),
|
|
779
|
+
windowMs: Math.max(1e3, opts.sessionCreateRateLimit?.windowMs ?? SESSION_CREATE_RATE_LIMIT_DEFAULT_WINDOW_MS)
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
start() {
|
|
783
|
+
this.log("ready");
|
|
784
|
+
}
|
|
785
|
+
handleGatewayReconnect() {
|
|
786
|
+
this.log("gateway reconnected");
|
|
787
|
+
}
|
|
788
|
+
handleGatewayDisconnect(reason) {
|
|
789
|
+
this.log(`gateway disconnected: ${reason}`);
|
|
790
|
+
for (const pending of this.pendingPrompts.values()) {
|
|
791
|
+
pending.reject(/* @__PURE__ */ new Error(`Gateway disconnected: ${reason}`));
|
|
792
|
+
this.sessionStore.clearActiveRun(pending.sessionId);
|
|
793
|
+
}
|
|
794
|
+
this.pendingPrompts.clear();
|
|
795
|
+
}
|
|
796
|
+
async handleGatewayEvent(evt) {
|
|
797
|
+
if (evt.event === "chat") {
|
|
798
|
+
await this.handleChatEvent(evt);
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
if (evt.event === "agent") await this.handleAgentEvent(evt);
|
|
802
|
+
}
|
|
803
|
+
async initialize(_params) {
|
|
804
|
+
return {
|
|
805
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
806
|
+
agentCapabilities: {
|
|
807
|
+
loadSession: true,
|
|
808
|
+
promptCapabilities: {
|
|
809
|
+
image: true,
|
|
810
|
+
audio: false,
|
|
811
|
+
embeddedContext: true
|
|
812
|
+
},
|
|
813
|
+
mcpCapabilities: {
|
|
814
|
+
http: false,
|
|
815
|
+
sse: false
|
|
816
|
+
},
|
|
817
|
+
sessionCapabilities: { list: {} }
|
|
818
|
+
},
|
|
819
|
+
agentInfo: ACP_AGENT_INFO,
|
|
820
|
+
authMethods: []
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
async newSession(params) {
|
|
824
|
+
if (params.mcpServers.length > 0) this.log(`ignoring ${params.mcpServers.length} MCP servers`);
|
|
825
|
+
this.enforceSessionCreateRateLimit("newSession");
|
|
826
|
+
const sessionId = randomUUID();
|
|
827
|
+
const meta = parseSessionMeta(params._meta);
|
|
828
|
+
const sessionKey = await resolveSessionKey({
|
|
829
|
+
meta,
|
|
830
|
+
fallbackKey: `acp:${sessionId}`,
|
|
831
|
+
gateway: this.gateway,
|
|
832
|
+
opts: this.opts
|
|
833
|
+
});
|
|
834
|
+
await resetSessionIfNeeded({
|
|
835
|
+
meta,
|
|
836
|
+
sessionKey,
|
|
837
|
+
gateway: this.gateway,
|
|
838
|
+
opts: this.opts
|
|
839
|
+
});
|
|
840
|
+
const session = this.sessionStore.createSession({
|
|
841
|
+
sessionId,
|
|
842
|
+
sessionKey,
|
|
843
|
+
cwd: params.cwd
|
|
844
|
+
});
|
|
845
|
+
this.log(`newSession: ${session.sessionId} -> ${session.sessionKey}`);
|
|
846
|
+
await this.sendAvailableCommands(session.sessionId);
|
|
847
|
+
return { sessionId: session.sessionId };
|
|
848
|
+
}
|
|
849
|
+
async loadSession(params) {
|
|
850
|
+
if (params.mcpServers.length > 0) this.log(`ignoring ${params.mcpServers.length} MCP servers`);
|
|
851
|
+
if (!this.sessionStore.hasSession(params.sessionId)) this.enforceSessionCreateRateLimit("loadSession");
|
|
852
|
+
const meta = parseSessionMeta(params._meta);
|
|
853
|
+
const sessionKey = await resolveSessionKey({
|
|
854
|
+
meta,
|
|
855
|
+
fallbackKey: params.sessionId,
|
|
856
|
+
gateway: this.gateway,
|
|
857
|
+
opts: this.opts
|
|
858
|
+
});
|
|
859
|
+
await resetSessionIfNeeded({
|
|
860
|
+
meta,
|
|
861
|
+
sessionKey,
|
|
862
|
+
gateway: this.gateway,
|
|
863
|
+
opts: this.opts
|
|
864
|
+
});
|
|
865
|
+
const session = this.sessionStore.createSession({
|
|
866
|
+
sessionId: params.sessionId,
|
|
867
|
+
sessionKey,
|
|
868
|
+
cwd: params.cwd
|
|
869
|
+
});
|
|
870
|
+
this.log(`loadSession: ${session.sessionId} -> ${session.sessionKey}`);
|
|
871
|
+
await this.sendAvailableCommands(session.sessionId);
|
|
872
|
+
return {};
|
|
873
|
+
}
|
|
874
|
+
async unstable_listSessions(params) {
|
|
875
|
+
const limit = readNumber(params._meta, ["limit"]) ?? 100;
|
|
876
|
+
const result = await this.gateway.request("sessions.list", { limit });
|
|
877
|
+
const cwd = params.cwd ?? process.cwd();
|
|
878
|
+
return {
|
|
879
|
+
sessions: result.sessions.map((session) => ({
|
|
880
|
+
sessionId: session.key,
|
|
881
|
+
cwd,
|
|
882
|
+
title: session.displayName ?? session.label ?? session.key,
|
|
883
|
+
updatedAt: session.updatedAt ? new Date(session.updatedAt).toISOString() : void 0,
|
|
884
|
+
_meta: {
|
|
885
|
+
sessionKey: session.key,
|
|
886
|
+
kind: session.kind,
|
|
887
|
+
channel: session.channel
|
|
888
|
+
}
|
|
889
|
+
})),
|
|
890
|
+
nextCursor: null
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
async authenticate(_params) {
|
|
894
|
+
return {};
|
|
895
|
+
}
|
|
896
|
+
async setSessionMode(params) {
|
|
897
|
+
const session = this.sessionStore.getSession(params.sessionId);
|
|
898
|
+
if (!session) throw new Error(`Session ${params.sessionId} not found`);
|
|
899
|
+
if (!params.modeId) return {};
|
|
900
|
+
try {
|
|
901
|
+
await this.gateway.request("sessions.patch", {
|
|
902
|
+
key: session.sessionKey,
|
|
903
|
+
thinkingLevel: params.modeId
|
|
904
|
+
});
|
|
905
|
+
this.log(`setSessionMode: ${session.sessionId} -> ${params.modeId}`);
|
|
906
|
+
} catch (err) {
|
|
907
|
+
this.log(`setSessionMode error: ${String(err)}`);
|
|
908
|
+
}
|
|
909
|
+
return {};
|
|
910
|
+
}
|
|
911
|
+
async prompt(params) {
|
|
912
|
+
const session = this.sessionStore.getSession(params.sessionId);
|
|
913
|
+
if (!session) throw new Error(`Session ${params.sessionId} not found`);
|
|
914
|
+
if (session.abortController) this.sessionStore.cancelActiveRun(params.sessionId);
|
|
915
|
+
const meta = parseSessionMeta(params._meta);
|
|
916
|
+
const userText = extractTextFromPrompt(params.prompt, MAX_PROMPT_BYTES);
|
|
917
|
+
const attachments = extractAttachmentsFromPrompt(params.prompt);
|
|
918
|
+
const prefixCwd = meta.prefixCwd ?? this.opts.prefixCwd ?? true;
|
|
919
|
+
const displayCwd = shortenHomePath(session.cwd);
|
|
920
|
+
const message = prefixCwd ? `[Working directory: ${displayCwd}]\n\n${userText}` : userText;
|
|
921
|
+
if (Buffer.byteLength(message, "utf-8") > MAX_PROMPT_BYTES) throw new Error(`Prompt exceeds maximum allowed size of ${MAX_PROMPT_BYTES} bytes`);
|
|
922
|
+
const abortController = new AbortController();
|
|
923
|
+
const runId = randomUUID();
|
|
924
|
+
this.sessionStore.setActiveRun(params.sessionId, runId, abortController);
|
|
925
|
+
return new Promise((resolve, reject) => {
|
|
926
|
+
this.pendingPrompts.set(params.sessionId, {
|
|
927
|
+
sessionId: params.sessionId,
|
|
928
|
+
sessionKey: session.sessionKey,
|
|
929
|
+
idempotencyKey: runId,
|
|
930
|
+
resolve,
|
|
931
|
+
reject
|
|
932
|
+
});
|
|
933
|
+
this.gateway.request("chat.send", {
|
|
934
|
+
sessionKey: session.sessionKey,
|
|
935
|
+
message,
|
|
936
|
+
attachments: attachments.length > 0 ? attachments : void 0,
|
|
937
|
+
idempotencyKey: runId,
|
|
938
|
+
thinking: readString(params._meta, ["thinking", "thinkingLevel"]),
|
|
939
|
+
deliver: readBool(params._meta, ["deliver"]),
|
|
940
|
+
timeoutMs: readNumber(params._meta, ["timeoutMs"])
|
|
941
|
+
}, { expectFinal: true }).catch((err) => {
|
|
942
|
+
this.pendingPrompts.delete(params.sessionId);
|
|
943
|
+
this.sessionStore.clearActiveRun(params.sessionId);
|
|
944
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
945
|
+
});
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
async cancel(params) {
|
|
949
|
+
const session = this.sessionStore.getSession(params.sessionId);
|
|
950
|
+
if (!session) return;
|
|
951
|
+
this.sessionStore.cancelActiveRun(params.sessionId);
|
|
952
|
+
try {
|
|
953
|
+
await this.gateway.request("chat.abort", { sessionKey: session.sessionKey });
|
|
954
|
+
} catch (err) {
|
|
955
|
+
this.log(`cancel error: ${String(err)}`);
|
|
956
|
+
}
|
|
957
|
+
const pending = this.pendingPrompts.get(params.sessionId);
|
|
958
|
+
if (pending) {
|
|
959
|
+
this.pendingPrompts.delete(params.sessionId);
|
|
960
|
+
pending.resolve({ stopReason: "cancelled" });
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
async handleAgentEvent(evt) {
|
|
964
|
+
const payload = evt.payload;
|
|
965
|
+
if (!payload) return;
|
|
966
|
+
const stream = payload.stream;
|
|
967
|
+
const data = payload.data;
|
|
968
|
+
const sessionKey = payload.sessionKey;
|
|
969
|
+
if (!stream || !data || !sessionKey) return;
|
|
970
|
+
if (stream !== "tool") return;
|
|
971
|
+
const phase = data.phase;
|
|
972
|
+
const name = data.name;
|
|
973
|
+
const toolCallId = data.toolCallId;
|
|
974
|
+
if (!toolCallId) return;
|
|
975
|
+
const pending = this.findPendingBySessionKey(sessionKey);
|
|
976
|
+
if (!pending) return;
|
|
977
|
+
if (phase === "start") {
|
|
978
|
+
if (!pending.toolCalls) pending.toolCalls = /* @__PURE__ */ new Set();
|
|
979
|
+
if (pending.toolCalls.has(toolCallId)) return;
|
|
980
|
+
pending.toolCalls.add(toolCallId);
|
|
981
|
+
const args = data.args;
|
|
982
|
+
await this.connection.sessionUpdate({
|
|
983
|
+
sessionId: pending.sessionId,
|
|
984
|
+
update: {
|
|
985
|
+
sessionUpdate: "tool_call",
|
|
986
|
+
toolCallId,
|
|
987
|
+
title: formatToolTitle(name, args),
|
|
988
|
+
status: "in_progress",
|
|
989
|
+
rawInput: args,
|
|
990
|
+
kind: inferToolKind(name)
|
|
991
|
+
}
|
|
992
|
+
});
|
|
993
|
+
return;
|
|
994
|
+
}
|
|
995
|
+
if (phase === "result") {
|
|
996
|
+
const isError = Boolean(data.isError);
|
|
997
|
+
await this.connection.sessionUpdate({
|
|
998
|
+
sessionId: pending.sessionId,
|
|
999
|
+
update: {
|
|
1000
|
+
sessionUpdate: "tool_call_update",
|
|
1001
|
+
toolCallId,
|
|
1002
|
+
status: isError ? "failed" : "completed",
|
|
1003
|
+
rawOutput: data.result
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
async handleChatEvent(evt) {
|
|
1009
|
+
const payload = evt.payload;
|
|
1010
|
+
if (!payload) return;
|
|
1011
|
+
const sessionKey = payload.sessionKey;
|
|
1012
|
+
const state = payload.state;
|
|
1013
|
+
const runId = payload.runId;
|
|
1014
|
+
const messageData = payload.message;
|
|
1015
|
+
if (!sessionKey || !state) return;
|
|
1016
|
+
const pending = this.findPendingBySessionKey(sessionKey);
|
|
1017
|
+
if (!pending) return;
|
|
1018
|
+
if (runId && pending.idempotencyKey !== runId) return;
|
|
1019
|
+
if (state === "delta" && messageData) {
|
|
1020
|
+
await this.handleDeltaEvent(pending.sessionId, messageData);
|
|
1021
|
+
return;
|
|
1022
|
+
}
|
|
1023
|
+
if (state === "final") {
|
|
1024
|
+
this.finishPrompt(pending.sessionId, pending, "end_turn");
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
if (state === "aborted") {
|
|
1028
|
+
this.finishPrompt(pending.sessionId, pending, "cancelled");
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
if (state === "error") this.finishPrompt(pending.sessionId, pending, "refusal");
|
|
1032
|
+
}
|
|
1033
|
+
async handleDeltaEvent(sessionId, messageData) {
|
|
1034
|
+
const fullText = messageData.content?.find((c) => c.type === "text")?.text ?? "";
|
|
1035
|
+
const pending = this.pendingPrompts.get(sessionId);
|
|
1036
|
+
if (!pending) return;
|
|
1037
|
+
const sentSoFar = pending.sentTextLength ?? 0;
|
|
1038
|
+
if (fullText.length <= sentSoFar) return;
|
|
1039
|
+
const newText = fullText.slice(sentSoFar);
|
|
1040
|
+
pending.sentTextLength = fullText.length;
|
|
1041
|
+
pending.sentText = fullText;
|
|
1042
|
+
await this.connection.sessionUpdate({
|
|
1043
|
+
sessionId,
|
|
1044
|
+
update: {
|
|
1045
|
+
sessionUpdate: "agent_message_chunk",
|
|
1046
|
+
content: {
|
|
1047
|
+
type: "text",
|
|
1048
|
+
text: newText
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
finishPrompt(sessionId, pending, stopReason) {
|
|
1054
|
+
this.pendingPrompts.delete(sessionId);
|
|
1055
|
+
this.sessionStore.clearActiveRun(sessionId);
|
|
1056
|
+
pending.resolve({ stopReason });
|
|
1057
|
+
}
|
|
1058
|
+
findPendingBySessionKey(sessionKey) {
|
|
1059
|
+
for (const pending of this.pendingPrompts.values()) if (pending.sessionKey === sessionKey) return pending;
|
|
1060
|
+
}
|
|
1061
|
+
async sendAvailableCommands(sessionId) {
|
|
1062
|
+
await this.connection.sessionUpdate({
|
|
1063
|
+
sessionId,
|
|
1064
|
+
update: {
|
|
1065
|
+
sessionUpdate: "available_commands_update",
|
|
1066
|
+
availableCommands: getAvailableCommands()
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
enforceSessionCreateRateLimit(method) {
|
|
1071
|
+
const budget = this.sessionCreateRateLimiter.consume();
|
|
1072
|
+
if (budget.allowed) return;
|
|
1073
|
+
throw new Error(`ACP session creation rate limit exceeded for ${method}; retry after ${Math.ceil(budget.retryAfterMs / 1e3)}s.`);
|
|
1074
|
+
}
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
//#endregion
|
|
1078
|
+
//#region src/acp/server.ts
|
|
1079
|
+
async function serveAcpGateway(opts = {}) {
|
|
1080
|
+
const cfg = loadConfig();
|
|
1081
|
+
const connection = buildGatewayConnectionDetails({
|
|
1082
|
+
config: cfg,
|
|
1083
|
+
url: opts.gatewayUrl
|
|
1084
|
+
});
|
|
1085
|
+
const creds = resolveGatewayCredentialsFromConfig({
|
|
1086
|
+
cfg,
|
|
1087
|
+
env: process.env,
|
|
1088
|
+
explicitAuth: {
|
|
1089
|
+
token: opts.gatewayToken,
|
|
1090
|
+
password: opts.gatewayPassword
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
let agent = null;
|
|
1094
|
+
let onClosed;
|
|
1095
|
+
const closed = new Promise((resolve) => {
|
|
1096
|
+
onClosed = resolve;
|
|
1097
|
+
});
|
|
1098
|
+
let stopped = false;
|
|
1099
|
+
let onGatewayReadyResolve;
|
|
1100
|
+
let onGatewayReadyReject;
|
|
1101
|
+
let gatewayReadySettled = false;
|
|
1102
|
+
const gatewayReady = new Promise((resolve, reject) => {
|
|
1103
|
+
onGatewayReadyResolve = resolve;
|
|
1104
|
+
onGatewayReadyReject = reject;
|
|
1105
|
+
});
|
|
1106
|
+
const resolveGatewayReady = () => {
|
|
1107
|
+
if (gatewayReadySettled) return;
|
|
1108
|
+
gatewayReadySettled = true;
|
|
1109
|
+
onGatewayReadyResolve();
|
|
1110
|
+
};
|
|
1111
|
+
const rejectGatewayReady = (err) => {
|
|
1112
|
+
if (gatewayReadySettled) return;
|
|
1113
|
+
gatewayReadySettled = true;
|
|
1114
|
+
onGatewayReadyReject(err instanceof Error ? err : new Error(String(err)));
|
|
1115
|
+
};
|
|
1116
|
+
const gateway = new GatewayClient({
|
|
1117
|
+
url: connection.url,
|
|
1118
|
+
token: creds.token,
|
|
1119
|
+
password: creds.password,
|
|
1120
|
+
clientName: GATEWAY_CLIENT_NAMES.CLI,
|
|
1121
|
+
clientDisplayName: "ACP",
|
|
1122
|
+
clientVersion: "acp",
|
|
1123
|
+
mode: GATEWAY_CLIENT_MODES.CLI,
|
|
1124
|
+
onEvent: (evt) => {
|
|
1125
|
+
agent?.handleGatewayEvent(evt);
|
|
1126
|
+
},
|
|
1127
|
+
onHelloOk: () => {
|
|
1128
|
+
resolveGatewayReady();
|
|
1129
|
+
agent?.handleGatewayReconnect();
|
|
1130
|
+
},
|
|
1131
|
+
onConnectError: (err) => {
|
|
1132
|
+
rejectGatewayReady(err);
|
|
1133
|
+
},
|
|
1134
|
+
onClose: (code, reason) => {
|
|
1135
|
+
if (!stopped) rejectGatewayReady(/* @__PURE__ */ new Error(`gateway closed before ready (${code}): ${reason}`));
|
|
1136
|
+
agent?.handleGatewayDisconnect(`${code}: ${reason}`);
|
|
1137
|
+
if (stopped) onClosed();
|
|
1138
|
+
}
|
|
1139
|
+
});
|
|
1140
|
+
const shutdown = () => {
|
|
1141
|
+
if (stopped) return;
|
|
1142
|
+
stopped = true;
|
|
1143
|
+
resolveGatewayReady();
|
|
1144
|
+
gateway.stop();
|
|
1145
|
+
onClosed();
|
|
1146
|
+
};
|
|
1147
|
+
process.once("SIGINT", shutdown);
|
|
1148
|
+
process.once("SIGTERM", shutdown);
|
|
1149
|
+
gateway.start();
|
|
1150
|
+
await gatewayReady.catch((err) => {
|
|
1151
|
+
shutdown();
|
|
1152
|
+
throw err;
|
|
1153
|
+
});
|
|
1154
|
+
if (stopped) return closed;
|
|
1155
|
+
new AgentSideConnection((conn) => {
|
|
1156
|
+
agent = new AcpGatewayAgent(conn, gateway, opts);
|
|
1157
|
+
agent.start();
|
|
1158
|
+
return agent;
|
|
1159
|
+
}, ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin)));
|
|
1160
|
+
return closed;
|
|
1161
|
+
}
|
|
1162
|
+
function parseArgs(args) {
|
|
1163
|
+
const opts = {};
|
|
1164
|
+
let tokenFile;
|
|
1165
|
+
let passwordFile;
|
|
1166
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
1167
|
+
const arg = args[i];
|
|
1168
|
+
if (arg === "--url" || arg === "--gateway-url") {
|
|
1169
|
+
opts.gatewayUrl = args[i + 1];
|
|
1170
|
+
i += 1;
|
|
1171
|
+
continue;
|
|
1172
|
+
}
|
|
1173
|
+
if (arg === "--token" || arg === "--gateway-token") {
|
|
1174
|
+
opts.gatewayToken = args[i + 1];
|
|
1175
|
+
i += 1;
|
|
1176
|
+
continue;
|
|
1177
|
+
}
|
|
1178
|
+
if (arg === "--token-file" || arg === "--gateway-token-file") {
|
|
1179
|
+
tokenFile = args[i + 1];
|
|
1180
|
+
i += 1;
|
|
1181
|
+
continue;
|
|
1182
|
+
}
|
|
1183
|
+
if (arg === "--password" || arg === "--gateway-password") {
|
|
1184
|
+
opts.gatewayPassword = args[i + 1];
|
|
1185
|
+
i += 1;
|
|
1186
|
+
continue;
|
|
1187
|
+
}
|
|
1188
|
+
if (arg === "--password-file" || arg === "--gateway-password-file") {
|
|
1189
|
+
passwordFile = args[i + 1];
|
|
1190
|
+
i += 1;
|
|
1191
|
+
continue;
|
|
1192
|
+
}
|
|
1193
|
+
if (arg === "--session") {
|
|
1194
|
+
opts.defaultSessionKey = args[i + 1];
|
|
1195
|
+
i += 1;
|
|
1196
|
+
continue;
|
|
1197
|
+
}
|
|
1198
|
+
if (arg === "--session-label") {
|
|
1199
|
+
opts.defaultSessionLabel = args[i + 1];
|
|
1200
|
+
i += 1;
|
|
1201
|
+
continue;
|
|
1202
|
+
}
|
|
1203
|
+
if (arg === "--require-existing") {
|
|
1204
|
+
opts.requireExistingSession = true;
|
|
1205
|
+
continue;
|
|
1206
|
+
}
|
|
1207
|
+
if (arg === "--reset-session") {
|
|
1208
|
+
opts.resetSession = true;
|
|
1209
|
+
continue;
|
|
1210
|
+
}
|
|
1211
|
+
if (arg === "--no-prefix-cwd") {
|
|
1212
|
+
opts.prefixCwd = false;
|
|
1213
|
+
continue;
|
|
1214
|
+
}
|
|
1215
|
+
if (arg === "--verbose" || arg === "-v") {
|
|
1216
|
+
opts.verbose = true;
|
|
1217
|
+
continue;
|
|
1218
|
+
}
|
|
1219
|
+
if (arg === "--help" || arg === "-h") {
|
|
1220
|
+
printHelp();
|
|
1221
|
+
process.exit(0);
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
if (opts.gatewayToken?.trim() && tokenFile?.trim()) throw new Error("Use either --token or --token-file.");
|
|
1225
|
+
if (opts.gatewayPassword?.trim() && passwordFile?.trim()) throw new Error("Use either --password or --password-file.");
|
|
1226
|
+
if (tokenFile?.trim()) opts.gatewayToken = readSecretFromFile(tokenFile, "Gateway token");
|
|
1227
|
+
if (passwordFile?.trim()) opts.gatewayPassword = readSecretFromFile(passwordFile, "Gateway password");
|
|
1228
|
+
return opts;
|
|
1229
|
+
}
|
|
1230
|
+
function printHelp() {
|
|
1231
|
+
console.log(`Usage: remoteclaw acp [options]
|
|
1232
|
+
|
|
1233
|
+
Gateway-backed ACP server for IDE integration.
|
|
1234
|
+
|
|
1235
|
+
Options:
|
|
1236
|
+
--url <url> Gateway WebSocket URL
|
|
1237
|
+
--token <token> Gateway auth token
|
|
1238
|
+
--token-file <path> Read gateway auth token from file
|
|
1239
|
+
--password <password> Gateway auth password
|
|
1240
|
+
--password-file <path> Read gateway auth password from file
|
|
1241
|
+
--session <key> Default session key (e.g. "agent:main:main")
|
|
1242
|
+
--session-label <label> Default session label to resolve
|
|
1243
|
+
--require-existing Fail if the session key/label does not exist
|
|
1244
|
+
--reset-session Reset the session key before first use
|
|
1245
|
+
--no-prefix-cwd Do not prefix prompts with the working directory
|
|
1246
|
+
--verbose, -v Verbose logging to stderr
|
|
1247
|
+
--help, -h Show this help message
|
|
1248
|
+
`);
|
|
1249
|
+
}
|
|
1250
|
+
if (isMainModule({ currentFile: fileURLToPath(import.meta.url) })) {
|
|
1251
|
+
const argv = process.argv.slice(2);
|
|
1252
|
+
if (argv.includes("--token") || argv.includes("--gateway-token")) console.error("Warning: --token can be exposed via process listings. Prefer --token-file or REMOTECLAW_GATEWAY_TOKEN.");
|
|
1253
|
+
if (argv.includes("--password") || argv.includes("--gateway-password")) console.error("Warning: --password can be exposed via process listings. Prefer --password-file or REMOTECLAW_GATEWAY_PASSWORD.");
|
|
1254
|
+
serveAcpGateway(parseArgs(argv)).catch((err) => {
|
|
1255
|
+
console.error(String(err));
|
|
1256
|
+
process.exit(1);
|
|
1257
|
+
});
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
//#endregion
|
|
1261
|
+
//#region src/cli/acp-cli.ts
|
|
1262
|
+
function resolveSecretOption(params) {
|
|
1263
|
+
const direct = params.direct?.trim();
|
|
1264
|
+
const file = params.file?.trim();
|
|
1265
|
+
if (direct && file) throw new Error(`Use either ${params.directFlag} or ${params.fileFlag} for ${params.label}.`);
|
|
1266
|
+
if (file) return readSecretFromFile(file, params.label);
|
|
1267
|
+
return direct || void 0;
|
|
1268
|
+
}
|
|
1269
|
+
function warnSecretCliFlag(flag) {
|
|
1270
|
+
defaultRuntime.error(`Warning: ${flag} can be exposed via process listings. Prefer ${flag}-file or environment variables.`);
|
|
1271
|
+
}
|
|
1272
|
+
function registerAcpCli(program) {
|
|
1273
|
+
const acp = program.command("acp").description("Run an ACP bridge backed by the Gateway");
|
|
1274
|
+
acp.option("--url <url>", "Gateway WebSocket URL (defaults to gateway.remote.url when configured)").option("--token <token>", "Gateway token (if required)").option("--token-file <path>", "Read gateway token from file").option("--password <password>", "Gateway password (if required)").option("--password-file <path>", "Read gateway password from file").option("--session <key>", "Default session key (e.g. agent:main:main)").option("--session-label <label>", "Default session label to resolve").option("--require-existing", "Fail if the session key/label does not exist", false).option("--reset-session", "Reset the session key before first use", false).option("--no-prefix-cwd", "Do not prefix prompts with the working directory", false).option("-v, --verbose", "Verbose logging to stderr", false).addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/acp", "docs.remoteclaw.org/cli/acp")}\n`).action(async (opts) => {
|
|
1275
|
+
try {
|
|
1276
|
+
const gatewayToken = resolveSecretOption({
|
|
1277
|
+
direct: opts.token,
|
|
1278
|
+
file: opts.tokenFile,
|
|
1279
|
+
directFlag: "--token",
|
|
1280
|
+
fileFlag: "--token-file",
|
|
1281
|
+
label: "Gateway token"
|
|
1282
|
+
});
|
|
1283
|
+
const gatewayPassword = resolveSecretOption({
|
|
1284
|
+
direct: opts.password,
|
|
1285
|
+
file: opts.passwordFile,
|
|
1286
|
+
directFlag: "--password",
|
|
1287
|
+
fileFlag: "--password-file",
|
|
1288
|
+
label: "Gateway password"
|
|
1289
|
+
});
|
|
1290
|
+
if (opts.token) warnSecretCliFlag("--token");
|
|
1291
|
+
if (opts.password) warnSecretCliFlag("--password");
|
|
1292
|
+
await serveAcpGateway({
|
|
1293
|
+
gatewayUrl: opts.url,
|
|
1294
|
+
gatewayToken,
|
|
1295
|
+
gatewayPassword,
|
|
1296
|
+
defaultSessionKey: opts.session,
|
|
1297
|
+
defaultSessionLabel: opts.sessionLabel,
|
|
1298
|
+
requireExistingSession: Boolean(opts.requireExisting),
|
|
1299
|
+
resetSession: Boolean(opts.resetSession),
|
|
1300
|
+
prefixCwd: !opts.noPrefixCwd,
|
|
1301
|
+
verbose: Boolean(opts.verbose)
|
|
1302
|
+
});
|
|
1303
|
+
} catch (err) {
|
|
1304
|
+
defaultRuntime.error(String(err));
|
|
1305
|
+
defaultRuntime.exit(1);
|
|
1306
|
+
}
|
|
1307
|
+
});
|
|
1308
|
+
acp.command("client").description("Run an interactive ACP client against the local ACP bridge").option("--cwd <dir>", "Working directory for the ACP session").option("--server <command>", "ACP server command (default: remoteclaw)").option("--server-args <args...>", "Extra arguments for the ACP server").option("--server-verbose", "Enable verbose logging on the ACP server", false).option("-v, --verbose", "Verbose client logging", false).action(async (opts, command) => {
|
|
1309
|
+
const inheritedVerbose = inheritOptionFromParent(command, "verbose");
|
|
1310
|
+
try {
|
|
1311
|
+
await runAcpClientInteractive({
|
|
1312
|
+
cwd: opts.cwd,
|
|
1313
|
+
serverCommand: opts.server,
|
|
1314
|
+
serverArgs: opts.serverArgs,
|
|
1315
|
+
serverVerbose: Boolean(opts.serverVerbose),
|
|
1316
|
+
verbose: Boolean(opts.verbose || inheritedVerbose)
|
|
1317
|
+
});
|
|
1318
|
+
} catch (err) {
|
|
1319
|
+
defaultRuntime.error(String(err));
|
|
1320
|
+
defaultRuntime.exit(1);
|
|
1321
|
+
}
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
//#endregion
|
|
1326
|
+
export { registerAcpCli };
|