@xopcai/xopc 0.0.115 → 0.0.117

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 (578) hide show
  1. package/README.md +26 -10
  2. package/README.zh-CN.md +26 -10
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.d.ts +6 -0
  5. package/dist/extensions/demo-memory/src/index.js +132 -0
  6. package/dist/extensions/demo-memory/src/index.js.map +1 -0
  7. package/dist/extensions/demo-memory/xopc.extension.json +15 -0
  8. package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
  9. package/dist/extensions/telegram/src/command-handler.js +1 -2
  10. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  11. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  14. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
  15. package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
  16. package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
  17. package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
  21. package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
  22. package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
  23. package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
  24. package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
  25. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
  26. package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
  28. package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
  29. package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
  30. package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
  31. package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
  34. package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
  35. package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
  36. package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
  37. package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
  39. package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
  40. package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
  41. package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
  42. package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
  43. package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
  44. package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
  45. package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
  46. package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
  47. package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
  49. package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
  50. package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
  52. package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
  53. package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
  54. package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
  55. package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
  56. package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
  58. package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
  59. package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
  61. package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
  62. package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
  63. package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
  64. package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
  67. package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
  68. package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
  69. package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
  70. package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
  71. package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
  72. package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
  73. package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
  74. package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
  75. package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
  76. package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
  77. package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
  78. package/dist/gateway/static/root/index.html +5 -5
  79. package/dist/package.js +1 -1
  80. package/dist/src/agent/agent-manager.d.ts +1 -1
  81. package/dist/src/agent/agent-manager.js +7 -8
  82. package/dist/src/agent/agent-manager.js.map +1 -1
  83. package/dist/src/agent/agent-scope.js +6 -8
  84. package/dist/src/agent/agent-scope.js.map +1 -1
  85. package/dist/src/agent/background-review/coordinator.js +0 -1
  86. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  87. package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
  88. package/dist/src/agent/background-review/run-background-review.js +2 -4
  89. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  90. package/dist/src/agent/background-review/settings.js +8 -7
  91. package/dist/src/agent/background-review/settings.js.map +1 -1
  92. package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
  93. package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
  94. package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
  95. package/dist/src/agent/context/workspace-seed.js +1 -1
  96. package/dist/src/agent/embedded/run-for-session.js +1 -1
  97. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  98. package/dist/src/agent/fallback/candidates.js +6 -3
  99. package/dist/src/agent/fallback/candidates.js.map +1 -1
  100. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  101. package/dist/src/agent/goals/checklist-judge.js +1 -1
  102. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  103. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
  104. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  105. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  106. package/dist/src/agent/goals/post-turn.js +8 -1
  107. package/dist/src/agent/goals/post-turn.js.map +1 -1
  108. package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
  109. package/dist/src/agent/image/generation/runtime.js +1 -1
  110. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  111. package/dist/src/agent/image/image-helpers.d.ts +1 -1
  112. package/dist/src/agent/image/image-helpers.js +4 -17
  113. package/dist/src/agent/image/image-helpers.js.map +1 -1
  114. package/dist/src/agent/image/image-model-fallback.js +1 -1
  115. package/dist/src/agent/image/image-model-fallback.js.map +1 -1
  116. package/dist/src/agent/image/inbound-image-handling.js +1 -1
  117. package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
  118. package/dist/src/agent/image/tool-model-config.d.ts +1 -1
  119. package/dist/src/agent/image/tool-model-config.js +2 -2
  120. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  121. package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
  122. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  123. package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
  124. package/dist/src/agent/image/understanding/provider-registry.js +16 -2
  125. package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
  126. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
  127. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
  128. package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
  129. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  130. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
  132. package/dist/src/agent/memory/builtin-memory-store.js +4 -0
  133. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  134. package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
  135. package/dist/src/agent/memory/builtin-provider.js +261 -11
  136. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  137. package/dist/src/agent/memory/context-assembler.d.ts +10 -0
  138. package/dist/src/agent/memory/context-assembler.js +26 -0
  139. package/dist/src/agent/memory/context-assembler.js.map +1 -0
  140. package/dist/src/agent/memory/create-memory-manager.js +25 -7
  141. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  142. package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
  143. package/dist/src/agent/memory/dreaming/config.js +8 -8
  144. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  145. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
  146. package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
  147. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  148. package/dist/src/agent/memory/index.d.ts +1 -0
  149. package/dist/src/agent/memory/index.js +4 -3
  150. package/dist/src/agent/memory/inject-prefetch.js +6 -2
  151. package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
  152. package/dist/src/agent/memory/manager.d.ts +37 -1
  153. package/dist/src/agent/memory/manager.js +332 -40
  154. package/dist/src/agent/memory/manager.js.map +1 -1
  155. package/dist/src/agent/memory/memory-config.js +12 -15
  156. package/dist/src/agent/memory/memory-config.js.map +1 -1
  157. package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
  158. package/dist/src/agent/memory/plugin-discovery.js +97 -31
  159. package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
  160. package/dist/src/agent/memory/provider.d.ts +20 -15
  161. package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
  162. package/dist/src/agent/memory/stub-memory-provider.js +20 -3
  163. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  164. package/dist/src/agent/memory/types.d.ts +136 -0
  165. package/dist/src/agent/models/manager.d.ts +1 -1
  166. package/dist/src/agent/models/manager.js +1 -1
  167. package/dist/src/agent/models/manager.js.map +1 -1
  168. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
  169. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
  170. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  171. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
  172. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  173. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  174. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
  175. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
  176. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
  177. package/dist/src/agent/reply/post-compaction-context.js +11 -6
  178. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  179. package/dist/src/agent/reply/startup-context.js +8 -9
  180. package/dist/src/agent/reply/startup-context.js.map +1 -1
  181. package/dist/src/agent/service/process-direct-streaming.js +1 -4
  182. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  183. package/dist/src/agent/service/session-context-report.js +1 -1
  184. package/dist/src/agent/service/session-context-report.js.map +1 -1
  185. package/dist/src/agent/service.js +21 -25
  186. package/dist/src/agent/service.js.map +1 -1
  187. package/dist/src/agent/service.types.d.ts +1 -2
  188. package/dist/src/agent/session/session-hydrator.js +1 -2
  189. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  190. package/dist/src/agent/session/session-inspector.d.ts +1 -1
  191. package/dist/src/agent/session/session-inspector.js +9 -14
  192. package/dist/src/agent/session/session-inspector.js.map +1 -1
  193. package/dist/src/agent/skills/hub-pull.js +1 -1
  194. package/dist/src/agent/starter-agents.d.ts +1 -3
  195. package/dist/src/agent/starter-agents.js +13 -21
  196. package/dist/src/agent/starter-agents.js.map +1 -1
  197. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
  198. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  199. package/dist/src/agent/tools/composio-tool.d.ts +8 -0
  200. package/dist/src/agent/tools/composio-tool.js +46 -0
  201. package/dist/src/agent/tools/composio-tool.js.map +1 -0
  202. package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
  203. package/dist/src/agent/tools/curated-memory-tool.js +20 -16
  204. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  205. package/dist/src/agent/tools/factory.d.ts +0 -4
  206. package/dist/src/agent/tools/factory.js +32 -66
  207. package/dist/src/agent/tools/factory.js.map +1 -1
  208. package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
  209. package/dist/src/agent/tools/image-generate-tool.js +19 -14
  210. package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
  211. package/dist/src/agent/tools/image-tool.js +1 -3
  212. package/dist/src/agent/tools/image-tool.js.map +1 -1
  213. package/dist/src/agent/tools/index.d.ts +1 -0
  214. package/dist/src/agent/tools/index.js +2 -1
  215. package/dist/src/agent/tools/memory-tool.d.ts +2 -2
  216. package/dist/src/agent/tools/memory-tool.js +39 -14
  217. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  218. package/dist/src/agent/tools/session-search-tool.js +1 -3
  219. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  220. package/dist/src/agent/tools/web-extract.js +6 -5
  221. package/dist/src/agent/tools/web-extract.js.map +1 -1
  222. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  223. package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
  224. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  225. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
  226. package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
  227. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
  228. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
  229. package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
  230. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
  231. package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
  232. package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
  233. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
  234. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
  235. package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
  236. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
  237. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  238. package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
  239. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  240. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
  241. package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
  242. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
  243. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
  244. package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
  245. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
  246. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
  247. package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
  248. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
  249. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
  250. package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
  251. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
  252. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  253. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
  254. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  255. package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
  256. package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
  257. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
  258. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  259. package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
  260. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  261. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  262. package/dist/src/agent/workflow/builtins/release-check.js +10 -1
  263. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  264. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  265. package/dist/src/agent/workflow/builtins/research.js +16 -2
  266. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  267. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
  268. package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
  269. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
  270. package/dist/src/agent/workflow/subagent-runner.js +1 -3
  271. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  272. package/dist/src/agent-manifest/index.d.ts +4 -0
  273. package/dist/src/agent-manifest/index.js +10 -0
  274. package/dist/src/agent-manifest/index.js.map +1 -0
  275. package/dist/src/agent-manifest/prompt.d.ts +2 -0
  276. package/dist/src/agent-manifest/prompt.js +57 -0
  277. package/dist/src/agent-manifest/prompt.js.map +1 -0
  278. package/dist/src/agent-manifest/resolver.d.ts +11 -0
  279. package/dist/src/agent-manifest/resolver.js +93 -0
  280. package/dist/src/agent-manifest/resolver.js.map +1 -0
  281. package/dist/src/agent-manifest/schema.d.ts +778 -0
  282. package/dist/src/agent-manifest/schema.js +267 -0
  283. package/dist/src/agent-manifest/schema.js.map +1 -0
  284. package/dist/src/agent-manifest/validator.d.ts +24 -0
  285. package/dist/src/agent-manifest/validator.js +87 -0
  286. package/dist/src/agent-manifest/validator.js.map +1 -0
  287. package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
  288. package/dist/src/agent-runtime/boundary-guard.js +23 -0
  289. package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
  290. package/dist/src/agent-runtime/index.d.ts +7 -0
  291. package/dist/src/agent-runtime/index.js +8 -0
  292. package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
  293. package/dist/src/agent-runtime/memory-runtime.js +50 -0
  294. package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
  295. package/dist/src/agent-runtime/model-router.d.ts +11 -0
  296. package/dist/src/agent-runtime/model-router.js +16 -0
  297. package/dist/src/agent-runtime/model-router.js.map +1 -0
  298. package/dist/src/agent-runtime/run-trace.d.ts +27 -0
  299. package/dist/src/agent-runtime/run-trace.js +53 -0
  300. package/dist/src/agent-runtime/run-trace.js.map +1 -0
  301. package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
  302. package/dist/src/agent-runtime/runtime-profile.js +44 -0
  303. package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
  304. package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
  305. package/dist/src/agent-runtime/tool-registry.js +52 -0
  306. package/dist/src/agent-runtime/tool-registry.js.map +1 -0
  307. package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
  308. package/dist/src/agent-runtime/workflow-runtime.js +34 -0
  309. package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
  310. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  311. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  312. package/dist/src/browser/actions/registry.js +5 -8
  313. package/dist/src/browser/actions/registry.js.map +1 -1
  314. package/dist/src/browser/backend-from-config.d.ts +1 -1
  315. package/dist/src/browser/backend-from-config.js +50 -71
  316. package/dist/src/browser/backend-from-config.js.map +1 -1
  317. package/dist/src/browser/browser-command-timeout.d.ts +0 -1
  318. package/dist/src/browser/browser-command-timeout.js +3 -7
  319. package/dist/src/browser/browser-command-timeout.js.map +1 -1
  320. package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
  321. package/dist/src/browser/providers/browser-ext-install.js +3 -8
  322. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  323. package/dist/src/browser/readiness.js +16 -16
  324. package/dist/src/browser/readiness.js.map +1 -1
  325. package/dist/src/browser/schemas.js +1 -1
  326. package/dist/src/browser/schemas.js.map +1 -1
  327. package/dist/src/chat-commands/builtins/config.js +4 -4
  328. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  329. package/dist/src/chat-commands/builtins/thinking.js +16 -42
  330. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  331. package/dist/src/chat-commands/config-paths.js +1 -1
  332. package/dist/src/chat-commands/config-paths.js.map +1 -1
  333. package/dist/src/chat-commands/context.js +3 -4
  334. package/dist/src/chat-commands/context.js.map +1 -1
  335. package/dist/src/cli/command-manifest.js +1 -1
  336. package/dist/src/cli/command-manifest.js.map +1 -1
  337. package/dist/src/cli/commands/agent.js +3 -1
  338. package/dist/src/cli/commands/agent.js.map +1 -1
  339. package/dist/src/cli/commands/agents.js +3 -6
  340. package/dist/src/cli/commands/agents.js.map +1 -1
  341. package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
  342. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  343. package/dist/src/cli/commands/config.js +5 -5
  344. package/dist/src/cli/commands/config.js.map +1 -1
  345. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  346. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
  347. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  348. package/dist/src/cli/commands/goal.js +1 -1
  349. package/dist/src/cli/commands/image.js +13 -372
  350. package/dist/src/cli/commands/image.js.map +1 -1
  351. package/dist/src/cli/commands/models.js +26 -10
  352. package/dist/src/cli/commands/models.js.map +1 -1
  353. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  354. package/dist/src/cli/commands/onboard/model.js +20 -22
  355. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  356. package/dist/src/cli/commands/onboard.js +1 -1
  357. package/dist/src/cli/commands/onboard.js.map +1 -1
  358. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
  359. package/dist/src/cli/utils/init-workspace-core.js +7 -6
  360. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  361. package/dist/src/commands/agents.config.d.ts +0 -1
  362. package/dist/src/commands/agents.config.js +66 -12
  363. package/dist/src/commands/agents.config.js.map +1 -1
  364. package/dist/src/config/agent-profile.d.ts +5 -17
  365. package/dist/src/config/agent-profile.js +31 -64
  366. package/dist/src/config/agent-profile.js.map +1 -1
  367. package/dist/src/config/agent-typed-models.d.ts +1 -1
  368. package/dist/src/config/agent-typed-models.js +0 -1
  369. package/dist/src/config/agent-typed-models.js.map +1 -1
  370. package/dist/src/config/index.js +3 -3
  371. package/dist/src/config/integration.d.ts +1 -1
  372. package/dist/src/config/reload.js +1 -1
  373. package/dist/src/config/reload.js.map +1 -1
  374. package/dist/src/config/rules.js +6 -56
  375. package/dist/src/config/rules.js.map +1 -1
  376. package/dist/src/config/schema.d.ts +925 -781
  377. package/dist/src/config/schema.js +157 -424
  378. package/dist/src/config/schema.js.map +1 -1
  379. package/dist/src/connectors/composio-triggers.d.ts +10 -0
  380. package/dist/src/connectors/composio-triggers.js +32 -0
  381. package/dist/src/connectors/composio-triggers.js.map +1 -0
  382. package/dist/src/connectors/composio.d.ts +54 -0
  383. package/dist/src/connectors/composio.js +334 -0
  384. package/dist/src/connectors/composio.js.map +1 -0
  385. package/dist/src/connectors/health.js +16 -1
  386. package/dist/src/connectors/health.js.map +1 -1
  387. package/dist/src/connectors/install.d.ts +2 -1
  388. package/dist/src/connectors/install.js +50 -13
  389. package/dist/src/connectors/install.js.map +1 -1
  390. package/dist/src/connectors/instances.js +57 -6
  391. package/dist/src/connectors/instances.js.map +1 -1
  392. package/dist/src/connectors/lifecycle.d.ts +3 -0
  393. package/dist/src/connectors/lifecycle.js +23 -0
  394. package/dist/src/connectors/lifecycle.js.map +1 -0
  395. package/dist/src/connectors/materialize.js +2 -1
  396. package/dist/src/connectors/materialize.js.map +1 -1
  397. package/dist/src/connectors/providers.d.ts +1 -0
  398. package/dist/src/connectors/providers.js +10 -2
  399. package/dist/src/connectors/providers.js.map +1 -1
  400. package/dist/src/connectors/registries/modelscope.d.ts +2 -0
  401. package/dist/src/connectors/registries/modelscope.js +205 -0
  402. package/dist/src/connectors/registries/modelscope.js.map +1 -0
  403. package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
  404. package/dist/src/connectors/registries/official-mcp.js +142 -0
  405. package/dist/src/connectors/registries/official-mcp.js.map +1 -0
  406. package/dist/src/connectors/registries/search.d.ts +12 -0
  407. package/dist/src/connectors/registries/search.js +89 -0
  408. package/dist/src/connectors/registries/search.js.map +1 -0
  409. package/dist/src/connectors/registries/smithery.d.ts +2 -0
  410. package/dist/src/connectors/registries/smithery.js +98 -0
  411. package/dist/src/connectors/registries/smithery.js.map +1 -0
  412. package/dist/src/connectors/registries/types.d.ts +20 -0
  413. package/dist/src/connectors/registries/types.js +1 -0
  414. package/dist/src/connectors/secret-store.js +4 -2
  415. package/dist/src/connectors/secret-store.js.map +1 -1
  416. package/dist/src/connectors/setup-secrets.d.ts +15 -0
  417. package/dist/src/connectors/setup-secrets.js +64 -0
  418. package/dist/src/connectors/setup-secrets.js.map +1 -0
  419. package/dist/src/connectors/supervisor.d.ts +15 -0
  420. package/dist/src/connectors/supervisor.js +73 -0
  421. package/dist/src/connectors/supervisor.js.map +1 -0
  422. package/dist/src/connectors/types.d.ts +27 -3
  423. package/dist/src/connectors/usage.js +6 -1
  424. package/dist/src/connectors/usage.js.map +1 -1
  425. package/dist/src/cron/index.js +1 -1
  426. package/dist/src/cron/service.js +1 -1
  427. package/dist/src/cron/validation.d.ts +3 -3
  428. package/dist/src/extensions/activation-context.js +13 -7
  429. package/dist/src/extensions/activation-context.js.map +1 -1
  430. package/dist/src/gateway/agents-admin.d.ts +17 -18
  431. package/dist/src/gateway/agents-admin.js +123 -88
  432. package/dist/src/gateway/agents-admin.js.map +1 -1
  433. package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
  434. package/dist/src/gateway/capability-presets-admin.js +214 -0
  435. package/dist/src/gateway/capability-presets-admin.js.map +1 -0
  436. package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
  437. package/dist/src/gateway/hono/lib/agent-model.js +1 -1
  438. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  439. package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
  440. package/dist/src/gateway/hono/lib/config-payload.js +13 -37
  441. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/agents.js +56 -33
  443. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/browser.js +8 -15
  445. package/dist/src/gateway/hono/routes/browser.js.map +1 -1
  446. package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
  447. package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
  448. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
  449. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
  450. package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
  451. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  452. package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
  453. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  454. package/dist/src/gateway/hono/routes/config.js +1 -1
  455. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  456. package/dist/src/gateway/hono/routes/connectors.js +230 -3
  457. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  458. package/dist/src/gateway/hono/routes/dreaming.js +7 -0
  459. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  460. package/dist/src/gateway/hono/routes/goals.js +52 -5
  461. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  462. package/dist/src/gateway/hono/routes/index.js +2 -0
  463. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  464. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  465. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  466. package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
  467. package/dist/src/gateway/hono/routes/memory.js +290 -0
  468. package/dist/src/gateway/hono/routes/memory.js.map +1 -0
  469. package/dist/src/gateway/hono/routes/voice.js +14 -1
  470. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  471. package/dist/src/gateway/hono/sse.js.map +1 -1
  472. package/dist/src/gateway/service/agent-runner.d.ts +5 -12
  473. package/dist/src/gateway/service/agent-runner.js +8 -8
  474. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  475. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
  476. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  477. package/dist/src/gateway/service.d.ts +2 -2
  478. package/dist/src/gateway/service.js +20 -16
  479. package/dist/src/gateway/service.js.map +1 -1
  480. package/dist/src/gateway/user-turn-input.d.ts +18 -0
  481. package/dist/src/gateway/user-turn-input.js +16 -0
  482. package/dist/src/gateway/user-turn-input.js.map +1 -0
  483. package/dist/src/goals/goal-queue-store.d.ts +2 -1
  484. package/dist/src/goals/goal-queue-store.js +2 -2
  485. package/dist/src/goals/goal-queue-store.js.map +1 -1
  486. package/dist/src/goals/goal-queue-types.d.ts +4 -3
  487. package/dist/src/goals/goal-runner.js +25 -3
  488. package/dist/src/goals/goal-runner.js.map +1 -1
  489. package/dist/src/goals/goal-service.d.ts +6 -1
  490. package/dist/src/goals/goal-service.js +9 -2
  491. package/dist/src/goals/goal-service.js.map +1 -1
  492. package/dist/src/goals/goal-store.d.ts +7 -1
  493. package/dist/src/goals/goal-store.js +42 -0
  494. package/dist/src/goals/goal-store.js.map +1 -1
  495. package/dist/src/goals/types.d.ts +10 -0
  496. package/dist/src/notes/agent-context.js +2 -2
  497. package/dist/src/providers/index.d.ts +2 -2
  498. package/dist/src/providers/index.js +10 -14
  499. package/dist/src/providers/index.js.map +1 -1
  500. package/dist/src/session/index.js +1 -1
  501. package/dist/src/session/session-workspace.js +7 -2
  502. package/dist/src/session/session-workspace.js.map +1 -1
  503. package/dist/src/session/store.js +5 -0
  504. package/dist/src/session/store.js.map +1 -1
  505. package/dist/src/session/thinking-resolve.d.ts +1 -1
  506. package/dist/src/session/thinking-resolve.js +1 -1
  507. package/dist/src/session/thinking-resolve.js.map +1 -1
  508. package/dist/src/storage/sqlite/connection.js +1 -1
  509. package/dist/src/storage/sqlite/index.d.ts +1 -0
  510. package/dist/src/storage/sqlite/index.js +2 -1
  511. package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
  512. package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
  513. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
  514. package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
  515. package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
  516. package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
  517. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  518. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  519. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  520. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  521. package/dist/src/storage/sqlite/schema.js +3 -3
  522. package/dist/src/storage/sqlite/schema.sql +95 -0
  523. package/dist/src/tui/backends/embedded-backend.js +6 -4
  524. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  525. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  526. package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
  527. package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
  528. package/dist/src/voice/tts/providers/edge-speech.js +14 -2
  529. package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
  530. package/dist/src/voice/tts/speak-core.js +3 -3
  531. package/dist/src/voice/tts/speak-core.js.map +1 -1
  532. package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
  533. package/dist/src/voice/tts/types.js +1 -1
  534. package/dist/src/voice/tts/types.js.map +1 -1
  535. package/dist/src/workflows/domain/result.d.ts +0 -1
  536. package/dist/src/workflows/engine/workflow-engine.js +7 -23
  537. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  538. package/dist/src/workflows/service/workflow-run-service.js +3 -4
  539. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  540. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  541. package/package.json +4 -3
  542. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
  543. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
  544. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
  545. package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
  546. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
  547. package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
  548. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
  549. package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
  550. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
  551. package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
  552. package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
  553. package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
  554. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
  555. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
  556. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
  557. package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
  558. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
  559. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
  560. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
  561. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
  562. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
  563. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
  564. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
  565. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
  566. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
  567. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
  568. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
  569. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
  570. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
  571. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
  572. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
  573. package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
  574. package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
  575. package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
  576. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
  577. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
  578. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
package/README.md CHANGED
@@ -6,8 +6,9 @@
6
6
  <h1 align="center"><a href="https://xopc.ai">xopc</a></h1>
7
7
 
8
8
  <p align="center">
9
- <strong>Goal Loop OS. Long-term AI in one loop.</strong><br />
10
- A local-first AI assistant that keeps long-term goals moving across terminal, web, desktop, mobile app, and messengers.
9
+ <strong>Turn goals into loops.</strong><br />
10
+ Keep what matters moving.<br />
11
+ XOPC is a local-first AI system that remembers context, coordinates AI, and sustains long-term progress.
11
12
  </p>
12
13
 
13
14
  <p align="center">
@@ -34,7 +35,7 @@
34
35
 
35
36
  ## Built for
36
37
 
37
- - **Long-running projects** — keep direction, next actions, feedback, and recalibration in one loop instead of losing context between chats.
38
+ - **Long-running projects** — turn goals into durable loops: context, next actions, feedback, and recalibration stay connected across chats.
38
39
  - **One-person companies and solo builders** — use the same assistant from CLI, TUI, Web, Desktop, Telegram, WeChat, and Feishu/Lark.
39
40
  - **Local-first AI workflows** — bring your own keys, mix cloud/local models, add skills/extensions, and keep data under **`~/.xopc/`**.
40
41
 
@@ -128,7 +129,7 @@ Windows git install: `& ([scriptblock]::Create((irm https://xopc.ai/install.ps1)
128
129
 
129
130
  ## Why xopc
130
131
 
131
- - 🔁 **Goal loops, not one-shot chats** — keep long-term direction, action, and feedback moving together.
132
+ - 🔁 **Goal loops, not one-shot chats** — XOPC remembers context, coordinates AI, and keeps what matters moving.
132
133
 
133
134
  - 🏠 **Your machine** — Data and config under **`~/.xopc/`**. No mandatory cloud or surprise bills.
134
135
  - 🔑 **Bring your own keys** — OpenAI, Anthropic, Google, DeepSeek, Ollama, LM Studio, vLLM, and **20+** providers. Mix cloud and local; switch catalog models in one config line. See **[Models](https://xopcai.github.io/xopc/models)**.
@@ -184,14 +185,29 @@ Default: **`~/.xopc/xopc.json`**.
184
185
  ```json
185
186
  {
186
187
  "agents": {
187
- "defaults": {
188
- "model": "deepseek/deepseek-chat",
189
- "max_tokens": 8192
190
- }
188
+ "default": "main",
189
+ "list": [
190
+ {
191
+ "id": "main",
192
+ "identity": { "name": "Main", "role": "General assistant" },
193
+ "responsibilities": { "primary": ["Help the user complete tasks"] },
194
+ "workspace": { "root": "~/.xopc/workspace/main" },
195
+ "models": {
196
+ "defaultRole": "deep",
197
+ "roles": {
198
+ "deep": { "model": "deepseek/deepseek-chat" }
199
+ }
200
+ },
201
+ "tools": { "builtin": {} },
202
+ "skills": { "mode": "all" },
203
+ "memory": { "mode": "confirmWrite", "sources": ["session"] },
204
+ "workflows": {},
205
+ "boundaries": { "requiresConfirmation": [], "forbidden": [], "escalation": [] }
206
+ }
207
+ ]
191
208
  },
192
209
  "providers": {
193
- "deepseek": "${DEEPSEEK_API_KEY}",
194
- "openai": "${OPENAI_API_KEY}"
210
+ "deepseek": "${DEEPSEEK_API_KEY}"
195
211
  }
196
212
  }
197
213
  ```
package/README.zh-CN.md CHANGED
@@ -6,8 +6,9 @@
6
6
  <h1 align="center"><a href="https://xopc.ai">xopc</a></h1>
7
7
 
8
8
  <p align="center">
9
- <strong>Goal Loop OS,目标持续循环。</strong><br />
10
- 一个本地优先的长期目标 AI 助手:在终端、网页、桌面、移动端和 IM 里持续推进目标、行动与反馈。
9
+ <strong>把目标变成循环。</strong><br />
10
+ 让真正重要的事情,持续向前。<br />
11
+ XOPC 是一个 Local-first AI 系统,持续记住上下文,协调 AI 推进下一步,让长期目标不断向前。
11
12
  </p>
12
13
 
13
14
  <p align="center">
@@ -34,7 +35,7 @@
34
35
 
35
36
  ## 适合谁
36
37
 
37
- - **长期项目** —— 把方向、下一步行动、反馈和重新校准放进同一个循环,不让目标断在一次次聊天里。
38
+ - **长期项目** —— 把目标变成可持续的循环:上下文、下一步行动、反馈和重新校准始终连在一起。
38
39
  - **独立开发者 / One Person Company** —— 同一个助手覆盖 CLI、TUI、网页、桌面、Telegram、微信和飞书/Lark。
39
40
  - **本地优先 AI 工作流** —— 自带 API Key,云端/本地模型混用,支持 skills/extensions,数据默认在 **`~/.xopc/`**。
40
41
 
@@ -128,7 +129,7 @@ Windows 源码安装:`& ([scriptblock]::Create((irm https://xopc.ai/install.ps
128
129
 
129
130
  ## 为什么选 xopc
130
131
 
131
- - 🔁 **循环驱动,而非一次性对话** — 把目标、行动与反馈持续连起来,目标不会因为对话断点就停住。
132
+ - 🔁 **循环驱动,而非一次性对话** — XOPC 持续记住上下文,协调 AI 推进下一步,让真正重要的事情不断向前。
132
133
 
133
134
  - 🏠 **你的机器** — 配置与数据在 **`~/.xopc/`**,无强制云端、无意外账单。
134
135
  - 🔑 **自带钥匙** — OpenAI、Anthropic、Google、DeepSeek、Ollama、LM Studio、vLLM 等 **20+** 厂商;云端本地可混用,一行配置切换目录模型。详见 **[模型](https://xopcai.github.io/xopc/zh/models)**。
@@ -184,14 +185,29 @@ xopc extensions dev ./my-extension
184
185
  ```json
185
186
  {
186
187
  "agents": {
187
- "defaults": {
188
- "model": "deepseek/deepseek-chat",
189
- "max_tokens": 8192
190
- }
188
+ "default": "main",
189
+ "list": [
190
+ {
191
+ "id": "main",
192
+ "identity": { "name": "Main", "role": "通用助手", "language": "zh-CN" },
193
+ "responsibilities": { "primary": ["帮助用户完成任务"] },
194
+ "workspace": { "root": "~/.xopc/workspace/main" },
195
+ "models": {
196
+ "defaultRole": "deep",
197
+ "roles": {
198
+ "deep": { "model": "deepseek/deepseek-chat" }
199
+ }
200
+ },
201
+ "tools": { "builtin": {} },
202
+ "skills": { "mode": "all" },
203
+ "memory": { "mode": "confirmWrite", "sources": ["session"] },
204
+ "workflows": {},
205
+ "boundaries": { "requiresConfirmation": [], "forbidden": [], "escalation": [] }
206
+ }
207
+ ]
191
208
  },
192
209
  "providers": {
193
- "deepseek": "${DEEPSEEK_API_KEY}",
194
- "openai": "${OPENAI_API_KEY}"
210
+ "deepseek": "${DEEPSEEK_API_KEY}"
195
211
  }
196
212
  }
197
213
  ```
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "xopc Browser Bridge",
4
- "version": "0.0.115",
4
+ "version": "0.0.117",
5
5
  "description": "Browser automation bridge for xopc — executes commands in Chrome via the local xopc daemon.",
6
6
  "permissions": [
7
7
  "debugger",
@@ -0,0 +1,6 @@
1
+ import type { MemoryProvider } from '../../../src/agent/memory/provider.js';
2
+ import type { MemoryProviderManifest } from '../../../src/agent/memory/types.js';
3
+ export declare const manifest: MemoryProviderManifest;
4
+ export declare const description = "In-memory provider used to verify extension-backed memory providers.";
5
+ export declare function isAvailable(): boolean;
6
+ export declare function createMemoryProvider(): MemoryProvider;
@@ -0,0 +1,132 @@
1
+ //#region extensions/demo-memory/src/index.ts
2
+ const manifest = {
3
+ type: "memory-provider",
4
+ id: "demo-memory",
5
+ displayName: "Demo Memory Provider",
6
+ entry: "./src/index.js",
7
+ capabilities: {
8
+ search: true,
9
+ read: true,
10
+ write: true,
11
+ update: false,
12
+ delete: false,
13
+ keywordSearch: true,
14
+ citations: true,
15
+ sync: true
16
+ }
17
+ };
18
+ const description = "In-memory provider used to verify extension-backed memory providers.";
19
+ function isAvailable() {
20
+ return process.env.XOPC_DEMO_MEMORY_DISABLED !== "1";
21
+ }
22
+ function createMemoryProvider() {
23
+ return new DemoMemoryProvider();
24
+ }
25
+ var DemoMemoryProvider = class {
26
+ id = manifest.id;
27
+ displayName = manifest.displayName;
28
+ manifest = manifest;
29
+ capabilities = {
30
+ search: true,
31
+ read: true,
32
+ write: true,
33
+ update: false,
34
+ delete: false,
35
+ keywordSearch: true,
36
+ semanticSearch: false,
37
+ hybridSearch: false,
38
+ citations: true,
39
+ sync: true
40
+ };
41
+ records = /* @__PURE__ */ new Map();
42
+ sequence = 0;
43
+ scope = { agentId: "main" };
44
+ isAvailable() {
45
+ return isAvailable();
46
+ }
47
+ initialize(_sessionId, options) {
48
+ const agentId = typeof options?.config?.agentId === "string" ? options.config.agentId : "main";
49
+ const workspaceId = typeof options?.workspace === "string" ? options.workspace : void 0;
50
+ this.scope = workspaceId ? {
51
+ agentId,
52
+ workspaceId
53
+ } : { agentId };
54
+ }
55
+ async write(request) {
56
+ const record = this.createRecord(request);
57
+ return {
58
+ success: true,
59
+ record,
60
+ message: `Demo memory stored ${record.id}`
61
+ };
62
+ }
63
+ async search(request) {
64
+ const query = request.query.trim().toLocaleLowerCase();
65
+ const kinds = request.kinds ? new Set(request.kinds) : null;
66
+ const maxResults = request.maxResults ?? 5;
67
+ return [...this.records.values()].filter((record) => !kinds || kinds.has(record.kind)).filter((record) => !query || record.content.toLocaleLowerCase().includes(query)).map((record) => ({
68
+ record,
69
+ score: scoreRecord(record, query),
70
+ snippet: record.content,
71
+ citation: {
72
+ providerId: this.id,
73
+ recordId: record.id,
74
+ title: this.displayName,
75
+ createdAt: record.createdAt
76
+ }
77
+ })).sort((a, b) => b.score - a.score).slice(0, maxResults);
78
+ }
79
+ async read(request) {
80
+ if (!request.id) return null;
81
+ const record = this.records.get(request.id);
82
+ return record ? { record } : null;
83
+ }
84
+ async get(id) {
85
+ return this.records.get(id) ?? null;
86
+ }
87
+ async list(request) {
88
+ return [...this.records.values()].filter((record) => !request.kind || record.kind === request.kind);
89
+ }
90
+ sync(event) {
91
+ if (event.type !== "signal" || !event.signal.content) return;
92
+ this.createRecord({
93
+ kind: "derived_insight",
94
+ content: event.signal.content,
95
+ source: { provider: event.signal.source },
96
+ tags: ["signal", event.signal.source]
97
+ });
98
+ }
99
+ shutdown() {
100
+ this.records.clear();
101
+ }
102
+ createRecord(request) {
103
+ const now = (/* @__PURE__ */ new Date()).toISOString();
104
+ const id = `demo-memory-${++this.sequence}`;
105
+ const record = {
106
+ id,
107
+ kind: request.kind,
108
+ scope: {
109
+ ...this.scope,
110
+ ...request.scope
111
+ },
112
+ content: request.content,
113
+ source: request.source ?? { provider: this.id },
114
+ createdAt: now,
115
+ updatedAt: now,
116
+ ...request.tags ? { tags: request.tags } : {}
117
+ };
118
+ this.records.set(id, record);
119
+ return record;
120
+ }
121
+ };
122
+ function scoreRecord(record, query) {
123
+ if (!query) return .5;
124
+ const text = record.content.toLocaleLowerCase();
125
+ if (text === query) return 1;
126
+ if (text.includes(query)) return .8;
127
+ return .1;
128
+ }
129
+ //#endregion
130
+ export { createMemoryProvider, description, isAvailable, manifest };
131
+
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../extensions/demo-memory/src/index.ts"],"sourcesContent":["import type { MemoryProvider, MemoryProviderInitOptions } from '../../../src/agent/memory/provider.js';\nimport type {\n MemoryCapabilities,\n MemoryListRequest,\n MemoryProviderManifest,\n MemoryReadRequest,\n MemoryReadResult,\n MemoryRecord,\n MemoryScope,\n MemorySearchRequest,\n MemorySearchResult,\n MemorySyncEvent,\n MemoryWriteRequest,\n MemoryWriteResult,\n} from '../../../src/agent/memory/types.js';\n\nexport const manifest: MemoryProviderManifest = {\n type: 'memory-provider',\n id: 'demo-memory',\n displayName: 'Demo Memory Provider',\n entry: './src/index.js',\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: false,\n delete: false,\n keywordSearch: true,\n citations: true,\n sync: true,\n },\n};\n\nexport const description = 'In-memory provider used to verify extension-backed memory providers.';\n\nexport function isAvailable(): boolean {\n return process.env.XOPC_DEMO_MEMORY_DISABLED !== '1';\n}\n\nexport function createMemoryProvider(): MemoryProvider {\n return new DemoMemoryProvider();\n}\n\nclass DemoMemoryProvider implements MemoryProvider {\n readonly id = manifest.id;\n readonly displayName = manifest.displayName;\n readonly manifest = manifest;\n readonly capabilities: MemoryCapabilities = {\n search: true,\n read: true,\n write: true,\n update: false,\n delete: false,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: true,\n };\n\n private records = new Map<string, MemoryRecord>();\n private sequence = 0;\n private scope: MemoryScope = { agentId: 'main' };\n\n isAvailable(): boolean {\n return isAvailable();\n }\n\n initialize(_sessionId: string, options?: MemoryProviderInitOptions): void {\n const agentId = typeof options?.config?.agentId === 'string' ? options.config.agentId : 'main';\n const workspaceId = typeof options?.workspace === 'string' ? options.workspace : undefined;\n this.scope = workspaceId ? { agentId, workspaceId } : { agentId };\n }\n\n async write(request: MemoryWriteRequest): Promise<MemoryWriteResult> {\n const record = this.createRecord(request);\n return { success: true, record, message: `Demo memory stored ${record.id}` };\n }\n\n async search(request: MemorySearchRequest): Promise<MemorySearchResult[]> {\n const query = request.query.trim().toLocaleLowerCase();\n const kinds = request.kinds ? new Set(request.kinds) : null;\n const maxResults = request.maxResults ?? 5;\n return [...this.records.values()]\n .filter((record) => !kinds || kinds.has(record.kind))\n .filter((record) => !query || record.content.toLocaleLowerCase().includes(query))\n .map((record) => ({\n record,\n score: scoreRecord(record, query),\n snippet: record.content,\n citation: {\n providerId: this.id,\n recordId: record.id,\n title: this.displayName,\n createdAt: record.createdAt,\n },\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n }\n\n async read(request: MemoryReadRequest): Promise<MemoryReadResult | null> {\n if (!request.id) return null;\n const record = this.records.get(request.id);\n return record ? { record } : null;\n }\n\n async get(id: string): Promise<MemoryRecord | null> {\n return this.records.get(id) ?? null;\n }\n\n async list(request: MemoryListRequest): Promise<MemoryRecord[]> {\n return [...this.records.values()].filter((record) => !request.kind || record.kind === request.kind);\n }\n\n sync(event: MemorySyncEvent): void {\n if (event.type !== 'signal' || !event.signal.content) return;\n this.createRecord({\n kind: 'derived_insight',\n content: event.signal.content,\n source: { provider: event.signal.source },\n tags: ['signal', event.signal.source],\n });\n }\n\n shutdown(): void {\n this.records.clear();\n }\n\n private createRecord(request: MemoryWriteRequest): MemoryRecord {\n const now = new Date().toISOString();\n const id = `demo-memory-${++this.sequence}`;\n const record: MemoryRecord = {\n id,\n kind: request.kind,\n scope: { ...this.scope, ...request.scope },\n content: request.content,\n source: request.source ?? { provider: this.id },\n createdAt: now,\n updatedAt: now,\n ...(request.tags ? { tags: request.tags } : {}),\n };\n this.records.set(id, record);\n return record;\n }\n}\n\nfunction scoreRecord(record: MemoryRecord, query: string): number {\n if (!query) return 0.5;\n const text = record.content.toLocaleLowerCase();\n if (text === query) return 1;\n if (text.includes(query)) return 0.8;\n return 0.1;\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "demo-memory",
3
+ "name": "Demo Memory Provider",
4
+ "description": "In-memory memory provider used to validate the extension memory provider pipeline.",
5
+ "version": "1.0.0",
6
+ "kind": "memory",
7
+ "main": "src/index.js",
8
+ "enabledByDefault": true,
9
+ "contracts": {
10
+ "memoryProviders": ["demo-memory"]
11
+ },
12
+ "engines": {
13
+ "xopc": ">=0.0.116 <1.0.0"
14
+ }
15
+ }
@@ -18,8 +18,8 @@ export declare const FeishuAccountConfigSchema: z.ZodObject<{
18
18
  verificationToken: z.ZodOptional<z.ZodString>;
19
19
  encryptKey: z.ZodOptional<z.ZodString>;
20
20
  dmPolicy: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
21
- pairing: "pairing";
22
21
  allowlist: "allowlist";
22
+ pairing: "pairing";
23
23
  open: "open";
24
24
  disabled: "disabled";
25
25
  }>>>;
@@ -93,8 +93,8 @@ export declare const FeishuConfigSchema: z.ZodObject<{
93
93
  verificationToken: z.ZodOptional<z.ZodString>;
94
94
  encryptKey: z.ZodOptional<z.ZodString>;
95
95
  dmPolicy: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
96
- pairing: "pairing";
97
96
  allowlist: "allowlist";
97
+ pairing: "pairing";
98
98
  open: "open";
99
99
  disabled: "disabled";
100
100
  }>>>;
@@ -157,8 +157,8 @@ export declare const FeishuConfigSchema: z.ZodObject<{
157
157
  verificationToken: z.ZodOptional<z.ZodString>;
158
158
  encryptKey: z.ZodOptional<z.ZodString>;
159
159
  dmPolicy: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
160
- pairing: "pairing";
161
160
  allowlist: "allowlist";
161
+ pairing: "pairing";
162
162
  open: "open";
163
163
  disabled: "disabled";
164
164
  }>>>;
@@ -97,9 +97,8 @@ function createTelegramCommandHandler(deps) {
97
97
  const handleProviderSelect = async (ctx, providerId) => {
98
98
  try {
99
99
  const sessionKey = getSessionKeyFromCtx(ctx);
100
- const modelConfig = config.agents?.defaults?.models?.chat;
101
100
  const { getDefaultModelSync, getProviderDisplayName } = await import("../../../src/providers/index.js");
102
- const defaultModel = modelConfig?.primary || getDefaultModelSync(config);
101
+ const defaultModel = getDefaultModelSync(config);
103
102
  const currentModel = getSessionModel(sessionKey) || defaultModel;
104
103
  const models = await getModelsForProvider(providerId);
105
104
  if (models.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"command-handler.js","names":[],"sources":["../../../../extensions/telegram/src/command-handler.ts"],"sourcesContent":["/**\n * Telegram Command Handler\n * \n * Handles Telegram-specific UI interactions (inline keyboards, callbacks).\n * Core commands (/new, /usage, /models, etc.) are handled by the unified command system.\n */\n\nimport type { Context } from 'grammy';\n\nimport type { TelegramAccountManager } from './account-manager.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport { TelegramInlineKeyboards, type ProviderInfo } from './inline-keyboards.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\n\nconst log = createLogger('TelegramCommandHandler');\n\nexport interface TelegramCommandHandlerDeps {\n bus: any;\n config: Config;\n accountManager: TelegramAccountManager;\n getSessionModel: (sessionKey: string) => string | undefined;\n setSessionModel: (sessionKey: string, modelId: string) => void | Promise<void>;\n // Optional callbacks for inline keyboard handling\n showProviderModels?: (ctx: Context, providerId: string) => Promise<void>;\n showProvidersAgain?: (ctx: Context) => Promise<void>;\n handleCleanupConfirm?: (ctx: Context) => Promise<void>;\n}\n\nexport function createTelegramCommandHandler(deps: TelegramCommandHandlerDeps) {\n const { config, accountManager, getSessionModel, setSessionModel, bus } = deps;\n\n // ========== Helper Functions ==========\n\n const getAvailableProviders = async (): Promise<ProviderInfo[]> => {\n const { getAllProviders, getProviderDisplayName, isProviderConfiguredSync } = await import('@xopcai/xopc/providers/index.js');\n const allProviders = getAllProviders();\n const available: ProviderInfo[] = [];\n\n for (const providerId of allProviders) {\n if (isProviderConfiguredSync(providerId)) {\n available.push({ id: providerId, name: getProviderDisplayName(providerId) });\n }\n }\n\n if (available.length === 0) {\n available.push({ id: 'minimax', name: 'MiniMax' });\n }\n\n return available;\n };\n\n const getModelsForProvider = async (providerId: string) => {\n const { getModelsByProvider } = await import('@xopcai/xopc/providers/index.js');\n const models = getModelsByProvider(providerId);\n \n if (models.length === 0) {\n return [{ id: `${providerId}/default`, name: 'default', provider: providerId }];\n }\n \n return models.map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n provider: m.provider,\n }));\n };\n\n // ========== Helper Functions ==========\n\n // Helper to get sessionKey from Telegram context\n const getSessionKeyFromCtx = (ctx: Context): string => {\n const chatId = String(ctx.chat?.id);\n const senderId = String(ctx.from?.id);\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const threadId =\n (ctx.message as { message_thread_id?: number })?.message_thread_id ??\n (ctx.callbackQuery?.message as { message_thread_id?: number } | undefined)?.message_thread_id;\n\n const accountId = accountManager.resolveAccountIdFromContext(ctx);\n\n return generateSessionKey({\n source: 'telegram',\n chatId,\n senderId,\n isGroup,\n threadId: threadId ? String(threadId) : undefined,\n accountId,\n });\n };\n\n // ========== Command Handlers ==========\n\n /**\n * /start - Show welcome message\n * Note: Other commands (/new, /usage, /models, etc.) are handled by the unified command system\n */\n const handleStart = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n const hasProviders = providers.length > 0;\n\n await ctx.reply(\n '👋 *Welcome to xopc!*\\n\\n' +\n 'I am your AI assistant. Here are the available commands:\\n\\n' +\n '🤖 *Model Selection*\\n' +\n '/models - List models (name + `provider/model` ref for /switch)\\n' +\n '/switch \\u003cprovider/model-id\\u003e - Same ref as shown in /models\\n\\n' +\n '📊 *Session Management*\\n' +\n '/new - Start a new session (archive current)\\n' +\n '/list - List all your sessions\\n' +\n '/usage - View token usage statistics\\n' +\n '/cleanup - Clean up old sessions\\n\\n' +\n '🔊 *Voice (TTS)*\\n' +\n '/tts - Show TTS settings\\n' +\n '/tts on|off - Enable/disable TTS\\n' +\n '/tts always|inbound|tagged|never - Set trigger mode\\n\\n' +\n '🛠️ *Skills*\\n' +\n '/skills reload - Reload all skills from disk\\n\\n' +\n '💡 *Tip*: Just send a message to start chatting!' +\n (hasProviders ? '' : '\\n\\n⚠️ *Note*: No LLM providers configured. Please set up API keys in your config.'),\n { parse_mode: 'Markdown' }\n );\n } catch (err) {\n log.error({ err }, 'Failed to handle start command');\n await ctx.reply('❌ Failed to show welcome message.');\n }\n };\n\n /**\n * /models - Show model selector with inline keyboard\n * Note: This provides a UI enhancement over the basic /models command\n */\n const handleModels = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n\n if (providers.length === 0) {\n await ctx.reply('❌ No providers available. Please check your configuration.');\n return;\n }\n\n await ctx.reply('🤖 Select a provider:', {\n reply_markup: TelegramInlineKeyboards.providerSelector(providers),\n });\n } catch (err) {\n log.error({ err }, 'Failed to show provider selector');\n await ctx.reply('❌ Failed to load providers. Please try again.');\n }\n };\n\n /**\n * /cleanup - Show cleanup confirmation dialog\n */\n const handleCleanup = async (ctx: Context): Promise<void> => {\n try {\n await ctx.reply(\n '🧹 *Session Cleanup*\\n\\n' +\n 'This will archive sessions that have been inactive for more than 30 days.\\n\\n' +\n 'Archived sessions can be restored later.',\n { parse_mode: 'Markdown', reply_markup: TelegramInlineKeyboards.cleanupConfirm() }\n );\n } catch (err) {\n log.error({ err }, 'Failed to show cleanup dialog');\n await ctx.reply('❌ Failed to initiate cleanup.');\n }\n };\n\n // ========== Callback Handlers (Inline Keyboard) ==========\n\n const handleProviderSelect = async (ctx: Context, providerId: string): Promise<void> => {\n try {\n const sessionKey = getSessionKeyFromCtx(ctx);\n const modelConfig = config.agents?.defaults?.models?.chat;\n const { getDefaultModelSync, getProviderDisplayName } = await import('@xopcai/xopc/providers/index.js');\n const defaultModel = modelConfig?.primary || getDefaultModelSync(config);\n const currentModel = getSessionModel(sessionKey) || defaultModel;\n\n const models = await getModelsForProvider(providerId);\n \n if (models.length === 0) {\n await ctx.editMessageText('❌ No models available for this provider.');\n await ctx.answerCallbackQuery();\n return;\n }\n\n const keyboard = TelegramInlineKeyboards.modelSelector(models, currentModel);\n const providerName = getProviderDisplayName(providerId);\n \n await ctx.editMessageText(`🤖 Select a model from *${providerName}*:`, { \n reply_markup: keyboard,\n parse_mode: 'Markdown',\n });\n await ctx.answerCallbackQuery();\n } catch (err) {\n log.error({ err, providerId }, 'Failed to show provider models');\n await ctx.answerCallbackQuery('Failed to load models');\n }\n };\n\n const handleModelSelect = async (ctx: Context, modelId: string): Promise<void> => {\n try {\n const sessionKey = getSessionKeyFromCtx(ctx);\n await Promise.resolve(setSessionModel(sessionKey, modelId));\n\n const modelName = modelId.split('/').pop() || modelId;\n await ctx.editMessageText(\n `✅ Model switched to *${modelName}*\\n\\nThis model will be used for your next message.`,\n { parse_mode: 'Markdown' }\n );\n await ctx.answerCallbackQuery(`Switched to ${modelName}`);\n\n log.info({ sessionKey, modelId }, 'Model switched via Telegram');\n } catch (err) {\n log.error({ err }, 'Failed to handle model selection');\n await ctx.answerCallbackQuery('Failed to switch model');\n }\n };\n\n const handleShowProviders = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n\n await ctx.editMessageText('🤖 Select a provider:', {\n reply_markup: TelegramInlineKeyboards.providerSelector(providers),\n });\n await ctx.answerCallbackQuery();\n } catch (err) {\n log.error({ err }, 'Failed to show providers again');\n await ctx.answerCallbackQuery('Failed to go back');\n }\n };\n\n const handleCleanupConfirm = async (ctx: Context): Promise<void> => {\n try {\n await ctx.editMessageText('🧹 Cleaning up old sessions...');\n \n const chatId = String(ctx.chat?.id);\n\n await bus.publishInbound({\n channel: 'system',\n sender_id: 'telegram:cleanup',\n chat_id: chatId,\n content: '/cleanup --days 30 --force',\n });\n\n await ctx.editMessageText('✅ Cleanup initiated. Old sessions will be archived.');\n await ctx.answerCallbackQuery('Cleanup started');\n } catch (err) {\n log.error({ err }, 'Failed to execute cleanup');\n await ctx.editMessageText('❌ Cleanup failed. Please try again later.');\n await ctx.answerCallbackQuery('Cleanup failed');\n }\n };\n\n const handleCancel = async (ctx: Context): Promise<void> => {\n await ctx.editMessageText('Cancelled.');\n await ctx.answerCallbackQuery();\n };\n\n return {\n // Command handlers\n handleStart,\n handleModels,\n handleCleanup,\n // Callback handlers\n handleProviderSelect,\n handleModelSelect,\n handleShowProviders,\n handleCleanupConfirm,\n handleCancel,\n // Helpers\n getAvailableProviders,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"command-handler.js","names":[],"sources":["../../../../extensions/telegram/src/command-handler.ts"],"sourcesContent":["/**\n * Telegram Command Handler\n * \n * Handles Telegram-specific UI interactions (inline keyboards, callbacks).\n * Core commands (/new, /usage, /models, etc.) are handled by the unified command system.\n */\n\nimport type { Context } from 'grammy';\n\nimport type { TelegramAccountManager } from './account-manager.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport { TelegramInlineKeyboards, type ProviderInfo } from './inline-keyboards.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\n\nconst log = createLogger('TelegramCommandHandler');\n\nexport interface TelegramCommandHandlerDeps {\n bus: any;\n config: Config;\n accountManager: TelegramAccountManager;\n getSessionModel: (sessionKey: string) => string | undefined;\n setSessionModel: (sessionKey: string, modelId: string) => void | Promise<void>;\n // Optional callbacks for inline keyboard handling\n showProviderModels?: (ctx: Context, providerId: string) => Promise<void>;\n showProvidersAgain?: (ctx: Context) => Promise<void>;\n handleCleanupConfirm?: (ctx: Context) => Promise<void>;\n}\n\nexport function createTelegramCommandHandler(deps: TelegramCommandHandlerDeps) {\n const { config, accountManager, getSessionModel, setSessionModel, bus } = deps;\n\n // ========== Helper Functions ==========\n\n const getAvailableProviders = async (): Promise<ProviderInfo[]> => {\n const { getAllProviders, getProviderDisplayName, isProviderConfiguredSync } = await import('@xopcai/xopc/providers/index.js');\n const allProviders = getAllProviders();\n const available: ProviderInfo[] = [];\n\n for (const providerId of allProviders) {\n if (isProviderConfiguredSync(providerId)) {\n available.push({ id: providerId, name: getProviderDisplayName(providerId) });\n }\n }\n\n if (available.length === 0) {\n available.push({ id: 'minimax', name: 'MiniMax' });\n }\n\n return available;\n };\n\n const getModelsForProvider = async (providerId: string) => {\n const { getModelsByProvider } = await import('@xopcai/xopc/providers/index.js');\n const models = getModelsByProvider(providerId);\n \n if (models.length === 0) {\n return [{ id: `${providerId}/default`, name: 'default', provider: providerId }];\n }\n \n return models.map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n provider: m.provider,\n }));\n };\n\n // ========== Helper Functions ==========\n\n // Helper to get sessionKey from Telegram context\n const getSessionKeyFromCtx = (ctx: Context): string => {\n const chatId = String(ctx.chat?.id);\n const senderId = String(ctx.from?.id);\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const threadId =\n (ctx.message as { message_thread_id?: number })?.message_thread_id ??\n (ctx.callbackQuery?.message as { message_thread_id?: number } | undefined)?.message_thread_id;\n\n const accountId = accountManager.resolveAccountIdFromContext(ctx);\n\n return generateSessionKey({\n source: 'telegram',\n chatId,\n senderId,\n isGroup,\n threadId: threadId ? String(threadId) : undefined,\n accountId,\n });\n };\n\n // ========== Command Handlers ==========\n\n /**\n * /start - Show welcome message\n * Note: Other commands (/new, /usage, /models, etc.) are handled by the unified command system\n */\n const handleStart = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n const hasProviders = providers.length > 0;\n\n await ctx.reply(\n '👋 *Welcome to xopc!*\\n\\n' +\n 'I am your AI assistant. Here are the available commands:\\n\\n' +\n '🤖 *Model Selection*\\n' +\n '/models - List models (name + `provider/model` ref for /switch)\\n' +\n '/switch \\u003cprovider/model-id\\u003e - Same ref as shown in /models\\n\\n' +\n '📊 *Session Management*\\n' +\n '/new - Start a new session (archive current)\\n' +\n '/list - List all your sessions\\n' +\n '/usage - View token usage statistics\\n' +\n '/cleanup - Clean up old sessions\\n\\n' +\n '🔊 *Voice (TTS)*\\n' +\n '/tts - Show TTS settings\\n' +\n '/tts on|off - Enable/disable TTS\\n' +\n '/tts always|inbound|tagged|never - Set trigger mode\\n\\n' +\n '🛠️ *Skills*\\n' +\n '/skills reload - Reload all skills from disk\\n\\n' +\n '💡 *Tip*: Just send a message to start chatting!' +\n (hasProviders ? '' : '\\n\\n⚠️ *Note*: No LLM providers configured. Please set up API keys in your config.'),\n { parse_mode: 'Markdown' }\n );\n } catch (err) {\n log.error({ err }, 'Failed to handle start command');\n await ctx.reply('❌ Failed to show welcome message.');\n }\n };\n\n /**\n * /models - Show model selector with inline keyboard\n * Note: This provides a UI enhancement over the basic /models command\n */\n const handleModels = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n\n if (providers.length === 0) {\n await ctx.reply('❌ No providers available. Please check your configuration.');\n return;\n }\n\n await ctx.reply('🤖 Select a provider:', {\n reply_markup: TelegramInlineKeyboards.providerSelector(providers),\n });\n } catch (err) {\n log.error({ err }, 'Failed to show provider selector');\n await ctx.reply('❌ Failed to load providers. Please try again.');\n }\n };\n\n /**\n * /cleanup - Show cleanup confirmation dialog\n */\n const handleCleanup = async (ctx: Context): Promise<void> => {\n try {\n await ctx.reply(\n '🧹 *Session Cleanup*\\n\\n' +\n 'This will archive sessions that have been inactive for more than 30 days.\\n\\n' +\n 'Archived sessions can be restored later.',\n { parse_mode: 'Markdown', reply_markup: TelegramInlineKeyboards.cleanupConfirm() }\n );\n } catch (err) {\n log.error({ err }, 'Failed to show cleanup dialog');\n await ctx.reply('❌ Failed to initiate cleanup.');\n }\n };\n\n // ========== Callback Handlers (Inline Keyboard) ==========\n\n const handleProviderSelect = async (ctx: Context, providerId: string): Promise<void> => {\n try {\n const sessionKey = getSessionKeyFromCtx(ctx);\n const { getDefaultModelSync, getProviderDisplayName } = await import('@xopcai/xopc/providers/index.js');\n const defaultModel = getDefaultModelSync(config);\n const currentModel = getSessionModel(sessionKey) || defaultModel;\n\n const models = await getModelsForProvider(providerId);\n \n if (models.length === 0) {\n await ctx.editMessageText('❌ No models available for this provider.');\n await ctx.answerCallbackQuery();\n return;\n }\n\n const keyboard = TelegramInlineKeyboards.modelSelector(models, currentModel);\n const providerName = getProviderDisplayName(providerId);\n \n await ctx.editMessageText(`🤖 Select a model from *${providerName}*:`, { \n reply_markup: keyboard,\n parse_mode: 'Markdown',\n });\n await ctx.answerCallbackQuery();\n } catch (err) {\n log.error({ err, providerId }, 'Failed to show provider models');\n await ctx.answerCallbackQuery('Failed to load models');\n }\n };\n\n const handleModelSelect = async (ctx: Context, modelId: string): Promise<void> => {\n try {\n const sessionKey = getSessionKeyFromCtx(ctx);\n await Promise.resolve(setSessionModel(sessionKey, modelId));\n\n const modelName = modelId.split('/').pop() || modelId;\n await ctx.editMessageText(\n `✅ Model switched to *${modelName}*\\n\\nThis model will be used for your next message.`,\n { parse_mode: 'Markdown' }\n );\n await ctx.answerCallbackQuery(`Switched to ${modelName}`);\n\n log.info({ sessionKey, modelId }, 'Model switched via Telegram');\n } catch (err) {\n log.error({ err }, 'Failed to handle model selection');\n await ctx.answerCallbackQuery('Failed to switch model');\n }\n };\n\n const handleShowProviders = async (ctx: Context): Promise<void> => {\n try {\n const providers = await getAvailableProviders();\n\n await ctx.editMessageText('🤖 Select a provider:', {\n reply_markup: TelegramInlineKeyboards.providerSelector(providers),\n });\n await ctx.answerCallbackQuery();\n } catch (err) {\n log.error({ err }, 'Failed to show providers again');\n await ctx.answerCallbackQuery('Failed to go back');\n }\n };\n\n const handleCleanupConfirm = async (ctx: Context): Promise<void> => {\n try {\n await ctx.editMessageText('🧹 Cleaning up old sessions...');\n \n const chatId = String(ctx.chat?.id);\n\n await bus.publishInbound({\n channel: 'system',\n sender_id: 'telegram:cleanup',\n chat_id: chatId,\n content: '/cleanup --days 30 --force',\n });\n\n await ctx.editMessageText('✅ Cleanup initiated. Old sessions will be archived.');\n await ctx.answerCallbackQuery('Cleanup started');\n } catch (err) {\n log.error({ err }, 'Failed to execute cleanup');\n await ctx.editMessageText('❌ Cleanup failed. Please try again later.');\n await ctx.answerCallbackQuery('Cleanup failed');\n }\n };\n\n const handleCancel = async (ctx: Context): Promise<void> => {\n await ctx.editMessageText('Cancelled.');\n await ctx.answerCallbackQuery();\n };\n\n return {\n // Command handlers\n handleStart,\n handleModels,\n handleCleanup,\n // Callback handlers\n handleProviderSelect,\n handleModelSelect,\n handleShowProviders,\n handleCleanupConfirm,\n handleCancel,\n // Helpers\n getAvailableProviders,\n };\n}\n"],"mappings":"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"}
@@ -66,8 +66,8 @@ export declare const TelegramThreadBindingsConfigSchema: z.ZodObject<{
66
66
  }, z.core.$strict>;
67
67
  export declare const TelegramAccountDefaultsConfigSchema: z.ZodObject<{
68
68
  dmPolicy: z.ZodDefault<z.ZodEnum<{
69
- pairing: "pairing";
70
69
  allowlist: "allowlist";
70
+ pairing: "pairing";
71
71
  open: "open";
72
72
  disabled: "disabled";
73
73
  }>>;
@@ -78,8 +78,8 @@ export declare const TelegramAccountDefaultsConfigSchema: z.ZodObject<{
78
78
  }>>;
79
79
  replyToMode: z.ZodDefault<z.ZodEnum<{
80
80
  off: "off";
81
- first: "first";
82
81
  all: "all";
82
+ first: "first";
83
83
  }>>;
84
84
  historyLimit: z.ZodDefault<z.ZodNumber>;
85
85
  textChunkLimit: z.ZodDefault<z.ZodNumber>;
@@ -111,8 +111,8 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
111
111
  allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
112
112
  groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
113
113
  dmPolicy: z.ZodOptional<z.ZodEnum<{
114
- pairing: "pairing";
115
114
  allowlist: "allowlist";
115
+ pairing: "pairing";
116
116
  open: "open";
117
117
  disabled: "disabled";
118
118
  }>>;
@@ -123,8 +123,8 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
123
123
  }>>;
124
124
  replyToMode: z.ZodOptional<z.ZodEnum<{
125
125
  off: "off";
126
- first: "first";
127
126
  all: "all";
127
+ first: "first";
128
128
  }>>;
129
129
  groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
130
130
  groupId: z.ZodOptional<z.ZodString>;
@@ -199,8 +199,8 @@ export declare const TelegramConfigSchema: z.ZodObject<{
199
199
  debug: z.ZodDefault<z.ZodBoolean>;
200
200
  defaults: z.ZodDefault<z.ZodObject<{
201
201
  dmPolicy: z.ZodDefault<z.ZodEnum<{
202
- pairing: "pairing";
203
202
  allowlist: "allowlist";
203
+ pairing: "pairing";
204
204
  open: "open";
205
205
  disabled: "disabled";
206
206
  }>>;
@@ -211,8 +211,8 @@ export declare const TelegramConfigSchema: z.ZodObject<{
211
211
  }>>;
212
212
  replyToMode: z.ZodDefault<z.ZodEnum<{
213
213
  off: "off";
214
- first: "first";
215
214
  all: "all";
215
+ first: "first";
216
216
  }>>;
217
217
  historyLimit: z.ZodDefault<z.ZodNumber>;
218
218
  textChunkLimit: z.ZodDefault<z.ZodNumber>;
@@ -244,8 +244,8 @@ export declare const TelegramConfigSchema: z.ZodObject<{
244
244
  allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
245
245
  groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
246
246
  dmPolicy: z.ZodOptional<z.ZodEnum<{
247
- pairing: "pairing";
248
247
  allowlist: "allowlist";
248
+ pairing: "pairing";
249
249
  open: "open";
250
250
  disabled: "disabled";
251
251
  }>>;
@@ -256,8 +256,8 @@ export declare const TelegramConfigSchema: z.ZodObject<{
256
256
  }>>;
257
257
  replyToMode: z.ZodOptional<z.ZodEnum<{
258
258
  off: "off";
259
- first: "first";
260
259
  all: "all";
260
+ first: "first";
261
261
  }>>;
262
262
  groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
263
263
  groupId: z.ZodOptional<z.ZodString>;
@@ -2,7 +2,7 @@
2
2
  "id": "telegram",
3
3
  "name": "Telegram Channel",
4
4
  "description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
5
- "version": "0.0.115",
5
+ "version": "0.0.117",
6
6
  "kind": "channel",
7
7
  "main": "src/index.js",
8
8
  "channels": [
@@ -5,8 +5,8 @@ export declare const WeixinAccountConfigSchema: z.ZodObject<{
5
5
  cdnBaseUrl: z.ZodOptional<z.ZodString>;
6
6
  routeTag: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
7
7
  dmPolicy: z.ZodDefault<z.ZodEnum<{
8
- pairing: "pairing";
9
8
  allowlist: "allowlist";
9
+ pairing: "pairing";
10
10
  open: "open";
11
11
  disabled: "disabled";
12
12
  }>>;
@@ -21,8 +21,8 @@ export declare const WeixinAccountConfigSchema: z.ZodObject<{
21
21
  export declare const WeixinConfigSchema: z.ZodObject<{
22
22
  enabled: z.ZodDefault<z.ZodBoolean>;
23
23
  dmPolicy: z.ZodDefault<z.ZodEnum<{
24
- pairing: "pairing";
25
24
  allowlist: "allowlist";
25
+ pairing: "pairing";
26
26
  open: "open";
27
27
  disabled: "disabled";
28
28
  }>>;
@@ -42,8 +42,8 @@ export declare const WeixinConfigSchema: z.ZodObject<{
42
42
  cdnBaseUrl: z.ZodOptional<z.ZodString>;
43
43
  routeTag: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
44
44
  dmPolicy: z.ZodDefault<z.ZodEnum<{
45
- pairing: "pairing";
46
45
  allowlist: "allowlist";
46
+ pairing: "pairing";
47
47
  open: "open";
48
48
  disabled: "disabled";
49
49
  }>>;