squidclaw 3.0.13 → 3.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{accounts-PhtBJ8mA.js → accounts-BjEXPlGc.js} +1 -1
- package/dist/{accounts-Xp5W2xrR.js → accounts-CyBVeR-N.js} +1 -1
- package/dist/{accounts-BFC1okn9.js → accounts-D095MOmG.js} +7 -7
- package/dist/{acp-cli-Dt95OPXW.js → acp-cli-Dd2joFFS.js} +8 -8
- package/dist/{agent-scope-tUxfsPYq.js → agent-scope-C1XMay0T.js} +17 -17
- package/dist/{agents.config-DNPisWCH.js → agents.config-CRKsD30n.js} +2 -2
- package/dist/{api-key-rotation-Y59kKrr0.js → api-key-rotation-BcKKu9kK.js} +1 -1
- package/dist/{audio-preflight-DeBM0nTy.js → audio-preflight-g9rsstMv.js} +34 -34
- package/dist/{audio-transcription-runner-B7oPsr3U.js → audio-transcription-runner-Bnl3Ubjo.js} +23 -23
- package/dist/{audit-Bq3iosCf.js → audit-B4s_5Gn1.js} +29 -29
- package/dist/{auth-HYiP0mxx.js → auth-DHSeaNcB.js} +1 -1
- package/dist/{auth-choice-Du_pIfBh.js → auth-choice-C-7c5Td_.js} +13 -13
- package/dist/{auth-choice-CX8TDXmp.js → auth-choice-D7LiN5Ju.js} +11 -11
- package/dist/{auth-choice.apply-helpers-DRfHu1d8.js → auth-choice.apply-helpers-CxO2Wbq-.js} +1 -1
- package/dist/{auth-token-BQRI3c6e.js → auth-token-BxYYHBlc.js} +1 -1
- package/dist/{bonjour-discovery-BenDpM0y.js → bonjour-discovery-mtNewKSx.js} +1 -1
- package/dist/{browser-cli-Et8PyJjA.js → browser-cli-I1fzIVmS.js} +12 -12
- package/dist/build-info.json +2 -2
- package/dist/{call-DbkLm3eP.js → call-DkR5OGhh.js} +10 -10
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-account-context-C_WQRa6U.js → channel-account-context-e4ysObLI.js} +5 -5
- package/dist/{channel-activity-7kixHIgY.js → channel-activity-CCjlTlcN.js} +1 -1
- package/dist/{channel-options-D0TjqxeO.js → channel-options-BL5mHe-R.js} +3 -3
- package/dist/{channel-selection-BwbXcgj2.js → channel-selection-D_20zq3H.js} +1 -1
- package/dist/{channel-web-lfZ3VOOl.js → channel-web-C7Iij0H0.js} +16 -16
- package/dist/{channels-cli-Hr4vekE6.js → channels-cli-BMiEn81Y.js} +92 -92
- package/dist/{channels-status-issues-DeoqSoo-.js → channels-status-issues-N9kzQrD8.js} +1 -1
- package/dist/{chrome-gIqO4t7T.js → chrome-BNfSmFAM.js} +4 -4
- package/dist/{clawbot-cli-C-jGxnTq.js → clawbot-cli-B6-68gsT.js} +11 -11
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-BH62lCfL.js → cli-ByaubO_B.js} +72 -72
- package/dist/{client-CeaUCJtL.js → client-BURktNyH.js} +2 -2
- package/dist/{command-secret-targets-BF4WzaME.js → command-secret-targets-WwcPUFAf.js} +4 -4
- package/dist/{commands-CD6EMOiw.js → commands-CiY9HjRt.js} +1 -1
- package/dist/{commands-registry-DCUj1QOi.js → commands-registry-0bpX7A_Q.js} +3 -3
- package/dist/{completion-cli-BIY_jjYY.js → completion-cli-8PdK97J-.js} +12 -12
- package/dist/{config-cli-DvNViMXW.js → config-cli-ClomIMw7.js} +7 -7
- package/dist/{config-guard-DwgnWjmj.js → config-guard-rLrk7eSS.js} +16 -16
- package/dist/{config-validation-CcqZ--gE.js → config-validation-BQEaXMk7.js} +3 -3
- package/dist/{configure-B5Zuhebc.js → configure-CoXGul3l.js} +17 -17
- package/dist/{control-ui-assets-x69xyZH-.js → control-ui-assets-Bz7TCLpb.js} +1 -1
- package/dist/{cron-cli-Bv-X4msQ.js → cron-cli-C3iKBccc.js} +11 -11
- package/dist/{daemon-cli-B-8-rGND.js → daemon-cli-BVcrlw5o.js} +15 -15
- package/dist/{daemon-install-2y4HHhYl.js → daemon-install-CXDWHEEO.js} +4 -4
- package/dist/{daemon-install-helpers-Cdo6Pryw.js → daemon-install-helpers-a4pGEsbA.js} +11 -11
- package/dist/{deliver-CVl43oM1.js → deliver-B1sllFkh.js} +7 -7
- package/dist/deliver-runtime-CaV7seKv.js +61 -0
- package/dist/deps-send-discord.runtime-DbS5pxta.js +36 -0
- package/dist/deps-send-imessage.runtime-Ji753_F7.js +35 -0
- package/dist/deps-send-signal.runtime-DLJqvPLf.js +34 -0
- package/dist/deps-send-slack.runtime-DrFxeZ1I.js +32 -0
- package/dist/{deps-send-telegram.runtime-C9lz8bf0.js → deps-send-telegram.runtime-CF-Ylrvr.js} +16 -16
- package/dist/deps-send-whatsapp.runtime-BOE0Ke6v.js +118 -0
- package/dist/{devices-cli-BT8K0hdG.js → devices-cli-Dn_norz3.js} +8 -8
- package/dist/{diagnostic-5bqrhGEp.js → diagnostic-CNl71AzW.js} +1 -1
- package/dist/{diagnostics-C0CazfQM.js → diagnostics-DZ99A0EW.js} +5 -5
- package/dist/{directory-cli-BZcT9ie1.js → directory-cli-ZzwXkW89.js} +7 -7
- package/dist/{dns-cli-CPYaeASu.js → dns-cli-DipYQjtY.js} +5 -5
- package/dist/{dock-CVTqzMqE.js → dock-C7N1CmcP.js} +4 -4
- package/dist/{docs-cli-C50vGyDh.js → docs-cli-C-Izm9Tb.js} +4 -4
- package/dist/{doctor-completion-Emprau8v.js → doctor-completion-CGmYWy0n.js} +2 -2
- package/dist/{doctor-config-flow-DSA-JE3n.js → doctor-config-flow-DDWA3Z2D.js} +15 -15
- package/dist/{enable-CAYj5OhY.js → enable-RJyJVP_B.js} +1 -1
- package/dist/{exec-approvals-allowlist-BO4EEQUI.js → exec-approvals-allowlist-Bu_oaDJC.js} +1 -1
- package/dist/{exec-approvals-cli-DSOHdWJR.js → exec-approvals-cli-Csducy9L.js} +16 -16
- package/dist/{exec-safe-bin-runtime-policy-CSnpe1AT.js → exec-safe-bin-runtime-policy-DRQwt8kj.js} +2 -2
- package/dist/{fetch-guard-VcWeni3c.js → fetch-guard-DNykKlIv.js} +1 -1
- package/dist/{fs-safe-CjHYKGbt.js → fs-safe-CKHYu4Vz.js} +24 -24
- package/dist/{gateway-cli-B2fScwuY.js → gateway-cli-CUph5Eqo.js} +152 -152
- package/dist/{gateway-rpc-DpqZnhyz.js → gateway-rpc-DoKw40aG.js} +1 -1
- package/dist/{health-BZcB9SMe.js → health-Cia3g9r1.js} +11 -11
- package/dist/{hooks-cli-BylHgZ52.js → hooks-cli-LDbU3XMU.js} +80 -80
- package/dist/{hooks-status-DqGd74DG.js → hooks-status-Dd_iWcBZ.js} +1 -1
- package/dist/{image-CulZw1up.js → image-D2a7rcK1.js} +5 -5
- package/dist/{image-ops-BpsIdA2j.js → image-ops-BIWika4g.js} +10 -10
- package/dist/image-runtime-DTxVPe7Z.js +55 -0
- package/dist/index.js +82 -82
- package/dist/{inspect-D5T8Bbzl.js → inspect-C3PHuODr.js} +4 -4
- package/dist/{install-safe-path-BoN-MLvX.js → install-safe-path-iCmVuopp.js} +25 -25
- package/dist/{installs-CPHMcmNj.js → installs-CyjlehlR.js} +9 -9
- package/dist/{ipv4-Bwl9ruCP.js → ipv4-CWVOQw5T.js} +1 -1
- package/dist/{ir-xnftdkOo.js → ir-BPM7rQYq.js} +8 -8
- package/dist/{issue-format-8t_ncgFx.js → issue-format-sA05c-6t.js} +1 -1
- package/dist/{json-files-DIEpaxUj.js → json-files-D6M304Qd.js} +8 -8
- package/dist/{lifecycle-core-DKiBjZdv.js → lifecycle-core-DsfZ6965.js} +5 -5
- package/dist/{local-roots-BrxGyJnb.js → local-roots-CMxJ8L4w.js} +3 -3
- package/dist/{login-CxDYXbgx.js → login-BjtBaVVG.js} +3 -3
- package/dist/{login-qr-zf4B1lpU.js → login-qr-JfRlpd7I.js} +6 -6
- package/dist/{logs-cli-CJAe1_dv.js → logs-cli-gv2Ql7GE.js} +9 -9
- package/dist/{manager-DBgRFvYb.js → manager-XeZQ6ws7.js} +14 -14
- package/dist/{manager-runtime-Dl31cGh-.js → manager-runtime-BvGqzQIY.js} +9 -9
- package/dist/{manifest-registry-Cx3mB9zS.js → manifest-registry-BaUPjNKb.js} +1 -1
- package/dist/{memory-cli-Bhoc-n_1.js → memory-cli-BUJHSsW6.js} +12 -12
- package/dist/{model-DYzjrxpA.js → model-Jy6fO59G.js} +2 -2
- package/dist/{model-catalog-kpDOW8eY.js → model-catalog-BfoWgIDd.js} +3 -3
- package/dist/{model-picker-BZwK54QT.js → model-picker-CxmHVCE1.js} +4 -4
- package/dist/{model-selection-ZV3PuYVR.js → model-selection-QgM_TOjC.js} +16 -16
- package/dist/{models-cli-BIxlIOFr.js → models-cli-DlbNL6it.js} +81 -81
- package/dist/{models-config-BLdDYoxi.js → models-config-DOD5jluc.js} +6 -6
- package/dist/{node-cli-6uYJccbd.js → node-cli-uJ5lFzxj.js} +33 -33
- package/dist/{node-command-policy-CKTXVa3D.js → node-command-policy-CwVo8Z1X.js} +1 -1
- package/dist/{node-service-DGPVb5ri.js → node-service-xGYkt3vb.js} +1 -1
- package/dist/{nodes-cli-CXLRfAYx.js → nodes-cli-eauCMbSr.js} +16 -16
- package/dist/{nodes-screen-C-tuRhA1.js → nodes-screen-iR_FzGNs.js} +7 -7
- package/dist/{npm-pack-install-DgSn7djE.js → npm-pack-install-s-mP9K0z.js} +18 -18
- package/dist/{npm-resolution-gw3vFNTB.js → npm-resolution-Ck7yFIM2.js} +4 -4
- package/dist/{onboard-CCaYDSO2.js → onboard-aISMp4Kt.js} +6 -6
- package/dist/{onboard-channels-DQnP5d3Y.js → onboard-channels-CELkEQUS.js} +21 -21
- package/dist/{onboard-custom-CJohrPzT.js → onboard-custom-BmAzWYbD.js} +4 -4
- package/dist/{onboard-helpers-Bcs_1b81.js → onboard-helpers-DRk4Y5uA.js} +10 -10
- package/dist/{onboard-hooks-A23nqe_3.js → onboard-hooks-lk1sMnDf.js} +4 -4
- package/dist/{onboard-remote-Hf9sTDHl.js → onboard-remote-Bj9cR8kF.js} +4 -4
- package/dist/{onboard-skills-Cpc8o6sG.js → onboard-skills-eRpyQ1la.js} +4 -4
- package/dist/{onboarding-wx00blu5.js → onboarding-Bl4RDn6W.js} +14 -14
- package/dist/{onboarding.finalize-B8wqvggG.js → onboarding.finalize-Bm7_INHb.js} +85 -85
- package/dist/{onboarding.gateway-config-CvWq5i_X.js → onboarding.gateway-config-BPyk6gwr.js} +18 -18
- package/dist/{onboarding.secret-input-CIN4p8mg.js → onboarding.secret-input-DlDt-I2O.js} +1 -1
- package/dist/{openai-model-default-BYfJa19m.js → openai-model-default-DnYP1Em1.js} +2 -2
- package/dist/{outbound-B3RZI-ai.js → outbound-BQtnr_z2.js} +3 -3
- package/dist/{outbound-attachment-BATDqOuj.js → outbound-attachment-WnXMTJC4.js} +2 -2
- package/dist/{pairing-cli-FMIw0yL6.js → pairing-cli-BsU-YnVT.js} +8 -8
- package/dist/{pairing-labels-MH31IXn_.js → pairing-labels-BXfoinTP.js} +1 -1
- package/dist/{pairing-store-KII9MIZX.js → pairing-store-C1FvWpDK.js} +3 -3
- package/dist/{path-alias-guards-B7H6jIIw.js → path-alias-guards-CCRXJArp.js} +3 -3
- package/dist/{path-safety-3wUzDqI9.js → path-safety-BWiXz6D4.js} +1 -1
- package/dist/{paths-BguvT84s.js → paths-Bg6h1q3v.js} +9 -9
- package/dist/{pi-embedded-helpers-D8WkqLZt.js → pi-embedded-helpers-DctimJJI.js} +6 -6
- package/dist/{pi-model-discovery-Bfyzj3Lq.js → pi-model-discovery-D63dINOn.js} +1 -1
- package/dist/{pi-model-discovery-runtime-nh-zh_Bp.js → pi-model-discovery-runtime-CcXGQcru.js} +5 -5
- package/dist/{pi-tools.before-tool-call.runtime-D4V6gUzq.js → pi-tools.before-tool-call.runtime-BMb_b90y.js} +5 -5
- package/dist/{pi-tools.policy-DCE9mhtw.js → pi-tools.policy-CXvZtJB7.js} +5 -5
- package/dist/{plugin-auto-enable-BJw5Rcbx.js → plugin-auto-enable-DMABTEO-.js} +3 -3
- package/dist/{plugin-registry-V0H8DaZf.js → plugin-registry-BSlUIHKX.js} +3 -3
- package/dist/plugin-sdk/accounts-B6gye1Jd.js +46 -0
- package/dist/plugin-sdk/accounts-C-BT6Po7.js +288 -0
- package/dist/plugin-sdk/accounts-DQDXV8eB.js +35 -0
- package/dist/plugin-sdk/active-listener-DZCohPuZ.js +50 -0
- package/dist/plugin-sdk/api-key-rotation-CrX0fvDj.js +181 -0
- package/dist/plugin-sdk/audio-preflight-xnWAFqH-.js +69 -0
- package/dist/plugin-sdk/audio-transcription-runner-BDmtq7-q.js +2176 -0
- package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +58 -0
- package/dist/plugin-sdk/channel-activity-JjLRpUa_.js +94 -0
- package/dist/plugin-sdk/channel-web-DNWsxhYh.js +2256 -0
- package/dist/plugin-sdk/chrome-B5PWOUbr.js +2415 -0
- package/dist/plugin-sdk/commands-registry-BKeyJUxK.js +1125 -0
- package/dist/plugin-sdk/config-FhBFLsNm.js +17911 -0
- package/dist/plugin-sdk/deliver-DEbTlzFy.js +1694 -0
- package/dist/plugin-sdk/deliver-runtime-CO2uP-r9.js +32 -0
- package/dist/plugin-sdk/deps-send-discord.runtime-DIPW0tR4.js +23 -0
- package/dist/plugin-sdk/deps-send-imessage.runtime-ByGjRa1H.js +22 -0
- package/dist/plugin-sdk/deps-send-signal.runtime-Ca1awu4L.js +21 -0
- package/dist/plugin-sdk/deps-send-slack.runtime-CRzWCVkC.js +19 -0
- package/dist/plugin-sdk/deps-send-telegram.runtime-BWyavKp9.js +24 -0
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-cC_XvHV8.js +57 -0
- package/dist/plugin-sdk/diagnostic-Dv9S12vm.js +319 -0
- package/dist/plugin-sdk/errors-B8oJXuCF.js +54 -0
- package/dist/plugin-sdk/fetch-guard-W_A4uSz2.js +156 -0
- package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +352 -0
- package/dist/plugin-sdk/image-BSFy8d1M.js +2310 -0
- package/dist/plugin-sdk/image-ops-DN17S88I.js +584 -0
- package/dist/plugin-sdk/image-runtime-5YO31sjU.js +25 -0
- package/dist/plugin-sdk/imessage.js +2 -2
- package/dist/plugin-sdk/index.js +50 -50
- package/dist/plugin-sdk/ir-JaPZ0yKH.js +1296 -0
- package/dist/plugin-sdk/local-roots-BTW3ifco.js +186 -0
- package/dist/plugin-sdk/logger-DDdrdbDu.js +1163 -0
- package/dist/plugin-sdk/login-BXGRny-S.js +57 -0
- package/dist/plugin-sdk/login-qr-DTs92ap8.js +320 -0
- package/dist/plugin-sdk/manager-DzFj9oHX.js +3917 -0
- package/dist/plugin-sdk/manager-runtime-DrpyZvO0.js +15 -0
- package/dist/plugin-sdk/mattermost.js +3 -3
- package/dist/plugin-sdk/outbound-CQ7uBBML.js +212 -0
- package/dist/plugin-sdk/outbound-attachment-dTE6EVdX.js +19 -0
- package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +43 -0
- package/dist/plugin-sdk/paths-C6W4VHoa.js +166 -0
- package/dist/plugin-sdk/pi-embedded-helpers-CfzQPXDC.js +9627 -0
- package/dist/plugin-sdk/pi-model-discovery-Bt6B0MAj.js +134 -0
- package/dist/plugin-sdk/pi-model-discovery-runtime-BcgXpTmL.js +8 -0
- package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-DYJQxhuo.js +354 -0
- package/dist/plugin-sdk/plugins-6NxPd6TS.js +864 -0
- package/dist/plugin-sdk/proxy-fetch-ZPEvp58f.js +38 -0
- package/dist/plugin-sdk/pw-ai-BFK39pwE.js +1938 -0
- package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +1448 -0
- package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +1011 -0
- package/dist/plugin-sdk/redact-BoNEjbpF.js +319 -0
- package/dist/plugin-sdk/reply-DgcrQBKL.js +98828 -0
- package/dist/plugin-sdk/resolve-outbound-target-CbaJ-kc2.js +40 -0
- package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +1994 -0
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-jkgyeVsN.js +10 -0
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DdLJJ1YC.js +19 -0
- package/dist/plugin-sdk/send-BSoMbeqA.js +3135 -0
- package/dist/plugin-sdk/send-Byyfc20_.js +503 -0
- package/dist/plugin-sdk/send-CI-xWEs7.js +2587 -0
- package/dist/plugin-sdk/send-DzP9EJqK.js +540 -0
- package/dist/plugin-sdk/send-MlSZ82sA.js +414 -0
- package/dist/plugin-sdk/session-DFy97tfW.js +169 -0
- package/dist/plugin-sdk/signal.js +2 -2
- package/dist/plugin-sdk/skill-commands-yum46YuA.js +342 -0
- package/dist/plugin-sdk/skills-DUphJGKn.js +1428 -0
- package/dist/plugin-sdk/slash-commands.runtime-5UW5KLyR.js +13 -0
- package/dist/plugin-sdk/slash-dispatch.runtime-4oQ2P_qo.js +52 -0
- package/dist/plugin-sdk/slash-skill-commands.runtime-y_mOLyS7.js +16 -0
- package/dist/plugin-sdk/ssrf-B3XRWBsP.js +202 -0
- package/dist/plugin-sdk/store-DFvIhzWZ.js +81 -0
- package/dist/plugin-sdk/subagent-registry-runtime-DtKXhKtl.js +52 -0
- package/dist/plugin-sdk/tables-bDM_jlLP.js +55 -0
- package/dist/{target-errors-DlzVutaL.js → plugin-sdk/target-errors-BVBW25Y3.js} +4 -4
- package/dist/plugin-sdk/thinking-Bu-w5mW5.js +1206 -0
- package/dist/plugin-sdk/tokens-CTIYTLWu.js +52 -0
- package/dist/plugin-sdk/tool-images-D0G_giwP.js +274 -0
- package/dist/plugin-sdk/web-DSXk7XCb.js +56 -0
- package/dist/plugin-sdk/whatsapp-actions-BOyA0Uuj.js +80 -0
- package/dist/{plugins-Cl_3OCyK.js → plugins-H53_4Gxb.js} +2 -2
- package/dist/{plugins-cli-CN2fty5U.js → plugins-cli-CQkxWdnt.js} +82 -82
- package/dist/{ports-Bop51hz6.js → ports-CKXuQJST.js} +2 -2
- package/dist/{ports-6i8smH3e.js → ports-CXjhFS7T.js} +1 -1
- package/dist/{program-context-ehHvCw9L.js → program-context-tphS7xu7.js} +41 -41
- package/dist/{prompt-select-styled-CSMviLJY.js → prompt-select-styled-DL2p1pfi.js} +40 -40
- package/dist/{provider-auth-helpers-CgNWlsqs.js → provider-auth-helpers-BqWiy-r-.js} +5 -5
- package/dist/{proxy-env-CRD7fbqp.js → proxy-env-D1tz4Z6a.js} +1 -1
- package/dist/{push-apns-DoYzx3tH.js → push-apns-C-YdARdy.js} +5 -5
- package/dist/{pw-ai-yKJj32B4.js → pw-ai-SVeR5d2o.js} +18 -18
- package/dist/{qmd-manager-AYDUTXmc.js → qmd-manager-B-XXhWVw.js} +20 -20
- package/dist/{qr-cli-cikAHfYn.js → qr-cli-B4fjHvn1.js} +2 -2
- package/dist/{query-expansion-CV2Z4_mS.js → query-expansion-Bf60ekMj.js} +12 -12
- package/dist/{redact-snapshot-C9T1079O.js → redact-snapshot-DRqM8Vla.js} +1 -1
- package/dist/{register.agent-BlxoyQt0.js → register.agent-BdiM0qkl.js} +97 -97
- package/dist/register.configure-wANXDbzQ.js +164 -0
- package/dist/{register.maintenance-C-Yv2mHK.js → register.maintenance-CMAt3Nl8.js} +93 -93
- package/dist/{register.message-CUNXtFOj.js → register.message-CbxQ5lgi.js} +73 -73
- package/dist/{register.onboard-BKXm1mL7.js → register.onboard-CbiTdKQX.js} +18 -18
- package/dist/{register.setup-DaT9AIAz.js → register.setup-KhsHMx2v.js} +21 -21
- package/dist/{register.status-health-sessions-7yZmSvUL.js → register.status-health-sessions-Bw5YDa_s.js} +86 -86
- package/dist/{reply-CeUYZhWu.js → reply-BWXzPVSJ.js} +149 -149
- package/dist/{rpc-BDpuIniF.js → rpc-DlN_W_L1.js} +1 -1
- package/dist/{runtime-Dw7Yw4OJ.js → runtime-Ci7mtLvH.js} +3 -3
- package/dist/{runtime-config-collectors-jhc1wDBg.js → runtime-config-collectors-CKmGmTQ5.js} +1 -1
- package/dist/{runtime-whatsapp-login.runtime-f293Z_er.js → runtime-whatsapp-login.runtime-Bxqt5jiO.js} +7 -7
- package/dist/runtime-whatsapp-outbound.runtime-B-UsXwvb.js +32 -0
- package/dist/{sandbox-BgsD1lf7.js → sandbox-Cuk1IWYT.js} +18 -18
- package/dist/{sandbox-cli-BnvmhiN9.js → sandbox-cli-BxgFeoAD.js} +25 -25
- package/dist/{secrets-cli-D7-K7P82.js → secrets-cli-DODLX29x.js} +11 -11
- package/dist/{security-cli-BFJAgNYH.js → security-cli-Ch83VrLP.js} +42 -42
- package/dist/{send-BvlkshC1.js → send-BfVgGHK6.js} +6 -6
- package/dist/{send-tK0H9nwq.js → send-Bw8LNCit.js} +5 -5
- package/dist/{send-CDms2FQA.js → send-C9UJKBSM.js} +4 -4
- package/dist/{send-CPFNtAP8.js → send-DX_fR45p.js} +11 -11
- package/dist/{send-C3Aeswif.js → send-FTQaNJPj.js} +8 -8
- package/dist/{server-OfKJG6Bo.js → server-Q9nnn04D.js} +20 -20
- package/dist/{server-context-B-0KzcZE.js → server-context-CX28l04l.js} +12 -12
- package/dist/{server-lifecycle-D6VNKVvQ.js → server-lifecycle-yAUMTJhv.js} +2 -2
- package/dist/{server-middleware-7cXowO4W.js → server-middleware-DIc4WJOS.js} +1 -1
- package/dist/{server-node-events-DWQhNK-0.js → server-node-events-qU3NTncQ.js} +73 -73
- package/dist/{service-Dk-UMipf.js → service-D4y0_Q5Z.js} +15 -15
- package/dist/{session-Da18ilJ0.js → session-CZJ5Ux6-.js} +1 -1
- package/dist/{sessions-CmjcNTJ3.js → sessions-C5H_BZSr.js} +15 -15
- package/dist/{shared-BzY0v0tS.js → shared-CxdBWgym.js} +3 -3
- package/dist/{shared-BcB-feC8.js → shared-DwNtcoQg.js} +1 -1
- package/dist/{skill-commands-BEWkEml_.js → skill-commands-BSRPnzXp.js} +5 -5
- package/dist/{skill-scanner-Bb5SMbCz.js → skill-scanner-rdr9cQew.js} +6 -6
- package/dist/{skills-Rnr7zPen.js → skills-BnBOxX1c.js} +3 -3
- package/dist/{skills-cli-BowIIIzH.js → skills-cli-CUgeYV1y.js} +5 -5
- package/dist/{skills-install-BLNCKuex.js → skills-install-BE04CZ6e.js} +6 -6
- package/dist/{skills-status-BCU-5otB.js → skills-status-DQw98BkG.js} +1 -1
- package/dist/{slash-commands.runtime-BgVgQ-Eh.js → slash-commands.runtime-BPtL2Qev.js} +11 -11
- package/dist/slash-dispatch.runtime-Cf9dq1k6.js +113 -0
- package/dist/{slash-skill-commands.runtime-4dOiU6U0.js → slash-skill-commands.runtime-9BYoANpd.js} +15 -15
- package/dist/{squidclaw-root-BcB7vo9M.js → squidclaw-root-CnE19yKj.js} +8 -8
- package/dist/{status-COTRBaam.js → status-rb5Jz-VU.js} +26 -26
- package/dist/{status.update-BUql4yz-.js → status.update-BNODJGA9.js} +2 -2
- package/dist/{store-aa15VM42.js → store-PDMRmC5Z.js} +5 -5
- package/dist/subagent-registry-runtime-CTiA365B.js +113 -0
- package/dist/{system-cli-CgCUbH_M.js → system-cli-DJYyTO07.js} +9 -9
- package/dist/{system-run-command-Ny1SbbOD.js → system-run-command-BgnCyvrj.js} +1 -1
- package/dist/{systemd-zbKl2Q3E.js → systemd-fP8tz4aL.js} +9 -9
- package/dist/{systemd-hints-C9_7ouv7.js → systemd-hints-BG_t__ZD.js} +6 -6
- package/dist/{systemd-linger-BM6JyzAr.js → systemd-linger-DgK8uuKY.js} +1 -1
- package/dist/{tables-jZMI8hLl.js → tables-DUSFF9-W.js} +1 -1
- package/dist/{tailnet-gTCqUBfJ.js → tailnet-CLkKVwDq.js} +1 -1
- package/dist/target-errors-BxwxgIDk.js +195 -0
- package/dist/{tool-images-DTl_LHMa.js → tool-images-FhSCiY-o.js} +1 -1
- package/dist/{tui-kDK-MAOc.js → tui-BMOMT-ma.js} +6 -6
- package/dist/{tui-cli-Dxy6fKkU.js → tui-cli-kqZ_-2Mz.js} +32 -32
- package/dist/{update-ZUTn6Jsu.js → update-blK9j2ag.js} +3 -3
- package/dist/{update-cli-D_QEiKyz.js → update-cli-gLKrP8UQ.js} +102 -102
- package/dist/{update-runner-DOXPSA_-.js → update-runner-C2UrF4oZ.js} +16 -16
- package/dist/web-VmjeceHS.js +117 -0
- package/dist/{webhooks-cli-D1iehjkP.js → webhooks-cli-BEXPBILa.js} +6 -6
- package/dist/{whatsapp-actions-hN5bwjWU.js → whatsapp-actions-DhiV181U.js} +17 -17
- package/dist/{with-timeout-BjaANd4G.js → with-timeout-BCAfkt03.js} +3 -3
- package/dist/{workspace-BITWyKG4.js → workspace-B-k5DNiQ.js} +1 -1
- package/dist/{workspace-dirs-B7O9BAHp.js → workspace-dirs-B2dNahfe.js} +1 -1
- package/dist/{ws-Bx8lpC1N.js → ws-DKt5HoA5.js} +2 -2
- package/dist/{wsl-wYxPJ8EO.js → wsl-CgxzAzRe.js} +2 -2
- package/package.json +1 -1
- package/dist/deliver-runtime-uwleBPlq.js +0 -61
- package/dist/deps-send-discord.runtime-CuZGpA7H.js +0 -36
- package/dist/deps-send-imessage.runtime-ByVW2alP.js +0 -35
- package/dist/deps-send-signal.runtime-Dl4GaCbQ.js +0 -34
- package/dist/deps-send-slack.runtime-BEV10FHj.js +0 -32
- package/dist/deps-send-whatsapp.runtime-Di0SEPNK.js +0 -118
- package/dist/image-runtime-B5Q4J9w2.js +0 -55
- package/dist/register.configure-CGptmTVZ.js +0 -164
- package/dist/runtime-whatsapp-outbound.runtime-uDhEmWe1.js +0 -32
- package/dist/slash-dispatch.runtime-D83FVeU7.js +0 -113
- package/dist/subagent-registry-runtime-CrT5RSO9.js +0 -113
- package/dist/web-DtSq_aUB.js +0 -117
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import "./run-with-concurrency-5DMu9szx.js";
|
|
2
|
+
import "./paths-8xF5kDne.js";
|
|
3
|
+
import "./github-copilot-token-Dy-0-Kh3.js";
|
|
4
|
+
import "./config-FhBFLsNm.js";
|
|
5
|
+
import "./logger-DDdrdbDu.js";
|
|
6
|
+
import "./paths-C6W4VHoa.js";
|
|
7
|
+
import "./redact-BoNEjbpF.js";
|
|
8
|
+
import "./errors-B8oJXuCF.js";
|
|
9
|
+
import "./ssrf-B3XRWBsP.js";
|
|
10
|
+
import "./fetch-guard-W_A4uSz2.js";
|
|
11
|
+
import "./api-key-rotation-CrX0fvDj.js";
|
|
12
|
+
import { t as MemoryIndexManager } from "./manager-DzFj9oHX.js";
|
|
13
|
+
import "./query-expansion-eeVz_aEm.js";
|
|
14
|
+
|
|
15
|
+
export { MemoryIndexManager };
|
|
@@ -5,7 +5,7 @@ import fs, { constants } from "node:fs";
|
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import chalk, { Chalk } from "chalk";
|
|
7
7
|
import { Logger } from "tslog";
|
|
8
|
-
import
|
|
8
|
+
import json5 from "json5";
|
|
9
9
|
import util, { promisify } from "node:util";
|
|
10
10
|
import fs$1 from "node:fs/promises";
|
|
11
11
|
import process$1 from "node:process";
|
|
@@ -400,7 +400,7 @@ function readLoggingConfig() {
|
|
|
400
400
|
try {
|
|
401
401
|
if (!fs.existsSync(configPath)) return;
|
|
402
402
|
const raw = fs.readFileSync(configPath, "utf-8");
|
|
403
|
-
const logging =
|
|
403
|
+
const logging = json5.parse(raw)?.logging;
|
|
404
404
|
if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
|
|
405
405
|
return logging;
|
|
406
406
|
} catch {
|
|
@@ -4481,7 +4481,7 @@ function resolveSquidClawManifestBlock(params) {
|
|
|
4481
4481
|
const raw = getFrontmatterString(params.frontmatter, params.key ?? "metadata");
|
|
4482
4482
|
if (!raw) return;
|
|
4483
4483
|
try {
|
|
4484
|
-
const parsed =
|
|
4484
|
+
const parsed = json5.parse(raw);
|
|
4485
4485
|
if (!parsed || typeof parsed !== "object") return;
|
|
4486
4486
|
const manifestKeys = [MANIFEST_KEY, ...LEGACY_MANIFEST_KEYS];
|
|
4487
4487
|
for (const key of manifestKeys) {
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { n as loadConfig } from "./config-FhBFLsNm.js";
|
|
2
|
+
import { G as getChildLogger, M as toWhatsappJid, _ as escapeRegExp, a as createSubsystemLogger } from "./logger-DDdrdbDu.js";
|
|
3
|
+
import { n as normalizePollInput } from "./polls-3WJMd-G-.js";
|
|
4
|
+
import { i as resolveMarkdownTableMode, v as loadWebMedia } from "./ir-JaPZ0yKH.js";
|
|
5
|
+
import { t as convertMarkdownTables } from "./tables-bDM_jlLP.js";
|
|
6
|
+
import { n as generateSecureUuid } from "./secure-random-IkuYAMEf.js";
|
|
7
|
+
import { i as redactIdentifier, n as requireActiveWebListener } from "./active-listener-DZCohPuZ.js";
|
|
8
|
+
|
|
9
|
+
//#region src/markdown/whatsapp.ts
|
|
10
|
+
/**
|
|
11
|
+
* Convert standard Markdown formatting to WhatsApp-compatible markup.
|
|
12
|
+
*
|
|
13
|
+
* WhatsApp uses its own formatting syntax:
|
|
14
|
+
* bold: *text*
|
|
15
|
+
* italic: _text_
|
|
16
|
+
* strikethrough: ~text~
|
|
17
|
+
* monospace: ```text```
|
|
18
|
+
*
|
|
19
|
+
* Standard Markdown uses:
|
|
20
|
+
* bold: **text** or __text__
|
|
21
|
+
* italic: *text* or _text_
|
|
22
|
+
* strikethrough: ~~text~~
|
|
23
|
+
* code: `text` (inline) or ```text``` (block)
|
|
24
|
+
*
|
|
25
|
+
* The conversion preserves fenced code blocks and inline code,
|
|
26
|
+
* then converts bold and strikethrough markers.
|
|
27
|
+
*/
|
|
28
|
+
/** Placeholder tokens used during conversion to protect code spans. */
|
|
29
|
+
const FENCE_PLACEHOLDER = "\0FENCE";
|
|
30
|
+
const INLINE_CODE_PLACEHOLDER = "\0CODE";
|
|
31
|
+
/**
|
|
32
|
+
* Convert standard Markdown bold/italic/strikethrough to WhatsApp formatting.
|
|
33
|
+
*
|
|
34
|
+
* Order of operations matters:
|
|
35
|
+
* 1. Protect fenced code blocks (```...```) — already WhatsApp-compatible
|
|
36
|
+
* 2. Protect inline code (`...`) — leave as-is
|
|
37
|
+
* 3. Convert **bold** → *bold* and __bold__ → *bold*
|
|
38
|
+
* 4. Convert ~~strike~~ → ~strike~
|
|
39
|
+
* 5. Restore protected spans
|
|
40
|
+
*
|
|
41
|
+
* Italic *text* and _text_ are left alone since WhatsApp uses _text_ for italic
|
|
42
|
+
* and single * is already WhatsApp bold — no conversion needed for single markers.
|
|
43
|
+
*/
|
|
44
|
+
function markdownToWhatsApp(text) {
|
|
45
|
+
if (!text) return text;
|
|
46
|
+
const fences = [];
|
|
47
|
+
let result = text.replace(/```[\s\S]*?```/g, (match) => {
|
|
48
|
+
fences.push(match);
|
|
49
|
+
return `${FENCE_PLACEHOLDER}${fences.length - 1}`;
|
|
50
|
+
});
|
|
51
|
+
const inlineCodes = [];
|
|
52
|
+
result = result.replace(/`[^`\n]+`/g, (match) => {
|
|
53
|
+
inlineCodes.push(match);
|
|
54
|
+
return `${INLINE_CODE_PLACEHOLDER}${inlineCodes.length - 1}`;
|
|
55
|
+
});
|
|
56
|
+
result = result.replace(/\*\*(.+?)\*\*/g, "*$1*");
|
|
57
|
+
result = result.replace(/__(.+?)__/g, "*$1*");
|
|
58
|
+
result = result.replace(/~~(.+?)~~/g, "~$1~");
|
|
59
|
+
result = result.replace(new RegExp(`${escapeRegExp(INLINE_CODE_PLACEHOLDER)}(\\d+)`, "g"), (_, idx) => inlineCodes[Number(idx)] ?? "");
|
|
60
|
+
result = result.replace(new RegExp(`${escapeRegExp(FENCE_PLACEHOLDER)}(\\d+)`, "g"), (_, idx) => fences[Number(idx)] ?? "");
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/web/outbound.ts
|
|
66
|
+
const outboundLog = createSubsystemLogger("gateway/channels/whatsapp").child("outbound");
|
|
67
|
+
async function sendMessageWhatsApp(to, body, options) {
|
|
68
|
+
let text = body;
|
|
69
|
+
const correlationId = generateSecureUuid();
|
|
70
|
+
const startedAt = Date.now();
|
|
71
|
+
const { listener: active, accountId: resolvedAccountId } = requireActiveWebListener(options.accountId);
|
|
72
|
+
const tableMode = resolveMarkdownTableMode({
|
|
73
|
+
cfg: options.cfg ?? loadConfig(),
|
|
74
|
+
channel: "whatsapp",
|
|
75
|
+
accountId: resolvedAccountId ?? options.accountId
|
|
76
|
+
});
|
|
77
|
+
text = convertMarkdownTables(text ?? "", tableMode);
|
|
78
|
+
text = markdownToWhatsApp(text);
|
|
79
|
+
const redactedTo = redactIdentifier(to);
|
|
80
|
+
const logger = getChildLogger({
|
|
81
|
+
module: "web-outbound",
|
|
82
|
+
correlationId,
|
|
83
|
+
to: redactedTo
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
const jid = toWhatsappJid(to);
|
|
87
|
+
const redactedJid = redactIdentifier(jid);
|
|
88
|
+
let mediaBuffer;
|
|
89
|
+
let mediaType;
|
|
90
|
+
let documentFileName;
|
|
91
|
+
if (options.mediaUrl) {
|
|
92
|
+
const media = await loadWebMedia(options.mediaUrl, { localRoots: options.mediaLocalRoots });
|
|
93
|
+
const caption = text || void 0;
|
|
94
|
+
mediaBuffer = media.buffer;
|
|
95
|
+
mediaType = media.contentType;
|
|
96
|
+
if (media.kind === "audio") mediaType = media.contentType === "audio/ogg" ? "audio/ogg; codecs=opus" : media.contentType ?? "application/octet-stream";
|
|
97
|
+
else if (media.kind === "video") text = caption ?? "";
|
|
98
|
+
else if (media.kind === "image") text = caption ?? "";
|
|
99
|
+
else {
|
|
100
|
+
text = caption ?? "";
|
|
101
|
+
documentFileName = media.fileName;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
outboundLog.info(`Sending message -> ${redactedJid}${options.mediaUrl ? " (media)" : ""}`);
|
|
105
|
+
logger.info({
|
|
106
|
+
jid: redactedJid,
|
|
107
|
+
hasMedia: Boolean(options.mediaUrl)
|
|
108
|
+
}, "sending message");
|
|
109
|
+
await active.sendComposingTo(to);
|
|
110
|
+
const accountId = Boolean(options.accountId?.trim()) ? resolvedAccountId : void 0;
|
|
111
|
+
const sendOptions = options.gifPlayback || accountId || documentFileName ? {
|
|
112
|
+
...options.gifPlayback ? { gifPlayback: true } : {},
|
|
113
|
+
...documentFileName ? { fileName: documentFileName } : {},
|
|
114
|
+
accountId
|
|
115
|
+
} : void 0;
|
|
116
|
+
const messageId = (sendOptions ? await active.sendMessage(to, text, mediaBuffer, mediaType, sendOptions) : await active.sendMessage(to, text, mediaBuffer, mediaType))?.messageId ?? "unknown";
|
|
117
|
+
const durationMs = Date.now() - startedAt;
|
|
118
|
+
outboundLog.info(`Sent message ${messageId} -> ${redactedJid}${options.mediaUrl ? " (media)" : ""} (${durationMs}ms)`);
|
|
119
|
+
logger.info({
|
|
120
|
+
jid: redactedJid,
|
|
121
|
+
messageId
|
|
122
|
+
}, "sent message");
|
|
123
|
+
return {
|
|
124
|
+
messageId,
|
|
125
|
+
toJid: jid
|
|
126
|
+
};
|
|
127
|
+
} catch (err) {
|
|
128
|
+
logger.error({
|
|
129
|
+
err: String(err),
|
|
130
|
+
to: redactedTo,
|
|
131
|
+
hasMedia: Boolean(options.mediaUrl)
|
|
132
|
+
}, "failed to send via web session");
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function sendReactionWhatsApp(chatJid, messageId, emoji, options) {
|
|
137
|
+
const correlationId = generateSecureUuid();
|
|
138
|
+
const { listener: active } = requireActiveWebListener(options.accountId);
|
|
139
|
+
const redactedChatJid = redactIdentifier(chatJid);
|
|
140
|
+
const logger = getChildLogger({
|
|
141
|
+
module: "web-outbound",
|
|
142
|
+
correlationId,
|
|
143
|
+
chatJid: redactedChatJid,
|
|
144
|
+
messageId
|
|
145
|
+
});
|
|
146
|
+
try {
|
|
147
|
+
const redactedJid = redactIdentifier(toWhatsappJid(chatJid));
|
|
148
|
+
outboundLog.info(`Sending reaction "${emoji}" -> message ${messageId}`);
|
|
149
|
+
logger.info({
|
|
150
|
+
chatJid: redactedJid,
|
|
151
|
+
messageId,
|
|
152
|
+
emoji
|
|
153
|
+
}, "sending reaction");
|
|
154
|
+
await active.sendReaction(chatJid, messageId, emoji, options.fromMe ?? false, options.participant);
|
|
155
|
+
outboundLog.info(`Sent reaction "${emoji}" -> message ${messageId}`);
|
|
156
|
+
logger.info({
|
|
157
|
+
chatJid: redactedJid,
|
|
158
|
+
messageId,
|
|
159
|
+
emoji
|
|
160
|
+
}, "sent reaction");
|
|
161
|
+
} catch (err) {
|
|
162
|
+
logger.error({
|
|
163
|
+
err: String(err),
|
|
164
|
+
chatJid: redactedChatJid,
|
|
165
|
+
messageId,
|
|
166
|
+
emoji
|
|
167
|
+
}, "failed to send reaction via web session");
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function sendPollWhatsApp(to, poll, options) {
|
|
172
|
+
const correlationId = generateSecureUuid();
|
|
173
|
+
const startedAt = Date.now();
|
|
174
|
+
const { listener: active } = requireActiveWebListener(options.accountId);
|
|
175
|
+
const redactedTo = redactIdentifier(to);
|
|
176
|
+
const logger = getChildLogger({
|
|
177
|
+
module: "web-outbound",
|
|
178
|
+
correlationId,
|
|
179
|
+
to: redactedTo
|
|
180
|
+
});
|
|
181
|
+
try {
|
|
182
|
+
const jid = toWhatsappJid(to);
|
|
183
|
+
const redactedJid = redactIdentifier(jid);
|
|
184
|
+
const normalized = normalizePollInput(poll, { maxOptions: 12 });
|
|
185
|
+
outboundLog.info(`Sending poll -> ${redactedJid}`);
|
|
186
|
+
logger.info({
|
|
187
|
+
jid: redactedJid,
|
|
188
|
+
optionCount: normalized.options.length,
|
|
189
|
+
maxSelections: normalized.maxSelections
|
|
190
|
+
}, "sending poll");
|
|
191
|
+
const messageId = (await active.sendPoll(to, normalized))?.messageId ?? "unknown";
|
|
192
|
+
const durationMs = Date.now() - startedAt;
|
|
193
|
+
outboundLog.info(`Sent poll ${messageId} -> ${redactedJid} (${durationMs}ms)`);
|
|
194
|
+
logger.info({
|
|
195
|
+
jid: redactedJid,
|
|
196
|
+
messageId
|
|
197
|
+
}, "sent poll");
|
|
198
|
+
return {
|
|
199
|
+
messageId,
|
|
200
|
+
toJid: jid
|
|
201
|
+
};
|
|
202
|
+
} catch (err) {
|
|
203
|
+
logger.error({
|
|
204
|
+
err: String(err),
|
|
205
|
+
to: redactedTo
|
|
206
|
+
}, "failed to send poll via web session");
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
//#endregion
|
|
212
|
+
export { markdownToWhatsApp as i, sendPollWhatsApp as n, sendReactionWhatsApp as r, sendMessageWhatsApp as t };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as buildOutboundMediaLoadOptions } from "./load-options-DNSaiajj.js";
|
|
2
|
+
import { v as loadWebMedia } from "./ir-JaPZ0yKH.js";
|
|
3
|
+
import { a as saveMediaBuffer } from "./store-DFvIhzWZ.js";
|
|
4
|
+
|
|
5
|
+
//#region src/media/outbound-attachment.ts
|
|
6
|
+
async function resolveOutboundAttachmentFromUrl(mediaUrl, maxBytes, options) {
|
|
7
|
+
const media = await loadWebMedia(mediaUrl, buildOutboundMediaLoadOptions({
|
|
8
|
+
maxBytes,
|
|
9
|
+
mediaLocalRoots: options?.localRoots
|
|
10
|
+
}));
|
|
11
|
+
const saved = await saveMediaBuffer(media.buffer, media.contentType ?? void 0, "outbound", maxBytes);
|
|
12
|
+
return {
|
|
13
|
+
path: saved.path,
|
|
14
|
+
contentType: saved.contentType
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { resolveOutboundAttachmentFromUrl as t };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { F as resolveBoundaryPath, P as BOUNDARY_PATH_ALIAS_POLICIES, R as isNotFoundPathError } from "./run-with-concurrency-5DMu9szx.js";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
|
|
5
|
+
//#region src/infra/hardlink-guards.ts
|
|
6
|
+
async function assertNoHardlinkedFinalPath(params) {
|
|
7
|
+
if (params.allowFinalHardlinkForUnlink) return;
|
|
8
|
+
let stat;
|
|
9
|
+
try {
|
|
10
|
+
stat = await fs.stat(params.filePath);
|
|
11
|
+
} catch (err) {
|
|
12
|
+
if (isNotFoundPathError(err)) return;
|
|
13
|
+
throw err;
|
|
14
|
+
}
|
|
15
|
+
if (!stat.isFile()) return;
|
|
16
|
+
if (stat.nlink > 1) throw new Error(`Hardlinked path is not allowed under ${params.boundaryLabel} (${shortPath(params.root)}): ${shortPath(params.filePath)}`);
|
|
17
|
+
}
|
|
18
|
+
function shortPath(value) {
|
|
19
|
+
if (value.startsWith(os.homedir())) return `~${value.slice(os.homedir().length)}`;
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/infra/path-alias-guards.ts
|
|
25
|
+
const PATH_ALIAS_POLICIES = BOUNDARY_PATH_ALIAS_POLICIES;
|
|
26
|
+
async function assertNoPathAliasEscape(params) {
|
|
27
|
+
const resolved = await resolveBoundaryPath({
|
|
28
|
+
absolutePath: params.absolutePath,
|
|
29
|
+
rootPath: params.rootPath,
|
|
30
|
+
boundaryLabel: params.boundaryLabel,
|
|
31
|
+
policy: params.policy
|
|
32
|
+
});
|
|
33
|
+
if (params.policy?.allowFinalSymlinkForUnlink === true && resolved.kind === "symlink") return;
|
|
34
|
+
await assertNoHardlinkedFinalPath({
|
|
35
|
+
filePath: resolved.absolutePath,
|
|
36
|
+
root: resolved.rootPath,
|
|
37
|
+
boundaryLabel: params.boundaryLabel,
|
|
38
|
+
allowFinalHardlinkForUnlink: params.policy?.allowFinalHardlinkForUnlink
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { assertNoPathAliasEscape as n, PATH_ALIAS_POLICIES as t };
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { $ as normalizeAgentId, K as DEFAULT_AGENT_ID } from "./run-with-concurrency-5DMu9szx.js";
|
|
2
|
+
import { c as resolveStateDir, d as resolveRequiredHomeDir, l as expandHomePrefix } from "./paths-8xF5kDne.js";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
|
|
7
|
+
//#region src/config/sessions/paths.ts
|
|
8
|
+
function resolveAgentSessionsDir(agentId, env = process.env, homedir = () => resolveRequiredHomeDir(env, os.homedir)) {
|
|
9
|
+
const root = resolveStateDir(env, homedir);
|
|
10
|
+
const id = normalizeAgentId(agentId ?? DEFAULT_AGENT_ID);
|
|
11
|
+
return path.join(root, "agents", id, "sessions");
|
|
12
|
+
}
|
|
13
|
+
function resolveSessionTranscriptsDirForAgent(agentId, env = process.env, homedir = () => resolveRequiredHomeDir(env, os.homedir)) {
|
|
14
|
+
return resolveAgentSessionsDir(agentId, env, homedir);
|
|
15
|
+
}
|
|
16
|
+
function resolveDefaultSessionStorePath(agentId) {
|
|
17
|
+
return path.join(resolveAgentSessionsDir(agentId), "sessions.json");
|
|
18
|
+
}
|
|
19
|
+
const MULTI_STORE_PATH_SENTINEL = "(multiple)";
|
|
20
|
+
function resolveSessionFilePathOptions(params) {
|
|
21
|
+
const agentId = params.agentId?.trim();
|
|
22
|
+
const storePath = params.storePath?.trim();
|
|
23
|
+
if (storePath && storePath !== MULTI_STORE_PATH_SENTINEL) {
|
|
24
|
+
const sessionsDir = path.dirname(path.resolve(storePath));
|
|
25
|
+
return agentId ? {
|
|
26
|
+
sessionsDir,
|
|
27
|
+
agentId
|
|
28
|
+
} : { sessionsDir };
|
|
29
|
+
}
|
|
30
|
+
if (agentId) return { agentId };
|
|
31
|
+
}
|
|
32
|
+
const SAFE_SESSION_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;
|
|
33
|
+
function validateSessionId(sessionId) {
|
|
34
|
+
const trimmed = sessionId.trim();
|
|
35
|
+
if (!SAFE_SESSION_ID_RE.test(trimmed)) throw new Error(`Invalid session ID: ${sessionId}`);
|
|
36
|
+
return trimmed;
|
|
37
|
+
}
|
|
38
|
+
function resolveSessionsDir(opts) {
|
|
39
|
+
const sessionsDir = opts?.sessionsDir?.trim();
|
|
40
|
+
if (sessionsDir) return path.resolve(sessionsDir);
|
|
41
|
+
return resolveAgentSessionsDir(opts?.agentId);
|
|
42
|
+
}
|
|
43
|
+
function resolvePathFromAgentSessionsDir(agentSessionsDir, candidateAbsPath) {
|
|
44
|
+
const agentBase = safeRealpathSync(path.resolve(agentSessionsDir)) ?? path.resolve(agentSessionsDir);
|
|
45
|
+
const realCandidate = safeRealpathSync(candidateAbsPath) ?? candidateAbsPath;
|
|
46
|
+
const relative = path.relative(agentBase, realCandidate);
|
|
47
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) return;
|
|
48
|
+
return path.resolve(agentBase, relative);
|
|
49
|
+
}
|
|
50
|
+
function resolveSiblingAgentSessionsDir(baseSessionsDir, agentId) {
|
|
51
|
+
const resolvedBase = path.resolve(baseSessionsDir);
|
|
52
|
+
if (path.basename(resolvedBase) !== "sessions") return;
|
|
53
|
+
const baseAgentDir = path.dirname(resolvedBase);
|
|
54
|
+
const baseAgentsDir = path.dirname(baseAgentDir);
|
|
55
|
+
if (path.basename(baseAgentsDir) !== "agents") return;
|
|
56
|
+
const rootDir = path.dirname(baseAgentsDir);
|
|
57
|
+
return path.join(rootDir, "agents", normalizeAgentId(agentId), "sessions");
|
|
58
|
+
}
|
|
59
|
+
function resolveAgentSessionsPathParts(candidateAbsPath) {
|
|
60
|
+
const parts = path.normalize(path.resolve(candidateAbsPath)).split(path.sep).filter(Boolean);
|
|
61
|
+
const sessionsIndex = parts.lastIndexOf("sessions");
|
|
62
|
+
if (sessionsIndex < 2 || parts[sessionsIndex - 2] !== "agents") return null;
|
|
63
|
+
return {
|
|
64
|
+
parts,
|
|
65
|
+
sessionsIndex
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function extractAgentIdFromAbsoluteSessionPath(candidateAbsPath) {
|
|
69
|
+
const parsed = resolveAgentSessionsPathParts(candidateAbsPath);
|
|
70
|
+
if (!parsed) return;
|
|
71
|
+
const { parts, sessionsIndex } = parsed;
|
|
72
|
+
return parts[sessionsIndex - 1] || void 0;
|
|
73
|
+
}
|
|
74
|
+
function resolveStructuralSessionFallbackPath(candidateAbsPath, expectedAgentId) {
|
|
75
|
+
const parsed = resolveAgentSessionsPathParts(candidateAbsPath);
|
|
76
|
+
if (!parsed) return;
|
|
77
|
+
const { parts, sessionsIndex } = parsed;
|
|
78
|
+
const agentIdPart = parts[sessionsIndex - 1];
|
|
79
|
+
if (!agentIdPart) return;
|
|
80
|
+
const normalizedAgentId = normalizeAgentId(agentIdPart);
|
|
81
|
+
if (normalizedAgentId !== agentIdPart.toLowerCase()) return;
|
|
82
|
+
if (normalizedAgentId !== normalizeAgentId(expectedAgentId)) return;
|
|
83
|
+
const relativeSegments = parts.slice(sessionsIndex + 1);
|
|
84
|
+
if (relativeSegments.length !== 1) return;
|
|
85
|
+
const fileName = relativeSegments[0];
|
|
86
|
+
if (!fileName || fileName === "." || fileName === "..") return;
|
|
87
|
+
return path.normalize(path.resolve(candidateAbsPath));
|
|
88
|
+
}
|
|
89
|
+
function safeRealpathSync(filePath) {
|
|
90
|
+
try {
|
|
91
|
+
return fs.realpathSync(filePath);
|
|
92
|
+
} catch {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function resolvePathWithinSessionsDir(sessionsDir, candidate, opts) {
|
|
97
|
+
const trimmed = candidate.trim();
|
|
98
|
+
if (!trimmed) throw new Error("Session file path must not be empty");
|
|
99
|
+
const resolvedBase = path.resolve(sessionsDir);
|
|
100
|
+
const realBase = safeRealpathSync(resolvedBase) ?? resolvedBase;
|
|
101
|
+
const realTrimmed = path.isAbsolute(trimmed) ? safeRealpathSync(trimmed) ?? trimmed : trimmed;
|
|
102
|
+
const normalized = path.isAbsolute(realTrimmed) ? path.relative(realBase, realTrimmed) : realTrimmed;
|
|
103
|
+
if (normalized.startsWith("..") && path.isAbsolute(realTrimmed)) {
|
|
104
|
+
const tryAgentFallback = (agentId) => {
|
|
105
|
+
const normalizedAgentId = normalizeAgentId(agentId);
|
|
106
|
+
const siblingSessionsDir = resolveSiblingAgentSessionsDir(realBase, normalizedAgentId);
|
|
107
|
+
if (siblingSessionsDir) {
|
|
108
|
+
const siblingResolved = resolvePathFromAgentSessionsDir(siblingSessionsDir, realTrimmed);
|
|
109
|
+
if (siblingResolved) return siblingResolved;
|
|
110
|
+
}
|
|
111
|
+
return resolvePathFromAgentSessionsDir(resolveAgentSessionsDir(normalizedAgentId), realTrimmed);
|
|
112
|
+
};
|
|
113
|
+
const explicitAgentId = opts?.agentId?.trim();
|
|
114
|
+
if (explicitAgentId) {
|
|
115
|
+
const resolvedFromAgent = tryAgentFallback(explicitAgentId);
|
|
116
|
+
if (resolvedFromAgent) return resolvedFromAgent;
|
|
117
|
+
}
|
|
118
|
+
const extractedAgentId = extractAgentIdFromAbsoluteSessionPath(realTrimmed);
|
|
119
|
+
if (extractedAgentId) {
|
|
120
|
+
const resolvedFromPath = tryAgentFallback(extractedAgentId);
|
|
121
|
+
if (resolvedFromPath) return resolvedFromPath;
|
|
122
|
+
const structuralFallback = resolveStructuralSessionFallbackPath(realTrimmed, extractedAgentId);
|
|
123
|
+
if (structuralFallback) return structuralFallback;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!normalized || normalized.startsWith("..") || path.isAbsolute(normalized)) throw new Error("Session file path must be within sessions directory");
|
|
127
|
+
return path.resolve(realBase, normalized);
|
|
128
|
+
}
|
|
129
|
+
function resolveSessionTranscriptPathInDir(sessionId, sessionsDir, topicId) {
|
|
130
|
+
const safeSessionId = validateSessionId(sessionId);
|
|
131
|
+
const safeTopicId = typeof topicId === "string" ? encodeURIComponent(topicId) : typeof topicId === "number" ? String(topicId) : void 0;
|
|
132
|
+
return resolvePathWithinSessionsDir(sessionsDir, safeTopicId !== void 0 ? `${safeSessionId}-topic-${safeTopicId}.jsonl` : `${safeSessionId}.jsonl`);
|
|
133
|
+
}
|
|
134
|
+
function resolveSessionTranscriptPath(sessionId, agentId, topicId) {
|
|
135
|
+
return resolveSessionTranscriptPathInDir(sessionId, resolveAgentSessionsDir(agentId), topicId);
|
|
136
|
+
}
|
|
137
|
+
function resolveSessionFilePath(sessionId, entry, opts) {
|
|
138
|
+
const sessionsDir = resolveSessionsDir(opts);
|
|
139
|
+
const candidate = entry?.sessionFile?.trim();
|
|
140
|
+
if (candidate) try {
|
|
141
|
+
return resolvePathWithinSessionsDir(sessionsDir, candidate, { agentId: opts?.agentId });
|
|
142
|
+
} catch {}
|
|
143
|
+
return resolveSessionTranscriptPathInDir(sessionId, sessionsDir);
|
|
144
|
+
}
|
|
145
|
+
function resolveStorePath(store, opts) {
|
|
146
|
+
const agentId = normalizeAgentId(opts?.agentId ?? DEFAULT_AGENT_ID);
|
|
147
|
+
if (!store) return resolveDefaultSessionStorePath(agentId);
|
|
148
|
+
if (store.includes("{agentId}")) {
|
|
149
|
+
const expanded = store.replaceAll("{agentId}", agentId);
|
|
150
|
+
if (expanded.startsWith("~")) return path.resolve(expandHomePrefix(expanded, {
|
|
151
|
+
home: resolveRequiredHomeDir(process.env, os.homedir),
|
|
152
|
+
env: process.env,
|
|
153
|
+
homedir: os.homedir
|
|
154
|
+
}));
|
|
155
|
+
return path.resolve(expanded);
|
|
156
|
+
}
|
|
157
|
+
if (store.startsWith("~")) return path.resolve(expandHomePrefix(store, {
|
|
158
|
+
home: resolveRequiredHomeDir(process.env, os.homedir),
|
|
159
|
+
env: process.env,
|
|
160
|
+
homedir: os.homedir
|
|
161
|
+
}));
|
|
162
|
+
return path.resolve(store);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
export { resolveSessionTranscriptPathInDir as a, resolveSessionTranscriptPath as i, resolveSessionFilePath as n, resolveSessionTranscriptsDirForAgent as o, resolveSessionFilePathOptions as r, resolveStorePath as s, resolveDefaultSessionStorePath as t };
|