@noxsoft/anima 2.0.2 → 2.0.4
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/README.md +1260 -28
- package/dist/accounts-Bth3PpPD.js +260 -0
- package/dist/accounts-D8CPKNkN.js +259 -0
- package/dist/acp-cli-ByK6lS6c.js +1081 -0
- package/dist/acp-cli-CaQCjIw4.js +1084 -0
- package/dist/agent-BgIkqd3F.js +725 -0
- package/dist/agent-N5BDcge4.js +725 -0
- package/dist/agent-events-COH7NDW2.js +182 -0
- package/dist/agent-scope-CPphqq-U.js +452 -0
- package/dist/agent-scope-DZgptr9J.js +452 -0
- package/dist/agent-scope-cj2QCT6R.js +112 -0
- package/dist/agents-NEudYMdg.js +774 -0
- package/dist/agents.config-Bujs-NIy.js +182 -0
- package/dist/agents.config-jp7OLssr.js +182 -0
- package/dist/argv-BMZMiW7v.js +73 -0
- package/dist/audit-C-UJhfdv.js +2401 -0
- package/dist/audit-CeCO7SK5.js +2401 -0
- package/dist/auth-BNZsOHGF.js +648 -0
- package/dist/auth-DMPZWzEa.js +639 -0
- package/dist/auth-choice-5VnaGMD-.js +2681 -0
- package/dist/auth-choice-DA2k4vs8.js +2681 -0
- package/dist/auth-health-B7FqA26_.js +149 -0
- package/dist/auth-health-VO_MPqVX.js +149 -0
- package/dist/auth-profiles-BDrNYX_n.js +1564 -0
- package/dist/auth-profiles-CxSHydjn.js +2689 -0
- package/dist/banner-BtDZPRzi.js +294 -0
- package/dist/browser-cli-8yQMpxb8.js +1679 -0
- package/dist/browser-cli-Czg3JtDH.js +1676 -0
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +16 -16
- package/dist/bundled/bootstrap-extra-files/handler.js +4 -4
- package/dist/bundled/command-logger/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +5 -5
- package/dist/call-BIzCaKZb.js +282 -0
- package/dist/call-BYDpTVCZ.js +282 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/catalog-CqKiUgu6.js +185 -0
- package/dist/catalog-DMfEg-oK.js +185 -0
- package/dist/channel-options-BrtCtyrT.js +32 -0
- package/dist/channel-options-CO21Gl8p.js +33 -0
- package/dist/channel-selection-Bbm1lq3P.js +51 -0
- package/dist/channel-selection-CqcX7Ocw.js +51 -0
- package/dist/channel-web-DrsT6OAE.js +2162 -0
- package/dist/channels-cli-Juyh1S6n.js +1304 -0
- package/dist/channels-cli-zNvi1m5c.js +1306 -0
- package/dist/channels-status-issues-CqzqshW4.js +18 -0
- package/dist/channels-status-issues-DdJdO866.js +18 -0
- package/dist/chrome-C4dOMO8z.js +1601 -0
- package/dist/chrome-DdcDzAtH.js +1629 -0
- package/dist/chrome-U3DRzjJD.js +1601 -0
- package/dist/chunk-D2nLsrEW.js +348 -0
- package/dist/clack-prompter-BI3RDW5w.js +92 -0
- package/dist/clack-prompter-Dwr1m_IZ.js +92 -0
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/cli-C3cpDaz8.js +99 -0
- package/dist/cli-CjWUGdGC.js +101 -0
- package/dist/cli-session-BVjY_XrW.js +5463 -0
- package/dist/cli-session-gtuYN2Iq.js +5408 -0
- package/dist/client-Dswwze5_.js +1692 -0
- package/dist/client-LRKFjo4A.js +1692 -0
- package/dist/clipboard-BZKS9O1u.js +31 -0
- package/dist/clipboard-DES8b1AM.js +31 -0
- package/dist/command-format-CP1YTNCl.js +52 -0
- package/dist/command-format-CVL4K5cj.js +52 -0
- package/dist/command-format-G6N2zghg.js +38 -0
- package/dist/command-registry-BBvNvysr.js +248 -0
- package/dist/commands-AZ3n8Y2c.js +726 -0
- package/dist/commands-BMnD_QRY.js +726 -0
- package/dist/commands-registry-cFqZ6Ib4.js +766 -0
- package/dist/commands-registry-q13H7ng5.js +766 -0
- package/dist/common-CX5458fH.js +287 -0
- package/dist/common-DJbnT8ws.js +287 -0
- package/dist/completion-cli-BADRBcIl.js +432 -0
- package/dist/completion-cli-DMQgiObF.js +431 -0
- package/dist/config-CU-Axg8P.js +5704 -0
- package/dist/config-DaqbUdkI.js +5705 -0
- package/dist/config-cli-BPlbwiuA.js +244 -0
- package/dist/config-cli-DXgZJkPU.js +247 -0
- package/dist/config-guard-Ba49JNds.js +76 -0
- package/dist/config-guard-Cu0qMKZJ.js +93 -0
- package/dist/config-kVVm5EYV.js +6523 -0
- package/dist/config-sync-CzLnLTXt.js +91 -0
- package/dist/config-sync-DuydxPWx.js +91 -0
- package/dist/configure-CHgacLyi.js +960 -0
- package/dist/configure-DfHXDa1L.js +959 -0
- package/dist/context-DzgXOckU.js +60 -0
- package/dist/control-service-8_wKHwBa.js +72 -0
- package/dist/control-service-BtL1Jto_.js +72 -0
- package/dist/cron-cli-BCzSR2c0.js +448 -0
- package/dist/cron-cli-CCWNkykU.js +451 -0
- package/dist/daemon-cli-Bjkbu9Vy.js +565 -0
- package/dist/daemon-cli-CmlHcC1J.js +566 -0
- package/dist/daemon-cli.js +16 -16
- package/dist/daemon-runtime-C0tz7VAC.js +460 -0
- package/dist/daemon-runtime-rUTqCVwJ.js +460 -0
- package/dist/deliver-BBggsviM.js +1097 -0
- package/dist/deliver-CePITOl8.js +1162 -0
- package/dist/deliver-DFnVaetP.js +1097 -0
- package/dist/delivery-queue-BJQK3oh5.js +220 -0
- package/dist/deps-CeEKhrp7.js +42 -0
- package/dist/devices-cli-DQrDMrZH.js +198 -0
- package/dist/devices-cli-Oe-A1Dv0.js +195 -0
- package/dist/diagnostics-DxMFrBLO.js +35 -0
- package/dist/diagnostics-m79ZlMmZ.js +35 -0
- package/dist/directory-cli-BL6h8cGF.js +246 -0
- package/dist/directory-cli-Cjgmi_sj.js +243 -0
- package/dist/dispatcher-DAFbQM-c.js +100 -0
- package/dist/dispatcher-DNd40gUn.js +100 -0
- package/dist/dist-CqDI82ei.js +929 -0
- package/dist/dist-DnHRxR5U.js +929 -0
- package/dist/dns-cli-CFtV3BXK.js +200 -0
- package/dist/dns-cli-NyIHvQ5S.js +197 -0
- package/dist/dock-BdXLb5oY.js +753 -0
- package/dist/dock-jYICmNcI.js +753 -0
- package/dist/docs-cli-CrOaIK_H.js +161 -0
- package/dist/docs-cli-D_cmJDSr.js +159 -0
- package/dist/doctor-BpGxKrBl.js +1815 -0
- package/dist/doctor-D12wNQPU.js +1813 -0
- package/dist/doctor-completion-DeOfofek.js +92 -0
- package/dist/doctor-completion-DwjqdEcK.js +92 -0
- package/dist/doctor-config-flow-BI3mpkbd.js +1232 -0
- package/dist/doctor-config-flow-wMHheFkC.js +1232 -0
- package/dist/engine-BCtL-AMw.js +563 -0
- package/dist/engine-Bk_UT413.js +563 -0
- package/dist/entry.js +5 -5
- package/dist/env-v6411I8h.js +32 -0
- package/dist/exec-B7sUS164.js +1167 -0
- package/dist/exec-approvals-CroGJRUg.js +1221 -0
- package/dist/exec-approvals-cli-BTxF_RsH.js +371 -0
- package/dist/exec-approvals-cli-n1gyGwH2.js +368 -0
- package/dist/exec-mhSykkaa.js +255 -0
- package/dist/extensionAPI.js +3 -3
- package/dist/frontmatter-BmHq0vRD.js +204 -0
- package/dist/gateway-cli-DDBadlrS.js +19971 -0
- package/dist/gateway-cli-IZNkOMBe.js +19972 -0
- package/dist/gateway-rpc-Dtx8HN-n.js +28 -0
- package/dist/gateway-rpc-L2PVSqGj.js +28 -0
- package/dist/github-copilot-auth-DKyqDaGU.js +1418 -0
- package/dist/github-copilot-auth-DXpOMSd3.js +1418 -0
- package/dist/gmail-setup-utils-BKNczIJ9.js +428 -0
- package/dist/gmail-setup-utils-co0ppccC.js +428 -0
- package/dist/health-Bm8ZTvC3.js +1253 -0
- package/dist/health-DUf1gt4E.js +1258 -0
- package/dist/health-format-BksT6F68.js +208 -0
- package/dist/health-format-uzh1xYLD.js +208 -0
- package/dist/heartbeat-visibility-1TJb1Zao.js +98 -0
- package/dist/heartbeat-visibility-CwodtdcX.js +98 -0
- package/dist/help-format-C6cv_aZp.js +17 -0
- package/dist/helpers-N-uSFKOn.js +10 -0
- package/dist/hooks-cli-1POsXqOl.js +993 -0
- package/dist/hooks-cli-BGjILbze.js +991 -0
- package/dist/hooks-status-DE07n5RC.js +356 -0
- package/dist/hooks-status-Du-d1jde.js +356 -0
- package/dist/image-ops-B_AYV3tp.js +541 -0
- package/dist/image-ops-Bp0C6Mvr.js +541 -0
- package/dist/index.js +82 -82
- package/dist/init-9A0s7bWG.js +122 -0
- package/dist/init-DoyCHJDC.js +122 -0
- package/dist/installs-D1C9wHAq.js +383 -0
- package/dist/installs-Dh4dHayM.js +383 -0
- package/dist/ipv4-DCItfaJo.js +1964 -0
- package/dist/ipv4-DSOUVx0i.js +1964 -0
- package/dist/lanes-BvSnHq2h.js +232 -0
- package/dist/lifecycle-core-BY4WIf9g.js +388 -0
- package/dist/lifecycle-core-TQKyXO-6.js +387 -0
- package/dist/links-CNu_8RZl.js +15 -0
- package/dist/links-D2tt2ouh.js +15 -0
- package/dist/llm-slug-generator.js +4 -4
- package/dist/logging-BIeRw0WR.js +15 -0
- package/dist/logging-C7lb3Vjc.js +15 -0
- package/dist/login-DXWKewA2.js +59 -0
- package/dist/login-Fhh4uWmf.js +61 -0
- package/dist/login-pPs3UO38.js +61 -0
- package/dist/login-qr-CevLD8cV.js +326 -0
- package/dist/login-qr-GF2JMIy-.js +323 -0
- package/dist/login-qr-ZYYKD6Yt.js +321 -0
- package/dist/logs-cli-CzXbX8HZ.js +242 -0
- package/dist/logs-cli-D9ngH9PF.js +245 -0
- package/dist/manager-BD5rA3w0.js +3244 -0
- package/dist/manager-BDPgBQSH.js +3246 -0
- package/dist/manager-DRWMWM--.js +3244 -0
- package/dist/manifest-registry-DbvPaBXY.js +748 -0
- package/dist/manifest-registry-kHX_MFa1.js +748 -0
- package/dist/markdown-tables-CqwihY2m.js +347 -0
- package/dist/markdown-tables-DJV7eAJZ.js +348 -0
- package/dist/media-lUqN-0O9.js +1342 -0
- package/dist/memory-cli-BLXSpgnN.js +868 -0
- package/dist/memory-cli-BcGVkkRJ.js +869 -0
- package/dist/message-channel-D_jIO87f.js +110 -0
- package/dist/migrate-BpVOar4L.js +157 -0
- package/dist/migrate-CkgGDkWy.js +157 -0
- package/dist/model-selection-Cqt6aJ0G.js +2691 -0
- package/dist/models-CExsNQPH.js +2510 -0
- package/dist/models-cli-Ba3Jmwev.js +2739 -0
- package/dist/models-cli-iDAlsbL2.js +258 -0
- package/dist/net-0A_zcaQD.js +218 -0
- package/dist/node-cli-ATmwCXIk.js +1319 -0
- package/dist/node-cli-DYFR_V25.js +1322 -0
- package/dist/node-service-CN4LqR1A.js +67 -0
- package/dist/node-service-CWt3MdSC.js +67 -0
- package/dist/nodes-cli-BeVmhTz3.js +1197 -0
- package/dist/nodes-cli-QeJIfa18.js +1200 -0
- package/dist/nodes-screen-DHyWAlla.js +234 -0
- package/dist/nodes-screen-qs3jRBPk.js +234 -0
- package/dist/note-CSlg2BnB.js +73 -0
- package/dist/note-Ctvglhp1.js +73 -0
- package/dist/npm-registry-spec-DQd4M22q.js +351 -0
- package/dist/npm-registry-spec-PxisIMts.js +351 -0
- package/dist/onboard-DeruD10m.js +1166 -0
- package/dist/onboard-SAcu5N6N.js +1165 -0
- package/dist/onboard-channels-C4iSfFXR.js +672 -0
- package/dist/onboard-channels-oVTVgoyg.js +672 -0
- package/dist/onboard-helpers-B8roRwLP.js +365 -0
- package/dist/onboard-helpers-Dgh26hgP.js +365 -0
- package/dist/onboarding-Bi-ac8we.js +911 -0
- package/dist/onboarding-C2gjB2u8.js +910 -0
- package/dist/orchestrator-DlbAYMQP.js +357 -0
- package/dist/orchestrator-DlwVRVDA.js +357 -0
- package/dist/outbound-CkKgc6iR.js +2062 -0
- package/dist/outbound-Vfm5yDh3.js +214 -0
- package/dist/outbound-bs_VK51X.js +214 -0
- package/dist/outbound-send-deps-DDjiMfEL.js +55 -0
- package/dist/pairing-cli-CJYeuEik.js +118 -0
- package/dist/pairing-cli-mqopHI8s.js +121 -0
- package/dist/pairing-store-BsXzUDPv.js +388 -0
- package/dist/pairing-store-DoNj00-X.js +388 -0
- package/dist/path-env-C_xpiG8l.js +89 -0
- package/dist/path-env-DSSMHu5A.js +89 -0
- package/dist/paths-B1vRVCad.js +126 -0
- package/dist/paths-BMuHNFxg.js +238 -0
- package/dist/paths-BXQQzXGQ.js +129 -0
- package/dist/paths-Buw_geoe.js +54 -0
- package/dist/paths-DA9WYabg.js +222 -0
- package/dist/paths-DfQGx0_k.js +129 -0
- package/dist/pi-auth-json-DOPW3e4X.js +78 -0
- package/dist/pi-auth-json-MruLmI_X.js +82 -0
- package/dist/pi-auth-json-lae_wwwo.js +80 -0
- package/dist/pi-model-discovery-7q0GxMrp.js +3 -0
- package/dist/pi-tools.policy-Csmla32P.js +200 -0
- package/dist/pi-tools.policy-xYdDLEv9.js +200 -0
- package/dist/plugin-auto-enable-CViVVWgg.js +282 -0
- package/dist/plugin-auto-enable-CjZ238UI.js +282 -0
- package/dist/plugin-registry-B4Aw2hzq.js +32 -0
- package/dist/plugin-registry-DW81arxW.js +32 -0
- package/dist/plugin-sdk/cli/cli-name.d.ts +1 -1
- package/dist/plugin-sdk/config/paths.d.ts +2 -2
- package/dist/plugin-sdk/index.js +7 -7
- package/dist/plugins-DhcGAPDB.js +38 -0
- package/dist/plugins-DtghNRtM.js +168 -0
- package/dist/plugins-cli-4vWTmOAb.js +736 -0
- package/dist/plugins-cli-CdTMbP0X.js +734 -0
- package/dist/polls-D6eCdatA.js +1343 -0
- package/dist/ports-BtZx-JKD.js +96 -0
- package/dist/ports-C8bKN8s0.js +96 -0
- package/dist/ports-DHiKnPRX.js +344 -0
- package/dist/ports-vd93M_Pt.js +317 -0
- package/dist/program-CX3aUVeb.js +176 -0
- package/dist/program-context-BPos0ivo.js +496 -0
- package/dist/progress-oiAjiiNi.js +133 -0
- package/dist/prompt-style-Cm4wOtKm.js +9 -0
- package/dist/pw-ai-4QbK5YFe.js +1865 -0
- package/dist/pw-ai-BWz3Cxt7.js +1868 -0
- package/dist/pw-ai-C83HBue2.js +1867 -0
- package/dist/qmd-manager-BcMeZiGD.js +938 -0
- package/dist/qmd-manager-CPypGJ0P.js +935 -0
- package/dist/qmd-manager-CRrSkfia.js +937 -0
- package/dist/register.agent-DDY8KJhn.js +265 -0
- package/dist/register.agent-DKawm-9d.js +1003 -0
- package/dist/register.anima-CEWUo29k.js +193 -0
- package/dist/register.anima-DBWz2rk_.js +193 -0
- package/dist/register.configure-BX67qV8k.js +103 -0
- package/dist/register.configure-CWsySuiq.js +101 -0
- package/dist/register.maintenance-0k-ZNhDg.js +543 -0
- package/dist/register.maintenance-BIwx1fzX.js +543 -0
- package/dist/register.message-CXPsoakA.js +657 -0
- package/dist/register.message-DA3jvfgI.js +660 -0
- package/dist/register.onboard-C4HG7Hqv.js +170 -0
- package/dist/register.onboard-GOpdif-j.js +170 -0
- package/dist/register.setup-B17vZT7C.js +175 -0
- package/dist/register.setup-GJyUDCqh.js +175 -0
- package/dist/register.status-health-sessions-D5876dGx.js +313 -0
- package/dist/register.status-health-sessions-lOewVIZR.js +142 -0
- package/dist/register.subclis-Dwnujj5C.js +255 -0
- package/dist/reply-CR5T_oQJ.js +32212 -0
- package/dist/reply-prefix-BcrS4Umd.js +100 -0
- package/dist/reply-prefix-Btb5o2NH.js +100 -0
- package/dist/reply-r089HuRA.js +32212 -0
- package/dist/routes-B4czFzIb.js +1820 -0
- package/dist/routes-ucJWAk5O.js +1820 -0
- package/dist/rpc-BnKxnQ0v.js +70 -0
- package/dist/rpc-DgE-xnyx.js +70 -0
- package/dist/run-main-B74kv84C.js +371 -0
- package/dist/runtime-guard-CKFdts2L.js +60 -0
- package/dist/sandbox-CJTS3er6.js +858 -0
- package/dist/sandbox-DBSiVHt_.js +859 -0
- package/dist/sandbox-cli-CrkjyU5M.js +461 -0
- package/dist/sandbox-cli-D1r5y6Sz.js +458 -0
- package/dist/security-cli-BZUdnkhn.js +462 -0
- package/dist/security-cli-DS09ebvA.js +465 -0
- package/dist/server-context-C0xZbYhg.js +824 -0
- package/dist/server-context-DVh2z7om.js +824 -0
- package/dist/server-node-events-bu9lpkMH.js +233 -0
- package/dist/server-node-events-i1Rrww31.js +231 -0
- package/dist/service-CJJwLEor.js +642 -0
- package/dist/service-DxLxBhaU.js +642 -0
- package/dist/service-audit-DB4Y3Ekp.js +488 -0
- package/dist/service-audit-M8y4TXVb.js +488 -0
- package/dist/session-CGxOLFs2.js +179 -0
- package/dist/session-DTTbdKb0.js +181 -0
- package/dist/session-cost-usage-FcdJl9c3.js +600 -0
- package/dist/session-cost-usage-qdfsGU2a.js +600 -0
- package/dist/session-yOhWcsD2.js +181 -0
- package/dist/sessions-B-Cu7JZq.js +1296 -0
- package/dist/sessions-BgLN4KFr.js +180 -0
- package/dist/sessions-CnRjwdVr.js +1296 -0
- package/dist/sessions-wRKla1Qh.js +2038 -0
- package/dist/shared-DS3UaJSP.js +66 -0
- package/dist/shared-DxNHzky3.js +77 -0
- package/dist/shared-Qpt4hUDi.js +66 -0
- package/dist/shared-kzrojZ1B.js +77 -0
- package/dist/skill-scanner-DLJji5Ye.js +263 -0
- package/dist/skills-BWFIEp4j.js +807 -0
- package/dist/skills-DV4zKdCx.js +808 -0
- package/dist/skills-cli-BY53ILm2.js +289 -0
- package/dist/skills-cli-CO3gxl8A.js +286 -0
- package/dist/skills-status-DX5pcqY3.js +166 -0
- package/dist/skills-status-zhcKzGkp.js +166 -0
- package/dist/sqlite-B6MojU1I.js +321 -0
- package/dist/sqlite-CuprTGR7.js +453 -0
- package/dist/sqlite-dzD-jMjs.js +368 -0
- package/dist/start-Cu3aLoSf.js +297 -0
- package/dist/start-Dz7tMAl8.js +296 -0
- package/dist/status-CaSxhxfV.js +2132 -0
- package/dist/status-D2C0JCX3.js +2137 -0
- package/dist/status-DlFMsQzh.js +27 -0
- package/dist/status-G0CITnKR.js +27 -0
- package/dist/status.update-CHjhVxJY.js +79 -0
- package/dist/status.update-DVFelehi.js +79 -0
- package/dist/subagent-registry-3Xb4el-8.js +14 -0
- package/dist/subagent-registry-CdSjz14I.js +2760 -0
- package/dist/subagent-registry-DNDhbHWi.js +2759 -0
- package/dist/subsystem-DfKstnEK.js +860 -0
- package/dist/system-cli-B5mt0FWa.js +82 -0
- package/dist/system-cli-Dg3UQ3Zz.js +79 -0
- package/dist/systemd-B43AvOGx.js +452 -0
- package/dist/systemd-RpPE0XGg.js +452 -0
- package/dist/systemd-hints-DMJT-Bbc.js +36 -0
- package/dist/systemd-hints-vRInKcz9.js +36 -0
- package/dist/systemd-linger-Dzyxqsod.js +75 -0
- package/dist/systemd-linger-EujbmI5A.js +75 -0
- package/dist/table-DhXHfRX2.js +279 -0
- package/dist/table-bWCLW-3P.js +279 -0
- package/dist/timeout-Ddn-5kAO.js +232 -0
- package/dist/tokens-3psI_Qk2.js +14 -0
- package/dist/tokens-BaM53PEx.js +14 -0
- package/dist/trash-Bmxs1Rnm.js +23 -0
- package/dist/trash-C39a6hKA.js +23 -0
- package/dist/tui-BHgBWhHE.js +3894 -0
- package/dist/tui-cli-B9Sq5-cC.js +50 -0
- package/dist/tui-cli-Dw7v4JoJ.js +47 -0
- package/dist/tui-mUwDwqvd.js +3894 -0
- package/dist/update-DF0GHG0j.js +317 -0
- package/dist/update-DoZLVjva.js +317 -0
- package/dist/update-check-Bt1dVPVN.js +400 -0
- package/dist/update-check-D5qAKes7.js +400 -0
- package/dist/update-cli-BNu2Oi7H.js +1105 -0
- package/dist/update-cli-D36AmALA.js +1105 -0
- package/dist/update-runner-CNQQaTwA.js +894 -0
- package/dist/update-runner-CvxZmbu-.js +894 -0
- package/dist/usage-BGCwNnjk.js +4516 -0
- package/dist/utils-DZ8pnOD5.js +243 -0
- package/dist/web-B5QG839O.js +46842 -0
- package/dist/web-Cmnvk9v0.js +2203 -0
- package/dist/web-Cv2KnTnL.js +63 -0
- package/dist/webhooks-cli-B6y89Pj_.js +319 -0
- package/dist/webhooks-cli-BDzHON4w.js +316 -0
- package/dist/whatsapp-actions-C_5MwVxM.js +45 -0
- package/dist/whatsapp-actions-hgYA12To.js +53 -0
- package/dist/whatsapp-actions-zTiVOoOV.js +49 -0
- package/dist/widearea-dns-BeIdnISJ.js +127 -0
- package/dist/widearea-dns-CF1gxpJ-.js +127 -0
- package/dist/workspace-DLna1IxR.js +649 -0
- package/dist/ws-log-Q4wO1Ztb.js +267 -0
- package/dist/ws-log-xF0kxDzp.js +267 -0
- package/package.json +1 -2
- package/dist/accounts-Cc5E4IDO.js +0 -260
- package/dist/accounts-CcVrwKqv.js +0 -259
- package/dist/acp-cli-DvphOKuh.js +0 -1081
- package/dist/acp-cli-p28pQ65a.js +0 -1084
- package/dist/agent-Cj7uDJaZ.js +0 -725
- package/dist/agent-Cuj9-2sT.js +0 -725
- package/dist/agent-events-BEBQsyE5.js +0 -182
- package/dist/agent-scope-BVf4aSwY.js +0 -112
- package/dist/agent-scope-OZi7lb8S.js +0 -452
- package/dist/agent-scope-V1bi9OYL.js +0 -452
- package/dist/agents-BUWqn_Ui.js +0 -774
- package/dist/agents.config-Dvo2ULxs.js +0 -182
- package/dist/agents.config-d6H0_3oj.js +0 -182
- package/dist/argv-DqUHKf0o.js +0 -73
- package/dist/audit-C6okOOSh.js +0 -2401
- package/dist/audit-VWjIdwC7.js +0 -2401
- package/dist/auth-91o2YM96.js +0 -648
- package/dist/auth-choice-CAmACV13.js +0 -2681
- package/dist/auth-choice-p3SeHPj2.js +0 -2681
- package/dist/auth-health-B_jXrWe6.js +0 -149
- package/dist/auth-health-DCicUKYR.js +0 -149
- package/dist/auth-lZ26wsbN.js +0 -639
- package/dist/auth-profiles-CCDD56dU.js +0 -1564
- package/dist/auth-profiles-DxI8L7bs.js +0 -2689
- package/dist/banner-Cohn04J6.js +0 -294
- package/dist/browser-cli-DANzjztE.js +0 -1676
- package/dist/browser-cli-WjsVH741.js +0 -1679
- package/dist/call-BAHvlu2G.js +0 -282
- package/dist/call-Ct7EGP_L.js +0 -282
- package/dist/catalog-BAayBt1L.js +0 -185
- package/dist/catalog-BNsf97BM.js +0 -185
- package/dist/channel-options-Dx9nPlX8.js +0 -33
- package/dist/channel-options-ZdvXrTGs.js +0 -32
- package/dist/channel-selection-CujyiWGM.js +0 -51
- package/dist/channel-selection-DfGpCyh2.js +0 -51
- package/dist/channel-web-CC0hkgkR.js +0 -2162
- package/dist/channels-cli-D7lNBpIb.js +0 -1304
- package/dist/channels-cli-DUPG8WDv.js +0 -1306
- package/dist/channels-status-issues-DBc1pU_R.js +0 -18
- package/dist/channels-status-issues-DjO9MHIG.js +0 -18
- package/dist/chrome-Bi6iZ5sG.js +0 -1601
- package/dist/chrome-DNSv7Cpy.js +0 -1629
- package/dist/chrome-DScZx4Lk.js +0 -1601
- package/dist/chunk-mxPVo000.js +0 -348
- package/dist/clack-prompter-B0kl7shw.js +0 -92
- package/dist/clack-prompter-B1YxZdRy.js +0 -92
- package/dist/cli-CfHUkOD0.js +0 -101
- package/dist/cli-ClMrIh6l.js +0 -99
- package/dist/cli-session-BkPTd9Pk.js +0 -5463
- package/dist/cli-session-Dd8DKb5a.js +0 -5408
- package/dist/client-C1avc0vD.js +0 -1692
- package/dist/client-CC94YZrT.js +0 -1692
- package/dist/clipboard-B2fBy8tG.js +0 -31
- package/dist/clipboard-BbGnZskJ.js +0 -31
- package/dist/command-format-Clp46jkj.js +0 -38
- package/dist/command-format-DELazozB.js +0 -52
- package/dist/command-format-SkzzRqR1.js +0 -52
- package/dist/command-registry-DZ4hkmA0.js +0 -248
- package/dist/commands-DtYZJSPn.js +0 -568
- package/dist/commands-Dujk1JmY.js +0 -568
- package/dist/commands-registry-Bd0xbvwG.js +0 -766
- package/dist/commands-registry-DYfRSVF3.js +0 -766
- package/dist/common-D6bu0zHC.js +0 -287
- package/dist/common-zW9Y2P1B.js +0 -287
- package/dist/completion-cli-tSe7Pmqm.js +0 -431
- package/dist/completion-cli-vn4IScs5.js +0 -432
- package/dist/config-C8rUDJXY.js +0 -5704
- package/dist/config-CLZ_XGVw.js +0 -6523
- package/dist/config-SY8M0kM_.js +0 -5705
- package/dist/config-cli-1V7D2Wsw.js +0 -247
- package/dist/config-cli-CjWEC81L.js +0 -244
- package/dist/config-guard-BW2gpKj_.js +0 -93
- package/dist/config-guard-BvxuzHpo.js +0 -76
- package/dist/config-sync-CoIIbEOe.js +0 -91
- package/dist/config-sync-DvAttep0.js +0 -91
- package/dist/configure-Bf0oupCE.js +0 -959
- package/dist/configure-DRM-7zFf.js +0 -960
- package/dist/context-D5iEFzv9.js +0 -60
- package/dist/control-service-C8m8F9pr.js +0 -72
- package/dist/control-service-DKotCWCg.js +0 -72
- package/dist/cron-cli-DB_FLYHD.js +0 -448
- package/dist/cron-cli-bxm5lrrO.js +0 -451
- package/dist/daemon-cli-1LsOnICv.js +0 -566
- package/dist/daemon-cli-CC2NrJ7a.js +0 -565
- package/dist/daemon-runtime-BXZhtBL9.js +0 -460
- package/dist/daemon-runtime-DW4USC7r.js +0 -460
- package/dist/deliver-B4HuPwJA.js +0 -1162
- package/dist/deliver-LiY5oL52.js +0 -1097
- package/dist/deliver-xrmk7xjh.js +0 -1097
- package/dist/delivery-queue-TnQykYsg.js +0 -220
- package/dist/deps-CMMOiOsF.js +0 -42
- package/dist/devices-cli-Be5he2SA.js +0 -195
- package/dist/devices-cli-z6ecoFe9.js +0 -198
- package/dist/diagnostics-Dj75aEHN.js +0 -35
- package/dist/diagnostics-DlIw6fqD.js +0 -35
- package/dist/directory-cli-CEy-0nxj.js +0 -243
- package/dist/directory-cli-DpzKcigr.js +0 -246
- package/dist/dispatcher-10Shiuz3.js +0 -100
- package/dist/dispatcher-3Jae6AiW.js +0 -100
- package/dist/dns-cli-Bat1pkc-.js +0 -200
- package/dist/dns-cli-NohNyEo0.js +0 -197
- package/dist/dock-DbxBBv30.js +0 -753
- package/dist/dock-cPBY4qGl.js +0 -753
- package/dist/docs-cli-BWp6p-Tq.js +0 -161
- package/dist/docs-cli-x22FnZfL.js +0 -159
- package/dist/doctor-BrT5m_on.js +0 -1815
- package/dist/doctor-Pp2HVnjM.js +0 -1813
- package/dist/doctor-completion-DNTimX9o.js +0 -92
- package/dist/doctor-completion-ylN9QAJ6.js +0 -92
- package/dist/doctor-config-flow-D1w3700T.js +0 -1232
- package/dist/doctor-config-flow-Dq50iE1R.js +0 -1232
- package/dist/engine-B9avUJL5.js +0 -563
- package/dist/engine-BiUQ25D4.js +0 -563
- package/dist/env-0lJfCPsw.js +0 -32
- package/dist/exec-BenD3A5l.js +0 -1167
- package/dist/exec-Bv3pyjeM.js +0 -255
- package/dist/exec-approvals-CdLmKX2R.js +0 -1221
- package/dist/exec-approvals-cli-DXfV6G8H.js +0 -368
- package/dist/exec-approvals-cli-J2cZs10o.js +0 -371
- package/dist/frontmatter-YijVi0FQ.js +0 -204
- package/dist/gateway-cli-DOAbA0pc.js +0 -19972
- package/dist/gateway-cli-QpWtBhQy.js +0 -19971
- package/dist/gateway-rpc-DJKBil9s.js +0 -28
- package/dist/gateway-rpc-DVterpLP.js +0 -28
- package/dist/github-copilot-auth-4IUFp669.js +0 -1418
- package/dist/github-copilot-auth-C9E0IROs.js +0 -1418
- package/dist/gmail-setup-utils-BPo_LkKI.js +0 -428
- package/dist/gmail-setup-utils-D3Yqgor7.js +0 -428
- package/dist/health-BeZnqp6m.js +0 -1258
- package/dist/health-Cn2OoVWZ.js +0 -1253
- package/dist/health-format-CdP99j3Y.js +0 -208
- package/dist/health-format-JEChH08S.js +0 -208
- package/dist/heartbeat-visibility-BL3WAchI.js +0 -98
- package/dist/heartbeat-visibility-CQ9QimI7.js +0 -98
- package/dist/help-format-Dl4bsrLI.js +0 -17
- package/dist/helpers-ZKNRexvX.js +0 -10
- package/dist/hooks-cli-D99hXt7K.js +0 -991
- package/dist/hooks-cli-DMB8RiEO.js +0 -993
- package/dist/hooks-status-B-e96dZj.js +0 -356
- package/dist/hooks-status-C_9sE0ox.js +0 -356
- package/dist/image-ops-Dlt3T7th.js +0 -541
- package/dist/image-ops-omlvdfah.js +0 -541
- package/dist/init-Bm04RagW.js +0 -122
- package/dist/init-CaJBf4p1.js +0 -122
- package/dist/installs-C2iMRBVz.js +0 -383
- package/dist/installs-D-cPGdCw.js +0 -383
- package/dist/ipv4-Bf7NS3QU.js +0 -1964
- package/dist/ipv4-wWNs8IH_.js +0 -1964
- package/dist/lanes-CNxj3tit.js +0 -232
- package/dist/lifecycle-core-B_7XRcvF.js +0 -388
- package/dist/lifecycle-core-By83PVAK.js +0 -387
- package/dist/links-BfjHVTB_.js +0 -15
- package/dist/links-DPGe0OHw.js +0 -15
- package/dist/logging-DB6BQmhi.js +0 -15
- package/dist/logging-mcb66J0p.js +0 -15
- package/dist/login-BDCg6D0N.js +0 -61
- package/dist/login-BDfnbjnZ.js +0 -59
- package/dist/login-BqH1itcg.js +0 -61
- package/dist/login-qr-CyOw3R4r.js +0 -321
- package/dist/login-qr-D8ECtb72.js +0 -323
- package/dist/login-qr-RnR7e4Bw.js +0 -326
- package/dist/logs-cli--j89L74J.js +0 -245
- package/dist/logs-cli-DpEMg_Gq.js +0 -242
- package/dist/manager-B4OyvcxT.js +0 -3244
- package/dist/manager-Cqc1CeH7.js +0 -3246
- package/dist/manager-DUyQPFvj.js +0 -3244
- package/dist/manifest-registry-CW1zCyRF.js +0 -748
- package/dist/manifest-registry-D4lM2RdV.js +0 -748
- package/dist/markdown-tables-BT1X6jqH.js +0 -347
- package/dist/markdown-tables-DHgOK2vI.js +0 -348
- package/dist/media-THyainiE.js +0 -1342
- package/dist/memory-cli-BKocCWXM.js +0 -868
- package/dist/memory-cli-Jmma-xI_.js +0 -869
- package/dist/message-channel-dSTVVCyX.js +0 -110
- package/dist/migrate-BR6iAIjO.js +0 -157
- package/dist/migrate-D0EcMs0f.js +0 -157
- package/dist/model-selection-YcSr9CgC.js +0 -2691
- package/dist/models-1vUQBVfw.js +0 -2510
- package/dist/models-cli-BK3BwUhL.js +0 -2739
- package/dist/models-cli-DECrM8oA.js +0 -258
- package/dist/net-B5lXhYLV.js +0 -218
- package/dist/node-cli-cLHUNpPD.js +0 -1319
- package/dist/node-cli-fO7Y132S.js +0 -1322
- package/dist/node-service-BFxHJsno.js +0 -67
- package/dist/node-service-DUnan4uK.js +0 -67
- package/dist/nodes-cli-BCq35E6N.js +0 -1200
- package/dist/nodes-cli-vD7MwAKP.js +0 -1197
- package/dist/nodes-screen-1YiLkqr5.js +0 -234
- package/dist/nodes-screen-DZeD8hE5.js +0 -234
- package/dist/note-Bi8Wb8DV.js +0 -73
- package/dist/note-uiuPxhyX.js +0 -73
- package/dist/npm-registry-spec-B-XIShkB.js +0 -351
- package/dist/npm-registry-spec-za3itb5Y.js +0 -351
- package/dist/onboard-Ds6w_sWo.js +0 -1165
- package/dist/onboard-SAVx3bp4.js +0 -1166
- package/dist/onboard-channels-Cg_EkBa4.js +0 -672
- package/dist/onboard-channels-D7NbA55V.js +0 -672
- package/dist/onboard-helpers-DO_hgZb9.js +0 -365
- package/dist/onboard-helpers-_XgJgeqh.js +0 -365
- package/dist/onboarding-3hLmDd0r.js +0 -911
- package/dist/onboarding-B4LKLsbU.js +0 -910
- package/dist/orchestrator-BKzmyBWy.js +0 -357
- package/dist/orchestrator-BN3QCz2s.js +0 -357
- package/dist/outbound-BgA9hNlP.js +0 -2062
- package/dist/outbound-CjdvVhUI.js +0 -214
- package/dist/outbound-DOGe6qb2.js +0 -214
- package/dist/outbound-send-deps-Du5aBpd7.js +0 -55
- package/dist/pairing-cli-2vnyg_Nd.js +0 -118
- package/dist/pairing-cli-BH1KQtNV.js +0 -121
- package/dist/pairing-store-DJz_9Gv0.js +0 -388
- package/dist/pairing-store-DmOzxcuk.js +0 -388
- package/dist/path-env-Bu6k0jDQ.js +0 -89
- package/dist/path-env-C0zQSjw8.js +0 -89
- package/dist/paths-BTc4nk-6.js +0 -126
- package/dist/paths-BgUi2Z2G.js +0 -54
- package/dist/paths-C6VCWKo3.js +0 -238
- package/dist/paths-CCxa0o9c.js +0 -222
- package/dist/paths-CxRf2rBG.js +0 -129
- package/dist/paths-hcX1Gqg5.js +0 -129
- package/dist/pi-auth-json-B68R7q7_.js +0 -82
- package/dist/pi-auth-json-CR0jXAgq.js +0 -78
- package/dist/pi-auth-json-ZYzi3nxs.js +0 -80
- package/dist/pi-model-discovery-Cxs4pvC2.js +0 -3
- package/dist/pi-tools.policy-D81U5xy0.js +0 -200
- package/dist/pi-tools.policy-DSHkkb5b.js +0 -200
- package/dist/plugin-auto-enable-CxF4bpDN.js +0 -282
- package/dist/plugin-auto-enable-jNaAeyEh.js +0 -282
- package/dist/plugin-registry-C7XWotZG.js +0 -32
- package/dist/plugin-registry-DcUCbGax.js +0 -32
- package/dist/plugins-B362e77G.js +0 -168
- package/dist/plugins-CmSUIUNi.js +0 -38
- package/dist/plugins-cli-BsCEnoQ7.js +0 -734
- package/dist/plugins-cli-QSIsMUG7.js +0 -736
- package/dist/polls-CItfB1H8.js +0 -1343
- package/dist/ports-BVLMN1Sr.js +0 -96
- package/dist/ports-CqLSlU6Z.js +0 -317
- package/dist/ports-D94CwCrv.js +0 -344
- package/dist/ports-D_NHthOz.js +0 -96
- package/dist/program-DkJHjI0R.js +0 -176
- package/dist/program-context-DnyGM2SC.js +0 -496
- package/dist/progress-Bek_GyWS.js +0 -133
- package/dist/prompt-style-lu0clOOE.js +0 -9
- package/dist/pw-ai-BLVMuSLv.js +0 -1867
- package/dist/pw-ai-DZJWEF_f.js +0 -1865
- package/dist/pw-ai-dzf-ptcn.js +0 -1868
- package/dist/qmd-manager-Cur_Ekn0.js +0 -937
- package/dist/qmd-manager-DNAUuwjK.js +0 -938
- package/dist/qmd-manager-DepEoASu.js +0 -935
- package/dist/register.agent-CSWvzOkR.js +0 -265
- package/dist/register.agent-UeH2NXmH.js +0 -1003
- package/dist/register.anima-DOdee0dh.js +0 -193
- package/dist/register.anima-HHDWsz6r.js +0 -193
- package/dist/register.configure-CSJFxdz9.js +0 -103
- package/dist/register.configure-D84Fvcz4.js +0 -101
- package/dist/register.maintenance-B3pvNbZb.js +0 -543
- package/dist/register.maintenance-BKVOwkw6.js +0 -543
- package/dist/register.message-BAO6CPl2.js +0 -657
- package/dist/register.message-OXoOKE_6.js +0 -660
- package/dist/register.onboard-BK_ixVmD.js +0 -170
- package/dist/register.onboard-cfCaPx6j.js +0 -170
- package/dist/register.setup-BGfDnzph.js +0 -175
- package/dist/register.setup-Y-Q74M-0.js +0 -175
- package/dist/register.status-health-sessions-CT14eitH.js +0 -142
- package/dist/register.status-health-sessions-TfZMzAUn.js +0 -313
- package/dist/register.subclis-BZwdlNHC.js +0 -255
- package/dist/reply-mlsExaZm.js +0 -32212
- package/dist/reply-prefix-B0CfR4bM.js +0 -100
- package/dist/reply-prefix-w4a39ybC.js +0 -100
- package/dist/reply-qalRISe_.js +0 -32212
- package/dist/routes-CENsHJyg.js +0 -1820
- package/dist/routes-DO0HqW2e.js +0 -1820
- package/dist/rpc-C0pjNhBi.js +0 -70
- package/dist/rpc-DZ44PIXE.js +0 -70
- package/dist/run-main-BMpKw8Mp.js +0 -371
- package/dist/runtime-guard-BSUFiAQV.js +0 -60
- package/dist/sandbox-BIGfMYEI.js +0 -858
- package/dist/sandbox-DxP3IpUP.js +0 -859
- package/dist/sandbox-cli-DtLGH8sL.js +0 -461
- package/dist/sandbox-cli-_Tg7lfJ_.js +0 -458
- package/dist/security-cli-BRwgbedo.js +0 -462
- package/dist/security-cli-D3bSuyZt.js +0 -465
- package/dist/server-context-49XFFxFg.js +0 -824
- package/dist/server-context-LrlgrZzS.js +0 -824
- package/dist/server-node-events-Dm52i7NW.js +0 -231
- package/dist/server-node-events-QX523UyF.js +0 -233
- package/dist/service-BNVpYcQe.js +0 -642
- package/dist/service-D56aMXUB.js +0 -642
- package/dist/service-audit-D0X_XAB2.js +0 -488
- package/dist/service-audit-qmf6XMmP.js +0 -488
- package/dist/session-CrQQLLhx.js +0 -179
- package/dist/session-LocsOOWJ.js +0 -181
- package/dist/session-Vlce2BAT.js +0 -181
- package/dist/session-cost-usage-BwiTZuKl.js +0 -600
- package/dist/session-cost-usage-DT9YNXTJ.js +0 -600
- package/dist/sessions-BfV53TbG.js +0 -1296
- package/dist/sessions-BimpX_km.js +0 -180
- package/dist/sessions-DcXpzig0.js +0 -1296
- package/dist/sessions-Wd18dukK.js +0 -2038
- package/dist/shared-Bsr69u_7.js +0 -77
- package/dist/shared-Cgly1vPb.js +0 -66
- package/dist/shared-JOo05hST.js +0 -66
- package/dist/shared-f7dvQsi7.js +0 -77
- package/dist/skill-scanner-CkaVLABv.js +0 -263
- package/dist/skills-B-G7UHOa.js +0 -808
- package/dist/skills-B5LQx4lT.js +0 -807
- package/dist/skills-cli-DUGe2ZWW.js +0 -286
- package/dist/skills-cli-DtOk0bvK.js +0 -289
- package/dist/skills-status-Clq9ZnYu.js +0 -166
- package/dist/skills-status-JQluhU-P.js +0 -166
- package/dist/sqlite-BukcjdJa.js +0 -321
- package/dist/sqlite-CGcOZZ0C.js +0 -368
- package/dist/sqlite-Ck6f9KWc.js +0 -453
- package/dist/start--xmSFepB.js +0 -372
- package/dist/start-BdlZbqrr.js +0 -371
- package/dist/status-BgoeFm6g.js +0 -2137
- package/dist/status-BjjDrUq7.js +0 -27
- package/dist/status-Ct0DgOZ-.js +0 -2132
- package/dist/status-RA_uNmK0.js +0 -27
- package/dist/status.update-BjOH3GlS.js +0 -79
- package/dist/status.update-DLU1qBf0.js +0 -79
- package/dist/subagent-registry-9RLdKxES.js +0 -2760
- package/dist/subagent-registry-Byuex3zp.js +0 -2759
- package/dist/subagent-registry-DOBunBYS.js +0 -14
- package/dist/subsystem-Dowf8fSU.js +0 -860
- package/dist/system-cli-C5oBpzni.js +0 -79
- package/dist/system-cli-DXNKD_Id.js +0 -82
- package/dist/systemd-BSrHDyeU.js +0 -452
- package/dist/systemd-By5xdSB4.js +0 -452
- package/dist/systemd-hints-BtjL_5Rh.js +0 -36
- package/dist/systemd-hints-sJmr6cjb.js +0 -36
- package/dist/systemd-linger-CTmV2Gci.js +0 -75
- package/dist/systemd-linger-CmyqQkeC.js +0 -75
- package/dist/table-BL0lJzsm.js +0 -279
- package/dist/table-DoiRPsn0.js +0 -279
- package/dist/timeout-CswI_K-U.js +0 -232
- package/dist/tokens-C-X7wDKj.js +0 -14
- package/dist/tokens-DkvqA72p.js +0 -14
- package/dist/trash-BJLK1vMn.js +0 -23
- package/dist/trash-_x5UZ94k.js +0 -23
- package/dist/tui-BHjxDFZC.js +0 -3894
- package/dist/tui-CgOocwN8.js +0 -3894
- package/dist/tui-cli-5ANH8dE5.js +0 -47
- package/dist/tui-cli-BQ4P-JW_.js +0 -50
- package/dist/update-LFgxHHPd.js +0 -317
- package/dist/update-TxptCqk7.js +0 -317
- package/dist/update-check-CWc7YXmc.js +0 -400
- package/dist/update-check-IhlWaui6.js +0 -400
- package/dist/update-cli-PtXU62w7.js +0 -1105
- package/dist/update-cli-Va0EtETG.js +0 -1105
- package/dist/update-runner-BLeKFkiB.js +0 -894
- package/dist/update-runner-Iuzpc-_y.js +0 -894
- package/dist/usage-ApGvBLVg.js +0 -4516
- package/dist/utils-Bsw__U-F.js +0 -243
- package/dist/web-B6_Ky60G.js +0 -63
- package/dist/web-EZLQEWXY.js +0 -46842
- package/dist/web-pec8YJUX.js +0 -2203
- package/dist/webhooks-cli-BYQKTHTp.js +0 -319
- package/dist/webhooks-cli-C2_xtsUQ.js +0 -316
- package/dist/whatsapp-actions-C72VCq8f.js +0 -49
- package/dist/whatsapp-actions-Ck9Uv0Nw.js +0 -45
- package/dist/whatsapp-actions-D0reTj2k.js +0 -53
- package/dist/widearea-dns-B6ocX23x.js +0 -127
- package/dist/widearea-dns-NsEUNYwz.js +0 -127
- package/dist/workspace-Dcfoy5JJ.js +0 -649
- package/dist/ws-log-N8R5MvGE.js +0 -267
- package/dist/ws-log-gwFxPxj5.js +0 -267
- /package/dist/{auto-update-CUeF99gI.js → auto-update-CpF0fycd.js} +0 -0
- /package/dist/{auto-update-cgkp9ZTJ.js → auto-update-DNWdO7uF.js} +0 -0
- /package/dist/{brew-CVZkr0GU.js → brew-nqf_MiE4.js} +0 -0
- /package/dist/{budget-DxYQSekw.js → budget-CPedI-qW.js} +0 -0
- /package/dist/{budget-BWBp8Res.js → budget-CRpvqDRX.js} +0 -0
- /package/dist/{cli-utils-DtAxdCte.js → cli-utils-C1YHVD4o.js} +0 -0
- /package/dist/{command-options-CSbuuqHr.js → command-options-BbponVnw.js} +0 -0
- /package/dist/{command-options-Cp1tf96a.js → command-options-s0gnvXnS.js} +0 -0
- /package/dist/{constants-O8yBqCBv.js → constants-Dhb6zSIV.js} +0 -0
- /package/dist/{dangerous-tools-5ObDWy1N.js → dangerous-tools-DGTtJ_JR.js} +0 -0
- /package/dist/{dangerous-tools-Jwr7jqNw.js → dangerous-tools-DxrfTOfT.js} +0 -0
- /package/dist/{delivery-queue-B6IHz4Ry.js → delivery-queue-Bxm0nzw7.js} +0 -0
- /package/dist/{display-BDOsXu8F.js → display-Jy3UdGzA.js} +0 -0
- /package/dist/{errors-CHow2wtt.js → errors-CKaCqKga.js} +0 -0
- /package/dist/{exec-BizYYQgP.js → exec-DDmuVVNq.js} +0 -0
- /package/dist/{format-Mq6iU0_5.js → format-ByEjgyTF.js} +0 -0
- /package/dist/{format-duration-DhWzz_5b.js → format-duration-Aaj5tjJd.js} +0 -0
- /package/dist/{format-relative-C6kUHuOj.js → format-relative-79_Y1n2Y.js} +0 -0
- /package/dist/{help-format-DUBI91Ti.js → help-format-BMKzarov.js} +0 -0
- /package/dist/{helpers-eJFa4K6r.js → helpers-DpEB9Mh0.js} +0 -0
- /package/dist/{helpers-DLgbkcEn.js → helpers-FMld9sBT.js} +0 -0
- /package/dist/{input-provenance-DJBdpeKk.js → input-provenance-Cy_KnBlP.js} +0 -0
- /package/dist/{is-main-Dt9DTcH1.js → is-main-yjaVwMtJ.js} +0 -0
- /package/dist/{loader-l2OBdJ8x.js → loader-Br7Vr0zn.js} +0 -0
- /package/dist/{loader-BoYxRfcW.js → loader-CkmOrXcC.js} +0 -0
- /package/dist/{logging-BdnOSVPD.js → logging-CY-Q5cwf.js} +0 -0
- /package/dist/{message-channel-w4F2b2F6.js → message-channel-dua8OOGJ.js} +0 -0
- /package/dist/{mime-B1ZoR53M.js → mime-CBg4KybI.js} +0 -0
- /package/dist/{model-param-b-DPwyNGn8.js → model-param-b-DW9f0NN8.js} +0 -0
- /package/dist/{node-match-8XZnaid6.js → node-match-BV8bTBd4.js} +0 -0
- /package/dist/{normalize-GDK8JTNW.js → normalize-_lmlBOW9.js} +0 -0
- /package/dist/{openclaw-root-C85WMnVV.js → openclaw-root-JPvmPTf7.js} +0 -0
- /package/dist/{outbound-send-deps-ANnAhImn.js → outbound-send-deps-BfUvuWGa.js} +0 -0
- /package/dist/{parse-6-2MDhdT.js → parse-CZRwKocn.js} +0 -0
- /package/dist/{parse-log-line-Bqh1SSzC.js → parse-log-line-CvrZEK6A.js} +0 -0
- /package/dist/{parse-log-line-DUZCjXbl.js → parse-log-line-mLdat0AH.js} +0 -0
- /package/dist/{parse-port-BKB9Exlg.js → parse-port-BSOOdo7I.js} +0 -0
- /package/dist/{parse-port-DrfvwwiL.js → parse-port-Y0NK62x1.js} +0 -0
- /package/dist/{parse-timeout-Di_tcEmi.js → parse-timeout-DVPQ3n9j.js} +0 -0
- /package/dist/{paths-DcVEkYX5.js → paths-DHjlJ6cn.js} +0 -0
- /package/dist/{pi-model-discovery-DsRqYJLy.js → pi-model-discovery-DzEIEgHL.js} +0 -0
- /package/dist/{plugins-CDJw924T.js → plugins-D6PBOdkn.js} +0 -0
- /package/dist/{program-context-Bvn8046-.js → program-context-Q1hkT73c.js} +0 -0
- /package/dist/{progress-CbZ2D53A.js → progress-C9Ha1NJh.js} +0 -0
- /package/dist/{prompt-style-DKy6qQxR.js → prompt-style-DQi8j03a.js} +0 -0
- /package/dist/{prompts-BI__va99.js → prompts-BEHxUC3w.js} +0 -0
- /package/dist/{prompts-_dDWkCAz.js → prompts-CSOhuiqe.js} +0 -0
- /package/dist/{queue-D_u34pbL.js → queue-BJGo7kAB.js} +0 -0
- /package/dist/{queue-PG591iID.js → queue-DYgUbdoq.js} +0 -0
- /package/dist/{redact-ClVwO7Nn.js → redact-CyKvdFrg.js} +0 -0
- /package/dist/{registry-Bs_DJK9E.js → registry-C5MAYD4V.js} +0 -0
- /package/dist/{registry-D_zlP1U-.js → registry-CRrXXVs0.js} +0 -0
- /package/dist/{requirements-BzZxj2Wu.js → requirements-CGkxTCu4.js} +0 -0
- /package/dist/{requirements-DIW1svgA.js → requirements-CIDaOcbO.js} +0 -0
- /package/dist/{runtime-guard-DeOXA_86.js → runtime-guard-nL3Lp8T-.js} +0 -0
- /package/dist/{secret-equal-Dghy3xsA.js → secret-equal-DJpmLXlG.js} +0 -0
- /package/dist/{send-BhAfdGII.js → send-CTcxgDDU.js} +0 -0
- /package/dist/{send-ga9udK1_.js → send-DPezUR3-.js} +0 -0
- /package/dist/{send-C2t9xpXI.js → send-DZQTaG7-.js} +0 -0
- /package/dist/{send-DigO-i9j.js → send-VDff2gra.js} +0 -0
- /package/dist/{send-Dz2BDHll.js → send-bgQNV8d1.js} +0 -0
- /package/dist/{session-key-BGiG_JcT.js → session-key-CQT-NR6w.js} +0 -0
- /package/dist/{shell-argv-CAq1mLa2.js → shell-argv-n9IueeJQ.js} +0 -0
- /package/dist/{skill-scanner-Coo4QoCd.js → skill-scanner-o6NgVMD9.js} +0 -0
- /package/dist/{status-CMnlcBVc.js → status-C53kTIXF.js} +0 -0
- /package/dist/{status-tDZPwewW.js → status-CZDDA_Sy.js} +0 -0
- /package/dist/{system-run-command-X9lDJIy0.js → system-run-command-BCjUffN9.js} +0 -0
- /package/dist/{system-run-command-DGk7dwQP.js → system-run-command-CqAqKL9K.js} +0 -0
- /package/dist/{tailnet-CuiNECdL.js → tailnet-Ciwjv243.js} +0 -0
- /package/dist/{templates-CeYJjVzw.js → templates-37RKpACb.js} +0 -0
- /package/dist/{templates-I3Z0xplD.js → templates-DPalk30o.js} +0 -0
- /package/dist/{thinking-BXEswx1X.js → thinking-2hxwmvTl.js} +0 -0
- /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
- /package/dist/{transcript-tools-DuyYOkUq.js → transcript-tools-D4Lbxlka.js} +0 -0
- /package/dist/{usage-format-BAirWUSO.js → usage-format-6Uar63S0.js} +0 -0
- /package/dist/{utils-C9sj30YY.js → utils-DT8uXjFS.js} +0 -0
- /package/dist/{wsl-CqyuRvtM.js → wsl-CrPvx2kZ.js} +0 -0
- /package/dist/{wsl-ymJYvc9Q.js → wsl-UvJ5dHah.js} +0 -0
|
@@ -1,1200 +0,0 @@
|
|
|
1
|
-
import "./paths-C6VCWKo3.js";
|
|
2
|
-
import { B as theme, u as defaultRuntime, z as isRich } from "./subsystem-Dowf8fSU.js";
|
|
3
|
-
import { C as shortenHomePath, S as shortenHomeInString } from "./utils-Bsw__U-F.js";
|
|
4
|
-
import "./exec-Bv3pyjeM.js";
|
|
5
|
-
import { c as resolveDefaultAgentId, n as resolveAgentConfig } from "./agent-scope-V1bi9OYL.js";
|
|
6
|
-
import "./model-selection-YcSr9CgC.js";
|
|
7
|
-
import "./boolean-Wzu0-e0P.js";
|
|
8
|
-
import "./env-0lJfCPsw.js";
|
|
9
|
-
import { i as loadConfig, m as parseDurationMs } from "./config-SY8M0kM_.js";
|
|
10
|
-
import "./manifest-registry-CW1zCyRF.js";
|
|
11
|
-
import "./message-channel-dSTVVCyX.js";
|
|
12
|
-
import "./client-CC94YZrT.js";
|
|
13
|
-
import { i as randomIdempotencyKey } from "./call-Ct7EGP_L.js";
|
|
14
|
-
import { a as minSecurity, d as resolveExecApprovalsFromFile, i as maxAsk, t as DEFAULT_EXEC_APPROVAL_TIMEOUT_MS } from "./exec-approvals-BP9AhCSw.js";
|
|
15
|
-
import { a as canvasSnapshotTempPath, c as parseCameraClipPayload, d as writeUrlToFile, f as applyPathPrepend, h as buildNodeShellCommand, i as parseEnvPairs, l as parseCameraSnapPayload, n as screenRecordTempPath, o as parseCanvasSnapshotPayload, r as writeScreenRecordToFile, s as cameraTempPath, t as parseScreenRecordPayload, u as writeBase64ToFile } from "./nodes-screen-1YiLkqr5.js";
|
|
16
|
-
import { n as formatTimeAgo } from "./format-relative-sy9iviQN.js";
|
|
17
|
-
import { t as formatDocsLink } from "./links-DPGe0OHw.js";
|
|
18
|
-
import { n as runCommandWithRuntime } from "./cli-utils-BTBABPX9.js";
|
|
19
|
-
import "./progress-Bek_GyWS.js";
|
|
20
|
-
import { t as parseTimeoutMs } from "./parse-timeout-vVlESvju.js";
|
|
21
|
-
import { t as renderTable } from "./table-BL0lJzsm.js";
|
|
22
|
-
import { a as formatPermissions, i as unauthorizedHintForMessage, n as nodesCallOpts, o as parseNodeList, r as resolveNodeId, s as parsePairingList, t as callGatewayCli } from "./rpc-C0pjNhBi.js";
|
|
23
|
-
import fs from "node:fs/promises";
|
|
24
|
-
|
|
25
|
-
//#region src/cli/nodes-cli/cli-utils.ts
|
|
26
|
-
function getNodesTheme() {
|
|
27
|
-
const rich = isRich();
|
|
28
|
-
const color = (fn) => (value) => rich ? fn(value) : value;
|
|
29
|
-
return {
|
|
30
|
-
rich,
|
|
31
|
-
heading: color(theme.heading),
|
|
32
|
-
ok: color(theme.success),
|
|
33
|
-
warn: color(theme.warn),
|
|
34
|
-
muted: color(theme.muted),
|
|
35
|
-
error: color(theme.error)
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function runNodesCommand(label, action) {
|
|
39
|
-
return runCommandWithRuntime(defaultRuntime, action, (err) => {
|
|
40
|
-
const message = String(err);
|
|
41
|
-
const { error, warn } = getNodesTheme();
|
|
42
|
-
defaultRuntime.error(error(`nodes ${label} failed: ${message}`));
|
|
43
|
-
const hint = unauthorizedHintForMessage(message);
|
|
44
|
-
if (hint) defaultRuntime.error(warn(hint));
|
|
45
|
-
defaultRuntime.exit(1);
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region src/cli/nodes-cli/register.camera.ts
|
|
51
|
-
const parseFacing = (value) => {
|
|
52
|
-
const v = String(value ?? "").trim().toLowerCase();
|
|
53
|
-
if (v === "front" || v === "back") return v;
|
|
54
|
-
throw new Error(`invalid facing: ${value} (expected front|back)`);
|
|
55
|
-
};
|
|
56
|
-
function registerNodesCameraCommands(nodes) {
|
|
57
|
-
const camera = nodes.command("camera").description("Capture camera media from a paired node");
|
|
58
|
-
nodesCallOpts(camera.command("list").description("List available cameras on a node").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").action(async (opts) => {
|
|
59
|
-
await runNodesCommand("camera list", async () => {
|
|
60
|
-
const raw = await callGatewayCli("node.invoke", opts, {
|
|
61
|
-
nodeId: await resolveNodeId(opts, String(opts.node ?? "")),
|
|
62
|
-
command: "camera.list",
|
|
63
|
-
params: {},
|
|
64
|
-
idempotencyKey: randomIdempotencyKey()
|
|
65
|
-
});
|
|
66
|
-
const res = typeof raw === "object" && raw !== null ? raw : {};
|
|
67
|
-
const payload = typeof res.payload === "object" && res.payload !== null ? res.payload : {};
|
|
68
|
-
const devices = Array.isArray(payload.devices) ? payload.devices : [];
|
|
69
|
-
if (opts.json) {
|
|
70
|
-
defaultRuntime.log(JSON.stringify(devices, null, 2));
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (devices.length === 0) {
|
|
74
|
-
const { muted } = getNodesTheme();
|
|
75
|
-
defaultRuntime.log(muted("No cameras reported."));
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const { heading, muted } = getNodesTheme();
|
|
79
|
-
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
80
|
-
const rows = devices.map((device) => ({
|
|
81
|
-
Name: typeof device.name === "string" ? device.name : "Unknown Camera",
|
|
82
|
-
Position: typeof device.position === "string" ? device.position : muted("unspecified"),
|
|
83
|
-
ID: typeof device.id === "string" ? device.id : ""
|
|
84
|
-
}));
|
|
85
|
-
defaultRuntime.log(heading("Cameras"));
|
|
86
|
-
defaultRuntime.log(renderTable({
|
|
87
|
-
width: tableWidth,
|
|
88
|
-
columns: [
|
|
89
|
-
{
|
|
90
|
-
key: "Name",
|
|
91
|
-
header: "Name",
|
|
92
|
-
minWidth: 14,
|
|
93
|
-
flex: true
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
key: "Position",
|
|
97
|
-
header: "Position",
|
|
98
|
-
minWidth: 10
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
key: "ID",
|
|
102
|
-
header: "ID",
|
|
103
|
-
minWidth: 10,
|
|
104
|
-
flex: true
|
|
105
|
-
}
|
|
106
|
-
],
|
|
107
|
-
rows
|
|
108
|
-
}).trimEnd());
|
|
109
|
-
});
|
|
110
|
-
}), { timeoutMs: 6e4 });
|
|
111
|
-
nodesCallOpts(camera.command("snap").description("Capture a photo from a node camera (prints MEDIA:<path>)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--facing <front|back|both>", "Camera facing", "both").option("--device-id <id>", "Camera device id (from nodes camera list)").option("--max-width <px>", "Max width in px (optional)").option("--quality <0-1>", "JPEG quality (default 0.9)").option("--delay-ms <ms>", "Delay before capture in ms (macOS default 2000)").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 20000)", "20000").action(async (opts) => {
|
|
112
|
-
await runNodesCommand("camera snap", async () => {
|
|
113
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
114
|
-
const facingOpt = String(opts.facing ?? "both").trim().toLowerCase();
|
|
115
|
-
const facings = facingOpt === "both" ? ["front", "back"] : facingOpt === "front" || facingOpt === "back" ? [facingOpt] : (() => {
|
|
116
|
-
throw new Error(`invalid facing: ${String(opts.facing)} (expected front|back|both)`);
|
|
117
|
-
})();
|
|
118
|
-
const maxWidth = opts.maxWidth ? Number.parseInt(String(opts.maxWidth), 10) : void 0;
|
|
119
|
-
const quality = opts.quality ? Number.parseFloat(String(opts.quality)) : void 0;
|
|
120
|
-
const delayMs = opts.delayMs ? Number.parseInt(String(opts.delayMs), 10) : void 0;
|
|
121
|
-
const deviceId = opts.deviceId ? String(opts.deviceId).trim() : void 0;
|
|
122
|
-
const timeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
123
|
-
const results = [];
|
|
124
|
-
for (const facing of facings) {
|
|
125
|
-
const invokeParams = {
|
|
126
|
-
nodeId,
|
|
127
|
-
command: "camera.snap",
|
|
128
|
-
params: {
|
|
129
|
-
facing,
|
|
130
|
-
maxWidth: Number.isFinite(maxWidth) ? maxWidth : void 0,
|
|
131
|
-
quality: Number.isFinite(quality) ? quality : void 0,
|
|
132
|
-
format: "jpg",
|
|
133
|
-
delayMs: Number.isFinite(delayMs) ? delayMs : void 0,
|
|
134
|
-
deviceId: deviceId || void 0
|
|
135
|
-
},
|
|
136
|
-
idempotencyKey: randomIdempotencyKey()
|
|
137
|
-
};
|
|
138
|
-
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs)) invokeParams.timeoutMs = timeoutMs;
|
|
139
|
-
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
140
|
-
const payload = parseCameraSnapPayload((typeof raw === "object" && raw !== null ? raw : {}).payload);
|
|
141
|
-
const filePath = cameraTempPath({
|
|
142
|
-
kind: "snap",
|
|
143
|
-
facing,
|
|
144
|
-
ext: payload.format === "jpeg" ? "jpg" : payload.format
|
|
145
|
-
});
|
|
146
|
-
if (payload.url) await writeUrlToFile(filePath, payload.url);
|
|
147
|
-
else if (payload.base64) await writeBase64ToFile(filePath, payload.base64);
|
|
148
|
-
results.push({
|
|
149
|
-
facing,
|
|
150
|
-
path: filePath,
|
|
151
|
-
width: payload.width,
|
|
152
|
-
height: payload.height
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
if (opts.json) {
|
|
156
|
-
defaultRuntime.log(JSON.stringify({ files: results }, null, 2));
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
defaultRuntime.log(results.map((r) => `MEDIA:${shortenHomePath(r.path)}`).join("\n"));
|
|
160
|
-
});
|
|
161
|
-
}), { timeoutMs: 6e4 });
|
|
162
|
-
nodesCallOpts(camera.command("clip").description("Capture a short video clip from a node camera (prints MEDIA:<path>)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--facing <front|back>", "Camera facing", "front").option("--device-id <id>", "Camera device id (from nodes camera list)").option("--duration <ms|10s|1m>", "Duration (default 3000ms; supports ms/s/m, e.g. 10s)", "3000").option("--no-audio", "Disable audio capture").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 90000)", "90000").action(async (opts) => {
|
|
163
|
-
await runNodesCommand("camera clip", async () => {
|
|
164
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
165
|
-
const facing = parseFacing(String(opts.facing ?? "front"));
|
|
166
|
-
const durationMs = parseDurationMs(String(opts.duration ?? "3000"));
|
|
167
|
-
const includeAudio = opts.audio !== false;
|
|
168
|
-
const timeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
169
|
-
const deviceId = opts.deviceId ? String(opts.deviceId).trim() : void 0;
|
|
170
|
-
const invokeParams = {
|
|
171
|
-
nodeId,
|
|
172
|
-
command: "camera.clip",
|
|
173
|
-
params: {
|
|
174
|
-
facing,
|
|
175
|
-
durationMs: Number.isFinite(durationMs) ? durationMs : void 0,
|
|
176
|
-
includeAudio,
|
|
177
|
-
format: "mp4",
|
|
178
|
-
deviceId: deviceId || void 0
|
|
179
|
-
},
|
|
180
|
-
idempotencyKey: randomIdempotencyKey()
|
|
181
|
-
};
|
|
182
|
-
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs)) invokeParams.timeoutMs = timeoutMs;
|
|
183
|
-
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
184
|
-
const payload = parseCameraClipPayload((typeof raw === "object" && raw !== null ? raw : {}).payload);
|
|
185
|
-
const filePath = cameraTempPath({
|
|
186
|
-
kind: "clip",
|
|
187
|
-
facing,
|
|
188
|
-
ext: payload.format
|
|
189
|
-
});
|
|
190
|
-
if (payload.url) await writeUrlToFile(filePath, payload.url);
|
|
191
|
-
else if (payload.base64) await writeBase64ToFile(filePath, payload.base64);
|
|
192
|
-
if (opts.json) {
|
|
193
|
-
defaultRuntime.log(JSON.stringify({ file: {
|
|
194
|
-
facing,
|
|
195
|
-
path: filePath,
|
|
196
|
-
durationMs: payload.durationMs,
|
|
197
|
-
hasAudio: payload.hasAudio
|
|
198
|
-
} }, null, 2));
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
defaultRuntime.log(`MEDIA:${shortenHomePath(filePath)}`);
|
|
202
|
-
});
|
|
203
|
-
}), { timeoutMs: 9e4 });
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
//#endregion
|
|
207
|
-
//#region src/cli/nodes-cli/a2ui-jsonl.ts
|
|
208
|
-
const A2UI_ACTION_KEYS = [
|
|
209
|
-
"beginRendering",
|
|
210
|
-
"surfaceUpdate",
|
|
211
|
-
"dataModelUpdate",
|
|
212
|
-
"deleteSurface",
|
|
213
|
-
"createSurface"
|
|
214
|
-
];
|
|
215
|
-
function buildA2UITextJsonl(text) {
|
|
216
|
-
const surfaceId = "main";
|
|
217
|
-
const rootId = "root";
|
|
218
|
-
const textId = "text";
|
|
219
|
-
return [{ surfaceUpdate: {
|
|
220
|
-
surfaceId,
|
|
221
|
-
components: [{
|
|
222
|
-
id: rootId,
|
|
223
|
-
component: { Column: { children: { explicitList: [textId] } } }
|
|
224
|
-
}, {
|
|
225
|
-
id: textId,
|
|
226
|
-
component: { Text: {
|
|
227
|
-
text: { literalString: text },
|
|
228
|
-
usageHint: "body"
|
|
229
|
-
} }
|
|
230
|
-
}]
|
|
231
|
-
} }, { beginRendering: {
|
|
232
|
-
surfaceId,
|
|
233
|
-
root: rootId
|
|
234
|
-
} }].map((payload) => JSON.stringify(payload)).join("\n");
|
|
235
|
-
}
|
|
236
|
-
function validateA2UIJsonl(jsonl) {
|
|
237
|
-
const lines = jsonl.split(/\r?\n/);
|
|
238
|
-
const errors = [];
|
|
239
|
-
let sawV08 = false;
|
|
240
|
-
let sawV09 = false;
|
|
241
|
-
let messageCount = 0;
|
|
242
|
-
lines.forEach((line, idx) => {
|
|
243
|
-
const trimmed = line.trim();
|
|
244
|
-
if (!trimmed) return;
|
|
245
|
-
messageCount += 1;
|
|
246
|
-
let obj;
|
|
247
|
-
try {
|
|
248
|
-
obj = JSON.parse(trimmed);
|
|
249
|
-
} catch (err) {
|
|
250
|
-
errors.push(`line ${idx + 1}: ${String(err)}`);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
if (!obj || typeof obj !== "object" || Array.isArray(obj)) {
|
|
254
|
-
errors.push(`line ${idx + 1}: expected JSON object`);
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
const record = obj;
|
|
258
|
-
const actionKeys = A2UI_ACTION_KEYS.filter((key) => key in record);
|
|
259
|
-
if (actionKeys.length !== 1) {
|
|
260
|
-
errors.push(`line ${idx + 1}: expected exactly one action key (${A2UI_ACTION_KEYS.join(", ")})`);
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
if (actionKeys[0] === "createSurface") sawV09 = true;
|
|
264
|
-
else sawV08 = true;
|
|
265
|
-
});
|
|
266
|
-
if (messageCount === 0) errors.push("no JSONL messages found");
|
|
267
|
-
if (sawV08 && sawV09) errors.push("mixed A2UI v0.8 and v0.9 messages in one file");
|
|
268
|
-
if (errors.length > 0) throw new Error(`Invalid A2UI JSONL:\n- ${errors.join("\n- ")}`);
|
|
269
|
-
return {
|
|
270
|
-
version: sawV09 ? "v0.9" : "v0.8",
|
|
271
|
-
messageCount
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
//#endregion
|
|
276
|
-
//#region src/cli/nodes-cli/register.canvas.ts
|
|
277
|
-
async function invokeCanvas(opts, command, params) {
|
|
278
|
-
const invokeParams = {
|
|
279
|
-
nodeId: await resolveNodeId(opts, String(opts.node ?? "")),
|
|
280
|
-
command,
|
|
281
|
-
params,
|
|
282
|
-
idempotencyKey: randomIdempotencyKey()
|
|
283
|
-
};
|
|
284
|
-
const timeoutMs = parseTimeoutMs(opts.invokeTimeout);
|
|
285
|
-
if (typeof timeoutMs === "number") invokeParams.timeoutMs = timeoutMs;
|
|
286
|
-
return await callGatewayCli("node.invoke", opts, invokeParams);
|
|
287
|
-
}
|
|
288
|
-
function registerNodesCanvasCommands(nodes) {
|
|
289
|
-
const canvas = nodes.command("canvas").description("Capture or render canvas content from a paired node");
|
|
290
|
-
nodesCallOpts(canvas.command("snapshot").description("Capture a canvas snapshot (prints MEDIA:<path>)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--format <png|jpg|jpeg>", "Image format", "jpg").option("--max-width <px>", "Max width in px (optional)").option("--quality <0-1>", "JPEG quality (optional)").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 20000)", "20000").action(async (opts) => {
|
|
291
|
-
await runNodesCommand("canvas snapshot", async () => {
|
|
292
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
293
|
-
const formatOpt = String(opts.format ?? "jpg").trim().toLowerCase();
|
|
294
|
-
const formatForParams = formatOpt === "jpg" ? "jpeg" : formatOpt === "jpeg" ? "jpeg" : "png";
|
|
295
|
-
if (formatForParams !== "png" && formatForParams !== "jpeg") throw new Error(`invalid format: ${String(opts.format)} (expected png|jpg|jpeg)`);
|
|
296
|
-
const maxWidth = opts.maxWidth ? Number.parseInt(String(opts.maxWidth), 10) : void 0;
|
|
297
|
-
const quality = opts.quality ? Number.parseFloat(String(opts.quality)) : void 0;
|
|
298
|
-
const timeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
299
|
-
const invokeParams = {
|
|
300
|
-
nodeId,
|
|
301
|
-
command: "canvas.snapshot",
|
|
302
|
-
params: {
|
|
303
|
-
format: formatForParams,
|
|
304
|
-
maxWidth: Number.isFinite(maxWidth) ? maxWidth : void 0,
|
|
305
|
-
quality: Number.isFinite(quality) ? quality : void 0
|
|
306
|
-
},
|
|
307
|
-
idempotencyKey: randomIdempotencyKey()
|
|
308
|
-
};
|
|
309
|
-
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs)) invokeParams.timeoutMs = timeoutMs;
|
|
310
|
-
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
311
|
-
const payload = parseCanvasSnapshotPayload((typeof raw === "object" && raw !== null ? raw : {}).payload);
|
|
312
|
-
const filePath = canvasSnapshotTempPath({ ext: payload.format === "jpeg" ? "jpg" : payload.format });
|
|
313
|
-
await writeBase64ToFile(filePath, payload.base64);
|
|
314
|
-
if (opts.json) {
|
|
315
|
-
defaultRuntime.log(JSON.stringify({ file: {
|
|
316
|
-
path: filePath,
|
|
317
|
-
format: payload.format
|
|
318
|
-
} }, null, 2));
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
defaultRuntime.log(`MEDIA:${shortenHomePath(filePath)}`);
|
|
322
|
-
});
|
|
323
|
-
}), { timeoutMs: 6e4 });
|
|
324
|
-
nodesCallOpts(canvas.command("present").description("Show the canvas (optionally with a target URL/path)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--target <urlOrPath>", "Target URL/path (optional)").option("--x <px>", "Placement x coordinate").option("--y <px>", "Placement y coordinate").option("--width <px>", "Placement width").option("--height <px>", "Placement height").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (opts) => {
|
|
325
|
-
await runNodesCommand("canvas present", async () => {
|
|
326
|
-
const placement = {
|
|
327
|
-
x: opts.x ? Number.parseFloat(opts.x) : void 0,
|
|
328
|
-
y: opts.y ? Number.parseFloat(opts.y) : void 0,
|
|
329
|
-
width: opts.width ? Number.parseFloat(opts.width) : void 0,
|
|
330
|
-
height: opts.height ? Number.parseFloat(opts.height) : void 0
|
|
331
|
-
};
|
|
332
|
-
const params = {};
|
|
333
|
-
if (opts.target) params.url = String(opts.target);
|
|
334
|
-
if (Number.isFinite(placement.x) || Number.isFinite(placement.y) || Number.isFinite(placement.width) || Number.isFinite(placement.height)) params.placement = placement;
|
|
335
|
-
await invokeCanvas(opts, "canvas.present", params);
|
|
336
|
-
if (!opts.json) {
|
|
337
|
-
const { ok } = getNodesTheme();
|
|
338
|
-
defaultRuntime.log(ok("canvas present ok"));
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}));
|
|
342
|
-
nodesCallOpts(canvas.command("hide").description("Hide the canvas").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (opts) => {
|
|
343
|
-
await runNodesCommand("canvas hide", async () => {
|
|
344
|
-
await invokeCanvas(opts, "canvas.hide", void 0);
|
|
345
|
-
if (!opts.json) {
|
|
346
|
-
const { ok } = getNodesTheme();
|
|
347
|
-
defaultRuntime.log(ok("canvas hide ok"));
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
}));
|
|
351
|
-
nodesCallOpts(canvas.command("navigate").description("Navigate the canvas to a URL").argument("<url>", "Target URL/path").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (url, opts) => {
|
|
352
|
-
await runNodesCommand("canvas navigate", async () => {
|
|
353
|
-
await invokeCanvas(opts, "canvas.navigate", { url });
|
|
354
|
-
if (!opts.json) {
|
|
355
|
-
const { ok } = getNodesTheme();
|
|
356
|
-
defaultRuntime.log(ok("canvas navigate ok"));
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}));
|
|
360
|
-
nodesCallOpts(canvas.command("eval").description("Evaluate JavaScript in the canvas").argument("[js]", "JavaScript to evaluate").option("--js <code>", "JavaScript to evaluate").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (jsArg, opts) => {
|
|
361
|
-
await runNodesCommand("canvas eval", async () => {
|
|
362
|
-
const js = opts.js ?? jsArg;
|
|
363
|
-
if (!js) throw new Error("missing --js or <js>");
|
|
364
|
-
const raw = await invokeCanvas(opts, "canvas.eval", { javaScript: js });
|
|
365
|
-
if (opts.json) {
|
|
366
|
-
defaultRuntime.log(JSON.stringify(raw, null, 2));
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const payload = typeof raw === "object" && raw !== null ? raw.payload : void 0;
|
|
370
|
-
if (payload?.result) defaultRuntime.log(payload.result);
|
|
371
|
-
else {
|
|
372
|
-
const { ok } = getNodesTheme();
|
|
373
|
-
defaultRuntime.log(ok("canvas eval ok"));
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
}));
|
|
377
|
-
const a2ui = canvas.command("a2ui").description("Render A2UI content on the canvas");
|
|
378
|
-
nodesCallOpts(a2ui.command("push").description("Push A2UI JSONL to the canvas").option("--jsonl <path>", "Path to JSONL payload").option("--text <text>", "Render a quick A2UI text payload").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (opts) => {
|
|
379
|
-
await runNodesCommand("canvas a2ui push", async () => {
|
|
380
|
-
const hasJsonl = Boolean(opts.jsonl);
|
|
381
|
-
const hasText = typeof opts.text === "string";
|
|
382
|
-
if (hasJsonl === hasText) throw new Error("provide exactly one of --jsonl or --text");
|
|
383
|
-
const jsonl = hasText ? buildA2UITextJsonl(String(opts.text ?? "")) : await fs.readFile(String(opts.jsonl), "utf8");
|
|
384
|
-
const { version, messageCount } = validateA2UIJsonl(jsonl);
|
|
385
|
-
if (version === "v0.9") throw new Error("Detected A2UI v0.9 JSONL (createSurface). OpenClaw currently supports v0.8 only.");
|
|
386
|
-
await invokeCanvas(opts, "canvas.a2ui.pushJSONL", { jsonl });
|
|
387
|
-
if (!opts.json) {
|
|
388
|
-
const { ok } = getNodesTheme();
|
|
389
|
-
defaultRuntime.log(ok(`canvas a2ui push ok (v0.8, ${messageCount} message${messageCount === 1 ? "" : "s"})`));
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
}));
|
|
393
|
-
nodesCallOpts(a2ui.command("reset").description("Reset A2UI renderer state").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--invoke-timeout <ms>", "Node invoke timeout in ms").action(async (opts) => {
|
|
394
|
-
await runNodesCommand("canvas a2ui reset", async () => {
|
|
395
|
-
await invokeCanvas(opts, "canvas.a2ui.reset", void 0);
|
|
396
|
-
if (!opts.json) {
|
|
397
|
-
const { ok } = getNodesTheme();
|
|
398
|
-
defaultRuntime.log(ok("canvas a2ui reset ok"));
|
|
399
|
-
}
|
|
400
|
-
});
|
|
401
|
-
}));
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
//#endregion
|
|
405
|
-
//#region src/cli/nodes-cli/register.invoke.ts
|
|
406
|
-
function normalizeExecSecurity(value) {
|
|
407
|
-
const normalized = value?.trim().toLowerCase();
|
|
408
|
-
if (normalized === "deny" || normalized === "allowlist" || normalized === "full") return normalized;
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
411
|
-
function normalizeExecAsk(value) {
|
|
412
|
-
const normalized = value?.trim().toLowerCase();
|
|
413
|
-
if (normalized === "off" || normalized === "on-miss" || normalized === "always") return normalized;
|
|
414
|
-
return null;
|
|
415
|
-
}
|
|
416
|
-
function resolveExecDefaults(cfg, agentId) {
|
|
417
|
-
const globalExec = cfg?.tools?.exec;
|
|
418
|
-
if (!agentId) return globalExec ? {
|
|
419
|
-
security: globalExec.security,
|
|
420
|
-
ask: globalExec.ask,
|
|
421
|
-
node: globalExec.node,
|
|
422
|
-
pathPrepend: globalExec.pathPrepend,
|
|
423
|
-
safeBins: globalExec.safeBins
|
|
424
|
-
} : void 0;
|
|
425
|
-
const agentExec = resolveAgentConfig(cfg, agentId)?.tools?.exec;
|
|
426
|
-
return {
|
|
427
|
-
security: agentExec?.security ?? globalExec?.security,
|
|
428
|
-
ask: agentExec?.ask ?? globalExec?.ask,
|
|
429
|
-
node: agentExec?.node ?? globalExec?.node,
|
|
430
|
-
pathPrepend: agentExec?.pathPrepend ?? globalExec?.pathPrepend,
|
|
431
|
-
safeBins: agentExec?.safeBins ?? globalExec?.safeBins
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
async function resolveNodePlatform(opts, nodeId) {
|
|
435
|
-
try {
|
|
436
|
-
const match = parseNodeList(await callGatewayCli("node.list", opts, {})).find((node) => node.nodeId === nodeId);
|
|
437
|
-
return typeof match?.platform === "string" ? match.platform : null;
|
|
438
|
-
} catch {
|
|
439
|
-
return null;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
function registerNodesInvokeCommands(nodes) {
|
|
443
|
-
nodesCallOpts(nodes.command("invoke").description("Invoke a command on a paired node").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").requiredOption("--command <command>", "Command (e.g. canvas.eval)").option("--params <json>", "JSON object string for params", "{}").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 15000)", "15000").option("--idempotency-key <key>", "Idempotency key (optional)").action(async (opts) => {
|
|
444
|
-
await runNodesCommand("invoke", async () => {
|
|
445
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
446
|
-
const command = String(opts.command ?? "").trim();
|
|
447
|
-
if (!nodeId || !command) {
|
|
448
|
-
const { error } = getNodesTheme();
|
|
449
|
-
defaultRuntime.error(error("--node and --command required"));
|
|
450
|
-
defaultRuntime.exit(1);
|
|
451
|
-
return;
|
|
452
|
-
}
|
|
453
|
-
const params = JSON.parse(String(opts.params ?? "{}"));
|
|
454
|
-
const timeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
455
|
-
const invokeParams = {
|
|
456
|
-
nodeId,
|
|
457
|
-
command,
|
|
458
|
-
params,
|
|
459
|
-
idempotencyKey: String(opts.idempotencyKey ?? randomIdempotencyKey())
|
|
460
|
-
};
|
|
461
|
-
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs)) invokeParams.timeoutMs = timeoutMs;
|
|
462
|
-
const result = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
463
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
464
|
-
});
|
|
465
|
-
}), { timeoutMs: 3e4 });
|
|
466
|
-
nodesCallOpts(nodes.command("run").description("Run a shell command on a node (mac only)").option("--node <idOrNameOrIp>", "Node id, name, or IP").option("--cwd <path>", "Working directory").option("--env <key=val>", "Environment override (repeatable)", (value, prev = []) => [...prev, value]).option("--raw <command>", "Run a raw shell command string (sh -lc / cmd.exe /c)").option("--agent <id>", "Agent id (default: configured default agent)").option("--ask <mode>", "Exec ask mode (off|on-miss|always)").option("--security <mode>", "Exec security mode (deny|allowlist|full)").option("--command-timeout <ms>", "Command timeout (ms)").option("--needs-screen-recording", "Require screen recording permission").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 30000)", "30000").argument("[command...]", "Command and args").action(async (command, opts) => {
|
|
467
|
-
await runNodesCommand("run", async () => {
|
|
468
|
-
const cfg = loadConfig();
|
|
469
|
-
const agentId = opts.agent?.trim() || resolveDefaultAgentId(cfg);
|
|
470
|
-
const execDefaults = resolveExecDefaults(cfg, agentId);
|
|
471
|
-
const raw = typeof opts.raw === "string" ? opts.raw.trim() : "";
|
|
472
|
-
if (raw && Array.isArray(command) && command.length > 0) throw new Error("use --raw or argv, not both");
|
|
473
|
-
if (!raw && (!Array.isArray(command) || command.length === 0)) throw new Error("command required");
|
|
474
|
-
const nodeQuery = String(opts.node ?? "").trim() || execDefaults?.node?.trim() || "";
|
|
475
|
-
if (!nodeQuery) throw new Error("node required (set --node or tools.exec.node)");
|
|
476
|
-
const nodeId = await resolveNodeId(opts, nodeQuery);
|
|
477
|
-
const env = parseEnvPairs(opts.env);
|
|
478
|
-
const timeoutMs = parseTimeoutMs(opts.commandTimeout);
|
|
479
|
-
const invokeTimeout = parseTimeoutMs(opts.invokeTimeout);
|
|
480
|
-
let argv = Array.isArray(command) ? command : [];
|
|
481
|
-
let rawCommand;
|
|
482
|
-
if (raw) {
|
|
483
|
-
rawCommand = raw;
|
|
484
|
-
const platform = await resolveNodePlatform(opts, nodeId);
|
|
485
|
-
argv = buildNodeShellCommand(rawCommand, platform ?? void 0);
|
|
486
|
-
}
|
|
487
|
-
const nodeEnv = env ? { ...env } : void 0;
|
|
488
|
-
if (nodeEnv) applyPathPrepend(nodeEnv, execDefaults?.pathPrepend, { requireExisting: true });
|
|
489
|
-
let approvedByAsk = false;
|
|
490
|
-
let approvalDecision = null;
|
|
491
|
-
const configuredSecurity = normalizeExecSecurity(execDefaults?.security) ?? "allowlist";
|
|
492
|
-
const requestedSecurity = normalizeExecSecurity(opts.security);
|
|
493
|
-
if (opts.security && !requestedSecurity) throw new Error("invalid --security (use deny|allowlist|full)");
|
|
494
|
-
const configuredAsk = normalizeExecAsk(execDefaults?.ask) ?? "on-miss";
|
|
495
|
-
const requestedAsk = normalizeExecAsk(opts.ask);
|
|
496
|
-
if (opts.ask && !requestedAsk) throw new Error("invalid --ask (use off|on-miss|always)");
|
|
497
|
-
const security = minSecurity(configuredSecurity, requestedSecurity ?? configuredSecurity);
|
|
498
|
-
const ask = maxAsk(configuredAsk, requestedAsk ?? configuredAsk);
|
|
499
|
-
const approvalsSnapshot = await callGatewayCli("exec.approvals.node.get", opts, { nodeId });
|
|
500
|
-
const approvalsFile = approvalsSnapshot && typeof approvalsSnapshot === "object" ? approvalsSnapshot.file : void 0;
|
|
501
|
-
if (!approvalsFile || typeof approvalsFile !== "object") throw new Error("exec approvals unavailable");
|
|
502
|
-
const approvals = resolveExecApprovalsFromFile({
|
|
503
|
-
file: approvalsFile,
|
|
504
|
-
agentId,
|
|
505
|
-
overrides: {
|
|
506
|
-
security,
|
|
507
|
-
ask
|
|
508
|
-
}
|
|
509
|
-
});
|
|
510
|
-
const hostSecurity = minSecurity(security, approvals.agent.security);
|
|
511
|
-
const hostAsk = maxAsk(ask, approvals.agent.ask);
|
|
512
|
-
const askFallback = approvals.agent.askFallback;
|
|
513
|
-
if (hostSecurity === "deny") throw new Error("exec denied: host=node security=deny");
|
|
514
|
-
const requiresAsk = hostAsk === "always" || hostAsk === "on-miss";
|
|
515
|
-
let approvalId = null;
|
|
516
|
-
if (requiresAsk) {
|
|
517
|
-
approvalId = crypto.randomUUID();
|
|
518
|
-
const approvalTimeoutMs = DEFAULT_EXEC_APPROVAL_TIMEOUT_MS;
|
|
519
|
-
const transportTimeoutMs = Math.max(parseTimeoutMs(opts.timeout) ?? 0, approvalTimeoutMs + 1e4);
|
|
520
|
-
const decisionResult = await callGatewayCli("exec.approval.request", opts, {
|
|
521
|
-
id: approvalId,
|
|
522
|
-
command: rawCommand ?? argv.join(" "),
|
|
523
|
-
cwd: opts.cwd,
|
|
524
|
-
host: "node",
|
|
525
|
-
security: hostSecurity,
|
|
526
|
-
ask: hostAsk,
|
|
527
|
-
agentId,
|
|
528
|
-
resolvedPath: void 0,
|
|
529
|
-
sessionKey: void 0,
|
|
530
|
-
timeoutMs: approvalTimeoutMs
|
|
531
|
-
}, { transportTimeoutMs });
|
|
532
|
-
const decision = decisionResult && typeof decisionResult === "object" ? decisionResult.decision ?? null : null;
|
|
533
|
-
if (decision === "deny") throw new Error("exec denied: user denied");
|
|
534
|
-
if (!decision) if (askFallback === "full") {
|
|
535
|
-
approvedByAsk = true;
|
|
536
|
-
approvalDecision = "allow-once";
|
|
537
|
-
} else if (askFallback === "allowlist") {} else throw new Error("exec denied: approval required (approval UI not available)");
|
|
538
|
-
if (decision === "allow-once") {
|
|
539
|
-
approvedByAsk = true;
|
|
540
|
-
approvalDecision = "allow-once";
|
|
541
|
-
}
|
|
542
|
-
if (decision === "allow-always") {
|
|
543
|
-
approvedByAsk = true;
|
|
544
|
-
approvalDecision = "allow-always";
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
const invokeParams = {
|
|
548
|
-
nodeId,
|
|
549
|
-
command: "system.run",
|
|
550
|
-
params: {
|
|
551
|
-
command: argv,
|
|
552
|
-
cwd: opts.cwd,
|
|
553
|
-
env: nodeEnv,
|
|
554
|
-
timeoutMs,
|
|
555
|
-
needsScreenRecording: opts.needsScreenRecording === true
|
|
556
|
-
},
|
|
557
|
-
idempotencyKey: String(opts.idempotencyKey ?? randomIdempotencyKey())
|
|
558
|
-
};
|
|
559
|
-
if (agentId) invokeParams.params.agentId = agentId;
|
|
560
|
-
if (rawCommand) invokeParams.params.rawCommand = rawCommand;
|
|
561
|
-
invokeParams.params.approved = approvedByAsk;
|
|
562
|
-
if (approvalDecision) invokeParams.params.approvalDecision = approvalDecision;
|
|
563
|
-
if (approvedByAsk && approvalId) invokeParams.params.runId = approvalId;
|
|
564
|
-
if (invokeTimeout !== void 0) invokeParams.timeoutMs = invokeTimeout;
|
|
565
|
-
const result = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
566
|
-
if (opts.json) {
|
|
567
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
const payload = typeof result === "object" && result !== null ? result.payload : void 0;
|
|
571
|
-
const stdout = typeof payload?.stdout === "string" ? payload.stdout : "";
|
|
572
|
-
const stderr = typeof payload?.stderr === "string" ? payload.stderr : "";
|
|
573
|
-
const exitCode = typeof payload?.exitCode === "number" ? payload.exitCode : null;
|
|
574
|
-
const timedOut = payload?.timedOut === true;
|
|
575
|
-
const success = payload?.success === true;
|
|
576
|
-
if (stdout) process.stdout.write(stdout);
|
|
577
|
-
if (stderr) process.stderr.write(stderr);
|
|
578
|
-
if (timedOut) {
|
|
579
|
-
const { error } = getNodesTheme();
|
|
580
|
-
defaultRuntime.error(error("run timed out"));
|
|
581
|
-
defaultRuntime.exit(1);
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
|
-
if (exitCode !== null && exitCode !== 0) {
|
|
585
|
-
const hint = unauthorizedHintForMessage(`${stderr}\n${stdout}`);
|
|
586
|
-
if (hint) {
|
|
587
|
-
const { warn } = getNodesTheme();
|
|
588
|
-
defaultRuntime.error(warn(hint));
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
if (exitCode !== null && exitCode !== 0 && !success) {
|
|
592
|
-
const { error } = getNodesTheme();
|
|
593
|
-
defaultRuntime.error(error(`run exit ${exitCode}`));
|
|
594
|
-
defaultRuntime.exit(1);
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
});
|
|
598
|
-
}), { timeoutMs: 35e3 });
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
//#endregion
|
|
602
|
-
//#region src/cli/nodes-cli/register.location.ts
|
|
603
|
-
function registerNodesLocationCommands(nodes) {
|
|
604
|
-
nodesCallOpts(nodes.command("location").description("Fetch location from a paired node").command("get").description("Fetch the current location from a node").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--max-age <ms>", "Use cached location newer than this (ms)").option("--accuracy <coarse|balanced|precise>", "Desired accuracy (default: balanced/precise depending on node setting)").option("--location-timeout <ms>", "Location fix timeout (ms)", "10000").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 20000)", "20000").action(async (opts) => {
|
|
605
|
-
await runNodesCommand("location get", async () => {
|
|
606
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
607
|
-
const maxAgeMs = opts.maxAge ? Number.parseInt(String(opts.maxAge), 10) : void 0;
|
|
608
|
-
const desiredAccuracyRaw = typeof opts.accuracy === "string" ? opts.accuracy.trim().toLowerCase() : void 0;
|
|
609
|
-
const desiredAccuracy = desiredAccuracyRaw === "coarse" || desiredAccuracyRaw === "balanced" || desiredAccuracyRaw === "precise" ? desiredAccuracyRaw : void 0;
|
|
610
|
-
const timeoutMs = opts.locationTimeout ? Number.parseInt(String(opts.locationTimeout), 10) : void 0;
|
|
611
|
-
const invokeTimeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
612
|
-
const invokeParams = {
|
|
613
|
-
nodeId,
|
|
614
|
-
command: "location.get",
|
|
615
|
-
params: {
|
|
616
|
-
maxAgeMs: Number.isFinite(maxAgeMs) ? maxAgeMs : void 0,
|
|
617
|
-
desiredAccuracy,
|
|
618
|
-
timeoutMs: Number.isFinite(timeoutMs) ? timeoutMs : void 0
|
|
619
|
-
},
|
|
620
|
-
idempotencyKey: randomIdempotencyKey()
|
|
621
|
-
};
|
|
622
|
-
if (typeof invokeTimeoutMs === "number" && Number.isFinite(invokeTimeoutMs)) invokeParams.timeoutMs = invokeTimeoutMs;
|
|
623
|
-
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
624
|
-
const res = typeof raw === "object" && raw !== null ? raw : {};
|
|
625
|
-
const payload = res.payload && typeof res.payload === "object" ? res.payload : {};
|
|
626
|
-
if (opts.json) {
|
|
627
|
-
defaultRuntime.log(JSON.stringify(payload, null, 2));
|
|
628
|
-
return;
|
|
629
|
-
}
|
|
630
|
-
const lat = payload.lat;
|
|
631
|
-
const lon = payload.lon;
|
|
632
|
-
const acc = payload.accuracyMeters;
|
|
633
|
-
if (typeof lat === "number" && typeof lon === "number") {
|
|
634
|
-
const accText = typeof acc === "number" ? ` ±${acc.toFixed(1)}m` : "";
|
|
635
|
-
defaultRuntime.log(`${lat},${lon}${accText}`);
|
|
636
|
-
return;
|
|
637
|
-
}
|
|
638
|
-
defaultRuntime.log(JSON.stringify(payload));
|
|
639
|
-
});
|
|
640
|
-
}), { timeoutMs: 3e4 });
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
//#endregion
|
|
644
|
-
//#region src/cli/nodes-cli/register.notify.ts
|
|
645
|
-
function registerNodesNotifyCommand(nodes) {
|
|
646
|
-
nodesCallOpts(nodes.command("notify").description("Send a local notification on a node (mac only)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--title <text>", "Notification title").option("--body <text>", "Notification body").option("--sound <name>", "Notification sound").option("--priority <passive|active|timeSensitive>", "Notification priority").option("--delivery <system|overlay|auto>", "Delivery mode", "system").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 15000)", "15000").action(async (opts) => {
|
|
647
|
-
await runNodesCommand("notify", async () => {
|
|
648
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
649
|
-
const title = String(opts.title ?? "").trim();
|
|
650
|
-
const body = String(opts.body ?? "").trim();
|
|
651
|
-
if (!title && !body) throw new Error("missing --title or --body");
|
|
652
|
-
const invokeTimeout = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
653
|
-
const invokeParams = {
|
|
654
|
-
nodeId,
|
|
655
|
-
command: "system.notify",
|
|
656
|
-
params: {
|
|
657
|
-
title,
|
|
658
|
-
body,
|
|
659
|
-
sound: opts.sound,
|
|
660
|
-
priority: opts.priority,
|
|
661
|
-
delivery: opts.delivery
|
|
662
|
-
},
|
|
663
|
-
idempotencyKey: String(opts.idempotencyKey ?? randomIdempotencyKey())
|
|
664
|
-
};
|
|
665
|
-
if (typeof invokeTimeout === "number" && Number.isFinite(invokeTimeout)) invokeParams.timeoutMs = invokeTimeout;
|
|
666
|
-
const result = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
667
|
-
if (opts.json) {
|
|
668
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
669
|
-
return;
|
|
670
|
-
}
|
|
671
|
-
const { ok } = getNodesTheme();
|
|
672
|
-
defaultRuntime.log(ok("notify ok"));
|
|
673
|
-
});
|
|
674
|
-
}));
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
//#endregion
|
|
678
|
-
//#region src/cli/nodes-cli/register.pairing.ts
|
|
679
|
-
function registerNodesPairingCommands(nodes) {
|
|
680
|
-
nodesCallOpts(nodes.command("pending").description("List pending pairing requests").action(async (opts) => {
|
|
681
|
-
await runNodesCommand("pending", async () => {
|
|
682
|
-
const { pending } = parsePairingList(await callGatewayCli("node.pair.list", opts, {}));
|
|
683
|
-
if (opts.json) {
|
|
684
|
-
defaultRuntime.log(JSON.stringify(pending, null, 2));
|
|
685
|
-
return;
|
|
686
|
-
}
|
|
687
|
-
if (pending.length === 0) {
|
|
688
|
-
const { muted } = getNodesTheme();
|
|
689
|
-
defaultRuntime.log(muted("No pending pairing requests."));
|
|
690
|
-
return;
|
|
691
|
-
}
|
|
692
|
-
const { heading, warn, muted } = getNodesTheme();
|
|
693
|
-
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
694
|
-
const now = Date.now();
|
|
695
|
-
const rows = pending.map((r) => ({
|
|
696
|
-
Request: r.requestId,
|
|
697
|
-
Node: r.displayName?.trim() ? r.displayName.trim() : r.nodeId,
|
|
698
|
-
IP: r.remoteIp ?? "",
|
|
699
|
-
Requested: typeof r.ts === "number" ? formatTimeAgo(Math.max(0, now - r.ts)) : muted("unknown"),
|
|
700
|
-
Repair: r.isRepair ? warn("yes") : ""
|
|
701
|
-
}));
|
|
702
|
-
defaultRuntime.log(heading("Pending"));
|
|
703
|
-
defaultRuntime.log(renderTable({
|
|
704
|
-
width: tableWidth,
|
|
705
|
-
columns: [
|
|
706
|
-
{
|
|
707
|
-
key: "Request",
|
|
708
|
-
header: "Request",
|
|
709
|
-
minWidth: 8
|
|
710
|
-
},
|
|
711
|
-
{
|
|
712
|
-
key: "Node",
|
|
713
|
-
header: "Node",
|
|
714
|
-
minWidth: 14,
|
|
715
|
-
flex: true
|
|
716
|
-
},
|
|
717
|
-
{
|
|
718
|
-
key: "IP",
|
|
719
|
-
header: "IP",
|
|
720
|
-
minWidth: 10
|
|
721
|
-
},
|
|
722
|
-
{
|
|
723
|
-
key: "Requested",
|
|
724
|
-
header: "Requested",
|
|
725
|
-
minWidth: 12
|
|
726
|
-
},
|
|
727
|
-
{
|
|
728
|
-
key: "Repair",
|
|
729
|
-
header: "Repair",
|
|
730
|
-
minWidth: 6
|
|
731
|
-
}
|
|
732
|
-
],
|
|
733
|
-
rows
|
|
734
|
-
}).trimEnd());
|
|
735
|
-
});
|
|
736
|
-
}));
|
|
737
|
-
nodesCallOpts(nodes.command("approve").description("Approve a pending pairing request").argument("<requestId>", "Pending request id").action(async (requestId, opts) => {
|
|
738
|
-
await runNodesCommand("approve", async () => {
|
|
739
|
-
const result = await callGatewayCli("node.pair.approve", opts, { requestId });
|
|
740
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
741
|
-
});
|
|
742
|
-
}));
|
|
743
|
-
nodesCallOpts(nodes.command("reject").description("Reject a pending pairing request").argument("<requestId>", "Pending request id").action(async (requestId, opts) => {
|
|
744
|
-
await runNodesCommand("reject", async () => {
|
|
745
|
-
const result = await callGatewayCli("node.pair.reject", opts, { requestId });
|
|
746
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
747
|
-
});
|
|
748
|
-
}));
|
|
749
|
-
nodesCallOpts(nodes.command("rename").description("Rename a paired node (display name override)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").requiredOption("--name <displayName>", "New display name").action(async (opts) => {
|
|
750
|
-
await runNodesCommand("rename", async () => {
|
|
751
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
752
|
-
const name = String(opts.name ?? "").trim();
|
|
753
|
-
if (!nodeId || !name) {
|
|
754
|
-
defaultRuntime.error("--node and --name required");
|
|
755
|
-
defaultRuntime.exit(1);
|
|
756
|
-
return;
|
|
757
|
-
}
|
|
758
|
-
const result = await callGatewayCli("node.rename", opts, {
|
|
759
|
-
nodeId,
|
|
760
|
-
displayName: name
|
|
761
|
-
});
|
|
762
|
-
if (opts.json) {
|
|
763
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
764
|
-
return;
|
|
765
|
-
}
|
|
766
|
-
const { ok } = getNodesTheme();
|
|
767
|
-
defaultRuntime.log(ok(`node rename ok: ${nodeId} -> ${name}`));
|
|
768
|
-
});
|
|
769
|
-
}));
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
//#endregion
|
|
773
|
-
//#region src/cli/nodes-cli/register.screen.ts
|
|
774
|
-
function registerNodesScreenCommands(nodes) {
|
|
775
|
-
nodesCallOpts(nodes.command("screen").description("Capture screen recordings from a paired node").command("record").description("Capture a short screen recording from a node (prints MEDIA:<path>)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").option("--screen <index>", "Screen index (0 = primary)", "0").option("--duration <ms|10s>", "Clip duration (ms or 10s)", "10000").option("--fps <fps>", "Frames per second", "10").option("--no-audio", "Disable microphone audio capture").option("--out <path>", "Output path").option("--invoke-timeout <ms>", "Node invoke timeout in ms (default 120000)", "120000").action(async (opts) => {
|
|
776
|
-
await runNodesCommand("screen record", async () => {
|
|
777
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
778
|
-
const durationMs = parseDurationMs(opts.duration ?? "");
|
|
779
|
-
const screenIndex = Number.parseInt(String(opts.screen ?? "0"), 10);
|
|
780
|
-
const fps = Number.parseFloat(String(opts.fps ?? "10"));
|
|
781
|
-
const timeoutMs = opts.invokeTimeout ? Number.parseInt(String(opts.invokeTimeout), 10) : void 0;
|
|
782
|
-
const invokeParams = {
|
|
783
|
-
nodeId,
|
|
784
|
-
command: "screen.record",
|
|
785
|
-
params: {
|
|
786
|
-
durationMs: Number.isFinite(durationMs) ? durationMs : void 0,
|
|
787
|
-
screenIndex: Number.isFinite(screenIndex) ? screenIndex : void 0,
|
|
788
|
-
fps: Number.isFinite(fps) ? fps : void 0,
|
|
789
|
-
format: "mp4",
|
|
790
|
-
includeAudio: opts.audio !== false
|
|
791
|
-
},
|
|
792
|
-
idempotencyKey: randomIdempotencyKey()
|
|
793
|
-
};
|
|
794
|
-
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs)) invokeParams.timeoutMs = timeoutMs;
|
|
795
|
-
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
|
|
796
|
-
const parsed = parseScreenRecordPayload((typeof raw === "object" && raw !== null ? raw : {}).payload);
|
|
797
|
-
const written = await writeScreenRecordToFile(opts.out ?? screenRecordTempPath({ ext: parsed.format || "mp4" }), parsed.base64);
|
|
798
|
-
if (opts.json) {
|
|
799
|
-
defaultRuntime.log(JSON.stringify({ file: {
|
|
800
|
-
path: written.path,
|
|
801
|
-
durationMs: parsed.durationMs,
|
|
802
|
-
fps: parsed.fps,
|
|
803
|
-
screenIndex: parsed.screenIndex,
|
|
804
|
-
hasAudio: parsed.hasAudio
|
|
805
|
-
} }, null, 2));
|
|
806
|
-
return;
|
|
807
|
-
}
|
|
808
|
-
defaultRuntime.log(`MEDIA:${shortenHomePath(written.path)}`);
|
|
809
|
-
});
|
|
810
|
-
}), { timeoutMs: 18e4 });
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
//#endregion
|
|
814
|
-
//#region src/cli/nodes-cli/register.status.ts
|
|
815
|
-
function formatVersionLabel(raw) {
|
|
816
|
-
const trimmed = raw.trim();
|
|
817
|
-
if (!trimmed) return raw;
|
|
818
|
-
if (trimmed.toLowerCase().startsWith("v")) return trimmed;
|
|
819
|
-
return /^\d/.test(trimmed) ? `v${trimmed}` : trimmed;
|
|
820
|
-
}
|
|
821
|
-
function resolveNodeVersions(node) {
|
|
822
|
-
const core = node.coreVersion?.trim() || void 0;
|
|
823
|
-
const ui = node.uiVersion?.trim() || void 0;
|
|
824
|
-
if (core || ui) return {
|
|
825
|
-
core,
|
|
826
|
-
ui
|
|
827
|
-
};
|
|
828
|
-
const legacy = node.version?.trim();
|
|
829
|
-
if (!legacy) return {
|
|
830
|
-
core: void 0,
|
|
831
|
-
ui: void 0
|
|
832
|
-
};
|
|
833
|
-
const platform = node.platform?.trim().toLowerCase() ?? "";
|
|
834
|
-
return platform === "darwin" || platform === "linux" || platform === "win32" || platform === "windows" ? {
|
|
835
|
-
core: legacy,
|
|
836
|
-
ui: void 0
|
|
837
|
-
} : {
|
|
838
|
-
core: void 0,
|
|
839
|
-
ui: legacy
|
|
840
|
-
};
|
|
841
|
-
}
|
|
842
|
-
function formatNodeVersions(node) {
|
|
843
|
-
const { core, ui } = resolveNodeVersions(node);
|
|
844
|
-
const parts = [];
|
|
845
|
-
if (core) parts.push(`core ${formatVersionLabel(core)}`);
|
|
846
|
-
if (ui) parts.push(`ui ${formatVersionLabel(ui)}`);
|
|
847
|
-
return parts.length > 0 ? parts.join(" · ") : null;
|
|
848
|
-
}
|
|
849
|
-
function formatPathEnv(raw) {
|
|
850
|
-
if (typeof raw !== "string") return null;
|
|
851
|
-
const trimmed = raw.trim();
|
|
852
|
-
if (!trimmed) return null;
|
|
853
|
-
const parts = trimmed.split(":").filter(Boolean);
|
|
854
|
-
return shortenHomeInString(parts.length <= 3 ? trimmed : `${parts.slice(0, 2).join(":")}:…:${parts.slice(-1)[0]}`);
|
|
855
|
-
}
|
|
856
|
-
function parseSinceMs(raw, label) {
|
|
857
|
-
if (raw === void 0 || raw === null) return;
|
|
858
|
-
const value = typeof raw === "string" ? raw.trim() : typeof raw === "number" ? String(raw).trim() : null;
|
|
859
|
-
if (value === null) {
|
|
860
|
-
defaultRuntime.error(`${label}: invalid duration value`);
|
|
861
|
-
defaultRuntime.exit(1);
|
|
862
|
-
return;
|
|
863
|
-
}
|
|
864
|
-
if (!value) return;
|
|
865
|
-
try {
|
|
866
|
-
return parseDurationMs(value);
|
|
867
|
-
} catch (err) {
|
|
868
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
869
|
-
defaultRuntime.error(`${label}: ${message}`);
|
|
870
|
-
defaultRuntime.exit(1);
|
|
871
|
-
return;
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
function registerNodesStatusCommands(nodes) {
|
|
875
|
-
nodesCallOpts(nodes.command("status").description("List known nodes with connection status and capabilities").option("--connected", "Only show connected nodes").option("--last-connected <duration>", "Only show nodes connected within duration (e.g. 24h)").action(async (opts) => {
|
|
876
|
-
await runNodesCommand("status", async () => {
|
|
877
|
-
const connectedOnly = Boolean(opts.connected);
|
|
878
|
-
const sinceMs = parseSinceMs(opts.lastConnected, "Invalid --last-connected");
|
|
879
|
-
const result = await callGatewayCli("node.list", opts, {});
|
|
880
|
-
const obj = typeof result === "object" && result !== null ? result : {};
|
|
881
|
-
const { ok, warn, muted } = getNodesTheme();
|
|
882
|
-
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
883
|
-
const now = Date.now();
|
|
884
|
-
const nodes = parseNodeList(result);
|
|
885
|
-
const lastConnectedById = sinceMs !== void 0 ? new Map(parsePairingList(await callGatewayCli("node.pair.list", opts, {})).paired.map((entry) => [entry.nodeId, entry])) : null;
|
|
886
|
-
const filtered = nodes.filter((n) => {
|
|
887
|
-
if (connectedOnly && !n.connected) return false;
|
|
888
|
-
if (sinceMs !== void 0) {
|
|
889
|
-
const paired = lastConnectedById?.get(n.nodeId);
|
|
890
|
-
const lastConnectedAtMs = typeof paired?.lastConnectedAtMs === "number" ? paired.lastConnectedAtMs : typeof n.connectedAtMs === "number" ? n.connectedAtMs : void 0;
|
|
891
|
-
if (typeof lastConnectedAtMs !== "number") return false;
|
|
892
|
-
if (now - lastConnectedAtMs > sinceMs) return false;
|
|
893
|
-
}
|
|
894
|
-
return true;
|
|
895
|
-
});
|
|
896
|
-
if (opts.json) {
|
|
897
|
-
const ts = typeof obj.ts === "number" ? obj.ts : Date.now();
|
|
898
|
-
defaultRuntime.log(JSON.stringify({
|
|
899
|
-
...obj,
|
|
900
|
-
ts,
|
|
901
|
-
nodes: filtered
|
|
902
|
-
}, null, 2));
|
|
903
|
-
return;
|
|
904
|
-
}
|
|
905
|
-
const pairedCount = filtered.filter((n) => Boolean(n.paired)).length;
|
|
906
|
-
const connectedCount = filtered.filter((n) => Boolean(n.connected)).length;
|
|
907
|
-
const filteredLabel = filtered.length !== nodes.length ? ` (of ${nodes.length})` : "";
|
|
908
|
-
defaultRuntime.log(`Known: ${filtered.length}${filteredLabel} · Paired: ${pairedCount} · Connected: ${connectedCount}`);
|
|
909
|
-
if (filtered.length === 0) return;
|
|
910
|
-
const rows = filtered.map((n) => {
|
|
911
|
-
const name = n.displayName?.trim() ? n.displayName.trim() : n.nodeId;
|
|
912
|
-
const perms = formatPermissions(n.permissions);
|
|
913
|
-
const versions = formatNodeVersions(n);
|
|
914
|
-
const pathEnv = formatPathEnv(n.pathEnv);
|
|
915
|
-
const detailParts = [
|
|
916
|
-
n.deviceFamily ? `device: ${n.deviceFamily}` : null,
|
|
917
|
-
n.modelIdentifier ? `hw: ${n.modelIdentifier}` : null,
|
|
918
|
-
perms ? `perms: ${perms}` : null,
|
|
919
|
-
versions,
|
|
920
|
-
pathEnv ? `path: ${pathEnv}` : null
|
|
921
|
-
].filter(Boolean);
|
|
922
|
-
const caps = Array.isArray(n.caps) ? n.caps.map(String).filter(Boolean).toSorted().join(", ") : "?";
|
|
923
|
-
const paired = n.paired ? ok("paired") : warn("unpaired");
|
|
924
|
-
const connected = n.connected ? ok("connected") : muted("disconnected");
|
|
925
|
-
const since = typeof n.connectedAtMs === "number" ? ` (${formatTimeAgo(Math.max(0, now - n.connectedAtMs))})` : "";
|
|
926
|
-
return {
|
|
927
|
-
Node: name,
|
|
928
|
-
ID: n.nodeId,
|
|
929
|
-
IP: n.remoteIp ?? "",
|
|
930
|
-
Detail: detailParts.join(" · "),
|
|
931
|
-
Status: `${paired} · ${connected}${since}`,
|
|
932
|
-
Caps: caps
|
|
933
|
-
};
|
|
934
|
-
});
|
|
935
|
-
defaultRuntime.log(renderTable({
|
|
936
|
-
width: tableWidth,
|
|
937
|
-
columns: [
|
|
938
|
-
{
|
|
939
|
-
key: "Node",
|
|
940
|
-
header: "Node",
|
|
941
|
-
minWidth: 14,
|
|
942
|
-
flex: true
|
|
943
|
-
},
|
|
944
|
-
{
|
|
945
|
-
key: "ID",
|
|
946
|
-
header: "ID",
|
|
947
|
-
minWidth: 10
|
|
948
|
-
},
|
|
949
|
-
{
|
|
950
|
-
key: "IP",
|
|
951
|
-
header: "IP",
|
|
952
|
-
minWidth: 10
|
|
953
|
-
},
|
|
954
|
-
{
|
|
955
|
-
key: "Detail",
|
|
956
|
-
header: "Detail",
|
|
957
|
-
minWidth: 18,
|
|
958
|
-
flex: true
|
|
959
|
-
},
|
|
960
|
-
{
|
|
961
|
-
key: "Status",
|
|
962
|
-
header: "Status",
|
|
963
|
-
minWidth: 18
|
|
964
|
-
},
|
|
965
|
-
{
|
|
966
|
-
key: "Caps",
|
|
967
|
-
header: "Caps",
|
|
968
|
-
minWidth: 12,
|
|
969
|
-
flex: true
|
|
970
|
-
}
|
|
971
|
-
],
|
|
972
|
-
rows
|
|
973
|
-
}).trimEnd());
|
|
974
|
-
});
|
|
975
|
-
}));
|
|
976
|
-
nodesCallOpts(nodes.command("describe").description("Describe a node (capabilities + supported invoke commands)").requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP").action(async (opts) => {
|
|
977
|
-
await runNodesCommand("describe", async () => {
|
|
978
|
-
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
979
|
-
const result = await callGatewayCli("node.describe", opts, { nodeId });
|
|
980
|
-
if (opts.json) {
|
|
981
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
982
|
-
return;
|
|
983
|
-
}
|
|
984
|
-
const obj = typeof result === "object" && result !== null ? result : {};
|
|
985
|
-
const displayName = typeof obj.displayName === "string" ? obj.displayName : nodeId;
|
|
986
|
-
const connected = Boolean(obj.connected);
|
|
987
|
-
const paired = Boolean(obj.paired);
|
|
988
|
-
const caps = Array.isArray(obj.caps) ? obj.caps.map(String).filter(Boolean).toSorted() : null;
|
|
989
|
-
const commands = Array.isArray(obj.commands) ? obj.commands.map(String).filter(Boolean).toSorted() : [];
|
|
990
|
-
const perms = formatPermissions(obj.permissions);
|
|
991
|
-
const family = typeof obj.deviceFamily === "string" ? obj.deviceFamily : null;
|
|
992
|
-
const model = typeof obj.modelIdentifier === "string" ? obj.modelIdentifier : null;
|
|
993
|
-
const ip = typeof obj.remoteIp === "string" ? obj.remoteIp : null;
|
|
994
|
-
const pathEnv = typeof obj.pathEnv === "string" ? obj.pathEnv : null;
|
|
995
|
-
const versions = formatNodeVersions(obj);
|
|
996
|
-
const { heading, ok, warn, muted } = getNodesTheme();
|
|
997
|
-
const status = `${paired ? ok("paired") : warn("unpaired")} · ${connected ? ok("connected") : muted("disconnected")}`;
|
|
998
|
-
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
999
|
-
const rows = [
|
|
1000
|
-
{
|
|
1001
|
-
Field: "ID",
|
|
1002
|
-
Value: nodeId
|
|
1003
|
-
},
|
|
1004
|
-
displayName ? {
|
|
1005
|
-
Field: "Name",
|
|
1006
|
-
Value: displayName
|
|
1007
|
-
} : null,
|
|
1008
|
-
ip ? {
|
|
1009
|
-
Field: "IP",
|
|
1010
|
-
Value: ip
|
|
1011
|
-
} : null,
|
|
1012
|
-
family ? {
|
|
1013
|
-
Field: "Device",
|
|
1014
|
-
Value: family
|
|
1015
|
-
} : null,
|
|
1016
|
-
model ? {
|
|
1017
|
-
Field: "Model",
|
|
1018
|
-
Value: model
|
|
1019
|
-
} : null,
|
|
1020
|
-
perms ? {
|
|
1021
|
-
Field: "Perms",
|
|
1022
|
-
Value: perms
|
|
1023
|
-
} : null,
|
|
1024
|
-
versions ? {
|
|
1025
|
-
Field: "Version",
|
|
1026
|
-
Value: versions
|
|
1027
|
-
} : null,
|
|
1028
|
-
pathEnv ? {
|
|
1029
|
-
Field: "PATH",
|
|
1030
|
-
Value: pathEnv
|
|
1031
|
-
} : null,
|
|
1032
|
-
{
|
|
1033
|
-
Field: "Status",
|
|
1034
|
-
Value: status
|
|
1035
|
-
},
|
|
1036
|
-
{
|
|
1037
|
-
Field: "Caps",
|
|
1038
|
-
Value: caps ? caps.join(", ") : "?"
|
|
1039
|
-
}
|
|
1040
|
-
].filter(Boolean);
|
|
1041
|
-
defaultRuntime.log(heading("Node"));
|
|
1042
|
-
defaultRuntime.log(renderTable({
|
|
1043
|
-
width: tableWidth,
|
|
1044
|
-
columns: [{
|
|
1045
|
-
key: "Field",
|
|
1046
|
-
header: "Field",
|
|
1047
|
-
minWidth: 8
|
|
1048
|
-
}, {
|
|
1049
|
-
key: "Value",
|
|
1050
|
-
header: "Value",
|
|
1051
|
-
minWidth: 24,
|
|
1052
|
-
flex: true
|
|
1053
|
-
}],
|
|
1054
|
-
rows
|
|
1055
|
-
}).trimEnd());
|
|
1056
|
-
defaultRuntime.log("");
|
|
1057
|
-
defaultRuntime.log(heading("Commands"));
|
|
1058
|
-
if (commands.length === 0) {
|
|
1059
|
-
defaultRuntime.log(muted("- (none reported)"));
|
|
1060
|
-
return;
|
|
1061
|
-
}
|
|
1062
|
-
for (const c of commands) defaultRuntime.log(`- ${c}`);
|
|
1063
|
-
});
|
|
1064
|
-
}));
|
|
1065
|
-
nodesCallOpts(nodes.command("list").description("List pending and paired nodes").option("--connected", "Only show connected nodes").option("--last-connected <duration>", "Only show nodes connected within duration (e.g. 24h)").action(async (opts) => {
|
|
1066
|
-
await runNodesCommand("list", async () => {
|
|
1067
|
-
const connectedOnly = Boolean(opts.connected);
|
|
1068
|
-
const sinceMs = parseSinceMs(opts.lastConnected, "Invalid --last-connected");
|
|
1069
|
-
const { pending, paired } = parsePairingList(await callGatewayCli("node.pair.list", opts, {}));
|
|
1070
|
-
const { heading, muted, warn } = getNodesTheme();
|
|
1071
|
-
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
1072
|
-
const now = Date.now();
|
|
1073
|
-
const hasFilters = connectedOnly || sinceMs !== void 0;
|
|
1074
|
-
const pendingRows = hasFilters ? [] : pending;
|
|
1075
|
-
const connectedById = hasFilters ? new Map(parseNodeList(await callGatewayCli("node.list", opts, {})).map((node) => [node.nodeId, node])) : null;
|
|
1076
|
-
const filteredPaired = paired.filter((node) => {
|
|
1077
|
-
if (connectedOnly) {
|
|
1078
|
-
if (!(connectedById?.get(node.nodeId))?.connected) return false;
|
|
1079
|
-
}
|
|
1080
|
-
if (sinceMs !== void 0) {
|
|
1081
|
-
const live = connectedById?.get(node.nodeId);
|
|
1082
|
-
const lastConnectedAtMs = typeof node.lastConnectedAtMs === "number" ? node.lastConnectedAtMs : typeof live?.connectedAtMs === "number" ? live.connectedAtMs : void 0;
|
|
1083
|
-
if (typeof lastConnectedAtMs !== "number") return false;
|
|
1084
|
-
if (now - lastConnectedAtMs > sinceMs) return false;
|
|
1085
|
-
}
|
|
1086
|
-
return true;
|
|
1087
|
-
});
|
|
1088
|
-
const filteredLabel = hasFilters && filteredPaired.length !== paired.length ? ` (of ${paired.length})` : "";
|
|
1089
|
-
defaultRuntime.log(`Pending: ${pendingRows.length} · Paired: ${filteredPaired.length}${filteredLabel}`);
|
|
1090
|
-
if (opts.json) {
|
|
1091
|
-
defaultRuntime.log(JSON.stringify({
|
|
1092
|
-
pending: pendingRows,
|
|
1093
|
-
paired: filteredPaired
|
|
1094
|
-
}, null, 2));
|
|
1095
|
-
return;
|
|
1096
|
-
}
|
|
1097
|
-
if (pendingRows.length > 0) {
|
|
1098
|
-
const pendingRowsRendered = pendingRows.map((r) => ({
|
|
1099
|
-
Request: r.requestId,
|
|
1100
|
-
Node: r.displayName?.trim() ? r.displayName.trim() : r.nodeId,
|
|
1101
|
-
IP: r.remoteIp ?? "",
|
|
1102
|
-
Requested: typeof r.ts === "number" ? formatTimeAgo(Math.max(0, now - r.ts)) : muted("unknown"),
|
|
1103
|
-
Repair: r.isRepair ? warn("yes") : ""
|
|
1104
|
-
}));
|
|
1105
|
-
defaultRuntime.log("");
|
|
1106
|
-
defaultRuntime.log(heading("Pending"));
|
|
1107
|
-
defaultRuntime.log(renderTable({
|
|
1108
|
-
width: tableWidth,
|
|
1109
|
-
columns: [
|
|
1110
|
-
{
|
|
1111
|
-
key: "Request",
|
|
1112
|
-
header: "Request",
|
|
1113
|
-
minWidth: 8
|
|
1114
|
-
},
|
|
1115
|
-
{
|
|
1116
|
-
key: "Node",
|
|
1117
|
-
header: "Node",
|
|
1118
|
-
minWidth: 14,
|
|
1119
|
-
flex: true
|
|
1120
|
-
},
|
|
1121
|
-
{
|
|
1122
|
-
key: "IP",
|
|
1123
|
-
header: "IP",
|
|
1124
|
-
minWidth: 10
|
|
1125
|
-
},
|
|
1126
|
-
{
|
|
1127
|
-
key: "Requested",
|
|
1128
|
-
header: "Requested",
|
|
1129
|
-
minWidth: 12
|
|
1130
|
-
},
|
|
1131
|
-
{
|
|
1132
|
-
key: "Repair",
|
|
1133
|
-
header: "Repair",
|
|
1134
|
-
minWidth: 6
|
|
1135
|
-
}
|
|
1136
|
-
],
|
|
1137
|
-
rows: pendingRowsRendered
|
|
1138
|
-
}).trimEnd());
|
|
1139
|
-
}
|
|
1140
|
-
if (filteredPaired.length > 0) {
|
|
1141
|
-
const pairedRows = filteredPaired.map((n) => {
|
|
1142
|
-
const live = connectedById?.get(n.nodeId);
|
|
1143
|
-
const lastConnectedAtMs = typeof n.lastConnectedAtMs === "number" ? n.lastConnectedAtMs : typeof live?.connectedAtMs === "number" ? live.connectedAtMs : void 0;
|
|
1144
|
-
return {
|
|
1145
|
-
Node: n.displayName?.trim() ? n.displayName.trim() : n.nodeId,
|
|
1146
|
-
Id: n.nodeId,
|
|
1147
|
-
IP: n.remoteIp ?? "",
|
|
1148
|
-
LastConnect: typeof lastConnectedAtMs === "number" ? formatTimeAgo(Math.max(0, now - lastConnectedAtMs)) : muted("unknown")
|
|
1149
|
-
};
|
|
1150
|
-
});
|
|
1151
|
-
defaultRuntime.log("");
|
|
1152
|
-
defaultRuntime.log(heading("Paired"));
|
|
1153
|
-
defaultRuntime.log(renderTable({
|
|
1154
|
-
width: tableWidth,
|
|
1155
|
-
columns: [
|
|
1156
|
-
{
|
|
1157
|
-
key: "Node",
|
|
1158
|
-
header: "Node",
|
|
1159
|
-
minWidth: 14,
|
|
1160
|
-
flex: true
|
|
1161
|
-
},
|
|
1162
|
-
{
|
|
1163
|
-
key: "Id",
|
|
1164
|
-
header: "ID",
|
|
1165
|
-
minWidth: 10
|
|
1166
|
-
},
|
|
1167
|
-
{
|
|
1168
|
-
key: "IP",
|
|
1169
|
-
header: "IP",
|
|
1170
|
-
minWidth: 10
|
|
1171
|
-
},
|
|
1172
|
-
{
|
|
1173
|
-
key: "LastConnect",
|
|
1174
|
-
header: "Last Connect",
|
|
1175
|
-
minWidth: 14
|
|
1176
|
-
}
|
|
1177
|
-
],
|
|
1178
|
-
rows: pairedRows
|
|
1179
|
-
}).trimEnd());
|
|
1180
|
-
}
|
|
1181
|
-
});
|
|
1182
|
-
}));
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
//#endregion
|
|
1186
|
-
//#region src/cli/nodes-cli/register.ts
|
|
1187
|
-
function registerNodesCli(program) {
|
|
1188
|
-
const nodes = program.command("nodes").description("Manage gateway-owned node pairing").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/nodes", "docs.openclaw.ai/cli/nodes")}\n`);
|
|
1189
|
-
registerNodesStatusCommands(nodes);
|
|
1190
|
-
registerNodesPairingCommands(nodes);
|
|
1191
|
-
registerNodesInvokeCommands(nodes);
|
|
1192
|
-
registerNodesNotifyCommand(nodes);
|
|
1193
|
-
registerNodesCanvasCommands(nodes);
|
|
1194
|
-
registerNodesCameraCommands(nodes);
|
|
1195
|
-
registerNodesScreenCommands(nodes);
|
|
1196
|
-
registerNodesLocationCommands(nodes);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
//#endregion
|
|
1200
|
-
export { registerNodesCli };
|