@xopcai/xopc 0.0.113 → 0.0.115

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 (567) 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/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  9. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/extensions/weixin/src/api/api.js +2 -2
  12. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  18. package/dist/extensions/weixin/src/plugin.js +1 -1
  19. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  20. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  21. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
  22. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
  23. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
  24. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
  25. package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
  26. package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
  27. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
  28. package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
  29. package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
  32. package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
  33. package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
  35. package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
  36. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
  37. package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
  42. package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
  47. package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
  48. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
  49. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
  53. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
  54. package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
  61. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
  62. package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
  63. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
  74. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
  85. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
  86. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
  87. package/dist/gateway/static/root/index.html +5 -5
  88. package/dist/gateway/static/root/logo.svg +4 -3
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +8 -0
  91. package/dist/src/agent/agent-manager.js +63 -28
  92. package/dist/src/agent/agent-manager.js.map +1 -1
  93. package/dist/src/agent/agent-scope.js +1 -1
  94. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  95. package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
  96. package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
  97. package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
  98. package/dist/src/agent/context/workspace-seed.js +2 -2
  99. package/dist/src/agent/context/workspace-state.js +1 -1
  100. package/dist/src/agent/context/workspace.js +1 -1
  101. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  102. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  103. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  104. package/dist/src/agent/goals/checklist-judge.js +3 -2
  105. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  106. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
  107. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  108. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  109. package/dist/src/agent/goals/goal-locale.js +2 -2
  110. package/dist/src/agent/goals/persistent-goal-service.js +2 -4
  111. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  112. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  113. package/dist/src/agent/goals/post-turn.js +15 -6
  114. package/dist/src/agent/goals/post-turn.js.map +1 -1
  115. package/dist/src/agent/image/load-image-media.js +2 -2
  116. package/dist/src/agent/inbound/inbound-loop.js +5 -1
  117. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  118. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
  119. package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
  120. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  121. package/dist/src/agent/ipc/inbox.js +3 -3
  122. package/dist/src/agent/ipc/socket.js +1 -1
  123. package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
  124. package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
  125. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  126. package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
  127. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  133. package/dist/src/agent/memory/dreaming/events.js +1 -1
  134. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  135. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  136. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  137. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  138. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  139. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  140. package/dist/src/agent/memory/memory-flush.js +1 -1
  141. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  142. package/dist/src/agent/models/manager.js +1 -1
  143. package/dist/src/agent/prompt/memory/index.js +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/btw-query.js +11 -3
  149. package/dist/src/agent/service/btw-query.js.map +1 -1
  150. package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
  151. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
  152. package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
  153. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  154. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  155. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  156. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  157. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  158. package/dist/src/agent/service.d.ts +1 -1
  159. package/dist/src/agent/service.js +13 -9
  160. package/dist/src/agent/service.js.map +1 -1
  161. package/dist/src/agent/service.types.d.ts +5 -0
  162. package/dist/src/agent/session/session-inspector.js +1 -1
  163. package/dist/src/agent/skills/config.js +2 -2
  164. package/dist/src/agent/skills/filesystem-watcher.js +5 -4
  165. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
  166. package/dist/src/agent/skills/hub-hash.js +2 -2
  167. package/dist/src/agent/skills/hub-lock.js +1 -1
  168. package/dist/src/agent/skills/hub-pull.js +2 -2
  169. package/dist/src/agent/skills/index.js +4 -3
  170. package/dist/src/agent/skills/index.js.map +1 -1
  171. package/dist/src/agent/skills/installer.js +2 -2
  172. package/dist/src/agent/skills/managed-store.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +3 -2
  174. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  175. package/dist/src/agent/skills/skill-manager.js +1 -1
  176. package/dist/src/agent/skills/skill-view-path.js +1 -1
  177. package/dist/src/agent/skills/test-framework.js +1 -1
  178. package/dist/src/agent/skills/types.d.ts +1 -1
  179. package/dist/src/agent/skills/watcher.js +2 -5
  180. package/dist/src/agent/skills/watcher.js.map +1 -1
  181. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  182. package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
  183. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
  184. package/dist/src/agent/starter-agents.js +1 -1
  185. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  186. package/dist/src/agent/tool-manuals/browser.js +62 -3
  187. package/dist/src/agent/tool-manuals/browser.js.map +1 -1
  188. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  191. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
  192. package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
  193. package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
  194. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  195. package/dist/src/agent/tools/factory.js +1 -10
  196. package/dist/src/agent/tools/factory.js.map +1 -1
  197. package/dist/src/agent/tools/find.js +1 -1
  198. package/dist/src/agent/tools/grep.js +1 -1
  199. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  200. package/dist/src/agent/tools/skill-manage-tool.js +2 -2
  201. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  202. package/dist/src/agent/tools/workflow-tool.js +1 -1
  203. package/dist/src/agent/workflow/catalog.js +1 -1
  204. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  205. package/dist/src/agent/workflow/snapshot.js +136 -1
  206. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  207. package/dist/src/agent/workflow/subagent-runner.js +18 -1
  208. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  209. package/dist/src/ai-assist/text-assist.js +1 -1
  210. package/dist/src/auth/credentials.js +2 -2
  211. package/dist/src/auth/profiles/store.js +2 -2
  212. package/dist/src/auth/sync-provider-auth.js +1 -1
  213. package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
  214. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  215. package/dist/src/browser/actions/registry.js +383 -7
  216. package/dist/src/browser/actions/registry.js.map +1 -1
  217. package/dist/src/browser/actions/types.d.ts +11 -3
  218. package/dist/src/browser/cache-dir-policy.js +1 -1
  219. package/dist/src/browser/cdp-local-launcher.js +2 -2
  220. package/dist/src/browser/index.js +2 -2
  221. package/dist/src/browser/pipeline/output.d.ts +18 -16
  222. package/dist/src/browser/pipeline/output.js +28 -20
  223. package/dist/src/browser/pipeline/output.js.map +1 -1
  224. package/dist/src/browser/pipeline/runner.d.ts +7 -14
  225. package/dist/src/browser/pipeline/runner.js +349 -102
  226. package/dist/src/browser/pipeline/runner.js.map +1 -1
  227. package/dist/src/browser/pipeline/schema.d.ts +1 -0
  228. package/dist/src/browser/pipeline/schema.js +35 -58
  229. package/dist/src/browser/pipeline/schema.js.map +1 -1
  230. package/dist/src/browser/pipeline/source.d.ts +2 -0
  231. package/dist/src/browser/pipeline/source.js +10 -1
  232. package/dist/src/browser/pipeline/source.js.map +1 -1
  233. package/dist/src/browser/pipeline/template.d.ts +10 -2
  234. package/dist/src/browser/pipeline/template.js +50 -8
  235. package/dist/src/browser/pipeline/template.js.map +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  237. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  241. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  242. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  243. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  244. package/dist/src/channels/outbound/persist-store.js +1 -1
  245. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  246. package/dist/src/channels/pairing/pairing-store.js +2 -2
  247. package/dist/src/chat-commands/agent-edit.js +2 -2
  248. package/dist/src/chat-commands/builtins/config.js +5 -7
  249. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  250. package/dist/src/chat-commands/context.d.ts +5 -0
  251. package/dist/src/chat-commands/context.js +18 -9
  252. package/dist/src/chat-commands/context.js.map +1 -1
  253. package/dist/src/chat-commands/index.d.ts +1 -1
  254. package/dist/src/chat-commands/index.js +2 -2
  255. package/dist/src/chat-commands/index.js.map +1 -1
  256. package/dist/src/chat-commands/processor.js +22 -21
  257. package/dist/src/chat-commands/processor.js.map +1 -1
  258. package/dist/src/chat-commands/session-key.d.ts +3 -15
  259. package/dist/src/chat-commands/session-key.js +3 -49
  260. package/dist/src/chat-commands/session-key.js.map +1 -1
  261. package/dist/src/chat-commands/types.d.ts +4 -0
  262. package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
  263. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  264. package/dist/src/cli/commands/config.js +1 -1
  265. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  266. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  268. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  269. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  270. package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
  271. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  272. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  273. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  274. package/dist/src/cli/commands/extension-create.js +1 -1
  275. package/dist/src/cli/commands/extension-dev.js +2 -2
  276. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  277. package/dist/src/cli/commands/extension-pack.js +2 -2
  278. package/dist/src/cli/commands/extension.js +3 -3
  279. package/dist/src/cli/commands/gateway/logs.js +1 -1
  280. package/dist/src/cli/commands/image.js +1 -1
  281. package/dist/src/cli/commands/init.js +2 -2
  282. package/dist/src/cli/commands/models.js +1 -1
  283. package/dist/src/cli/commands/skills-test.js +1 -1
  284. package/dist/src/cli/templates.js +1 -1
  285. package/dist/src/cli/utils/gateway-client.js +1 -1
  286. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  287. package/dist/src/config/agent-profile.js +1 -1
  288. package/dist/src/config/agent-typed-models.js +1 -1
  289. package/dist/src/config/gateway-bind.js +1 -1
  290. package/dist/src/config/index.js +7 -7
  291. package/dist/src/config/loader.js +4 -4
  292. package/dist/src/config/models-json.js +2 -2
  293. package/dist/src/config/paths-state.js +1 -1
  294. package/dist/src/config/paths.js +1 -1
  295. package/dist/src/config/profile.js +1 -1
  296. package/dist/src/config/reload.js +1 -1
  297. package/dist/src/config/rules.js +5 -0
  298. package/dist/src/config/rules.js.map +1 -1
  299. package/dist/src/config/schema.d.ts +8 -0
  300. package/dist/src/config/schema.js +7 -0
  301. package/dist/src/config/schema.js.map +1 -1
  302. package/dist/src/config/web-patch.d.ts +1 -0
  303. package/dist/src/config/web-patch.js +1 -0
  304. package/dist/src/config/web-patch.js.map +1 -1
  305. package/dist/src/config/workspace-path.js +1 -1
  306. package/dist/src/connectors/builtin-catalog.js +180 -1
  307. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  308. package/dist/src/connectors/health.js +18 -9
  309. package/dist/src/connectors/health.js.map +1 -1
  310. package/dist/src/connectors/types.d.ts +19 -0
  311. package/dist/src/connectors/usage.js +12 -4
  312. package/dist/src/connectors/usage.js.map +1 -1
  313. package/dist/src/cron/executor.js +1 -1
  314. package/dist/src/cron/service.js +1 -1
  315. package/dist/src/daemon/constants.js +1 -1
  316. package/dist/src/daemon/install-plan.js +2 -2
  317. package/dist/src/daemon/launchd.js +2 -2
  318. package/dist/src/daemon/schtasks.js +2 -2
  319. package/dist/src/daemon/systemd.js +2 -2
  320. package/dist/src/extensions/bundle-mcp.js +1 -1
  321. package/dist/src/extensions/discover-extensions.js +2 -2
  322. package/dist/src/extensions/health.js +1 -1
  323. package/dist/src/extensions/install.js +2 -2
  324. package/dist/src/extensions/loader.js +2 -2
  325. package/dist/src/extensions/lockfile.js +3 -3
  326. package/dist/src/extensions/security.js +1 -1
  327. package/dist/src/extensions/types/tui.d.ts +2 -0
  328. package/dist/src/extensions/update.js +2 -2
  329. package/dist/src/gateway/agents-admin.js +2 -2
  330. package/dist/src/gateway/file-path-classifier.js +2 -2
  331. package/dist/src/gateway/heartbeat/service.js +13 -1
  332. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  333. package/dist/src/gateway/hono/app.js +18 -5
  334. package/dist/src/gateway/hono/app.js.map +1 -1
  335. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  336. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  337. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  338. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  339. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  340. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  341. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  342. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  343. package/dist/src/gateway/hono/oauth-async.js +1 -1
  344. package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
  345. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +1 -1
  347. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +18 -14
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  351. package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
  352. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  354. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  355. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  356. package/dist/src/gateway/hono/routes/goals.js +16 -3
  357. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  359. package/dist/src/gateway/hono/routes/logs.js +1 -0
  360. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/mcp.js +27 -8
  362. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/models.js +1 -1
  364. package/dist/src/gateway/hono/routes/notes.js +14 -2
  365. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/sessions.js +62 -4
  367. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/shares.js +1 -1
  369. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  370. package/dist/src/gateway/hono/routes/workspace.js +5 -68
  371. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  372. package/dist/src/gateway/hono/sse.d.ts +2 -2
  373. package/dist/src/gateway/hono/sse.js +7 -15
  374. package/dist/src/gateway/hono/sse.js.map +1 -1
  375. package/dist/src/gateway/lock.js +3 -3
  376. package/dist/src/gateway/ports.js +1 -1
  377. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  378. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  379. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  380. package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
  381. package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
  382. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
  383. package/dist/src/gateway/service/agent-runner.d.ts +2 -3
  384. package/dist/src/gateway/service/agent-runner.js +9 -22
  385. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  386. package/dist/src/gateway/service/config-coordinator.js +1 -1
  387. package/dist/src/gateway/service/marketplace-service.js +2 -2
  388. package/dist/src/gateway/service/run-gateway-agent.js +9 -7
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  391. package/dist/src/gateway/service/sessions-api.js +11 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +1 -1
  394. package/dist/src/gateway/service.js +23 -9
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/gateway/workspace-file-search.d.ts +9 -0
  397. package/dist/src/gateway/workspace-file-search.js +76 -0
  398. package/dist/src/gateway/workspace-file-search.js.map +1 -0
  399. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  400. package/dist/src/goals/goal-notifications.d.ts +2 -0
  401. package/dist/src/goals/goal-notifications.js +16 -11
  402. package/dist/src/goals/goal-notifications.js.map +1 -1
  403. package/dist/src/goals/goal-service.js +1 -6
  404. package/dist/src/goals/goal-service.js.map +1 -1
  405. package/dist/src/goals/goal-workflow-judge.js +2 -2
  406. package/dist/src/i18n/goals-bundle.js +1 -1
  407. package/dist/src/i18n/index.js +1 -1
  408. package/dist/src/i18n/share-tool-bundle.js +2 -2
  409. package/dist/src/infra/brew.js +1 -1
  410. package/dist/src/infra/package-json.js +1 -1
  411. package/dist/src/infra/package-update-steps.js +1 -1
  412. package/dist/src/infra/path-env.js +2 -2
  413. package/dist/src/infra/restart.js +1 -1
  414. package/dist/src/infra/stable-node-path.js +1 -1
  415. package/dist/src/infra/update-check.js +1 -1
  416. package/dist/src/infra/update-global.js +1 -1
  417. package/dist/src/infra/update-lock.js +2 -2
  418. package/dist/src/infra/update-restart.js +1 -1
  419. package/dist/src/infra/update-runner.js +1 -1
  420. package/dist/src/infra/update-startup.js +1 -1
  421. package/dist/src/infra/write-file-atomic.js +2 -2
  422. package/dist/src/media/store.js +1 -1
  423. package/dist/src/notes/agent-context.js +1 -1
  424. package/dist/src/notes/service.js +1 -1
  425. package/dist/src/notes/store.js +2 -2
  426. package/dist/src/project-trust/trust-store.js +4 -2
  427. package/dist/src/project-trust/trust-store.js.map +1 -1
  428. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  429. package/dist/src/providers/index.js +1 -1
  430. package/dist/src/providers/model-registry.js +4 -4
  431. package/dist/src/session/index.d.ts +1 -1
  432. package/dist/src/session/index.js +2 -2
  433. package/dist/src/session/init-session-turn.js +7 -10
  434. package/dist/src/session/init-session-turn.js.map +1 -1
  435. package/dist/src/session/manager.d.ts +5 -1
  436. package/dist/src/session/manager.js +5 -2
  437. package/dist/src/session/manager.js.map +1 -1
  438. package/dist/src/session/reset-type.d.ts +0 -2
  439. package/dist/src/session/reset-type.js +3 -9
  440. package/dist/src/session/reset-type.js.map +1 -1
  441. package/dist/src/session/resolve-session.js +10 -21
  442. package/dist/src/session/resolve-session.js.map +1 -1
  443. package/dist/src/session/session-title.js +2 -2
  444. package/dist/src/session/store.d.ts +11 -3
  445. package/dist/src/session/store.js +30 -14
  446. package/dist/src/session/store.js.map +1 -1
  447. package/dist/src/session/types.d.ts +2 -4
  448. package/dist/src/session/types.js.map +1 -1
  449. package/dist/src/share/share-auto.js +2 -2
  450. package/dist/src/share/share-store.js +3 -3
  451. package/dist/src/share/share-thumbnail.js +2 -2
  452. package/dist/src/share/share-zip.js +1 -1
  453. package/dist/src/share/site-share-store.js +3 -3
  454. package/dist/src/share/site-static-serve.js +1 -1
  455. package/dist/src/storage/sqlite/connection.js +1 -1
  456. package/dist/src/storage/sqlite/index.d.ts +2 -2
  457. package/dist/src/storage/sqlite/index.js +3 -3
  458. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  459. package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
  460. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  461. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  462. package/dist/src/storage/sqlite/migrations/runner.js +5 -5
  463. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  464. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  465. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
  466. package/dist/src/storage/sqlite/row-mappers.js +11 -14
  467. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  468. package/dist/src/storage/sqlite/schema.js +4 -4
  469. package/dist/src/storage/sqlite/schema.js.map +1 -1
  470. package/dist/src/storage/sqlite/schema.sql +37 -10
  471. package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
  472. package/dist/src/storage/sqlite/session-metadata.js +18 -72
  473. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  474. package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
  475. package/dist/src/storage/sqlite/session-repository.js +34 -40
  476. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
  478. package/dist/src/storage/sqlite/transcript-repository.js +52 -52
  479. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  480. package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
  481. package/dist/src/tui/backends/embedded-backend.js +100 -1
  482. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  483. package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
  484. package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
  485. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  486. package/dist/src/tui/clipboard-image.js +3 -3
  487. package/dist/src/tui/components/chat-log.d.ts +2 -0
  488. package/dist/src/tui/components/chat-log.js +19 -0
  489. package/dist/src/tui/components/chat-log.js.map +1 -1
  490. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  491. package/dist/src/tui/extension-host/autocomplete.js +29 -12
  492. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  493. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  494. package/dist/src/tui/extension-host/runtime.d.ts +12 -0
  495. package/dist/src/tui/extension-host/runtime.js +6 -4
  496. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  497. package/dist/src/tui/theme-manager.js +1 -1
  498. package/dist/src/tui/tui-backend.d.ts +23 -0
  499. package/dist/src/tui/tui-command-formatters.js +4 -4
  500. package/dist/src/tui/tui-commands.d.ts +16 -3
  501. package/dist/src/tui/tui-commands.js +134 -27
  502. package/dist/src/tui/tui-commands.js.map +1 -1
  503. package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
  504. package/dist/src/tui/tui-file-autocomplete.js +26 -0
  505. package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
  506. package/dist/src/tui/tui-keybindings-file.js +1 -1
  507. package/dist/src/tui/tui-picker-overlay.js +1 -1
  508. package/dist/src/tui/tui-scoped-models.js +2 -2
  509. package/dist/src/tui/tui-settings.js +1 -1
  510. package/dist/src/tui/tui-startup-resources.js +1 -1
  511. package/dist/src/tui/tui-startup-text.js +1 -1
  512. package/dist/src/tui/tui-startup-text.js.map +1 -1
  513. package/dist/src/tui/tui.js +106 -17
  514. package/dist/src/tui/tui.js.map +1 -1
  515. package/dist/src/tunnel/frpc-binary.js +4 -4
  516. package/dist/src/tunnel/frpc-config.js +1 -1
  517. package/dist/src/tunnel/frpc-extract.js +1 -1
  518. package/dist/src/tunnel/tunnel-state.js +1 -1
  519. package/dist/src/utils/logger/audit.js +1 -1
  520. package/dist/src/utils/logger/context.d.ts +2 -2
  521. package/dist/src/utils/logger/context.js +2 -1
  522. package/dist/src/utils/logger/context.js.map +1 -1
  523. package/dist/src/utils/logger/log-store.js +2 -1
  524. package/dist/src/utils/logger/log-store.js.map +1 -1
  525. package/dist/src/utils/logger/pino-record.js +3 -0
  526. package/dist/src/utils/logger/pino-record.js.map +1 -1
  527. package/dist/src/utils/logger/rotation.js +1 -1
  528. package/dist/src/utils/logger/streams.js +1 -1
  529. package/dist/src/utils/logger/types.d.ts +5 -0
  530. package/dist/src/utils/logger/types.js.map +1 -1
  531. package/dist/src/voice/tts/audio.js +1 -1
  532. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  533. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  534. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  535. package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
  536. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  537. package/dist/src/workflows/store/event-store.js +1 -1
  538. package/dist/src/workflows/store/run-store.js +1 -1
  539. package/package.json +1 -1
  540. package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
  541. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
  542. package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
  543. package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
  544. package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
  545. package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
  546. package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
  547. package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
  548. package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
  549. package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
  550. package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
  551. package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
  552. package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
  553. package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
  554. package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
  555. package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
  556. package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
  557. package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
  558. package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
  559. package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
  560. package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
  561. package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
  562. package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
  563. package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
  564. package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
  565. package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
  566. package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
  567. package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
@@ -33,6 +33,7 @@ function parseBrowserPipeline(yamlSource) {
33
33
  const description = typeof doc.description === "string" ? doc.description : void 0;
34
34
  const provider = typeof doc.provider === "string" ? doc.provider : void 0;
35
35
  const include = Array.isArray(doc.include) ? doc.include.filter((x) => typeof x === "string") : void 0;
36
+ const timeoutSeconds = typeof doc.timeoutSeconds === "number" ? doc.timeoutSeconds : void 0;
36
37
  const argsRaw = doc.args && typeof doc.args === "object" && !Array.isArray(doc.args) ? doc.args : {};
37
38
  const args = {};
38
39
  for (const [k, v] of Object.entries(argsRaw)) if (v && typeof v === "object" && !Array.isArray(v)) {
@@ -48,81 +49,56 @@ function parseBrowserPipeline(yamlSource) {
48
49
  type: "string",
49
50
  default: v
50
51
  };
51
- const pipelineRaw = doc.pipeline;
52
- if (!Array.isArray(pipelineRaw)) {
53
- errors.push({
54
- path: "pipeline",
55
- message: "`pipeline` must be an array of steps."
56
- });
57
- return {
58
- ok: false,
59
- errors
60
- };
61
- }
62
- const pipeline = [];
63
- for (let i = 0; i < pipelineRaw.length; i++) {
64
- const step = pipelineRaw[i];
65
- if (!step || typeof step !== "object" || Array.isArray(step)) {
66
- errors.push({
67
- path: `pipeline[${i}]`,
68
- message: "Each step must be a YAML mapping."
52
+ function parseSteps(rawSteps, path, required) {
53
+ if (!Array.isArray(rawSteps)) {
54
+ if (required) errors.push({
55
+ path,
56
+ message: `\`${path}\` must be an array of steps.`
69
57
  });
70
- continue;
58
+ return [];
71
59
  }
72
- const stepObj = step;
73
- const actionKeys = Object.keys(stepObj);
74
- if (actionKeys.length !== 1) {
75
- errors.push({
76
- path: `pipeline[${i}]`,
77
- message: `Each step must have exactly one action key, found ${actionKeys.length}: [${actionKeys.join(", ")}].`
78
- });
79
- continue;
80
- }
81
- const action = actionKeys[0];
82
- const actionArgs = stepObj[action];
83
- if (typeof actionArgs === "string") pipeline.push({
84
- action,
85
- args: actionArgs
86
- });
87
- else if (actionArgs && typeof actionArgs === "object" && !Array.isArray(actionArgs)) pipeline.push({
88
- action,
89
- args: actionArgs
90
- });
91
- else if (actionArgs === null || actionArgs === void 0) pipeline.push({
92
- action,
93
- args: {}
94
- });
95
- else pipeline.push({
96
- action,
97
- args: { value: actionArgs }
98
- });
99
- }
100
- const onErrorRaw = doc.on_error;
101
- let onError;
102
- if (Array.isArray(onErrorRaw)) {
103
- onError = [];
104
- for (let i = 0; i < onErrorRaw.length; i++) {
105
- const step = onErrorRaw[i];
106
- if (!step || typeof step !== "object" || Array.isArray(step)) continue;
60
+ const pipeline = [];
61
+ for (let i = 0; i < rawSteps.length; i++) {
62
+ const step = rawSteps[i];
63
+ if (!step || typeof step !== "object" || Array.isArray(step)) {
64
+ errors.push({
65
+ path: `${path}[${i}]`,
66
+ message: "Each step must be a YAML mapping."
67
+ });
68
+ continue;
69
+ }
107
70
  const stepObj = step;
108
71
  const actionKeys = Object.keys(stepObj);
109
- if (actionKeys.length !== 1) continue;
72
+ if (actionKeys.length !== 1) {
73
+ errors.push({
74
+ path: `${path}[${i}]`,
75
+ message: `Each step must have exactly one action key, found ${actionKeys.length}: [${actionKeys.join(", ")}].`
76
+ });
77
+ continue;
78
+ }
110
79
  const action = actionKeys[0];
111
80
  const actionArgs = stepObj[action];
112
- if (typeof actionArgs === "string") onError.push({
81
+ if (typeof actionArgs === "string") pipeline.push({
113
82
  action,
114
83
  args: actionArgs
115
84
  });
116
- else if (actionArgs && typeof actionArgs === "object" && !Array.isArray(actionArgs)) onError.push({
85
+ else if (actionArgs && typeof actionArgs === "object" && !Array.isArray(actionArgs)) pipeline.push({
117
86
  action,
118
87
  args: actionArgs
119
88
  });
120
- else onError.push({
89
+ else if (actionArgs === null || actionArgs === void 0) pipeline.push({
121
90
  action,
122
91
  args: {}
123
92
  });
93
+ else pipeline.push({
94
+ action,
95
+ args: { value: actionArgs }
96
+ });
124
97
  }
98
+ return pipeline;
125
99
  }
100
+ const pipeline = parseSteps(doc.pipeline, "pipeline", true);
101
+ const onError = doc.on_error === void 0 ? void 0 : parseSteps(doc.on_error, "on_error", false);
126
102
  if (errors.length > 0) return {
127
103
  ok: false,
128
104
  errors
@@ -134,6 +110,7 @@ function parseBrowserPipeline(yamlSource) {
134
110
  description,
135
111
  provider,
136
112
  include,
113
+ timeoutSeconds,
137
114
  args,
138
115
  pipeline,
139
116
  onError
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../src/browser/pipeline/schema.ts"],"sourcesContent":["/**\n * Pipeline YAML schema — parse and validate brocli-style browser pipeline documents.\n */\n\nimport yaml from 'js-yaml';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface PipelineArgDef {\n type: string;\n required?: boolean;\n default?: unknown;\n description?: string;\n choices?: unknown[];\n}\n\nexport interface PipelineStep {\n /** The single action name (key of the step object). */\n action: string;\n /** Action arguments (value of that key), or raw string for shorthand like `evaluate: |`. */\n args: Record<string, unknown> | string;\n}\n\nexport interface PipelineDocument {\n name: string;\n description?: string;\n provider?: string;\n include?: string[];\n args: Record<string, PipelineArgDef>;\n pipeline: PipelineStep[];\n onError?: PipelineStep[];\n}\n\nexport interface PipelineValidationError {\n path: string;\n message: string;\n}\n\nexport interface PipelineParseResult {\n ok: boolean;\n document?: PipelineDocument;\n errors: PipelineValidationError[];\n}\n\n// ─── Parse ──────────────────────────────────────────────────────────────────\n\nexport function parseBrowserPipeline(yamlSource: string): PipelineParseResult {\n const errors: PipelineValidationError[] = [];\n\n let raw: unknown;\n try {\n raw = yaml.load(yamlSource);\n } catch (e) {\n return { ok: false, errors: [{ path: '', message: `YAML parse error: ${e instanceof Error ? e.message : String(e)}` }] };\n }\n\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ok: false, errors: [{ path: '', message: 'Pipeline must be a YAML mapping (object).' }] };\n }\n\n const doc = raw as Record<string, unknown>;\n\n // name\n const name = typeof doc.name === 'string' ? doc.name.trim() : '';\n if (!name) errors.push({ path: 'name', message: '`name` is required.' });\n\n // description\n const description = typeof doc.description === 'string' ? doc.description : undefined;\n\n // provider\n const provider = typeof doc.provider === 'string' ? doc.provider : undefined;\n\n // include\n const include = Array.isArray(doc.include)\n ? doc.include.filter((x): x is string => typeof x === 'string')\n : undefined;\n\n // args\n const argsRaw = (doc.args && typeof doc.args === 'object' && !Array.isArray(doc.args)) ? doc.args as Record<string, unknown> : {};\n const args: Record<string, PipelineArgDef> = {};\n for (const [k, v] of Object.entries(argsRaw)) {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n const def = v as Record<string, unknown>;\n args[k] = {\n type: typeof def.type === 'string' ? def.type : 'string',\n required: def.required === true,\n default: def.default,\n description: typeof def.description === 'string' ? def.description : undefined,\n choices: Array.isArray(def.choices) ? def.choices : undefined,\n };\n } else {\n args[k] = { type: 'string', default: v };\n }\n }\n\n // pipeline\n const pipelineRaw = doc.pipeline;\n if (!Array.isArray(pipelineRaw)) {\n errors.push({ path: 'pipeline', message: '`pipeline` must be an array of steps.' });\n return { ok: false, errors };\n }\n\n const pipeline: PipelineStep[] = [];\n for (let i = 0; i < pipelineRaw.length; i++) {\n const step = pipelineRaw[i];\n if (!step || typeof step !== 'object' || Array.isArray(step)) {\n errors.push({ path: `pipeline[${i}]`, message: 'Each step must be a YAML mapping.' });\n continue;\n }\n const stepObj = step as Record<string, unknown>;\n const actionKeys = Object.keys(stepObj);\n if (actionKeys.length !== 1) {\n errors.push({ path: `pipeline[${i}]`, message: `Each step must have exactly one action key, found ${actionKeys.length}: [${actionKeys.join(', ')}].` });\n continue;\n }\n const action = actionKeys[0];\n const actionArgs = stepObj[action];\n if (typeof actionArgs === 'string') {\n pipeline.push({ action, args: actionArgs });\n } else if (actionArgs && typeof actionArgs === 'object' && !Array.isArray(actionArgs)) {\n pipeline.push({ action, args: actionArgs as Record<string, unknown> });\n } else if (actionArgs === null || actionArgs === undefined) {\n pipeline.push({ action, args: {} });\n } else {\n pipeline.push({ action, args: { value: actionArgs } });\n }\n }\n\n // on_error\n const onErrorRaw = doc.on_error;\n let onError: PipelineStep[] | undefined;\n if (Array.isArray(onErrorRaw)) {\n onError = [];\n for (let i = 0; i < onErrorRaw.length; i++) {\n const step = onErrorRaw[i];\n if (!step || typeof step !== 'object' || Array.isArray(step)) continue;\n const stepObj = step as Record<string, unknown>;\n const actionKeys = Object.keys(stepObj);\n if (actionKeys.length !== 1) continue;\n const action = actionKeys[0];\n const actionArgs = stepObj[action];\n if (typeof actionArgs === 'string') {\n onError.push({ action, args: actionArgs });\n } else if (actionArgs && typeof actionArgs === 'object' && !Array.isArray(actionArgs)) {\n onError.push({ action, args: actionArgs as Record<string, unknown> });\n } else {\n onError.push({ action, args: {} });\n }\n }\n }\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n return {\n ok: true,\n document: { name, description, provider, include, args, pipeline, onError },\n errors: [],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../src/browser/pipeline/schema.ts"],"sourcesContent":["/**\n * Pipeline YAML schema — parse and validate brocli-style browser pipeline documents.\n */\n\nimport yaml from 'js-yaml';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface PipelineArgDef {\n type: string;\n required?: boolean;\n default?: unknown;\n description?: string;\n choices?: unknown[];\n}\n\nexport interface PipelineStep {\n /** The single action name (key of the step object). */\n action: string;\n /** Action arguments (value of that key), or raw string for shorthand like `evaluate: |`. */\n args: Record<string, unknown> | string;\n}\n\nexport interface PipelineDocument {\n name: string;\n description?: string;\n provider?: string;\n include?: string[];\n timeoutSeconds?: number;\n args: Record<string, PipelineArgDef>;\n pipeline: PipelineStep[];\n onError?: PipelineStep[];\n}\n\nexport interface PipelineValidationError {\n path: string;\n message: string;\n}\n\nexport interface PipelineParseResult {\n ok: boolean;\n document?: PipelineDocument;\n errors: PipelineValidationError[];\n}\n\n// ─── Parse ──────────────────────────────────────────────────────────────────\n\nexport function parseBrowserPipeline(yamlSource: string): PipelineParseResult {\n const errors: PipelineValidationError[] = [];\n\n let raw: unknown;\n try {\n raw = yaml.load(yamlSource);\n } catch (e) {\n return { ok: false, errors: [{ path: '', message: `YAML parse error: ${e instanceof Error ? e.message : String(e)}` }] };\n }\n\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ok: false, errors: [{ path: '', message: 'Pipeline must be a YAML mapping (object).' }] };\n }\n\n const doc = raw as Record<string, unknown>;\n\n // name\n const name = typeof doc.name === 'string' ? doc.name.trim() : '';\n if (!name) errors.push({ path: 'name', message: '`name` is required.' });\n\n // description\n const description = typeof doc.description === 'string' ? doc.description : undefined;\n\n // provider\n const provider = typeof doc.provider === 'string' ? doc.provider : undefined;\n\n // include\n const include = Array.isArray(doc.include)\n ? doc.include.filter((x): x is string => typeof x === 'string')\n : undefined;\n\n const timeoutSeconds = typeof doc.timeoutSeconds === 'number' ? doc.timeoutSeconds : undefined;\n\n // args\n const argsRaw = (doc.args && typeof doc.args === 'object' && !Array.isArray(doc.args)) ? doc.args as Record<string, unknown> : {};\n const args: Record<string, PipelineArgDef> = {};\n for (const [k, v] of Object.entries(argsRaw)) {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n const def = v as Record<string, unknown>;\n args[k] = {\n type: typeof def.type === 'string' ? def.type : 'string',\n required: def.required === true,\n default: def.default,\n description: typeof def.description === 'string' ? def.description : undefined,\n choices: Array.isArray(def.choices) ? def.choices : undefined,\n };\n } else {\n args[k] = { type: 'string', default: v };\n }\n }\n\n function parseSteps(rawSteps: unknown, path: string, required: boolean): PipelineStep[] {\n if (!Array.isArray(rawSteps)) {\n if (required) errors.push({ path, message: `\\`${path}\\` must be an array of steps.` });\n return [];\n }\n const pipeline: PipelineStep[] = [];\n for (let i = 0; i < rawSteps.length; i++) {\n const step = rawSteps[i];\n if (!step || typeof step !== 'object' || Array.isArray(step)) {\n errors.push({ path: `${path}[${i}]`, message: 'Each step must be a YAML mapping.' });\n continue;\n }\n const stepObj = step as Record<string, unknown>;\n const actionKeys = Object.keys(stepObj);\n if (actionKeys.length !== 1) {\n errors.push({ path: `${path}[${i}]`, message: `Each step must have exactly one action key, found ${actionKeys.length}: [${actionKeys.join(', ')}].` });\n continue;\n }\n const action = actionKeys[0];\n const actionArgs = stepObj[action];\n if (typeof actionArgs === 'string') {\n pipeline.push({ action, args: actionArgs });\n } else if (actionArgs && typeof actionArgs === 'object' && !Array.isArray(actionArgs)) {\n pipeline.push({ action, args: actionArgs as Record<string, unknown> });\n } else if (actionArgs === null || actionArgs === undefined) {\n pipeline.push({ action, args: {} });\n } else {\n pipeline.push({ action, args: { value: actionArgs } });\n }\n }\n return pipeline;\n }\n\n const pipeline = parseSteps(doc.pipeline, 'pipeline', true);\n const onError = doc.on_error === undefined ? undefined : parseSteps(doc.on_error, 'on_error', false);\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n return {\n ok: true,\n document: { name, description, provider, include, timeoutSeconds, args, pipeline, onError },\n errors: [],\n };\n}\n"],"mappings":"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"}
@@ -4,4 +4,6 @@ export interface BrowserPipelineSource {
4
4
  location: string;
5
5
  }
6
6
  export declare function isRemotePipelineSource(location: string): boolean;
7
+ export declare function fetchPipelineSource(url: string): Promise<string>;
7
8
  export declare function loadBrowserPipelineSource(location: string): Promise<BrowserPipelineSource>;
9
+ export declare function resolvePipelineIncludeLocation(includePath: string, parentLocation: string | undefined): string;
@@ -1,3 +1,4 @@
1
+ import { dirname, resolve } from "node:path";
1
2
  import { readFile } from "node:fs/promises";
2
3
  //#region src/browser/pipeline/source.ts
3
4
  const DEFAULT_PIPELINE_SOURCE_TIMEOUT_MS = 3e4;
@@ -64,7 +65,15 @@ async function loadBrowserPipelineSource(location) {
64
65
  location: normalizedLocation
65
66
  };
66
67
  }
68
+ function resolvePipelineIncludeLocation(includePath, parentLocation) {
69
+ const normalized = includePath.trim();
70
+ if (!normalized) throw new Error("Pipeline include path is empty");
71
+ if (isRemotePipelineSource(normalized)) return normalized;
72
+ if (!parentLocation) return resolve(normalized);
73
+ if (isRemotePipelineSource(parentLocation)) return new URL(normalized, parentLocation).toString();
74
+ return resolve(dirname(parentLocation), normalized);
75
+ }
67
76
  //#endregion
68
- export { isRemotePipelineSource, loadBrowserPipelineSource };
77
+ export { fetchPipelineSource, isRemotePipelineSource, loadBrowserPipelineSource, resolvePipelineIncludeLocation };
69
78
 
70
79
  //# sourceMappingURL=source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","names":[],"sources":["../../../../src/browser/pipeline/source.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nconst DEFAULT_PIPELINE_SOURCE_TIMEOUT_MS = 30_000;\nconst MAX_PIPELINE_SOURCE_BYTES = 1024 * 1024;\n\nexport interface BrowserPipelineSource {\n source: string;\n origin: 'file' | 'url';\n location: string;\n}\n\nexport function isRemotePipelineSource(location: string): boolean {\n try {\n const url = new URL(location);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nasync function readLimitedResponseText(response: Response, url: string): Promise<string> {\n const contentLength = response.headers.get('content-length');\n if (contentLength) {\n const expectedBytes = Number.parseInt(contentLength, 10);\n if (Number.isFinite(expectedBytes) && expectedBytes > MAX_PIPELINE_SOURCE_BYTES) {\n throw new Error(`Pipeline URL is too large: ${expectedBytes} bytes`);\n }\n }\n\n if (!response.body) {\n return await response.text();\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n totalBytes += value.byteLength;\n if (totalBytes > MAX_PIPELINE_SOURCE_BYTES) {\n await reader.cancel().catch(() => {});\n throw new Error(`Pipeline URL is too large: ${url}`);\n }\n chunks.push(value);\n }\n\n const payload = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n payload.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new TextDecoder().decode(payload);\n}\n\nasync function fetchPipelineSource(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n accept: 'application/yaml, text/yaml, text/plain, */*',\n },\n signal: AbortSignal.timeout(DEFAULT_PIPELINE_SOURCE_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n const statusText = response.statusText ? ` ${response.statusText}` : '';\n throw new Error(`Pipeline URL returned HTTP ${response.status}${statusText}`);\n }\n\n return await readLimitedResponseText(response, url);\n}\n\nexport async function loadBrowserPipelineSource(location: string): Promise<BrowserPipelineSource> {\n const normalizedLocation = location.trim();\n if (!normalizedLocation) {\n throw new Error('Pipeline path is empty');\n }\n\n if (isRemotePipelineSource(normalizedLocation)) {\n return {\n source: await fetchPipelineSource(normalizedLocation),\n origin: 'url',\n location: normalizedLocation,\n };\n }\n\n return {\n source: await readFile(normalizedLocation, 'utf-8'),\n origin: 'file',\n location: normalizedLocation,\n };\n}\n"],"mappings":";;AAEA,MAAM,qCAAqC;AAC3C,MAAM,4BAA4B,OAAO;AAQzC,SAAgB,uBAAuB,UAA2B;AAChE,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,SAAO,IAAI,aAAa,WAAW,IAAI,aAAa;SAC9C;AACN,SAAO;;;AAIX,eAAe,wBAAwB,UAAoB,KAA8B;CACvF,MAAM,gBAAgB,SAAS,QAAQ,IAAI,iBAAiB;AAC5D,KAAI,eAAe;EACjB,MAAM,gBAAgB,OAAO,SAAS,eAAe,GAAG;AACxD,MAAI,OAAO,SAAS,cAAc,IAAI,gBAAgB,0BACpD,OAAM,IAAI,MAAM,8BAA8B,cAAc,QAAQ;;AAIxE,KAAI,CAAC,SAAS,KACZ,QAAO,MAAM,SAAS,MAAM;CAG9B,MAAM,SAAS,SAAS,KAAK,WAAW;CACxC,MAAM,SAAuB,EAAE;CAC/B,IAAI,aAAa;AAEjB,QAAO,MAAM;EACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KACF;AAEF,MAAI,CAAC,MACH;AAEF,gBAAc,MAAM;AACpB,MAAI,aAAa,2BAA2B;AAC1C,SAAM,OAAO,QAAQ,CAAC,YAAY,GAAG;AACrC,SAAM,IAAI,MAAM,8BAA8B,MAAM;;AAEtD,SAAO,KAAK,MAAM;;CAGpB,MAAM,UAAU,IAAI,WAAW,WAAW;CAC1C,IAAI,SAAS;AACb,MAAK,MAAM,SAAS,QAAQ;AAC1B,UAAQ,IAAI,OAAO,OAAO;AAC1B,YAAU,MAAM;;AAGlB,QAAO,IAAI,aAAa,CAAC,OAAO,QAAQ;;AAG1C,eAAe,oBAAoB,KAA8B;CAC/D,MAAM,WAAW,MAAM,MAAM,KAAK;EAChC,SAAS,EACP,QAAQ,gDACT;EACD,QAAQ,YAAY,QAAQ,mCAAmC;EAChE,CAAC;AAEF,KAAI,CAAC,SAAS,IAAI;EAChB,MAAM,aAAa,SAAS,aAAa,IAAI,SAAS,eAAe;AACrE,QAAM,IAAI,MAAM,8BAA8B,SAAS,SAAS,aAAa;;AAG/E,QAAO,MAAM,wBAAwB,UAAU,IAAI;;AAGrD,eAAsB,0BAA0B,UAAkD;CAChG,MAAM,qBAAqB,SAAS,MAAM;AAC1C,KAAI,CAAC,mBACH,OAAM,IAAI,MAAM,yBAAyB;AAG3C,KAAI,uBAAuB,mBAAmB,CAC5C,QAAO;EACL,QAAQ,MAAM,oBAAoB,mBAAmB;EACrD,QAAQ;EACR,UAAU;EACX;AAGH,QAAO;EACL,QAAQ,MAAM,SAAS,oBAAoB,QAAQ;EACnD,QAAQ;EACR,UAAU;EACX"}
1
+ {"version":3,"file":"source.js","names":[],"sources":["../../../../src/browser/pipeline/source.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\n\nconst DEFAULT_PIPELINE_SOURCE_TIMEOUT_MS = 30_000;\nconst MAX_PIPELINE_SOURCE_BYTES = 1024 * 1024;\n\nexport interface BrowserPipelineSource {\n source: string;\n origin: 'file' | 'url';\n location: string;\n}\n\nexport function isRemotePipelineSource(location: string): boolean {\n try {\n const url = new URL(location);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nasync function readLimitedResponseText(response: Response, url: string): Promise<string> {\n const contentLength = response.headers.get('content-length');\n if (contentLength) {\n const expectedBytes = Number.parseInt(contentLength, 10);\n if (Number.isFinite(expectedBytes) && expectedBytes > MAX_PIPELINE_SOURCE_BYTES) {\n throw new Error(`Pipeline URL is too large: ${expectedBytes} bytes`);\n }\n }\n\n if (!response.body) {\n return await response.text();\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n totalBytes += value.byteLength;\n if (totalBytes > MAX_PIPELINE_SOURCE_BYTES) {\n await reader.cancel().catch(() => {});\n throw new Error(`Pipeline URL is too large: ${url}`);\n }\n chunks.push(value);\n }\n\n const payload = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n payload.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new TextDecoder().decode(payload);\n}\n\nexport async function fetchPipelineSource(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n accept: 'application/yaml, text/yaml, text/plain, */*',\n },\n signal: AbortSignal.timeout(DEFAULT_PIPELINE_SOURCE_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n const statusText = response.statusText ? ` ${response.statusText}` : '';\n throw new Error(`Pipeline URL returned HTTP ${response.status}${statusText}`);\n }\n\n return await readLimitedResponseText(response, url);\n}\n\nexport async function loadBrowserPipelineSource(location: string): Promise<BrowserPipelineSource> {\n const normalizedLocation = location.trim();\n if (!normalizedLocation) {\n throw new Error('Pipeline path is empty');\n }\n\n if (isRemotePipelineSource(normalizedLocation)) {\n return {\n source: await fetchPipelineSource(normalizedLocation),\n origin: 'url',\n location: normalizedLocation,\n };\n }\n\n return {\n source: await readFile(normalizedLocation, 'utf-8'),\n origin: 'file',\n location: normalizedLocation,\n };\n}\n\nexport function resolvePipelineIncludeLocation(includePath: string, parentLocation: string | undefined): string {\n const normalized = includePath.trim();\n if (!normalized) {\n throw new Error('Pipeline include path is empty');\n }\n if (isRemotePipelineSource(normalized)) {\n return normalized;\n }\n if (!parentLocation) {\n return resolve(normalized);\n }\n if (isRemotePipelineSource(parentLocation)) {\n return new URL(normalized, parentLocation).toString();\n }\n return resolve(dirname(parentLocation), normalized);\n}\n"],"mappings":";;;AAGA,MAAM,qCAAqC;AAC3C,MAAM,4BAA4B,OAAO;AAQzC,SAAgB,uBAAuB,UAA2B;AAChE,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,SAAO,IAAI,aAAa,WAAW,IAAI,aAAa;SAC9C;AACN,SAAO;;;AAIX,eAAe,wBAAwB,UAAoB,KAA8B;CACvF,MAAM,gBAAgB,SAAS,QAAQ,IAAI,iBAAiB;AAC5D,KAAI,eAAe;EACjB,MAAM,gBAAgB,OAAO,SAAS,eAAe,GAAG;AACxD,MAAI,OAAO,SAAS,cAAc,IAAI,gBAAgB,0BACpD,OAAM,IAAI,MAAM,8BAA8B,cAAc,QAAQ;;AAIxE,KAAI,CAAC,SAAS,KACZ,QAAO,MAAM,SAAS,MAAM;CAG9B,MAAM,SAAS,SAAS,KAAK,WAAW;CACxC,MAAM,SAAuB,EAAE;CAC/B,IAAI,aAAa;AAEjB,QAAO,MAAM;EACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KACF;AAEF,MAAI,CAAC,MACH;AAEF,gBAAc,MAAM;AACpB,MAAI,aAAa,2BAA2B;AAC1C,SAAM,OAAO,QAAQ,CAAC,YAAY,GAAG;AACrC,SAAM,IAAI,MAAM,8BAA8B,MAAM;;AAEtD,SAAO,KAAK,MAAM;;CAGpB,MAAM,UAAU,IAAI,WAAW,WAAW;CAC1C,IAAI,SAAS;AACb,MAAK,MAAM,SAAS,QAAQ;AAC1B,UAAQ,IAAI,OAAO,OAAO;AAC1B,YAAU,MAAM;;AAGlB,QAAO,IAAI,aAAa,CAAC,OAAO,QAAQ;;AAG1C,eAAsB,oBAAoB,KAA8B;CACtE,MAAM,WAAW,MAAM,MAAM,KAAK;EAChC,SAAS,EACP,QAAQ,gDACT;EACD,QAAQ,YAAY,QAAQ,mCAAmC;EAChE,CAAC;AAEF,KAAI,CAAC,SAAS,IAAI;EAChB,MAAM,aAAa,SAAS,aAAa,IAAI,SAAS,eAAe;AACrE,QAAM,IAAI,MAAM,8BAA8B,SAAS,SAAS,aAAa;;AAG/E,QAAO,MAAM,wBAAwB,UAAU,IAAI;;AAGrD,eAAsB,0BAA0B,UAAkD;CAChG,MAAM,qBAAqB,SAAS,MAAM;AAC1C,KAAI,CAAC,mBACH,OAAM,IAAI,MAAM,yBAAyB;AAG3C,KAAI,uBAAuB,mBAAmB,CAC5C,QAAO;EACL,QAAQ,MAAM,oBAAoB,mBAAmB;EACrD,QAAQ;EACR,UAAU;EACX;AAGH,QAAO;EACL,QAAQ,MAAM,SAAS,oBAAoB,QAAQ;EACnD,QAAQ;EACR,UAAU;EACX;;AAGH,SAAgB,+BAA+B,aAAqB,gBAA4C;CAC9G,MAAM,aAAa,YAAY,MAAM;AACrC,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,iCAAiC;AAEnD,KAAI,uBAAuB,WAAW,CACpC,QAAO;AAET,KAAI,CAAC,eACH,QAAO,QAAQ,WAAW;AAE5B,KAAI,uBAAuB,eAAe,CACxC,QAAO,IAAI,IAAI,YAAY,eAAe,CAAC,UAAU;AAEvD,QAAO,QAAQ,QAAQ,eAAe,EAAE,WAAW"}
@@ -1,21 +1,29 @@
1
1
  /**
2
2
  * Pipeline template expression engine.
3
3
  *
4
- * Supports: ${{ args.xxx }}, ${{ data }}, ${{ data | json }}, ${{ error.message }}
4
+ * Supports: ${{ args.xxx }}, ${{ last }}, ${{ outputs.0 }}, ${{ vars.name }},
5
+ * ${{ error.message }} and simple pipe filters.
5
6
  * Does NOT execute arbitrary JavaScript — only whitelisted expressions.
6
7
  */
7
8
  export interface TemplateContext {
8
9
  args: Record<string, unknown>;
9
- data: unknown;
10
+ last: unknown;
11
+ outputs: unknown[];
12
+ vars: Record<string, unknown>;
10
13
  error?: {
11
14
  code?: string;
12
15
  message?: string;
13
16
  };
14
17
  }
18
+ export declare function resolvePath(obj: unknown, path: string): unknown;
19
+ export declare function isTruthyValue(value: unknown): boolean;
20
+ export declare function valueContains(actual: unknown, expected: unknown): boolean;
21
+ export declare function evaluateRawExpression(expr: string, ctx: TemplateContext): unknown;
15
22
  /**
16
23
  * Resolve all `${{ ... }}` expressions in a string.
17
24
  */
18
25
  export declare function resolveTemplate(template: string, ctx: TemplateContext): string;
26
+ export declare function resolveTemplateValue(value: string, ctx: TemplateContext): unknown;
19
27
  /**
20
28
  * Deep-resolve templates in an object/array/string value.
21
29
  */
@@ -2,16 +2,24 @@
2
2
  /**
3
3
  * Pipeline template expression engine.
4
4
  *
5
- * Supports: ${{ args.xxx }}, ${{ data }}, ${{ data | json }}, ${{ error.message }}
5
+ * Supports: ${{ args.xxx }}, ${{ last }}, ${{ outputs.0 }}, ${{ vars.name }},
6
+ * ${{ error.message }} and simple pipe filters.
6
7
  * Does NOT execute arbitrary JavaScript — only whitelisted expressions.
7
8
  */
8
9
  const TEMPLATE_RE = /\$\{\{\s*(.+?)\s*\}\}/g;
10
+ function parsePath(path) {
11
+ return path.replace(/\[(\d+)\]/g, ".$1").split(".").map((part) => part.trim()).filter(Boolean);
12
+ }
9
13
  function resolvePath(obj, path) {
10
- const parts = path.split(".");
14
+ const parts = parsePath(path);
11
15
  let current = obj;
12
16
  for (const part of parts) {
13
17
  if (current === null || current === void 0) return void 0;
14
- if (typeof current === "object") current = current[part];
18
+ if (Array.isArray(current)) {
19
+ const index = Number(part);
20
+ if (!Number.isInteger(index)) return void 0;
21
+ current = current[index];
22
+ } else if (typeof current === "object") current = current[part];
15
23
  else return;
16
24
  }
17
25
  return current;
@@ -22,10 +30,24 @@ function applyFilter(value, filter) {
22
30
  case "string": return String(value ?? "");
23
31
  case "number": return String(Number(value));
24
32
  case "boolean": return String(Boolean(value));
33
+ case "urlencode": return encodeURIComponent(String(value ?? ""));
25
34
  default: return String(value ?? "");
26
35
  }
27
36
  }
28
- function evaluateExpression(expr, ctx) {
37
+ function isTruthyValue(value) {
38
+ if (value === null || value === void 0 || value === false) return false;
39
+ if (typeof value === "number") return Number.isFinite(value) && value !== 0;
40
+ if (typeof value === "string") return value.length > 0 && value !== "false" && value !== "0";
41
+ if (Array.isArray(value)) return value.length > 0;
42
+ return true;
43
+ }
44
+ function valueContains(actual, expected) {
45
+ if (typeof actual === "string") return actual.includes(String(expected));
46
+ if (Array.isArray(actual)) return actual.some((item) => JSON.stringify(item) === JSON.stringify(expected));
47
+ if (actual && typeof actual === "object") return JSON.stringify(actual).includes(String(expected));
48
+ return String(actual ?? "").includes(String(expected));
49
+ }
50
+ function evaluateRawExpression(expr, ctx) {
29
51
  const pipeIdx = expr.indexOf("|");
30
52
  let path = expr;
31
53
  let filter;
@@ -34,17 +56,31 @@ function evaluateExpression(expr, ctx) {
34
56
  filter = expr.slice(pipeIdx + 1).trim();
35
57
  }
36
58
  let value;
37
- if (path === "data") value = ctx.data;
59
+ if (path === "last") value = ctx.last;
60
+ else if (path.startsWith("last.")) value = resolvePath(ctx.last, path.slice(5));
38
61
  else if (path.startsWith("args.")) value = resolvePath(ctx.args, path.slice(5));
62
+ else if (path === "outputs") value = ctx.outputs;
63
+ else if (path.startsWith("outputs.")) value = resolvePath(ctx.outputs, path.slice(8));
64
+ else if (path === "vars") value = ctx.vars;
65
+ else if (path.startsWith("vars.")) value = resolvePath(ctx.vars, path.slice(5));
39
66
  else if (path.startsWith("error.")) value = resolvePath(ctx.error, path.slice(6));
40
67
  else if (path === "error") value = ctx.error?.message ?? "";
41
- else value = resolvePath(ctx.args, path) ?? `\${{ ${expr} }}`;
68
+ else {
69
+ value = resolvePath(ctx.args, path);
70
+ if (value === void 0) return `\${{ ${expr} }}`;
71
+ }
42
72
  if (filter) return applyFilter(value, filter);
73
+ return value;
74
+ }
75
+ function stringifyTemplateValue(value) {
43
76
  if (value === void 0 || value === null) return "";
44
77
  if (typeof value === "string") return value;
45
78
  if (typeof value === "number" || typeof value === "boolean") return String(value);
46
79
  return JSON.stringify(value);
47
80
  }
81
+ function evaluateExpression(expr, ctx) {
82
+ return stringifyTemplateValue(evaluateRawExpression(expr, ctx));
83
+ }
48
84
  /**
49
85
  * Resolve all `${{ ... }}` expressions in a string.
50
86
  */
@@ -53,11 +89,17 @@ function resolveTemplate(template, ctx) {
53
89
  return evaluateExpression(expr.trim(), ctx);
54
90
  });
55
91
  }
92
+ function resolveTemplateValue(value, ctx) {
93
+ const trimmed = value.trim();
94
+ const match = /^\$\{\{\s*(.+?)\s*\}\}$/.exec(trimmed);
95
+ if (!match) return resolveTemplate(value, ctx);
96
+ return evaluateRawExpression(match[1].trim(), ctx);
97
+ }
56
98
  /**
57
99
  * Deep-resolve templates in an object/array/string value.
58
100
  */
59
101
  function resolveTemplateDeep(value, ctx) {
60
- if (typeof value === "string") return resolveTemplate(value, ctx);
102
+ if (typeof value === "string") return resolveTemplateValue(value, ctx);
61
103
  if (Array.isArray(value)) return value.map((item) => resolveTemplateDeep(item, ctx));
62
104
  if (value && typeof value === "object") {
63
105
  const result = {};
@@ -67,6 +109,6 @@ function resolveTemplateDeep(value, ctx) {
67
109
  return value;
68
110
  }
69
111
  //#endregion
70
- export { resolveTemplate, resolveTemplateDeep };
112
+ export { evaluateRawExpression, isTruthyValue, resolvePath, resolveTemplate, resolveTemplateDeep, resolveTemplateValue, valueContains };
71
113
 
72
114
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","names":[],"sources":["../../../../src/browser/pipeline/template.ts"],"sourcesContent":["/**\n * Pipeline template expression engine.\n *\n * Supports: ${{ args.xxx }}, ${{ data }}, ${{ data | json }}, ${{ error.message }}\n * Does NOT execute arbitrary JavaScript — only whitelisted expressions.\n */\n\nconst TEMPLATE_RE = /\\$\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n\nexport interface TemplateContext {\n args: Record<string, unknown>;\n data: unknown;\n error?: { code?: string; message?: string };\n}\n\nfunction resolvePath(obj: unknown, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction applyFilter(value: unknown, filter: string): string {\n switch (filter.trim()) {\n case 'json':\n return JSON.stringify(value, null, 2) ?? 'null';\n case 'string':\n return String(value ?? '');\n case 'number':\n return String(Number(value));\n case 'boolean':\n return String(Boolean(value));\n default:\n return String(value ?? '');\n }\n}\n\nfunction evaluateExpression(expr: string, ctx: TemplateContext): string {\n // Check for pipe filter: `data | json`\n const pipeIdx = expr.indexOf('|');\n let path = expr;\n let filter: string | undefined;\n if (pipeIdx > 0) {\n path = expr.slice(0, pipeIdx).trim();\n filter = expr.slice(pipeIdx + 1).trim();\n }\n\n let value: unknown;\n\n if (path === 'data') {\n value = ctx.data;\n } else if (path.startsWith('args.')) {\n value = resolvePath(ctx.args, path.slice(5));\n } else if (path.startsWith('error.')) {\n value = resolvePath(ctx.error, path.slice(6));\n } else if (path === 'error') {\n value = ctx.error?.message ?? '';\n } else {\n // Try resolving from args as fallback\n value = resolvePath(ctx.args, path) ?? `\\${{ ${expr} }}`;\n }\n\n if (filter) {\n return applyFilter(value, filter);\n }\n\n if (value === undefined || value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\n/**\n * Resolve all `${{ ... }}` expressions in a string.\n */\nexport function resolveTemplate(template: string, ctx: TemplateContext): string {\n return template.replace(TEMPLATE_RE, (_match, expr: string) => {\n return evaluateExpression(expr.trim(), ctx);\n });\n}\n\n/**\n * Deep-resolve templates in an object/array/string value.\n */\nexport function resolveTemplateDeep(value: unknown, ctx: TemplateContext): unknown {\n if (typeof value === 'string') {\n return resolveTemplate(value, ctx);\n }\n if (Array.isArray(value)) {\n return value.map((item) => resolveTemplateDeep(item, ctx));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[resolveTemplate(k, ctx)] = resolveTemplateDeep(v, ctx);\n }\n return result;\n }\n return value;\n}\n"],"mappings":";;;;;;;AAOA,MAAM,cAAc;AAQpB,SAAS,YAAY,KAAc,MAAuB;CACxD,MAAM,QAAQ,KAAK,MAAM,IAAI;CAC7B,IAAI,UAAmB;AACvB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,YAAY,QAAQ,YAAY,KAAA,EAAW,QAAO,KAAA;AACtD,MAAI,OAAO,YAAY,SACrB,WAAW,QAAoC;MAE/C;;AAGJ,QAAO;;AAGT,SAAS,YAAY,OAAgB,QAAwB;AAC3D,SAAQ,OAAO,MAAM,EAArB;EACE,KAAK,OACH,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE,IAAI;EAC3C,KAAK,SACH,QAAO,OAAO,SAAS,GAAG;EAC5B,KAAK,SACH,QAAO,OAAO,OAAO,MAAM,CAAC;EAC9B,KAAK,UACH,QAAO,OAAO,QAAQ,MAAM,CAAC;EAC/B,QACE,QAAO,OAAO,SAAS,GAAG;;;AAIhC,SAAS,mBAAmB,MAAc,KAA8B;CAEtE,MAAM,UAAU,KAAK,QAAQ,IAAI;CACjC,IAAI,OAAO;CACX,IAAI;AACJ,KAAI,UAAU,GAAG;AACf,SAAO,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM;AACpC,WAAS,KAAK,MAAM,UAAU,EAAE,CAAC,MAAM;;CAGzC,IAAI;AAEJ,KAAI,SAAS,OACX,SAAQ,IAAI;UACH,KAAK,WAAW,QAAQ,CACjC,SAAQ,YAAY,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;UACnC,KAAK,WAAW,SAAS,CAClC,SAAQ,YAAY,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;UACpC,SAAS,QAClB,SAAQ,IAAI,OAAO,WAAW;KAG9B,SAAQ,YAAY,IAAI,MAAM,KAAK,IAAI,QAAQ,KAAK;AAGtD,KAAI,OACF,QAAO,YAAY,OAAO,OAAO;AAGnC,KAAI,UAAU,KAAA,KAAa,UAAU,KAAM,QAAO;AAClD,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,MAAM;AACjF,QAAO,KAAK,UAAU,MAAM;;;;;AAM9B,SAAgB,gBAAgB,UAAkB,KAA8B;AAC9E,QAAO,SAAS,QAAQ,cAAc,QAAQ,SAAiB;AAC7D,SAAO,mBAAmB,KAAK,MAAM,EAAE,IAAI;GAC3C;;;;;AAMJ,SAAgB,oBAAoB,OAAgB,KAA+B;AACjF,KAAI,OAAO,UAAU,SACnB,QAAO,gBAAgB,OAAO,IAAI;AAEpC,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,oBAAoB,MAAM,IAAI,CAAC;AAE5D,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,CACxC,QAAO,gBAAgB,GAAG,IAAI,IAAI,oBAAoB,GAAG,IAAI;AAE/D,SAAO;;AAET,QAAO"}
1
+ {"version":3,"file":"template.js","names":[],"sources":["../../../../src/browser/pipeline/template.ts"],"sourcesContent":["/**\n * Pipeline template expression engine.\n *\n * Supports: ${{ args.xxx }}, ${{ last }}, ${{ outputs.0 }}, ${{ vars.name }},\n * ${{ error.message }} and simple pipe filters.\n * Does NOT execute arbitrary JavaScript — only whitelisted expressions.\n */\n\nconst TEMPLATE_RE = /\\$\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n\nexport interface TemplateContext {\n args: Record<string, unknown>;\n last: unknown;\n outputs: unknown[];\n vars: Record<string, unknown>;\n error?: { code?: string; message?: string };\n}\n\nfunction parsePath(path: string): string[] {\n return path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nexport function resolvePath(obj: unknown, path: string): unknown {\n const parts = parsePath(path);\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (Array.isArray(current)) {\n const index = Number(part);\n if (!Number.isInteger(index)) return undefined;\n current = current[index];\n } else if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction applyFilter(value: unknown, filter: string): string {\n switch (filter.trim()) {\n case 'json':\n return JSON.stringify(value, null, 2) ?? 'null';\n case 'string':\n return String(value ?? '');\n case 'number':\n return String(Number(value));\n case 'boolean':\n return String(Boolean(value));\n case 'urlencode':\n return encodeURIComponent(String(value ?? ''));\n default:\n return String(value ?? '');\n }\n}\n\nexport function isTruthyValue(value: unknown): boolean {\n if (value === null || value === undefined || value === false) return false;\n if (typeof value === 'number') return Number.isFinite(value) && value !== 0;\n if (typeof value === 'string') return value.length > 0 && value !== 'false' && value !== '0';\n if (Array.isArray(value)) return value.length > 0;\n return true;\n}\n\nexport function valueContains(actual: unknown, expected: unknown): boolean {\n if (typeof actual === 'string') return actual.includes(String(expected));\n if (Array.isArray(actual)) return actual.some((item) => JSON.stringify(item) === JSON.stringify(expected));\n if (actual && typeof actual === 'object') return JSON.stringify(actual).includes(String(expected));\n return String(actual ?? '').includes(String(expected));\n}\n\nexport function evaluateRawExpression(expr: string, ctx: TemplateContext): unknown {\n // Check for pipe filter: `last | json`\n const pipeIdx = expr.indexOf('|');\n let path = expr;\n let filter: string | undefined;\n if (pipeIdx > 0) {\n path = expr.slice(0, pipeIdx).trim();\n filter = expr.slice(pipeIdx + 1).trim();\n }\n\n let value: unknown;\n\n if (path === 'last') {\n value = ctx.last;\n } else if (path.startsWith('last.')) {\n value = resolvePath(ctx.last, path.slice(5));\n } else if (path.startsWith('args.')) {\n value = resolvePath(ctx.args, path.slice(5));\n } else if (path === 'outputs') {\n value = ctx.outputs;\n } else if (path.startsWith('outputs.')) {\n value = resolvePath(ctx.outputs, path.slice(8));\n } else if (path === 'vars') {\n value = ctx.vars;\n } else if (path.startsWith('vars.')) {\n value = resolvePath(ctx.vars, path.slice(5));\n } else if (path.startsWith('error.')) {\n value = resolvePath(ctx.error, path.slice(6));\n } else if (path === 'error') {\n value = ctx.error?.message ?? '';\n } else {\n value = resolvePath(ctx.args, path);\n if (value === undefined) return `\\${{ ${expr} }}`;\n }\n\n if (filter) {\n return applyFilter(value, filter);\n }\n\n return value;\n}\n\nfunction stringifyTemplateValue(value: unknown): string {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\nfunction evaluateExpression(expr: string, ctx: TemplateContext): string {\n return stringifyTemplateValue(evaluateRawExpression(expr, ctx));\n}\n\n/**\n * Resolve all `${{ ... }}` expressions in a string.\n */\nexport function resolveTemplate(template: string, ctx: TemplateContext): string {\n return template.replace(TEMPLATE_RE, (_match, expr: string) => {\n return evaluateExpression(expr.trim(), ctx);\n });\n}\n\nexport function resolveTemplateValue(value: string, ctx: TemplateContext): unknown {\n const trimmed = value.trim();\n const match = /^\\$\\{\\{\\s*(.+?)\\s*\\}\\}$/.exec(trimmed);\n if (!match) return resolveTemplate(value, ctx);\n return evaluateRawExpression(match[1].trim(), ctx);\n}\n\n/**\n * Deep-resolve templates in an object/array/string value.\n */\nexport function resolveTemplateDeep(value: unknown, ctx: TemplateContext): unknown {\n if (typeof value === 'string') {\n return resolveTemplateValue(value, ctx);\n }\n if (Array.isArray(value)) {\n return value.map((item) => resolveTemplateDeep(item, ctx));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[resolveTemplate(k, ctx)] = resolveTemplateDeep(v, ctx);\n }\n return result;\n }\n return value;\n}\n"],"mappings":";;;;;;;;AAQA,MAAM,cAAc;AAUpB,SAAS,UAAU,MAAwB;AACzC,QAAO,KACJ,QAAQ,cAAc,MAAM,CAC5B,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ;;AAGpB,SAAgB,YAAY,KAAc,MAAuB;CAC/D,MAAM,QAAQ,UAAU,KAAK;CAC7B,IAAI,UAAmB;AACvB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,YAAY,QAAQ,YAAY,KAAA,EAAW,QAAO,KAAA;AACtD,MAAI,MAAM,QAAQ,QAAQ,EAAE;GAC1B,MAAM,QAAQ,OAAO,KAAK;AAC1B,OAAI,CAAC,OAAO,UAAU,MAAM,CAAE,QAAO,KAAA;AACrC,aAAU,QAAQ;aACT,OAAO,YAAY,SAC5B,WAAW,QAAoC;MAE/C;;AAGJ,QAAO;;AAGT,SAAS,YAAY,OAAgB,QAAwB;AAC3D,SAAQ,OAAO,MAAM,EAArB;EACE,KAAK,OACH,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE,IAAI;EAC3C,KAAK,SACH,QAAO,OAAO,SAAS,GAAG;EAC5B,KAAK,SACH,QAAO,OAAO,OAAO,MAAM,CAAC;EAC9B,KAAK,UACH,QAAO,OAAO,QAAQ,MAAM,CAAC;EAC/B,KAAK,YACH,QAAO,mBAAmB,OAAO,SAAS,GAAG,CAAC;EAChD,QACE,QAAO,OAAO,SAAS,GAAG;;;AAIhC,SAAgB,cAAc,OAAyB;AACrD,KAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU,MAAO,QAAO;AACrE,KAAI,OAAO,UAAU,SAAU,QAAO,OAAO,SAAS,MAAM,IAAI,UAAU;AAC1E,KAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS,KAAK,UAAU,WAAW,UAAU;AACzF,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,SAAS;AAChD,QAAO;;AAGT,SAAgB,cAAc,QAAiB,UAA4B;AACzE,KAAI,OAAO,WAAW,SAAU,QAAO,OAAO,SAAS,OAAO,SAAS,CAAC;AACxE,KAAI,MAAM,QAAQ,OAAO,CAAE,QAAO,OAAO,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,SAAS,CAAC;AAC1G,KAAI,UAAU,OAAO,WAAW,SAAU,QAAO,KAAK,UAAU,OAAO,CAAC,SAAS,OAAO,SAAS,CAAC;AAClG,QAAO,OAAO,UAAU,GAAG,CAAC,SAAS,OAAO,SAAS,CAAC;;AAGxD,SAAgB,sBAAsB,MAAc,KAA+B;CAEjF,MAAM,UAAU,KAAK,QAAQ,IAAI;CACjC,IAAI,OAAO;CACX,IAAI;AACJ,KAAI,UAAU,GAAG;AACf,SAAO,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM;AACpC,WAAS,KAAK,MAAM,UAAU,EAAE,CAAC,MAAM;;CAGzC,IAAI;AAEJ,KAAI,SAAS,OACX,SAAQ,IAAI;UACH,KAAK,WAAW,QAAQ,CACjC,SAAQ,YAAY,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;UACnC,KAAK,WAAW,QAAQ,CACjC,SAAQ,YAAY,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;UACnC,SAAS,UAClB,SAAQ,IAAI;UACH,KAAK,WAAW,WAAW,CACpC,SAAQ,YAAY,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;UACtC,SAAS,OAClB,SAAQ,IAAI;UACH,KAAK,WAAW,QAAQ,CACjC,SAAQ,YAAY,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;UACnC,KAAK,WAAW,SAAS,CAClC,SAAQ,YAAY,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;UACpC,SAAS,QAClB,SAAQ,IAAI,OAAO,WAAW;MACzB;AACL,UAAQ,YAAY,IAAI,MAAM,KAAK;AACnC,MAAI,UAAU,KAAA,EAAW,QAAO,QAAQ,KAAK;;AAG/C,KAAI,OACF,QAAO,YAAY,OAAO,OAAO;AAGnC,QAAO;;AAGT,SAAS,uBAAuB,OAAwB;AACtD,KAAI,UAAU,KAAA,KAAa,UAAU,KAAM,QAAO;AAClD,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,MAAM;AACjF,QAAO,KAAK,UAAU,MAAM;;AAG9B,SAAS,mBAAmB,MAAc,KAA8B;AACtE,QAAO,uBAAuB,sBAAsB,MAAM,IAAI,CAAC;;;;;AAMjE,SAAgB,gBAAgB,UAAkB,KAA8B;AAC9E,QAAO,SAAS,QAAQ,cAAc,QAAQ,SAAiB;AAC7D,SAAO,mBAAmB,KAAK,MAAM,EAAE,IAAI;GAC3C;;AAGJ,SAAgB,qBAAqB,OAAe,KAA+B;CACjF,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,QAAQ,0BAA0B,KAAK,QAAQ;AACrD,KAAI,CAAC,MAAO,QAAO,gBAAgB,OAAO,IAAI;AAC9C,QAAO,sBAAsB,MAAM,GAAG,MAAM,EAAE,IAAI;;;;;AAMpD,SAAgB,oBAAoB,OAAgB,KAA+B;AACjF,KAAI,OAAO,UAAU,SACnB,QAAO,qBAAqB,OAAO,IAAI;AAEzC,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,oBAAoB,MAAM,IAAI,CAAC;AAE5D,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,CACxC,QAAO,gBAAgB,GAAG,IAAI,IAAI,oBAAoB,GAAG,IAAI;AAE/D,SAAO;;AAET,QAAO"}
@@ -1,13 +1,13 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
3
- import { init_paths, resolveBinDir } from "../../config/paths.js";
2
+ import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
4
3
  import { createLogger } from "../../utils/logger/index.js";
5
4
  import { init_logger } from "../../utils/logger.js";
6
- import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
5
+ import { init_paths, resolveBinDir } from "../../config/paths.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
7
7
  import { resolvePackageRoot } from "../../infra/update-check.js";
8
+ import { dirname, join } from "node:path";
8
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
9
10
  import { readFile, readdir, rm } from "node:fs/promises";
10
- import { dirname, join } from "node:path";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { spawn } from "node:child_process";
13
13
  //#region src/browser/providers/browser-ext-install.ts
@@ -1,15 +1,15 @@
1
- import { init_paths, resolveBinDir } from "../../config/paths.js";
1
+ import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
- import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
4
+ import { init_paths, resolveBinDir } from "../../config/paths.js";
5
5
  import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
6
6
  import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
7
7
  import { pickFreePort } from "../free-port.js";
8
- import { createHash } from "node:crypto";
8
+ import { arch, platform, tmpdir } from "node:os";
9
+ import { join, resolve } from "node:path";
9
10
  import { createReadStream, createWriteStream } from "node:fs";
11
+ import { createHash } from "node:crypto";
10
12
  import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
11
- import { join, resolve } from "node:path";
12
- import { arch, platform, tmpdir } from "node:os";
13
13
  import { spawn } from "node:child_process";
14
14
  import { Readable, Transform } from "node:stream";
15
15
  import AdmZip from "adm-zip";
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
+ import { dirname, join } from "node:path";
2
3
  import { existsSync } from "node:fs";
3
4
  import { stat } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/browser/providers/playwright-doctor.ts
7
7
  /** Root directory of the `playwright-core` package (Electron extraResources or node_modules). */
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { chmod, stat } from "node:fs/promises";
4
3
  import { platform } from "node:os";
4
+ import { chmod, stat } from "node:fs/promises";
5
5
  import { exec } from "node:child_process";
6
6
  import { promisify } from "node:util";
7
7
  //#region src/browser/stealth.ts
@@ -1,11 +1,12 @@
1
1
  import type { Config } from '../../config/schema.js';
2
2
  import type { ExtensionMetadataSnapshot } from '../../extensions/extension-metadata-snapshot.js';
3
- import type { ChannelCatalog } from './channel-catalog-types.js';
3
+ import type { ChannelCatalog, ChannelCatalogEntry, ChannelSetupStatus } from './channel-catalog-types.js';
4
4
  type BuildChannelCatalogOptions = {
5
5
  locale?: string;
6
6
  };
7
7
  export declare function buildChannelCatalogFromSnapshot(snapshot: ExtensionMetadataSnapshot, options?: BuildChannelCatalogOptions): ChannelCatalog;
8
8
  export declare function buildChannelCatalogForConfig(config: Config, options?: BuildChannelCatalogOptions): ChannelCatalog;
9
+ export declare function getChannelSetupStatus(config: Config, channelId: string, entry?: ChannelCatalogEntry): ChannelSetupStatus;
9
10
  export declare function isChannelConfigured(config: Config, channelId: string): boolean;
10
11
  export declare function getConfiguredChannelIds(config: Config): string[];
11
12
  export {};