@symerian/symi 2.8.12 → 2.8.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.
Files changed (229) hide show
  1. package/dist/{accounts-BuZxOb3B.js → accounts-Bsg6r6H7.js} +1 -1
  2. package/dist/{accounts-BRw8yhIW.js → accounts-BsgY6sda.js} +21 -21
  3. package/dist/{accounts-3dCrO3oZ.js → accounts-wWWkC0JH.js} +1 -1
  4. package/dist/{active-listener-BVZOh2T1.js → active-listener-AVNn5_U9.js} +1 -1
  5. package/dist/{agent-scope-CpEJ0B88.js → agent-scope-Cpm7a9ss.js} +3 -3
  6. package/dist/{agents-OAonMxYV.js → agents-DlAvDWxz.js} +4 -4
  7. package/dist/{agents.config-BIhaDwT2.js → agents.config-BKKMbeeE.js} +1 -1
  8. package/dist/{agents.config-DGu_K5xz.js → agents.config-Dd-11klq.js} +1 -1
  9. package/dist/{audio-preflight-Cb-T0r6e.js → audio-preflight-rrz8KyHd.js} +29 -29
  10. package/dist/{audit-Bi9Je9FZ.js → audit-BhCJV2l6.js} +1 -1
  11. package/dist/{audit-Oa5dsn5p.js → audit-CB97BqHJ.js} +1 -1
  12. package/dist/{auth-choice-BvPX7B4c.js → auth-choice-C6woT6k2.js} +1 -1
  13. package/dist/{auth-choice-DDzWns1k.js → auth-choice-CRQRPwQt.js} +1 -1
  14. package/dist/{auth-profiles-C2vj6htZ.js → auth-profiles-BzB_Exeq.js} +17 -17
  15. package/dist/{banner-BFdiq-O5.js → banner-DrNha2_N.js} +1 -1
  16. package/dist/{bindings-BsHoBLIE.js → bindings-xcRox9xM.js} +2 -2
  17. package/dist/build-info.json +3 -3
  18. package/dist/bundled/boot-md/handler.js +54 -54
  19. package/dist/bundled/bootstrap-extra-files/handler.js +5 -5
  20. package/dist/bundled/command-logger/handler.js +1 -1
  21. package/dist/bundled/session-memory/handler.js +54 -54
  22. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  23. package/dist/{channel-activity-D8QD7GoV.js → channel-activity-CzHaIUAp.js} +1 -1
  24. package/dist/{channel-options-DTqUB0OP.js → channel-options-D8q9En4T.js} +1 -1
  25. package/dist/{channel-options-tfnOGSNF.js → channel-options-DYy2sCfN.js} +1 -1
  26. package/dist/{channel-web-CcUXobcu.js → channel-web-CRBU4eZk.js} +1 -1
  27. package/dist/{channels-cli-CmShA-wJ.js → channels-cli-BUk43hHR.js} +7 -7
  28. package/dist/{channels-cli-BcE5tHIr.js → channels-cli-Dk3kUw9A.js} +7 -7
  29. package/dist/{chrome-ROtrXlNs.js → chrome-DwXnykXR.js} +14 -14
  30. package/dist/{chunk-BRe1o4Af.js → chunk-BcxcL1U3.js} +1 -1
  31. package/dist/{cli-BxoD2wzk.js → cli-5gWsnsB7.js} +4 -4
  32. package/dist/{cli-CKG2iAr3.js → cli-DjZzJy3t.js} +4 -4
  33. package/dist/{command-registry-D1Le-Fmh.js → command-registry-LjFltTU9.js} +10 -10
  34. package/dist/{commands-registry-DxbSTLNQ.js → commands-registry-ByGkL6hs.js} +4 -4
  35. package/dist/{completion-cli-DgiFjSGS.js → completion-cli-BVTGy8th.js} +1 -1
  36. package/dist/{completion-cli-D9pC-ttw.js → completion-cli-Cf6fYZWL.js} +2 -2
  37. package/dist/{config-BkZ9HOKT.js → config-C4WnAd-c.js} +17 -17
  38. package/dist/{config-cli-C_uZQsTl.js → config-cli-C7DIbGxx.js} +1 -1
  39. package/dist/{config-cli-5mFA0UDP.js → config-cli-EgWrCemi.js} +1 -1
  40. package/dist/{configure-BJcy7wXm.js → configure-B67uIawm.js} +3 -3
  41. package/dist/{configure-DuRTFCuW.js → configure-Bk-snuxh.js} +3 -3
  42. package/dist/{consolidate-07QMweFF.js → consolidate-DRtVvG2U.js} +4 -4
  43. package/dist/{deliver-B0OUq6RP.js → deliver-SLYAWE19.js} +20 -20
  44. package/dist/{diagnostic-BUcR3Meg.js → diagnostic-DTkZsRNM.js} +1 -1
  45. package/dist/{doctor-completion-sQVhKKei.js → doctor-completion-By066O3p.js} +1 -1
  46. package/dist/{doctor-completion-DCRTHpiY.js → doctor-completion-lE_33xaY.js} +1 -1
  47. package/dist/entry.js +1 -1
  48. package/dist/{env-BDXYbTKj.js → env-CB65jmJQ.js} +1 -1
  49. package/dist/extensionAPI.js +2 -2
  50. package/dist/{frontmatter-CTR5f_Ez.js → frontmatter-CT1M0pRK.js} +4 -4
  51. package/dist/{gateway-cli-C3ujhxO0.js → gateway-cli-C6uT2x34.js} +182 -13
  52. package/dist/{gateway-cli-C_MT4JFm.js → gateway-cli-DqEgqVKC.js} +182 -13
  53. package/dist/{gemini-auth-BefM10YB.js → gemini-auth-D80BsXr2.js} +1 -1
  54. package/dist/{github-copilot-token-cCYzSU9h.js → github-copilot-token-B8B2pmph.js} +7 -7
  55. package/dist/{glass-ui-ws-ColAiWUr.js → glass-ui-ws-77TY57IO.js} +11 -11
  56. package/dist/{glass-ui-ws-B7zRY2BL.js → glass-ui-ws-CLAUHeZR.js} +11 -11
  57. package/dist/{health-C12hy3Ao.js → health-2jkjZxY8.js} +1 -1
  58. package/dist/{health-vKJZ7iJR.js → health-CvMHgR-L.js} +1 -1
  59. package/dist/{hooks-cli-CdUQvj8s.js → hooks-cli-CRZySOiz.js} +5 -5
  60. package/dist/{hooks-cli-fCPl5hur.js → hooks-cli-DSaezFsD.js} +5 -5
  61. package/dist/{image-BuVL0jHI.js → image-BHF_fnIp.js} +4 -4
  62. package/dist/{image-ops-C7CauEK8.js → image-ops-CY7v6vvp.js} +16 -16
  63. package/dist/index.js +9 -9
  64. package/dist/{internal-DjnxpF_K.js → internal-FNqguZSK.js} +11 -11
  65. package/dist/{ir-7tMVY7D_.js → ir-D6MiJpAy.js} +4 -4
  66. package/dist/llm-slug-generator.js +54 -54
  67. package/dist/{local-roots-ClipCZ9s.js → local-roots-tcdaIEhh.js} +5 -5
  68. package/dist/{login-D4rZWBXe.js → login-D4ZkmSrY.js} +7 -7
  69. package/dist/{login-qr-DdAVHOEC.js → login-qr-C9ftIq3n.js} +12 -12
  70. package/dist/{manager-DHRBy5oR.js → manager-BtWtmpxN.js} +1 -1
  71. package/dist/{manager-CLrJn9l-.js → manager-DDELj5o9.js} +1 -1
  72. package/dist/{manager-BJvYQ7xP.js → manager-DrmlegR2.js} +1 -1
  73. package/dist/{manager-Df_ZdrNG.js → manager-DxCmjSfP.js} +24 -24
  74. package/dist/{manifest-registry-CBCGTsIb.js → manifest-registry-BvGv6lp9.js} +19 -19
  75. package/dist/{markdown-tables-x2Xe2UXh.js → markdown-tables-CE-qSMGB.js} +1 -1
  76. package/dist/{memory-cli-T-a5-lqZ.js → memory-cli-ENCASZJk.js} +3 -3
  77. package/dist/{memory-cli-BgJciaHC.js → memory-cli-Qgbcxvuf.js} +3 -3
  78. package/dist/{message-channel-OlFBYAw8.js → message-channel-lwVT8QjK.js} +1 -1
  79. package/dist/{models-BXXV_sZU.js → models-COhUz7M9.js} +2 -2
  80. package/dist/{models-cli-BI-DyItH.js → models-cli-CCxYcF4R.js} +5 -5
  81. package/dist/{models-cli-Bs6JAGq-.js → models-cli-CYvXBvmZ.js} +6 -6
  82. package/dist/{onboard-Czi_FRdi.js → onboard-CQNUYBIp.js} +2 -2
  83. package/dist/{onboard-channels-sTuhQBVu.js → onboard-channels-9erx07qe.js} +1 -1
  84. package/dist/{onboard-channels-BUCYZF02.js → onboard-channels-CWw8G-6n.js} +1 -1
  85. package/dist/{onboard-DKDCWveE.js → onboard-fVpLVnwg.js} +2 -2
  86. package/dist/{onboarding-Bgx0qZhA.js → onboarding-CtEiH9WG.js} +3 -3
  87. package/dist/{onboarding-CokRRVEi.js → onboarding-D-OIkDwZ.js} +3 -3
  88. package/dist/{onboarding.finalize-BCv5jB0d.js → onboarding.finalize-BY3HNjX4.js} +9 -9
  89. package/dist/{onboarding.finalize-BzEKyraI.js → onboarding.finalize-DTbpLV-T.js} +8 -8
  90. package/dist/{outbound-Zmd7UyQH.js → outbound-C6Gm22UF.js} +7 -7
  91. package/dist/{outbound-attachment-DeCnZT-8.js → outbound-attachment-BWyKV1Gy.js} +2 -2
  92. package/dist/paths-CYmyCDsE.js +212 -0
  93. package/dist/{paths-CbQV9WEg.js → paths-DEuVuViW.js} +1 -1
  94. package/dist/{pi-auth-json-RXOlh8ar.js → pi-auth-json-Bv1NzJdR.js} +1 -1
  95. package/dist/{pi-embedded-DXY7TLac.js → pi-embedded-CdOdQw2i.js} +265 -13
  96. package/dist/{pi-embedded-helpers-D1_Sab0M.js → pi-embedded-helpers-DwQ9wJeT.js} +73 -73
  97. package/dist/{pi-tools.policy-BZrM6a-w.js → pi-tools.policy-Bx5zp45n.js} +2 -0
  98. package/dist/{pi-tools.policy-QIVWAVVI.js → pi-tools.policy-o0ytjRqu.js} +2 -0
  99. package/dist/{plugin-registry-CyrsJDyE.js → plugin-registry-BrJ0-qlu.js} +1 -1
  100. package/dist/{plugin-registry-B2cpTmJz.js → plugin-registry-Cuc8ORuR.js} +1 -1
  101. package/dist/plugin-sdk/agents/pi-embedded-runner/long-task-prompt.d.ts +7 -0
  102. package/dist/plugin-sdk/agents/tools/task-tool.d.ts +7 -0
  103. package/dist/plugin-sdk/{channel-web-t6enTxNE.js → channel-web-t8UOP6Zu.js} +1 -1
  104. package/dist/plugin-sdk/index.js +3 -3
  105. package/dist/plugin-sdk/{manager-LRE7zEk2.js → manager-BPm5oefC.js} +1 -1
  106. package/dist/plugin-sdk/{reply-JypoGhql.js → reply-BKAHTugL.js} +265 -13
  107. package/dist/plugin-sdk/{synthesis-_WpVyZKx.js → synthesis-CVF7Fwhd.js} +2 -2
  108. package/dist/plugin-sdk/{web-BTVj4kiQ.js → web-D0DsmFvw.js} +3 -3
  109. package/dist/{plugins-cli-B-zoQyqU.js → plugins-cli-BDalhI46.js} +5 -5
  110. package/dist/{plugins-cli-DJwRd3EZ.js → plugins-cli-DFmriy-c.js} +5 -5
  111. package/dist/{plugins-BzmbgY7s.js → plugins-v8k1XVOy.js} +9 -9
  112. package/dist/{program-H7h6Iqrq.js → program-DKh41c2a.js} +10 -10
  113. package/dist/{program-context-BgecQAHU.js → program-context-Cq7pqOrw.js} +19 -19
  114. package/dist/{prompt-select-styled-BglmD29e.js → prompt-select-styled-BFCAZLwK.js} +6 -6
  115. package/dist/{prompt-select-styled-BDN2o35i.js → prompt-select-styled-DvvSE_ni.js} +6 -6
  116. package/dist/{provider-auth-helpers-BGIgr7xM.js → provider-auth-helpers-B-LkDxxi.js} +1 -1
  117. package/dist/{provider-auth-helpers-MfKmTeLY.js → provider-auth-helpers-DXppgV1l.js} +1 -1
  118. package/dist/{push-apns-b6bH1EBC.js → push-apns-DCA47WA5.js} +1 -1
  119. package/dist/{push-apns-IcfSTzfr.js → push-apns-DvudhEAb.js} +1 -1
  120. package/dist/{pw-ai-DWkC5eGA.js → pw-ai-XGqnSWju.js} +11 -11
  121. package/dist/{qmd-manager-BXkbA8Y9.js → qmd-manager-CbRJhonG.js} +8 -8
  122. package/dist/{register.agent-ChwMSIC4.js → register.agent-_BV5KyFb.js} +9 -9
  123. package/dist/{register.agent-BgyETrrj.js → register.agent-aFj_SMi3.js} +8 -8
  124. package/dist/{register.configure-DH3L2tqW.js → register.configure-CvOoD5gE.js} +9 -9
  125. package/dist/{register.configure-Bm4CvoLF.js → register.configure-Dx0Uhmlz.js} +9 -9
  126. package/dist/{register.maintenance-BbOBw1eI.js → register.maintenance-BuZpoSik.js} +10 -10
  127. package/dist/{register.maintenance-CAyHUEzP.js → register.maintenance-CMeJR7DG.js} +11 -11
  128. package/dist/{register.message-DheqsiR0.js → register.message-qysZPg3G.js} +5 -5
  129. package/dist/{register.message-DQ3MOWFE.js → register.message-xxGePuRC.js} +5 -5
  130. package/dist/{register.onboard-DOJkUhoY.js → register.onboard-1MP2I0q4.js} +7 -7
  131. package/dist/{register.onboard-CxqR4S1C.js → register.onboard-D4Aow7Gc.js} +7 -7
  132. package/dist/{register.setup-zdrIJA2P.js → register.setup-BT74aXzA.js} +7 -7
  133. package/dist/{register.setup-48YBHzMZ.js → register.setup-DzliKkWh.js} +7 -7
  134. package/dist/{register.status-health-sessions-CeT5pVXb.js → register.status-health-sessions-B3K2gZ72.js} +7 -7
  135. package/dist/{register.status-health-sessions-CimrhScH.js → register.status-health-sessions-D7VYZlrU.js} +7 -7
  136. package/dist/{register.subclis-B-zh940S.js → register.subclis-BCy0IDRv.js} +10 -10
  137. package/dist/{registry-DYq1AYOv.js → registry-X6fUE0K7.js} +19 -19
  138. package/dist/{replies-CUWXgyx2.js → replies-86F3PldM.js} +3 -3
  139. package/dist/{reply-CUR4xpYM.js → reply-Dg1ZU3DZ.js} +263 -13
  140. package/dist/{reply-prefix-CvEIl6_d.js → reply-prefix-CI_IdwqH.js} +1 -1
  141. package/dist/{resolve-route-Jy5dFY67.js → resolve-route-BgSuN9c6.js} +4 -4
  142. package/dist/{retry-B-y5suGA.js → retry-4oEAHckB.js} +1 -1
  143. package/dist/{run-main-CW_kj5Lj.js → run-main-OS2aFAJ2.js} +18 -18
  144. package/dist/{runner-ecX1WzDt.js → runner-B5oNTtgf.js} +22 -22
  145. package/dist/{security-cli-BpnzAB5_.js → security-cli-BadXDWTh.js} +2 -2
  146. package/dist/{security-cli-D9WEiEjD.js → security-cli-D5y28-RH.js} +2 -2
  147. package/dist/{send-DFtnbzqy.js → send-ASDB3AzC.js} +7 -7
  148. package/dist/{send-Bb4it0te.js → send-BTfqlrYd.js} +18 -18
  149. package/dist/{send-C0QjmPaf.js → send-CSydU49L.js} +10 -10
  150. package/dist/{send-Cpk3Ti6-.js → send-Du-IfSne.js} +6 -6
  151. package/dist/{send-BKo1T3HF.js → send-cCTQjuOZ.js} +6 -6
  152. package/dist/{server-methods-C1h0A5n0.js → server-methods-BszFAkbJ.js} +8 -8
  153. package/dist/{server-methods-C4id-H_X.js → server-methods-D_iKJ-sj.js} +8 -8
  154. package/dist/{server-node-events-CD2yDaEj.js → server-node-events-CENHuAVz.js} +5 -5
  155. package/dist/{server-node-events-BPZEGV_N.js → server-node-events-uBu3XOjd.js} +5 -5
  156. package/dist/{session-BTeY6Gn2.js → session-D8qLj_xN.js} +8 -8
  157. package/dist/{skill-commands-DG2lcozb.js → skill-commands-BcOduw6G.js} +16 -16
  158. package/dist/{skills-CXxrn_e2.js → skills-BrYDT4Jr.js} +24 -24
  159. package/dist/{sqlite-BN_hIcmu.js → sqlite-P-gMg7fi.js} +3 -3
  160. package/dist/{status-_xBnHTlx.js → status-BvbJavmh.js} +1 -1
  161. package/dist/{status-DCeW2a07.js → status-CA0mUJld.js} +4 -4
  162. package/dist/{status-Cb932Vl4.js → status-CBnCPUMG.js} +4 -4
  163. package/dist/{status-DvHD1cnq.js → status-DJAeKN4G.js} +1 -1
  164. package/dist/{store-01F_JM7O.js → store-Ceagbc4L.js} +6 -6
  165. package/dist/{subagent-registry-BKuL9PdW.js → subagent-registry-C1OyZl-M.js} +263 -13
  166. package/dist/{subsystem-BjyjJF-d.js → subsystem-CzXhCdeY.js} +1 -1
  167. package/dist/{synthesis-DOiTUsXQ.js → synthesis-DNTyB7JY.js} +2 -2
  168. package/dist/{synthesis-BUqDGjlc.js → synthesis-DuqSkHEr.js} +54 -54
  169. package/dist/{synthesis-C9RputIi.js → synthesis-brHrnNF2.js} +4 -4
  170. package/dist/{synthesis-Ia9egx87.js → synthesis-z5B41p_r.js} +4 -4
  171. package/dist/{tables-DoG-pFrf.js → tables-qbCoZrYA.js} +1 -1
  172. package/dist/{target-errors-DeJTztcq.js → target-errors-uNitqCCT.js} +2 -2
  173. package/dist/{thinking-BprCy23Z.js → thinking-BV7SCNJP.js} +5 -5
  174. package/dist/{tokens-W0JzCJJM.js → tokens-Bl5R3wPD.js} +1 -1
  175. package/dist/{tool-images-SqqWIT22.js → tool-images-JxNglLSr.js} +2 -2
  176. package/dist/{tool-loop-detection-Dj9h1ogr.js → tool-loop-detection-dfE771kg.js} +3 -3
  177. package/dist/{unified-runner-CVItnwwP.js → unified-runner-Czg3pdBc.js} +489 -237
  178. package/dist/{update-cli-ChEABesZ.js → update-cli-0lyGyl31.js} +11 -11
  179. package/dist/{update-cli-D6ax3jSX.js → update-cli-CIzkVfmj.js} +10 -10
  180. package/dist/{update-runner-B2EY9BWM.js → update-runner-D7-LDziQ.js} +1 -1
  181. package/dist/{update-runner-CWG6GxKs.js → update-runner-aYPcKYAN.js} +1 -1
  182. package/dist/{web-z-yQ8riS.js → web-B90A99YU.js} +58 -58
  183. package/dist/{web-CpSE67Jp.js → web-BJ5dUZso.js} +5 -5
  184. package/dist/{web-D6PPeyG7.js → web-CN7wnU7w.js} +4 -4
  185. package/dist/{web-DMdb2p-h.js → web-Wk1ay1eQ.js} +2 -2
  186. package/dist/{whatsapp-actions-DmVpLXmh.js → whatsapp-actions-llk0IUn2.js} +23 -23
  187. package/dist/{workspace-DscDraUb.js → workspace-CywO4ayZ.js} +27 -27
  188. package/extensions/bluebubbles/package.json +1 -1
  189. package/extensions/copilot-proxy/package.json +1 -1
  190. package/extensions/diagnostics-otel/package.json +1 -1
  191. package/extensions/discord/package.json +1 -1
  192. package/extensions/feishu/package.json +1 -1
  193. package/extensions/google-antigravity-auth/package.json +1 -1
  194. package/extensions/google-gemini-cli-auth/package.json +1 -1
  195. package/extensions/googlechat/package.json +1 -1
  196. package/extensions/imessage/package.json +1 -1
  197. package/extensions/irc/package.json +1 -1
  198. package/extensions/learning-loop/package.json +1 -1
  199. package/extensions/line/package.json +1 -1
  200. package/extensions/llm-task/package.json +1 -1
  201. package/extensions/matrix/CHANGELOG.md +12 -0
  202. package/extensions/matrix/package.json +1 -1
  203. package/extensions/mattermost/package.json +1 -1
  204. package/extensions/memory-core/package.json +1 -1
  205. package/extensions/memory-lancedb/package.json +1 -1
  206. package/extensions/minimax-portal-auth/package.json +1 -1
  207. package/extensions/msteams/CHANGELOG.md +12 -0
  208. package/extensions/msteams/package.json +1 -1
  209. package/extensions/nextcloud-talk/package.json +1 -1
  210. package/extensions/nostr/CHANGELOG.md +12 -0
  211. package/extensions/nostr/package.json +1 -1
  212. package/extensions/open-prose/package.json +1 -1
  213. package/extensions/outlook/package.json +1 -1
  214. package/extensions/pipeline/package.json +1 -1
  215. package/extensions/signal/package.json +1 -1
  216. package/extensions/slack/package.json +1 -1
  217. package/extensions/telegram/package.json +1 -1
  218. package/extensions/tlon/package.json +1 -1
  219. package/extensions/twitch/CHANGELOG.md +12 -0
  220. package/extensions/twitch/package.json +1 -1
  221. package/extensions/voice-call/CHANGELOG.md +12 -0
  222. package/extensions/voice-call/package.json +1 -1
  223. package/extensions/whatsapp/package.json +1 -1
  224. package/extensions/zalo/CHANGELOG.md +12 -0
  225. package/extensions/zalo/package.json +1 -1
  226. package/extensions/zalouser/CHANGELOG.md +12 -0
  227. package/extensions/zalouser/package.json +1 -1
  228. package/package.json +1 -1
  229. package/skills/long-task/scripts/detach-task.sh +57 -5
@@ -37,7 +37,7 @@ import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as re
37
37
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-C8Tqw4td.js";
38
38
  import { i as resolveImageSanitizationLimits, n as sanitizeImageBlocks, r as sanitizeToolResultImages } from "./tool-images-ChC2CXaN.js";
39
39
  import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-MNvheU8U.js";
40
- import { a as resolveMemorySearchConfig, i as resolveOllamaBaseUrl, r as probeOllamaEmbeddingModels, t as MemoryIndexManager } from "./manager-DHRBy5oR.js";
40
+ import { a as resolveMemorySearchConfig, i as resolveOllamaBaseUrl, r as probeOllamaEmbeddingModels, t as MemoryIndexManager } from "./manager-BtWtmpxN.js";
41
41
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-479FB0St.js";
42
42
  import { n as retryAsync } from "./retry-QGp0jvVi.js";
43
43
  import { a as createActionGate, c as jsonResult, d as readReactionParams, f as readStringArrayParam, l as parseAvailableTags, m as readStringParam, n as missingTargetError, o as imageResult, p as readStringOrNumberParam, r as unknownTargetError, s as imageResultFromFile, t as ambiguousTargetError, u as readNumberParam } from "./target-errors-Dm716SF3.js";
@@ -3473,7 +3473,7 @@ async function getMemorySearchManager(params) {
3473
3473
  const wrapper = new FallbackMemoryManager({
3474
3474
  primary,
3475
3475
  fallbackFactory: async () => {
3476
- const { MemoryIndexManager } = await import("./manager-DHRBy5oR.js").then((n) => n.n);
3476
+ const { MemoryIndexManager } = await import("./manager-BtWtmpxN.js").then((n) => n.n);
3477
3477
  return await MemoryIndexManager.get(params);
3478
3478
  }
3479
3479
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3486,7 +3486,7 @@ async function getMemorySearchManager(params) {
3486
3486
  }
3487
3487
  }
3488
3488
  try {
3489
- const { MemoryIndexManager } = await import("./manager-DHRBy5oR.js").then((n) => n.n);
3489
+ const { MemoryIndexManager } = await import("./manager-BtWtmpxN.js").then((n) => n.n);
3490
3490
  return { manager: await MemoryIndexManager.get(params) };
3491
3491
  } catch (err) {
3492
3492
  return {
@@ -17618,7 +17618,7 @@ async function resolveSandboxWorkdir(params) {
17618
17618
  };
17619
17619
  }
17620
17620
  }
17621
- function resolveWorkdir(workdir, warnings) {
17621
+ function resolveWorkdir$1(workdir, warnings) {
17622
17622
  const fallback = safeCwd() ?? homedir();
17623
17623
  try {
17624
17624
  if (statSync(workdir).isDirectory()) return workdir;
@@ -18760,7 +18760,7 @@ function createExecTool(defaults) {
18760
18760
  });
18761
18761
  workdir = resolved.hostWorkdir;
18762
18762
  containerWorkdir = resolved.containerWorkdir;
18763
- } else workdir = resolveWorkdir(rawWorkdir, warnings);
18763
+ } else workdir = resolveWorkdir$1(rawWorkdir, warnings);
18764
18764
  const baseEnv = coerceEnv(process.env);
18765
18765
  if (host !== "sandbox" && params.env) validateHostEnv(params.env);
18766
18766
  const mergedEnv = params.env ? {
@@ -36661,6 +36661,254 @@ function createSubagentsTool(opts) {
36661
36661
  };
36662
36662
  }
36663
36663
 
36664
+ //#endregion
36665
+ //#region src/agents/tools/task-tool.ts
36666
+ /**
36667
+ * Long-task management tools (task_list, task_cancel).
36668
+ *
36669
+ * Companions to the detach-task pattern in skills/long-task. The detach
36670
+ * script writes task-<id>.{pid,cmd,started,log,status} state files into
36671
+ * the agent's workspace; these tools read and act on those files so the
36672
+ * agent can answer "what's running?" and kill a task without needing
36673
+ * shell access.
36674
+ *
36675
+ * task-id allow-list mirrors detach-task.sh: 1–60 chars from
36676
+ * [a-zA-Z0-9._-], must not start with '.' or '-'. Diverging would let the
36677
+ * agent kill processes it never spawned via path traversal.
36678
+ */
36679
+ const TASK_FILE_PREFIX = "task-";
36680
+ const TASK_ID_RE = /^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,59}$/;
36681
+ const TASK_FILE_SUFFIXES = [
36682
+ ".pid",
36683
+ ".status",
36684
+ ".started",
36685
+ ".cmd",
36686
+ ".log"
36687
+ ];
36688
+ const ALLOWED_SIGNALS = new Set([
36689
+ "SIGTERM",
36690
+ "SIGINT",
36691
+ "SIGHUP",
36692
+ "SIGQUIT",
36693
+ "SIGKILL",
36694
+ "SIGUSR1",
36695
+ "SIGUSR2"
36696
+ ]);
36697
+ const TaskListSchema = Type.Object({ workdir: Type.Optional(Type.String()) });
36698
+ const TaskCancelSchema = Type.Object({
36699
+ taskId: Type.String(),
36700
+ workdir: Type.Optional(Type.String()),
36701
+ signal: Type.Optional(Type.String())
36702
+ });
36703
+ function normaliseSignal(input) {
36704
+ if (!input) return "SIGTERM";
36705
+ const upper = input.trim().toUpperCase();
36706
+ const candidate = upper.startsWith("SIG") ? upper : `SIG${upper}`;
36707
+ if (ALLOWED_SIGNALS.has(candidate)) return candidate;
36708
+ throw new Error(`Unsupported signal: ${input}. Allowed: TERM, INT, HUP, QUIT, KILL, USR1, USR2.`);
36709
+ }
36710
+ function isPidAlive(pid) {
36711
+ try {
36712
+ process.kill(pid, 0);
36713
+ return true;
36714
+ } catch (err) {
36715
+ if (err.code === "EPERM") return true;
36716
+ return false;
36717
+ }
36718
+ }
36719
+ async function safeRead(filePath) {
36720
+ try {
36721
+ return (await fs.promises.readFile(filePath, "utf8")).trim();
36722
+ } catch {
36723
+ return null;
36724
+ }
36725
+ }
36726
+ function resolveWorkdir(deps, override) {
36727
+ const raw = override?.trim();
36728
+ if (!raw) return deps.workspaceDir;
36729
+ if (!path.isAbsolute(raw)) throw new Error(`workdir must be an absolute path (got: ${raw})`);
36730
+ return raw;
36731
+ }
36732
+ async function readTaskInfo(workdir, id) {
36733
+ const pidPath = path.join(workdir, `${TASK_FILE_PREFIX}${id}.pid`);
36734
+ const [pidText, status, started, cmd] = await Promise.all([
36735
+ safeRead(pidPath),
36736
+ safeRead(path.join(workdir, `${TASK_FILE_PREFIX}${id}.status`)),
36737
+ safeRead(path.join(workdir, `${TASK_FILE_PREFIX}${id}.started`)),
36738
+ safeRead(path.join(workdir, `${TASK_FILE_PREFIX}${id}.cmd`))
36739
+ ]);
36740
+ let pid = null;
36741
+ if (pidText) {
36742
+ const parsed = Number.parseInt(pidText, 10);
36743
+ if (Number.isFinite(parsed) && parsed > 0) pid = parsed;
36744
+ }
36745
+ return {
36746
+ id,
36747
+ pid,
36748
+ alive: pid !== null && isPidAlive(pid),
36749
+ status: status ?? "missing",
36750
+ started,
36751
+ cmd,
36752
+ pidPath,
36753
+ statusPath: path.join(workdir, `${TASK_FILE_PREFIX}${id}.status`),
36754
+ logPath: path.join(workdir, `${TASK_FILE_PREFIX}${id}.log`)
36755
+ };
36756
+ }
36757
+ function createTaskListTool(deps) {
36758
+ return {
36759
+ label: "Task List",
36760
+ name: "task_list",
36761
+ description: `List long-running detached tasks in the agent's workspace.
36762
+
36763
+ Globs task-<id>.{pid,status,started,cmd,log} files, reads their state, and
36764
+ checks each PID's liveness. Use this to find the task-id of a running
36765
+ detach-task before calling task_cancel, or to answer "what's running right
36766
+ now?" without re-asking the user.
36767
+
36768
+ Returns: { workdir, tasks: [{ id, pid, alive, status, started, cmd, pidPath, statusPath, logPath }] }.
36769
+ Tasks whose .pid file is missing are still listed (alive=false, pid=null) so
36770
+ the agent can spot orphan state files.`,
36771
+ parameters: TaskListSchema,
36772
+ execute: async (_toolCallId, args) => {
36773
+ const override = readStringParam(args, "workdir");
36774
+ let workdir;
36775
+ try {
36776
+ workdir = resolveWorkdir(deps, override);
36777
+ } catch (err) {
36778
+ return jsonResult({
36779
+ workdir: override ?? deps.workspaceDir,
36780
+ tasks: [],
36781
+ error: err instanceof Error ? err.message : String(err)
36782
+ });
36783
+ }
36784
+ let entries;
36785
+ try {
36786
+ entries = await fs.promises.readdir(workdir);
36787
+ } catch (err) {
36788
+ if (err.code === "ENOENT") return jsonResult({
36789
+ workdir,
36790
+ tasks: []
36791
+ });
36792
+ return jsonResult({
36793
+ workdir,
36794
+ tasks: [],
36795
+ error: err instanceof Error ? err.message : String(err)
36796
+ });
36797
+ }
36798
+ const taskIds = /* @__PURE__ */ new Set();
36799
+ for (const entry of entries) {
36800
+ if (!entry.startsWith(TASK_FILE_PREFIX)) continue;
36801
+ for (const suffix of TASK_FILE_SUFFIXES) if (entry.endsWith(suffix)) {
36802
+ const id = entry.slice(5, -suffix.length);
36803
+ if (id.length > 0 && TASK_ID_RE.test(id)) taskIds.add(id);
36804
+ break;
36805
+ }
36806
+ }
36807
+ const tasks = await Promise.all([...taskIds].toSorted().map((id) => readTaskInfo(workdir, id)));
36808
+ return jsonResult({
36809
+ workdir,
36810
+ tasks
36811
+ });
36812
+ }
36813
+ };
36814
+ }
36815
+ function createTaskCancelTool(deps) {
36816
+ return {
36817
+ label: "Task Cancel",
36818
+ name: "task_cancel",
36819
+ description: `Send a signal (default SIGTERM) to a running detached task.
36820
+
36821
+ Reads task-<id>.pid in the workdir, validates the recorded PID is alive,
36822
+ and sends the signal via process.kill. The task's TERM/INT/HUP trap will
36823
+ write an "aborted" status before exiting, so a follow-up task_list call
36824
+ sees the canonical end state.
36825
+
36826
+ task-id must match the same allow-list as detach-task.sh: 1–60 chars from
36827
+ [a-zA-Z0-9._-], no leading '.' or '-'. signal accepts TERM (default), INT,
36828
+ HUP, QUIT, KILL, USR1, USR2 — with or without the "SIG" prefix.
36829
+
36830
+ Returns: { ok, taskId, pid, sentSignal, alreadyDead?, error? }.`,
36831
+ parameters: TaskCancelSchema,
36832
+ execute: async (_toolCallId, args) => {
36833
+ const params = args;
36834
+ const taskId = readStringParam(params, "taskId", { required: true });
36835
+ if (!TASK_ID_RE.test(taskId)) return jsonResult({
36836
+ ok: false,
36837
+ taskId,
36838
+ error: "taskId must be 1–60 chars from [a-zA-Z0-9._-] and must not start with '.' or '-'."
36839
+ });
36840
+ const override = readStringParam(params, "workdir");
36841
+ let workdir;
36842
+ try {
36843
+ workdir = resolveWorkdir(deps, override);
36844
+ } catch (err) {
36845
+ return jsonResult({
36846
+ ok: false,
36847
+ taskId,
36848
+ error: err instanceof Error ? err.message : String(err)
36849
+ });
36850
+ }
36851
+ const signalRaw = readStringParam(params, "signal");
36852
+ let signal;
36853
+ try {
36854
+ signal = normaliseSignal(signalRaw);
36855
+ } catch (err) {
36856
+ return jsonResult({
36857
+ ok: false,
36858
+ taskId,
36859
+ error: err instanceof Error ? err.message : String(err)
36860
+ });
36861
+ }
36862
+ const pidPath = path.join(workdir, `${TASK_FILE_PREFIX}${taskId}.pid`);
36863
+ let pidText;
36864
+ try {
36865
+ pidText = (await fs.promises.readFile(pidPath, "utf8")).trim();
36866
+ } catch (err) {
36867
+ if (err.code === "ENOENT") return jsonResult({
36868
+ ok: false,
36869
+ taskId,
36870
+ error: `no pid file at ${pidPath} — task is unknown or already cleaned up`
36871
+ });
36872
+ return jsonResult({
36873
+ ok: false,
36874
+ taskId,
36875
+ error: err instanceof Error ? err.message : String(err)
36876
+ });
36877
+ }
36878
+ const pid = Number.parseInt(pidText, 10);
36879
+ if (!Number.isFinite(pid) || pid <= 0) return jsonResult({
36880
+ ok: false,
36881
+ taskId,
36882
+ error: `pid file at ${pidPath} did not contain a positive integer`
36883
+ });
36884
+ if (!isPidAlive(pid)) return jsonResult({
36885
+ ok: false,
36886
+ taskId,
36887
+ pid,
36888
+ alreadyDead: true,
36889
+ error: "process is no longer running"
36890
+ });
36891
+ try {
36892
+ process.kill(pid, signal);
36893
+ } catch (err) {
36894
+ return jsonResult({
36895
+ ok: false,
36896
+ taskId,
36897
+ pid,
36898
+ sentSignal: signal,
36899
+ error: err instanceof Error ? err.message : String(err)
36900
+ });
36901
+ }
36902
+ return jsonResult({
36903
+ ok: true,
36904
+ taskId,
36905
+ pid,
36906
+ sentSignal: signal
36907
+ });
36908
+ }
36909
+ };
36910
+ }
36911
+
36664
36912
  //#endregion
36665
36913
  //#region src/agents/tools/tts-tool.ts
36666
36914
  const TtsToolSchema = Type.Object({
@@ -37961,6 +38209,8 @@ function createSymiTools(options) {
37961
38209
  config: options?.config
37962
38210
  }),
37963
38211
  createCronTool({ agentSessionKey: options?.agentSessionKey }),
38212
+ createTaskListTool({ workspaceDir }),
38213
+ createTaskCancelTool({ workspaceDir }),
37964
38214
  ...messageTool ? [messageTool] : [],
37965
38215
  createTtsTool({
37966
38216
  agentChannel: options?.agentChannel,
@@ -45761,6 +46011,7 @@ async function resolveDetachScriptPath(params) {
45761
46011
  return cachedScriptPath;
45762
46012
  }
45763
46013
  async function buildLongTaskPromptSuffix(params) {
46014
+ if (params.cronEnabled === false) return "";
45764
46015
  const scriptPath = await resolveDetachScriptPath(params);
45765
46016
  if (!scriptPath) return "";
45766
46017
  return "\n\n" + [
@@ -45772,10 +46023,7 @@ async function buildLongTaskPromptSuffix(params) {
45772
46023
  " • workdir: absolute path you own (e.g. the agent workspace).",
45773
46024
  " • Script spawns under setsid+nohup+disown, writes task-<id>.{pid,cmd,started,log,status} files.",
45774
46025
  "- Immediately after detaching, respond to the user with: task id, PID, log file path, your ETA estimate, and that a cron monitor has been scheduled.",
45775
- "- Register a cron monitor using the `cron` tool with action=add. Required fields:",
45776
- " • schedule: { kind: \"interval\", ms: 180000 } (every 3 minutes; minimum 60000)",
45777
- " • payload: { kind: \"agent\", sessionTarget: \"isolated\", text: <job prompt> }",
45778
- " The job prompt must literally contain the task-id, PID, log path, and status path so the future turn has enough context without re-deriving them.",
46026
+ "- Register a cron monitor via the `cron` tool's `add` action. Use the schema documented in that tool's own description for the exact field names — do NOT guess. The monitor should fire roughly every 3 minutes as an isolated agentTurn job, and its message must literally contain the task-id, PID, log path, and status path so the future turn has enough context without re-deriving them.",
45779
46027
  "- Safe status read (inside the monitor turn):",
45780
46028
  " `status=$(cat \"<workdir>/task-<id>.status\" 2>/dev/null || echo missing)`",
45781
46029
  " Possible values: `running pid=<N> started=<ISO>`, `complete rc=<N> ended=<ISO>`, `aborted rc=<N> signal=<TERM|INT|HUP> ended=<ISO>`, or `missing` if the file was cleaned up.",
@@ -45783,7 +46031,8 @@ async function buildLongTaskPromptSuffix(params) {
45783
46031
  " • If status begins with `running`: tail -n 20 <log>, post a one-sentence progress line.",
45784
46032
  " • If status begins with `complete`: post a final summary with rc and tail, then call cron action=remove on this job id.",
45785
46033
  " • If status begins with `aborted`: post a failure summary with signal and tail, then call cron action=remove.",
45786
- " • Never leave stale monitors running after the task finishes."
46034
+ " • Never leave stale monitors running after the task finishes.",
46035
+ "- Inspecting and killing tasks: use `task_list` to enumerate detached tasks in the workspace (returns id/pid/alive/status/started for each), and `task_cancel` with `taskId` (and optional `signal`, default SIGTERM) to terminate a running task. Prefer these over raw `kill`/`ps` exec calls — they share the detach script's task-id allow-list and report alreadyDead cleanly."
45787
46036
  ].join("\n");
45788
46037
  }
45789
46038
 
@@ -46841,7 +47090,8 @@ async function runEmbeddedAttempt(params) {
46841
47090
  const longTaskSuffix = await buildLongTaskPromptSuffix({
46842
47091
  argv1: process.argv[1],
46843
47092
  cwd: process.cwd(),
46844
- moduleUrl: import.meta.url
47093
+ moduleUrl: import.meta.url,
47094
+ cronEnabled: process.env.SYMI_SKIP_CRON !== "1" && params.config?.cron?.enabled !== false
46845
47095
  });
46846
47096
  const emailCapabilitySuffix = buildEmailCapabilityPromptSuffix();
46847
47097
  const systemPromptText = createSystemPromptOverride(appendPrompt + longTaskSuffix + emailCapabilitySuffix + profilePromptSuffix)();
@@ -61266,7 +61516,7 @@ function isVoiceChannelType(type) {
61266
61516
  function createDefaultDeps() {
61267
61517
  return {
61268
61518
  sendMessageWhatsApp: async (...args) => {
61269
- const { sendMessageWhatsApp } = await import("./web-DMdb2p-h.js");
61519
+ const { sendMessageWhatsApp } = await import("./web-Wk1ay1eQ.js");
61270
61520
  return await sendMessageWhatsApp(...args);
61271
61521
  },
61272
61522
  sendMessageTelegram: async (...args) => {
@@ -76546,7 +76796,7 @@ function loadWebLoginQr() {
76546
76796
  return webLoginQrPromise;
76547
76797
  }
76548
76798
  function loadWebChannel() {
76549
- webChannelPromise ??= import("./web-DMdb2p-h.js");
76799
+ webChannelPromise ??= import("./web-Wk1ay1eQ.js");
76550
76800
  return webChannelPromise;
76551
76801
  }
76552
76802
  function loadWhatsAppActions() {
@@ -77856,6 +78106,8 @@ const SUBAGENT_TOOL_DENY_ALWAYS = [
77856
78106
  "whatsapp_login",
77857
78107
  "session_status",
77858
78108
  "cron",
78109
+ "task_list",
78110
+ "task_cancel",
77859
78111
  "memory_search",
77860
78112
  "memory_get",
77861
78113
  "memory_pin",