@xopcai/xopc 0.0.84 → 0.0.85

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 (410) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/plugin.d.ts +2 -0
  4. package/dist/extensions/feishu/src/plugin.js +10 -0
  5. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  6. package/dist/extensions/feishu/src/workflow-progress.d.ts +27 -0
  7. package/dist/extensions/feishu/src/workflow-progress.js +99 -0
  8. package/dist/extensions/feishu/src/workflow-progress.js.map +1 -0
  9. package/dist/extensions/telegram/src/plugin.d.ts +2 -0
  10. package/dist/extensions/telegram/src/plugin.js +11 -1
  11. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  12. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  13. package/dist/extensions/telegram/src/workflow-progress.d.ts +24 -0
  14. package/dist/extensions/telegram/src/workflow-progress.js +73 -0
  15. package/dist/extensions/telegram/src/workflow-progress.js.map +1 -0
  16. package/dist/extensions/telegram/xopc.extension.json +1 -1
  17. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +158 -0
  18. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -0
  19. package/dist/extensions/weixin/src/api/api.js +2 -2
  20. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  21. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  22. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  23. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  25. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  26. package/dist/extensions/weixin/src/plugin.d.ts +2 -0
  27. package/dist/extensions/weixin/src/plugin.js +11 -1
  28. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  29. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  30. package/dist/extensions/weixin/src/workflow-progress.d.ts +26 -0
  31. package/dist/extensions/weixin/src/workflow-progress.js +99 -0
  32. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -0
  33. package/dist/gateway/static/root/assets/agents-D3_-kNlZ.js +222 -0
  34. package/dist/gateway/static/root/assets/apps-page-D7v7649T.js +1 -0
  35. package/dist/gateway/static/root/assets/channels-settings-nCaMb0a7.js +1 -0
  36. package/dist/gateway/static/root/assets/channels-status-swr-C1gZBcJV.js +8 -0
  37. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +1 -0
  38. package/dist/gateway/static/root/assets/cron-api-CoYK0hlm.js +1 -0
  39. package/dist/gateway/static/root/assets/cron-page-DeGo-Vjc.js +1 -0
  40. package/dist/gateway/static/root/assets/dist-BTWC-BTN.js +45 -0
  41. package/dist/gateway/static/root/assets/{dist-CqNMNhJM.js → dist-DaK4dsss.js} +1 -1
  42. package/dist/gateway/static/root/assets/{extension-debug-page-gf2L0kY_.js → extension-debug-page-BZngZWbO.js} +1 -1
  43. package/dist/gateway/static/root/assets/extension-page-D6JSyV27.js +1 -0
  44. package/dist/gateway/static/root/assets/extension-settings-page-8PZcmWI7.js +1 -0
  45. package/dist/gateway/static/root/assets/fetch-B2MYHbWg.js +1 -0
  46. package/dist/gateway/static/root/assets/{field-primitives-DTtlp-l8.js → field-primitives-Zzl22MvN.js} +1 -1
  47. package/dist/gateway/static/root/assets/heartbeat-config-api-BtIcpG0O.js +1 -0
  48. package/dist/gateway/static/root/assets/index-D4vM3-P7.js +4700 -0
  49. package/dist/gateway/static/root/assets/index-ew_2L2We.css +1 -0
  50. package/dist/gateway/static/root/assets/logs-page-_d4UJ-qQ.js +1 -0
  51. package/dist/gateway/static/root/assets/sessions-page-5N4aF2Wk.js +1 -0
  52. package/dist/gateway/static/root/assets/settings-form-section-D_tgb8r2.js +1 -0
  53. package/dist/gateway/static/root/assets/settings-page-C18xBt4X.js +3 -0
  54. package/dist/gateway/static/root/assets/share-preview-page-D4EG_vM1.js +2 -0
  55. package/dist/gateway/static/root/assets/skills-page-sPAXhh8w.js +2 -0
  56. package/dist/gateway/static/root/assets/theme-store-DryYl3qD.js +1 -0
  57. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +3 -0
  58. package/dist/gateway/static/root/assets/utils-CYO9eTCM.js +1 -0
  59. package/dist/gateway/static/root/assets/voice-api-key-field-Ds51havm.js +1 -0
  60. package/dist/gateway/static/root/index.html +7 -6
  61. package/dist/package.js +1 -1
  62. package/dist/src/agent/agent-manager.js +7 -7
  63. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  64. package/dist/src/agent/context/workspace-seed.js +3 -3
  65. package/dist/src/agent/embedded/map-stream-events.js +6 -0
  66. package/dist/src/agent/embedded/map-stream-events.js.map +1 -1
  67. package/dist/src/agent/embedded/subscribe-session.js +24 -0
  68. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  69. package/dist/src/agent/embedded/types.d.ts +19 -0
  70. package/dist/src/agent/goals/goal-locale.js +2 -2
  71. package/dist/src/agent/goals/goal-run-store.js +4 -4
  72. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  73. package/dist/src/agent/goals/post-turn.js +2 -2
  74. package/dist/src/agent/image/load-image-media.js +2 -2
  75. package/dist/src/agent/ipc/bus.js +1 -1
  76. package/dist/src/agent/ipc/inbox.js +2 -2
  77. package/dist/src/agent/ipc/socket.js +1 -1
  78. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  79. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  80. package/dist/src/agent/memory/dreaming/events.js +1 -1
  81. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  82. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  83. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  84. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  85. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  86. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  87. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  88. package/dist/src/agent/models/manager.js +1 -1
  89. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  90. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  91. package/dist/src/agent/reply/startup-context.d.ts +3 -0
  92. package/dist/src/agent/reply/startup-context.js +25 -2
  93. package/dist/src/agent/reply/startup-context.js.map +1 -1
  94. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  95. package/dist/src/agent/sandbox/path-policy.js +2 -2
  96. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  97. package/dist/src/agent/service.d.ts +1 -0
  98. package/dist/src/agent/service.js +10 -4
  99. package/dist/src/agent/service.js.map +1 -1
  100. package/dist/src/agent/session/session-inspector.js +1 -1
  101. package/dist/src/agent/skills/config.js +1 -1
  102. package/dist/src/agent/skills/hub-hash.js +2 -2
  103. package/dist/src/agent/skills/hub-lock.js +1 -1
  104. package/dist/src/agent/skills/hub-pull.js +3 -3
  105. package/dist/src/agent/skills/index.js +1 -1
  106. package/dist/src/agent/skills/managed-store.js +1 -1
  107. package/dist/src/agent/skills/scanner.js +1 -1
  108. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  109. package/dist/src/agent/skills/skill-manager.js +1 -1
  110. package/dist/src/agent/tools/create-share-tool.d.ts +27 -0
  111. package/dist/src/agent/tools/create-share-tool.js +237 -0
  112. package/dist/src/agent/tools/create-share-tool.js.map +1 -0
  113. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  114. package/dist/src/agent/tools/factory.js +35 -1
  115. package/dist/src/agent/tools/factory.js.map +1 -1
  116. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  117. package/dist/src/agent/tools/index.d.ts +2 -0
  118. package/dist/src/agent/tools/index.js +3 -1
  119. package/dist/src/agent/tools/send-media.js +1 -1
  120. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  121. package/dist/src/agent/tools/workflow-tool.d.ts +41 -0
  122. package/dist/src/agent/tools/workflow-tool.js +271 -0
  123. package/dist/src/agent/tools/workflow-tool.js.map +1 -0
  124. package/dist/src/agent/tools/write.js +1 -1
  125. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +9 -0
  126. package/dist/src/agent/workflow/builtins/audit-repo.js +115 -0
  127. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -0
  128. package/dist/src/agent/workflow/builtins/index.d.ts +15 -0
  129. package/dist/src/agent/workflow/builtins/index.js +28 -0
  130. package/dist/src/agent/workflow/builtins/index.js.map +1 -0
  131. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +9 -0
  132. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +113 -0
  133. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -0
  134. package/dist/src/agent/workflow/builtins/research.d.ts +9 -0
  135. package/dist/src/agent/workflow/builtins/research.js +129 -0
  136. package/dist/src/agent/workflow/builtins/research.js.map +1 -0
  137. package/dist/src/agent/workflow/catalog.d.ts +51 -0
  138. package/dist/src/agent/workflow/catalog.js +155 -0
  139. package/dist/src/agent/workflow/catalog.js.map +1 -0
  140. package/dist/src/agent/workflow/channel-capability.d.ts +76 -0
  141. package/dist/src/agent/workflow/channel-capability.js +1 -0
  142. package/dist/src/agent/workflow/index.d.ts +11 -0
  143. package/dist/src/agent/workflow/index.js +10 -0
  144. package/dist/src/agent/workflow/last-run-memory.d.ts +42 -0
  145. package/dist/src/agent/workflow/last-run-memory.js +60 -0
  146. package/dist/src/agent/workflow/last-run-memory.js.map +1 -0
  147. package/dist/src/agent/workflow/parser.d.ts +20 -0
  148. package/dist/src/agent/workflow/parser.js +137 -0
  149. package/dist/src/agent/workflow/parser.js.map +1 -0
  150. package/dist/src/agent/workflow/progress-broker.d.ts +80 -0
  151. package/dist/src/agent/workflow/progress-broker.js +263 -0
  152. package/dist/src/agent/workflow/progress-broker.js.map +1 -0
  153. package/dist/src/agent/workflow/runtime.d.ts +31 -0
  154. package/dist/src/agent/workflow/runtime.js +301 -0
  155. package/dist/src/agent/workflow/runtime.js.map +1 -0
  156. package/dist/src/agent/workflow/snapshot.d.ts +18 -0
  157. package/dist/src/agent/workflow/snapshot.js +144 -0
  158. package/dist/src/agent/workflow/snapshot.js.map +1 -0
  159. package/dist/src/agent/workflow/structured-output-tool.d.ts +33 -0
  160. package/dist/src/agent/workflow/structured-output-tool.js +58 -0
  161. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -0
  162. package/dist/src/agent/workflow/subagent-runner.d.ts +42 -0
  163. package/dist/src/agent/workflow/subagent-runner.js +104 -0
  164. package/dist/src/agent/workflow/subagent-runner.js.map +1 -0
  165. package/dist/src/agent/workflow/types.d.ts +137 -0
  166. package/dist/src/agent/workflow/types.js +1 -0
  167. package/dist/src/auth/credentials.js +3 -3
  168. package/dist/src/auth/profiles/store.js +1 -1
  169. package/dist/src/auth/sync-provider-auth.js +1 -1
  170. package/dist/src/browser/cache-dir-policy.js +1 -1
  171. package/dist/src/browser/cdp-local-launcher.js +2 -2
  172. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  173. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  174. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  175. package/dist/src/browser/stealth.js +1 -1
  176. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  177. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  178. package/dist/src/channels/outbound/persist-store.js +1 -1
  179. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  180. package/dist/src/channels/pairing/pairing-store.js +2 -2
  181. package/dist/src/chat-commands/builtins/config.js +2 -2
  182. package/dist/src/chat-commands/builtins/model.js +40 -23
  183. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  184. package/dist/src/chat-commands/builtins/system.js +30 -15
  185. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  186. package/dist/src/chat-commands/builtins/workflow.d.ts +18 -0
  187. package/dist/src/chat-commands/builtins/workflow.js +167 -0
  188. package/dist/src/chat-commands/builtins/workflow.js.map +1 -0
  189. package/dist/src/chat-commands/context.js +1 -1
  190. package/dist/src/chat-commands/format-output.d.ts +28 -0
  191. package/dist/src/chat-commands/format-output.js +45 -0
  192. package/dist/src/chat-commands/format-output.js.map +1 -0
  193. package/dist/src/chat-commands/index.d.ts +1 -0
  194. package/dist/src/chat-commands/index.js +3 -1
  195. package/dist/src/chat-commands/index.js.map +1 -1
  196. package/dist/src/cli/commands/config.js +2 -2
  197. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  198. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  199. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  200. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  201. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  202. package/dist/src/cli/commands/extension-dev.js +1 -1
  203. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  204. package/dist/src/cli/commands/extension-pack.js +1 -1
  205. package/dist/src/cli/commands/gateway/lifecycle.js +10 -4
  206. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -1
  207. package/dist/src/cli/commands/gateway/shared.js +1 -1
  208. package/dist/src/cli/commands/image.js +1 -1
  209. package/dist/src/cli/commands/init.js +4 -4
  210. package/dist/src/cli/commands/onboard.js +2 -2
  211. package/dist/src/cli/commands/tunnel.js +2 -2
  212. package/dist/src/cli/utils/gateway-client.js +1 -1
  213. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  214. package/dist/src/config/agent-profile.js +1 -1
  215. package/dist/src/config/gateway-bind.js +1 -1
  216. package/dist/src/config/index.js +5 -5
  217. package/dist/src/config/loader.js +2 -2
  218. package/dist/src/config/models-json.js +2 -2
  219. package/dist/src/config/paths-state.js +1 -1
  220. package/dist/src/config/profile.js +2 -2
  221. package/dist/src/config/public-url.d.ts +28 -0
  222. package/dist/src/config/public-url.js +103 -0
  223. package/dist/src/config/public-url.js.map +1 -0
  224. package/dist/src/config/schema.d.ts +82 -0
  225. package/dist/src/config/schema.js +130 -1
  226. package/dist/src/config/schema.js.map +1 -1
  227. package/dist/src/config/workspace-path.js +1 -1
  228. package/dist/src/cron/executor.js +2 -2
  229. package/dist/src/cron/persistence.js +1 -1
  230. package/dist/src/cron/run-log-store.js +1 -1
  231. package/dist/src/daemon/constants.js +1 -1
  232. package/dist/src/daemon/install-plan.js +3 -3
  233. package/dist/src/daemon/install-plan.js.map +1 -1
  234. package/dist/src/daemon/launchd.js +2 -2
  235. package/dist/src/daemon/schtasks.js +38 -1
  236. package/dist/src/daemon/schtasks.js.map +1 -1
  237. package/dist/src/daemon/systemd.js +2 -2
  238. package/dist/src/extensions/bundle-mcp.js +1 -1
  239. package/dist/src/extensions/discover-extensions.js +1 -1
  240. package/dist/src/extensions/health.js +1 -1
  241. package/dist/src/extensions/loader.js +1 -1
  242. package/dist/src/extensions/lockfile.js +2 -2
  243. package/dist/src/gateway/agents-admin.js +2 -2
  244. package/dist/src/gateway/file-path-classifier.js +2 -2
  245. package/dist/src/gateway/hono/app.js +33 -2
  246. package/dist/src/gateway/hono/app.js.map +1 -1
  247. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  248. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  249. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  250. package/dist/src/gateway/hono/oauth.js +1 -1
  251. package/dist/src/gateway/hono/routes/agents.js +1 -1
  252. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  253. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  254. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  255. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  256. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  257. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  258. package/dist/src/gateway/hono/routes/models.js +1 -1
  259. package/dist/src/gateway/hono/routes/shares.js +631 -34
  260. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  261. package/dist/src/gateway/hono/routes/site-shares.d.ts +3 -0
  262. package/dist/src/gateway/hono/routes/site-shares.js +228 -0
  263. package/dist/src/gateway/hono/routes/site-shares.js.map +1 -0
  264. package/dist/src/gateway/hono/routes/tunnel.js +97 -8
  265. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  266. package/dist/src/gateway/hono/routes/workspace.js +5 -5
  267. package/dist/src/gateway/hono/sse.js +2 -2
  268. package/dist/src/gateway/host.d.ts +3 -1
  269. package/dist/src/gateway/host.js +3 -1
  270. package/dist/src/gateway/host.js.map +1 -1
  271. package/dist/src/gateway/lock.js +3 -3
  272. package/dist/src/gateway/ports.d.ts +6 -0
  273. package/dist/src/gateway/ports.js +38 -2
  274. package/dist/src/gateway/ports.js.map +1 -1
  275. package/dist/src/gateway/public-url.d.ts +8 -0
  276. package/dist/src/gateway/public-url.js +10 -0
  277. package/dist/src/gateway/public-url.js.map +1 -0
  278. package/dist/src/gateway/security/origin-check.d.ts +9 -1
  279. package/dist/src/gateway/security/origin-check.js +4 -0
  280. package/dist/src/gateway/security/origin-check.js.map +1 -1
  281. package/dist/src/gateway/server.js +15 -0
  282. package/dist/src/gateway/server.js.map +1 -1
  283. package/dist/src/gateway/service/agent-runner.js +2 -2
  284. package/dist/src/gateway/service/marketplace-service.js +2 -2
  285. package/dist/src/gateway/service/run-gateway-agent.js +2 -2
  286. package/dist/src/gateway/service.js +3 -2
  287. package/dist/src/gateway/service.js.map +1 -1
  288. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  289. package/dist/src/i18n/goals-bundle.js +1 -1
  290. package/dist/src/i18n/index.d.ts +1 -0
  291. package/dist/src/i18n/index.js +2 -1
  292. package/dist/src/i18n/locales/share-tool.en.js +15 -0
  293. package/dist/src/i18n/locales/share-tool.en.js.map +1 -0
  294. package/dist/src/i18n/locales/share-tool.zh.js +15 -0
  295. package/dist/src/i18n/locales/share-tool.zh.js.map +1 -0
  296. package/dist/src/i18n/share-tool-bundle.d.ts +20 -0
  297. package/dist/src/i18n/share-tool-bundle.js +56 -0
  298. package/dist/src/i18n/share-tool-bundle.js.map +1 -0
  299. package/dist/src/infra/gateway-processes.js +1 -0
  300. package/dist/src/infra/gateway-processes.js.map +1 -1
  301. package/dist/src/infra/restart.js +2 -2
  302. package/dist/src/infra/update-check.js +1 -1
  303. package/dist/src/infra/update-lock.js +3 -3
  304. package/dist/src/infra/update-runner.js +1 -1
  305. package/dist/src/infra/update-startup.js +2 -2
  306. package/dist/src/infra/write-file-atomic.js +2 -2
  307. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  308. package/dist/src/providers/index.js +2 -2
  309. package/dist/src/providers/model-registry.js +1 -1
  310. package/dist/src/session/config-store.js +2 -2
  311. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  312. package/dist/src/session/parity/sessions-json-file.js +1 -1
  313. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  314. package/dist/src/session/parity/transcript-paths.js +1 -1
  315. package/dist/src/session/search-index-cache.js +1 -1
  316. package/dist/src/session/search-index.js +1 -1
  317. package/dist/src/session/session-title.js +3 -2
  318. package/dist/src/session/session-title.js.map +1 -1
  319. package/dist/src/session/store.js +5 -5
  320. package/dist/src/share/share-auto.d.ts +74 -0
  321. package/dist/src/share/share-auto.js +247 -0
  322. package/dist/src/share/share-auto.js.map +1 -0
  323. package/dist/src/share/share-config.js +63 -4
  324. package/dist/src/share/share-config.js.map +1 -1
  325. package/dist/src/share/share-landing.d.ts +28 -2
  326. package/dist/src/share/share-landing.js +155 -34
  327. package/dist/src/share/share-landing.js.map +1 -1
  328. package/dist/src/share/share-store.d.ts +48 -4
  329. package/dist/src/share/share-store.js +322 -51
  330. package/dist/src/share/share-store.js.map +1 -1
  331. package/dist/src/share/share-thumbnail.d.ts +35 -0
  332. package/dist/src/share/share-thumbnail.js +277 -0
  333. package/dist/src/share/share-thumbnail.js.map +1 -0
  334. package/dist/src/share/share-types.d.ts +68 -10
  335. package/dist/src/share/share-types.js +18 -1
  336. package/dist/src/share/share-types.js.map +1 -1
  337. package/dist/src/share/share-url.js +1 -1
  338. package/dist/src/share/share-zip.d.ts +35 -0
  339. package/dist/src/share/share-zip.js +303 -0
  340. package/dist/src/share/share-zip.js.map +1 -0
  341. package/dist/src/share/site-proxy.d.ts +35 -0
  342. package/dist/src/share/site-proxy.js +234 -0
  343. package/dist/src/share/site-proxy.js.map +1 -0
  344. package/dist/src/share/site-share-config.d.ts +11 -0
  345. package/dist/src/share/site-share-config.js +103 -0
  346. package/dist/src/share/site-share-config.js.map +1 -0
  347. package/dist/src/share/site-share-router.d.ts +23 -0
  348. package/dist/src/share/site-share-router.js +147 -0
  349. package/dist/src/share/site-share-router.js.map +1 -0
  350. package/dist/src/share/site-share-store.d.ts +53 -0
  351. package/dist/src/share/site-share-store.js +400 -0
  352. package/dist/src/share/site-share-store.js.map +1 -0
  353. package/dist/src/share/site-share-types.d.ts +103 -0
  354. package/dist/src/share/site-share-types.js +41 -0
  355. package/dist/src/share/site-share-types.js.map +1 -0
  356. package/dist/src/share/site-static-serve.d.ts +10 -0
  357. package/dist/src/share/site-static-serve.js +145 -0
  358. package/dist/src/share/site-static-serve.js.map +1 -0
  359. package/dist/src/tui/clipboard-image.js +3 -3
  360. package/dist/src/tui/theme-manager.js +1 -1
  361. package/dist/src/tui/tui-commands.js +18 -0
  362. package/dist/src/tui/tui-commands.js.map +1 -1
  363. package/dist/src/tui/tui-keybindings-file.js +1 -1
  364. package/dist/src/tui/tui-scoped-models.js +2 -2
  365. package/dist/src/tui/tui-settings.js +1 -1
  366. package/dist/src/tui/tui-workflow-slash.d.ts +32 -0
  367. package/dist/src/tui/tui-workflow-slash.js +63 -0
  368. package/dist/src/tui/tui-workflow-slash.js.map +1 -0
  369. package/dist/src/tui/tui.js +2 -2
  370. package/dist/src/tunnel/enable-lan-pairing.js +1 -1
  371. package/dist/src/tunnel/frpc-binary.js +3 -3
  372. package/dist/src/tunnel/frpc-config.js +1 -1
  373. package/dist/src/tunnel/frpc-extract.js +1 -1
  374. package/dist/src/tunnel/index.js +2 -2
  375. package/dist/src/tunnel/pair-context.d.ts +7 -1
  376. package/dist/src/tunnel/pair-context.js +25 -9
  377. package/dist/src/tunnel/pair-context.js.map +1 -1
  378. package/dist/src/tunnel/pair-url.d.ts +14 -1
  379. package/dist/src/tunnel/pair-url.js +14 -1
  380. package/dist/src/tunnel/pair-url.js.map +1 -1
  381. package/dist/src/tunnel/tunnel-service.js +2 -2
  382. package/dist/src/tunnel/tunnel-state.js +1 -1
  383. package/dist/src/utils/logger/audit.js +1 -1
  384. package/dist/src/utils/logger/log-store.js +1 -1
  385. package/dist/src/utils/logger/rotation.js +1 -1
  386. package/dist/src/voice/tts/audio.js +1 -1
  387. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  388. package/package.json +3 -2
  389. package/dist/gateway/static/root/assets/agents-tR-nNP04.js +0 -222
  390. package/dist/gateway/static/root/assets/apps-page-BDw6SP-d.js +0 -1
  391. package/dist/gateway/static/root/assets/button-KafIU8dx.js +0 -1
  392. package/dist/gateway/static/root/assets/channels-settings-DEFd-jj1.js +0 -1
  393. package/dist/gateway/static/root/assets/channels-status-swr-DI5FHdGe.js +0 -8
  394. package/dist/gateway/static/root/assets/cron-api-BSqY8LwW.js +0 -1
  395. package/dist/gateway/static/root/assets/cron-page-D7lVDjcR.js +0 -1
  396. package/dist/gateway/static/root/assets/dist-C57OMHW8.js +0 -48
  397. package/dist/gateway/static/root/assets/extension-page-CQo2Xsmg.js +0 -1
  398. package/dist/gateway/static/root/assets/extension-settings-page-CZf0WoZg.js +0 -1
  399. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +0 -3
  400. package/dist/gateway/static/root/assets/heartbeat-config-api-B0drdQEJ.js +0 -1
  401. package/dist/gateway/static/root/assets/index-0Gt3TG4j.js +0 -4693
  402. package/dist/gateway/static/root/assets/index-BuFldCsB.css +0 -1
  403. package/dist/gateway/static/root/assets/logs-page-DMuORLfC.js +0 -1
  404. package/dist/gateway/static/root/assets/sessions-page-_UO8g6NN.js +0 -1
  405. package/dist/gateway/static/root/assets/settings-form-section-DkmHkknc.js +0 -1
  406. package/dist/gateway/static/root/assets/settings-page-Cz8FoW_A.js +0 -3
  407. package/dist/gateway/static/root/assets/skills-page-HrUOxF7H.js +0 -2
  408. package/dist/gateway/static/root/assets/theme-store-D01dJt95.js +0 -1
  409. package/dist/gateway/static/root/assets/utils-BFwcR6pL.js +0 -1
  410. package/dist/gateway/static/root/assets/voice-api-key-field-JF8-aqc5.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","names":[],"sources":["../../../../../src/cli/commands/gateway/lifecycle.ts"],"sourcesContent":["/**\n * Gateway lifecycle orchestration — OpenClaw-aligned service + unmanaged fallback.\n */\n\nimport { isRestartEnabled } from '../../../config/commands.flags.js';\nimport { loadConfig } from '../../../config/index.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\nimport { resolveGatewayService } from '../../../daemon/service.js';\nimport {\n findVerifiedGatewayListenerPidsOnPortSync,\n formatGatewayPidList,\n signalVerifiedGatewayPidSync,\n} from '../../../infra/gateway-processes.js';\nimport { authorizeGatewaySigusr1Restart } from '../../../infra/restart.js';\nimport {\n DEFAULT_RESTART_HEALTH_ATTEMPTS,\n DEFAULT_RESTART_HEALTH_DELAY_MS,\n renderGatewayPortHealthDiagnostics,\n waitForGatewayHealthyListener,\n} from './restart-health.js';\nimport {\n parsePortFromArgs,\n renderGatewayServiceStartHints,\n resolveGatewayPortFromConfig,\n} from './shared.js';\nimport {\n runServiceRestart,\n runServiceStop,\n type ServiceRecoveryResult,\n} from './lifecycle-core.js';\n\nconst POST_RESTART_HEALTH_ATTEMPTS = DEFAULT_RESTART_HEALTH_ATTEMPTS;\nconst POST_RESTART_HEALTH_DELAY_MS = DEFAULT_RESTART_HEALTH_DELAY_MS;\n\nasync function resolveGatewayLifecyclePort(service?: Awaited<ReturnType<typeof resolveGatewayService>>): Promise<number> {\n const resolvedService = service ?? (await resolveGatewayService());\n const command = await resolvedService.readCommand(process.env).catch(() => null);\n const portFromArgs = parsePortFromArgs(command?.programArguments);\n return portFromArgs ?? resolveGatewayPortFromConfig();\n}\n\nfunction resolveVerifiedGatewayListenerPids(port: number): number[] {\n return findVerifiedGatewayListenerPidsOnPortSync(port).filter(\n (pid): pid is number => Number.isFinite(pid) && pid > 0,\n );\n}\n\nasync function assertUnmanagedGatewayRestartEnabled(port: number): Promise<void> {\n const config = loadConfig(resolveConfigPath());\n if (!isRestartEnabled(config)) {\n throw new Error(\n 'Gateway restart is disabled in config (commands.restart=false); unmanaged SIGUSR1 restart would be ignored',\n );\n }\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n const response = await fetch(`http://127.0.0.1:${port}/api/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!response.ok) {\n return;\n }\n } catch {\n // Best-effort probe; unmanaged restart may still target a starting gateway.\n }\n}\n\nasync function stopGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n for (const pid of pids) {\n signalVerifiedGatewayPidSync(pid, 'SIGTERM');\n }\n return {\n result: 'stopped',\n message: `Gateway stop signal sent to unmanaged process${pids.length === 1 ? '' : 'es'} on port ${port}: ${formatGatewayPidList(pids)}.`,\n };\n}\n\nasync function restartGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n await assertUnmanagedGatewayRestartEnabled(port);\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n if (pids.length > 1) {\n throw new Error(\n `multiple gateway processes are listening on port ${port}: ${formatGatewayPidList(pids)}; use \"xopc gateway status\" before retrying restart`,\n );\n }\n authorizeGatewaySigusr1Restart();\n signalVerifiedGatewayPidSync(pids[0], 'SIGUSR1');\n return {\n result: 'restarted',\n message: `Gateway restart signal sent to unmanaged process on port ${port}: ${pids[0]}.`,\n };\n}\n\nexport async function runDaemonStop(options: { json?: boolean; disable?: boolean } = {}): Promise<void> {\n const service = await resolveGatewayService();\n let gatewayPortPromise: Promise<number> | undefined;\n\n await runServiceStop({\n service,\n opts: options,\n onNotLoaded: async () => {\n gatewayPortPromise ??= resolveGatewayLifecyclePort(service);\n return stopGatewayWithoutServiceManager(await gatewayPortPromise);\n },\n });\n}\n\nexport async function runDaemonRestart(options: {\n json?: boolean;\n wait?: string;\n} = {}): Promise<void> {\n const service = await resolveGatewayService();\n let restartedWithoutServiceManager = false;\n const restartPort = await resolveGatewayLifecyclePort(service);\n const restartHealthAttempts = POST_RESTART_HEALTH_ATTEMPTS;\n const restartWaitSeconds = Math.round(\n (restartHealthAttempts * POST_RESTART_HEALTH_DELAY_MS) / 1000,\n );\n\n await runServiceRestart({\n service,\n opts: options,\n renderStartHints: renderGatewayServiceStartHints,\n checkTokenDrift: true,\n onNotLoaded: async () => {\n const handled = await restartGatewayWithoutServiceManager(restartPort);\n if (handled) {\n restartedWithoutServiceManager = true;\n }\n return handled;\n },\n postRestartCheck: async ({ options: opts, fail }) => {\n if (!restartedWithoutServiceManager) {\n return;\n }\n const health = await waitForGatewayHealthyListener({\n port: restartPort,\n attempts: restartHealthAttempts,\n delayMs: POST_RESTART_HEALTH_DELAY_MS,\n });\n if (health.healthy) {\n return;\n }\n const diagnostics = renderGatewayPortHealthDiagnostics(health);\n fail(\n `Gateway restart timed out after ${restartWaitSeconds}s waiting for health checks.`,\n ['xopc gateway status', 'xopc doctor'],\n diagnostics,\n opts,\n );\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;YAM6D;AAyB7D,MAAM,+BAA+B;AACrC,MAAM,+BAAA;AAEN,eAAe,4BAA4B,SAA8E;AAIvH,QADqB,mBAAkB,OAFf,WAAY,MAAM,uBAAuB,EAC3B,YAAY,QAAQ,IAAI,CAAC,YAAY,KAAK,GAChC,iBAC7B,IAAI,8BAA8B;;AAGvD,SAAS,mCAAmC,MAAwB;AAClE,QAAO,0CAA0C,KAAK,CAAC,QACpD,QAAuB,OAAO,SAAS,IAAI,IAAI,MAAM,EACvD;;AAGH,eAAe,qCAAqC,MAA6B;AAE/E,KAAI,CAAC,iBADU,WAAW,mBAAmB,CACjB,CAAC,CAC3B,OAAM,IAAI,MACR,6GACD;AAGH,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,WAAW,MAAM,MAAM,oBAAoB,KAAK,cAAc;GAClE,QAAQ;GACR,QAAQ,WAAW;GACpB,CAAC;AACF,eAAa,QAAQ;AACrB,MAAI,CAAC,SAAS,GACZ;SAEI;;AAKV,eAAe,iCAAiC,MAAqD;CACnG,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,MAAK,MAAM,OAAO,KAChB,8BAA6B,KAAK,UAAU;AAE9C,QAAO;EACL,QAAQ;EACR,SAAS,gDAAgD,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,qBAAqB,KAAK,CAAC;EACvI;;AAGH,eAAe,oCAAoC,MAAqD;AACtG,OAAM,qCAAqC,KAAK;CAChD,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,KAAI,KAAK,SAAS,EAChB,OAAM,IAAI,MACR,oDAAoD,KAAK,IAAI,qBAAqB,KAAK,CAAC,qDACzF;AAEH,iCAAgC;AAChC,8BAA6B,KAAK,IAAI,UAAU;AAChD,QAAO;EACL,QAAQ;EACR,SAAS,4DAA4D,KAAK,IAAI,KAAK,GAAG;EACvF;;AAGH,eAAsB,cAAc,UAAiD,EAAE,EAAiB;CACtG,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI;AAEJ,OAAM,eAAe;EACnB;EACA,MAAM;EACN,aAAa,YAAY;AACvB,0BAAuB,4BAA4B,QAAQ;AAC3D,UAAO,iCAAiC,MAAM,mBAAmB;;EAEpE,CAAC;;AAGJ,eAAsB,iBAAiB,UAGnC,EAAE,EAAiB;CACrB,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI,iCAAiC;CACrC,MAAM,cAAc,MAAM,4BAA4B,QAAQ;CAC9D,MAAM,wBAAwB;CAC9B,MAAM,qBAAqB,KAAK,MAC7B,wBAAwB,+BAAgC,IAC1D;AAED,OAAM,kBAAkB;EACtB;EACA,MAAM;EACN,kBAAkB;EAClB,iBAAiB;EACjB,aAAa,YAAY;GACvB,MAAM,UAAU,MAAM,oCAAoC,YAAY;AACtE,OAAI,QACF,kCAAiC;AAEnC,UAAO;;EAET,kBAAkB,OAAO,EAAE,SAAS,MAAM,WAAW;AACnD,OAAI,CAAC,+BACH;GAEF,MAAM,SAAS,MAAM,8BAA8B;IACjD,MAAM;IACN,UAAU;IACV,SAAS;IACV,CAAC;AACF,OAAI,OAAO,QACT;GAEF,MAAM,cAAc,mCAAmC,OAAO;AAC9D,QACE,mCAAmC,mBAAmB,+BACtD,CAAC,uBAAuB,cAAc,EACtC,aACA,KACD;;EAEJ,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","names":[],"sources":["../../../../../src/cli/commands/gateway/lifecycle.ts"],"sourcesContent":["/**\n * Gateway lifecycle orchestration — OpenClaw-aligned service + unmanaged fallback.\n */\n\nimport { isRestartEnabled } from '../../../config/commands.flags.js';\nimport { loadConfig } from '../../../config/index.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\nimport { resolveGatewayService } from '../../../daemon/service.js';\nimport {\n findVerifiedGatewayListenerPidsOnPortSync,\n formatGatewayPidList,\n signalVerifiedGatewayPidSync,\n} from '../../../infra/gateway-processes.js';\nimport { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from '../../../infra/restart.js';\nimport {\n DEFAULT_RESTART_HEALTH_ATTEMPTS,\n DEFAULT_RESTART_HEALTH_DELAY_MS,\n renderGatewayPortHealthDiagnostics,\n waitForGatewayHealthyListener,\n} from './restart-health.js';\nimport {\n parsePortFromArgs,\n renderGatewayServiceStartHints,\n resolveGatewayPortFromConfig,\n} from './shared.js';\nimport {\n runServiceRestart,\n runServiceStop,\n type ServiceRecoveryResult,\n} from './lifecycle-core.js';\n\nconst POST_RESTART_HEALTH_ATTEMPTS = DEFAULT_RESTART_HEALTH_ATTEMPTS;\nconst POST_RESTART_HEALTH_DELAY_MS = DEFAULT_RESTART_HEALTH_DELAY_MS;\n\nasync function resolveGatewayLifecyclePort(service?: Awaited<ReturnType<typeof resolveGatewayService>>): Promise<number> {\n const resolvedService = service ?? (await resolveGatewayService());\n const command = await resolvedService.readCommand(process.env).catch(() => null);\n const portFromArgs = parsePortFromArgs(command?.programArguments);\n return portFromArgs ?? resolveGatewayPortFromConfig();\n}\n\nfunction resolveVerifiedGatewayListenerPids(port: number): number[] {\n return findVerifiedGatewayListenerPidsOnPortSync(port).filter(\n (pid): pid is number => Number.isFinite(pid) && pid > 0,\n );\n}\n\nasync function assertUnmanagedGatewayRestartEnabled(port: number): Promise<void> {\n const config = loadConfig(resolveConfigPath());\n if (!isRestartEnabled(config)) {\n throw new Error(\n 'Gateway restart is disabled in config (commands.restart=false); unmanaged SIGUSR1 restart would be ignored',\n );\n }\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n const response = await fetch(`http://127.0.0.1:${port}/api/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!response.ok) {\n return;\n }\n } catch {\n // Best-effort probe; unmanaged restart may still target a starting gateway.\n }\n}\n\nasync function stopGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n for (const pid of pids) {\n signalVerifiedGatewayPidSync(pid, 'SIGTERM');\n }\n return {\n result: 'stopped',\n message: `Gateway stop signal sent to unmanaged process${pids.length === 1 ? '' : 'es'} on port ${port}: ${formatGatewayPidList(pids)}.`,\n };\n}\n\nasync function restartGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n await assertUnmanagedGatewayRestartEnabled(port);\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n if (pids.length > 1) {\n throw new Error(\n `multiple gateway processes are listening on port ${port}: ${formatGatewayPidList(pids)}; use \"xopc gateway status\" before retrying restart`,\n );\n }\n const targetPid = pids[0];\n\n if (process.platform === 'win32') {\n // Windows does not support SIGUSR1. Write a restart intent file and send\n // SIGTERM; the gateway run-loop's onSigterm handler checks for the intent\n // and treats it as a restart instead of a stop.\n writeGatewayRestartIntentSync({ targetPid });\n signalVerifiedGatewayPidSync(targetPid, 'SIGTERM');\n } else {\n authorizeGatewaySigusr1Restart();\n signalVerifiedGatewayPidSync(targetPid, 'SIGUSR1');\n }\n\n return {\n result: 'restarted',\n message: `Gateway restart signal sent to unmanaged process on port ${port}: ${targetPid}.`,\n };\n}\n\nexport async function runDaemonStop(options: { json?: boolean; disable?: boolean } = {}): Promise<void> {\n const service = await resolveGatewayService();\n let gatewayPortPromise: Promise<number> | undefined;\n\n await runServiceStop({\n service,\n opts: options,\n onNotLoaded: async () => {\n gatewayPortPromise ??= resolveGatewayLifecyclePort(service);\n return stopGatewayWithoutServiceManager(await gatewayPortPromise);\n },\n });\n}\n\nexport async function runDaemonRestart(options: {\n json?: boolean;\n wait?: string;\n} = {}): Promise<void> {\n const service = await resolveGatewayService();\n let restartedWithoutServiceManager = false;\n const restartPort = await resolveGatewayLifecyclePort(service);\n const restartHealthAttempts = POST_RESTART_HEALTH_ATTEMPTS;\n const restartWaitSeconds = Math.round(\n (restartHealthAttempts * POST_RESTART_HEALTH_DELAY_MS) / 1000,\n );\n\n await runServiceRestart({\n service,\n opts: options,\n renderStartHints: renderGatewayServiceStartHints,\n checkTokenDrift: true,\n onNotLoaded: async () => {\n const handled = await restartGatewayWithoutServiceManager(restartPort);\n if (handled) {\n restartedWithoutServiceManager = true;\n }\n return handled;\n },\n postRestartCheck: async ({ options: opts, fail }) => {\n if (!restartedWithoutServiceManager) {\n return;\n }\n const health = await waitForGatewayHealthyListener({\n port: restartPort,\n attempts: restartHealthAttempts,\n delayMs: POST_RESTART_HEALTH_DELAY_MS,\n });\n if (health.healthy) {\n return;\n }\n const diagnostics = renderGatewayPortHealthDiagnostics(health);\n fail(\n `Gateway restart timed out after ${restartWaitSeconds}s waiting for health checks.`,\n ['xopc gateway status', 'xopc doctor'],\n diagnostics,\n opts,\n );\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;YAM6D;AAyB7D,MAAM,+BAA+B;AACrC,MAAM,+BAAA;AAEN,eAAe,4BAA4B,SAA8E;AAIvH,QADqB,mBAAkB,OAFf,WAAY,MAAM,uBAAuB,EAC3B,YAAY,QAAQ,IAAI,CAAC,YAAY,KAAK,GAChC,iBAC7B,IAAI,8BAA8B;;AAGvD,SAAS,mCAAmC,MAAwB;AAClE,QAAO,0CAA0C,KAAK,CAAC,QACpD,QAAuB,OAAO,SAAS,IAAI,IAAI,MAAM,EACvD;;AAGH,eAAe,qCAAqC,MAA6B;AAE/E,KAAI,CAAC,iBADU,WAAW,mBAAmB,CACjB,CAAC,CAC3B,OAAM,IAAI,MACR,6GACD;AAGH,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,WAAW,MAAM,MAAM,oBAAoB,KAAK,cAAc;GAClE,QAAQ;GACR,QAAQ,WAAW;GACpB,CAAC;AACF,eAAa,QAAQ;AACrB,MAAI,CAAC,SAAS,GACZ;SAEI;;AAKV,eAAe,iCAAiC,MAAqD;CACnG,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,MAAK,MAAM,OAAO,KAChB,8BAA6B,KAAK,UAAU;AAE9C,QAAO;EACL,QAAQ;EACR,SAAS,gDAAgD,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,qBAAqB,KAAK,CAAC;EACvI;;AAGH,eAAe,oCAAoC,MAAqD;AACtG,OAAM,qCAAqC,KAAK;CAChD,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,KAAI,KAAK,SAAS,EAChB,OAAM,IAAI,MACR,oDAAoD,KAAK,IAAI,qBAAqB,KAAK,CAAC,qDACzF;CAEH,MAAM,YAAY,KAAK;AAEvB,KAAI,QAAQ,aAAa,SAAS;AAIhC,gCAA8B,EAAE,WAAW,CAAC;AAC5C,+BAA6B,WAAW,UAAU;QAC7C;AACL,kCAAgC;AAChC,+BAA6B,WAAW,UAAU;;AAGpD,QAAO;EACL,QAAQ;EACR,SAAS,4DAA4D,KAAK,IAAI,UAAU;EACzF;;AAGH,eAAsB,cAAc,UAAiD,EAAE,EAAiB;CACtG,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI;AAEJ,OAAM,eAAe;EACnB;EACA,MAAM;EACN,aAAa,YAAY;AACvB,0BAAuB,4BAA4B,QAAQ;AAC3D,UAAO,iCAAiC,MAAM,mBAAmB;;EAEpE,CAAC;;AAGJ,eAAsB,iBAAiB,UAGnC,EAAE,EAAiB;CACrB,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI,iCAAiC;CACrC,MAAM,cAAc,MAAM,4BAA4B,QAAQ;CAC9D,MAAM,wBAAwB;CAC9B,MAAM,qBAAqB,KAAK,MAC7B,wBAAwB,+BAAgC,IAC1D;AAED,OAAM,kBAAkB;EACtB;EACA,MAAM;EACN,kBAAkB;EAClB,iBAAiB;EACjB,aAAa,YAAY;GACvB,MAAM,UAAU,MAAM,oCAAoC,YAAY;AACtE,OAAI,QACF,kCAAiC;AAEnC,UAAO;;EAET,kBAAkB,OAAO,EAAE,SAAS,MAAM,WAAW;AACnD,OAAI,CAAC,+BACH;GAEF,MAAM,SAAS,MAAM,8BAA8B;IACjD,MAAM;IACN,UAAU;IACV,SAAS;IACV,CAAC;AACF,OAAI,OAAO,QACT;GAEF,MAAM,cAAc,mCAAmC,OAAO;AAC9D,QACE,mCAAmC,mBAAmB,+BACtD,CAAC,uBAAuB,cAAc,EACtC,aACA,KACD;;EAEJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { init_paths, resolveConfigPath } from "../../../config/paths.js";
2
2
  import { loadConfig } from "../../../config/loader.js";
3
- import "../../../config/index.js";
4
3
  import { resolveGatewayLaunchAgentLabel, resolveGatewaySystemdServiceName, resolveGatewayWindowsTaskName } from "../../../daemon/constants.js";
4
+ import "../../../config/index.js";
5
5
  //#region src/cli/commands/gateway/shared.ts
6
6
  init_paths();
7
7
  function parsePortFromArgs(programArguments) {
@@ -8,8 +8,8 @@ import { formatExamples, register } from "../registry.js";
8
8
  import { getContextWithOpts } from "../context.js";
9
9
  import "../../agent/image/index.js";
10
10
  import { colors } from "../utils/colors.js";
11
- import { mkdir, writeFile } from "node:fs/promises";
12
11
  import { join, resolve } from "node:path";
12
+ import { mkdir, writeFile } from "node:fs/promises";
13
13
  import { Command } from "commander";
14
14
  //#region src/cli/commands/image.ts
15
15
  init_loader();
@@ -1,14 +1,14 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
- import { createLogger } from "../../utils/logger/index.js";
3
- import { init_logger } from "../../utils/logger.js";
4
1
  import { resolveStateDir } from "../../config/paths-state.js";
5
2
  import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
3
+ import { createLogger } from "../../utils/logger/index.js";
4
+ import { init_logger } from "../../utils/logger.js";
6
5
  import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveBinDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveExtensionsDir, resolveInboxDir, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogsDir, resolveSessionsDir, resolveSkillsDir, resolveToolsDir, resolveWorkspaceStateDir, resolveWorkspaceStatePath } from "../../config/paths.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
7
7
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
8
8
  import { formatExamples, register } from "../registry.js";
9
- import { mkdir, writeFile } from "fs/promises";
10
9
  import { join } from "path";
11
10
  import { existsSync } from "fs";
11
+ import { mkdir, writeFile } from "fs/promises";
12
12
  import { Command } from "commander";
13
13
  //#region src/cli/commands/init.ts
14
14
  init_write_file_atomic();
@@ -1,11 +1,11 @@
1
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
1
2
  import { init_agent_scope, resolveAgentProfileDir, resolveDefaultAgentId } from "../../agent/agent-scope.js";
2
3
  import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
3
- import { ConfigSchema, init_schema } from "../../config/schema.js";
4
4
  import { saveConfig } from "../../config/loader.js";
5
+ import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
5
6
  import { isWeixinOnboardConfigured } from "../../../extensions/weixin/src/adapters/onboard-cli.js";
6
7
  import { formatExamples, register } from "../registry.js";
7
8
  import "../../config/index.js";
8
- import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
9
9
  import { seedMainAgentProfileMarkdown } from "../../agent/context/workspace-seed.js";
10
10
  import { colors } from "../utils/colors.js";
11
11
  import { initWorkspace } from "../utils/init-workspace.js";
@@ -1,13 +1,13 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
+ import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
5
+ import { loadTunnelState } from "../../tunnel/tunnel-state.js";
4
6
  import { formatExamples, register } from "../registry.js";
5
7
  import "../../config/index.js";
6
- import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
7
8
  import { TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, hasValidTunnelConsent } from "../../tunnel/consent.js";
8
9
  import { resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret } from "../../tunnel/env.js";
9
10
  import { ensureFrpcBinary } from "../../tunnel/frpc-binary.js";
10
- import { loadTunnelState } from "../../tunnel/tunnel-state.js";
11
11
  import { getTunnelService } from "../../tunnel/tunnel-service.js";
12
12
  import { resolveFrpSubdomainHost } from "../../tunnel/frp-subdomain-host.js";
13
13
  import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, setTunnelEnabledInConfig } from "../../tunnel/tunnel-config.js";
@@ -2,8 +2,8 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
- import "../../config/index.js";
6
5
  import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
6
+ import "../../config/index.js";
7
7
  import { assertSecureGatewayHttpUrl } from "../../gateway/ws-security.js";
8
8
  import { addGatewayClientOptions, parseGatewayClientOptions } from "./gateway-client-options.js";
9
9
  //#region src/cli/utils/gateway-client.ts
@@ -1,8 +1,8 @@
1
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
2
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
3
- import { randomBytes } from "node:crypto";
4
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
3
  import { dirname, join } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
+ import { randomBytes } from "node:crypto";
6
6
  //#region src/cli/utils/init-workspace-core.ts
7
7
  init_schema();
8
8
  init_loader();
@@ -1,5 +1,5 @@
1
- import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
1
  import { getAgentDefaultModelRef, init_schema } from "./schema.js";
2
+ import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
3
3
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
4
4
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  //#region src/config/agent-profile.ts
@@ -1,7 +1,7 @@
1
1
  import { getTailnetIPv4Sync } from "../infra/tailscale.js";
2
2
  import { isLoopbackHost } from "../gateway/host.js";
3
- import { existsSync } from "node:fs";
4
3
  import net from "node:net";
4
+ import { existsSync } from "node:fs";
5
5
  //#region src/config/gateway-bind.ts
6
6
  function resolveGatewayBindMode(cfg, bindOverride) {
7
7
  if (bindOverride) return bindOverride;
@@ -1,15 +1,15 @@
1
+ import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
2
+ import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
3
+ import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
4
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
1
5
  import { ENV_VARS, resolveHomeDir, resolveStateDir } from "./paths-state.js";
2
6
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
3
7
  import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
4
8
  import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir, resolveSessionsDir as resolveSessionsDir$1 } from "../agent/agent-scope.js";
9
+ import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
5
10
  import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
6
11
  import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
7
- import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
8
- import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
9
- import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
10
12
  import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
11
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
12
- import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
13
13
  import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
14
14
  import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
15
15
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
@@ -1,9 +1,9 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
2
+ import { ConfigSchema, init_schema } from "./schema.js";
3
3
  import { createLogger } from "../utils/logger/index.js";
4
4
  import { init_logger } from "../utils/logger.js";
5
5
  import { init_paths, resolveConfigPath } from "./paths.js";
6
- import { ConfigSchema, init_schema } from "./schema.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
7
  import { dirname } from "path";
8
8
  import { existsSync, mkdirSync, promises, readFileSync } from "fs";
9
9
  import { config } from "dotenv";
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
3
2
  import { init_paths, resolveModelsJsonPath } from "./paths.js";
4
- import { existsSync, readFileSync } from "fs";
3
+ import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
5
4
  import { z } from "zod";
5
+ import { existsSync, readFileSync } from "fs";
6
6
  //#region src/config/models-json.ts
7
7
  /**
8
8
  * Models.json configuration types and schema
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { join } from "node:path";
3
2
  import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
4
  //#region src/config/paths-state.ts
5
5
  function resolveHomeDir(env = process.env) {
6
6
  return env[ENV_VARS.HOME] || homedir();
@@ -1,9 +1,9 @@
1
+ import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
4
- import { mkdir, readdir, rm, stat } from "fs/promises";
5
4
  import { join } from "path";
6
5
  import { existsSync } from "fs";
6
+ import { mkdir, readdir, rm, stat } from "fs/promises";
7
7
  //#region src/config/profile.ts
8
8
  init_logger();
9
9
  init_paths_state();
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Validation + normalization helpers for `gateway.publicUrl`.
3
+ *
4
+ * The publicUrl is a user-deployed reverse-proxy origin (e.g.
5
+ * `https://gateway.example.com`). We accept it as both a config field and as
6
+ * a one-off candidate (auto-detected from `window.location.origin`), so the
7
+ * validator must run in identical shape on both surfaces.
8
+ */
9
+ export type PublicUrlIssueCode = 'invalid_url' | 'invalid_scheme' | 'has_userinfo' | 'has_path' | 'has_query_or_fragment' | 'requires_https';
10
+ export type PublicUrlValidation = {
11
+ ok: true;
12
+ url: string;
13
+ protocol: 'http:' | 'https:';
14
+ hostname: string;
15
+ } | {
16
+ ok: false;
17
+ code: PublicUrlIssueCode;
18
+ message: string;
19
+ };
20
+ /** Lowercase RFC1918 / loopback / link-local / `.local` host match. */
21
+ export declare function isPrivateOrLocalHostname(hostname: string): boolean;
22
+ /**
23
+ * Validate a candidate publicUrl. Strict by design — we reject anything that
24
+ * looks ambiguous so the QR payload is always a clean origin.
25
+ */
26
+ export declare function validatePublicUrl(raw: string): PublicUrlValidation;
27
+ /** Convenience: return the normalized origin or `null` when invalid. */
28
+ export declare function normalizePublicUrlOrNull(raw: string | null | undefined): string | null;
@@ -0,0 +1,103 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import net from "node:net";
3
+ //#region src/config/public-url.ts
4
+ /**
5
+ * Validation + normalization helpers for `gateway.publicUrl`.
6
+ *
7
+ * The publicUrl is a user-deployed reverse-proxy origin (e.g.
8
+ * `https://gateway.example.com`). We accept it as both a config field and as
9
+ * a one-off candidate (auto-detected from `window.location.origin`), so the
10
+ * validator must run in identical shape on both surfaces.
11
+ */
12
+ /** Lowercase RFC1918 / loopback / link-local / `.local` host match. */
13
+ function isPrivateOrLocalHostname(hostname) {
14
+ const host = hostname.trim().toLowerCase();
15
+ if (!host) return false;
16
+ if (host === "localhost" || host.endsWith(".localhost")) return true;
17
+ if (host.endsWith(".local")) return true;
18
+ if (host === "::1" || host === "[::1]") return true;
19
+ if (host.startsWith("fe80:") || host.startsWith("[fe80:")) return true;
20
+ if (host.startsWith("fc") || host.startsWith("fd")) {
21
+ if (net.isIPv6(host.replace(/^\[|\]$/g, ""))) return true;
22
+ }
23
+ if (net.isIPv4(host)) {
24
+ const parts = host.split(".").map((p) => Number.parseInt(p, 10));
25
+ if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return false;
26
+ const [a, b] = parts;
27
+ if (a === 10) return true;
28
+ if (a === 127) return true;
29
+ if (a === 169 && b === 254) return true;
30
+ if (a === 172 && b >= 16 && b <= 31) return true;
31
+ if (a === 192 && b === 168) return true;
32
+ if (a === 100 && b >= 64 && b <= 127) return true;
33
+ }
34
+ return false;
35
+ }
36
+ /**
37
+ * Validate a candidate publicUrl. Strict by design — we reject anything that
38
+ * looks ambiguous so the QR payload is always a clean origin.
39
+ */
40
+ function validatePublicUrl(raw) {
41
+ const trimmed = (raw ?? "").trim();
42
+ if (!trimmed) return {
43
+ ok: false,
44
+ code: "invalid_url",
45
+ message: "publicUrl is empty"
46
+ };
47
+ let parsed;
48
+ try {
49
+ parsed = new URL(trimmed);
50
+ } catch {
51
+ return {
52
+ ok: false,
53
+ code: "invalid_url",
54
+ message: "publicUrl is not a valid URL"
55
+ };
56
+ }
57
+ const protocol = parsed.protocol.toLowerCase();
58
+ if (protocol !== "https:" && protocol !== "http:") return {
59
+ ok: false,
60
+ code: "invalid_scheme",
61
+ message: "publicUrl must use http(s)"
62
+ };
63
+ if (parsed.username || parsed.password) return {
64
+ ok: false,
65
+ code: "has_userinfo",
66
+ message: "publicUrl must not contain userinfo"
67
+ };
68
+ const path = parsed.pathname;
69
+ if (path && path !== "/" && path !== "") return {
70
+ ok: false,
71
+ code: "has_path",
72
+ message: "publicUrl must not contain a path"
73
+ };
74
+ if (parsed.search || parsed.hash) return {
75
+ ok: false,
76
+ code: "has_query_or_fragment",
77
+ message: "publicUrl must not contain query or fragment"
78
+ };
79
+ const hostname = parsed.hostname.toLowerCase();
80
+ if (protocol === "http:" && !isPrivateOrLocalHostname(hostname)) return {
81
+ ok: false,
82
+ code: "requires_https",
83
+ message: "publicUrl must use https for public hostnames (http is only allowed for RFC1918 / .local)"
84
+ };
85
+ return {
86
+ ok: true,
87
+ url: `${protocol}//${parsed.host.toLowerCase()}`,
88
+ protocol,
89
+ hostname
90
+ };
91
+ }
92
+ /** Convenience: return the normalized origin or `null` when invalid. */
93
+ function normalizePublicUrlOrNull(raw) {
94
+ if (!raw) return null;
95
+ const result = validatePublicUrl(raw);
96
+ return result.ok ? result.url : null;
97
+ }
98
+ var init_public_url = __esmMin((() => {}));
99
+ //#endregion
100
+ init_public_url();
101
+ export { init_public_url, isPrivateOrLocalHostname, normalizePublicUrlOrNull, validatePublicUrl };
102
+
103
+ //# sourceMappingURL=public-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-url.js","names":[],"sources":["../../../src/config/public-url.ts"],"sourcesContent":["/**\n * Validation + normalization helpers for `gateway.publicUrl`.\n *\n * The publicUrl is a user-deployed reverse-proxy origin (e.g.\n * `https://gateway.example.com`). We accept it as both a config field and as\n * a one-off candidate (auto-detected from `window.location.origin`), so the\n * validator must run in identical shape on both surfaces.\n */\n\nimport net from 'node:net';\n\nexport type PublicUrlIssueCode =\n | 'invalid_url'\n | 'invalid_scheme'\n | 'has_userinfo'\n | 'has_path'\n | 'has_query_or_fragment'\n | 'requires_https';\n\nexport type PublicUrlValidation =\n | { ok: true; url: string; protocol: 'http:' | 'https:'; hostname: string }\n | { ok: false; code: PublicUrlIssueCode; message: string };\n\n/** Lowercase RFC1918 / loopback / link-local / `.local` host match. */\nexport function isPrivateOrLocalHostname(hostname: string): boolean {\n const host = hostname.trim().toLowerCase();\n if (!host) return false;\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.endsWith('.local')) return true;\n // IPv6 loopback / link-local\n if (host === '::1' || host === '[::1]') return true;\n if (host.startsWith('fe80:') || host.startsWith('[fe80:')) return true;\n if (host.startsWith('fc') || host.startsWith('fd')) {\n // fc00::/7 ULA\n if (net.isIPv6(host.replace(/^\\[|\\]$/g, ''))) return true;\n }\n // IPv4 private + loopback ranges\n if (net.isIPv4(host)) {\n const parts = host.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return false;\n const [a, b] = parts;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true; // link-local\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n if (a === 100 && b >= 64 && b <= 127) return true; // CGNAT — common for tailnet / mesh\n }\n return false;\n}\n\n/**\n * Validate a candidate publicUrl. Strict by design — we reject anything that\n * looks ambiguous so the QR payload is always a clean origin.\n */\nexport function validatePublicUrl(raw: string): PublicUrlValidation {\n const trimmed = (raw ?? '').trim();\n if (!trimmed) {\n return { ok: false, code: 'invalid_url', message: 'publicUrl is empty' };\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return { ok: false, code: 'invalid_url', message: 'publicUrl is not a valid URL' };\n }\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'https:' && protocol !== 'http:') {\n return { ok: false, code: 'invalid_scheme', message: 'publicUrl must use http(s)' };\n }\n if (parsed.username || parsed.password) {\n return { ok: false, code: 'has_userinfo', message: 'publicUrl must not contain userinfo' };\n }\n // pathname may be \"/\" (trailing slash) but nothing else\n const path = parsed.pathname;\n if (path && path !== '/' && path !== '') {\n return { ok: false, code: 'has_path', message: 'publicUrl must not contain a path' };\n }\n if (parsed.search || parsed.hash) {\n return {\n ok: false,\n code: 'has_query_or_fragment',\n message: 'publicUrl must not contain query or fragment',\n };\n }\n const hostname = parsed.hostname.toLowerCase();\n if (protocol === 'http:' && !isPrivateOrLocalHostname(hostname)) {\n return {\n ok: false,\n code: 'requires_https',\n message:\n 'publicUrl must use https for public hostnames (http is only allowed for RFC1918 / .local)',\n };\n }\n // Normalize: drop trailing slash, lowercase host.\n const normalized = `${protocol}//${parsed.host.toLowerCase()}`;\n return {\n ok: true,\n url: normalized,\n protocol: protocol as 'http:' | 'https:',\n hostname,\n };\n}\n\n/** Convenience: return the normalized origin or `null` when invalid. */\nexport function normalizePublicUrlOrNull(raw: string | null | undefined): string | null {\n if (!raw) return null;\n const result = validatePublicUrl(raw);\n return result.ok ? result.url : null;\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,SAAgB,yBAAyB,UAA2B;CAClE,MAAM,OAAO,SAAS,MAAM,CAAC,aAAa;AAC1C,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,SAAS,eAAe,KAAK,SAAS,aAAa,CAAE,QAAO;AAChE,KAAI,KAAK,SAAS,SAAS,CAAE,QAAO;AAEpC,KAAI,SAAS,SAAS,SAAS,QAAS,QAAO;AAC/C,KAAI,KAAK,WAAW,QAAQ,IAAI,KAAK,WAAW,SAAS,CAAE,QAAO;AAClE,KAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK;MAE5C,IAAI,OAAO,KAAK,QAAQ,YAAY,GAAG,CAAC,CAAE,QAAO;;AAGvD,KAAI,IAAI,OAAO,KAAK,EAAE;EACpB,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,OAAO,SAAS,GAAG,GAAG,CAAC;AAChE,MAAI,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC,OAAO,SAAS,EAAE,CAAC,CAAE,QAAO;EACzE,MAAM,CAAC,GAAG,KAAK;AACf,MAAI,MAAM,GAAI,QAAO;AACrB,MAAI,MAAM,IAAK,QAAO;AACtB,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,GAAI,QAAO;AAC5C,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,IAAK,QAAO;;AAE/C,QAAO;;;;;;AAOT,SAAgB,kBAAkB,KAAkC;CAClE,MAAM,WAAW,OAAO,IAAI,MAAM;AAClC,KAAI,CAAC,QACH,QAAO;EAAE,IAAI;EAAO,MAAM;EAAe,SAAS;EAAsB;CAE1E,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,QAAQ;SACnB;AACN,SAAO;GAAE,IAAI;GAAO,MAAM;GAAe,SAAS;GAAgC;;CAEpF,MAAM,WAAW,OAAO,SAAS,aAAa;AAC9C,KAAI,aAAa,YAAY,aAAa,QACxC,QAAO;EAAE,IAAI;EAAO,MAAM;EAAkB,SAAS;EAA8B;AAErF,KAAI,OAAO,YAAY,OAAO,SAC5B,QAAO;EAAE,IAAI;EAAO,MAAM;EAAgB,SAAS;EAAuC;CAG5F,MAAM,OAAO,OAAO;AACpB,KAAI,QAAQ,SAAS,OAAO,SAAS,GACnC,QAAO;EAAE,IAAI;EAAO,MAAM;EAAY,SAAS;EAAqC;AAEtF,KAAI,OAAO,UAAU,OAAO,KAC1B,QAAO;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACV;CAEH,MAAM,WAAW,OAAO,SAAS,aAAa;AAC9C,KAAI,aAAa,WAAW,CAAC,yBAAyB,SAAS,CAC7D,QAAO;EACL,IAAI;EACJ,MAAM;EACN,SACE;EACH;AAIH,QAAO;EACL,IAAI;EACJ,KAAK,GAHe,SAAS,IAAI,OAAO,KAAK,aAAa;EAIhD;EACV;EACD;;;AAIH,SAAgB,yBAAyB,KAA+C;AACtF,KAAI,CAAC,IAAK,QAAO;CACjB,MAAM,SAAS,kBAAkB,IAAI;AACrC,QAAO,OAAO,KAAK,OAAO,MAAM"}
@@ -220,6 +220,12 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
220
220
  executeCode: z.ZodOptional<z.ZodObject<{
221
221
  enabled: z.ZodOptional<z.ZodBoolean>;
222
222
  }, z.core.$strip>>;
223
+ workflow: z.ZodOptional<z.ZodObject<{
224
+ enabled: z.ZodDefault<z.ZodBoolean>;
225
+ maxConcurrency: z.ZodDefault<z.ZodNumber>;
226
+ maxSubagents: z.ZodDefault<z.ZodNumber>;
227
+ defaultTimeoutSec: z.ZodDefault<z.ZodNumber>;
228
+ }, z.core.$strip>>;
223
229
  systemPromptOverride: z.ZodOptional<z.ZodString>;
224
230
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
225
231
  tools: z.ZodOptional<z.ZodObject<{
@@ -470,6 +476,12 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
470
476
  executeCode: z.ZodOptional<z.ZodObject<{
471
477
  enabled: z.ZodOptional<z.ZodBoolean>;
472
478
  }, z.core.$strip>>;
479
+ workflow: z.ZodOptional<z.ZodObject<{
480
+ enabled: z.ZodDefault<z.ZodBoolean>;
481
+ maxConcurrency: z.ZodDefault<z.ZodNumber>;
482
+ maxSubagents: z.ZodDefault<z.ZodNumber>;
483
+ defaultTimeoutSec: z.ZodDefault<z.ZodNumber>;
484
+ }, z.core.$strip>>;
473
485
  systemPromptOverride: z.ZodOptional<z.ZodString>;
474
486
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
475
487
  tools: z.ZodOptional<z.ZodObject<{
@@ -965,6 +977,7 @@ export declare const GatewayConfigSchema: z.ZodDefault<z.ZodObject<{
965
977
  }, z.core.$strip>>>;
966
978
  maxSseConnections: z.ZodOptional<z.ZodNumber>;
967
979
  corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
980
+ publicUrl: z.ZodOptional<z.ZodString>;
968
981
  dangerouslyAllowHostHeaderOriginFallback: z.ZodOptional<z.ZodBoolean>;
969
982
  trustedProxies: z.ZodOptional<z.ZodArray<z.ZodString>>;
970
983
  allowRealIpFallback: z.ZodOptional<z.ZodBoolean>;
@@ -987,6 +1000,37 @@ export declare const GatewayConfigSchema: z.ZodDefault<z.ZodObject<{
987
1000
  maxActiveShares: z.ZodDefault<z.ZodNumber>;
988
1001
  maxFileSize: z.ZodDefault<z.ZodNumber>;
989
1002
  inlinePreviewMimes: z.ZodDefault<z.ZodArray<z.ZodString>>;
1003
+ directory: z.ZodDefault<z.ZodObject<{
1004
+ enabled: z.ZodDefault<z.ZodBoolean>;
1005
+ maxFolderSize: z.ZodDefault<z.ZodNumber>;
1006
+ maxFileCount: z.ZodDefault<z.ZodNumber>;
1007
+ maxDepth: z.ZodDefault<z.ZodNumber>;
1008
+ listingCacheMs: z.ZodDefault<z.ZodNumber>;
1009
+ zipConcurrency: z.ZodDefault<z.ZodNumber>;
1010
+ }, z.core.$strip>>;
1011
+ }, z.core.$strip>>;
1012
+ siteShare: z.ZodOptional<z.ZodObject<{
1013
+ enabled: z.ZodDefault<z.ZodBoolean>;
1014
+ publicHostSuffix: z.ZodDefault<z.ZodString>;
1015
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
1016
+ maxTtlMs: z.ZodDefault<z.ZodNumber>;
1017
+ maxActiveSites: z.ZodDefault<z.ZodNumber>;
1018
+ static: z.ZodDefault<z.ZodObject<{
1019
+ enabled: z.ZodDefault<z.ZodBoolean>;
1020
+ maxRootDirSize: z.ZodDefault<z.ZodNumber>;
1021
+ maxFileCount: z.ZodDefault<z.ZodNumber>;
1022
+ rewriteEnabledByDefault: z.ZodDefault<z.ZodBoolean>;
1023
+ }, z.core.$strip>>;
1024
+ proxy: z.ZodDefault<z.ZodObject<{
1025
+ enabled: z.ZodDefault<z.ZodBoolean>;
1026
+ allowedUpstreamHosts: z.ZodDefault<z.ZodArray<z.ZodString>>;
1027
+ allowedUpstreamPorts: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
1028
+ forwardWebSocket: z.ZodDefault<z.ZodBoolean>;
1029
+ bodySizeLimit: z.ZodDefault<z.ZodNumber>;
1030
+ requestTimeoutMs: z.ZodDefault<z.ZodNumber>;
1031
+ wsIdleTimeoutMs: z.ZodDefault<z.ZodNumber>;
1032
+ rewriteSetCookiePath: z.ZodDefault<z.ZodBoolean>;
1033
+ }, z.core.$strip>>;
990
1034
  }, z.core.$strip>>;
991
1035
  }, z.core.$strip>>;
992
1036
  export declare const CronConfigSchema: z.ZodDefault<z.ZodObject<{
@@ -1709,6 +1753,12 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1709
1753
  executeCode: z.ZodOptional<z.ZodObject<{
1710
1754
  enabled: z.ZodOptional<z.ZodBoolean>;
1711
1755
  }, z.core.$strip>>;
1756
+ workflow: z.ZodOptional<z.ZodObject<{
1757
+ enabled: z.ZodDefault<z.ZodBoolean>;
1758
+ maxConcurrency: z.ZodDefault<z.ZodNumber>;
1759
+ maxSubagents: z.ZodDefault<z.ZodNumber>;
1760
+ defaultTimeoutSec: z.ZodDefault<z.ZodNumber>;
1761
+ }, z.core.$strip>>;
1712
1762
  systemPromptOverride: z.ZodOptional<z.ZodString>;
1713
1763
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
1714
1764
  tools: z.ZodOptional<z.ZodObject<{
@@ -1871,6 +1921,7 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1871
1921
  }, z.core.$strip>>>;
1872
1922
  maxSseConnections: z.ZodOptional<z.ZodNumber>;
1873
1923
  corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
1924
+ publicUrl: z.ZodOptional<z.ZodString>;
1874
1925
  dangerouslyAllowHostHeaderOriginFallback: z.ZodOptional<z.ZodBoolean>;
1875
1926
  trustedProxies: z.ZodOptional<z.ZodArray<z.ZodString>>;
1876
1927
  allowRealIpFallback: z.ZodOptional<z.ZodBoolean>;
@@ -1893,6 +1944,37 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1893
1944
  maxActiveShares: z.ZodDefault<z.ZodNumber>;
1894
1945
  maxFileSize: z.ZodDefault<z.ZodNumber>;
1895
1946
  inlinePreviewMimes: z.ZodDefault<z.ZodArray<z.ZodString>>;
1947
+ directory: z.ZodDefault<z.ZodObject<{
1948
+ enabled: z.ZodDefault<z.ZodBoolean>;
1949
+ maxFolderSize: z.ZodDefault<z.ZodNumber>;
1950
+ maxFileCount: z.ZodDefault<z.ZodNumber>;
1951
+ maxDepth: z.ZodDefault<z.ZodNumber>;
1952
+ listingCacheMs: z.ZodDefault<z.ZodNumber>;
1953
+ zipConcurrency: z.ZodDefault<z.ZodNumber>;
1954
+ }, z.core.$strip>>;
1955
+ }, z.core.$strip>>;
1956
+ siteShare: z.ZodOptional<z.ZodObject<{
1957
+ enabled: z.ZodDefault<z.ZodBoolean>;
1958
+ publicHostSuffix: z.ZodDefault<z.ZodString>;
1959
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
1960
+ maxTtlMs: z.ZodDefault<z.ZodNumber>;
1961
+ maxActiveSites: z.ZodDefault<z.ZodNumber>;
1962
+ static: z.ZodDefault<z.ZodObject<{
1963
+ enabled: z.ZodDefault<z.ZodBoolean>;
1964
+ maxRootDirSize: z.ZodDefault<z.ZodNumber>;
1965
+ maxFileCount: z.ZodDefault<z.ZodNumber>;
1966
+ rewriteEnabledByDefault: z.ZodDefault<z.ZodBoolean>;
1967
+ }, z.core.$strip>>;
1968
+ proxy: z.ZodDefault<z.ZodObject<{
1969
+ enabled: z.ZodDefault<z.ZodBoolean>;
1970
+ allowedUpstreamHosts: z.ZodDefault<z.ZodArray<z.ZodString>>;
1971
+ allowedUpstreamPorts: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
1972
+ forwardWebSocket: z.ZodDefault<z.ZodBoolean>;
1973
+ bodySizeLimit: z.ZodDefault<z.ZodNumber>;
1974
+ requestTimeoutMs: z.ZodDefault<z.ZodNumber>;
1975
+ wsIdleTimeoutMs: z.ZodDefault<z.ZodNumber>;
1976
+ rewriteSetCookiePath: z.ZodDefault<z.ZodBoolean>;
1977
+ }, z.core.$strip>>;
1896
1978
  }, z.core.$strip>>;
1897
1979
  }, z.core.$strip>>;
1898
1980
  tunnel: z.ZodOptional<z.ZodDefault<z.ZodObject<{