@xopcai/xopc 0.0.86 → 0.0.88

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 (658) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  3. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  7. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  8. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +3 -2
  11. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  12. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  13. package/dist/extensions/telegram/xopc.extension.json +1 -1
  14. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  15. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  16. package/dist/extensions/weixin/src/api/api.js +3 -3
  17. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  18. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  19. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  20. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  21. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  22. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  23. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  25. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  26. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  27. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  28. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  29. package/dist/extensions/weixin/src/plugin.js +1 -1
  30. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  31. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  32. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  33. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  34. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  35. package/dist/gateway/static/root/assets/agents-CRxETUZx.js +222 -0
  36. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-wKWf3l57.js} +1 -1
  37. package/dist/gateway/static/root/assets/channels-settings-DDbqVNkx.js +1 -0
  38. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-DIsl75Y3.js} +1 -1
  39. package/dist/gateway/static/root/assets/copy-SxMW6Xpc.js +1 -0
  40. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-N9hvuRrn.js} +1 -1
  41. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-tlNGNxhP.js} +1 -1
  42. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-CJwfHYvT.js} +1 -1
  43. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-BVJohZoZ.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BT2tmElC.js} +1 -1
  45. package/dist/gateway/static/root/assets/extension-settings-page-BSS47c2j.js +1 -0
  46. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-BaFNUtkE.js} +1 -1
  47. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-QwYEq6Hz.js} +1 -1
  48. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-BVSidEDJ.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-CqZzHNEg.css +1 -0
  50. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-qNrVJp-y.js} +97 -95
  51. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-DDonPVLn.js} +1 -1
  52. package/dist/gateway/static/root/assets/sessions-page-DKt-Wmib.js +1 -0
  53. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-B8N3A3Zo.js} +1 -1
  54. package/dist/gateway/static/root/assets/settings-page-DcJjvvw4.js +3 -0
  55. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-Q7KqkO-u.js} +1 -1
  56. package/dist/gateway/static/root/assets/skills-page-DuJ4BTO3.js +2 -0
  57. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-BbRc5ugR.js} +1 -1
  58. package/dist/gateway/static/root/assets/url-D6jvVYIA.js +7 -0
  59. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CxDGduqK.js} +1 -1
  60. package/dist/gateway/static/root/assets/voice-api-key-field-CTyHz7L_.js +1 -0
  61. package/dist/gateway/static/root/assets/workflows-page-GacJ41Fv.js +27 -0
  62. package/dist/gateway/static/root/index.html +6 -5
  63. package/dist/package.js +1 -1
  64. package/dist/src/agent/agent-manager.js +7 -7
  65. package/dist/src/agent/agent-scope.d.ts +4 -0
  66. package/dist/src/agent/agent-scope.js +53 -10
  67. package/dist/src/agent/agent-scope.js.map +1 -1
  68. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  69. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  70. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  71. package/dist/src/agent/child-agent-factory.d.ts +15 -0
  72. package/dist/src/agent/child-agent-factory.js +35 -2
  73. package/dist/src/agent/child-agent-factory.js.map +1 -1
  74. package/dist/src/agent/client-error-format.d.ts +20 -0
  75. package/dist/src/agent/client-error-format.js +97 -0
  76. package/dist/src/agent/client-error-format.js.map +1 -0
  77. package/dist/src/agent/context/workspace-seed.js +2 -2
  78. package/dist/src/agent/embedded/run-turn.js +23 -4
  79. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  80. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  81. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  82. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  83. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  84. package/dist/src/agent/fallback/candidates.js +2 -2
  85. package/dist/src/agent/fallback/candidates.js.map +1 -1
  86. package/dist/src/agent/goals/goal-locale.d.ts +1 -1
  87. package/dist/src/agent/goals/goal-run-store.js +4 -4
  88. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  89. package/dist/src/agent/goals/persistent-goal-service.js +1 -2
  90. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  91. package/dist/src/agent/goals/post-turn.js +2 -2
  92. package/dist/src/agent/image/generation/normalization.js +2 -12
  93. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  94. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  95. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  96. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  97. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  98. package/dist/src/agent/image/generation/types.d.ts +0 -18
  99. package/dist/src/agent/image/image-helpers.js +6 -1
  100. package/dist/src/agent/image/image-helpers.js.map +1 -1
  101. package/dist/src/agent/image/index.d.ts +1 -1
  102. package/dist/src/agent/image/load-image-media.js +2 -2
  103. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  104. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  105. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  106. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  107. package/dist/src/agent/inbound/turn-dispatcher.js +7 -5
  108. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  109. package/dist/src/agent/ipc/bus.js +1 -1
  110. package/dist/src/agent/ipc/inbox.js +2 -2
  111. package/dist/src/agent/ipc/socket.js +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  113. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  114. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  115. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  116. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  117. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  121. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  122. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  123. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  124. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  125. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  126. package/dist/src/agent/memory/dreaming/events.js +1 -1
  127. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  128. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  129. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  130. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  131. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  133. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  134. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  135. package/dist/src/agent/messaging/command-handler.js +5 -0
  136. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  137. package/dist/src/agent/models/manager.js +1 -1
  138. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +2 -0
  139. package/dist/src/agent/orchestration/llm-turn-retry.js +9 -1
  140. package/dist/src/agent/orchestration/llm-turn-retry.js.map +1 -1
  141. package/dist/src/agent/prompt/safety.d.ts +0 -7
  142. package/dist/src/agent/prompt/safety.js +1 -20
  143. package/dist/src/agent/prompt/safety.js.map +1 -1
  144. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  145. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  146. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  147. package/dist/src/agent/sandbox/path-policy.js +2 -2
  148. package/dist/src/agent/service/build-direct-message-content.js +2 -2
  149. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  150. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  151. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  152. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  153. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  154. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  155. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  156. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  157. package/dist/src/agent/service/process-direct-streaming.js +53 -7
  158. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  159. package/dist/src/agent/service/webchat-tts.d.ts +1 -2
  160. package/dist/src/agent/service/webchat-tts.js +2 -2
  161. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  162. package/dist/src/agent/service.d.ts +8 -0
  163. package/dist/src/agent/service.js +25 -5
  164. package/dist/src/agent/service.js.map +1 -1
  165. package/dist/src/agent/session/session-inspector.js +1 -1
  166. package/dist/src/agent/skills/config.js +1 -1
  167. package/dist/src/agent/skills/hub-hash.js +2 -2
  168. package/dist/src/agent/skills/hub-lock.js +1 -1
  169. package/dist/src/agent/skills/hub-pull.js +2 -2
  170. package/dist/src/agent/skills/index.js +1 -1
  171. package/dist/src/agent/skills/managed-store.js +1 -1
  172. package/dist/src/agent/skills/scanner.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  174. package/dist/src/agent/skills/skill-manager.js +1 -1
  175. package/dist/src/agent/tools/create-share-tool.js +27 -20
  176. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  177. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -2
  179. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  180. package/dist/src/agent/tools/index.d.ts +0 -1
  181. package/dist/src/agent/tools/index.js +4 -5
  182. package/dist/src/agent/tools/send-media.js +1 -1
  183. package/dist/src/agent/tools/shell.js +0 -13
  184. package/dist/src/agent/tools/shell.js.map +1 -1
  185. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  186. package/dist/src/agent/tools/workflow-tool.js +70 -16
  187. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  188. package/dist/src/agent/tools/write.js +1 -1
  189. package/dist/src/agent/workflow/agent-progress.d.ts +5 -0
  190. package/dist/src/agent/workflow/agent-progress.js +65 -0
  191. package/dist/src/agent/workflow/agent-progress.js.map +1 -0
  192. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  193. package/dist/src/agent/workflow/builtins/audit-repo.js +14 -0
  194. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  195. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  196. package/dist/src/agent/workflow/builtins/debug-incident.js +14 -0
  197. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  198. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +12 -0
  199. package/dist/src/agent/workflow/builtins/implementation-plan.js +175 -0
  200. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -0
  201. package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
  202. package/dist/src/agent/workflow/builtins/index.js +11 -1
  203. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  204. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  205. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +14 -0
  206. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  207. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  208. package/dist/src/agent/workflow/builtins/pr-review.js +14 -0
  209. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  210. package/dist/src/agent/workflow/builtins/release-check.d.ts +11 -0
  211. package/dist/src/agent/workflow/builtins/release-check.js +165 -0
  212. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -0
  213. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  214. package/dist/src/agent/workflow/builtins/research.js +14 -0
  215. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  216. package/dist/src/agent/workflow/catalog.js +1 -1
  217. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  218. package/dist/src/agent/workflow/index.d.ts +2 -1
  219. package/dist/src/agent/workflow/index.js +3 -2
  220. package/dist/src/agent/workflow/lint.d.ts +38 -0
  221. package/dist/src/agent/workflow/lint.js +74 -0
  222. package/dist/src/agent/workflow/lint.js.map +1 -0
  223. package/dist/src/agent/workflow/meta-locale.d.ts +12 -0
  224. package/dist/src/agent/workflow/meta-locale.js +62 -0
  225. package/dist/src/agent/workflow/meta-locale.js.map +1 -0
  226. package/dist/src/agent/workflow/parser.js +7 -1
  227. package/dist/src/agent/workflow/parser.js.map +1 -1
  228. package/dist/src/agent/workflow/runtime.d.ts +4 -1
  229. package/dist/src/agent/workflow/runtime.js +88 -8
  230. package/dist/src/agent/workflow/runtime.js.map +1 -1
  231. package/dist/src/agent/workflow/snapshot.js +2 -12
  232. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  233. package/dist/src/agent/workflow/step-labels.d.ts +8 -0
  234. package/dist/src/agent/workflow/step-labels.js +48 -0
  235. package/dist/src/agent/workflow/step-labels.js.map +1 -0
  236. package/dist/src/agent/workflow/subagent-runner.js +46 -1
  237. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  238. package/dist/src/agent/workflow/types.d.ts +76 -1
  239. package/dist/src/auth/credentials.d.ts +5 -0
  240. package/dist/src/auth/credentials.js +12 -3
  241. package/dist/src/auth/credentials.js.map +1 -1
  242. package/dist/src/auth/profiles/store.js +1 -1
  243. package/dist/src/auth/sync-provider-auth.js +1 -1
  244. package/dist/src/browser/cache-dir-policy.js +1 -1
  245. package/dist/src/browser/cdp-local-launcher.js +2 -2
  246. package/dist/src/browser/index.js +4 -4
  247. package/dist/src/browser/manager.d.ts +1 -3
  248. package/dist/src/browser/manager.js +0 -6
  249. package/dist/src/browser/manager.js.map +1 -1
  250. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  251. package/dist/src/browser/providers/browser-ext-install.js +41 -88
  252. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  253. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  254. package/dist/src/browser/providers/cloakbrowser.js +6 -59
  255. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  256. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  257. package/dist/src/browser/stealth.js +1 -1
  258. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  259. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  260. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  261. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  262. package/dist/src/channels/outbound/persist-store.js +1 -1
  263. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  264. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  265. package/dist/src/channels/pairing/pairing-store.js +7 -7
  266. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  267. package/dist/src/chat-commands/builtins/config.js +2 -2
  268. package/dist/src/chat-commands/builtins/session.js +1 -1
  269. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  270. package/dist/src/chat-commands/builtins/tts.js +2 -2
  271. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  272. package/dist/src/chat-commands/context.d.ts +3 -0
  273. package/dist/src/chat-commands/context.js +22 -4
  274. package/dist/src/chat-commands/context.js.map +1 -1
  275. package/dist/src/chat-commands/session-key.d.ts +4 -37
  276. package/dist/src/chat-commands/session-key.js +49 -85
  277. package/dist/src/chat-commands/session-key.js.map +1 -1
  278. package/dist/src/chat-commands/types.d.ts +2 -0
  279. package/dist/src/cli/commands/agent/interactive.js +2 -2
  280. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  281. package/dist/src/cli/commands/agent/sessions.js +2 -2
  282. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  283. package/dist/src/cli/commands/agent.js +4 -5
  284. package/dist/src/cli/commands/agent.js.map +1 -1
  285. package/dist/src/cli/commands/channels.js +1 -5
  286. package/dist/src/cli/commands/channels.js.map +1 -1
  287. package/dist/src/cli/commands/config.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  290. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  292. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +1 -1
  294. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  295. package/dist/src/cli/commands/extension-pack.js +1 -1
  296. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  297. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  299. package/dist/src/cli/commands/gateway/logs.js +50 -17
  300. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  301. package/dist/src/cli/commands/image.js +23 -22
  302. package/dist/src/cli/commands/image.js.map +1 -1
  303. package/dist/src/cli/commands/init.js +4 -4
  304. package/dist/src/cli/commands/onboard.js +1 -1
  305. package/dist/src/cli/commands/session/utils.js +2 -2
  306. package/dist/src/cli/commands/session/utils.js.map +1 -1
  307. package/dist/src/cli/commands/update.js +26 -46
  308. package/dist/src/cli/commands/update.js.map +1 -1
  309. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  310. package/dist/src/cli/utils/session.d.ts +0 -5
  311. package/dist/src/cli/utils/session.js +1 -6
  312. package/dist/src/cli/utils/session.js.map +1 -1
  313. package/dist/src/commands/agents.config.js +1 -1
  314. package/dist/src/commands/agents.config.js.map +1 -1
  315. package/dist/src/config/agent-profile.js +6 -28
  316. package/dist/src/config/agent-profile.js.map +1 -1
  317. package/dist/src/config/agent-typed-models.d.ts +18 -0
  318. package/dist/src/config/agent-typed-models.js +53 -0
  319. package/dist/src/config/agent-typed-models.js.map +1 -0
  320. package/dist/src/config/gateway-bind.js +1 -1
  321. package/dist/src/config/index.js +6 -6
  322. package/dist/src/config/loader.js +2 -2
  323. package/dist/src/config/model-input.js +2 -5
  324. package/dist/src/config/model-input.js.map +1 -1
  325. package/dist/src/config/models-json.js +2 -2
  326. package/dist/src/config/paths-state.js +1 -1
  327. package/dist/src/config/profile.js +2 -2
  328. package/dist/src/config/schema.d.ts +253 -217
  329. package/dist/src/config/schema.js +91 -40
  330. package/dist/src/config/schema.js.map +1 -1
  331. package/dist/src/config/voice.d.ts +3 -28
  332. package/dist/src/config/voice.js +27 -261
  333. package/dist/src/config/voice.js.map +1 -1
  334. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  335. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  336. package/dist/src/config/workspace-path.js +1 -1
  337. package/dist/src/cron/executor.js +2 -2
  338. package/dist/src/cron/persistence.js +1 -1
  339. package/dist/src/cron/run-log-store.js +1 -1
  340. package/dist/src/daemon/constants.js +1 -1
  341. package/dist/src/daemon/install-plan.js +27 -3
  342. package/dist/src/daemon/install-plan.js.map +1 -1
  343. package/dist/src/daemon/launchd.d.ts +8 -0
  344. package/dist/src/daemon/launchd.js +7 -14
  345. package/dist/src/daemon/launchd.js.map +1 -1
  346. package/dist/src/daemon/schtasks.d.ts +25 -0
  347. package/dist/src/daemon/schtasks.js +168 -48
  348. package/dist/src/daemon/schtasks.js.map +1 -1
  349. package/dist/src/daemon/service.js +5 -4
  350. package/dist/src/daemon/service.js.map +1 -1
  351. package/dist/src/daemon/systemd.d.ts +6 -0
  352. package/dist/src/daemon/systemd.js +20 -5
  353. package/dist/src/daemon/systemd.js.map +1 -1
  354. package/dist/src/extensions/activation-context.js +0 -1
  355. package/dist/src/extensions/activation-context.js.map +1 -1
  356. package/dist/src/extensions/bundle-mcp.js +1 -1
  357. package/dist/src/extensions/discover-extensions.js +1 -1
  358. package/dist/src/extensions/health.js +1 -1
  359. package/dist/src/extensions/loader.js +1 -1
  360. package/dist/src/extensions/lockfile.js +2 -2
  361. package/dist/src/extensions/normalize-manifest.js +0 -1
  362. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  363. package/dist/src/extensions/types/manifest.d.ts +0 -2
  364. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  365. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  366. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  367. package/dist/src/gateway/agents-admin.d.ts +9 -0
  368. package/dist/src/gateway/agents-admin.js +28 -4
  369. package/dist/src/gateway/agents-admin.js.map +1 -1
  370. package/dist/src/gateway/config-tools-web.js +3 -2
  371. package/dist/src/gateway/config-tools-web.js.map +1 -1
  372. package/dist/src/gateway/file-path-classifier.js +2 -2
  373. package/dist/src/gateway/heartbeat/service.js +2 -2
  374. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  375. package/dist/src/gateway/hono/app.js +1 -1
  376. package/dist/src/gateway/hono/lib/agent-model.d.ts +25 -10
  377. package/dist/src/gateway/hono/lib/agent-model.js +60 -36
  378. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  379. package/dist/src/gateway/hono/lib/config-payload.js +29 -6
  380. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  381. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  382. package/dist/src/gateway/hono/lib/mask-secret-length.d.ts +6 -0
  383. package/dist/src/gateway/hono/lib/mask-secret-length.js +16 -0
  384. package/dist/src/gateway/hono/lib/mask-secret-length.js.map +1 -0
  385. package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +1 -1
  386. package/dist/src/gateway/hono/lib/safe-providers-config.js +2 -1
  387. package/dist/src/gateway/hono/lib/safe-providers-config.js.map +1 -1
  388. package/dist/src/gateway/hono/lib/safe-voice-config.js +16 -54
  389. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  391. package/dist/src/gateway/hono/oauth.js +1 -1
  392. package/dist/src/gateway/hono/routes/agents.js +2 -2
  393. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  394. package/dist/src/gateway/hono/routes/config-patch/agents.js +25 -7
  395. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  397. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  398. package/dist/src/gateway/hono/routes/config-patch/gateway.js +3 -2
  399. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  400. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -3
  401. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  402. package/dist/src/gateway/hono/routes/config.js +59 -0
  403. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  404. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  405. package/dist/src/gateway/hono/routes/goals.js +1 -1
  406. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  407. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  408. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/models.js +75 -12
  411. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  412. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  413. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  414. package/dist/src/gateway/hono/routes/shares.js +15 -13
  415. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  417. package/dist/src/gateway/hono/routes/update.js +4 -2
  418. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  419. package/dist/src/gateway/hono/routes/voice.js +75 -0
  420. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  421. package/dist/src/gateway/hono/routes/workflows.d.ts +3 -0
  422. package/dist/src/gateway/hono/routes/workflows.js +347 -0
  423. package/dist/src/gateway/hono/routes/workflows.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/workspace.js +4 -4
  425. package/dist/src/gateway/hono/sse.js +16 -33
  426. package/dist/src/gateway/hono/sse.js.map +1 -1
  427. package/dist/src/gateway/lock.js +11 -11
  428. package/dist/src/gateway/lock.js.map +1 -1
  429. package/dist/src/gateway/ports.js +6 -6
  430. package/dist/src/gateway/ports.js.map +1 -1
  431. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  432. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  433. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  434. package/dist/src/gateway/service/agent-runner.js +2 -2
  435. package/dist/src/gateway/service/marketplace-service.js +2 -2
  436. package/dist/src/gateway/service/run-gateway-agent.js +9 -11
  437. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  438. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  439. package/dist/src/gateway/service/sessions-api.js +8 -0
  440. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  441. package/dist/src/gateway/service.d.ts +3 -2
  442. package/dist/src/gateway/service.js +9 -8
  443. package/dist/src/gateway/service.js.map +1 -1
  444. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  445. package/dist/src/gateway/session-reset-service.js +54 -0
  446. package/dist/src/gateway/session-reset-service.js.map +1 -0
  447. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  448. package/dist/src/gateway/startup-readiness.js +1 -0
  449. package/dist/src/gateway/startup-readiness.js.map +1 -1
  450. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  451. package/dist/src/heartbeat/index.js +1 -1
  452. package/dist/src/infra/gateway-processes.js +2 -2
  453. package/dist/src/infra/gateway-processes.js.map +1 -1
  454. package/dist/src/infra/restart.js +2 -2
  455. package/dist/src/infra/run-command.d.ts +16 -0
  456. package/dist/src/infra/run-command.js +67 -0
  457. package/dist/src/infra/run-command.js.map +1 -0
  458. package/dist/src/infra/update-check.js +1 -1
  459. package/dist/src/infra/update-global.d.ts +45 -0
  460. package/dist/src/infra/update-global.js +224 -0
  461. package/dist/src/infra/update-global.js.map +1 -0
  462. package/dist/src/infra/update-lock.js +3 -3
  463. package/dist/src/infra/update-runner.js +1 -1
  464. package/dist/src/infra/update-startup.js +2 -2
  465. package/dist/src/infra/write-file-atomic.js +2 -2
  466. package/dist/src/mcp/channel-shared.js +2 -1
  467. package/dist/src/mcp/channel-shared.js.map +1 -1
  468. package/dist/src/providers/auth-runtime/auth-profile-store.js +2 -2
  469. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  470. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  471. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  472. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  473. package/dist/src/providers/index.js +2 -2
  474. package/dist/src/providers/model-registry.js +1 -1
  475. package/dist/src/routing/agent-session-key.d.ts +58 -0
  476. package/dist/src/routing/agent-session-key.js +164 -0
  477. package/dist/src/routing/agent-session-key.js.map +1 -0
  478. package/dist/src/routing/index.d.ts +1 -1
  479. package/dist/src/routing/index.js +4 -2
  480. package/dist/src/routing/index.js.map +1 -1
  481. package/dist/src/routing/resolve-route.d.ts +15 -0
  482. package/dist/src/routing/resolve-route.js +41 -20
  483. package/dist/src/routing/resolve-route.js.map +1 -1
  484. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  485. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  486. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  487. package/dist/src/routing/session-key-utils.d.ts +24 -0
  488. package/dist/src/routing/session-key-utils.js +92 -0
  489. package/dist/src/routing/session-key-utils.js.map +1 -0
  490. package/dist/src/routing/session-key.d.ts +19 -49
  491. package/dist/src/routing/session-key.js +143 -116
  492. package/dist/src/routing/session-key.js.map +1 -1
  493. package/dist/src/session/config-store.js +2 -2
  494. package/dist/src/session/index.d.ts +6 -0
  495. package/dist/src/session/index.js +7 -1
  496. package/dist/src/session/init-session-turn.d.ts +30 -0
  497. package/dist/src/session/init-session-turn.js +102 -0
  498. package/dist/src/session/init-session-turn.js.map +1 -0
  499. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  500. package/dist/src/session/lifecycle-timestamps.js +16 -0
  501. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  502. package/dist/src/session/manager.d.ts +7 -1
  503. package/dist/src/session/manager.js +8 -1
  504. package/dist/src/session/manager.js.map +1 -1
  505. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  506. package/dist/src/session/parity/sessions-json-file.js +1 -1
  507. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  508. package/dist/src/session/parity/transcript-paths.js +2 -2
  509. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  510. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  511. package/dist/src/session/reset-policy.d.ts +32 -0
  512. package/dist/src/session/reset-policy.js +65 -0
  513. package/dist/src/session/reset-policy.js.map +1 -0
  514. package/dist/src/session/reset-triggers.d.ts +20 -0
  515. package/dist/src/session/reset-triggers.js +63 -0
  516. package/dist/src/session/reset-triggers.js.map +1 -0
  517. package/dist/src/session/reset-type.d.ts +12 -0
  518. package/dist/src/session/reset-type.js +25 -0
  519. package/dist/src/session/reset-type.js.map +1 -0
  520. package/dist/src/session/resolve-session.d.ts +30 -0
  521. package/dist/src/session/resolve-session.js +93 -0
  522. package/dist/src/session/resolve-session.js.map +1 -0
  523. package/dist/src/session/search-index-cache.js +1 -1
  524. package/dist/src/session/search-index.js +1 -1
  525. package/dist/src/session/session-title.js +3 -2
  526. package/dist/src/session/session-title.js.map +1 -1
  527. package/dist/src/session/store.d.ts +11 -4
  528. package/dist/src/session/store.js +62 -11
  529. package/dist/src/session/store.js.map +1 -1
  530. package/dist/src/session/transcript-events.js +2 -1
  531. package/dist/src/session/transcript-events.js.map +1 -1
  532. package/dist/src/share/share-auto.js +2 -2
  533. package/dist/src/share/share-store.js +3 -3
  534. package/dist/src/share/share-thumbnail.js +2 -2
  535. package/dist/src/share/share-url.d.ts +33 -0
  536. package/dist/src/share/share-url.js +56 -14
  537. package/dist/src/share/share-url.js.map +1 -1
  538. package/dist/src/share/share-zip.js +1 -1
  539. package/dist/src/share/site-share-store.js +3 -3
  540. package/dist/src/share/site-static-serve.js +1 -1
  541. package/dist/src/tui/backends/embedded-backend.js +4 -9
  542. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  543. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  544. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  545. package/dist/src/tui/clipboard-image.js +3 -3
  546. package/dist/src/tui/components/chat-log.js +3 -3
  547. package/dist/src/tui/components/chat-log.js.map +1 -1
  548. package/dist/src/tui/theme-manager.js +1 -1
  549. package/dist/src/tui/theme.d.ts +0 -2
  550. package/dist/src/tui/theme.js +1 -3
  551. package/dist/src/tui/theme.js.map +1 -1
  552. package/dist/src/tui/tui-agent-events.js +2 -1
  553. package/dist/src/tui/tui-agent-events.js.map +1 -1
  554. package/dist/src/tui/tui-commands.d.ts +3 -0
  555. package/dist/src/tui/tui-commands.js +45 -10
  556. package/dist/src/tui/tui-commands.js.map +1 -1
  557. package/dist/src/tui/tui-keybindings-file.js +2 -22
  558. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  559. package/dist/src/tui/tui-scoped-models.js +2 -2
  560. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  561. package/dist/src/tui/tui-session-actions.js +88 -0
  562. package/dist/src/tui/tui-session-actions.js.map +1 -0
  563. package/dist/src/tui/tui-settings.js +1 -1
  564. package/dist/src/tui/tui.js +54 -49
  565. package/dist/src/tui/tui.js.map +1 -1
  566. package/dist/src/tunnel/frpc-binary.js +3 -3
  567. package/dist/src/tunnel/frpc-config.js +1 -1
  568. package/dist/src/tunnel/frpc-extract.js +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/string-coerce.d.ts +2 -0
  574. package/dist/src/utils/string-coerce.js +10 -1
  575. package/dist/src/utils/string-coerce.js.map +1 -1
  576. package/dist/src/voice/metadata/builtin.d.ts +2 -0
  577. package/dist/src/voice/metadata/builtin.js +420 -0
  578. package/dist/src/voice/metadata/builtin.js.map +1 -0
  579. package/dist/src/voice/metadata/index.d.ts +4 -0
  580. package/dist/src/voice/metadata/index.js +3 -0
  581. package/dist/src/voice/metadata/registry.d.ts +5 -0
  582. package/dist/src/voice/metadata/registry.js +34 -0
  583. package/dist/src/voice/metadata/registry.js.map +1 -0
  584. package/dist/src/voice/metadata/types.d.ts +41 -0
  585. package/dist/src/voice/metadata/types.js +1 -0
  586. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  587. package/dist/src/voice/stt/config-slice.js +5 -26
  588. package/dist/src/voice/stt/config-slice.js.map +1 -1
  589. package/dist/src/voice/stt/list-providers.d.ts +3 -3
  590. package/dist/src/voice/stt/list-providers.js +41 -6
  591. package/dist/src/voice/stt/list-providers.js.map +1 -1
  592. package/dist/src/voice/stt/types.d.ts +1 -18
  593. package/dist/src/voice/stt/types.js +4 -2
  594. package/dist/src/voice/stt/types.js.map +1 -1
  595. package/dist/src/voice/tts/audio.js +1 -1
  596. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  597. package/dist/src/voice/tts/config-slice.js +7 -38
  598. package/dist/src/voice/tts/config-slice.js.map +1 -1
  599. package/dist/src/voice/tts/list-providers.d.ts +3 -3
  600. package/dist/src/voice/tts/list-providers.js +41 -6
  601. package/dist/src/voice/tts/list-providers.js.map +1 -1
  602. package/dist/src/voice/tts/merge-config.js +2 -48
  603. package/dist/src/voice/tts/merge-config.js.map +1 -1
  604. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  605. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  606. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  607. package/dist/src/voice/tts/types.d.ts +1 -29
  608. package/dist/src/voice/tts/types.js +19 -17
  609. package/dist/src/voice/tts/types.js.map +1 -1
  610. package/dist/src/workflows/domain/command.d.ts +18 -0
  611. package/dist/src/workflows/domain/command.js +1 -0
  612. package/dist/src/workflows/domain/definition.d.ts +62 -0
  613. package/dist/src/workflows/domain/definition.js +1 -0
  614. package/dist/src/workflows/domain/event.d.ts +67 -0
  615. package/dist/src/workflows/domain/event.js +1 -0
  616. package/dist/src/workflows/domain/index.d.ts +5 -0
  617. package/dist/src/workflows/domain/index.js +2 -0
  618. package/dist/src/workflows/domain/result.d.ts +65 -0
  619. package/dist/src/workflows/domain/result.js +1 -0
  620. package/dist/src/workflows/domain/run.d.ts +120 -0
  621. package/dist/src/workflows/domain/run.js +14 -0
  622. package/dist/src/workflows/domain/run.js.map +1 -0
  623. package/dist/src/workflows/engine/index.d.ts +2 -0
  624. package/dist/src/workflows/engine/index.js +3 -0
  625. package/dist/src/workflows/engine/projector.d.ts +3 -0
  626. package/dist/src/workflows/engine/projector.js +205 -0
  627. package/dist/src/workflows/engine/projector.js.map +1 -0
  628. package/dist/src/workflows/engine/workflow-engine.d.ts +31 -0
  629. package/dist/src/workflows/engine/workflow-engine.js +188 -0
  630. package/dist/src/workflows/engine/workflow-engine.js.map +1 -0
  631. package/dist/src/workflows/index.d.ts +6 -0
  632. package/dist/src/workflows/index.js +11 -0
  633. package/dist/src/workflows/runtime/index.d.ts +1 -0
  634. package/dist/src/workflows/runtime/index.js +4 -0
  635. package/dist/src/workflows/runtime/script-runtime.d.ts +3 -0
  636. package/dist/src/workflows/runtime/script-runtime.js +3 -0
  637. package/dist/src/workflows/store/event-store.d.ts +17 -0
  638. package/dist/src/workflows/store/event-store.js +83 -0
  639. package/dist/src/workflows/store/event-store.js.map +1 -0
  640. package/dist/src/workflows/store/paths.d.ts +7 -0
  641. package/dist/src/workflows/store/paths.js +26 -0
  642. package/dist/src/workflows/store/paths.js.map +1 -0
  643. package/dist/src/workflows/store/run-store.d.ts +13 -0
  644. package/dist/src/workflows/store/run-store.js +68 -0
  645. package/dist/src/workflows/store/run-store.js.map +1 -0
  646. package/package.json +5 -8
  647. package/dist/gateway/static/root/assets/agents-mS3_HpRI.js +0 -222
  648. package/dist/gateway/static/root/assets/channels-settings-BG6b9KrW.js +0 -1
  649. package/dist/gateway/static/root/assets/extension-settings-page-B-W4x2xP.js +0 -1
  650. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  651. package/dist/gateway/static/root/assets/sessions-page-FaG_Vlkb.js +0 -1
  652. package/dist/gateway/static/root/assets/settings-page-Bet1OerL.js +0 -3
  653. package/dist/gateway/static/root/assets/skills-page-DhUO235y.js +0 -2
  654. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  655. package/dist/gateway/static/root/assets/voice-api-key-field-CGEydndO.js +0 -1
  656. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  657. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  658. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -1,270 +1,36 @@
1
- import { OPENAI_TTS_MODELS, OPENAI_TTS_VOICES } from "../voice/tts/providers/openai-speech.js";
2
- import "../voice/tts/index.js";
1
+ import { listVoiceProviderMetadata } from "../voice/metadata/registry.js";
2
+ import "../voice/metadata/index.js";
3
3
  //#region src/config/voice.ts
4
- /**
5
- * Voice (STT/TTS) Model Configuration
6
- *
7
- * This module provides available STT/TTS models for the UI.
8
- * Models can be extended via config file or environment variables.
9
- */
10
- const DEFAULT_STT_ALIBABA = [
11
- {
12
- id: "paraformer-v2",
13
- name: "Paraformer v2 (Recommended)"
14
- },
15
- {
16
- id: "paraformer-v1",
17
- name: "Paraformer v1"
18
- },
19
- {
20
- id: "paraformer-8k-v1",
21
- name: "Paraformer 8k v1 (Phone)"
22
- },
23
- {
24
- id: "paraformer-mtl-v1",
25
- name: "Paraformer MTL v1 (Multilingual)"
26
- }
27
- ];
28
- const DEFAULT_STT_OPENAI = [{
29
- id: "whisper-1",
30
- name: "Whisper-1"
31
- }];
32
- const DEFAULT_TTS_OPENAI = OPENAI_TTS_MODELS.map((id) => ({
33
- id,
34
- name: id === "tts-1" ? "TTS-1 (Fast)" : id === "tts-1-hd" ? "TTS-1 HD (High Quality)" : id === "gpt-4o-mini-tts" ? "GPT-4o Mini TTS (Latest)" : id
35
- }));
36
- const DEFAULT_TTS_ALIBABA = [
37
- {
38
- id: "qwen-tts",
39
- name: "Qwen TTS (Recommended)"
40
- },
41
- {
42
- id: "qwen-tts-realtime",
43
- name: "Qwen TTS Realtime"
44
- },
45
- {
46
- id: "qwen3-tts-flash",
47
- name: "Qwen3 TTS Flash"
48
- },
49
- {
50
- id: "qwen3-tts-instruct-flash",
51
- name: "Qwen3 TTS Instruct Flash"
52
- }
53
- ];
54
- const DEFAULT_TTS_EDGE = [{
55
- id: "edge-default",
56
- name: "Edge TTS (Free)"
57
- }];
58
- const DEFAULT_TTS_MINIMAX = [
59
- {
60
- id: "speech-2.8-hd",
61
- name: "Speech 2.8 HD (Recommended)"
62
- },
63
- {
64
- id: "speech-2.8-turbo",
65
- name: "Speech 2.8 Turbo (Fast)"
66
- },
67
- {
68
- id: "speech-2.6-hd",
69
- name: "Speech 2.6 HD"
70
- },
71
- {
72
- id: "speech-2.6-turbo",
73
- name: "Speech 2.6 Turbo"
74
- },
75
- {
76
- id: "speech-02-hd",
77
- name: "Speech 02 HD"
78
- },
79
- {
80
- id: "speech-02-turbo",
81
- name: "Speech 02 Turbo"
82
- }
83
- ];
84
- const DEFAULT_TTS_VOICES_ALIBABA = [
85
- {
86
- id: "Cherry",
87
- name: "Cherry"
88
- },
89
- {
90
- id: "longxiaochun",
91
- name: "Long Xiao Chun (龙小春)"
92
- },
93
- {
94
- id: "longcheng",
95
- name: "Long Cheng (龙呈)"
96
- },
97
- {
98
- id: "xiaogang",
99
- name: "Xiao Gang (小刚)"
100
- },
101
- {
102
- id: "xiaoxian",
103
- name: "Xiao Xian (小娴)"
104
- }
105
- ];
106
- const DEFAULT_TTS_VOICES_OPENAI = OPENAI_TTS_VOICES.map((id) => ({
107
- id,
108
- name: id.charAt(0).toUpperCase() + id.slice(1)
109
- }));
110
- const DEFAULT_TTS_VOICES_MINIMAX = [
111
- {
112
- id: "male-qn-qingse",
113
- name: "Male Qingse (青涩男声)"
114
- },
115
- {
116
- id: "male-qn-jingying",
117
- name: "Male Jingying (精英男声)"
118
- },
119
- {
120
- id: "male-qn-badao",
121
- name: "Male Badao (霸道男声)"
122
- },
123
- {
124
- id: "male-qn-daxuesheng",
125
- name: "Male Daxuesheng (大学生男声)"
126
- },
127
- {
128
- id: "female-shaonv",
129
- name: "Female Shaonv (少女音)"
130
- },
131
- {
132
- id: "female-yujie",
133
- name: "Female Yujie (御姐音)"
134
- },
135
- {
136
- id: "female-chengshu",
137
- name: "Female Chengshu (成熟女声)"
138
- },
139
- {
140
- id: "female-tianmei",
141
- name: "Female Tianmei (甜美女声)"
142
- },
143
- {
144
- id: "audiobook_male_1",
145
- name: "Audiobook Male 1"
146
- },
147
- {
148
- id: "audiobook_male_2",
149
- name: "Audiobook Male 2"
150
- },
151
- {
152
- id: "audiobook_female_1",
153
- name: "Audiobook Female 1"
154
- },
155
- {
156
- id: "audiobook_female_2",
157
- name: "Audiobook Female 2"
158
- },
159
- {
160
- id: "presenter_male",
161
- name: "Presenter Male"
162
- },
163
- {
164
- id: "presenter_female",
165
- name: "Presenter Female"
166
- }
167
- ];
168
- const DEFAULT_TTS_VOICES_EDGE = [
169
- {
170
- id: "en-US-MichelleNeural",
171
- name: "Michelle (US English, Female)"
172
- },
173
- {
174
- id: "en-US-JennyNeural",
175
- name: "Jenny (US English, Female)"
176
- },
177
- {
178
- id: "en-US-GuyNeural",
179
- name: "Guy (US English, Male)"
180
- },
181
- {
182
- id: "en-GB-SoniaNeural",
183
- name: "Sonia (UK English, Female)"
184
- },
185
- {
186
- id: "en-GB-RyanNeural",
187
- name: "Ryan (UK English, Male)"
188
- },
189
- {
190
- id: "zh-CN-XiaoxiaoNeural",
191
- name: "晓晓 (中文, 女声)"
192
- },
193
- {
194
- id: "zh-CN-YunyangNeural",
195
- name: "云扬 (中文, 男声)"
196
- },
197
- {
198
- id: "zh-CN-XiaoyiNeural",
199
- name: "晓伊 (中文, 女声)"
200
- },
201
- {
202
- id: "ja-JP-NanamiNeural",
203
- name: "七海 (日本語, 女性)"
204
- },
205
- {
206
- id: "de-DE-KatjaNeural",
207
- name: "Katja (Deutsch, Weiblich)"
208
- },
209
- {
210
- id: "fr-FR-DeniseNeural",
211
- name: "Denise (Français, Féminin)"
212
- },
213
- {
214
- id: "es-ES-ElviraNeural",
215
- name: "Elvira (Español, Femenino)"
216
- }
217
- ];
4
+ function toVoiceModels(values) {
5
+ return (values ?? []).map((value) => ({
6
+ id: value.id,
7
+ name: value.name,
8
+ ...value.description ? { description: value.description } : {}
9
+ }));
10
+ }
218
11
  function getVoiceModelsConfig() {
219
- return {
220
- stt: {
221
- alibaba: DEFAULT_STT_ALIBABA,
222
- openai: DEFAULT_STT_OPENAI
223
- },
224
- tts: {
225
- alibaba: DEFAULT_TTS_ALIBABA,
226
- openai: DEFAULT_TTS_OPENAI,
227
- edge: DEFAULT_TTS_EDGE,
228
- minimax: DEFAULT_TTS_MINIMAX
229
- },
230
- ttsVoices: {
231
- alibaba: DEFAULT_TTS_VOICES_ALIBABA,
232
- openai: DEFAULT_TTS_VOICES_OPENAI,
233
- edge: DEFAULT_TTS_VOICES_EDGE,
234
- minimax: DEFAULT_TTS_VOICES_MINIMAX
235
- }
12
+ const config = {
13
+ stt: {},
14
+ tts: {},
15
+ ttsVoices: {}
236
16
  };
17
+ for (const metadata of listVoiceProviderMetadata()) {
18
+ if (metadata.capability === "stt") {
19
+ config.stt[metadata.id] = toVoiceModels(metadata.models);
20
+ continue;
21
+ }
22
+ config.tts[metadata.id] = toVoiceModels(metadata.models);
23
+ config.ttsVoices[metadata.id] = toVoiceModels(metadata.voices);
24
+ }
25
+ return config;
237
26
  }
238
- /**
239
- * Get available TTS providers for UI
240
- */
241
27
  function getTTSProviders() {
242
- return [
243
- {
244
- id: "openai",
245
- name: "OpenAI",
246
- description: "High quality, multiple voices"
247
- },
248
- {
249
- id: "alibaba",
250
- name: "Alibaba",
251
- description: "Qwen TTS, good for Chinese"
252
- },
253
- {
254
- id: "minimax",
255
- name: "MiniMax",
256
- description: "High quality, 40+ languages"
257
- },
258
- {
259
- id: "edge",
260
- name: "Microsoft Edge",
261
- description: "Free, 100+ voices, multi-language"
262
- }
263
- ];
28
+ return listVoiceProviderMetadata("tts").map((metadata) => ({
29
+ id: metadata.id,
30
+ name: metadata.displayName,
31
+ ...metadata.description ? { description: metadata.description } : {}
32
+ }));
264
33
  }
265
- /**
266
- * Get TTS trigger modes for UI
267
- */
268
34
  function getTTSTriggerModes() {
269
35
  return [
270
36
  {
@@ -1 +1 @@
1
- {"version":3,"file":"voice.js","names":[],"sources":["../../../src/config/voice.ts"],"sourcesContent":["/**\n * Voice (STT/TTS) Model Configuration\n *\n * This module provides available STT/TTS models for the UI.\n * Models can be extended via config file or environment variables.\n */\n\nimport { OPENAI_TTS_MODELS, OPENAI_TTS_VOICES } from '../voice/tts/index.js';\n\nexport interface VoiceModel {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface VoiceModelsConfig {\n stt: {\n alibaba: VoiceModel[];\n openai: VoiceModel[];\n };\n tts: {\n alibaba: VoiceModel[];\n openai: VoiceModel[];\n edge: VoiceModel[];\n minimax: VoiceModel[];\n };\n ttsVoices: {\n alibaba: VoiceModel[];\n openai: VoiceModel[];\n edge: VoiceModel[];\n minimax: VoiceModel[];\n };\n}\n\n// Default STT models\nconst DEFAULT_STT_ALIBABA: VoiceModel[] = [\n { id: 'paraformer-v2', name: 'Paraformer v2 (Recommended)' },\n { id: 'paraformer-v1', name: 'Paraformer v1' },\n { id: 'paraformer-8k-v1', name: 'Paraformer 8k v1 (Phone)' },\n { id: 'paraformer-mtl-v1', name: 'Paraformer MTL v1 (Multilingual)' },\n];\n\nconst DEFAULT_STT_OPENAI: VoiceModel[] = [\n { id: 'whisper-1', name: 'Whisper-1' },\n];\n\n// Default TTS models - dynamically from TTS module\nconst DEFAULT_TTS_OPENAI: VoiceModel[] = OPENAI_TTS_MODELS.map(id => ({\n id,\n name: id === 'tts-1' ? 'TTS-1 (Fast)' :\n id === 'tts-1-hd' ? 'TTS-1 HD (High Quality)' :\n id === 'gpt-4o-mini-tts' ? 'GPT-4o Mini TTS (Latest)' :\n id,\n}));\n\nconst DEFAULT_TTS_ALIBABA: VoiceModel[] = [\n { id: 'qwen-tts', name: 'Qwen TTS (Recommended)' },\n { id: 'qwen-tts-realtime', name: 'Qwen TTS Realtime' },\n { id: 'qwen3-tts-flash', name: 'Qwen3 TTS Flash' },\n { id: 'qwen3-tts-instruct-flash', name: 'Qwen3 TTS Instruct Flash' },\n];\n\nconst DEFAULT_TTS_EDGE: VoiceModel[] = [\n { id: 'edge-default', name: 'Edge TTS (Free)' },\n];\n\nconst DEFAULT_TTS_MINIMAX: VoiceModel[] = [\n { id: 'speech-2.8-hd', name: 'Speech 2.8 HD (Recommended)' },\n { id: 'speech-2.8-turbo', name: 'Speech 2.8 Turbo (Fast)' },\n { id: 'speech-2.6-hd', name: 'Speech 2.6 HD' },\n { id: 'speech-2.6-turbo', name: 'Speech 2.6 Turbo' },\n { id: 'speech-02-hd', name: 'Speech 02 HD' },\n { id: 'speech-02-turbo', name: 'Speech 02 Turbo' },\n];\n\n// Default TTS voices\nconst DEFAULT_TTS_VOICES_ALIBABA: VoiceModel[] = [\n { id: 'Cherry', name: 'Cherry' },\n { id: 'longxiaochun', name: 'Long Xiao Chun (龙小春)' },\n { id: 'longcheng', name: 'Long Cheng (龙呈)' },\n { id: 'xiaogang', name: 'Xiao Gang (小刚)' },\n { id: 'xiaoxian', name: 'Xiao Xian (小娴)' },\n];\n\nconst DEFAULT_TTS_VOICES_OPENAI: VoiceModel[] = OPENAI_TTS_VOICES.map(id => ({\n id,\n name: id.charAt(0).toUpperCase() + id.slice(1),\n}));\n\n// Edge TTS popular voices\nconst DEFAULT_TTS_VOICES_MINIMAX: VoiceModel[] = [\n { id: 'male-qn-qingse', name: 'Male Qingse (青涩男声)' },\n { id: 'male-qn-jingying', name: 'Male Jingying (精英男声)' },\n { id: 'male-qn-badao', name: 'Male Badao (霸道男声)' },\n { id: 'male-qn-daxuesheng', name: 'Male Daxuesheng (大学生男声)' },\n { id: 'female-shaonv', name: 'Female Shaonv (少女音)' },\n { id: 'female-yujie', name: 'Female Yujie (御姐音)' },\n { id: 'female-chengshu', name: 'Female Chengshu (成熟女声)' },\n { id: 'female-tianmei', name: 'Female Tianmei (甜美女声)' },\n { id: 'audiobook_male_1', name: 'Audiobook Male 1' },\n { id: 'audiobook_male_2', name: 'Audiobook Male 2' },\n { id: 'audiobook_female_1', name: 'Audiobook Female 1' },\n { id: 'audiobook_female_2', name: 'Audiobook Female 2' },\n { id: 'presenter_male', name: 'Presenter Male' },\n { id: 'presenter_female', name: 'Presenter Female' },\n];\n\nconst DEFAULT_TTS_VOICES_EDGE: VoiceModel[] = [\n { id: 'en-US-MichelleNeural', name: 'Michelle (US English, Female)' },\n { id: 'en-US-JennyNeural', name: 'Jenny (US English, Female)' },\n { id: 'en-US-GuyNeural', name: 'Guy (US English, Male)' },\n { id: 'en-GB-SoniaNeural', name: 'Sonia (UK English, Female)' },\n { id: 'en-GB-RyanNeural', name: 'Ryan (UK English, Male)' },\n { id: 'zh-CN-XiaoxiaoNeural', name: '晓晓 (中文, 女声)' },\n { id: 'zh-CN-YunyangNeural', name: '云扬 (中文, 男声)' },\n { id: 'zh-CN-XiaoyiNeural', name: '晓伊 (中文, 女声)' },\n { id: 'ja-JP-NanamiNeural', name: '七海 (日本語, 女性)' },\n { id: 'de-DE-KatjaNeural', name: 'Katja (Deutsch, Weiblich)' },\n { id: 'fr-FR-DeniseNeural', name: 'Denise (Français, Féminin)' },\n { id: 'es-ES-ElviraNeural', name: 'Elvira (Español, Femenino)' },\n];\n\nexport function getVoiceModelsConfig(): VoiceModelsConfig {\n return {\n stt: {\n alibaba: DEFAULT_STT_ALIBABA,\n openai: DEFAULT_STT_OPENAI,\n },\n tts: {\n alibaba: DEFAULT_TTS_ALIBABA,\n openai: DEFAULT_TTS_OPENAI,\n edge: DEFAULT_TTS_EDGE,\n minimax: DEFAULT_TTS_MINIMAX,\n },\n ttsVoices: {\n alibaba: DEFAULT_TTS_VOICES_ALIBABA,\n openai: DEFAULT_TTS_VOICES_OPENAI,\n edge: DEFAULT_TTS_VOICES_EDGE,\n minimax: DEFAULT_TTS_VOICES_MINIMAX,\n },\n };\n}\n\n/**\n * Get available TTS providers for UI\n */\nexport function getTTSProviders(): Array<{ id: string; name: string; description?: string }> {\n return [\n { id: 'openai', name: 'OpenAI', description: 'High quality, multiple voices' },\n { id: 'alibaba', name: 'Alibaba', description: 'Qwen TTS, good for Chinese' },\n { id: 'minimax', name: 'MiniMax', description: 'High quality, 40+ languages' },\n { id: 'edge', name: 'Microsoft Edge', description: 'Free, 100+ voices, multi-language' },\n ];\n}\n\n/**\n * Get TTS trigger modes for UI\n */\nexport function getTTSTriggerModes(): Array<{ id: string; name: string; description: string }> {\n return [\n { id: 'off', name: 'Disabled', description: 'TTS is completely disabled' },\n { id: 'always', name: 'Always', description: 'Apply TTS to all messages' },\n { id: 'inbound', name: 'Inbound Audio', description: 'Only when user sends voice message' },\n { id: 'tagged', name: 'Tagged', description: 'Only when [[tts]] directive is used' },\n ];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"voice.js","names":[],"sources":["../../../src/config/voice.ts"],"sourcesContent":["import { listVoiceProviderMetadata } from '../voice/metadata/index.js';\n\nexport interface VoiceModel {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface VoiceModelsConfig {\n stt: Record<string, VoiceModel[]>;\n tts: Record<string, VoiceModel[]>;\n ttsVoices: Record<string, VoiceModel[]>;\n}\n\nfunction toVoiceModels(values: VoiceModel[] | undefined): VoiceModel[] {\n return (values ?? []).map((value) => ({\n id: value.id,\n name: value.name,\n ...(value.description ? { description: value.description } : {}),\n }));\n}\n\nexport function getVoiceModelsConfig(): VoiceModelsConfig {\n const config: VoiceModelsConfig = { stt: {}, tts: {}, ttsVoices: {} };\n for (const metadata of listVoiceProviderMetadata()) {\n if (metadata.capability === 'stt') {\n config.stt[metadata.id] = toVoiceModels(metadata.models);\n continue;\n }\n config.tts[metadata.id] = toVoiceModels(metadata.models);\n config.ttsVoices[metadata.id] = toVoiceModels(metadata.voices);\n }\n return config;\n}\n\nexport function getTTSProviders(): Array<{ id: string; name: string; description?: string }> {\n return listVoiceProviderMetadata('tts').map((metadata) => ({\n id: metadata.id,\n name: metadata.displayName,\n ...(metadata.description ? { description: metadata.description } : {}),\n }));\n}\n\nexport function getTTSTriggerModes(): Array<{ id: string; name: string; description: string }> {\n return [\n { id: 'off', name: 'Disabled', description: 'TTS is completely disabled' },\n { id: 'always', name: 'Always', description: 'Apply TTS to all messages' },\n { id: 'inbound', name: 'Inbound Audio', description: 'Only when user sends voice message' },\n { id: 'tagged', name: 'Tagged', description: 'Only when [[tts]] directive is used' },\n ];\n}\n"],"mappings":";;;AAcA,SAAS,cAAc,QAAgD;AACrE,SAAQ,UAAU,EAAE,EAAE,KAAK,WAAW;EACpC,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,aAAa,GAAG,EAAE;EAChE,EAAE;;AAGL,SAAgB,uBAA0C;CACxD,MAAM,SAA4B;EAAE,KAAK,EAAE;EAAE,KAAK,EAAE;EAAE,WAAW,EAAE;EAAE;AACrE,MAAK,MAAM,YAAY,2BAA2B,EAAE;AAClD,MAAI,SAAS,eAAe,OAAO;AACjC,UAAO,IAAI,SAAS,MAAM,cAAc,SAAS,OAAO;AACxD;;AAEF,SAAO,IAAI,SAAS,MAAM,cAAc,SAAS,OAAO;AACxD,SAAO,UAAU,SAAS,MAAM,cAAc,SAAS,OAAO;;AAEhE,QAAO;;AAGT,SAAgB,kBAA6E;AAC3F,QAAO,0BAA0B,MAAM,CAAC,KAAK,cAAc;EACzD,IAAI,SAAS;EACb,MAAM,SAAS;EACf,GAAI,SAAS,cAAc,EAAE,aAAa,SAAS,aAAa,GAAG,EAAE;EACtE,EAAE;;AAGL,SAAgB,qBAA+E;AAC7F,QAAO;EACL;GAAE,IAAI;GAAO,MAAM;GAAY,aAAa;GAA8B;EAC1E;GAAE,IAAI;GAAU,MAAM;GAAU,aAAa;GAA6B;EAC1E;GAAE,IAAI;GAAW,MAAM;GAAiB,aAAa;GAAsC;EAC3F;GAAE,IAAI;GAAU,MAAM;GAAU,aAAa;GAAuC;EACrF"}
@@ -4,8 +4,7 @@
4
4
  *
5
5
  * Lives in this file rather than `./schema.js` because schema.ts is the leaf
6
6
  * type module — letting it import agent-scope creates a circular cycle
7
- * (`schema → agent-scope → schema`). Callers import via the `./index.js`
8
- * barrel; backward-compat re-export keeps existing call sites working.
7
+ * (`schema → agent-scope → schema`). Callers import via the `./index.js` barrel.
9
8
  */
10
9
  import type { Config } from './schema.js';
11
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-path-helpers.js","names":[],"sources":["../../../src/config/workspace-path-helpers.ts"],"sourcesContent":["/**\n * Workspace-path domain helpers that need both `Config` (from `./schema.js`)\n * and agent-scope helpers (from `../agent/agent-scope.js`).\n *\n * Lives in this file rather than `./schema.js` because schema.ts is the leaf\n * type module — letting it import agent-scope creates a circular cycle\n * (`schema → agent-scope → schema`). Callers import via the `./index.js`\n * barrel; backward-compat re-export keeps existing call sites working.\n */\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\nimport type { Config } from './schema.js';\n\n/**\n * Default agent's resolved Markdown workspace root\n * (`resolveAgentWorkspaceDir` for the default agent id).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n"],"mappings":";;kBAUkE;;;;;AAOlE,SAAgB,iBAAiB,QAAwB;AACvD,QAAO,wBAAwB,OAAO"}
1
+ {"version":3,"file":"workspace-path-helpers.js","names":[],"sources":["../../../src/config/workspace-path-helpers.ts"],"sourcesContent":["/**\n * Workspace-path domain helpers that need both `Config` (from `./schema.js`)\n * and agent-scope helpers (from `../agent/agent-scope.js`).\n *\n * Lives in this file rather than `./schema.js` because schema.ts is the leaf\n * type module — letting it import agent-scope creates a circular cycle\n * (`schema → agent-scope → schema`). Callers import via the `./index.js` barrel.\n */\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\nimport type { Config } from './schema.js';\n\n/**\n * Default agent's resolved Markdown workspace root\n * (`resolveAgentWorkspaceDir` for the default agent id).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n"],"mappings":";;kBASkE;;;;;AAOlE,SAAgB,iBAAiB,QAAwB;AACvD,QAAO,wBAAwB,OAAO"}
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { homedir } from "node:os";
3
2
  import { parse, resolve } from "node:path";
3
+ import { homedir } from "node:os";
4
4
  //#region src/config/workspace-path.ts
5
5
  /** Expand leading `~` to the user home directory. */
6
6
  function expandWorkspacePathString(raw) {
@@ -1,7 +1,7 @@
1
- import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
2
- import { buildSessionKey, init_session_key } from "../routing/session-key.js";
3
1
  import { createLogger } from "../utils/logger/index.js";
4
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
4
+ import { buildSessionKey, init_session_key } from "../routing/session-key.js";
5
5
  import { bundledChannelPlugins } from "../generated/bundled-channel-plugins.js";
6
6
  import { shouldSilence, stripHeartbeatToken } from "../heartbeat/tokens.js";
7
7
  import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../channels/plugins/registry.js";
@@ -1,6 +1,6 @@
1
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
4
  import { JobDataSchema } from "./validation.js";
5
5
  import { access, readFile } from "fs/promises";
6
6
  //#region src/cron/persistence.ts
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveCronRunsDir } from "../config/paths.js";
4
- import { join } from "path";
5
4
  import { appendFile, mkdir, readFile, readdir, unlink, writeFile } from "fs/promises";
5
+ import { join } from "path";
6
6
  //#region src/cron/run-log-store.ts
7
7
  init_paths();
8
8
  init_logger();
@@ -1,5 +1,5 @@
1
- import os from "node:os";
2
1
  import path from "node:path";
2
+ import os from "node:os";
3
3
  //#region src/daemon/constants.ts
4
4
  /**
5
5
  * Daemon Constants - Service labels, paths, and configuration values
@@ -2,9 +2,9 @@ import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { SERVICE_VERSION_ENV_KEY, formatGatewayServiceDescription } from "./constants.js";
5
- import { homedir } from "node:os";
6
- import path from "node:path";
7
5
  import { existsSync } from "node:fs";
6
+ import path from "node:path";
7
+ import { homedir } from "node:os";
8
8
  //#region src/daemon/install-plan.ts
9
9
  /**
10
10
  * Install Plan Builder - Build gateway installation configuration
@@ -34,8 +34,32 @@ function isSEABinary() {
34
34
  function resolveEntryPoint() {
35
35
  if (isSEABinary()) return process.execPath;
36
36
  const thisDir = path.dirname(new URL(import.meta.url).pathname);
37
+ const sourceEntryPoint = path.join(thisDir, "..", "cli", "bin.ts");
38
+ if (existsSync(sourceEntryPoint)) return sourceEntryPoint;
37
39
  return path.join(thisDir, "..", "cli", "bin.js");
38
40
  }
41
+ function resolveServiceNodeArgs() {
42
+ const serviceNodeArgs = [];
43
+ const skipValueFlags = new Set([
44
+ "-e",
45
+ "--eval",
46
+ "-p",
47
+ "--print",
48
+ "--test-name-pattern"
49
+ ]);
50
+ for (let index = 0; index < process.execArgv.length; index += 1) {
51
+ const arg = process.execArgv[index];
52
+ if (!arg) continue;
53
+ if (arg.startsWith("--inspect") || arg.startsWith("--debug")) continue;
54
+ if (skipValueFlags.has(arg)) {
55
+ index += 1;
56
+ continue;
57
+ }
58
+ if ([...skipValueFlags].some((flag) => arg.startsWith(`${flag}=`))) continue;
59
+ serviceNodeArgs.push(arg);
60
+ }
61
+ return serviceNodeArgs;
62
+ }
39
63
  function buildGatewayInstallPlan(params) {
40
64
  const configPath = resolveDefaultConfigPath();
41
65
  const workspace = resolveDefaultWorkspace();
@@ -49,7 +73,7 @@ function buildGatewayInstallPlan(params) {
49
73
  params.port.toString()
50
74
  ];
51
75
  else {
52
- const nodeArgs = process.execArgv.filter((arg) => !arg.startsWith("--inspect") && !arg.startsWith("--debug"));
76
+ const nodeArgs = resolveServiceNodeArgs();
53
77
  const entryPoint = resolveEntryPoint();
54
78
  programArguments = [
55
79
  process.execPath,
@@ -1 +1 @@
1
- {"version":3,"file":"install-plan.js","names":[],"sources":["../../../src/daemon/install-plan.ts"],"sourcesContent":["/**\n * Install Plan Builder - Build gateway installation configuration\n *\n * Aligned with OpenClaw: adds XOPC_SERVICE_VERSION, StandardOut/ErrorPath,\n * supports binary runtime detection, and --foreground arg passing.\n */\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { homedir } from 'node:os';\nimport { createLogger } from '../utils/logger.js';\nimport { SERVICE_VERSION_ENV_KEY, formatGatewayServiceDescription } from './constants.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\nimport type { GatewayServiceInstallArgs, GatewayServiceEnv } from './types.js';\n\nconst log = createLogger('InstallPlan');\n\nexport interface InstallPlan {\n programArguments: string[];\n workingDirectory: string;\n environment: Record<string, string>;\n description: string;\n}\n\n// ─── Path Resolution ───\n\nfunction resolveDefaultConfigPath(): string {\n const envConfig = process.env.XOPC_CONFIG || process.env.XOPC_CONFIG_PATH;\n if (envConfig) return envConfig;\n return path.join(homedir(), '.xopc', 'xopc.json');\n}\n\nfunction resolveDefaultWorkspace(): string {\n const envWorkspace = process.env.XOPC_WORKSPACE;\n if (envWorkspace) return envWorkspace;\n return path.join(homedir(), '.xopc', 'workspace');\n}\n\nfunction resolveLogDir(): string {\n return path.join(homedir(), '.xopc', 'logs');\n}\n\n// ─── Binary Detection ───\n\nfunction isSEABinary(): boolean {\n // Node.js SEA (Single Executable Application) detection\n return !!(process as NodeJS.Process & { pkg?: unknown }).pkg ||\n process.execPath.endsWith('xopc') ||\n process.execPath.endsWith('xopc.exe');\n}\n\nfunction resolveEntryPoint(): string {\n if (isSEABinary()) {\n return process.execPath;\n }\n // Must match package.json \"bin\" (cli/bin.js). index.js only exports runCli and exits\n // immediately when executed directly — systemd/LaunchAgent need the real entry.\n const thisDir = path.dirname(new URL(import.meta.url).pathname);\n return path.join(thisDir, '..', 'cli', 'bin.js');\n}\n\n// ─── Plan Builder ───\n\nexport function buildGatewayInstallPlan(params: {\n port: number;\n bind?: import('../config/schema.js').GatewayBindMode;\n token?: string;\n env?: GatewayServiceEnv;\n runtime?: 'node' | 'binary';\n version?: string;\n}): InstallPlan {\n const configPath = resolveDefaultConfigPath();\n const workspace = resolveDefaultWorkspace();\n const version = params.version || PACKAGE_VERSION;\n\n // Determine program + arguments\n let programArguments: string[];\n\n if (params.runtime === 'binary' || isSEABinary()) {\n // SEA binary: direct execution\n const binaryPath = process.execPath;\n programArguments = [binaryPath, 'gateway', '--foreground', '--port', params.port.toString()];\n } else {\n // Node.js runtime\n const nodeArgs = process.execArgv.filter(\n (arg) => !arg.startsWith('--inspect') && !arg.startsWith('--debug'),\n );\n const entryPoint = resolveEntryPoint();\n programArguments = [\n process.execPath,\n ...nodeArgs,\n entryPoint,\n 'gateway',\n '--foreground',\n '--port', params.port.toString(),\n ];\n }\n\n if (params.bind && params.bind !== 'loopback') {\n programArguments.push('--bind', params.bind);\n }\n\n // Build environment\n const environment: Record<string, string> = {\n XOPC_CONFIG: configPath,\n XOPC_WORKSPACE: workspace,\n XOPC_LOG_LEVEL: process.env.XOPC_LOG_LEVEL || 'info',\n XOPC_LOG_FILE: 'true',\n XOPC_LOG_CONSOLE: 'false',\n XOPC_LOG_DIR: resolveLogDir(),\n [SERVICE_VERSION_ENV_KEY]: version,\n XOPC_SERVICE_MARKER: '1',\n };\n\n if (params.token) {\n environment.XOPC_GATEWAY_TOKEN = params.token;\n }\n\n // Copy relevant API key env vars\n const relevantEnvVars = [\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'GOOGLE_API_KEY',\n 'BRAVE_API_KEY',\n 'DASHSCOPE_API_KEY',\n 'XOPC_LOG_RETENTION_DAYS',\n ];\n\n for (const key of relevantEnvVars) {\n if (process.env[key]) {\n environment[key] = process.env[key]!;\n }\n }\n\n // Add custom env from params (non-XOPC keys only; XOPC keys already handled)\n if (params.env) {\n for (const [key, value] of Object.entries(params.env)) {\n if (value !== undefined && !key.startsWith('XOPC_')) {\n environment[key] = value;\n }\n }\n }\n\n // Service description\n const profile = params.env?.XOPC_PROFILE?.trim() || undefined;\n const description = formatGatewayServiceDescription({ profile, version });\n\n log.info({\n programArguments: programArguments.slice(0, 3),\n envKeys: Object.keys(environment),\n version,\n }, 'Built gateway install plan');\n\n return {\n programArguments,\n workingDirectory: path.dirname(configPath),\n environment,\n description,\n };\n}\n\n// ─── Install Args Builder ───\n\nexport function buildGatewayInstallArgs(params: {\n port: number;\n bind?: import('../config/schema.js').GatewayBindMode;\n token?: string;\n env?: GatewayServiceEnv;\n runtime?: 'node' | 'binary';\n version?: string;\n}): GatewayServiceInstallArgs {\n const plan = buildGatewayInstallPlan(params);\n\n return {\n env: params.env || process.env,\n programArguments: plan.programArguments,\n workingDirectory: plan.workingDirectory,\n environment: plan.environment,\n description: plan.description,\n };\n}\n\n// ─── Validation ───\n\n/** Check if the program in an install plan still exists on disk */\nexport function validateInstallPlanProgram(programArguments: string[]): boolean {\n if (programArguments.length === 0) return false;\n const program = programArguments[0];\n return existsSync(program);\n}\n"],"mappings":";;;;;;;;;;;;;;aAUkD;sBAEM;AAGxD,MAAM,MAAM,aAAa,cAAc;AAWvC,SAAS,2BAAmC;CAC1C,MAAM,YAAY,QAAQ,IAAI,eAAe,QAAQ,IAAI;AACzD,KAAI,UAAW,QAAO;AACtB,QAAO,KAAK,KAAK,SAAS,EAAE,SAAS,YAAY;;AAGnD,SAAS,0BAAkC;CACzC,MAAM,eAAe,QAAQ,IAAI;AACjC,KAAI,aAAc,QAAO;AACzB,QAAO,KAAK,KAAK,SAAS,EAAE,SAAS,YAAY;;AAGnD,SAAS,gBAAwB;AAC/B,QAAO,KAAK,KAAK,SAAS,EAAE,SAAS,OAAO;;AAK9C,SAAS,cAAuB;AAE9B,QAAO,CAAC,CAAE,QAA+C,OACvD,QAAQ,SAAS,SAAS,OAAO,IACjC,QAAQ,SAAS,SAAS,WAAW;;AAGzC,SAAS,oBAA4B;AACnC,KAAI,aAAa,CACf,QAAO,QAAQ;CAIjB,MAAM,UAAU,KAAK,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS;AAC/D,QAAO,KAAK,KAAK,SAAS,MAAM,OAAO,SAAS;;AAKlD,SAAgB,wBAAwB,QAOxB;CACd,MAAM,aAAa,0BAA0B;CAC7C,MAAM,YAAY,yBAAyB;CAC3C,MAAM,UAAU,OAAO,WAAW;CAGlC,IAAI;AAEJ,KAAI,OAAO,YAAY,YAAY,aAAa,CAG9C,oBAAmB;EADA,QAAQ;EACK;EAAW;EAAgB;EAAU,OAAO,KAAK,UAAU;EAAC;MACvF;EAEL,MAAM,WAAW,QAAQ,SAAS,QAC/B,QAAQ,CAAC,IAAI,WAAW,YAAY,IAAI,CAAC,IAAI,WAAW,UAAU,CACpE;EACD,MAAM,aAAa,mBAAmB;AACtC,qBAAmB;GACjB,QAAQ;GACR,GAAG;GACH;GACA;GACA;GACA;GAAU,OAAO,KAAK,UAAU;GACjC;;AAGH,KAAI,OAAO,QAAQ,OAAO,SAAS,WACjC,kBAAiB,KAAK,UAAU,OAAO,KAAK;CAI9C,MAAM,cAAsC;EAC1C,aAAa;EACb,gBAAgB;EAChB,gBAAgB,QAAQ,IAAI,kBAAkB;EAC9C,eAAe;EACf,kBAAkB;EAClB,cAAc,eAAe;GAC5B,0BAA0B;EAC3B,qBAAqB;EACtB;AAED,KAAI,OAAO,MACT,aAAY,qBAAqB,OAAO;AAa1C,MAAK,MAAM,OAAO;EARhB;EACA;EACA;EACA;EACA;EACA;EAG+B,CAC/B,KAAI,QAAQ,IAAI,KACd,aAAY,OAAO,QAAQ,IAAI;AAKnC,KAAI,OAAO;OACJ,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,IAAI,CACnD,KAAI,UAAU,KAAA,KAAa,CAAC,IAAI,WAAW,QAAQ,CACjD,aAAY,OAAO;;CAOzB,MAAM,cAAc,gCAAgC;EAAE,SADtC,OAAO,KAAK,cAAc,MAAM,IAAI,KAAA;EACW;EAAS,CAAC;AAEzE,KAAI,KAAK;EACP,kBAAkB,iBAAiB,MAAM,GAAG,EAAE;EAC9C,SAAS,OAAO,KAAK,YAAY;EACjC;EACD,EAAE,6BAA6B;AAEhC,QAAO;EACL;EACA,kBAAkB,KAAK,QAAQ,WAAW;EAC1C;EACA;EACD;;AAKH,SAAgB,wBAAwB,QAOV;CAC5B,MAAM,OAAO,wBAAwB,OAAO;AAE5C,QAAO;EACL,KAAK,OAAO,OAAO,QAAQ;EAC3B,kBAAkB,KAAK;EACvB,kBAAkB,KAAK;EACvB,aAAa,KAAK;EAClB,aAAa,KAAK;EACnB;;;AAMH,SAAgB,2BAA2B,kBAAqC;AAC9E,KAAI,iBAAiB,WAAW,EAAG,QAAO;CAC1C,MAAM,UAAU,iBAAiB;AACjC,QAAO,WAAW,QAAQ"}
1
+ {"version":3,"file":"install-plan.js","names":[],"sources":["../../../src/daemon/install-plan.ts"],"sourcesContent":["/**\n * Install Plan Builder - Build gateway installation configuration\n *\n * Aligned with OpenClaw: adds XOPC_SERVICE_VERSION, StandardOut/ErrorPath,\n * supports binary runtime detection, and --foreground arg passing.\n */\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { homedir } from 'node:os';\nimport { createLogger } from '../utils/logger.js';\nimport { SERVICE_VERSION_ENV_KEY, formatGatewayServiceDescription } from './constants.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\nimport type { GatewayServiceInstallArgs, GatewayServiceEnv } from './types.js';\n\nconst log = createLogger('InstallPlan');\n\nexport interface InstallPlan {\n programArguments: string[];\n workingDirectory: string;\n environment: Record<string, string>;\n description: string;\n}\n\n// ─── Path Resolution ───\n\nfunction resolveDefaultConfigPath(): string {\n const envConfig = process.env.XOPC_CONFIG || process.env.XOPC_CONFIG_PATH;\n if (envConfig) return envConfig;\n return path.join(homedir(), '.xopc', 'xopc.json');\n}\n\nfunction resolveDefaultWorkspace(): string {\n const envWorkspace = process.env.XOPC_WORKSPACE;\n if (envWorkspace) return envWorkspace;\n return path.join(homedir(), '.xopc', 'workspace');\n}\n\nfunction resolveLogDir(): string {\n return path.join(homedir(), '.xopc', 'logs');\n}\n\n// ─── Binary Detection ───\n\nfunction isSEABinary(): boolean {\n // Node.js SEA (Single Executable Application) detection\n return !!(process as NodeJS.Process & { pkg?: unknown }).pkg ||\n process.execPath.endsWith('xopc') ||\n process.execPath.endsWith('xopc.exe');\n}\n\nfunction resolveEntryPoint(): string {\n if (isSEABinary()) {\n return process.execPath;\n }\n // Must match package.json \"bin\" in built packages, while source/dev runs use bin.ts.\n // index.js only exports runCli and exits immediately when executed directly.\n const thisDir = path.dirname(new URL(import.meta.url).pathname);\n const sourceEntryPoint = path.join(thisDir, '..', 'cli', 'bin.ts');\n if (existsSync(sourceEntryPoint)) {\n return sourceEntryPoint;\n }\n return path.join(thisDir, '..', 'cli', 'bin.js');\n}\n\nfunction resolveServiceNodeArgs(): string[] {\n const serviceNodeArgs: string[] = [];\n const skipValueFlags = new Set(['-e', '--eval', '-p', '--print', '--test-name-pattern']);\n\n for (let index = 0; index < process.execArgv.length; index += 1) {\n const arg = process.execArgv[index];\n if (!arg) continue;\n if (arg.startsWith('--inspect') || arg.startsWith('--debug')) continue;\n if (skipValueFlags.has(arg)) {\n index += 1;\n continue;\n }\n if ([...skipValueFlags].some((flag) => arg.startsWith(`${flag}=`))) continue;\n serviceNodeArgs.push(arg);\n }\n\n return serviceNodeArgs;\n}\n\n// ─── Plan Builder ───\n\nexport function buildGatewayInstallPlan(params: {\n port: number;\n bind?: import('../config/schema.js').GatewayBindMode;\n token?: string;\n env?: GatewayServiceEnv;\n runtime?: 'node' | 'binary';\n version?: string;\n}): InstallPlan {\n const configPath = resolveDefaultConfigPath();\n const workspace = resolveDefaultWorkspace();\n const version = params.version || PACKAGE_VERSION;\n\n // Determine program + arguments\n let programArguments: string[];\n\n if (params.runtime === 'binary' || isSEABinary()) {\n // SEA binary: direct execution\n const binaryPath = process.execPath;\n programArguments = [binaryPath, 'gateway', '--foreground', '--port', params.port.toString()];\n } else {\n // Node.js runtime\n const nodeArgs = resolveServiceNodeArgs();\n const entryPoint = resolveEntryPoint();\n programArguments = [\n process.execPath,\n ...nodeArgs,\n entryPoint,\n 'gateway',\n '--foreground',\n '--port', params.port.toString(),\n ];\n }\n\n if (params.bind && params.bind !== 'loopback') {\n programArguments.push('--bind', params.bind);\n }\n\n // Build environment\n const environment: Record<string, string> = {\n XOPC_CONFIG: configPath,\n XOPC_WORKSPACE: workspace,\n XOPC_LOG_LEVEL: process.env.XOPC_LOG_LEVEL || 'info',\n XOPC_LOG_FILE: 'true',\n XOPC_LOG_CONSOLE: 'false',\n XOPC_LOG_DIR: resolveLogDir(),\n [SERVICE_VERSION_ENV_KEY]: version,\n XOPC_SERVICE_MARKER: '1',\n };\n\n if (params.token) {\n environment.XOPC_GATEWAY_TOKEN = params.token;\n }\n\n // Copy relevant API key env vars\n const relevantEnvVars = [\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'GOOGLE_API_KEY',\n 'BRAVE_API_KEY',\n 'DASHSCOPE_API_KEY',\n 'XOPC_LOG_RETENTION_DAYS',\n ];\n\n for (const key of relevantEnvVars) {\n if (process.env[key]) {\n environment[key] = process.env[key]!;\n }\n }\n\n // Add custom env from params (non-XOPC keys only; XOPC keys already handled)\n if (params.env) {\n for (const [key, value] of Object.entries(params.env)) {\n if (value !== undefined && !key.startsWith('XOPC_')) {\n environment[key] = value;\n }\n }\n }\n\n // Service description\n const profile = params.env?.XOPC_PROFILE?.trim() || undefined;\n const description = formatGatewayServiceDescription({ profile, version });\n\n log.info({\n programArguments: programArguments.slice(0, 3),\n envKeys: Object.keys(environment),\n version,\n }, 'Built gateway install plan');\n\n return {\n programArguments,\n workingDirectory: path.dirname(configPath),\n environment,\n description,\n };\n}\n\n// ─── Install Args Builder ───\n\nexport function buildGatewayInstallArgs(params: {\n port: number;\n bind?: import('../config/schema.js').GatewayBindMode;\n token?: string;\n env?: GatewayServiceEnv;\n runtime?: 'node' | 'binary';\n version?: string;\n}): GatewayServiceInstallArgs {\n const plan = buildGatewayInstallPlan(params);\n\n return {\n env: params.env || process.env,\n programArguments: plan.programArguments,\n workingDirectory: plan.workingDirectory,\n environment: plan.environment,\n description: plan.description,\n };\n}\n\n// ─── Validation ───\n\n/** Check if the program in an install plan still exists on disk */\nexport function validateInstallPlanProgram(programArguments: string[]): boolean {\n if (programArguments.length === 0) return false;\n const program = programArguments[0];\n return existsSync(program);\n}\n"],"mappings":"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"}
@@ -10,5 +10,13 @@
10
10
  */
11
11
  import type { GatewayService, GatewayServiceEnv } from './types.js';
12
12
  export declare function resolveLaunchAgentPlistPath(env?: GatewayServiceEnv): string;
13
+ export declare function buildLaunchAgentPlist(params: {
14
+ label: string;
15
+ programArguments: string[];
16
+ workingDirectory?: string;
17
+ environment: Record<string, string>;
18
+ stdoutPath?: string;
19
+ stderrPath?: string;
20
+ }): string;
13
21
  export declare function isLaunchdAvailable(): boolean;
14
22
  export declare const launchdService: GatewayService;
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { resolveGatewayLaunchAgentLabel, resolveLaunchAgentPlistPath as resolveLaunchAgentPlistPath$1 } from "./constants.js";
4
- import os from "node:os";
5
- import path from "node:path";
6
4
  import { existsSync } from "node:fs";
7
5
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
6
+ import path from "node:path";
7
+ import os from "node:os";
8
8
  import { spawn, spawnSync } from "node:child_process";
9
9
  //#region src/daemon/launchd.ts
10
10
  /**
@@ -71,10 +71,7 @@ ${envDict}
71
71
  plist += ` <key>RunAtLoad</key>
72
72
  <true/>
73
73
  <key>KeepAlive</key>
74
- <dict>
75
- <key>SuccessfulExit</key>
76
- <false/>
77
- </dict>
74
+ <true/>
78
75
  <key>ThrottleInterval</key>
79
76
  <integer>10</integer>
80
77
  <key>ExitTimeOut</key>
@@ -220,15 +217,11 @@ const launchdService = {
220
217
  log.info("LaunchAgent stopped and disabled (plist removed)");
221
218
  } else {
222
219
  try {
223
- await launchctlExec([
224
- "kill",
225
- "SIGTERM",
226
- serviceTarget
227
- ]);
220
+ await launchctlExec(["bootout", serviceTarget]);
228
221
  } catch {
229
- log.debug("LaunchAgent kill SIGTERM failed (may not be running)");
222
+ log.debug("LaunchAgent bootout failed (may not be loaded)");
230
223
  }
231
- log.info("LaunchAgent stop signal sent");
224
+ log.info("LaunchAgent stopped and unloaded");
232
225
  }
233
226
  },
234
227
  async restart(args) {
@@ -300,6 +293,6 @@ const launchdService = {
300
293
  }
301
294
  };
302
295
  //#endregion
303
- export { isLaunchdAvailable, launchdService, resolveLaunchAgentPlistPath };
296
+ export { buildLaunchAgentPlist, isLaunchdAvailable, launchdService, resolveLaunchAgentPlistPath };
304
297
 
305
298
  //# sourceMappingURL=launchd.js.map