@symerian/symi 2.0.15 → 2.0.17

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 (320) hide show
  1. package/dist/{acp-cli-BKh-53nn.js → acp-cli-DqQjT50N.js} +3 -3
  2. package/dist/{acp-cli-CRT2rkIR.js → acp-cli-SgZGC8og.js} +3 -3
  3. package/dist/{agents-CNsMe4Dr.js → agents-C4_0TzXm.js} +7 -7
  4. package/dist/{agents.config-yx78oSLx.js → agents.config-Bneyaqn6.js} +1 -1
  5. package/dist/{agents.config-CdDf19dm.js → agents.config-D9Ufj9CE.js} +1 -1
  6. package/dist/{audio-preflight-DSeaWZZW.js → audio-preflight-5w1q1hWh.js} +11 -11
  7. package/dist/{audio-preflight-B8ffbICW.js → audio-preflight-BiAp3Hvj.js} +5 -5
  8. package/dist/{audio-preflight-CO2seHjy.js → audio-preflight-Cpsd8C3J.js} +11 -11
  9. package/dist/{audio-preflight-DRQD_nt1.js → audio-preflight-mSUx5I34.js} +5 -5
  10. package/dist/{audit-CiugrQda.js → audit-BCHYqYge.js} +6 -6
  11. package/dist/{audit-DKUpFt8z.js → audit-FH7mu_3g.js} +6 -6
  12. package/dist/{auth-choice-CXMFi9LR.js → auth-choice-5u4JonD1.js} +4 -4
  13. package/dist/{auth-choice-mw9ndZQO.js → auth-choice-B8qrETy7.js} +4 -4
  14. package/dist/{banner-B-joBGLz.js → banner-CufnkY4K.js} +1 -1
  15. package/dist/{browser-cli-iXhPMwGZ.js → browser-cli-Cmyh_mQi.js} +4 -4
  16. package/dist/{browser-cli-Bk7Q_04S.js → browser-cli-n1RQ8OQs.js} +4 -4
  17. package/dist/build-info.json +3 -3
  18. package/dist/bundled/boot-md/handler.js +14 -14
  19. package/dist/bundled/session-memory/handler.js +14 -14
  20. package/dist/{call-BQiCOxB6.js → call-BKOIc76f.js} +2 -2
  21. package/dist/{call-BNyqFDDZ.js → call-C30ffTSt.js} +2 -2
  22. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  23. package/dist/{channel-options-XPRRVrmU.js → channel-options-BBDX9s3H.js} +1 -1
  24. package/dist/{channel-options-D74Jofp4.js → channel-options-CxOu5Gvn.js} +1 -1
  25. package/dist/{channel-web-vRvvtf0S.js → channel-web-DxSaM7GA.js} +7 -7
  26. package/dist/{channels-cli-D3lj5dXo.js → channels-cli-CB6lWL72.js} +31 -31
  27. package/dist/{channels-cli-DgxPfJF7.js → channels-cli-CvtvmTOx.js} +32 -32
  28. package/dist/{chrome-B_zrSLce.js → chrome-1cQdPKbv.js} +8 -8
  29. package/dist/{chrome-BgIDB_SH.js → chrome-CPwj5x24.js} +1 -1
  30. package/dist/{chrome-D9OwvWm7.js → chrome-CUsfMVUk.js} +1 -1
  31. package/dist/{chrome-LmEyZdbC.js → chrome-DPu6LSX4.js} +8 -8
  32. package/dist/cli/daemon-cli.js +1 -1
  33. package/dist/{cli-DQQAfUbo.js → cli-CU_pJKCD.js} +27 -27
  34. package/dist/{cli-Bg_5WQFe.js → cli-cDOiHmL7.js} +28 -28
  35. package/dist/{client-Cnoh7nRo.js → client-CQSyCS4M.js} +2 -1
  36. package/dist/{client-LeVQns9-.js → client-DMBZpU6X.js} +2 -1
  37. package/dist/{command-registry-Cde2LqTh.js → command-registry-D1zcgjTn.js} +11 -11
  38. package/dist/{completion-cli-KJUTWJP3.js → completion-cli-C8TsFimX.js} +2 -2
  39. package/dist/{completion-cli-Cx9htCOm.js → completion-cli-DWcx6gc6.js} +1 -1
  40. package/dist/{config-Dgn_cL29.js → config-BLe0R4JX.js} +3 -1
  41. package/dist/{config-BjGo9GnL.js → config-ClXqj_D1.js} +3 -1
  42. package/dist/{config-DM0K7qC1.js → config-CvuX_y8t.js} +3 -1
  43. package/dist/{config-amjzHiWZ.js → config-DehS9e5w.js} +3 -1
  44. package/dist/{config-cli-ozfA6MGF.js → config-cli-CEp26CMt.js} +2 -2
  45. package/dist/{config-cli-C5-P9Nzz.js → config-cli-DcjOWFbW.js} +2 -2
  46. package/dist/{config-guard-Cnu2qssk.js → config-guard-CGgFpviD.js} +3 -3
  47. package/dist/{config-guard-BpQn1MKk.js → config-guard-Ix_EcPkt.js} +2 -2
  48. package/dist/{config-validation-BHjDr-an.js → config-validation-BQnULegl.js} +1 -1
  49. package/dist/{config-validation-pVfqbrLy.js → config-validation-Ct_myZSl.js} +1 -1
  50. package/dist/{configure-ktsZw1bT.js → configure-B3aYKtwN.js} +10 -10
  51. package/dist/{configure-DiuQ_aTS.js → configure-DbqI2Bgi.js} +10 -10
  52. package/dist/{control-service-DVFF3PrV.js → control-service-CZ8lXYgi.js} +4 -4
  53. package/dist/{control-service-DMz_CcLi.js → control-service-DI1Do6Nn.js} +4 -4
  54. package/dist/control-ui/css/style.css +9 -0
  55. package/dist/control-ui/js/app.js +137 -0
  56. package/dist/control-ui/js/gateway.js +10 -2
  57. package/dist/{cron-cli-iWejT5dL.js → cron-cli-BH6kt3EZ.js} +4 -4
  58. package/dist/{cron-cli-BVy2Ysgu.js → cron-cli-NJy3v3Eb.js} +4 -4
  59. package/dist/{daemon-cli-CFZpc0hg.js → daemon-cli-BuOGkn7L.js} +6 -6
  60. package/dist/{daemon-cli-BU1FofT_.js → daemon-cli-CweZn-1O.js} +6 -6
  61. package/dist/daemon-cli.js +5 -2
  62. package/dist/{daemon-runtime-B38pOixq.js → daemon-runtime-C1t_OfMD.js} +1 -1
  63. package/dist/{daemon-runtime-CjgoCPLb.js → daemon-runtime-D1K-9VEC.js} +1 -1
  64. package/dist/{deliver-B3UoBZdC.js → deliver-BorDF5OG.js} +2 -2
  65. package/dist/{deliver-DONp5mgd.js → deliver-CIc_l0o6.js} +3 -3
  66. package/dist/{deliver-CkjSfucB.js → deliver-D8xILUUI.js} +2 -2
  67. package/dist/{deliver-2Y_F_0yh.js → deliver-DqqfC-g1.js} +3 -3
  68. package/dist/{devices-cli-CKAh6Hnl.js → devices-cli-BE5ZzcA7.js} +3 -3
  69. package/dist/{devices-cli-DC8knKQP.js → devices-cli-BUdOf8m2.js} +3 -3
  70. package/dist/{directory-cli-DH9ww80p.js → directory-cli-BBdctcDF.js} +1 -1
  71. package/dist/{directory-cli-B0H80BMR.js → directory-cli-DQHIn9um.js} +1 -1
  72. package/dist/{dns-cli-Lzt29-Zu.js → dns-cli-6H_E37de.js} +1 -1
  73. package/dist/{dns-cli-CVMQnrzw.js → dns-cli-mCiUyfvk.js} +1 -1
  74. package/dist/{doctor-completion-CrN6Ly8x.js → doctor-completion-CAdewURI.js} +1 -1
  75. package/dist/{doctor-completion-Vwi_je1c.js → doctor-completion-CXUM27y3.js} +1 -1
  76. package/dist/{doctor-config-flow-B150h841.js → doctor-config-flow-BWD9G2UQ.js} +2 -2
  77. package/dist/{doctor-config-flow-C_56SUPO.js → doctor-config-flow-CthAM9my.js} +2 -2
  78. package/dist/entry.js +1 -1
  79. package/dist/{exec-approvals-cli-CfrLzlfe.js → exec-approvals-cli-CYKHeoEA.js} +5 -5
  80. package/dist/{exec-approvals-cli-D7ZfJtB3.js → exec-approvals-cli-CjU3pZzx.js} +5 -5
  81. package/dist/extensionAPI.js +14 -14
  82. package/dist/{gateway-cli-CwO3878F.js → gateway-cli-Bs96hk7L.js} +44 -44
  83. package/dist/{gateway-cli-DyqK4XZ1.js → gateway-cli-n-kmAuP8.js} +43 -43
  84. package/dist/{gateway-rpc-XxpDa3Bd.js → gateway-rpc-0C2uJScX.js} +1 -1
  85. package/dist/{gateway-rpc-BnsXD9QK.js → gateway-rpc-CTqBFfgd.js} +1 -1
  86. package/dist/{glass-ui-ws-BmqwQaCf.js → glass-ui-ws-DFYRIWTO.js} +46 -40
  87. package/dist/{glass-ui-ws-zVNodseh.js → glass-ui-ws-mIHlWvBv.js} +45 -39
  88. package/dist/{health-UjXEBnzA.js → health-CpbZDInE.js} +5 -5
  89. package/dist/{health-Q1RP1M2f.js → health-gsbXEgFI.js} +5 -5
  90. package/dist/{hooks-cli-D4qJl6do.js → hooks-cli-SJWnM2SY.js} +29 -29
  91. package/dist/{hooks-cli-DOT9uGZw.js → hooks-cli-iVG6fkFc.js} +28 -28
  92. package/dist/{image-DrZEJQwQ.js → image-DIzd7Gw9.js} +2 -2
  93. package/dist/{image-B4LY9KFw.js → image-DWOvY8sR.js} +2 -2
  94. package/dist/{image-CSeAnozE.js → image-DrkD-6sg.js} +2 -2
  95. package/dist/{image-RFofsrof.js → image-GHA29jwQ.js} +2 -2
  96. package/dist/index.js +36 -36
  97. package/dist/{lifecycle-core-BYV6-zd8.js → lifecycle-core-CE8aXuLe.js} +2 -2
  98. package/dist/{lifecycle-core-De5BcVI4.js → lifecycle-core-CPLYFbS4.js} +2 -2
  99. package/dist/llm-slug-generator.js +14 -14
  100. package/dist/{login-CXSct1EH.js → login-BcCF4noU.js} +2 -2
  101. package/dist/{login-BH17fJ5L.js → login-C5eMLg1G.js} +2 -2
  102. package/dist/{login-BG_7eJLu.js → login-DNeGXcjV.js} +2 -2
  103. package/dist/{login-BZYFLDxo.js → login-_Ynqrjet.js} +2 -2
  104. package/dist/{login-qr-zVpxocbF.js → login-qr-CYEYc0Vo.js} +2 -2
  105. package/dist/{login-qr-9OQSnm5L.js → login-qr-CzD7_Pru.js} +2 -2
  106. package/dist/{login-qr-DoNfx43Q.js → login-qr-DjXNemMm.js} +2 -2
  107. package/dist/{login-qr-BLmEvZVj.js → login-qr-E4YwhoPt.js} +2 -2
  108. package/dist/{logs-cli-DfFvgxqj.js → logs-cli-BLp5AOM0.js} +4 -4
  109. package/dist/{logs-cli-D3iVwGDc.js → logs-cli-CIQ4qmRW.js} +4 -4
  110. package/dist/{manager-B5EXdBQV.js → manager-BmHL5ETi.js} +134 -17
  111. package/dist/{manager-CYHgFXd8.js → manager-CPQ2pEj3.js} +134 -17
  112. package/dist/{manager-C_DoJrcP.js → manager-Oiy1uHsu.js} +134 -17
  113. package/dist/{manager-oiX42wby.js → manager-oQJvFR6J.js} +134 -17
  114. package/dist/{memory-cli-BhnOq4Ev.js → memory-cli-BUoM-v1-.js} +206 -3
  115. package/dist/{memory-cli-D4J9SO7Z.js → memory-cli-CGRSXKeF.js} +206 -3
  116. package/dist/{model-catalog-DjJ9GtKX.js → model-catalog-DZbVIJnH.js} +3 -3
  117. package/dist/{model-catalog-Dj5pIc1G.js → model-catalog-sW2MkIv9.js} +2 -2
  118. package/dist/{model-picker-ay4NPk8S.js → model-picker-BJBeaNrK.js} +2 -2
  119. package/dist/{model-picker-DXwUsLAy.js → model-picker-DUl7Gvdh.js} +2 -2
  120. package/dist/{models-DKsiIvSx.js → models-LtuCAbk5.js} +8 -8
  121. package/dist/{models-cli-ULbdeSgc.js → models-cli-CB2zHB3Q.js} +31 -31
  122. package/dist/{models-cli-BS6UJ98e.js → models-cli-DEQCqsfo.js} +31 -31
  123. package/dist/{models-config-u4va9_AO.js → models-config-BH6-rmtt.js} +1 -1
  124. package/dist/{models-config-Cb41NmVa.js → models-config-DT09Fas0.js} +1 -1
  125. package/dist/{node-cli-BDruQPgf.js → node-cli-BnZT8tc-.js} +10 -10
  126. package/dist/{node-cli-Dq7jjGmU.js → node-cli-znp1IPL2.js} +10 -10
  127. package/dist/{nodes-cli-CO1-qlpY.js → nodes-cli-C8L5ablK.js} +4 -4
  128. package/dist/{nodes-cli-D71AOvPL.js → nodes-cli-D3bHqKX1.js} +4 -4
  129. package/dist/{onboard-Bt-BwfkR.js → onboard-B725u5vG.js} +7 -7
  130. package/dist/{onboard-B387frTY.js → onboard-Dz7lPFv1.js} +7 -7
  131. package/dist/{onboard-channels-COcxT5Q0.js → onboard-channels-DPb8R8S3.js} +1 -1
  132. package/dist/{onboard-channels-ybPEmcP8.js → onboard-channels-DjG2jZUq.js} +1 -1
  133. package/dist/{onboard-custom-BKR6vm2R.js → onboard-custom-CFqoXgjd.js} +2 -2
  134. package/dist/{onboard-custom-DoIhWPnb.js → onboard-custom-in5WChfX.js} +2 -2
  135. package/dist/{onboard-helpers-CUQrf3zD.js → onboard-helpers-BmDQMRZ7.js} +2 -2
  136. package/dist/{onboard-helpers-BuSj9DUm.js → onboard-helpers-_sSsfEAa.js} +2 -2
  137. package/dist/{onboard-remote-DTYzroFm.js → onboard-remote-BeAAhzmD.js} +1 -1
  138. package/dist/{onboard-remote-BSjc42yV.js → onboard-remote-CBEIs-Ew.js} +1 -1
  139. package/dist/{onboard-skills-70EumFmD.js → onboard-skills-Bx_OM5v0.js} +1 -1
  140. package/dist/{onboard-skills-BD8JNVwL.js → onboard-skills-EVFmwR8Q.js} +1 -1
  141. package/dist/{onboarding-BibGEGIS.js → onboarding-D-FQIiBn.js} +10 -10
  142. package/dist/{onboarding-CdN_NU2d.js → onboarding-qxWeXuGM.js} +10 -10
  143. package/dist/{onboarding.finalize-CY1NjrGb.js → onboarding.finalize-DJTQnGkJ.js} +35 -35
  144. package/dist/{onboarding.finalize-CvahVrDM.js → onboarding.finalize-D_gWQwW0.js} +33 -33
  145. package/dist/{onboarding.gateway-config-DipSuaKH.js → onboarding.gateway-config-Boplq1Mn.js} +5 -5
  146. package/dist/{onboarding.gateway-config-Cj_s_IG8.js → onboarding.gateway-config-r7VeJWM7.js} +5 -5
  147. package/dist/{outbound-Bv4FdtnF.js → outbound-B_cf2WkB.js} +1 -1
  148. package/dist/{outbound-DfOF58G2.js → outbound-DPCAcHLQ.js} +1 -1
  149. package/dist/{outbound-BNMysnJ1.js → outbound-DRslTBga.js} +1 -1
  150. package/dist/{outbound-Cedd_yui.js → outbound-yaYfpPTu.js} +1 -1
  151. package/dist/{pairing-cli-B7oA36Ke.js → pairing-cli-DFgfVeeY.js} +1 -1
  152. package/dist/{pairing-cli-7_4ayuXX.js → pairing-cli-DOMZSDiT.js} +1 -1
  153. package/dist/{pi-auth-json-DuUL9qfI.js → pi-auth-json-Do26xypW.js} +1 -1
  154. package/dist/{pi-embedded-BjzaB3CT.js → pi-embedded-BINp4yHJ.js} +242 -40
  155. package/dist/{pi-embedded-9wEA_0mu.js → pi-embedded-C6BUGEuF.js} +242 -40
  156. package/dist/{pi-embedded-helpers-BmYZe8o8.js → pi-embedded-helpers-BDwdFGX-.js} +5 -5
  157. package/dist/{pi-embedded-helpers-CgxKWHj9.js → pi-embedded-helpers-Cs0TgOaH.js} +1 -1
  158. package/dist/{pi-embedded-helpers-kB5lBgXk.js → pi-embedded-helpers-Dfp-iKzJ.js} +5 -5
  159. package/dist/{pi-embedded-helpers-ueCT6VlS.js → pi-embedded-helpers-jynCNZsb.js} +1 -1
  160. package/dist/{pi-tools.policy-DPmdlOwE.js → pi-tools.policy-eb_uvOQV.js} +2 -2
  161. package/dist/{pi-tools.policy-T6Z5F-_n.js → pi-tools.policy-vws0LV7U.js} +2 -2
  162. package/dist/{plugin-registry-CEoSVvL1.js → plugin-registry-C61W5IWr.js} +2 -2
  163. package/dist/{plugin-registry-BAbkdLQ7.js → plugin-registry-D1cKRWYQ.js} +2 -2
  164. package/dist/plugin-sdk/agents/memory-search.d.ts +2 -2
  165. package/dist/plugin-sdk/{audio-preflight-CpYjfwrA.js → audio-preflight-CdG1OBN2.js} +5 -5
  166. package/dist/plugin-sdk/{channel-web-xXTpy0N_.js → channel-web-DFVIpsZB.js} +7 -7
  167. package/dist/plugin-sdk/{chrome-BFy_lpld.js → chrome-XyjVFCkY.js} +1 -1
  168. package/dist/plugin-sdk/config/types.tools.d.ts +2 -2
  169. package/dist/plugin-sdk/config/zod-schema.agent-defaults.d.ts +2 -2
  170. package/dist/plugin-sdk/config/zod-schema.agent-runtime.d.ts +4 -4
  171. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +4 -4
  172. package/dist/plugin-sdk/config/zod-schema.d.ts +4 -4
  173. package/dist/plugin-sdk/{config-Do1-fcaS.js → config-DG32gDDp.js} +3 -1
  174. package/dist/plugin-sdk/{deliver-BwnrMlHO.js → deliver-BdbnTrPD.js} +2 -2
  175. package/dist/plugin-sdk/gateway/protocol/schema/logs-chat.d.ts +1 -0
  176. package/dist/plugin-sdk/{image-k_W1USVr.js → image-B4_TBNqR.js} +2 -2
  177. package/dist/plugin-sdk/index.js +18 -18
  178. package/dist/plugin-sdk/{login-DPofXJE3.js → login-Dey5tDpn.js} +2 -2
  179. package/dist/plugin-sdk/{login-qr-CNatqAUv.js → login-qr-Tx8z1frn.js} +2 -2
  180. package/dist/plugin-sdk/{manager-DnoXj4EG.js → manager-RdPsBbBU.js} +134 -17
  181. package/dist/plugin-sdk/memory/embeddings-ollama.d.ts +27 -0
  182. package/dist/plugin-sdk/memory/embeddings.d.ts +4 -1
  183. package/dist/plugin-sdk/memory/manager-sync-ops.d.ts +1 -1
  184. package/dist/plugin-sdk/memory/manager.d.ts +1 -1
  185. package/dist/plugin-sdk/{outbound-w5v_6nFD.js → outbound-BpzsDbEV.js} +1 -1
  186. package/dist/plugin-sdk/{pi-embedded-helpers-Cs2-_EpL.js → pi-embedded-helpers-OWtoPEg8.js} +5 -5
  187. package/dist/plugin-sdk/{pw-ai-BoitXk7j.js → pw-ai-OhVopvbb.js} +2 -2
  188. package/dist/plugin-sdk/{replies-BU-tUT8j.js → replies-DiFTMGgM.js} +1 -1
  189. package/dist/plugin-sdk/{reply-EEvLfWgt.js → reply-v8ed4JLy.js} +236 -34
  190. package/dist/plugin-sdk/{runner-Br1179I4.js → runner-BUXsfUip.js} +2 -2
  191. package/dist/plugin-sdk/{send-Dkyi5g1U.js → send-BXvJJUV_.js} +1 -1
  192. package/dist/plugin-sdk/{send-BaLZTKkj.js → send-BbFwAS_k.js} +1 -1
  193. package/dist/plugin-sdk/{send-P8PiZ2Os.js → send-CGSsrvd1.js} +1 -1
  194. package/dist/plugin-sdk/{send-Ts2lINh9.js → send-DXcq1jzH.js} +1 -1
  195. package/dist/plugin-sdk/{send-CE6VxWke.js → send-Drdgnfr_.js} +1 -1
  196. package/dist/plugin-sdk/{session-Bwdr4g-M.js → session-CX5KhlOe.js} +1 -1
  197. package/dist/plugin-sdk/{web-COWtpMAH.js → web-DfIRv_Mx.js} +18 -18
  198. package/dist/plugin-sdk/{whatsapp-actions-Di-yCTCj.js → whatsapp-actions-Dh6Y2fu9.js} +2 -2
  199. package/dist/{plugins-cli-C_S07pgO.js → plugins-cli-ClY_BPg9.js} +28 -28
  200. package/dist/{plugins-cli-BpuQ7Y9l.js → plugins-cli-UmtKEuxj.js} +29 -29
  201. package/dist/{program-cO9YX6wL.js → program-CNsuYlJt.js} +35 -35
  202. package/dist/{program-context-QBBvnWFX.js → program-context-C2XeNCxI.js} +38 -38
  203. package/dist/{prompt-select-styled-D3dYbx2P.js → prompt-select-styled-CgsYQqlJ.js} +15 -15
  204. package/dist/{prompt-select-styled-CepuQSKg.js → prompt-select-styled-CiYSpQIf.js} +15 -15
  205. package/dist/{provider-auth-helpers-DXqvuBCi.js → provider-auth-helpers-CVAbJckC.js} +2 -2
  206. package/dist/{provider-auth-helpers-BMACaaEd.js → provider-auth-helpers-XIYHuUnj.js} +2 -2
  207. package/dist/{push-apns-DhZgao_r.js → push-apns-6y-7OuAU.js} +1 -1
  208. package/dist/{push-apns-8YIzbTM7.js → push-apns-9q7Pl5I0.js} +1 -1
  209. package/dist/{pw-ai-CQzJmf8V.js → pw-ai-BdNmRxEw.js} +2 -2
  210. package/dist/{pw-ai-s-d46DCX.js → pw-ai-BfUWg8Eh.js} +2 -2
  211. package/dist/{pw-ai-CdaTpZo1.js → pw-ai-C9noP7iN.js} +2 -2
  212. package/dist/{pw-ai-CAkn033M.js → pw-ai-Dnh_iopr.js} +2 -2
  213. package/dist/{qr-cli-DlVBiDQm.js → qr-cli-BbRZOhwI.js} +1 -1
  214. package/dist/{qr-cli-Diq_Rb3t.js → qr-cli-Cac34dCs.js} +1 -1
  215. package/dist/{register.agent-CSUoUVKd.js → register.agent-DmLJVv4N.js} +36 -36
  216. package/dist/{register.agent-CiTS9lyx.js → register.agent-Ys85zXmm.js} +34 -34
  217. package/dist/{register.configure-BbE9MAer.js → register.configure-BwmAY5TF.js} +38 -38
  218. package/dist/{register.configure-CuCVLOW0.js → register.configure-DYuK1UkU.js} +39 -39
  219. package/dist/{register.maintenance-D8bthvou.js → register.maintenance-625En1kE.js} +36 -36
  220. package/dist/{register.maintenance-CJG75LTu.js → register.maintenance-BQa25CA8.js} +38 -38
  221. package/dist/{register.message-CyqE4E2O.js → register.message-CDpK3rbI.js} +29 -29
  222. package/dist/{register.message-nUpHGrEE.js → register.message-DKeM6mQo.js} +28 -28
  223. package/dist/{register.onboard-Dlw-TCPH.js → register.onboard-CbvkWFq5.js} +34 -34
  224. package/dist/{register.onboard-BDlne5KX.js → register.onboard-DtMjj81J.js} +35 -35
  225. package/dist/{register.setup-ByMyofSq.js → register.setup-BHhLns2f.js} +35 -35
  226. package/dist/{register.setup-B8kiMuah.js → register.setup-DdX4Ahvt.js} +34 -34
  227. package/dist/{register.status-health-sessions-0odRpA-p.js → register.status-health-sessions-CqMFel_o.js} +33 -33
  228. package/dist/{register.status-health-sessions-Diirshgb.js → register.status-health-sessions-D1KvwnF9.js} +31 -31
  229. package/dist/{register.subclis-CqEj9vfW.js → register.subclis-su5EMHvC.js} +28 -28
  230. package/dist/{replies-CTKReSzx.js → replies-DqyX2Vln.js} +1 -1
  231. package/dist/{replies-D9V19U2-.js → replies-DtdP8R93.js} +1 -1
  232. package/dist/{replies-DqdOBkTB.js → replies-Dzc6eCFS.js} +1 -1
  233. package/dist/{replies-QloQerhz.js → replies-zeeuLUij.js} +1 -1
  234. package/dist/{reply-B9o45s3E.js → reply-DyFibFiG.js} +43 -43
  235. package/dist/{routes-BYphcpth.js → routes-B7FWIw81.js} +3 -3
  236. package/dist/{routes-qIyRWgzF.js → routes-CEjKic_-.js} +3 -3
  237. package/dist/{rpc-B8S3CF-2.js → rpc-CR9IjVRa.js} +1 -1
  238. package/dist/{rpc-K2mc_55f.js → rpc-CV10Y2YL.js} +1 -1
  239. package/dist/{run-main-C__lZ7VF.js → run-main-CRPU46XB.js} +46 -46
  240. package/dist/{runner-C0tJTZmp.js → runner-BkANJiWS.js} +3 -3
  241. package/dist/{runner-CJJY2r19.js → runner-CTglx_CV.js} +2 -2
  242. package/dist/{runner-DOvsNiYz.js → runner-v0fS4J7T.js} +2 -2
  243. package/dist/{runner-BXN4KYDK.js → runner-w5reqY02.js} +3 -3
  244. package/dist/{sandbox-CbuJolk2.js → sandbox-BpIrSDhl.js} +5 -5
  245. package/dist/{sandbox-rMmahr2s.js → sandbox-DTzJlbvf.js} +5 -5
  246. package/dist/{sandbox-cli-C90jqh9l.js → sandbox-cli-B4VN_9mV.js} +6 -6
  247. package/dist/{sandbox-cli-Duc05KL9.js → sandbox-cli-R_ZOY_KC.js} +6 -6
  248. package/dist/{security-cli-Bt0VkUtO.js → security-cli-BMB3kCFA.js} +10 -10
  249. package/dist/{security-cli-YGXUUBvD.js → security-cli-DmpyxTgQ.js} +10 -10
  250. package/dist/{send-BeASPkFg.js → send-1iB7Rdwp.js} +1 -1
  251. package/dist/{send-BVw7fCyL.js → send-BLT3lTZy.js} +1 -1
  252. package/dist/{send-3YM-aarb.js → send-BR3reUOE.js} +1 -1
  253. package/dist/{send-CYfaZNZ4.js → send-BXiiQprI.js} +1 -1
  254. package/dist/{send-De_WCeGZ.js → send-BbV4XqMl.js} +1 -1
  255. package/dist/{send-D3M6pMr5.js → send-Bt4UsVrd.js} +1 -1
  256. package/dist/{send-CzE5UKr-.js → send-Bx04WqH5.js} +1 -1
  257. package/dist/{send-BVZGeP2r.js → send-CC2vm0xU.js} +1 -1
  258. package/dist/{send-CHOArYFe.js → send-CEjpAJ8N.js} +1 -1
  259. package/dist/{send-hNornLoH.js → send-CQzO_Tg0.js} +1 -1
  260. package/dist/{send-BH09HKsX.js → send-CRWQglv9.js} +1 -1
  261. package/dist/{send-D0dzPf6g.js → send-CZ18Xq5n.js} +1 -1
  262. package/dist/{send-mi3NHnwI.js → send-CltKx_vS.js} +1 -1
  263. package/dist/{send-D_yJMeJa.js → send-DDrpEKUg.js} +1 -1
  264. package/dist/{send-D16XtYvC.js → send-DVLEgg9H.js} +1 -1
  265. package/dist/{send-Do-0Kcmv.js → send-Dm4UYQsf.js} +1 -1
  266. package/dist/{send-DEWzWqfZ.js → send-DyK4u4yH.js} +1 -1
  267. package/dist/{send-B18gkuvz.js → send-EQ1insgp.js} +1 -1
  268. package/dist/{send-C7u4_H5t.js → send-hJthT6M_.js} +1 -1
  269. package/dist/{send-BsocounR.js → send-tDTl6xgz.js} +1 -1
  270. package/dist/{server-context-DG2dIhAy.js → server-context-BcjcQhiM.js} +5 -5
  271. package/dist/{server-context-bMIwnOnH.js → server-context-DbcjnRHG.js} +5 -5
  272. package/dist/{server-methods-Df9KsV_-.js → server-methods-56m79WbR.js} +35 -19
  273. package/dist/{server-methods-B_NSJmhc.js → server-methods-U_lDP83A.js} +34 -18
  274. package/dist/{server-node-events-ZG0SBDkU.js → server-node-events-DpGswbj8.js} +28 -28
  275. package/dist/{server-node-events-C2mugatX.js → server-node-events-Q9J_E8Ce.js} +29 -29
  276. package/dist/{session-BjcsCwgz.js → session-1Q4kg4xp.js} +1 -1
  277. package/dist/{session-BkVBeAkg.js → session-B4JR6zUJ.js} +1 -1
  278. package/dist/{session-BeJq-MLE.js → session-BvXsNdtA.js} +1 -1
  279. package/dist/{session-T0JXlYWe.js → session-C86mCuOs.js} +1 -1
  280. package/dist/{session-utils-Cdv2Qaq2.js → session-utils-CFvGKxdu.js} +3 -3
  281. package/dist/{sessions-DJAxaVI7.js → sessions-B3nP13Fw.js} +1 -1
  282. package/dist/{sessions-BEyCtqBB.js → sessions-BdeJp6uY.js} +1 -1
  283. package/dist/{sessions-CX93jXmG.js → sessions-m60NabL_.js} +3 -3
  284. package/dist/{shared-CMw4odDH.js → shared-mv9M8Mzc.js} +1 -1
  285. package/dist/{shared-CLXhDldI.js → shared-sOiAK5kN.js} +1 -1
  286. package/dist/{skills-cli-CQ7XQ4Kn.js → skills-cli-B7FG8Ft4.js} +1 -1
  287. package/dist/{skills-cli-DIx7YItN.js → skills-cli-DVTw-NM0.js} +1 -1
  288. package/dist/{status-BytVj4kU.js → status-BNmYNm1S.js} +2 -2
  289. package/dist/{status-hgm5EhwS.js → status-D4KjZ3qi.js} +9 -9
  290. package/dist/{status-BTF6_aBO.js → status-DIYjr2wp.js} +2 -2
  291. package/dist/{status-PADx9rG7.js → status-DbXRbJqY.js} +10 -10
  292. package/dist/{status.update-BXs3adtg.js → status.update-CbXOcYqG.js} +1 -1
  293. package/dist/{status.update-DlaskfTr.js → status.update-DKLvc9EH.js} +1 -1
  294. package/dist/{subagent-registry-BR2Qhqjf.js → subagent-registry-Ct3GvWVn.js} +44 -44
  295. package/dist/{system-cli-BMrwtPdR.js → system-cli-9b3AzE_M.js} +4 -4
  296. package/dist/{system-cli-B_cCDKOu.js → system-cli-B_KTvR0v.js} +4 -4
  297. package/dist/{systemd-hints-BBPT8Use.js → systemd-hints-BE7qhp3n.js} +1 -1
  298. package/dist/{systemd-hints-Bm2H1erP.js → systemd-hints-D_u4AuIu.js} +1 -1
  299. package/dist/{tui-CcirlGg5.js → tui-BViOdgFZ.js} +5 -5
  300. package/dist/{tui-cli-hcbzeOtp.js → tui-cli-B97jQaQp.js} +10 -10
  301. package/dist/{tui-cli-D3VMk5c8.js → tui-cli-DKQz32oa.js} +10 -10
  302. package/dist/{tui-0rURH3b3.js → tui-oo_JjD-G.js} +5 -5
  303. package/dist/{update-cli-CHr8rjf-.js → update-cli-C9S00L1E.js} +41 -41
  304. package/dist/{update-cli-qacplfF4.js → update-cli-Dhk0Yxsm.js} +39 -39
  305. package/dist/{update-runner-DM8zQvQB.js → update-runner-BnIIcsqA.js} +1 -1
  306. package/dist/{update-runner-DNA7FJa2.js → update-runner-DBZOvTzN.js} +1 -1
  307. package/dist/{web-UroM-w6c.js → web-5uLk4OEM.js} +31 -31
  308. package/dist/{web-DkQc82PT.js → web-8NQJ75ip.js} +31 -31
  309. package/dist/{web-BKQnrqo-.js → web-f7lkf_un.js} +17 -17
  310. package/dist/{web-CAnxcgBD.js → web-mXHyxR_l.js} +17 -17
  311. package/dist/{webhooks-cli-B0Crq2Ec.js → webhooks-cli-BLi_usfE.js} +1 -1
  312. package/dist/{webhooks-cli-CLIdArAE.js → webhooks-cli-Dz9n2L0-.js} +1 -1
  313. package/dist/{whatsapp-actions-BIjGyW3T.js → whatsapp-actions-6S6PNs2p.js} +2 -2
  314. package/dist/{whatsapp-actions-BL7tCNC_.js → whatsapp-actions-B4YPuD2Q.js} +2 -2
  315. package/dist/{whatsapp-actions-B821AFp-.js → whatsapp-actions-ChtHuvdU.js} +2 -2
  316. package/dist/{whatsapp-actions-Jfx4zcwv.js → whatsapp-actions-M8kjDd9l.js} +2 -2
  317. package/dist/{with-timeout-Cj_xUxo6.js → with-timeout-2zPYOOzh.js} +1 -1
  318. package/dist/{with-timeout-BeA4Jxcl.js → with-timeout-gaHpaiis.js} +1 -1
  319. package/docs/reference/templates/SYMIPULSE.md +22 -1
  320. package/package.json +1 -1
@@ -63,7 +63,7 @@ function mergeConfig(defaults, overrides, agentId) {
63
63
  const provider = overrides?.provider ?? defaults?.provider ?? "auto";
64
64
  const defaultRemote = defaults?.remote;
65
65
  const overrideRemote = overrides?.remote;
66
- const includeRemote = Boolean(overrideRemote?.baseUrl || overrideRemote?.apiKey || overrideRemote?.headers || defaultRemote?.baseUrl || defaultRemote?.apiKey || defaultRemote?.headers) || provider === "openai" || provider === "gemini" || provider === "voyage" || provider === "auto";
66
+ const includeRemote = Boolean(overrideRemote?.baseUrl || overrideRemote?.apiKey || overrideRemote?.headers || defaultRemote?.baseUrl || defaultRemote?.apiKey || defaultRemote?.headers) || provider === "openai" || provider === "gemini" || provider === "voyage" || provider === "ollama" || provider === "auto";
67
67
  const batch = {
68
68
  enabled: overrideRemote?.batch?.enabled ?? defaultRemote?.batch?.enabled ?? false,
69
69
  wait: overrideRemote?.batch?.wait ?? defaultRemote?.batch?.wait ?? true,
@@ -330,6 +330,124 @@ async function resolveGeminiEmbeddingClient(options) {
330
330
  };
331
331
  }
332
332
 
333
+ //#endregion
334
+ //#region src/memory/embeddings-remote-fetch.ts
335
+ async function fetchRemoteEmbeddingVectors(params) {
336
+ const res = await fetch(params.url, {
337
+ method: "POST",
338
+ headers: params.headers,
339
+ body: JSON.stringify(params.body)
340
+ });
341
+ if (!res.ok) {
342
+ const text = await res.text();
343
+ throw new Error(`${params.errorPrefix}: ${res.status} ${text}`);
344
+ }
345
+ return ((await res.json()).data ?? []).map((entry) => entry.embedding ?? []);
346
+ }
347
+
348
+ //#endregion
349
+ //#region src/memory/embeddings-ollama.ts
350
+ /**
351
+ * Known embedding model name prefixes. Ollama's `/api/tags` does not expose
352
+ * model capabilities, so we rely on well-known naming patterns.
353
+ */
354
+ const EMBEDDING_MODEL_PATTERNS = [
355
+ "nomic-embed",
356
+ "mxbai-embed",
357
+ "all-minilm",
358
+ "bge-",
359
+ "snowflake-arctic-embed",
360
+ "gte-",
361
+ "e5-",
362
+ "multilingual-e5",
363
+ "paraphrase-",
364
+ "jina-embeddings",
365
+ "stella-"
366
+ ];
367
+ function isEmbeddingModel(name) {
368
+ const lower = name.toLowerCase();
369
+ return EMBEDDING_MODEL_PATTERNS.some((pattern) => lower.includes(pattern));
370
+ }
371
+ /**
372
+ * Resolve the Ollama API base URL from config or defaults.
373
+ * Strips any trailing `/v1` suffix since we need the native API base.
374
+ */
375
+ function resolveOllamaBaseUrl(cfg) {
376
+ const configured = cfg?.models?.providers?.ollama?.baseUrl?.trim() ?? void 0;
377
+ if (configured) return configured.replace(/\/v1\/?$/, "").replace(/\/$/, "");
378
+ return "http://127.0.0.1:11434";
379
+ }
380
+ /**
381
+ * Probe an Ollama instance for available embedding models.
382
+ * Returns null if Ollama is unreachable or has no embedding models.
383
+ */
384
+ async function probeOllamaEmbeddingModels(baseUrl) {
385
+ try {
386
+ const controller = new AbortController();
387
+ const timeout = setTimeout(() => controller.abort(), 5e3);
388
+ const res = await fetch(`${baseUrl}/api/tags`, { signal: controller.signal });
389
+ clearTimeout(timeout);
390
+ if (!res.ok) return null;
391
+ const models = ((await res.json()).models ?? []).map((m) => m.name ?? "").filter(Boolean).filter(isEmbeddingModel);
392
+ if (models.length === 0) return null;
393
+ return {
394
+ models,
395
+ baseUrl
396
+ };
397
+ } catch {
398
+ return null;
399
+ }
400
+ }
401
+ /**
402
+ * Create an embedding provider that uses Ollama's OpenAI-compatible
403
+ * `/v1/embeddings` endpoint. No auth header is required for local Ollama.
404
+ */
405
+ async function createOllamaEmbeddingProvider(options) {
406
+ const cfg = options.config;
407
+ const remoteBaseUrl = options.remote?.baseUrl?.trim();
408
+ let ollamaBase;
409
+ if (remoteBaseUrl) ollamaBase = remoteBaseUrl.replace(/\/v1\/?$/, "").replace(/\/$/, "");
410
+ else ollamaBase = resolveOllamaBaseUrl(cfg);
411
+ let model = options.model?.trim();
412
+ if (!model) {
413
+ const probe = await probeOllamaEmbeddingModels(ollamaBase);
414
+ if (!probe || probe.models.length === 0) throw new Error(`No embedding models found on Ollama at ${ollamaBase}. Pull one with: ollama pull nomic-embed-text`);
415
+ model = probe.models[0];
416
+ }
417
+ const embeddingsUrl = `${ollamaBase}/v1/embeddings`;
418
+ const headers = { "Content-Type": "application/json" };
419
+ const apiKey = options.remote?.apiKey?.trim();
420
+ if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
421
+ const client = {
422
+ baseUrl: ollamaBase,
423
+ model
424
+ };
425
+ const embed = async (input) => {
426
+ if (input.length === 0) return [];
427
+ return await fetchRemoteEmbeddingVectors({
428
+ url: embeddingsUrl,
429
+ headers,
430
+ body: {
431
+ model,
432
+ input
433
+ },
434
+ errorPrefix: "ollama embeddings failed"
435
+ });
436
+ };
437
+ return {
438
+ provider: {
439
+ id: "ollama",
440
+ model,
441
+ embedQuery: async (text) => {
442
+ const [vec] = await embed([text]);
443
+ return vec ?? [];
444
+ },
445
+ embedBatch: embed
446
+ },
447
+ client
448
+ };
449
+ }
450
+
333
451
  //#endregion
334
452
  //#region src/memory/embeddings-remote-client.ts
335
453
  async function resolveRemoteEmbeddingBearerClient(params) {
@@ -354,21 +472,6 @@ async function resolveRemoteEmbeddingBearerClient(params) {
354
472
  };
355
473
  }
356
474
 
357
- //#endregion
358
- //#region src/memory/embeddings-remote-fetch.ts
359
- async function fetchRemoteEmbeddingVectors(params) {
360
- const res = await fetch(params.url, {
361
- method: "POST",
362
- headers: params.headers,
363
- body: JSON.stringify(params.body)
364
- });
365
- if (!res.ok) {
366
- const text = await res.text();
367
- throw new Error(`${params.errorPrefix}: ${res.status} ${text}`);
368
- }
369
- return ((await res.json()).data ?? []).map((entry) => entry.embedding ?? []);
370
- }
371
-
372
475
  //#endregion
373
476
  //#region src/memory/embeddings-openai.ts
374
477
  const DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
@@ -556,6 +659,13 @@ async function createEmbeddingProvider(options) {
556
659
  const fallback = options.fallback;
557
660
  const createProvider = async (id) => {
558
661
  if (id === "local") return { provider: await createLocalEmbeddingProvider(options) };
662
+ if (id === "ollama") {
663
+ const { provider, client } = await createOllamaEmbeddingProvider(options);
664
+ return {
665
+ provider,
666
+ ollama: client
667
+ };
668
+ }
559
669
  if (id === "gemini") {
560
670
  const { provider, client } = await createGeminiEmbeddingProvider(options);
561
671
  return {
@@ -588,6 +698,13 @@ async function createEmbeddingProvider(options) {
588
698
  } catch (err) {
589
699
  localError = formatLocalSetupError(err);
590
700
  }
701
+ try {
702
+ const probe = await probeOllamaEmbeddingModels(resolveOllamaBaseUrl(options.config));
703
+ if (probe && probe.models.length > 0) return {
704
+ ...await createProvider("ollama"),
705
+ requestedProvider
706
+ };
707
+ } catch {}
591
708
  for (const provider of REMOTE_EMBEDDING_PROVIDER_IDS) try {
592
709
  return {
593
710
  ...await createProvider(provider),
@@ -3742,4 +3859,4 @@ var MemoryIndexManager = class MemoryIndexManager extends MemoryManagerEmbedding
3742
3859
  };
3743
3860
 
3744
3861
  //#endregion
3745
- export { resolveMemorySearchConfig as n, manager_exports as t };
3862
+ export { resolveMemorySearchConfig as i, probeOllamaEmbeddingModels as n, resolveOllamaBaseUrl as r, manager_exports as t };
@@ -1,10 +1,12 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { Dt as theme, Et as isRich, Tt as colorize, Yt as resolveStateDir, _ as defaultRuntime, ct as shortenHomeInString, lt as shortenHomePath, o as createSubsystemLogger, ot as resolveUserPath, xt as setVerbose } from "./entry.js";
3
+ import { xt as resolveApiKeyForProvider } from "./auth-profiles-BD22fK4p.js";
3
4
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-D-jRCY0d.js";
4
- import { C as parseDurationMs, i as loadConfig } from "./config-amjzHiWZ.js";
5
+ import { C as parseDurationMs, i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot } from "./config-DehS9e5w.js";
5
6
  import { n as formatErrorMessage } from "./errors-Ba_ROWsq.js";
6
7
  import { s as resolveSessionTranscriptsDirForAgent } from "./paths-DNdWAq7b.js";
7
8
  import { t as splitShellArgs } from "./shell-argv-DjSugwgF.js";
9
+ import { n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-CPQ2pEj3.js";
8
10
  import { d as listMemoryFiles, f as normalizeExtraMemoryPaths } from "./sqlite-CQGamAhm.js";
9
11
  import { t as formatDocsLink } from "./links-DlWpl9Yv.js";
10
12
  import { r as withManager } from "./cli-utils-CCaEbxAz.js";
@@ -222,7 +224,7 @@ async function getMemorySearchManager(params) {
222
224
  const wrapper = new FallbackMemoryManager({
223
225
  primary,
224
226
  fallbackFactory: async () => {
225
- const { MemoryIndexManager } = await import("./manager-CYHgFXd8.js").then((n) => n.t);
227
+ const { MemoryIndexManager } = await import("./manager-CPQ2pEj3.js").then((n) => n.t);
226
228
  return await MemoryIndexManager.get(params);
227
229
  }
228
230
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -235,7 +237,7 @@ async function getMemorySearchManager(params) {
235
237
  }
236
238
  }
237
239
  try {
238
- const { MemoryIndexManager } = await import("./manager-CYHgFXd8.js").then((n) => n.t);
240
+ const { MemoryIndexManager } = await import("./manager-CPQ2pEj3.js").then((n) => n.t);
239
241
  return { manager: await MemoryIndexManager.get(params) };
240
242
  } catch (err) {
241
243
  return {
@@ -861,6 +863,207 @@ function registerMemoryCli(program) {
861
863
  }
862
864
  });
863
865
  });
866
+ memory.command("setup").description("Auto-detect and configure the best embedding provider").option("--agent <id>", "Agent id (default: default agent)").option("--dry-run", "Show what would be configured without writing", false).option("--verbose", "Verbose logging", false).action(async (opts) => {
867
+ setVerbose(Boolean(opts.verbose));
868
+ await runMemorySetup(opts);
869
+ });
870
+ }
871
+ async function detectEmbeddingProviders(cfg) {
872
+ const detected = [];
873
+ const ollamaProbe = await probeOllamaEmbeddingModels(resolveOllamaBaseUrl(cfg));
874
+ if (ollamaProbe && ollamaProbe.models.length > 0) detected.push({
875
+ id: "ollama",
876
+ model: ollamaProbe.models[0],
877
+ baseUrl: ollamaProbe.baseUrl,
878
+ reason: `Ollama at ${ollamaProbe.baseUrl} — ${ollamaProbe.models[0]}`
879
+ });
880
+ for (const remote of [
881
+ {
882
+ id: "openai",
883
+ envKey: "OPENAI_API_KEY",
884
+ defaultModel: "text-embedding-3-small"
885
+ },
886
+ {
887
+ id: "gemini",
888
+ envKey: "GEMINI_API_KEY",
889
+ defaultModel: "gemini-embedding-001"
890
+ },
891
+ {
892
+ id: "voyage",
893
+ envKey: "VOYAGE_API_KEY",
894
+ defaultModel: "voyage-4-large"
895
+ }
896
+ ]) {
897
+ const envValue = process.env[remote.envKey]?.trim();
898
+ let hasKey = Boolean(envValue);
899
+ if (!hasKey) try {
900
+ const resolved = await resolveApiKeyForProvider({
901
+ provider: remote.id,
902
+ cfg
903
+ });
904
+ hasKey = Boolean(resolved?.apiKey);
905
+ } catch {}
906
+ if (hasKey) detected.push({
907
+ id: remote.id,
908
+ model: remote.defaultModel,
909
+ reason: `${remote.id} — API key found`
910
+ });
911
+ }
912
+ return detected;
913
+ }
914
+ function setNestedValue(obj, path, value) {
915
+ let current = obj;
916
+ for (let i = 0; i < path.length - 1; i++) {
917
+ const key = path[i];
918
+ if (current[key] === void 0 || typeof current[key] !== "object" || current[key] === null) current[key] = {};
919
+ current = current[key];
920
+ }
921
+ current[path[path.length - 1]] = value;
922
+ }
923
+ async function runMemorySetup(opts) {
924
+ const rich = isRich();
925
+ const heading = (text) => colorize(rich, theme.heading, text);
926
+ const success = (text) => colorize(rich, theme.success, text);
927
+ const warn = (text) => colorize(rich, theme.warn, text);
928
+ const info = (text) => colorize(rich, theme.info, text);
929
+ const muted = (text) => colorize(rich, theme.muted, text);
930
+ const cfg = loadConfig();
931
+ const agentId = resolveAgent(cfg, opts.agent);
932
+ defaultRuntime.log(heading("Detecting embedding providers..."));
933
+ defaultRuntime.log("");
934
+ const detected = await detectEmbeddingProviders(cfg);
935
+ const ollamaBase = resolveOllamaBaseUrl(cfg);
936
+ const ollamaFound = detected.some((d) => d.id === "ollama");
937
+ const openaiFound = detected.some((d) => d.id === "openai");
938
+ const geminiFound = detected.some((d) => d.id === "gemini");
939
+ const voyageFound = detected.some((d) => d.id === "voyage");
940
+ if (ollamaFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "ollama").reason}`);
941
+ else defaultRuntime.log(` ${warn("✗")} Ollama — not reachable at ${ollamaBase} or no embedding models`);
942
+ if (openaiFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "openai").reason}`);
943
+ else defaultRuntime.log(` ${warn("✗")} OpenAI — no API key`);
944
+ if (geminiFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "gemini").reason}`);
945
+ else defaultRuntime.log(` ${warn("✗")} Gemini — no API key`);
946
+ if (voyageFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "voyage").reason}`);
947
+ else defaultRuntime.log(` ${warn("✗")} Voyage — no API key`);
948
+ defaultRuntime.log("");
949
+ if (detected.length === 0) {
950
+ defaultRuntime.error("No embedding providers detected.");
951
+ defaultRuntime.error("");
952
+ defaultRuntime.error("To fix, do one of:");
953
+ defaultRuntime.error(" - Install Ollama and pull an embedding model: ollama pull nomic-embed-text");
954
+ defaultRuntime.error(" - Set OPENAI_API_KEY environment variable");
955
+ defaultRuntime.error(" - Set GEMINI_API_KEY or VOYAGE_API_KEY environment variable");
956
+ process.exitCode = 1;
957
+ return;
958
+ }
959
+ const best = detected[0];
960
+ defaultRuntime.log(`${heading("Configuring:")} ${info(best.id)} (${best.model})`);
961
+ if (opts.dryRun) {
962
+ defaultRuntime.log(muted(" (dry run — no changes written)"));
963
+ const configProvider = best.id === "ollama" ? "openai" : best.id;
964
+ defaultRuntime.log(` provider = ${info(configProvider)}${best.id === "ollama" ? muted(" (via Ollama)") : ""}`);
965
+ defaultRuntime.log(` model = ${info(best.model)}`);
966
+ if (best.baseUrl) {
967
+ const configUrl = best.id === "ollama" ? `${best.baseUrl}/v1` : best.baseUrl;
968
+ defaultRuntime.log(` remote.baseUrl = ${info(configUrl)}`);
969
+ }
970
+ return;
971
+ }
972
+ const snapshot = await readConfigFileSnapshot();
973
+ const next = structuredClone(snapshot.resolved);
974
+ const memPath = [
975
+ "agents",
976
+ "defaults",
977
+ "memorySearch"
978
+ ];
979
+ setNestedValue(next, [...memPath, "enabled"], true);
980
+ setNestedValue(next, [...memPath, "sources"], ["memory", "sessions"]);
981
+ if (best.id === "ollama" && best.baseUrl) {
982
+ setNestedValue(next, [...memPath, "provider"], "openai");
983
+ setNestedValue(next, [...memPath, "model"], best.model);
984
+ setNestedValue(next, [
985
+ ...memPath,
986
+ "remote",
987
+ "baseUrl"
988
+ ], `${best.baseUrl}/v1`);
989
+ setNestedValue(next, [
990
+ ...memPath,
991
+ "remote",
992
+ "apiKey"
993
+ ], "ollama-local");
994
+ } else {
995
+ setNestedValue(next, [...memPath, "provider"], best.id);
996
+ setNestedValue(next, [...memPath, "model"], best.model);
997
+ if (best.baseUrl) setNestedValue(next, [
998
+ ...memPath,
999
+ "remote",
1000
+ "baseUrl"
1001
+ ], best.baseUrl);
1002
+ }
1003
+ await writeConfigFile(next);
1004
+ defaultRuntime.log(` ${success("✓")} Updated symi.json`);
1005
+ defaultRuntime.log("");
1006
+ defaultRuntime.log(heading("Indexing memory files..."));
1007
+ const freshCfg = loadConfig();
1008
+ let indexOk = false;
1009
+ await withMemoryManagerForAgent({
1010
+ cfg: freshCfg,
1011
+ agentId,
1012
+ run: async (manager) => {
1013
+ const syncFn = manager.sync ? manager.sync.bind(manager) : void 0;
1014
+ if (!syncFn) {
1015
+ defaultRuntime.log(warn(" Memory backend does not support indexing."));
1016
+ return;
1017
+ }
1018
+ try {
1019
+ await withProgressTotals({
1020
+ label: "Indexing memory…",
1021
+ total: 0
1022
+ }, async (update, progress) => {
1023
+ await syncFn({
1024
+ reason: "cli",
1025
+ force: true,
1026
+ progress: (syncUpdate) => {
1027
+ update({
1028
+ completed: syncUpdate.completed,
1029
+ total: syncUpdate.total,
1030
+ label: syncUpdate.label
1031
+ });
1032
+ if (syncUpdate.label) progress.setLabel(syncUpdate.label);
1033
+ }
1034
+ });
1035
+ });
1036
+ const status = manager.status();
1037
+ defaultRuntime.log(` ${success("✓")} ${status.files ?? 0} files → ${status.chunks ?? 0} chunks` + (status.vector?.dims ? ` (${status.vector.dims}-dim vectors)` : ""));
1038
+ indexOk = true;
1039
+ } catch (err) {
1040
+ defaultRuntime.error(` ${warn("✗")} Index failed: ${formatErrorMessage(err)}`);
1041
+ }
1042
+ }
1043
+ });
1044
+ if (!indexOk) {
1045
+ process.exitCode = 1;
1046
+ return;
1047
+ }
1048
+ defaultRuntime.log("");
1049
+ defaultRuntime.log(heading("Verifying search..."));
1050
+ await withMemoryManagerForAgent({
1051
+ cfg: freshCfg,
1052
+ agentId,
1053
+ run: async (manager) => {
1054
+ try {
1055
+ const results = await manager.search("test memory verification", { maxResults: 3 });
1056
+ defaultRuntime.log(` ${success("✓")} Test query returned ${results.length} results` + (results.length > 0 ? ` (score ${results[results.length - 1].score.toFixed(2)}–${results[0].score.toFixed(2)})` : ""));
1057
+ } catch (err) {
1058
+ defaultRuntime.log(` ${warn("✗")} Search verification failed: ${formatErrorMessage(err)}`);
1059
+ process.exitCode = 1;
1060
+ return;
1061
+ }
1062
+ }
1063
+ });
1064
+ defaultRuntime.log("");
1065
+ defaultRuntime.log(success("Memory system is fully operational."));
1066
+ defaultRuntime.log(muted("Restart the gateway to apply: systemctl --user restart symi-gateway"));
864
1067
  }
865
1068
 
866
1069
  //#endregion
@@ -3,11 +3,13 @@ import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
3
3
  import { B as theme, P as setVerbose, R as colorize, S as shortenHomePath, x as shortenHomeInString, y as resolveUserPath, z as isRich } from "./utils-B-0b9bGM.js";
4
4
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
6
- import { C as parseDurationMs, i as loadConfig } from "./config-Dgn_cL29.js";
6
+ import { q as resolveApiKeyForProvider } from "./model-selection-Csawd2_i.js";
7
+ import { C as parseDurationMs, i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot } from "./config-BLe0R4JX.js";
7
8
  import { n as formatErrorMessage } from "./errors-BF3TeRH2.js";
8
9
  import { s as resolveSessionTranscriptsDirForAgent } from "./paths-CyhzMxFA.js";
9
10
  import { d as listMemoryFiles, f as normalizeExtraMemoryPaths } from "./sqlite-Dx3J_aSE.js";
10
11
  import { t as splitShellArgs } from "./shell-argv-BbiXH_xm.js";
12
+ import { n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-Oiy1uHsu.js";
11
13
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
12
14
  import { r as withManager } from "./cli-utils-DN_hM6ov.js";
13
15
  import { t as formatHelpExamples } from "./help-format-B_-M23wP.js";
@@ -224,7 +226,7 @@ async function getMemorySearchManager(params) {
224
226
  const wrapper = new FallbackMemoryManager({
225
227
  primary,
226
228
  fallbackFactory: async () => {
227
- const { MemoryIndexManager } = await import("./manager-C_DoJrcP.js").then((n) => n.t);
229
+ const { MemoryIndexManager } = await import("./manager-Oiy1uHsu.js").then((n) => n.t);
228
230
  return await MemoryIndexManager.get(params);
229
231
  }
230
232
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -237,7 +239,7 @@ async function getMemorySearchManager(params) {
237
239
  }
238
240
  }
239
241
  try {
240
- const { MemoryIndexManager } = await import("./manager-C_DoJrcP.js").then((n) => n.t);
242
+ const { MemoryIndexManager } = await import("./manager-Oiy1uHsu.js").then((n) => n.t);
241
243
  return { manager: await MemoryIndexManager.get(params) };
242
244
  } catch (err) {
243
245
  return {
@@ -863,6 +865,207 @@ function registerMemoryCli(program) {
863
865
  }
864
866
  });
865
867
  });
868
+ memory.command("setup").description("Auto-detect and configure the best embedding provider").option("--agent <id>", "Agent id (default: default agent)").option("--dry-run", "Show what would be configured without writing", false).option("--verbose", "Verbose logging", false).action(async (opts) => {
869
+ setVerbose(Boolean(opts.verbose));
870
+ await runMemorySetup(opts);
871
+ });
872
+ }
873
+ async function detectEmbeddingProviders(cfg) {
874
+ const detected = [];
875
+ const ollamaProbe = await probeOllamaEmbeddingModels(resolveOllamaBaseUrl(cfg));
876
+ if (ollamaProbe && ollamaProbe.models.length > 0) detected.push({
877
+ id: "ollama",
878
+ model: ollamaProbe.models[0],
879
+ baseUrl: ollamaProbe.baseUrl,
880
+ reason: `Ollama at ${ollamaProbe.baseUrl} — ${ollamaProbe.models[0]}`
881
+ });
882
+ for (const remote of [
883
+ {
884
+ id: "openai",
885
+ envKey: "OPENAI_API_KEY",
886
+ defaultModel: "text-embedding-3-small"
887
+ },
888
+ {
889
+ id: "gemini",
890
+ envKey: "GEMINI_API_KEY",
891
+ defaultModel: "gemini-embedding-001"
892
+ },
893
+ {
894
+ id: "voyage",
895
+ envKey: "VOYAGE_API_KEY",
896
+ defaultModel: "voyage-4-large"
897
+ }
898
+ ]) {
899
+ const envValue = process.env[remote.envKey]?.trim();
900
+ let hasKey = Boolean(envValue);
901
+ if (!hasKey) try {
902
+ const resolved = await resolveApiKeyForProvider({
903
+ provider: remote.id,
904
+ cfg
905
+ });
906
+ hasKey = Boolean(resolved?.apiKey);
907
+ } catch {}
908
+ if (hasKey) detected.push({
909
+ id: remote.id,
910
+ model: remote.defaultModel,
911
+ reason: `${remote.id} — API key found`
912
+ });
913
+ }
914
+ return detected;
915
+ }
916
+ function setNestedValue(obj, path, value) {
917
+ let current = obj;
918
+ for (let i = 0; i < path.length - 1; i++) {
919
+ const key = path[i];
920
+ if (current[key] === void 0 || typeof current[key] !== "object" || current[key] === null) current[key] = {};
921
+ current = current[key];
922
+ }
923
+ current[path[path.length - 1]] = value;
924
+ }
925
+ async function runMemorySetup(opts) {
926
+ const rich = isRich();
927
+ const heading = (text) => colorize(rich, theme.heading, text);
928
+ const success = (text) => colorize(rich, theme.success, text);
929
+ const warn = (text) => colorize(rich, theme.warn, text);
930
+ const info = (text) => colorize(rich, theme.info, text);
931
+ const muted = (text) => colorize(rich, theme.muted, text);
932
+ const cfg = loadConfig();
933
+ const agentId = resolveAgent(cfg, opts.agent);
934
+ defaultRuntime.log(heading("Detecting embedding providers..."));
935
+ defaultRuntime.log("");
936
+ const detected = await detectEmbeddingProviders(cfg);
937
+ const ollamaBase = resolveOllamaBaseUrl(cfg);
938
+ const ollamaFound = detected.some((d) => d.id === "ollama");
939
+ const openaiFound = detected.some((d) => d.id === "openai");
940
+ const geminiFound = detected.some((d) => d.id === "gemini");
941
+ const voyageFound = detected.some((d) => d.id === "voyage");
942
+ if (ollamaFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "ollama").reason}`);
943
+ else defaultRuntime.log(` ${warn("✗")} Ollama — not reachable at ${ollamaBase} or no embedding models`);
944
+ if (openaiFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "openai").reason}`);
945
+ else defaultRuntime.log(` ${warn("✗")} OpenAI — no API key`);
946
+ if (geminiFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "gemini").reason}`);
947
+ else defaultRuntime.log(` ${warn("✗")} Gemini — no API key`);
948
+ if (voyageFound) defaultRuntime.log(` ${success("✓")} ${detected.find((d) => d.id === "voyage").reason}`);
949
+ else defaultRuntime.log(` ${warn("✗")} Voyage — no API key`);
950
+ defaultRuntime.log("");
951
+ if (detected.length === 0) {
952
+ defaultRuntime.error("No embedding providers detected.");
953
+ defaultRuntime.error("");
954
+ defaultRuntime.error("To fix, do one of:");
955
+ defaultRuntime.error(" - Install Ollama and pull an embedding model: ollama pull nomic-embed-text");
956
+ defaultRuntime.error(" - Set OPENAI_API_KEY environment variable");
957
+ defaultRuntime.error(" - Set GEMINI_API_KEY or VOYAGE_API_KEY environment variable");
958
+ process.exitCode = 1;
959
+ return;
960
+ }
961
+ const best = detected[0];
962
+ defaultRuntime.log(`${heading("Configuring:")} ${info(best.id)} (${best.model})`);
963
+ if (opts.dryRun) {
964
+ defaultRuntime.log(muted(" (dry run — no changes written)"));
965
+ const configProvider = best.id === "ollama" ? "openai" : best.id;
966
+ defaultRuntime.log(` provider = ${info(configProvider)}${best.id === "ollama" ? muted(" (via Ollama)") : ""}`);
967
+ defaultRuntime.log(` model = ${info(best.model)}`);
968
+ if (best.baseUrl) {
969
+ const configUrl = best.id === "ollama" ? `${best.baseUrl}/v1` : best.baseUrl;
970
+ defaultRuntime.log(` remote.baseUrl = ${info(configUrl)}`);
971
+ }
972
+ return;
973
+ }
974
+ const snapshot = await readConfigFileSnapshot();
975
+ const next = structuredClone(snapshot.resolved);
976
+ const memPath = [
977
+ "agents",
978
+ "defaults",
979
+ "memorySearch"
980
+ ];
981
+ setNestedValue(next, [...memPath, "enabled"], true);
982
+ setNestedValue(next, [...memPath, "sources"], ["memory", "sessions"]);
983
+ if (best.id === "ollama" && best.baseUrl) {
984
+ setNestedValue(next, [...memPath, "provider"], "openai");
985
+ setNestedValue(next, [...memPath, "model"], best.model);
986
+ setNestedValue(next, [
987
+ ...memPath,
988
+ "remote",
989
+ "baseUrl"
990
+ ], `${best.baseUrl}/v1`);
991
+ setNestedValue(next, [
992
+ ...memPath,
993
+ "remote",
994
+ "apiKey"
995
+ ], "ollama-local");
996
+ } else {
997
+ setNestedValue(next, [...memPath, "provider"], best.id);
998
+ setNestedValue(next, [...memPath, "model"], best.model);
999
+ if (best.baseUrl) setNestedValue(next, [
1000
+ ...memPath,
1001
+ "remote",
1002
+ "baseUrl"
1003
+ ], best.baseUrl);
1004
+ }
1005
+ await writeConfigFile(next);
1006
+ defaultRuntime.log(` ${success("✓")} Updated symi.json`);
1007
+ defaultRuntime.log("");
1008
+ defaultRuntime.log(heading("Indexing memory files..."));
1009
+ const freshCfg = loadConfig();
1010
+ let indexOk = false;
1011
+ await withMemoryManagerForAgent({
1012
+ cfg: freshCfg,
1013
+ agentId,
1014
+ run: async (manager) => {
1015
+ const syncFn = manager.sync ? manager.sync.bind(manager) : void 0;
1016
+ if (!syncFn) {
1017
+ defaultRuntime.log(warn(" Memory backend does not support indexing."));
1018
+ return;
1019
+ }
1020
+ try {
1021
+ await withProgressTotals({
1022
+ label: "Indexing memory…",
1023
+ total: 0
1024
+ }, async (update, progress) => {
1025
+ await syncFn({
1026
+ reason: "cli",
1027
+ force: true,
1028
+ progress: (syncUpdate) => {
1029
+ update({
1030
+ completed: syncUpdate.completed,
1031
+ total: syncUpdate.total,
1032
+ label: syncUpdate.label
1033
+ });
1034
+ if (syncUpdate.label) progress.setLabel(syncUpdate.label);
1035
+ }
1036
+ });
1037
+ });
1038
+ const status = manager.status();
1039
+ defaultRuntime.log(` ${success("✓")} ${status.files ?? 0} files → ${status.chunks ?? 0} chunks` + (status.vector?.dims ? ` (${status.vector.dims}-dim vectors)` : ""));
1040
+ indexOk = true;
1041
+ } catch (err) {
1042
+ defaultRuntime.error(` ${warn("✗")} Index failed: ${formatErrorMessage(err)}`);
1043
+ }
1044
+ }
1045
+ });
1046
+ if (!indexOk) {
1047
+ process.exitCode = 1;
1048
+ return;
1049
+ }
1050
+ defaultRuntime.log("");
1051
+ defaultRuntime.log(heading("Verifying search..."));
1052
+ await withMemoryManagerForAgent({
1053
+ cfg: freshCfg,
1054
+ agentId,
1055
+ run: async (manager) => {
1056
+ try {
1057
+ const results = await manager.search("test memory verification", { maxResults: 3 });
1058
+ defaultRuntime.log(` ${success("✓")} Test query returned ${results.length} results` + (results.length > 0 ? ` (score ${results[results.length - 1].score.toFixed(2)}–${results[0].score.toFixed(2)})` : ""));
1059
+ } catch (err) {
1060
+ defaultRuntime.log(` ${warn("✗")} Search verification failed: ${formatErrorMessage(err)}`);
1061
+ process.exitCode = 1;
1062
+ return;
1063
+ }
1064
+ }
1065
+ });
1066
+ defaultRuntime.log("");
1067
+ defaultRuntime.log(success("Memory system is fully operational."));
1068
+ defaultRuntime.log(muted("Restart the gateway to apply: systemctl --user restart symi-gateway"));
866
1069
  }
867
1070
 
868
1071
  //#endregion
@@ -1,6 +1,6 @@
1
1
  import { Ft as resolveSymiAgentDir } from "./model-selection-Csawd2_i.js";
2
- import { i as loadConfig } from "./config-Dgn_cL29.js";
3
- import { t as ensureSymiModelsJson } from "./models-config-u4va9_AO.js";
2
+ import { i as loadConfig } from "./config-BLe0R4JX.js";
3
+ import { t as ensureSymiModelsJson } from "./models-config-BH6-rmtt.js";
4
4
 
5
5
  //#region src/agents/model-catalog.ts
6
6
  let modelCatalogPromise = null;
@@ -37,7 +37,7 @@ async function loadModelCatalog(params) {
37
37
  });
38
38
  try {
39
39
  await ensureSymiModelsJson(params?.config ?? loadConfig());
40
- await (await import("./pi-auth-json-DuUL9qfI.js")).ensurePiAuthJsonFromAuthProfiles(resolveSymiAgentDir());
40
+ await (await import("./pi-auth-json-Do26xypW.js")).ensurePiAuthJsonFromAuthProfiles(resolveSymiAgentDir());
41
41
  const piSdk = await importPiSdk();
42
42
  const agentDir = resolveSymiAgentDir();
43
43
  const { join } = await import("node:path");