@symerian/symi 2.8.16 → 2.9.0

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.
Files changed (215) hide show
  1. package/dist/{acp-cli-BgR7mxTS.js → acp-cli-BTu3_kZ1.js} +2 -2
  2. package/dist/{acp-cli-D1JYg9c1.js → acp-cli-Bav1bRj2.js} +2 -2
  3. package/dist/{agents-D6V12K_e.js → agents-CvNeiuSB.js} +5 -5
  4. package/dist/{agents.config-C0iGGY9q.js → agents.config-BCgY5FjE.js} +1 -1
  5. package/dist/{agents.config-BIIkG8rN.js → agents.config-Ct64cGQ8.js} +1 -1
  6. package/dist/{audio-preflight-rjCWpcfE.js → audio-preflight-Cb-T0r6e.js} +4 -4
  7. package/dist/{audit-xiwEIT96.js → audit-C9nq99IR.js} +2 -2
  8. package/dist/{audit-Dr_8rC6G.js → audit-CuKP86d_.js} +2 -2
  9. package/dist/{auth-choice-BcCUgEa4.js → auth-choice-ChFU9OCF.js} +2 -2
  10. package/dist/{auth-choice-jyLLyEpy.js → auth-choice-DmMyKZX4.js} +2 -2
  11. package/dist/{banner-DSRsscTp.js → banner-Bf46tqiY.js} +1 -1
  12. package/dist/{browser-cli-IXepRCZR.js → browser-cli-ClgQ-C8E.js} +3 -3
  13. package/dist/{browser-cli-BQeCPbES.js → browser-cli-DuPPIcuV.js} +3 -3
  14. package/dist/build-info.json +3 -3
  15. package/dist/bundled/boot-md/handler.js +7 -7
  16. package/dist/bundled/session-memory/handler.js +7 -7
  17. package/dist/{call-BkJK3eYP.js → call-DYfKEdwh.js} +2 -1
  18. package/dist/{call-CAGvQYXj.js → call-M4YyUnwu.js} +2 -1
  19. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  20. package/dist/{channel-options-Cr_if7it.js → channel-options-Bqc2VCgt.js} +1 -1
  21. package/dist/{channel-options-BSdsxwj0.js → channel-options-D4a0ZJ72.js} +1 -1
  22. package/dist/{channel-web-C3gcPe4C.js → channel-web-YNC2xS5K.js} +1 -1
  23. package/dist/{channels-cli-O7MxdB1l.js → channels-cli-BFJcNLbB.js} +9 -9
  24. package/dist/{channels-cli-Bn6mTlYq.js → channels-cli-h3GnmmM9.js} +9 -9
  25. package/dist/{chrome-C08Z0XAa.js → chrome-ROtrXlNs.js} +7 -7
  26. package/dist/cli/daemon-cli.js +1 -1
  27. package/dist/{cli-RIwsXnB-.js → cli-BX54CAM7.js} +6 -6
  28. package/dist/{cli-CLOf6U-k.js → cli-BpQlSGVs.js} +6 -6
  29. package/dist/{client-Cmq13-uF.js → client-CJIMV1WD.js} +36 -1
  30. package/dist/{client-CYsBIR3j.js → client-pd8kwOFJ.js} +36 -1
  31. package/dist/{command-registry-BiznuVYK.js → command-registry-BiRjJ2Sy.js} +11 -11
  32. package/dist/{completion-cli-BVG9ZtBG.js → completion-cli-BYXofVqv.js} +2 -2
  33. package/dist/{completion-cli-D-xVtDhj.js → completion-cli-C8K5J1ld.js} +1 -1
  34. package/dist/{config-cli-CDTQQFyj.js → config-cli-BPPD3xqE.js} +1 -1
  35. package/dist/{config-cli-zd2upqe_.js → config-cli-Deoo6r2K.js} +1 -1
  36. package/dist/{configure-Cu4CiLWY.js → configure-BKHxUAAh.js} +6 -6
  37. package/dist/{configure-BHdczngQ.js → configure-D4f0P3bH.js} +6 -6
  38. package/dist/control-ui/css/style.css +130 -0
  39. package/dist/control-ui/index.html +11 -0
  40. package/dist/control-ui/js/history.js +288 -8
  41. package/dist/{cron-cli-Dq2FEfK1.js → cron-cli-BEdmHCWZ.js} +3 -3
  42. package/dist/{cron-cli-CZCm3aLt.js → cron-cli-C8-Gv5dd.js} +3 -3
  43. package/dist/{daemon-cli-CweMes2K.js → daemon-cli-BFoJGCHZ.js} +2 -2
  44. package/dist/{daemon-cli-B2_uIgDM.js → daemon-cli-D6wyb9bo.js} +2 -2
  45. package/dist/daemon-cli.js +36 -0
  46. package/dist/{deliver-qUx-eLKt.js → deliver-B0OUq6RP.js} +1 -1
  47. package/dist/{devices-cli-DeoPyzAd.js → devices-cli-BXc6DPkC.js} +2 -2
  48. package/dist/{devices-cli-3ui-Wcaj.js → devices-cli-CHt4I-7e.js} +2 -2
  49. package/dist/{doctor-completion-ClveVbW_.js → doctor-completion-gMWymNcA.js} +1 -1
  50. package/dist/{doctor-completion-e-Ke-FnA.js → doctor-completion-woDYSVtY.js} +1 -1
  51. package/dist/entry.js +1 -1
  52. package/dist/{exec-approvals-cli-Bx9loYnQ.js → exec-approvals-cli-BBKVrFTj.js} +4 -4
  53. package/dist/{exec-approvals-cli-CTEn_Eu_.js → exec-approvals-cli-CKRDAo17.js} +4 -4
  54. package/dist/extensionAPI.js +2 -2
  55. package/dist/{gateway-cli-DGMuMxMT.js → gateway-cli-Bnh42-56.js} +91 -46
  56. package/dist/{gateway-cli-CBseg7zA.js → gateway-cli-DsnkTUOp.js} +91 -46
  57. package/dist/{gateway-rpc-DbSbyIcL.js → gateway-rpc-BEfosIsg.js} +1 -1
  58. package/dist/{gateway-rpc-QsFn5Zr1.js → gateway-rpc-DZrB7Sl_.js} +1 -1
  59. package/dist/{glass-ui-ws-B0WonpHP.js → glass-ui-ws-0Y0KsBvU.js} +13 -13
  60. package/dist/{glass-ui-ws-BU6qyCvM.js → glass-ui-ws-uj3DRmL8.js} +13 -13
  61. package/dist/{health-BrpUi4qW.js → health-CcV5nKIK.js} +2 -2
  62. package/dist/{health-d4gqJJCY.js → health-Dl2WRoTa.js} +2 -2
  63. package/dist/{hooks-cli-Dm2SU8AY.js → hooks-cli-CTcHtm_0.js} +7 -7
  64. package/dist/{hooks-cli-CBStbWME.js → hooks-cli-DEJe3dUH.js} +7 -7
  65. package/dist/{image-C6rCON9L.js → image-BuVL0jHI.js} +1 -1
  66. package/dist/index.js +11 -11
  67. package/dist/llm-slug-generator.js +7 -7
  68. package/dist/{logs-cli-R4WwQvR2.js → logs-cli-CsHpYc2M.js} +3 -3
  69. package/dist/{logs-cli-1hn28HCu.js → logs-cli-N5jQvJTm.js} +3 -3
  70. package/dist/{manager-BOvfAdfG.js → manager-9Mni2AA9.js} +1 -1
  71. package/dist/{manager-CtwApSQo.js → manager-C-H0XXJq.js} +1 -1
  72. package/dist/{manager-B-5p7UGu.js → manager-CjW8kPVc.js} +1 -1
  73. package/dist/{manager-DDboJTtn.js → manager-QPF0UtOC.js} +1 -1
  74. package/dist/{memory-cli-BOxWccJu.js → memory-cli-BTByRgM0.js} +3 -3
  75. package/dist/{memory-cli-D2QHGsxh.js → memory-cli-OW9XfyYu.js} +3 -3
  76. package/dist/{models-Cn1cbmce.js → models-Q1jV8ArL.js} +3 -3
  77. package/dist/{models-cli-CXW-3Zot.js → models-cli-Cy6H1sFq.js} +8 -8
  78. package/dist/{models-cli-Cdkkr4--.js → models-cli-pfVmmgpv.js} +7 -7
  79. package/dist/{node-cli-BBN6PoOG.js → node-cli-BD4E-Y8a.js} +1 -1
  80. package/dist/{node-cli-BsAzTrAx.js → node-cli-CwnTjFkG.js} +1 -1
  81. package/dist/{nodes-cli-t3azniiS.js → nodes-cli-DUD8_q_Q.js} +3 -3
  82. package/dist/{nodes-cli-DE60dv81.js → nodes-cli-Dv0NXhCO.js} +3 -3
  83. package/dist/{onboard-UB4D1vwP.js → onboard-CvpyaUQd.js} +3 -3
  84. package/dist/{onboard-BJ9vVhFw.js → onboard-EL8foMiP.js} +3 -3
  85. package/dist/{onboard-channels-Cfc9EhLj.js → onboard-channels-BRoSUijQ.js} +1 -1
  86. package/dist/{onboard-channels-Gfgyvx9N.js → onboard-channels-Bupbm6zh.js} +1 -1
  87. package/dist/{onboard-helpers-B7jBYbCU.js → onboard-helpers-CBxazphs.js} +1 -1
  88. package/dist/{onboard-helpers-DjlGq6iG.js → onboard-helpers-DWDNKmkJ.js} +1 -1
  89. package/dist/{onboard-remote-D7wGqONm.js → onboard-remote-DoIKLWXA.js} +1 -1
  90. package/dist/{onboard-remote-CXuHbtrT.js → onboard-remote-cZrkePlK.js} +1 -1
  91. package/dist/{onboard-skills-ChQnpMi-.js → onboard-skills-BjGYTueQ.js} +1 -1
  92. package/dist/{onboard-skills-BDhqz3te.js → onboard-skills-zauvnEui.js} +1 -1
  93. package/dist/{onboarding-BfSg5GnT.js → onboarding-Ch8WSJ3j.js} +7 -7
  94. package/dist/{onboarding-Bv89FLSZ.js → onboarding-Dg5ydWSh.js} +7 -7
  95. package/dist/{onboarding.finalize-DMJTZPb_.js → onboarding.finalize-Bo8-8TtH.js} +11 -11
  96. package/dist/{onboarding.finalize-B8MFYp8E.js → onboarding.finalize-CCTaCp2s.js} +12 -12
  97. package/dist/{onboarding.gateway-config-Cm5jIfRz.js → onboarding.gateway-config-Dg12RcXA.js} +3 -3
  98. package/dist/{onboarding.gateway-config-wAyLcGRu.js → onboarding.gateway-config-uIRsaxMy.js} +3 -3
  99. package/dist/{pi-embedded-CzKPTG9K.js → pi-embedded-Bl3YkBkI.js} +185 -35
  100. package/dist/{pi-embedded-helpers-P13adotN.js → pi-embedded-helpers-D1_Sab0M.js} +4 -4
  101. package/dist/{plugin-registry-CQAtbgft.js → plugin-registry-BVYZLxmo.js} +1 -1
  102. package/dist/{plugin-registry-R7nyNT_4.js → plugin-registry-Bn9Mj8mP.js} +1 -1
  103. package/dist/plugin-sdk/agents/pi-tools.read-edit-guard.d.ts +5 -0
  104. package/dist/plugin-sdk/agents/pi-tools.read-edit-tracker.d.ts +26 -0
  105. package/dist/plugin-sdk/{channel-web-D1qaoERA.js → channel-web-BhqGIC7q.js} +1 -1
  106. package/dist/plugin-sdk/gateway/protocol/index.d.ts +9 -3
  107. package/dist/plugin-sdk/gateway/protocol/schema/sessions.d.ts +39 -0
  108. package/dist/plugin-sdk/gateway/protocol/schema/types.d.ts +3 -1
  109. package/dist/plugin-sdk/index.js +3 -3
  110. package/dist/plugin-sdk/{manager-CVuMChKq.js → manager-DdOb0Em2.js} +1 -1
  111. package/dist/plugin-sdk/{reply-LZax-i7K.js → reply-Cjjf4VYT.js} +185 -35
  112. package/dist/plugin-sdk/{synthesis-DnknLqQP.js → synthesis-CZ8BYNXP.js} +2 -2
  113. package/dist/plugin-sdk/{web-DGGSyBgc.js → web-B8upqMUo.js} +3 -3
  114. package/dist/{plugins-cli-DGWVBlc8.js → plugins-cli-3h1N5N8n.js} +7 -7
  115. package/dist/{plugins-cli-CyaM2yPX.js → plugins-cli-CYOQh2DM.js} +7 -7
  116. package/dist/{program-2jsiC85C.js → program-D3_xE9BL.js} +12 -12
  117. package/dist/{program-context-DQg-ZH6A.js → program-context-COwsYCbf.js} +30 -30
  118. package/dist/{prompt-select-styled-CQJkA--o.js → prompt-select-styled-D88AWCeM.js} +8 -8
  119. package/dist/{prompt-select-styled-Csj7D4id.js → prompt-select-styled-rKPBDv7n.js} +8 -8
  120. package/dist/{provider-auth-helpers-DSq3qfws.js → provider-auth-helpers-CyZyVx-V.js} +1 -1
  121. package/dist/{provider-auth-helpers-C1rUolDI.js → provider-auth-helpers-rff7s_gC.js} +1 -1
  122. package/dist/{push-apns-Dv3XQClG.js → push-apns-BNzgqUl3.js} +1 -1
  123. package/dist/{push-apns-FvyXV3Um.js → push-apns-d9qKGKPe.js} +1 -1
  124. package/dist/{pw-ai-CeWN4iD9.js → pw-ai-DWkC5eGA.js} +1 -1
  125. package/dist/{register.agent-DCIdzwFG.js → register.agent-BjaqQA02.js} +10 -10
  126. package/dist/{register.agent-Cs5QU2Cd.js → register.agent-D_MON8p-.js} +11 -11
  127. package/dist/{register.configure-C64fHXoT.js → register.configure-BWkkQhpH.js} +13 -13
  128. package/dist/{register.configure-BBKyd--9.js → register.configure-UJi9sfNv.js} +13 -13
  129. package/dist/{register.maintenance-D99fy4mM.js → register.maintenance-ChskcWGz.js} +13 -13
  130. package/dist/{register.maintenance-DRUMeCun.js → register.maintenance-DJptz3DR.js} +12 -12
  131. package/dist/{register.message-CelO3y3f.js → register.message-BDTsiyrW.js} +7 -7
  132. package/dist/{register.message-BL30Nofx.js → register.message-CiadI_oS.js} +7 -7
  133. package/dist/{register.onboard-Cb9K2U81.js → register.onboard-BflOE1jy.js} +9 -9
  134. package/dist/{register.onboard-j6fg7rSF.js → register.onboard-KR_-4TLY.js} +9 -9
  135. package/dist/{register.setup-BfbJZE5C.js → register.setup-Cl0sD25T.js} +9 -9
  136. package/dist/{register.setup-xyGsh3Fi.js → register.setup-W-oNfOp0.js} +9 -9
  137. package/dist/{register.status-health-sessions-CpnBFwbx.js → register.status-health-sessions-CCQs235z.js} +9 -9
  138. package/dist/{register.status-health-sessions-BE4TcJ1J.js → register.status-health-sessions-CT_SmmOH.js} +9 -9
  139. package/dist/{register.subclis-8cGjLTmN.js → register.subclis-ByZAz4st.js} +20 -20
  140. package/dist/{reply-CaGCmutq.js → reply-CgyjcoxC.js} +151 -37
  141. package/dist/{rpc-St4eAsjR.js → rpc-BKlQ97aZ.js} +1 -1
  142. package/dist/{rpc-C3ZUAjXK.js → rpc-DC4ol5Xa.js} +1 -1
  143. package/dist/{run-main-BzZuJeMa.js → run-main-xmWpjZL9.js} +20 -20
  144. package/dist/{runner-D633VT13.js → runner-ecX1WzDt.js} +1 -1
  145. package/dist/{security-cli-BSvxNP9m.js → security-cli-BfiJ3e0Y.js} +3 -3
  146. package/dist/{security-cli-B8gavsuQ.js → security-cli-CIB7kqEk.js} +3 -3
  147. package/dist/{server-methods-DEV38b_O.js → server-methods-CBn954AO.js} +73 -12
  148. package/dist/{server-methods-BKlZejQC.js → server-methods-DDpCXuOU.js} +73 -12
  149. package/dist/{server-node-events-3FL5gBKp.js → server-node-events-BBEMSKVE.js} +7 -7
  150. package/dist/{server-node-events-BX5JLPyV.js → server-node-events-BUEZ3py9.js} +7 -7
  151. package/dist/{status-h7VP4Vpq.js → status-BjMiGq0n.js} +1 -1
  152. package/dist/{status-zNfi0s3F.js → status-CG5iHUJ6.js} +6 -6
  153. package/dist/{status-uBCH1pzQ.js → status-CpvzoCOC.js} +1 -1
  154. package/dist/{status-L76LBY6B.js → status-PfvX-BjO.js} +6 -6
  155. package/dist/{subagent-registry-DlIPWOrx.js → subagent-registry-D0IYimMO.js} +151 -37
  156. package/dist/{synthesis-1XabTYcd.js → synthesis-BVZ5RJLg.js} +6 -6
  157. package/dist/{synthesis-D1xCmGZi.js → synthesis-CBwKBuLy.js} +7 -7
  158. package/dist/{synthesis-BfB-Lbjy.js → synthesis-D55QrjAJ.js} +6 -6
  159. package/dist/{synthesis-D3EObLPS.js → synthesis-itgrzpuj.js} +2 -2
  160. package/dist/{system-cli-BN9MXNk7.js → system-cli-BERSpUjO.js} +3 -3
  161. package/dist/{system-cli-CD5latLh.js → system-cli-C61hzNPk.js} +3 -3
  162. package/dist/{tui-DLkE0D7e.js → tui-CI_zqapL.js} +2 -2
  163. package/dist/{tui-Cu4TZK3I.js → tui-Dg_cvgVP.js} +2 -2
  164. package/dist/{tui-cli-DC9Bq-N_.js → tui-cli-BD1cbShC.js} +3 -3
  165. package/dist/{tui-cli-BfuEq3Q-.js → tui-cli-DtBW_VCL.js} +3 -3
  166. package/dist/{unified-runner-KFxqPxWe.js → unified-runner-BhnvjB1J.js} +199 -49
  167. package/dist/{update-cli-CwtAWyeY.js → update-cli-CL1_LPBS.js} +14 -14
  168. package/dist/{update-cli-bTfRfI4b.js → update-cli-D3K4mhrr.js} +13 -13
  169. package/dist/{update-runner-DeT8NIX6.js → update-runner-Bmq67eos.js} +1 -1
  170. package/dist/{update-runner-BixvbAbN.js → update-runner-DMucmRlv.js} +1 -1
  171. package/dist/{web-CO0AUYgu.js → web-B0lZdBBl.js} +6 -6
  172. package/dist/{web-Bwrtjkmy.js → web-C1HPdY_D.js} +2 -2
  173. package/dist/{web-YSRcfzpP.js → web-DCO_YCRw.js} +7 -7
  174. package/dist/{web-N4FG6nyF.js → web-DmgQtLx3.js} +7 -7
  175. package/extensions/bluebubbles/package.json +1 -1
  176. package/extensions/copilot-proxy/package.json +1 -1
  177. package/extensions/diagnostics-otel/package.json +1 -1
  178. package/extensions/discord/package.json +1 -1
  179. package/extensions/feishu/package.json +1 -1
  180. package/extensions/google-antigravity-auth/package.json +1 -1
  181. package/extensions/google-gemini-cli-auth/package.json +1 -1
  182. package/extensions/googlechat/package.json +1 -1
  183. package/extensions/imessage/package.json +1 -1
  184. package/extensions/irc/package.json +1 -1
  185. package/extensions/learning-loop/package.json +1 -1
  186. package/extensions/line/package.json +1 -1
  187. package/extensions/llm-task/package.json +1 -1
  188. package/extensions/matrix/CHANGELOG.md +12 -0
  189. package/extensions/matrix/package.json +1 -1
  190. package/extensions/mattermost/package.json +1 -1
  191. package/extensions/memory-core/package.json +1 -1
  192. package/extensions/memory-lancedb/package.json +1 -1
  193. package/extensions/minimax-portal-auth/package.json +1 -1
  194. package/extensions/msteams/CHANGELOG.md +12 -0
  195. package/extensions/msteams/package.json +1 -1
  196. package/extensions/nextcloud-talk/package.json +1 -1
  197. package/extensions/nostr/CHANGELOG.md +12 -0
  198. package/extensions/nostr/package.json +1 -1
  199. package/extensions/open-prose/package.json +1 -1
  200. package/extensions/outlook/package.json +1 -1
  201. package/extensions/pipeline/package.json +1 -1
  202. package/extensions/signal/package.json +1 -1
  203. package/extensions/slack/package.json +1 -1
  204. package/extensions/telegram/package.json +1 -1
  205. package/extensions/tlon/package.json +1 -1
  206. package/extensions/twitch/CHANGELOG.md +12 -0
  207. package/extensions/twitch/package.json +1 -1
  208. package/extensions/voice-call/CHANGELOG.md +12 -0
  209. package/extensions/voice-call/package.json +1 -1
  210. package/extensions/whatsapp/package.json +1 -1
  211. package/extensions/zalo/CHANGELOG.md +12 -0
  212. package/extensions/zalo/package.json +1 -1
  213. package/extensions/zalouser/CHANGELOG.md +12 -0
  214. package/extensions/zalouser/package.json +1 -1
  215. package/package.json +1 -1
@@ -41,7 +41,7 @@ const entries = [
41
41
  description: "Agent Control Protocol tools",
42
42
  hasSubcommands: true,
43
43
  register: async (program) => {
44
- (await import("./acp-cli-D1JYg9c1.js")).registerAcpCli(program);
44
+ (await import("./acp-cli-Bav1bRj2.js")).registerAcpCli(program);
45
45
  }
46
46
  },
47
47
  {
@@ -49,7 +49,7 @@ const entries = [
49
49
  description: "Run, inspect, and query the WebSocket Gateway",
50
50
  hasSubcommands: true,
51
51
  register: async (program) => {
52
- (await import("./gateway-cli-DGMuMxMT.js")).registerGatewayCli(program);
52
+ (await import("./gateway-cli-Bnh42-56.js")).registerGatewayCli(program);
53
53
  }
54
54
  },
55
55
  {
@@ -57,7 +57,7 @@ const entries = [
57
57
  description: "Gateway service (legacy alias)",
58
58
  hasSubcommands: true,
59
59
  register: async (program) => {
60
- (await import("./daemon-cli-CweMes2K.js").then((n) => n.t)).registerDaemonCli(program);
60
+ (await import("./daemon-cli-BFoJGCHZ.js").then((n) => n.t)).registerDaemonCli(program);
61
61
  }
62
62
  },
63
63
  {
@@ -65,7 +65,7 @@ const entries = [
65
65
  description: "Tail gateway file logs via RPC",
66
66
  hasSubcommands: false,
67
67
  register: async (program) => {
68
- (await import("./logs-cli-1hn28HCu.js")).registerLogsCli(program);
68
+ (await import("./logs-cli-N5jQvJTm.js")).registerLogsCli(program);
69
69
  }
70
70
  },
71
71
  {
@@ -73,7 +73,7 @@ const entries = [
73
73
  description: "System events, heartbeat, and presence",
74
74
  hasSubcommands: true,
75
75
  register: async (program) => {
76
- (await import("./system-cli-BN9MXNk7.js")).registerSystemCli(program);
76
+ (await import("./system-cli-BERSpUjO.js")).registerSystemCli(program);
77
77
  }
78
78
  },
79
79
  {
@@ -81,7 +81,7 @@ const entries = [
81
81
  description: "Discover, scan, and configure models",
82
82
  hasSubcommands: true,
83
83
  register: async (program) => {
84
- (await import("./models-cli-CXW-3Zot.js")).registerModelsCli(program);
84
+ (await import("./models-cli-Cy6H1sFq.js")).registerModelsCli(program);
85
85
  }
86
86
  },
87
87
  {
@@ -89,7 +89,7 @@ const entries = [
89
89
  description: "Manage exec approvals (gateway or node host)",
90
90
  hasSubcommands: true,
91
91
  register: async (program) => {
92
- (await import("./exec-approvals-cli-CTEn_Eu_.js")).registerExecApprovalsCli(program);
92
+ (await import("./exec-approvals-cli-CKRDAo17.js")).registerExecApprovalsCli(program);
93
93
  }
94
94
  },
95
95
  {
@@ -97,7 +97,7 @@ const entries = [
97
97
  description: "Manage gateway-owned node pairing and node commands",
98
98
  hasSubcommands: true,
99
99
  register: async (program) => {
100
- (await import("./nodes-cli-DE60dv81.js")).registerNodesCli(program);
100
+ (await import("./nodes-cli-Dv0NXhCO.js")).registerNodesCli(program);
101
101
  }
102
102
  },
103
103
  {
@@ -105,7 +105,7 @@ const entries = [
105
105
  description: "Device pairing + token management",
106
106
  hasSubcommands: true,
107
107
  register: async (program) => {
108
- (await import("./devices-cli-DeoPyzAd.js")).registerDevicesCli(program);
108
+ (await import("./devices-cli-BXc6DPkC.js")).registerDevicesCli(program);
109
109
  }
110
110
  },
111
111
  {
@@ -113,7 +113,7 @@ const entries = [
113
113
  description: "Run and manage the headless node host service",
114
114
  hasSubcommands: true,
115
115
  register: async (program) => {
116
- (await import("./node-cli-BBN6PoOG.js")).registerNodeCli(program);
116
+ (await import("./node-cli-BD4E-Y8a.js")).registerNodeCli(program);
117
117
  }
118
118
  },
119
119
  {
@@ -129,7 +129,7 @@ const entries = [
129
129
  description: "Open a terminal UI connected to the Gateway",
130
130
  hasSubcommands: false,
131
131
  register: async (program) => {
132
- (await import("./tui-cli-DC9Bq-N_.js")).registerTuiCli(program);
132
+ (await import("./tui-cli-BD1cbShC.js")).registerTuiCli(program);
133
133
  }
134
134
  },
135
135
  {
@@ -137,7 +137,7 @@ const entries = [
137
137
  description: "Manage cron jobs via the Gateway scheduler",
138
138
  hasSubcommands: true,
139
139
  register: async (program) => {
140
- (await import("./cron-cli-Dq2FEfK1.js")).registerCronCli(program);
140
+ (await import("./cron-cli-BEdmHCWZ.js")).registerCronCli(program);
141
141
  }
142
142
  },
143
143
  {
@@ -161,7 +161,7 @@ const entries = [
161
161
  description: "Manage internal agent hooks",
162
162
  hasSubcommands: true,
163
163
  register: async (program) => {
164
- (await import("./hooks-cli-Dm2SU8AY.js")).registerHooksCli(program);
164
+ (await import("./hooks-cli-CTcHtm_0.js")).registerHooksCli(program);
165
165
  }
166
166
  },
167
167
  {
@@ -185,7 +185,7 @@ const entries = [
185
185
  description: "Secure DM pairing (approve inbound requests)",
186
186
  hasSubcommands: true,
187
187
  register: async (program) => {
188
- const { registerPluginCliCommands } = await import("./cli-RIwsXnB-.js");
188
+ const { registerPluginCliCommands } = await import("./cli-BX54CAM7.js");
189
189
  registerPluginCliCommands(program, await loadConfig());
190
190
  (await import("./pairing-cli-7X1qlhzF.js")).registerPairingCli(program);
191
191
  }
@@ -195,8 +195,8 @@ const entries = [
195
195
  description: "Manage Symi plugins and extensions",
196
196
  hasSubcommands: true,
197
197
  register: async (program) => {
198
- (await import("./plugins-cli-DGWVBlc8.js")).registerPluginsCli(program);
199
- const { registerPluginCliCommands } = await import("./cli-RIwsXnB-.js");
198
+ (await import("./plugins-cli-3h1N5N8n.js")).registerPluginsCli(program);
199
+ const { registerPluginCliCommands } = await import("./cli-BX54CAM7.js");
200
200
  registerPluginCliCommands(program, await loadConfig());
201
201
  }
202
202
  },
@@ -205,7 +205,7 @@ const entries = [
205
205
  description: "Manage connected chat channels (Telegram, Discord, etc.)",
206
206
  hasSubcommands: true,
207
207
  register: async (program) => {
208
- (await import("./channels-cli-Bn6mTlYq.js")).registerChannelsCli(program);
208
+ (await import("./channels-cli-h3GnmmM9.js")).registerChannelsCli(program);
209
209
  }
210
210
  },
211
211
  {
@@ -221,7 +221,7 @@ const entries = [
221
221
  description: "Security tools and local config audits",
222
222
  hasSubcommands: true,
223
223
  register: async (program) => {
224
- (await import("./security-cli-B8gavsuQ.js")).registerSecurityCli(program);
224
+ (await import("./security-cli-CIB7kqEk.js")).registerSecurityCli(program);
225
225
  }
226
226
  },
227
227
  {
@@ -237,7 +237,7 @@ const entries = [
237
237
  description: "Update Symi and inspect update channel status",
238
238
  hasSubcommands: true,
239
239
  register: async (program) => {
240
- (await import("./update-cli-CwtAWyeY.js")).registerUpdateCli(program);
240
+ (await import("./update-cli-CL1_LPBS.js")).registerUpdateCli(program);
241
241
  }
242
242
  },
243
243
  {
@@ -245,7 +245,7 @@ const entries = [
245
245
  description: "Generate shell completion script",
246
246
  hasSubcommands: false,
247
247
  register: async (program) => {
248
- (await import("./completion-cli-BVG9ZtBG.js").then((n) => n.n)).registerCompletionCli(program);
248
+ (await import("./completion-cli-BYXofVqv.js").then((n) => n.n)).registerCompletionCli(program);
249
249
  }
250
250
  }
251
251
  ];
@@ -60,8 +60,8 @@ import { r as getDiagnosticSessionState } from "./diagnostic-session-state-CUslJ
60
60
  import { A as hasBotMention, B as resolveSenderAllowMatch, C as buildTelegramGroupPeerId, D as describeReplyTarget, E as buildTypingThreadParams, F as resolveTelegramReplyId, G as toLocationContext, H as isSenderIdAllowed, I as resolveTelegramStreamMode, J as parseTelegramTarget, K as withTelegramApiErrorLogging, L as resolveTelegramThreadSpec, M as resolveTelegramForumThreadId, N as resolveTelegramGroupAllowFromContext, O as expandTextLinks, P as resolveTelegramMediaPlaceholder, R as isSenderAllowed$1, S as buildTelegramGroupFrom, T as buildTelegramThreadParams, U as mergeAllowFromSources, V as firstDefined$1, W as formatLocationText, Y as resolveTelegramTargetChatType, _ as resolveTelegramFetch, a as reactMessageTelegram, b as buildSenderLabel, c as sendStickerTelegram, d as wasSentByBot, f as isRecoverableTelegramNetworkError, g as wrapFileReferencesInHtml, h as renderTelegramHtmlText, i as editMessageTelegram, j as normalizeForwardedContext, k as extractTelegramLocation, m as markdownToTelegramHtml, n as createForumTopicTelegram, o as sendMessageTelegram, p as markdownToTelegramChunks, q as isVoiceCompatibleAudio, r as deleteMessageTelegram, s as sendPollTelegram, t as buildInlineKeyboard, u as resolveTelegramVoiceSend, v as splitTelegramCaption, w as buildTelegramParentPeer, x as buildSenderName, y as buildGroupLabel, z as normalizeAllowFromWithStore$1 } from "./send-DpMnSIi5.js";
61
61
  import { a as buildModelAliasLines, n as resolveModel } from "./model-ECsJuJew.js";
62
62
  import { a as resolveAgentIdentity, i as resolveAckReaction, o as resolveEffectiveMessagesConfig, r as resolveResponsePrefixTemplate, s as resolveHumanDelayConfig, t as createReplyPrefixOptions } from "./reply-prefix-CE2YmmsD.js";
63
- import { i as resolveMemoryBackendConfig, n as registerMemoryCli, r as getMemorySearchManager } from "./memory-cli-BOxWccJu.js";
64
- import { a as resolveMemorySearchConfig, t as MemoryIndexManager } from "./manager-BOvfAdfG.js";
63
+ import { i as resolveMemoryBackendConfig, n as registerMemoryCli, r as getMemorySearchManager } from "./memory-cli-BTByRgM0.js";
64
+ import { a as resolveMemorySearchConfig, t as MemoryIndexManager } from "./manager-9Mni2AA9.js";
65
65
  import { n as retryAsync } from "./retry-BoS4e4X_.js";
66
66
  import { c as imageResultFromFile, d as readNumberParam, f as readReactionParams, h as readStringParam, l as jsonResult, m as readStringOrNumberParam, n as missingTargetError, o as createActionGate, p as readStringArrayParam, r as unknownTargetError, s as imageResult, t as ambiguousTargetError, u as parseAvailableTags } from "./target-errors-C9e6dMU_.js";
67
67
  import { a as chunkText, c as resolveChunkMode, d as isSafeFenceBreak, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, o as chunkTextWithMode, r as chunkMarkdownText, t as chunkByNewline, u as findFenceSpanAt } from "./chunk-DIi9uyC6.js";
@@ -69,8 +69,8 @@ import { n as resolveMarkdownTableMode } from "./markdown-tables-kCfKPOgH.js";
69
69
  import { a as loadWebMedia, i as getDefaultLocalRoots } from "./ir-jTXFdH5R.js";
70
70
  import { a as resolveNativeSkillsEnabled, i as resolveNativeCommandsEnabled, n as isNativeCommandsExplicitlyDisabled, r as isRestartEnabled, t as isCommandFlagEnabled } from "./commands-vWB85AXk.js";
71
71
  import { a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, i as listChatCommands, l as parseCommandArgs, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices } from "./commands-registry-D_uByLpw.js";
72
- import { Lt as SESSION_LABEL_MAX_LENGTH, t as GatewayClient } from "./client-CYsBIR3j.js";
73
- import { a as randomIdempotencyKey, d as resolveLeastPrivilegeOperatorScopesForMethod, n as callGateway, r as callGatewayLeastPrivilege, t as buildGatewayConnectionDetails } from "./call-BkJK3eYP.js";
72
+ import { Rt as SESSION_LABEL_MAX_LENGTH, t as GatewayClient } from "./client-pd8kwOFJ.js";
73
+ import { a as randomIdempotencyKey, d as resolveLeastPrivilegeOperatorScopesForMethod, n as callGateway, r as callGatewayLeastPrivilege, t as buildGatewayConnectionDetails } from "./call-DYfKEdwh.js";
74
74
  import { n as formatTimeAgo } from "./format-relative-CviDPm2s.js";
75
75
  import { n as normalizePollInput } from "./polls-DZoQqmds.js";
76
76
  import { n as recordChannelActivity, r as createDiscordRetryRunner, t as getChannelActivity } from "./channel-activity-CoTZV03i.js";
@@ -86,7 +86,7 @@ import { b as ensureSkillsWatcher, i as resolveSkillCommandInvocation, n as list
86
86
  import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-C87_fedd.js";
87
87
  import { c as hasNonzeroUsage, l as normalizeUsage, n as loadCostUsageSummary, o as derivePromptTokens, r as loadSessionCostSummary, s as deriveSessionTotalTokens } from "./session-cost-usage-RPrhIvZF.js";
88
88
  import { a as normalizeIMessageHandle, c as DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS, i as isAllowedIMessageSender, o as parseIMessageTarget, r as formatIMessageChatTarget, s as createIMessageRpcClient, t as sendMessageIMessage } from "./send-SF7x1UHb.js";
89
- import { r as detectBinary } from "./onboard-helpers-B7jBYbCU.js";
89
+ import { r as detectBinary } from "./onboard-helpers-CBxazphs.js";
90
90
  import { t as resolvePairingIdLabel } from "./pairing-labels-CTL1gXZb.js";
91
91
  import { i as resolveModelCostConfig, n as formatTokenCount$2, r as formatUsd, t as estimateUsageCost } from "./usage-format-D4P4IiJ6.js";
92
92
  import { t as getActiveWebListener } from "./active-listener-Cif6x8mY.js";
@@ -9782,16 +9782,16 @@ function shouldComputeCommandAuthorized(text, cfg, options) {
9782
9782
 
9783
9783
  //#endregion
9784
9784
  //#region src/channels/sender-label.ts
9785
- function normalize(value) {
9785
+ function normalize$1(value) {
9786
9786
  const trimmed = value?.trim();
9787
9787
  return trimmed ? trimmed : void 0;
9788
9788
  }
9789
9789
  function resolveSenderLabel(params) {
9790
- const name = normalize(params.name);
9791
- const username = normalize(params.username);
9792
- const tag = normalize(params.tag);
9793
- const e164 = normalize(params.e164);
9794
- const id = normalize(params.id);
9790
+ const name = normalize$1(params.name);
9791
+ const username = normalize$1(params.username);
9792
+ const tag = normalize$1(params.tag);
9793
+ const e164 = normalize$1(params.e164);
9794
+ const id = normalize$1(params.id);
9795
9795
  const display = name ?? username ?? tag ?? "";
9796
9796
  const idPart = e164 ?? id ?? "";
9797
9797
  if (display && idPart && display !== idPart) return `${display} (${idPart})`;
@@ -31935,7 +31935,7 @@ async function runAgentTurn(params) {
31935
31935
  function createDefaultDeps() {
31936
31936
  return {
31937
31937
  sendMessageWhatsApp: async (...args) => {
31938
- const { sendMessageWhatsApp } = await import("./web-N4FG6nyF.js");
31938
+ const { sendMessageWhatsApp } = await import("./web-DmgQtLx3.js");
31939
31939
  return await sendMessageWhatsApp(...args);
31940
31940
  },
31941
31941
  sendMessageTelegram: async (...args) => {
@@ -50366,7 +50366,7 @@ function loadWebLoginQr() {
50366
50366
  return webLoginQrPromise;
50367
50367
  }
50368
50368
  function loadWebChannel() {
50369
- webChannelPromise ??= import("./web-N4FG6nyF.js");
50369
+ webChannelPromise ??= import("./web-DmgQtLx3.js");
50370
50370
  return webChannelPromise;
50371
50371
  }
50372
50372
  function loadWhatsAppActions() {
@@ -54060,6 +54060,91 @@ function wrapToolWithAbortSignal(tool, abortSignal) {
54060
54060
  };
54061
54061
  }
54062
54062
 
54063
+ //#endregion
54064
+ //#region src/agents/pi-tools.read-edit-guard.ts
54065
+ const RETRY_GUIDANCE_SUFFIX$1 = " Read the file first, then retry the edit.";
54066
+ function readGuardError(filePath) {
54067
+ return /* @__PURE__ */ new Error(`Edit refused: '${filePath}' has not been read in this session. The edit tool requires the agent to read the file first so oldText can match real content rather than hallucinated content.${RETRY_GUIDANCE_SUFFIX$1}`);
54068
+ }
54069
+ function extractPath(args) {
54070
+ if (!args || typeof args !== "object") return;
54071
+ const record = args;
54072
+ const candidate = record.path ?? record.file_path;
54073
+ if (typeof candidate !== "string") return;
54074
+ const trimmed = candidate.trim();
54075
+ return trimmed.length > 0 ? trimmed : void 0;
54076
+ }
54077
+ function wrapReadToolWithTracker(tool, tracker) {
54078
+ return {
54079
+ ...tool,
54080
+ execute: async (toolCallId, args, signal, onUpdate) => {
54081
+ const result = await tool.execute(toolCallId, args, signal, onUpdate);
54082
+ if (!(!!result && typeof result === "object" && result.isError === true)) {
54083
+ const filePath = extractPath(args);
54084
+ if (filePath) tracker.recordRead(filePath);
54085
+ }
54086
+ return result;
54087
+ }
54088
+ };
54089
+ }
54090
+ function wrapWriteToolWithTracker(tool, tracker) {
54091
+ return {
54092
+ ...tool,
54093
+ execute: async (toolCallId, args, signal, onUpdate) => {
54094
+ const result = await tool.execute(toolCallId, args, signal, onUpdate);
54095
+ if (!(!!result && typeof result === "object" && result.isError === true)) {
54096
+ const filePath = extractPath(args);
54097
+ if (filePath) tracker.recordWrite(filePath);
54098
+ }
54099
+ return result;
54100
+ }
54101
+ };
54102
+ }
54103
+ function wrapEditToolWithGuard(tool, tracker) {
54104
+ return {
54105
+ ...tool,
54106
+ execute: async (toolCallId, args, signal, onUpdate) => {
54107
+ const filePath = extractPath(args);
54108
+ if (filePath && !tracker.hasObserved(filePath)) throw readGuardError(filePath);
54109
+ return tool.execute(toolCallId, args, signal, onUpdate);
54110
+ }
54111
+ };
54112
+ }
54113
+
54114
+ //#endregion
54115
+ //#region src/agents/pi-tools.read-edit-tracker.ts
54116
+ function normalize(filePath, workspaceRoot) {
54117
+ if (!workspaceRoot) return filePath;
54118
+ if (path.isAbsolute(filePath)) return path.normalize(filePath);
54119
+ return path.resolve(workspaceRoot, filePath);
54120
+ }
54121
+ function createReadEditTracker(opts = {}) {
54122
+ const observed = /* @__PURE__ */ new Map();
54123
+ const record = (filePath, kind) => {
54124
+ if (typeof filePath !== "string" || !filePath.trim()) return;
54125
+ const key = normalize(filePath.trim(), opts.workspaceRoot);
54126
+ const prior = observed.get(key);
54127
+ if (kind === "written" || prior !== "written") observed.set(key, kind);
54128
+ };
54129
+ return {
54130
+ recordRead: (filePath) => record(filePath, "read"),
54131
+ recordWrite: (filePath) => record(filePath, "written"),
54132
+ observation: (filePath) => {
54133
+ if (typeof filePath !== "string" || !filePath.trim()) return null;
54134
+ const key = normalize(filePath.trim(), opts.workspaceRoot);
54135
+ return observed.get(key) ?? null;
54136
+ },
54137
+ hasObserved: (filePath) => {
54138
+ if (typeof filePath !== "string" || !filePath.trim()) return false;
54139
+ const key = normalize(filePath.trim(), opts.workspaceRoot);
54140
+ return observed.has(key);
54141
+ },
54142
+ reset: () => {
54143
+ observed.clear();
54144
+ }
54145
+ };
54146
+ }
54147
+
54063
54148
  //#endregion
54064
54149
  //#region src/media/sniff-mime-from-base64.ts
54065
54150
  async function sniffMimeFromBase64(base64) {
@@ -56961,8 +57046,39 @@ const GatewayToolSchema = Type.Object({
56961
57046
  baseHash: Type.Optional(Type.String()),
56962
57047
  sessionKey: Type.Optional(Type.String()),
56963
57048
  note: Type.Optional(Type.String()),
56964
- restartDelayMs: Type.Optional(Type.Number())
57049
+ restartDelayMs: Type.Optional(Type.Number()),
57050
+ userRequestAcknowledgment: Type.Optional(Type.String())
56965
57051
  });
57052
+ /** Actions that mutate gateway state and require explicit user authorization. */
57053
+ const DESTRUCTIVE_ACTIONS = new Set([
57054
+ "config.apply",
57055
+ "config.patch",
57056
+ "update.run"
57057
+ ]);
57058
+ /** Minimum length for a meaningful authorization message. */
57059
+ const MIN_AUTHORIZATION_LENGTH = 10;
57060
+ /**
57061
+ * Asserts the user's request was explicitly acknowledged for destructive
57062
+ * actions. Throws a descriptive error if the acknowledgment is missing,
57063
+ * empty, or trivially short.
57064
+ *
57065
+ * NOTE: This is defense-in-depth, not a hard barrier. A determined model
57066
+ * could still populate the field with fabricated text. The barrier exists
57067
+ * to:
57068
+ * 1. Force the agent to deliberately compose a justification (vs. blind
57069
+ * tool invocation).
57070
+ * 2. Provide an audit trail (the acknowledgment is logged with the tool
57071
+ * call args).
57072
+ * 3. Surface for future tightening (e.g., matching against real session
57073
+ * history).
57074
+ */
57075
+ function assertUserAuthorization(action, params) {
57076
+ if (!DESTRUCTIVE_ACTIONS.has(action)) return;
57077
+ const ack = params.userRequestAcknowledgment;
57078
+ const trimmed = typeof ack === "string" ? ack.trim() : "";
57079
+ if (!trimmed) throw new Error(`Action '${action}' requires an explicit user authorization. Pass userRequestAcknowledgment with a paraphrase of the user's request (e.g., "user said: please update Symi"). If the user did not explicitly request this action, ask them first instead of invoking it.`);
57080
+ if (trimmed.length < MIN_AUTHORIZATION_LENGTH) throw new Error(`Action '${action}' requires a substantive userRequestAcknowledgment (minimum ${MIN_AUTHORIZATION_LENGTH} characters describing the user's request). Received: ${JSON.stringify(trimmed)}.`);
57081
+ }
56966
57082
  function createGatewayTool(opts) {
56967
57083
  return {
56968
57084
  label: "Gateway",
@@ -56973,6 +57089,7 @@ function createGatewayTool(opts) {
56973
57089
  execute: async (_toolCallId, args) => {
56974
57090
  const params = args;
56975
57091
  const action = readStringParam(params, "action", { required: true });
57092
+ assertUserAuthorization(action, params);
56976
57093
  if (action === "restart") {
56977
57094
  if (!isRestartEnabled(opts?.config)) throw new Error("Gateway restart is disabled (commands.restart=false).");
56978
57095
  const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim() ? params.sessionKey.trim() : opts?.agentSessionKey?.trim() || void 0;
@@ -65265,33 +65382,34 @@ function createSymiCodingTools(options) {
65265
65382
  });
65266
65383
  if (sandboxRoot && !sandboxFsBridge) throw new Error("Sandbox filesystem bridge is unavailable.");
65267
65384
  const imageSanitization = resolveImageSanitizationLimits(options?.config);
65385
+ const readEditTracker = createReadEditTracker({ workspaceRoot: sandboxRoot ?? workspaceRoot });
65268
65386
  const base = codingTools.flatMap((tool) => {
65269
65387
  if (tool.name === readTool.name) {
65270
65388
  if (sandboxRoot) {
65271
- const sandboxed = createSandboxedReadTool({
65389
+ const tracked = wrapReadToolWithTracker(createSandboxedReadTool({
65272
65390
  root: sandboxRoot,
65273
65391
  bridge: sandboxFsBridge,
65274
65392
  modelContextWindowTokens: options?.modelContextWindowTokens,
65275
65393
  imageSanitization
65276
- });
65277
- return [workspaceOnly ? wrapToolWorkspaceRootGuard(sandboxed, sandboxRoot) : sandboxed];
65394
+ }), readEditTracker);
65395
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(tracked, sandboxRoot) : tracked];
65278
65396
  }
65279
- const wrapped = createSymiReadTool(createReadTool(workspaceRoot), {
65397
+ const tracked = wrapReadToolWithTracker(createSymiReadTool(createReadTool(workspaceRoot), {
65280
65398
  modelContextWindowTokens: options?.modelContextWindowTokens,
65281
65399
  imageSanitization
65282
- });
65283
- return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
65400
+ }), readEditTracker);
65401
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(tracked, workspaceRoot) : tracked];
65284
65402
  }
65285
65403
  if (tool.name === "bash" || tool.name === execToolName) return [];
65286
65404
  if (tool.name === "write") {
65287
65405
  if (sandboxRoot) return [];
65288
- const wrapped = wrapToolParamNormalization(createWriteTool(workspaceRoot), CLAUDE_PARAM_GROUPS.write);
65289
- return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
65406
+ const tracked = wrapWriteToolWithTracker(wrapToolParamNormalization(createWriteTool(workspaceRoot), CLAUDE_PARAM_GROUPS.write), readEditTracker);
65407
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(tracked, workspaceRoot) : tracked];
65290
65408
  }
65291
65409
  if (tool.name === "edit") {
65292
65410
  if (sandboxRoot) return [];
65293
- const wrapped = wrapToolParamNormalization(createEditTool(workspaceRoot), CLAUDE_PARAM_GROUPS.edit);
65294
- return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
65411
+ const guarded = wrapEditToolWithGuard(wrapToolParamNormalization(createEditTool(workspaceRoot), CLAUDE_PARAM_GROUPS.edit), readEditTracker);
65412
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(guarded, workspaceRoot) : guarded];
65295
65413
  }
65296
65414
  return [tool];
65297
65415
  });
@@ -65334,22 +65452,18 @@ function createSymiCodingTools(options) {
65334
65452
  } : void 0,
65335
65453
  workspaceOnly: applyPatchWorkspaceOnly
65336
65454
  });
65455
+ const sandboxedEditTool = sandboxRoot ? wrapEditToolWithGuard(createSandboxedEditTool({
65456
+ root: sandboxRoot,
65457
+ bridge: sandboxFsBridge
65458
+ }), readEditTracker) : null;
65459
+ const sandboxedWriteTool = sandboxRoot ? wrapWriteToolWithTracker(createSandboxedWriteTool({
65460
+ root: sandboxRoot,
65461
+ bridge: sandboxFsBridge
65462
+ }), readEditTracker) : null;
65337
65463
  const withHooks = applyToolPolicyPipeline({
65338
65464
  tools: applyOwnerOnlyToolPolicy([
65339
65465
  ...base,
65340
- ...sandboxRoot ? allowWorkspaceWrites ? [workspaceOnly ? wrapToolWorkspaceRootGuard(createSandboxedEditTool({
65341
- root: sandboxRoot,
65342
- bridge: sandboxFsBridge
65343
- }), sandboxRoot) : createSandboxedEditTool({
65344
- root: sandboxRoot,
65345
- bridge: sandboxFsBridge
65346
- }), workspaceOnly ? wrapToolWorkspaceRootGuard(createSandboxedWriteTool({
65347
- root: sandboxRoot,
65348
- bridge: sandboxFsBridge
65349
- }), sandboxRoot) : createSandboxedWriteTool({
65350
- root: sandboxRoot,
65351
- bridge: sandboxFsBridge
65352
- })] : [] : [],
65466
+ ...sandboxRoot ? allowWorkspaceWrites && sandboxedEditTool && sandboxedWriteTool ? [workspaceOnly ? wrapToolWorkspaceRootGuard(sandboxedEditTool, sandboxRoot) : sandboxedEditTool, workspaceOnly ? wrapToolWorkspaceRootGuard(sandboxedWriteTool, sandboxRoot) : sandboxedWriteTool] : [] : [],
65353
65467
  ...applyPatchTool ? [applyPatchTool] : [],
65354
65468
  execTool,
65355
65469
  processTool,
@@ -1,5 +1,5 @@
1
1
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-aT-I_DTX.js";
2
- import { a as randomIdempotencyKey, n as callGateway } from "./call-BkJK3eYP.js";
2
+ import { a as randomIdempotencyKey, n as callGateway } from "./call-DYfKEdwh.js";
3
3
  import { n as withProgress } from "./progress-WhkkDU0H.js";
4
4
  import { n as parseNodeList, r as parsePairingList, t as resolveNodeIdFromCandidates } from "./node-match-D3rffA64.js";
5
5
 
@@ -1,4 +1,4 @@
1
- import { a as randomIdempotencyKey, n as callGateway } from "./call-CAGvQYXj.js";
1
+ import { a as randomIdempotencyKey, n as callGateway } from "./call-M4YyUnwu.js";
2
2
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-C9dERklz.js";
3
3
  import { n as parseNodeList, r as parsePairingList, t as resolveNodeIdFromCandidates } from "./node-match-DZCCI6Uk.js";
4
4
  import { n as withProgress } from "./progress-HK2tT7Yf.js";
@@ -10,11 +10,11 @@ import "./frontmatter-B8duUx_6.js";
10
10
  import "./skills-D_oCiaQn.js";
11
11
  import "./manifest-registry-D5bnO5uA.js";
12
12
  import { H as VERSION, W as loadDotEnv } from "./config-DXt3pc08.js";
13
- import "./client-Cmq13-uF.js";
14
- import "./call-CAGvQYXj.js";
13
+ import "./client-CJIMV1WD.js";
14
+ import "./call-M4YyUnwu.js";
15
15
  import "./message-channel-C9dERklz.js";
16
16
  import "./pairing-token-Byh6drgn.js";
17
- import "./subagent-registry-DlIPWOrx.js";
17
+ import "./subagent-registry-D0IYimMO.js";
18
18
  import "./sessions-BPD85pWA.js";
19
19
  import "./tokens-Csntmwwn.js";
20
20
  import "./plugins-CwSlLxM8.js";
@@ -52,8 +52,8 @@ import "./tool-images-CVLISeRT.js";
52
52
  import "./thinking-8sKPnzpp.js";
53
53
  import "./models-config-J1x_DaPn.js";
54
54
  import "./reply-prefix-BUN71nd5.js";
55
- import "./memory-cli-D2QHGsxh.js";
56
- import "./manager-DDboJTtn.js";
55
+ import "./memory-cli-OW9XfyYu.js";
56
+ import "./manager-QPF0UtOC.js";
57
57
  import "./gemini-auth-DEakvf-D.js";
58
58
  import "./retry-C4Q_VPOo.js";
59
59
  import "./sqlite-BP8tiuca.js";
@@ -94,7 +94,7 @@ import "./cli-utils-CI_KkT8q.js";
94
94
  import "./help-format-nY42tGMB.js";
95
95
  import "./progress-HK2tT7Yf.js";
96
96
  import "./replies-Sxbew659.js";
97
- import "./onboard-helpers-DjlGq6iG.js";
97
+ import "./onboard-helpers-DWDNKmkJ.js";
98
98
  import "./prompt-style-BxVdnrLq.js";
99
99
  import "./pairing-labels-BHx_CdbP.js";
100
100
  import "./pi-tools.policy-o0ytjRqu.js";
@@ -102,9 +102,9 @@ import { t as ensureSymiCliOnPath } from "./path-env-CaiY2aOj.js";
102
102
  import "./catalog-KcLvtTfa.js";
103
103
  import "./note-DewoEWtc.js";
104
104
  import "./plugin-auto-enable-pQEg2Mly.js";
105
- import { t as ensurePluginRegistryLoaded } from "./plugin-registry-R7nyNT_4.js";
105
+ import { t as ensurePluginRegistryLoaded } from "./plugin-registry-Bn9Mj8mP.js";
106
106
  import { t as assertSupportedRuntime } from "./runtime-guard-BofkqBu7.js";
107
- import { t as emitCliBanner } from "./banner-DSRsscTp.js";
107
+ import { t as emitCliBanner } from "./banner-Bf46tqiY.js";
108
108
  import "./doctor-config-flow-B2dVxbL7.js";
109
109
  import { n as ensureConfigReady } from "./config-guard-BvqCjFPk.js";
110
110
  import process$1 from "node:process";
@@ -119,7 +119,7 @@ const routeHealth = {
119
119
  const verbose = getVerboseFlag(argv, { includeDebug: true });
120
120
  const timeoutMs = getPositiveIntFlagValue(argv, "--timeout");
121
121
  if (timeoutMs === null) return false;
122
- const { healthCommand } = await import("./health-BrpUi4qW.js").then((n) => n.i);
122
+ const { healthCommand } = await import("./health-CcV5nKIK.js").then((n) => n.i);
123
123
  await healthCommand({
124
124
  json,
125
125
  timeoutMs,
@@ -139,7 +139,7 @@ const routeStatus = {
139
139
  const verbose = getVerboseFlag(argv, { includeDebug: true });
140
140
  const timeoutMs = getPositiveIntFlagValue(argv, "--timeout");
141
141
  if (timeoutMs === null) return false;
142
- const { statusCommand } = await import("./status-L76LBY6B.js").then((n) => n.t);
142
+ const { statusCommand } = await import("./status-PfvX-BjO.js").then((n) => n.t);
143
143
  await statusCommand({
144
144
  json,
145
145
  deep,
@@ -173,7 +173,7 @@ const routeAgentsList = {
173
173
  run: async (argv) => {
174
174
  const json = hasFlag(argv, "--json");
175
175
  const bindings = hasFlag(argv, "--bindings");
176
- const { agentsListCommand } = await import("./agents-D6V12K_e.js").then((n) => n.t);
176
+ const { agentsListCommand } = await import("./agents-CvNeiuSB.js").then((n) => n.t);
177
177
  await agentsListCommand({
178
178
  json,
179
179
  bindings
@@ -190,7 +190,7 @@ const routeMemoryStatus = {
190
190
  const deep = hasFlag(argv, "--deep");
191
191
  const index = hasFlag(argv, "--index");
192
192
  const verbose = hasFlag(argv, "--verbose");
193
- const { runMemoryStatus } = await import("./memory-cli-D2QHGsxh.js").then((n) => n.t);
193
+ const { runMemoryStatus } = await import("./memory-cli-OW9XfyYu.js").then((n) => n.t);
194
194
  await runMemoryStatus({
195
195
  agent,
196
196
  json,
@@ -244,7 +244,7 @@ const routes = [
244
244
  const pathArg = getCommandPositionals(argv)[2];
245
245
  if (!pathArg) return false;
246
246
  const json = hasFlag(argv, "--json");
247
- const { runConfigGet } = await import("./config-cli-zd2upqe_.js");
247
+ const { runConfigGet } = await import("./config-cli-Deoo6r2K.js");
248
248
  await runConfigGet({
249
249
  path: pathArg,
250
250
  json
@@ -257,7 +257,7 @@ const routes = [
257
257
  run: async (argv) => {
258
258
  const pathArg = getCommandPositionals(argv)[2];
259
259
  if (!pathArg) return false;
260
- const { runConfigUnset } = await import("./config-cli-zd2upqe_.js");
260
+ const { runConfigUnset } = await import("./config-cli-Deoo6r2K.js");
261
261
  await runConfigUnset({ path: pathArg });
262
262
  return true;
263
263
  }
@@ -271,7 +271,7 @@ const routes = [
271
271
  const local = hasFlag(argv, "--local");
272
272
  const json = hasFlag(argv, "--json");
273
273
  const plain = hasFlag(argv, "--plain");
274
- const { modelsListCommand } = await import("./models-Cn1cbmce.js").then((n) => n.t);
274
+ const { modelsListCommand } = await import("./models-Q1jV8ArL.js").then((n) => n.t);
275
275
  await modelsListCommand({
276
276
  all,
277
277
  local,
@@ -302,7 +302,7 @@ const routes = [
302
302
  const plain = hasFlag(argv, "--plain");
303
303
  const check = hasFlag(argv, "--check");
304
304
  const probe = hasFlag(argv, "--probe");
305
- const { modelsStatusCommand } = await import("./models-Cn1cbmce.js").then((n) => n.t);
305
+ const { modelsStatusCommand } = await import("./models-Q1jV8ArL.js").then((n) => n.t);
306
306
  await modelsStatusCommand({
307
307
  json,
308
308
  plain,
@@ -380,7 +380,7 @@ async function runCli(argv = process$1.argv) {
380
380
  assertSupportedRuntime();
381
381
  if (await tryRouteCli(normalizedArgv)) return;
382
382
  enableConsoleCapture();
383
- const { buildProgram } = await import("./program-2jsiC85C.js");
383
+ const { buildProgram } = await import("./program-D3_xE9BL.js");
384
384
  const program = buildProgram();
385
385
  installUnhandledRejectionHandler();
386
386
  process$1.on("uncaughtException", (error) => {
@@ -412,10 +412,10 @@ async function runCli(argv = process$1.argv) {
412
412
  const { getProgramContext } = await import("./program-context-DeZ44oQ9.js").then((n) => n.n);
413
413
  const ctx = getProgramContext(program);
414
414
  if (ctx) {
415
- const { registerCoreCliByName } = await import("./command-registry-BiznuVYK.js").then((n) => n.t);
415
+ const { registerCoreCliByName } = await import("./command-registry-BiRjJ2Sy.js").then((n) => n.t);
416
416
  await registerCoreCliByName(program, ctx, primary, parseArgv);
417
417
  }
418
- const { registerSubCliByName } = await import("./register.subclis-8cGjLTmN.js").then((n) => n.a);
418
+ const { registerSubCliByName } = await import("./register.subclis-ByZAz4st.js").then((n) => n.a);
419
419
  await registerSubCliByName(program, primary);
420
420
  }
421
421
  const hasBuiltinPrimary = primary !== null && program.commands.some((command) => command.name() === primary);
@@ -424,7 +424,7 @@ async function runCli(argv = process$1.argv) {
424
424
  primary,
425
425
  hasBuiltinPrimary
426
426
  })) {
427
- const { registerPluginCliCommands } = await import("./cli-RIwsXnB-.js");
427
+ const { registerPluginCliCommands } = await import("./cli-BX54CAM7.js");
428
428
  const { loadConfig } = await import("./config-DXt3pc08.js").then((n) => n.t);
429
429
  registerPluginCliCommands(program, loadConfig());
430
430
  }
@@ -4,7 +4,7 @@ import { A as normalizeGoogleModelId, B as resolveApiKeyForProvider, C as normal
4
4
  import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-BkZ9HOKT.js";
5
5
  import { c as detectMime, f as isAudioFileName, m as kindFromMime, u as getFileExtension } from "./image-ops-C7CauEK8.js";
6
6
  import { t as normalizeChatType } from "./chat-type-3FRbbjbq.js";
7
- import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-C6rCON9L.js";
7
+ import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-BuVL0jHI.js";
8
8
  import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-BefM10YB.js";
9
9
  import { n as fetchWithTimeout } from "./fetch-timeout-CVCBkyv1.js";
10
10
  import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-ClipCZ9s.js";
@@ -40,8 +40,8 @@ import "./bindings-DFaVVCsf.js";
40
40
  import "./logging-w5jq5901.js";
41
41
  import "./paths-CyhzMxFA.js";
42
42
  import "./commands-vWB85AXk.js";
43
- import "./client-CYsBIR3j.js";
44
- import "./call-BkJK3eYP.js";
43
+ import "./client-pd8kwOFJ.js";
44
+ import "./call-DYfKEdwh.js";
45
45
  import "./pairing-token-pooyuU2J.js";
46
46
  import { i as readChannelAllowFromStore } from "./pairing-store-iAT1if6k.js";
47
47
  import { t as formatDocsLink } from "./links-DGINhC21.js";
@@ -50,7 +50,7 @@ import "./workspace-dirs-DHPWGRDp.js";
50
50
  import "./pi-tools.policy-Bx5zp45n.js";
51
51
  import "./dangerous-tools-m4gs9MB5.js";
52
52
  import "./skill-scanner-BTgjeQBf.js";
53
- import { i as collectIncludePathsRecursive, n as createIcaclsResetCommand, r as formatIcaclsResetCommand, t as runSecurityAudit } from "./audit-xiwEIT96.js";
53
+ import { i as collectIncludePathsRecursive, n as createIcaclsResetCommand, r as formatIcaclsResetCommand, t as runSecurityAudit } from "./audit-C9nq99IR.js";
54
54
  import "./dm-policy-shared-KlzpDeT_.js";
55
55
  import path from "node:path";
56
56
  import fs from "node:fs/promises";