@xopcai/xopc 0.0.114 → 0.0.116

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 (328) hide show
  1. package/README.md +5 -4
  2. package/README.zh-CN.md +5 -4
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Fp-p7bP1.js → agent-avatar-dicebear-CWM1UU5P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agent-browser-settings-page-D1SyFYeh.js +6 -0
  7. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-C9YxgvuI.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-CteVs3UO.js +71 -0
  9. package/dist/gateway/static/root/assets/app-management-settings-panel-yXSXY_bu.js +1 -0
  10. package/dist/gateway/static/root/assets/{appearance-settings-ycbdJRuZ.js → appearance-settings-DjY1P_ug.js} +1 -1
  11. package/dist/gateway/static/root/assets/apps-page-CVQ1M8Ax.js +1 -0
  12. package/dist/gateway/static/root/assets/{archive-plugin-CJzSADJo.js → archive-plugin-CytE5j-e.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-BTAB4zGS.js → attachment-load-BvvrN6rF.js} +1 -1
  14. package/dist/gateway/static/root/assets/{binary-plugins-DXR1-mct.js → binary-plugins-IBWSitnj.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-CzQri9h2.js → block-editor-C-wDpsf-.js} +44 -44
  16. package/dist/gateway/static/root/assets/channels-settings-Cd3JbeQ1.js +1 -0
  17. package/dist/gateway/static/root/assets/{config-api-DRqjEvAx.js → config-api-C4RAtTKW.js} +1 -1
  18. package/dist/gateway/static/root/assets/connectors-page-MsMa5qBr.js +2 -0
  19. package/dist/gateway/static/root/assets/{cron-api-BXaZXv1o.js → cron-api-sJNMqB6P.js} +1 -1
  20. package/dist/gateway/static/root/assets/cron-page-D30CSwkn.js +3 -0
  21. package/dist/gateway/static/root/assets/dreaming-settings-6fCUWRQf.js +1 -0
  22. package/dist/gateway/static/root/assets/{extension-debug-page-DSkqMYo7.js → extension-debug-page-BAIyjDlq.js} +1 -1
  23. package/dist/gateway/static/root/assets/{extension-page-h2dGDbMN.js → extension-page-DEhv2GpC.js} +1 -1
  24. package/dist/gateway/static/root/assets/{extension-settings-page-hN99RhOi.js → extension-settings-page-DOuAxTDW.js} +1 -1
  25. package/dist/gateway/static/root/assets/{fetch-D9QqUtzZ.js → fetch-CTsREQIe.js} +1 -1
  26. package/dist/gateway/static/root/assets/{format-interval-label-D6E687rG.js → format-interval-label-D35Bfhtx.js} +1 -1
  27. package/dist/gateway/static/root/assets/{gateway-config-api-CLt_SKTC.js → gateway-config-api-C6989a-W.js} +1 -1
  28. package/dist/gateway/static/root/assets/gateway-settings-BpF26t91.js +1 -0
  29. package/dist/gateway/static/root/assets/{gateway-startup-retry-N7Z_sz7p.js → gateway-startup-retry-C1KAHrd2.js} +1 -1
  30. package/dist/gateway/static/root/assets/goal-detail-page-DOjhmRyf.js +1 -0
  31. package/dist/gateway/static/root/assets/goals-config-api-KnLGpu6h.js +1 -0
  32. package/dist/gateway/static/root/assets/goals-page-Xl9_wrFc.js +2 -0
  33. package/dist/gateway/static/root/assets/goals-settings-DtPtqZi8.js +1 -0
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DGPadTw-.js → heartbeat-config-api-uKw1f0IG.js} +1 -1
  35. package/dist/gateway/static/root/assets/heartbeat-settings-DN9vEj9P.js +1 -0
  36. package/dist/gateway/static/root/assets/index-C8ytlAF2.js +122 -0
  37. package/dist/gateway/static/root/assets/index-CVpJW2NS.css +1 -0
  38. package/dist/gateway/static/root/assets/{interval-presets-CEklPQ_r.js → interval-presets-Dq0FXJ65.js} +1 -1
  39. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Ce_aQ8Iv.js → keyboard-shortcuts-settings-C9_t4m7t.js} +1 -1
  40. package/dist/gateway/static/root/assets/logs-page-SNkWzidV.js +2 -0
  41. package/dist/gateway/static/root/assets/{markdown-split-BMz3xPXO.js → markdown-split-Ca87W8-h.js} +1 -1
  42. package/dist/gateway/static/root/assets/{media-plugins-BalOSoz9.js → media-plugins-BAcUjPRJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/messages-BqzIDrlr.js +3 -0
  44. package/dist/gateway/static/root/assets/models-hub-panel-BO4o-GmO.js +2 -0
  45. package/dist/gateway/static/root/assets/note-detail-page-DLV_XDmT.js +2 -0
  46. package/dist/gateway/static/root/assets/{note-image-lightbox-C5D1Q5mY.js → note-image-lightbox-hnSX5SSn.js} +1 -1
  47. package/dist/gateway/static/root/assets/notes-page-ycsDlkFA.js +1 -0
  48. package/dist/gateway/static/root/assets/{preview-open-alternatives-CYFR5U9l.js → preview-open-alternatives-CNgM20H5.js} +1 -1
  49. package/dist/gateway/static/root/assets/remote-access-hub-DQpnE8K9.js +1 -0
  50. package/dist/gateway/static/root/assets/{save-bar-controls-BQ79Z5IP.js → save-bar-controls-CcdjGcfT.js} +1 -1
  51. package/dist/gateway/static/root/assets/{schedule-field-Bgk6Emue.js → schedule-field-CYr39z76.js} +1 -1
  52. package/dist/gateway/static/root/assets/{schema-form-DzS36TMa.js → schema-form-BRAJgZQ2.js} +1 -1
  53. package/dist/gateway/static/root/assets/sessions-page-BZui7iAY.js +1 -0
  54. package/dist/gateway/static/root/assets/settings-advanced-gate-DEfzZ1ax.js +1 -0
  55. package/dist/gateway/static/root/assets/{settings-collapsible-section-CdjFnSAy.js → settings-collapsible-section-BhzjeGWi.js} +1 -1
  56. package/dist/gateway/static/root/assets/{settings-form-section-DZLy_exu.js → settings-form-section-Cz3Pcr9b.js} +1 -1
  57. package/dist/gateway/static/root/assets/settings-page-CLuSsu1-.js +1 -0
  58. package/dist/gateway/static/root/assets/setup-status-panel-Cq4qpXLi.js +1 -0
  59. package/dist/gateway/static/root/assets/{share-preview-page-_qRDr4g_.js → share-preview-page-DL4y9K5e.js} +1 -1
  60. package/dist/gateway/static/root/assets/shares-settings-B9F3HyYQ.js +1 -0
  61. package/dist/gateway/static/root/assets/skill-reload-api-Bp9UPPwm.js +1 -0
  62. package/dist/gateway/static/root/assets/skills-page-BIoBsfSV.js +2 -0
  63. package/dist/gateway/static/root/assets/system-settings-panel-FD2jxRZ3.js +1 -0
  64. package/dist/gateway/static/root/assets/use-agent-defaults-form-Cz2_pPzu.js +1 -0
  65. package/dist/gateway/static/root/assets/{use-channel-catalog-CbXq97rT.js → use-channel-catalog-BInPrfR5.js} +1 -1
  66. package/dist/gateway/static/root/assets/{use-settings-tab-guard-DwS3drWK.js → use-settings-tab-guard-nuHMmZQv.js} +1 -1
  67. package/dist/gateway/static/root/assets/voice-api-key-field-BUIrKb8s.js +1 -0
  68. package/dist/gateway/static/root/assets/{voice-player-store-DSuOd9zy.js → voice-player-store-1U3vFppm.js} +1 -1
  69. package/dist/gateway/static/root/assets/workflows-page-qE3SexnO.js +18 -0
  70. package/dist/gateway/static/root/index.html +5 -5
  71. package/dist/gateway/static/root/logo.svg +4 -3
  72. package/dist/package.js +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  74. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  75. package/dist/src/agent/goals/checklist-judge.d.ts +2 -0
  76. package/dist/src/agent/goals/checklist-judge.js +4 -3
  77. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  78. package/dist/src/agent/goals/evaluate-turn.d.ts +2 -1
  79. package/dist/src/agent/goals/evaluate-turn.js +2 -0
  80. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  81. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  82. package/dist/src/agent/goals/post-turn.js +20 -4
  83. package/dist/src/agent/goals/post-turn.js.map +1 -1
  84. package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
  85. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  86. package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
  87. package/dist/src/agent/image/understanding/provider-registry.js +16 -2
  88. package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
  89. package/dist/src/agent/tools/composio-tool.d.ts +8 -0
  90. package/dist/src/agent/tools/composio-tool.js +46 -0
  91. package/dist/src/agent/tools/composio-tool.js.map +1 -0
  92. package/dist/src/agent/tools/factory.js +13 -8
  93. package/dist/src/agent/tools/factory.js.map +1 -1
  94. package/dist/src/agent/tools/index.d.ts +1 -0
  95. package/dist/src/agent/tools/index.js +2 -1
  96. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  97. package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
  98. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  99. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
  100. package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
  101. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
  102. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
  103. package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
  104. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
  105. package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
  106. package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
  107. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
  108. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
  109. package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
  110. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
  111. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  112. package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
  113. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  114. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
  115. package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
  116. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
  117. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
  118. package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
  119. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
  120. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
  121. package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
  122. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
  123. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
  124. package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
  125. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
  126. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  127. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
  128. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  129. package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
  130. package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
  131. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
  132. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  133. package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
  134. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  135. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  136. package/dist/src/agent/workflow/builtins/release-check.js +10 -1
  137. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  138. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  139. package/dist/src/agent/workflow/builtins/research.js +16 -2
  140. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  141. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
  142. package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
  143. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
  144. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  145. package/dist/src/agent/workflow/snapshot.js +136 -1
  146. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  147. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  148. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  149. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  150. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  151. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  152. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  153. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  154. package/dist/src/config/index.js +2 -2
  155. package/dist/src/config/schema.d.ts +15 -0
  156. package/dist/src/config/schema.js +12 -3
  157. package/dist/src/config/schema.js.map +1 -1
  158. package/dist/src/config/web-patch.d.ts +1 -0
  159. package/dist/src/config/web-patch.js +1 -0
  160. package/dist/src/config/web-patch.js.map +1 -1
  161. package/dist/src/connectors/composio-triggers.d.ts +10 -0
  162. package/dist/src/connectors/composio-triggers.js +32 -0
  163. package/dist/src/connectors/composio-triggers.js.map +1 -0
  164. package/dist/src/connectors/composio.d.ts +54 -0
  165. package/dist/src/connectors/composio.js +334 -0
  166. package/dist/src/connectors/composio.js.map +1 -0
  167. package/dist/src/connectors/health.js +16 -1
  168. package/dist/src/connectors/health.js.map +1 -1
  169. package/dist/src/connectors/install.d.ts +2 -1
  170. package/dist/src/connectors/install.js +50 -13
  171. package/dist/src/connectors/install.js.map +1 -1
  172. package/dist/src/connectors/instances.js +57 -6
  173. package/dist/src/connectors/instances.js.map +1 -1
  174. package/dist/src/connectors/lifecycle.d.ts +3 -0
  175. package/dist/src/connectors/lifecycle.js +23 -0
  176. package/dist/src/connectors/lifecycle.js.map +1 -0
  177. package/dist/src/connectors/materialize.js +2 -1
  178. package/dist/src/connectors/materialize.js.map +1 -1
  179. package/dist/src/connectors/providers.d.ts +1 -0
  180. package/dist/src/connectors/providers.js +10 -2
  181. package/dist/src/connectors/providers.js.map +1 -1
  182. package/dist/src/connectors/registries/modelscope.d.ts +2 -0
  183. package/dist/src/connectors/registries/modelscope.js +205 -0
  184. package/dist/src/connectors/registries/modelscope.js.map +1 -0
  185. package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
  186. package/dist/src/connectors/registries/official-mcp.js +142 -0
  187. package/dist/src/connectors/registries/official-mcp.js.map +1 -0
  188. package/dist/src/connectors/registries/search.d.ts +12 -0
  189. package/dist/src/connectors/registries/search.js +89 -0
  190. package/dist/src/connectors/registries/search.js.map +1 -0
  191. package/dist/src/connectors/registries/smithery.d.ts +2 -0
  192. package/dist/src/connectors/registries/smithery.js +98 -0
  193. package/dist/src/connectors/registries/smithery.js.map +1 -0
  194. package/dist/src/connectors/registries/types.d.ts +20 -0
  195. package/dist/src/connectors/registries/types.js +1 -0
  196. package/dist/src/connectors/secret-store.js +4 -2
  197. package/dist/src/connectors/secret-store.js.map +1 -1
  198. package/dist/src/connectors/setup-secrets.d.ts +15 -0
  199. package/dist/src/connectors/setup-secrets.js +64 -0
  200. package/dist/src/connectors/setup-secrets.js.map +1 -0
  201. package/dist/src/connectors/supervisor.d.ts +15 -0
  202. package/dist/src/connectors/supervisor.js +73 -0
  203. package/dist/src/connectors/supervisor.js.map +1 -0
  204. package/dist/src/connectors/types.d.ts +27 -3
  205. package/dist/src/connectors/usage.js +6 -1
  206. package/dist/src/connectors/usage.js.map +1 -1
  207. package/dist/src/gateway/hono/app.js +5 -1
  208. package/dist/src/gateway/hono/app.js.map +1 -1
  209. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  210. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  211. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  212. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  213. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  214. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  215. package/dist/src/gateway/hono/routes/channels.js +18 -14
  216. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  217. package/dist/src/gateway/hono/routes/connectors.js +230 -3
  218. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  219. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  220. package/dist/src/gateway/hono/routes/goals.js +52 -5
  221. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  222. package/dist/src/gateway/hono/routes/voice.js +14 -1
  223. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  224. package/dist/src/gateway/hono/sse.js.map +1 -1
  225. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  226. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  227. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  228. package/dist/src/gateway/service/agent-runner.d.ts +5 -12
  229. package/dist/src/gateway/service/agent-runner.js +8 -8
  230. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  231. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
  232. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  233. package/dist/src/gateway/service.d.ts +1 -1
  234. package/dist/src/gateway/service.js +9 -4
  235. package/dist/src/gateway/service.js.map +1 -1
  236. package/dist/src/gateway/user-turn-input.d.ts +18 -0
  237. package/dist/src/gateway/user-turn-input.js +16 -0
  238. package/dist/src/gateway/user-turn-input.js.map +1 -0
  239. package/dist/src/goals/goal-queue-store.d.ts +2 -1
  240. package/dist/src/goals/goal-queue-store.js +2 -2
  241. package/dist/src/goals/goal-queue-store.js.map +1 -1
  242. package/dist/src/goals/goal-queue-types.d.ts +4 -3
  243. package/dist/src/goals/goal-runner.js +25 -3
  244. package/dist/src/goals/goal-runner.js.map +1 -1
  245. package/dist/src/goals/goal-service.d.ts +6 -1
  246. package/dist/src/goals/goal-service.js +9 -2
  247. package/dist/src/goals/goal-service.js.map +1 -1
  248. package/dist/src/goals/goal-store.d.ts +7 -1
  249. package/dist/src/goals/goal-store.js +42 -0
  250. package/dist/src/goals/goal-store.js.map +1 -1
  251. package/dist/src/goals/types.d.ts +10 -0
  252. package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
  253. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  254. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  255. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  256. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  257. package/dist/src/storage/sqlite/schema.js +3 -3
  258. package/dist/src/storage/sqlite/schema.sql +9 -0
  259. package/dist/src/tui/backends/embedded-backend.d.ts +8 -1
  260. package/dist/src/tui/backends/embedded-backend.js +73 -0
  261. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  262. package/dist/src/tui/backends/gateway-sse-backend.d.ts +2 -1
  263. package/dist/src/tui/backends/gateway-sse-backend.js +24 -0
  264. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  265. package/dist/src/tui/components/chat-log.d.ts +2 -0
  266. package/dist/src/tui/components/chat-log.js +19 -0
  267. package/dist/src/tui/components/chat-log.js.map +1 -1
  268. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  269. package/dist/src/tui/extension-host/autocomplete.js +17 -3
  270. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  271. package/dist/src/tui/extension-host/runtime.d.ts +5 -0
  272. package/dist/src/tui/extension-host/runtime.js +1 -1
  273. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  274. package/dist/src/tui/tui-backend.d.ts +14 -0
  275. package/dist/src/tui/tui-commands.d.ts +16 -3
  276. package/dist/src/tui/tui-commands.js +47 -19
  277. package/dist/src/tui/tui-commands.js.map +1 -1
  278. package/dist/src/tui/tui-startup-text.js +1 -1
  279. package/dist/src/tui/tui-startup-text.js.map +1 -1
  280. package/dist/src/tui/tui.js +72 -1
  281. package/dist/src/tui/tui.js.map +1 -1
  282. package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
  283. package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
  284. package/dist/src/voice/tts/providers/edge-speech.js +14 -2
  285. package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
  286. package/dist/src/voice/tts/speak-core.js +3 -3
  287. package/dist/src/voice/tts/speak-core.js.map +1 -1
  288. package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
  289. package/dist/src/voice/tts/types.js +1 -1
  290. package/dist/src/voice/tts/types.js.map +1 -1
  291. package/dist/src/workflows/domain/result.d.ts +0 -1
  292. package/dist/src/workflows/engine/workflow-engine.js +7 -23
  293. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  294. package/package.json +2 -2
  295. package/dist/gateway/static/root/assets/agent-browser-settings-page-CWh7trjd.js +0 -6
  296. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-kC8OuLoj.js +0 -1
  297. package/dist/gateway/static/root/assets/agents-DJWG26Si.js +0 -71
  298. package/dist/gateway/static/root/assets/app-management-settings-panel-v24i25Oj.js +0 -1
  299. package/dist/gateway/static/root/assets/apps-page-0V3DXZ7J.js +0 -1
  300. package/dist/gateway/static/root/assets/channels-settings-CIKOkYdO.js +0 -1
  301. package/dist/gateway/static/root/assets/connectors-settings-ClrDS5jH.js +0 -2
  302. package/dist/gateway/static/root/assets/cron-page-Chi_4u4P.js +0 -3
  303. package/dist/gateway/static/root/assets/dreaming-settings-B0_rs2tj.js +0 -1
  304. package/dist/gateway/static/root/assets/gateway-settings-1PDi4lI0.js +0 -1
  305. package/dist/gateway/static/root/assets/goal-detail-page-D_wwXL-t.js +0 -1
  306. package/dist/gateway/static/root/assets/goals-page-DZ2toZ8y.js +0 -2
  307. package/dist/gateway/static/root/assets/goals-settings-LFlwtIKE.js +0 -1
  308. package/dist/gateway/static/root/assets/heartbeat-settings-BHHAs8ZX.js +0 -1
  309. package/dist/gateway/static/root/assets/index-DefIdW9q.js +0 -122
  310. package/dist/gateway/static/root/assets/index-DzmWBkq-.css +0 -1
  311. package/dist/gateway/static/root/assets/logs-page-j_D2QTuQ.js +0 -2
  312. package/dist/gateway/static/root/assets/messages-BN_WiUg0.js +0 -3
  313. package/dist/gateway/static/root/assets/models-hub-panel-CMH_TmZz.js +0 -2
  314. package/dist/gateway/static/root/assets/note-detail-page-O18BrQPq.js +0 -2
  315. package/dist/gateway/static/root/assets/notes-page-B_ZYCmY9.js +0 -1
  316. package/dist/gateway/static/root/assets/remote-access-hub-CwKgWixY.js +0 -1
  317. package/dist/gateway/static/root/assets/sessions-page-C4fcD-7B.js +0 -1
  318. package/dist/gateway/static/root/assets/settings-advanced-gate-Ad2OJ86w.js +0 -1
  319. package/dist/gateway/static/root/assets/settings-page-D2BMY5wo.js +0 -1
  320. package/dist/gateway/static/root/assets/setup-status-panel-aWwxl_E1.js +0 -1
  321. package/dist/gateway/static/root/assets/shares-settings-DUE83uIf.js +0 -1
  322. package/dist/gateway/static/root/assets/skill-reload-api-mWKJcrog.js +0 -1
  323. package/dist/gateway/static/root/assets/skills-page-0Sx1Q58n.js +0 -2
  324. package/dist/gateway/static/root/assets/system-settings-panel-hqaBF5aG.js +0 -1
  325. package/dist/gateway/static/root/assets/use-agent-defaults-form-zbVIQLOA.js +0 -1
  326. package/dist/gateway/static/root/assets/voice-api-key-field-D6HR0hR2.js +0 -1
  327. package/dist/gateway/static/root/assets/workflow-page.utils-C0Uq3xyq.js +0 -1
  328. package/dist/gateway/static/root/assets/workflows-page-DW0fmWhQ.js +0 -18
@@ -0,0 +1,18 @@
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,n,t as r}from"./vendor-react-BOUWij0V.js";import{t as i}from"./cn-JdwAhgNB.js";import{t as a}from"./messages-BqzIDrlr.js";import{t as o}from"./locale-store-DjbfSsfA.js";import{c as s}from"./fetch-CTsREQIe.js";import{i as c}from"./vendor-swr-BIWyz7Rc.js";import{$ as l,$o as u,$t as d,A as f,B as p,C as m,Ca as h,Co as g,Cs as _,D as v,Ds as y,E as b,F as x,Fi as S,H as C,J as w,Jo as T,K as E,Ka as D,Ko as O,Ks as k,La as A,M as j,N as M,O as ee,P as N,Q as P,Ro as F,S as I,Si as L,Ss as R,T as z,Ta as B,U as V,V as te,W as H,Wa as ne,Ws as re,X as ie,Xa as U,Xo as W,Y as ae,Yi as G,_ as K,_i as q,aa as oe,an as se,b as ce,c as le,d as ue,da as de,di as fe,ea as pe,es as me,f as he,fi as ge,fs as _e,g as J,gi as ve,gs as ye,h as Y,hi as be,ho as xe,i as Se,j as Ce,ja as we,k as Te,l as Ee,m as De,mi as Oe,oo as ke,p as Ae,pi as je,q as Me,qi as X,r as Ne,rs as Pe,u as Fe,ur as Ie,v as Le,w as Re,wo as ze,x as Be,xa as Ve,y as He,z as Ue,zi as We}from"./index-C8ytlAF2.js";var Z=e(t(),1),Q=n(),Ge=[`queued`,`running`,`succeeded`,`attention`],Ke=10080*60*1e3,qe=new Set([`failed`,`timeout`,`cancelled`]);function Je(e){return e.metadata?.sessionKey?.trim()||null}function Ye(e,t){return e.length<=t?e:`${e.slice(0,t-1)}…`}function Xe(e,t){if(!e||typeof e!=`object`)return null;let n=e;for(let e of t){let t=n[e];if(typeof t==`string`&&t.trim())return t.trim()}return null}function Ze(e,t=90){let n=e.metadata?.input?.goal?.trim()||(typeof e.metadata?.input?.payload==`string`?e.metadata.input.payload.trim():null)||Xe(e.metadata?.input?.payload,[`query`,`goal`,`prompt`,`input`,`message`])||Xe(e.metadata?.input?.variables,[`query`,`goal`,`prompt`,`input`,`message`]);return n?Ye(n,t):null}function Qe(e,t=90){return Ze(e,t)??Ye(e.title?.trim()||e.definitionId,t)}function $e(e,t=44){return Ye(e.title?.trim()||e.definitionId,t)}function et(e,t){let n=t.trim().toLowerCase();return n?[Ze(e,500),e.title,e.definitionId,e.id].filter(Boolean).join(` `).toLowerCase().includes(n):!0}function tt(e,t){let n=t.workflowFilterId.trim();return e.filter(e=>n&&e.definitionId!==n||!Le(e,t.triggerFilter??`all`)?!1:et(e,t.searchQuery))}function nt(e){return e.completedAtMs??e.createdAtMs}function rt(e,t){return t-nt(e)<=Ke}function it(e,t){return e.status===`queued`?`queued`:e.status===`running`?`running`:e.status===`succeeded`?rt(e,t)?`succeeded`:null:qe.has(e.status)?`attention`:null}function at(e,t){let n=[...t];return e===`queued`?n.sort((e,t)=>e.createdAtMs-t.createdAtMs):e===`running`?n.sort((e,t)=>(t.startedAtMs??t.createdAtMs)-(e.startedAtMs??e.createdAtMs)):n.sort((e,t)=>nt(t)-nt(e))}function ot(e,t){let n={queued:[],running:[],succeeded:[],attention:[]};for(let r of e){let e=it(r,t);e&&n[e].push(r)}let r=at(`succeeded`,n.succeeded),i=r.length,a=r.slice(0,20),o=Math.max(0,i-20);return Ge.map(e=>e===`succeeded`?{id:e,runs:a,totalInWindow:i,hiddenByCap:o}:{id:e,runs:at(e,n[e])})}var st=new Map;function ct(e){let t=st.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:`auto`}),st.set(e,t)),t}function lt(e,t,n){let r=Math.round((t-e)/1e3),i=ct(n);if(r<60)return i.format(-r,`second`);let a=Math.round(r/60);if(a<60)return i.format(-a,`minute`);let o=Math.round(a/60);if(o<48)return i.format(-o,`hour`);let s=Math.round(o/24);return i.format(-s,`day`)}function ut(e){return e.status===`queued`||e.status===`running`}function dt(e){return e.status===`failed`||e.status===`timeout`||e.status===`cancelled`}var $=r(),ft=(0,Z.memo)(function(e){let t=(0,Q.c)(65),{run:n,language:r,localeTag:o,nowMs:s,selected:c,onOpen:l,onOpenChat:u,onCancel:d,onRetry:f}=e,p=a(r).workflows,[m,h]=(0,Z.useState)(!1),g;t[0]===n?g=t[1]:(g=Je(n),t[0]=n,t[1]=g);let _=!g,v;t[2]===n?v=t[3]:(v=ut(n),t[2]=n,t[3]=v);let y=v,b=n.status===`running`||n.status===`queued`,x;t[4]!==n.metrics.agentCount||t[5]!==n.metrics.doneAgentCount?(x=n.metrics.agentCount>0?Math.round(n.metrics.doneAgentCount/n.metrics.agentCount*100):0,t[4]=n.metrics.agentCount,t[5]=n.metrics.doneAgentCount,t[6]=x):x=t[6];let S=x,C=n.metrics.errorAgentCount>0,w=n.startedAtMs??n.createdAtMs,E=he(y?s-w:n.metrics.durationMs),D=Y(p.taskArtifacts,{count:n.metrics.artifactCount}),O;t[7]===n?O=t[8]:(O=Qe(n),t[7]=n,t[8]=O);let k=O,A;t[9]===n?A=t[10]:(A=$e(n),t[9]=n,t[10]=A);let j=A,M;t[11]!==l||t[12]!==n?(M=()=>{l(n)},t[11]=l,t[12]=n,t[13]=M):M=t[13];let ee=M,N;t[14]!==_||t[15]!==u||t[16]!==n?(N=()=>{_||u(n)},t[14]=_,t[15]=u,t[16]=n,t[17]=N):N=t[17];let P=N,F=c?`border-accent/70 ring-1 ring-accent/30`:`border-edge`,I;t[18]===F?I=t[19]:(I=i(`group relative overflow-hidden rounded-xl border bg-surface-panel p-3.5 transition-colors`,F,`hover:border-edge-strong hover:bg-surface-hover/50`),t[18]=F,t[19]=I);let L;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(L=i(`w-full text-left`,We.focusRingPanel),t[20]=L):L=t[20];let R;t[21]===k?R=t[22]:(R=(0,$.jsx)(`div`,{className:`line-clamp-2 text-sm font-semibold leading-5 text-fg`,children:k}),t[21]=k,t[22]=R);let z;t[23]===j?z=t[24]:(z=(0,$.jsx)(`div`,{className:`mt-1 truncate text-[11px] font-medium text-fg-muted`,children:j}),t[23]=j,t[24]=z);let B;t[25]!==R||t[26]!==z?(B=(0,$.jsxs)(`div`,{className:`min-w-0`,children:[R,z]}),t[25]=R,t[26]=z,t[27]=B):B=t[27];let V;t[28]===n.status?V=t[29]:(V=i(`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold shadow-sm`,He(n.status)),t[28]=n.status,t[29]=V);let te;t[30]!==o||t[31]!==s||t[32]!==w?(te=lt(w,s,o),t[30]=o,t[31]=s,t[32]=w,t[33]=te):te=t[33];let H;t[34]===te?H=t[35]:(H=(0,$.jsx)(`span`,{children:te}),t[34]=te,t[35]=H);let ne=E===`—`?null:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`span`,{"aria-hidden":!0,children:`·`}),(0,$.jsx)(`span`,{children:Y(p.taskElapsed,{duration:E})})]}),re;t[36]!==H||t[37]!==ne?(re=(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5 text-[11px] text-fg-subtle`,children:[H,ne]}),t[36]=H,t[37]=ne,t[38]=re):re=t[38];let ie=n.metrics.artifactCount>0?(0,$.jsx)(`span`,{className:`rounded-full bg-surface-hover px-2 py-0.5 font-medium text-fg-muted`,children:D}):null,U=c?(0,$.jsx)(`span`,{className:`font-medium text-accent-fg`,children:p.taskOpenDetails}):null,W;t[39]!==ie||t[40]!==U?(W=(0,$.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2 text-[11px] text-fg-subtle`,children:[ie,U]}),t[39]=ie,t[40]=U,t[41]=W):W=t[41];let ae;t[42]===h?ae=t[43]:(ae=()=>h(mt),t[42]=h,t[43]=ae);let G;t[44]===Symbol.for(`react.memo_cache_sentinel`)?(G=(0,$.jsx)(T,{className:`size-4`,"aria-hidden":!0}),t[44]=G):G=t[44];let K;t[45]!==p.taskActionsAria||t[46]!==m||t[47]!==ae?(K=(0,$.jsx)(X,{variant:`ghost`,className:`size-7 p-0 opacity-0 group-hover:opacity-100 group-focus-within:opacity-100`,"aria-label":p.taskActionsAria,"aria-expanded":m,onClick:ae,children:G}),t[45]=p.taskActionsAria,t[46]=m,t[47]=ae,t[48]=K):K=t[48];let q;t[49]!==y||t[50]!==_||t[51]!==P||t[52]!==p.cancel||t[53]!==p.continueInChat||t[54]!==p.rerun||t[55]!==p.taskCloseMenu||t[56]!==m||t[57]!==d||t[58]!==f||t[59]!==n||t[60]!==h?(q=m?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`fixed inset-0 z-10 cursor-default`,"aria-label":p.taskCloseMenu,onClick:()=>h(!1)}),(0,$.jsxs)(`div`,{className:`absolute right-0 z-20 mt-1 min-w-36 rounded-lg border border-edge bg-surface-panel py-1 shadow-surface`,children:[(0,$.jsx)(pt,{label:p.continueInChat,disabled:_,onClick:()=>{h(!1),P()}}),y?(0,$.jsx)(pt,{label:p.cancel,tone:`danger`,onClick:()=>{h(!1),d(n.id)}}):null,dt(n)?(0,$.jsx)(pt,{label:p.rerun,onClick:()=>{h(!1),f(n.id)}}):null]})]}):null,t[49]=y,t[50]=_,t[51]=P,t[52]=p.cancel,t[53]=p.continueInChat,t[54]=p.rerun,t[55]=p.taskCloseMenu,t[56]=m,t[57]=d,t[58]=f,t[59]=n,t[60]=h,t[61]=q):q=t[61];let se;return t[62]!==K||t[63]!==q?(se=(0,$.jsxs)(`div`,{className:`absolute right-2 top-2`,children:[K,q]}),t[62]=K,t[63]=q,t[64]=se):se=t[64],(0,$.jsxs)(`div`,{className:I,children:[(0,$.jsxs)(`button`,{type:`button`,onClick:ee,"aria-label":`${p.taskOpenDetails}: ${k}`,"aria-current":c?`true`:void 0,className:L,children:[(0,$.jsxs)(`div`,{className:`pr-7`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-2`,children:[B,(0,$.jsx)(`span`,{className:V,children:p.status[n.status]??n.status})]}),re]}),b?(0,$.jsxs)(`div`,{className:`mt-2.5`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-2 text-[11px] text-fg-muted`,children:[(0,$.jsx)(`span`,{children:Y(p.agentProgress,{done:n.metrics.doneAgentCount,total:n.metrics.agentCount})}),(0,$.jsxs)(`span`,{children:[S,`%`]})]}),(0,$.jsx)(`div`,{className:`mt-1.5 h-1.5 overflow-hidden rounded-full bg-surface-hover`,children:(0,$.jsx)(`div`,{className:`h-full rounded-full bg-accent transition-all`,style:{width:`${S}%`}})})]}):null,W,C?(0,$.jsxs)(`div`,{className:`mt-2 flex items-center gap-1 text-[11px] text-amber-700 dark:text-amber-300`,children:[(0,$.jsx)(oe,{className:`size-3 shrink-0`,"aria-hidden":!0}),Y(p.runRowErrorSummary,{count:n.metrics.errorAgentCount})]}):null]}),se]})});function pt(e){let t=(0,Q.c)(8),{label:n,disabled:r,tone:a,onClick:o}=e,s=r?`cursor-not-allowed text-fg-subtle`:`text-fg hover:bg-surface-hover`,c=a===`danger`&&!r&&`text-red-600 dark:text-red-300`,l;t[0]!==s||t[1]!==c?(l=i(`block w-full px-3 py-1.5 text-left text-xs`,s,c),t[0]=s,t[1]=c,t[2]=l):l=t[2];let u;return t[3]!==r||t[4]!==n||t[5]!==o||t[6]!==l?(u=(0,$.jsx)(`button`,{type:`button`,disabled:r,onClick:o,className:l,children:n}),t[3]=r,t[4]=n,t[5]=o,t[6]=l,t[7]=u):u=t[7],u}function mt(e){return!e}function ht(e,t){return t.boardColumns[e]}var gt=(0,Z.memo)(function(e){let t=(0,Q.c)(14),{column:n,language:r,localeTag:o,nowMs:s,selectedRunId:c,onOpenRun:l,onOpenRunChat:u,onCancelRun:d,onRetryRun:f}=e,p=a(r).workflows,[m,h]=(0,Z.useState)(!1),g=n.id===`succeeded`,_=g?5:n.runs.length,v;t[0]!==_||t[1]!==n.runs||t[2]!==m||t[3]!==g?(v=g&&!m?n.runs.slice(0,_):n.runs,t[0]=_,t[1]=n.runs,t[2]=m,t[3]=g,t[4]=v):v=t[4];let y=v,b=g&&n.runs.length>5&&!m,x=g&&m,S;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(S=i(`flex h-full w-80 shrink-0 snap-center flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel/40`),t[5]=S):S=t[5];let C;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(C=(0,$.jsx)(`span`,{className:`size-2 rounded-full bg-accent`,"aria-hidden":!0}),t[6]=C):C=t[6];let w;t[7]===n.runs.length?w=t[8]:(w=(0,$.jsx)(`span`,{className:`rounded-full bg-surface-hover px-2.5 py-1 text-xs font-semibold tabular-nums text-fg-muted`,children:n.runs.length}),t[7]=n.runs.length,t[8]=w);let T=y.length===0?(0,$.jsx)(`div`,{className:`flex min-h-32 items-center justify-center rounded-xl border border-dashed border-edge bg-surface-panel/40 px-4 py-6 text-center text-xs text-fg-subtle`,children:p.boardColumnEmpty}):y.map(e=>(0,$.jsx)(ft,{run:e,language:r,localeTag:o,nowMs:s,selected:e.id===c,onOpen:l,onOpenChat:u,onCancel:d,onRetry:f},e.id)),E=b?(0,$.jsx)(X,{variant:`ghost`,className:`h-8 w-full text-xs`,onClick:()=>h(!0),children:Y(p.boardExpandSucceeded,{count:Math.min(n.runs.length,n.totalInWindow??n.runs.length)})}):null,D=x?(0,$.jsx)(X,{variant:`ghost`,className:`h-8 w-full text-xs`,onClick:()=>h(!1),children:p.boardCollapseSucceeded}):null,O=g&&(n.hiddenByCap??0)>0?(0,$.jsx)(`p`,{className:`px-1 text-center text-[11px] text-fg-subtle`,children:Y(p.boardSucceededCapHint,{count:n.hiddenByCap??0})}):null,k;return t[9]!==T||t[10]!==E||t[11]!==D||t[12]!==O?(k=(0,$.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-2.5`,children:[T,E,D,O]}),t[9]=T,t[10]=E,t[11]=D,t[12]=O,t[13]=k):k=t[13],(0,$.jsxs)(`section`,{className:S,"aria-label":ht(n.id,p),children:[(0,$.jsxs)(`header`,{className:`flex shrink-0 items-center justify-between gap-2 rounded-t-2xl border-b border-edge-subtle bg-surface-panel/90 px-3.5 py-3 backdrop-blur`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[C,(0,$.jsx)(`h2`,{className:`truncate text-sm font-semibold text-fg`,children:ht(n.id,p)})]}),w]}),k]})}),_t=(0,Z.memo)(function(e){let t=(0,Q.c)(45),{runs:n,language:r,localeTag:i,labels:a,searchQuery:o,workflowFilterId:s,triggerFilter:c,selectedRunId:l,loading:u,onOpenRun:d,onOpenRunChat:f,onCancelRun:p,onRetryRun:m,onStart:h}=e,g;t[0]===n?g=t[1]:(g=n.some(vt),t[0]=n,t[1]=g);let _=g,[v,y]=(0,Z.useState)(yt),b,x;t[2]===_?(b=t[3],x=t[4]):(b=()=>{if(!_)return;let e=window.setInterval(()=>y(Date.now()),1e3);return()=>window.clearInterval(e)},x=[_],t[2]=_,t[3]=b,t[4]=x),(0,Z.useEffect)(b,x);let S;t[5]!==v||t[6]!==n||t[7]!==o||t[8]!==c||t[9]!==s?(S=ot(tt(n,{searchQuery:o,workflowFilterId:s,triggerFilter:c}),v),t[5]=v,t[6]=n,t[7]=o,t[8]=c,t[9]=s,t[10]=S):S=t[10];let C=S,w=C.reduce(bt,0);if(u&&w===0){let e;return t[11]===a.loading?e=t[12]:(e=(0,$.jsx)(`p`,{className:`text-sm text-fg-muted`,children:a.loading}),t[11]=a.loading,t[12]=e),e}if(!u&&w===0){let e;t[13]===a.boardEmptyTitle?e=t[14]:(e=(0,$.jsx)(`p`,{className:`text-sm font-medium text-fg`,children:a.boardEmptyTitle}),t[13]=a.boardEmptyTitle,t[14]=e);let n;t[15]===a.boardEmptyHint?n=t[16]:(n=(0,$.jsx)(`p`,{className:`mx-auto mt-2 max-w-md text-sm leading-6 text-fg-muted`,children:a.boardEmptyHint}),t[15]=a.boardEmptyHint,t[16]=n);let r;t[17]!==a.boardStart||t[18]!==h?(r=(0,$.jsx)(`div`,{className:`mt-4 flex justify-center`,children:(0,$.jsx)(X,{variant:`primary`,onClick:h,children:a.boardStart})}),t[17]=a.boardStart,t[18]=h,t[19]=r):r=t[19];let i;return t[20]!==e||t[21]!==n||t[22]!==r?(i=(0,$.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col items-center justify-center rounded-2xl border border-dashed border-edge bg-surface-panel/40 px-6 py-12 text-center`,children:[e,n,r]}),t[20]=e,t[21]=n,t[22]=r,t[23]=i):i=t[23],i}let T;if(t[24]!==C||t[25]!==r||t[26]!==i||t[27]!==v||t[28]!==p||t[29]!==d||t[30]!==f||t[31]!==m||t[32]!==l){let e;t[34]!==r||t[35]!==i||t[36]!==v||t[37]!==p||t[38]!==d||t[39]!==f||t[40]!==m||t[41]!==l?(e=e=>(0,$.jsx)(gt,{column:e,language:r,localeTag:i,nowMs:v,selectedRunId:l,onOpenRun:d,onOpenRunChat:f,onCancelRun:p,onRetryRun:m},e.id),t[34]=r,t[35]=i,t[36]=v,t[37]=p,t[38]=d,t[39]=f,t[40]=m,t[41]=l,t[42]=e):e=t[42],T=C.map(e),t[24]=C,t[25]=r,t[26]=i,t[27]=v,t[28]=p,t[29]=d,t[30]=f,t[31]=m,t[32]=l,t[33]=T}else T=t[33];let E;return t[43]===T?E=t[44]:(E=(0,$.jsx)(`div`,{className:`-mx-1 flex h-full min-w-0 snap-x snap-mandatory gap-3 overflow-x-auto px-1 pb-3`,children:T}),t[43]=T,t[44]=E),E});function vt(e){return e.status===`queued`||e.status===`running`}function yt(){return Date.now()}function bt(e,t){return e+t.runs.length}var xt=`export const meta = {
2
+ name: 'my_workflow',
3
+ description: 'Describe what this workflow does.',
4
+ whenToUse: 'When the user asks for ...',
5
+ examplePrompts: [
6
+ { field: 'goal', text: 'Example goal for this workflow' },
7
+ ],
8
+ tags: ['custom'],
9
+ estimatedAgents: { min: 2, max: 4 },
10
+ phases: [{ title: 'Step 1' }, { title: 'Synthesize' }],
11
+ }
12
+
13
+ phase('Step 1')
14
+ const first = await agent('Do the first step.', { label: 'step 1' })
15
+
16
+ phase('Synthesize')
17
+ return await agent('Summarize:\\n\\n' + first, { label: 'synthesis' })
18
+ `;function St(e){let t=(0,Q.c)(48),{open:n,language:r,ownerAgentId:i,saving:o,initialDraft:s,onClose:c,onSave:l,onSaveAndStart:u}=e,d;t[0]===r?d=t[1]:(d=a(r),t[0]=r,t[1]=d);let f=d.workflows,[p,m]=(0,Z.useState)(`ai`),[h,g]=(0,Z.useState)(``),[_,v]=(0,Z.useState)(``),y=s?.mode===`edit`,b=y?f.editWorkflowTitle:f.createWorkflowTitle,x=y?f.editWorkflowHint:s?.mode===`copy`?f.createWorkflowHintFromCopy:f.createWorkflowHint,S,C;t[2]!==s||t[3]!==n?(S=()=>{n&&(m(s?`manual`:`ai`),g(s?.name??``),v(s?.script??``))},C=[s,n],t[2]=s,t[3]=n,t[4]=S,t[5]=C):(S=t[4],C=t[5]),(0,Z.useEffect)(S,C);let w;t[6]===c?w=t[7]:(w=e=>!e&&c(),t[6]=c,t[7]=w);let T;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(T=(0,$.jsx)(Oe,{className:`xopc-dialog-overlay fixed inset-0 z-65 bg-scrim backdrop-blur-[1px]`}),t[8]=T):T=t[8];let E;t[9]===b?E=t[10]:(E=(0,$.jsx)(q,{className:`text-base font-semibold text-fg`,children:b}),t[9]=b,t[10]=E);let D;t[11]===x?D=t[12]:(D=(0,$.jsx)(je,{className:`mt-1 text-sm text-fg-muted`,children:x}),t[11]=x,t[12]=D);let O=p===`ai`,k,A;t[13]===Symbol.for(`react.memo_cache_sentinel`)?(A=()=>m(`ai`),k=(0,$.jsx)(Ve,{className:`size-4`,"aria-hidden":!0}),t[13]=k,t[14]=A):(k=t[13],A=t[14]);let j;t[15]!==f.createWorkflowAiTab||t[16]!==O?(j=(0,$.jsx)(Ct,{active:O,onClick:A,icon:k,children:f.createWorkflowAiTab}),t[15]=f.createWorkflowAiTab,t[16]=O,t[17]=j):j=t[17];let M=p===`manual`,ee,N;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(ee=()=>m(`manual`),N=(0,$.jsx)(Pe,{className:`size-4`,"aria-hidden":!0}),t[18]=ee,t[19]=N):(ee=t[18],N=t[19]);let P;t[20]!==f.createWorkflowManualTab||t[21]!==M?(P=(0,$.jsx)(Ct,{active:M,onClick:ee,icon:N,children:f.createWorkflowManualTab}),t[20]=f.createWorkflowManualTab,t[21]=M,t[22]=P):P=t[22];let F;t[23]!==j||t[24]!==P?(F=(0,$.jsxs)(`div`,{className:`mt-4 inline-flex rounded-xl border border-edge bg-surface-base p-1`,children:[j,P]}),t[23]=j,t[24]=P,t[25]=F):F=t[25];let I;t[26]!==F||t[27]!==E||t[28]!==D?(I=(0,$.jsxs)(`div`,{className:`border-b border-edge px-5 py-4`,children:[E,D,F]}),t[26]=F,t[27]=E,t[28]=D,t[29]=I):I=t[29];let L;t[30]!==s||t[31]!==r||t[32]!==p||t[33]!==c||t[34]!==l||t[35]!==u||t[36]!==i||t[37]!==o||t[38]!==h||t[39]!==_?(L=p===`ai`?(0,$.jsx)(wt,{language:r,ownerAgentId:i,saving:o,initialDraft:s,name:h,setName:g,script:_,setScript:v,onClose:c,onSave:l,onSaveAndStart:u}):(0,$.jsx)(Tt,{language:r,saving:o,initialDraft:s,name:h,setName:g,script:_,setScript:v,onClose:c,onSave:l}),t[30]=s,t[31]=r,t[32]=p,t[33]=c,t[34]=l,t[35]=u,t[36]=i,t[37]=o,t[38]=h,t[39]=_,t[40]=L):L=t[40];let R;t[41]!==I||t[42]!==L?(R=(0,$.jsxs)(be,{children:[T,(0,$.jsxs)(ge,{className:`fixed left-1/2 top-1/2 z-66 flex h-[min(92vh,52rem)] w-[min(100%-2rem,72rem)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,children:[I,L]})]}),t[41]=I,t[42]=L,t[43]=R):R=t[43];let z;return t[44]!==n||t[45]!==R||t[46]!==w?(z=(0,$.jsx)(ve,{open:n,onOpenChange:w,children:R}),t[44]=n,t[45]=R,t[46]=w,t[47]=z):z=t[47],z}function Ct(e){let t=(0,Q.c)(5),{active:n,onClick:r,icon:i,children:a}=e,o=n?`inline-flex h-8 items-center gap-2 rounded-lg bg-surface-panel px-3 text-sm font-medium text-fg shadow-surface`:`inline-flex h-8 items-center gap-2 rounded-lg px-3 text-sm font-medium text-fg-muted hover:text-fg`,s;return t[0]!==a||t[1]!==i||t[2]!==r||t[3]!==o?(s=(0,$.jsxs)(`button`,{type:`button`,onClick:r,className:o,children:[i,a]}),t[0]=a,t[1]=i,t[2]=r,t[3]=o,t[4]=s):s=t[4],s}function wt({language:e,ownerAgentId:t,saving:n,initialDraft:r,name:i,setName:o,script:s,setScript:c,onClose:l,onSave:u,onSaveAndStart:d}){let f=a(e).workflows,[m,h]=(0,Z.useState)(``),[g,_]=(0,Z.useState)(null),[v,y]=(0,Z.useState)({allowNetwork:!1,fileSystem:`read`,maxPhases:4,maxSubagents:8,outputFormat:`report`}),[b,x]=(0,Z.useState)(!1),[S,C]=(0,Z.useState)(null),w=(0,Z.useMemo)(()=>g?.validation.errors.map(e=>e.message)??[],[g]),T=(0,Z.useMemo)(()=>g?.lint.filter(e=>e.severity===`error`)??[],[g]),E=m.trim().length>0&&!b,D=!!(g&&i.trim()&&s.trim()&&g.validation.valid&&T.length===0&&!n),O=s.trim().length>0,k=O?f.nlBuilderEditPromptLabel:f.nlBuilderPromptLabel,A=O?f.nlBuilderEditPromptPlaceholder:f.nlBuilderPromptPlaceholder,j=O?`improve`:`create`,M=async n=>{if(m.trim()){x(!0),C(null);try{let r=await p({prompt:m,agentId:t,language:e===`zh`?`zh`:`en`,mode:n,existingScript:n===`improve`?s:void 0,constraints:v});_(r),o(r.name),c(r.script)}catch(e){C(e instanceof Error?e.message:f.nlBuilderGenerateFailed)}finally{x(!1)}}},ee=async()=>{D&&await u({name:i.trim(),script:s})&&l()},N=async()=>{D&&await d({name:i.trim(),script:s,goal:m.trim()})};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{className:`grid min-h-0 flex-1 gap-4 overflow-auto px-5 py-4 lg:grid-cols-[minmax(18rem,0.9fr)_minmax(24rem,1.4fr)]`,children:[(0,$.jsxs)(`section`,{className:`space-y-3`,children:[(0,$.jsxs)(`label`,{className:`block`,children:[(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:k}),(0,$.jsx)(`textarea`,{value:m,onChange:e=>h(e.target.value),placeholder:A,className:`mt-1.5 min-h-36 w-full resize-y rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm leading-6 text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`})]}),(0,$.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,$.jsx)(Et,{label:f.nlBuilderMaxPhases,value:v.maxPhases??4,min:1,max:8,onChange:e=>y(t=>({...t,maxPhases:e}))}),(0,$.jsx)(Et,{label:f.nlBuilderMaxAgents,value:v.maxSubagents??8,min:1,max:20,onChange:e=>y(t=>({...t,maxSubagents:e}))})]}),(0,$.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,$.jsxs)(`label`,{className:`flex items-center gap-2 rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg-muted`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:!!v.allowNetwork,onChange:e=>y(t=>({...t,allowNetwork:e.target.checked}))}),f.nlBuilderAllowNetwork]}),(0,$.jsxs)(`label`,{className:`block`,children:[(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:f.nlBuilderFilesystem}),(0,$.jsxs)(`select`,{value:v.fileSystem??`read`,onChange:e=>y(t=>({...t,fileSystem:e.target.value})),className:`mt-1.5 w-full rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none focus:border-accent focus:ring-2 focus:ring-accent/20`,children:[(0,$.jsx)(`option`,{value:`none`,children:`none`}),(0,$.jsx)(`option`,{value:`read`,children:`read`}),(0,$.jsx)(`option`,{value:`write`,children:`write`})]})]})]}),(0,$.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:(0,$.jsxs)(X,{variant:`primary`,disabled:!E,onClick:()=>void M(j),children:[(0,$.jsx)(Ve,{className:`size-4`,"aria-hidden":!0}),b?f.nlBuilderGenerating:O?f.nlBuilderRewriteExisting:f.nlBuilderGenerate]})}),S?(0,$.jsx)(zt,{text:S}):null,g?(0,$.jsx)(At,{draft:g,labels:f}):null]}),(0,$.jsxs)(`section`,{className:`min-w-0 space-y-3`,children:[(0,$.jsx)(Ot,{initialDraft:r,labels:f}),(0,$.jsx)(Dt,{labels:f,name:i,setName:o}),(0,$.jsx)(kt,{labels:f,script:s,setScript:c,minHeightClass:`min-h-96`}),g?(0,$.jsx)(jt,{draft:g,labels:f,validationIssues:w}):null]})]}),(0,$.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-2 border-t border-edge px-5 py-4`,children:[(0,$.jsx)(X,{variant:`secondary`,onClick:l,disabled:n||b,children:f.cancelDialog}),(0,$.jsx)(X,{variant:`secondary`,disabled:!D,onClick:()=>void ee(),children:n?f.savingWorkflow:f.saveWorkflow}),(0,$.jsx)(X,{variant:`primary`,disabled:!D,onClick:()=>void N(),children:f.nlBuilderSaveAndStart})]})]})}function Tt({language:e,saving:t,initialDraft:n,name:r,setName:i,script:o,setScript:s,onClose:c,onSave:u}){let d=a(e).workflows,[f,p]=(0,Z.useState)(!1),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(null),[v,y]=(0,Z.useState)(null),b=r.trim(),x=!!(b&&o.trim());(0,Z.useEffect)(()=>{if(!x){h(!1),_(null),y(null);return}let e=!1,t=window.setTimeout(()=>{h(!0),_(null),l(b,o).then(t=>{e||y(t)}).catch(t=>{e||(y(null),_(t instanceof Error?t.message:d.validateWorkflowFailed))}).finally(()=>{e||h(!1)})},450);return()=>{e=!0,window.clearTimeout(t)}},[x,d.validateWorkflowFailed,o,b]);let S=(0,Z.useMemo)(()=>g?[g]:v?.errors.map(e=>e.message)??[],[g,v]),C=f||m||v!=null||g!=null,w=x&&!t&&!m&&v?.valid===!0;(0,Z.useEffect)(()=>{!n&&!o.trim()&&s(xt),p(!1),h(!1),_(null),y(null)},[n,o,s]);let T=async()=>{if(p(!0),!(!x||t)){h(!0),_(null);try{let e=await l(b,o);if(y(e),!e.valid)return;await u({name:b,script:o})&&c()}catch(e){y(null),_(e instanceof Error?e.message:d.validateWorkflowFailed)}finally{h(!1)}}};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-3 overflow-auto px-5 py-4`,children:[(0,$.jsx)(Ot,{initialDraft:n,labels:d}),(0,$.jsx)(Dt,{labels:d,name:r,setName:e=>{i(e),y(null),_(null)}}),(0,$.jsx)(kt,{labels:d,script:o,setScript:e=>{s(e),y(null),_(null)},minHeightClass:`min-h-72`}),C?(0,$.jsx)(Ft,{labels:d,validating:m,validationIssues:S,validationResult:v}):null]}),(0,$.jsxs)(`div`,{className:`flex justify-end gap-2 border-t border-edge px-5 py-4`,children:[(0,$.jsx)(X,{variant:`secondary`,onClick:c,disabled:t,children:d.cancelDialog}),(0,$.jsx)(X,{variant:`primary`,disabled:!w,onClick:()=>void T(),children:t?d.savingWorkflow:d.saveWorkflow})]})]})}function Et(e){let t=(0,Q.c)(12),{label:n,value:r,min:i,max:a,onChange:o}=e,s;t[0]===n?s=t[1]:(s=(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:n}),t[0]=n,t[1]=s);let c;t[2]===o?c=t[3]:(c=e=>o(Number(e.target.value)||void 0),t[2]=o,t[3]=c);let l;t[4]!==a||t[5]!==i||t[6]!==c||t[7]!==r?(l=(0,$.jsx)(`input`,{type:`number`,min:i,max:a,value:r,onChange:c,className:`mt-1.5 w-full rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none focus:border-accent focus:ring-2 focus:ring-accent/20`}),t[4]=a,t[5]=i,t[6]=c,t[7]=r,t[8]=l):l=t[8];let u;return t[9]!==s||t[10]!==l?(u=(0,$.jsxs)(`label`,{className:`block`,children:[s,l]}),t[9]=s,t[10]=l,t[11]=u):u=t[11],u}function Dt(e){let t=(0,Q.c)(11),{labels:n,name:r,setName:i}=e,a;t[0]===n.workflowNameLabel?a=t[1]:(a=(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:n.workflowNameLabel}),t[0]=n.workflowNameLabel,t[1]=a);let o;t[2]===i?o=t[3]:(o=e=>i(e.target.value),t[2]=i,t[3]=o);let s;t[4]!==n.workflowNamePlaceholder||t[5]!==r||t[6]!==o?(s=(0,$.jsx)(`input`,{value:r,onChange:o,placeholder:n.workflowNamePlaceholder,className:`mt-1.5 w-full rounded-xl border border-edge bg-surface-base px-3 py-2 font-mono text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`}),t[4]=n.workflowNamePlaceholder,t[5]=r,t[6]=o,t[7]=s):s=t[7];let c;return t[8]!==a||t[9]!==s?(c=(0,$.jsxs)(`label`,{className:`block`,children:[a,s]}),t[8]=a,t[9]=s,t[10]=c):c=t[10],c}function Ot(e){let t=(0,Q.c)(7),{initialDraft:n,labels:r}=e;if(!n)return null;let i;t[0]!==n.mode||t[1]!==n.sourceTitle||t[2]!==r.copyWorkflowNotice||t[3]!==r.editWorkflowNotice?(i=n.mode===`copy`?r.copyWorkflowNotice.replace(`{{title}}`,n.sourceTitle):r.editWorkflowNotice.replace(`{{title}}`,n.sourceTitle),t[0]=n.mode,t[1]=n.sourceTitle,t[2]=r.copyWorkflowNotice,t[3]=r.editWorkflowNotice,t[4]=i):i=t[4];let a=i,o;return t[5]===a?o=t[6]:(o=(0,$.jsx)(`div`,{className:`rounded-xl border border-accent/20 bg-accent-soft/60 px-3 py-2 text-sm leading-6 text-accent-fg`,children:a}),t[5]=a,t[6]=o),o}function kt(e){let t=(0,Q.c)(11),{labels:n,script:r,setScript:i,minHeightClass:a}=e,o;t[0]===n.workflowScriptLabel?o=t[1]:(o=(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:n.workflowScriptLabel}),t[0]=n.workflowScriptLabel,t[1]=o);let s;t[2]===i?s=t[3]:(s=e=>i(e.target.value),t[2]=i,t[3]=s);let c=`mt-1.5 w-full resize-y rounded-xl border border-edge bg-surface-base px-3 py-2 font-mono text-xs leading-5 text-fg outline-none focus:border-accent focus:ring-2 focus:ring-accent/20 ${a}`,l;t[4]!==r||t[5]!==s||t[6]!==c?(l=(0,$.jsx)(`textarea`,{value:r,onChange:s,spellCheck:!1,className:c}),t[4]=r,t[5]=s,t[6]=c,t[7]=l):l=t[7];let u;return t[8]!==o||t[9]!==l?(u=(0,$.jsxs)(`label`,{className:`block`,children:[o,l]}),t[8]=o,t[9]=l,t[10]=u):u=t[10],u}function At(e){let t=(0,Q.c)(23),{draft:n,labels:r}=e,i=n.manifest.title??n.name,a;t[0]===i?a=t[1]:(a=(0,$.jsx)(`div`,{className:`text-sm font-semibold text-fg`,children:i}),t[0]=i,t[1]=a);let o;t[2]===n.explanation?o=t[3]:(o=(0,$.jsx)(`p`,{className:`text-xs leading-5 text-fg-muted`,children:n.explanation}),t[2]=n.explanation,t[3]=o);let s;t[4]!==n.repairAttempts||t[5]!==r.nlBuilderAutoRepaired?(s=n.repairAttempts>0?(0,$.jsx)(`div`,{className:`text-xs font-medium text-accent-fg`,children:r.nlBuilderAutoRepaired.replace(`{count}`,String(n.repairAttempts))}):null,t[4]=n.repairAttempts,t[5]=r.nlBuilderAutoRepaired,t[6]=s):s=t[6];let c;t[7]!==n.permissionsSummary||t[8]!==r.nlBuilderPermissions?(c=(0,$.jsx)(Lt,{title:r.nlBuilderPermissions,items:n.permissionsSummary}),t[7]=n.permissionsSummary,t[8]=r.nlBuilderPermissions,t[9]=c):c=t[9];let l;t[10]!==n.assumptions||t[11]!==r.nlBuilderAssumptions?(l=(0,$.jsx)(Lt,{title:r.nlBuilderAssumptions,items:n.assumptions}),t[10]=n.assumptions,t[11]=r.nlBuilderAssumptions,t[12]=l):l=t[12];let u;t[13]!==n.risks||t[14]!==r.nlBuilderRisks?(u=(0,$.jsx)(Lt,{title:r.nlBuilderRisks,items:n.risks}),t[13]=n.risks,t[14]=r.nlBuilderRisks,t[15]=u):u=t[15];let d;return t[16]!==a||t[17]!==o||t[18]!==s||t[19]!==c||t[20]!==l||t[21]!==u?(d=(0,$.jsxs)(`div`,{className:`space-y-2 rounded-xl border border-edge bg-surface-base/50 p-3`,children:[a,o,s,c,l,u]}),t[16]=a,t[17]=o,t[18]=s,t[19]=c,t[20]=l,t[21]=u,t[22]=d):d=t[22],d}function jt(e){let t=(0,Q.c)(17),{draft:n,labels:r,validationIssues:i}=e,a=n.lint,o;t[0]!==n.validation.valid||t[1]!==a?(o=n.validation.valid&&a.every(Pt),t[0]=n.validation.valid,t[1]=a,t[2]=o):o=t[2];let s=o,c=s?`rounded-xl border border-emerald-500/30 bg-emerald-500/10 p-3 text-sm text-emerald-800 dark:text-emerald-200`:`rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-sm text-amber-800 dark:text-amber-200`,l;t[3]===s?l=t[4]:(l=s?(0,$.jsx)(ye,{className:`size-4`,"aria-hidden":!0}):(0,$.jsx)(oe,{className:`size-4`,"aria-hidden":!0}),t[3]=s,t[4]=l);let u=s?r.validationPassed:r.nlBuilderReviewIssues,d;t[5]!==l||t[6]!==u?(d=(0,$.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[l,u]}),t[5]=l,t[6]=u,t[7]=d):d=t[7];let f;t[8]!==n.validation.definition?.phases||t[9]!==r.validationPreview||t[10]!==a||t[11]!==i?(f=i.length>0||a.length>0?(0,$.jsxs)(`ul`,{className:`mt-2 list-disc space-y-1 pl-5 text-xs leading-5`,children:[i.map(Nt),a.map(Mt)]}):(0,$.jsx)(`p`,{className:`mt-1 text-xs opacity-80`,children:r.validationPreview.replace(`{{phaseCount}}`,String(n.validation.definition?.phases.length??0))}),t[8]=n.validation.definition?.phases,t[9]=r.validationPreview,t[10]=a,t[11]=i,t[12]=f):f=t[12];let p;return t[13]!==c||t[14]!==d||t[15]!==f?(p=(0,$.jsxs)(`div`,{className:c,children:[d,f]}),t[13]=c,t[14]=d,t[15]=f,t[16]=p):p=t[16],p}function Mt(e){return(0,$.jsx)(`li`,{children:e.message},`${e.code}:${e.message}`)}function Nt(e){return(0,$.jsx)(`li`,{children:e},e)}function Pt(e){return e.severity!==`error`}function Ft(e){let t=(0,Q.c)(10),{labels:n,validating:r,validationIssues:i,validationResult:a}=e,o=i.length>0?`rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-sm text-red-700 dark:text-red-200`:`rounded-xl border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-200`,s=r?n.validatingWorkflow:i.length>0?n.validationFailed:n.validationPassed,c;t[0]===s?c=t[1]:(c=(0,$.jsx)(`div`,{className:`font-medium`,children:s}),t[0]=s,t[1]=c);let l;t[2]!==n.validationPreview||t[3]!==i||t[4]!==a?(l=i.length>0?(0,$.jsx)(`ul`,{className:`mt-1 list-disc space-y-1 pl-5`,children:i.map(It)}):a?.definition?(0,$.jsx)(`div`,{className:`mt-1 text-xs opacity-80`,children:n.validationPreview.replace(`{{phaseCount}}`,String(a.definition.phases.length))}):null,t[2]=n.validationPreview,t[3]=i,t[4]=a,t[5]=l):l=t[5];let u;return t[6]!==o||t[7]!==c||t[8]!==l?(u=(0,$.jsxs)(`div`,{className:o,role:`status`,children:[c,l]}),t[6]=o,t[7]=c,t[8]=l,t[9]=u):u=t[9],u}function It(e){return(0,$.jsx)(`li`,{children:e},e)}function Lt(e){let t=(0,Q.c)(10),{title:n,items:r}=e;if(!r.length)return null;let i;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(i=(0,$.jsx)(y,{className:`size-3`,"aria-hidden":!0}),t[0]=i):i=t[0];let a;t[1]===n?a=t[2]:(a=(0,$.jsxs)(`div`,{className:`mb-1 flex items-center gap-1 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle`,children:[i,n]}),t[1]=n,t[2]=a);let o;t[3]===r?o=t[4]:(o=r.slice(0,5).map(Rt),t[3]=r,t[4]=o);let s;t[5]===o?s=t[6]:(s=(0,$.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:o}),t[5]=o,t[6]=s);let c;return t[7]!==a||t[8]!==s?(c=(0,$.jsxs)(`div`,{children:[a,s]}),t[7]=a,t[8]=s,t[9]=c):c=t[9],c}function Rt(e){return(0,$.jsx)(`span`,{className:`rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1 text-[11px] text-fg-muted`,children:e},e)}function zt(e){let t=(0,Q.c)(2),{text:n}=e,r;return t[0]===n?r=t[1]:(r=(0,$.jsx)(`div`,{className:`rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-sm text-red-700 dark:text-red-200`,children:n}),t[0]=n,t[1]=r),r}function Bt(e){let t=(0,Q.c)(57),{open:n,definition:r,language:i,onClose:o,onRun:s}=e,c;t[0]===i?c=t[1]:(c=a(i),t[0]=i,t[1]=c);let l=c.workflows;if(!r)return null;let u;t[2]!==r||t[3]!==i?(u=f(r,i),t[2]=r,t[3]=i,t[4]=u):u=t[4];let d=u,p=r.runtime?.source??``,m;t[5]===o?m=t[6]:(m=e=>!e&&o(),t[5]=o,t[6]=m);let h;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(h=(0,$.jsx)(Oe,{className:`xopc-dialog-overlay fixed inset-0 z-65 bg-scrim backdrop-blur-[1px]`}),t[7]=h):h=t[7];let g;t[8]===r.title?g=t[9]:(g=(0,$.jsx)(q,{className:`text-base font-semibold text-fg`,children:r.title}),t[8]=r.title,t[9]=g);let _;t[10]===d.description?_=t[11]:(_=(0,$.jsx)(je,{className:`mt-1 text-sm text-fg-muted`,children:d.description}),t[10]=d.description,t[11]=_);let v;t[12]!==g||t[13]!==_?(v=(0,$.jsxs)(`div`,{className:`border-b border-edge px-5 py-4`,children:[g,_]}),t[12]=g,t[13]=_,t[14]=v):v=t[14];let y;t[15]!==l.whenToUseHeading||t[16]!==d.whenToUse?(y=d.whenToUse?(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:l.whenToUseHeading}),(0,$.jsx)(`p`,{className:`mt-2 text-sm leading-6 text-fg-muted`,children:d.whenToUse})]}):null,t[15]=l.whenToUseHeading,t[16]=d.whenToUse,t[17]=y):y=t[17];let b;t[18]!==r||t[19]!==l?(b=(0,$.jsx)(Ht,{definition:r,labels:l}),t[18]=r,t[19]=l,t[20]=b):b=t[20];let x;t[21]!==r.inputSchema||t[22]!==l.inputsHeading?(x=r.inputSchema?(0,$.jsx)(Wt,{title:l.inputsHeading,schema:r.inputSchema}):null,t[21]=r.inputSchema,t[22]=l.inputsHeading,t[23]=x):x=t[23];let S;t[24]!==r.outputSchema||t[25]!==l.outputsHeading?(S=r.outputSchema?(0,$.jsx)(Wt,{title:l.outputsHeading,schema:r.outputSchema}):null,t[24]=r.outputSchema,t[25]=l.outputsHeading,t[26]=S):S=t[26];let C;t[27]!==r.phases||t[28]!==l.phasesHeading?(C=r.phases.length>0?(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:l.phasesHeading}),(0,$.jsx)(`ol`,{className:`mt-2 space-y-2`,children:r.phases.map(Vt)})]}):null,t[27]=r.phases,t[28]=l.phasesHeading,t[29]=C):C=t[29];let w;t[30]!==l.scriptHeading||t[31]!==p?(w=p?(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:l.scriptHeading}),(0,$.jsx)(`pre`,{className:`mt-2 max-h-64 overflow-auto rounded-xl border border-edge bg-surface-base/50 p-3 font-mono text-xs leading-5 text-fg-muted`,children:p})]}):null,t[30]=l.scriptHeading,t[31]=p,t[32]=w):w=t[32];let T;t[33]!==x||t[34]!==S||t[35]!==C||t[36]!==w||t[37]!==y||t[38]!==b?(T=(0,$.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-4 overflow-auto px-5 py-4`,children:[y,b,x,S,C,w]}),t[33]=x,t[34]=S,t[35]=C,t[36]=w,t[37]=y,t[38]=b,t[39]=T):T=t[39];let E;t[40]!==l.closeResult||t[41]!==o?(E=(0,$.jsx)(X,{variant:`secondary`,onClick:o,children:l.closeResult}),t[40]=l.closeResult,t[41]=o,t[42]=E):E=t[42];let D;t[43]!==l.runWorkflow||t[44]!==s?(D=(0,$.jsx)(X,{variant:`primary`,onClick:s,children:l.runWorkflow}),t[43]=l.runWorkflow,t[44]=s,t[45]=D):D=t[45];let O;t[46]!==E||t[47]!==D?(O=(0,$.jsxs)(`div`,{className:`flex justify-end gap-2 border-t border-edge px-5 py-4`,children:[E,D]}),t[46]=E,t[47]=D,t[48]=O):O=t[48];let k;t[49]!==T||t[50]!==O||t[51]!==v?(k=(0,$.jsxs)(be,{children:[h,(0,$.jsxs)(ge,{className:`fixed left-1/2 top-1/2 z-66 flex max-h-[min(85vh,44rem)] w-[min(100%-2rem,48rem)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,children:[v,T,O]})]}),t[49]=T,t[50]=O,t[51]=v,t[52]=k):k=t[52];let A;return t[53]!==n||t[54]!==k||t[55]!==m?(A=(0,$.jsx)(ve,{open:n,onOpenChange:m,children:k}),t[53]=n,t[54]=k,t[55]=m,t[56]=A):A=t[56],A}function Vt(e,t){return(0,$.jsxs)(`li`,{className:`rounded-xl border border-edge bg-surface-base/40 px-3 py-2`,children:[(0,$.jsxs)(`div`,{className:`text-sm font-medium text-fg`,children:[t+1,`. `,e.title]}),e.description?(0,$.jsx)(`p`,{className:`mt-1 text-xs leading-5 text-fg-muted`,children:e.description}):null]},e.id)}function Ht(e){let t=(0,Q.c)(39),{definition:n,labels:r}=e,i=n.permissions,a=n.resources,o;t[0]!==r.permissionsTools||t[1]!==i?(o=i?.tools?.length?[r.permissionsTools,i.tools.join(`, `)]:null,t[0]=r.permissionsTools,t[1]=i,t[2]=o):o=t[2];let s;t[3]!==r.networkDisabled||t[4]!==r.networkEnabled||t[5]!==r.permissionsNetwork||t[6]!==i?(s=i?.network==null?null:[r.permissionsNetwork,i.network?r.networkEnabled:r.networkDisabled],t[3]=r.networkDisabled,t[4]=r.networkEnabled,t[5]=r.permissionsNetwork,t[6]=i,t[7]=s):s=t[7];let c;t[8]!==r.permissionsFileSystem||t[9]!==i?(c=i?.fileSystem?[r.permissionsFileSystem,i.fileSystem]:null,t[8]=r.permissionsFileSystem,t[9]=i,t[10]=c):c=t[10];let l;t[11]!==r.permissionsApproval||t[12]!==i?.approvalRequired?(l=i?.approvalRequired?[r.permissionsApproval,r.permissionsApproval]:null,t[11]=r.permissionsApproval,t[12]=i?.approvalRequired,t[13]=l):l=t[13];let u;t[14]!==r.resourcesSkills||t[15]!==a?(u=a?.skills?.length?[r.resourcesSkills,a.skills.join(`, `)]:null,t[14]=r.resourcesSkills,t[15]=a,t[16]=u):u=t[16];let d;t[17]!==r.resourcesContextFiles||t[18]!==a?(d=a?.contextFiles?.length?[r.resourcesContextFiles,a.contextFiles.join(`, `)]:null,t[17]=r.resourcesContextFiles,t[18]=a,t[19]=d):d=t[19];let f;t[20]!==r.resourcesPromptTemplates||t[21]!==a?(f=a?.promptTemplates?.length?[r.resourcesPromptTemplates,a.promptTemplates.join(`, `)]:null,t[20]=r.resourcesPromptTemplates,t[21]=a,t[22]=f):f=t[22];let p;t[23]!==o||t[24]!==s||t[25]!==c||t[26]!==l||t[27]!==u||t[28]!==d||t[29]!==f?(p=[o,s,c,l,u,d,f].filter(Boolean),t[23]=o,t[24]=s,t[25]=c,t[26]=l,t[27]=u,t[28]=d,t[29]=f,t[30]=p):p=t[30];let m=p,h;t[31]===r.capabilitiesHeading?h=t[32]:(h=(0,$.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:r.capabilitiesHeading}),t[31]=r.capabilitiesHeading,t[32]=h);let g;t[33]!==r.capabilityNone||t[34]!==m?(g=m.length>0?(0,$.jsx)(`div`,{className:`mt-2 grid gap-2 sm:grid-cols-2`,children:m.map(Ut)}):(0,$.jsx)(`p`,{className:`mt-2 text-sm text-fg-muted`,children:r.capabilityNone}),t[33]=r.capabilityNone,t[34]=m,t[35]=g):g=t[35];let _;return t[36]!==g||t[37]!==h?(_=(0,$.jsxs)(`section`,{children:[h,g]}),t[36]=g,t[37]=h,t[38]=_):_=t[38],_}function Ut(e){let[t,n]=e;return(0,$.jsxs)(`div`,{className:`rounded-xl border border-edge bg-surface-base/40 px-3 py-2`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-2 text-xs font-medium text-fg-muted`,children:[(0,$.jsx)(B,{className:`size-3.5 text-fg-subtle`,"aria-hidden":!0}),t]}),(0,$.jsx)(`div`,{className:`mt-1 break-words text-sm text-fg`,children:n})]},`${t}:${n}`)}function Wt(e){let t=(0,Q.c)(16),{title:n,schema:r}=e,i;t[0]===r.properties?i=t[1]:(i=Object.keys(r.properties??{}),t[0]=r.properties,t[1]=i);let a=i,o;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(o=(0,$.jsx)(y,{className:`size-3.5`,"aria-hidden":!0}),t[2]=o):o=t[2];let s;t[3]===n?s=t[4]:(s=(0,$.jsxs)(`h3`,{className:`flex items-center gap-2 text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:[o,n]}),t[3]=n,t[4]=s);let c;t[5]===a?c=t[6]:(c=a.length>0?(0,$.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:a.map(Gt)}):null,t[5]=a,t[6]=c);let l;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,$.jsx)(`summary`,{className:`cursor-pointer text-xs text-fg-subtle hover:text-fg-muted`,children:`JSON`}),t[7]=l):l=t[7];let u;t[8]===r?u=t[9]:(u=JSON.stringify(r,null,2),t[8]=r,t[9]=u);let d;t[10]===u?d=t[11]:(d=(0,$.jsxs)(`details`,{className:`mt-2`,children:[l,(0,$.jsx)(`pre`,{className:`mt-2 max-h-48 overflow-auto rounded-xl border border-edge bg-surface-base/50 p-3 font-mono text-xs leading-5 text-fg-muted`,children:u})]}),t[10]=u,t[11]=d);let f;return t[12]!==s||t[13]!==c||t[14]!==d?(f=(0,$.jsxs)(`section`,{children:[s,c,d]}),t[12]=s,t[13]=c,t[14]=d,t[15]=f):f=t[15],f}function Gt(e){return(0,$.jsx)(`span`,{className:`rounded-lg border border-edge-subtle bg-surface-base px-2 py-1 text-xs text-fg-muted`,children:e},e)}function Kt(e,t){let n=e.metadata.estimatedAgents;return n?n.min===n.max?Y(t.agentScaleExact,{count:n.min}):Y(t.agentScaleRange,{min:n.min,max:n.max}):null}function qt(e){let t=(0,Q.c)(81),{definition:n,language:r,labels:a,onPick:o,onDetail:s,onEdit:c}=e,l;t[0]!==n||t[1]!==r?(l=f(n,r),t[0]=n,t[1]=r,t[2]=l):l=t[2];let u=l,d;t[3]!==n||t[4]!==a?(d=Kt(n,a),t[3]=n,t[4]=a,t[5]=d):d=t[5];let p=d,m=n.metadata.source===`user`,h;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(h=i(`group flex h-full flex-col rounded-xl border border-edge-subtle bg-surface-base p-4 text-left transition-colors`,`hover:border-accent/40 hover:bg-surface-hover`),t[6]=h):h=t[6];let g;t[7]!==n||t[8]!==s?(g=()=>s(n),t[7]=n,t[8]=s,t[9]=g):g=t[9];let _;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(_=i(`flex flex-1 flex-col text-left`,We.focusRingPanel),t[10]=_):_=t[10];let v=m?`bg-accent-soft text-accent-fg`:`bg-surface-hover text-fg-muted`,b;t[11]===v?b=t[12]:(b=i(`rounded-full px-2 py-0.5 text-[10px] font-medium`,v),t[11]=v,t[12]=b);let x=m?a.badgeUser:a.badgeBuiltin,S;t[13]!==b||t[14]!==x?(S=(0,$.jsx)(`span`,{className:b,children:x}),t[13]=b,t[14]=x,t[15]=S):S=t[15];let C;t[16]!==n.inputSchema||t[17]!==a.inputSchemaBadge?(C=n.inputSchema?(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full bg-surface-hover px-2 py-0.5 text-[10px] text-fg-subtle`,children:[(0,$.jsx)(y,{className:`size-2.5`,"aria-hidden":!0}),a.inputSchemaBadge]}):null,t[16]=n.inputSchema,t[17]=a.inputSchemaBadge,t[18]=C):C=t[18];let w;t[19]===n.metadata.tags?w=t[20]:(w=n.metadata.tags.slice(0,2).map(Jt),t[19]=n.metadata.tags,t[20]=w);let T;t[21]!==C||t[22]!==w||t[23]!==S?(T=(0,$.jsxs)(`div`,{className:`mb-2 flex flex-wrap items-center gap-1.5`,children:[S,C,w]}),t[21]=C,t[22]=w,t[23]=S,t[24]=T):T=t[24];let E;t[25]===n.title?E=t[26]:(E=(0,$.jsx)(`span`,{className:`line-clamp-2 text-sm font-semibold leading-5 text-fg`,children:n.title}),t[25]=n.title,t[26]=E);let k;t[27]!==T||t[28]!==E?(k=(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[T,E]}),t[27]=T,t[28]=E,t[29]=k):k=t[29];let A;t[30]===Symbol.for(`react.memo_cache_sentinel`)?(A=(0,$.jsx)(`span`,{className:`flex size-8 shrink-0 items-center justify-center rounded-lg bg-accent-soft text-accent-fg opacity-80 transition-opacity group-hover:opacity-100`,children:(0,$.jsx)(O,{className:`size-3.5`,"aria-hidden":!0})}),t[30]=A):A=t[30];let j;t[31]===k?j=t[32]:(j=(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[k,A]}),t[31]=k,t[32]=j);let M;t[33]===u.description?M=t[34]:(M=u.description?(0,$.jsx)(`p`,{className:`mt-2 line-clamp-2 text-xs leading-5 text-fg-muted`,children:u.description}):null,t[33]=u.description,t[34]=M);let ee;t[35]===Symbol.for(`react.memo_cache_sentinel`)?(ee=(0,$.jsx)(ze,{className:`size-3`,"aria-hidden":!0}),t[35]=ee):ee=t[35];let N;t[36]!==n.phases.length||t[37]!==a.phaseCount?(N=Y(a.phaseCount,{count:n.phases.length}),t[36]=n.phases.length,t[37]=a.phaseCount,t[38]=N):N=t[38];let P;t[39]===N?P=t[40]:(P=(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[ee,N]}),t[39]=N,t[40]=P);let F;t[41]===p?F=t[42]:(F=p?(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,$.jsx)(pe,{className:`size-3`,"aria-hidden":!0}),p]}):null,t[41]=p,t[42]=F);let I;t[43]!==P||t[44]!==F?(I=(0,$.jsxs)(`div`,{className:`mt-auto flex flex-wrap items-center gap-3 pt-3 text-[11px] text-fg-subtle`,children:[P,F]}),t[43]=P,t[44]=F,t[45]=I):I=t[45];let L;t[46]!==j||t[47]!==M||t[48]!==I||t[49]!==g?(L=(0,$.jsxs)(`button`,{type:`button`,onClick:g,className:_,children:[j,M,I]}),t[46]=j,t[47]=M,t[48]=I,t[49]=g,t[50]=L):L=t[50];let R;t[51]!==n||t[52]!==o?(R=()=>o(n),t[51]=n,t[52]=o,t[53]=R):R=t[53];let z;t[54]===Symbol.for(`react.memo_cache_sentinel`)?(z=(0,$.jsx)(D,{className:`size-3.5`,"aria-hidden":!0}),t[54]=z):z=t[54];let B;t[55]!==a.runWorkflow||t[56]!==R?(B=(0,$.jsxs)(X,{type:`button`,variant:`primary`,className:`h-8 flex-1 rounded-lg text-xs`,onClick:R,children:[z,a.runWorkflow]}),t[55]=a.runWorkflow,t[56]=R,t[57]=B):B=t[57];let V;t[58]!==n||t[59]!==s?(V=()=>s(n),t[58]=n,t[59]=s,t[60]=V):V=t[60];let te;t[61]===Symbol.for(`react.memo_cache_sentinel`)?(te=(0,$.jsx)(O,{className:`size-3.5`,"aria-hidden":!0}),t[61]=te):te=t[61];let H;t[62]!==a.viewDetails||t[63]!==V?(H=(0,$.jsxs)(X,{type:`button`,variant:`secondary`,className:`h-8 rounded-lg text-xs`,onClick:V,children:[te,a.viewDetails]}),t[62]=a.viewDetails,t[63]=V,t[64]=H):H=t[64];let ne;t[65]!==n||t[66]!==c?(ne=()=>c(n),t[65]=n,t[66]=c,t[67]=ne):ne=t[67];let re;t[68]===m?re=t[69]:(re=m?(0,$.jsx)(U,{className:`size-3.5`,"aria-hidden":!0}):(0,$.jsx)(me,{className:`size-3.5`,"aria-hidden":!0}),t[68]=m,t[69]=re);let ie=m?a.editWorkflow:a.copyAndEditWorkflow,W;t[70]!==ne||t[71]!==re||t[72]!==ie?(W=(0,$.jsxs)(X,{type:`button`,variant:`secondary`,className:`h-8 rounded-lg text-xs`,onClick:ne,children:[re,ie]}),t[70]=ne,t[71]=re,t[72]=ie,t[73]=W):W=t[73];let ae;t[74]!==B||t[75]!==H||t[76]!==W?(ae=(0,$.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2 border-t border-edge-subtle pt-3`,children:[B,H,W]}),t[74]=B,t[75]=H,t[76]=W,t[77]=ae):ae=t[77];let G;return t[78]!==L||t[79]!==ae?(G=(0,$.jsxs)(`article`,{className:h,children:[L,ae]}),t[78]=L,t[79]=ae,t[80]=G):G=t[80],G}function Jt(e){return(0,$.jsx)(`span`,{className:`rounded-full bg-surface-hover px-2 py-0.5 text-[10px] text-fg-subtle`,children:e},e)}function Yt(e,t){return e===`uncategorized`?t.categories.uncategorized:t.categories[e]}function Xt(e){let t=(0,Q.c)(11),{definitions:n,language:r,onPick:o,onDetail:s,onEdit:c}=e,l=a(r).workflows,[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(`all`),m;t[0]!==f||t[1]!==n||t[2]!==u?(m=ue(n,u,f,`all`),t[0]=f,t[1]=n,t[2]=u,t[3]=m):m=t[3];let h=m,g;t[4]===h?g=t[5]:(g=De(h),t[4]=h,t[5]=g);let _=g,v;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(v=(0,$.jsx)(we,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-subtle`,"aria-hidden":!0}),t[6]=v):v=t[6];let y;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(y=e=>d(e.target.value),t[7]=y):y=t[7];let b=l.searchPlaceholder,x;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(x=i(`h-10 w-full rounded-xl border border-edge bg-surface-base py-2 pl-10 pr-3 text-sm text-fg`,`placeholder:text-fg-subtle`,We.focusRingPanel),t[8]=x):x=t[8];let S=h.length===0?(0,$.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center px-4 py-12 text-center`,children:[(0,$.jsx)(`p`,{className:`text-sm text-fg-muted`,children:l.noDefinitions}),(0,$.jsx)(`p`,{className:`mt-1 max-w-sm text-xs leading-5 text-fg-subtle`,children:l.noDefinitionsHint})]}):f===`all`?(0,$.jsx)(`div`,{className:`flex flex-col gap-6 pb-1`,children:_.map(e=>(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h3`,{className:`mb-3 text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:Yt(e.category,l)}),(0,$.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3`,children:e.items.map(e=>(0,$.jsx)(qt,{definition:e,language:r,labels:l,onPick:o,onDetail:s,onEdit:c},e.id))})]},e.category))}):(0,$.jsx)(`div`,{className:`grid grid-cols-1 gap-3 pb-1 sm:grid-cols-2 xl:grid-cols-3`,children:h.map(e=>(0,$.jsx)(qt,{definition:e,language:r,labels:l,onPick:o,onDetail:s,onEdit:c},e.id))}),C;return t[9]===S?C=t[10]:(C=(0,$.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:S}),t[9]=S,t[10]=C),(0,$.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-4`,children:[(0,$.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-4`,children:[(0,$.jsxs)(`div`,{className:`relative`,children:[v,(0,$.jsx)(`input`,{value:u,onChange:y,placeholder:b,className:x})]}),(0,$.jsx)(`div`,{className:`flex flex-wrap gap-2`,role:`group`,"aria-label":l.categoryFilterAria,children:z.map(e=>(0,$.jsx)(X,{type:`button`,variant:f===e?`secondary`:`ghost`,className:`h-8 rounded-full px-3 py-1.5 text-xs`,onClick:()=>p(e),children:l.categories[e]},e))})]}),C]})}function Zt(e){let t=(0,Q.c)(32),{open:n,definitions:r,language:o,onClose:s,onPick:c,onDetail:l,onEdit:u}=e,d;t[0]===o?d=t[1]:(d=a(o),t[0]=o,t[1]=d);let f=d.workflows,p;t[2]===s?p=t[3]:(p=e=>!e&&s(),t[2]=s,t[3]=p);let m;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(m=(0,$.jsx)(Oe,{className:`fixed inset-0 z-50 bg-scrim`}),t[4]=m):m=t[4];let h;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(h=i(`pointer-events-auto relative flex h-[min(90vh,840px)] w-full max-w-5xl flex-col`,`rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,We.focusRingPanel),t[5]=h):h=t[5];let g;t[6]===f.pickStartTitle?g=t[7]:(g=(0,$.jsx)(q,{className:`text-lg font-semibold text-fg`,children:f.pickStartTitle}),t[6]=f.pickStartTitle,t[7]=g);let _;t[8]===f.pickStartHint?_=t[9]:(_=(0,$.jsx)(je,{className:`mt-1 text-sm leading-6 text-fg-muted`,children:f.pickStartHint}),t[8]=f.pickStartHint,t[9]=_);let v;t[10]!==g||t[11]!==_?(v=(0,$.jsxs)(`div`,{className:`min-w-0`,children:[g,_]}),t[10]=g,t[11]=_,t[12]=v):v=t[12];let y;t[13]===Symbol.for(`react.memo_cache_sentinel`)?(y=(0,$.jsx)(G,{className:`size-5`,strokeWidth:1.75,"aria-hidden":!0}),t[13]=y):y=t[13];let b;t[14]===f.pickStartClose?b=t[15]:(b=(0,$.jsx)(fe,{asChild:!0,children:(0,$.jsx)(X,{variant:`ghost`,className:`size-9 shrink-0 p-0`,"aria-label":f.pickStartClose,children:y})}),t[14]=f.pickStartClose,t[15]=b);let x;t[16]!==v||t[17]!==b?(x=(0,$.jsxs)(`div`,{className:`flex shrink-0 items-start justify-between gap-4 border-b border-edge-subtle px-6 py-5`,children:[v,b]}),t[16]=v,t[17]=b,t[18]=x):x=t[18];let S;t[19]!==r||t[20]!==o||t[21]!==l||t[22]!==u||t[23]!==c?(S=(0,$.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col px-6 py-5`,children:(0,$.jsx)(Xt,{definitions:r,language:o,onPick:c,onDetail:l,onEdit:u})}),t[19]=r,t[20]=o,t[21]=l,t[22]=u,t[23]=c,t[24]=S):S=t[24];let C;t[25]!==x||t[26]!==S?(C=(0,$.jsxs)(be,{children:[m,(0,$.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4 pointer-events-none`,children:(0,$.jsxs)(ge,{className:h,onOpenAutoFocus:Qt,children:[x,S]})})]}),t[25]=x,t[26]=S,t[27]=C):C=t[27];let w;return t[28]!==n||t[29]!==C||t[30]!==p?(w=(0,$.jsx)(ve,{open:n,onOpenChange:p,children:C}),t[28]=n,t[29]=C,t[30]=p,t[31]=w):w=t[31],w}function Qt(e){return e.preventDefault()}function $t(e,t){return t.status[e]??e}function en(e,t){return t.phaseStatus[e]??e}function tn(e,t){let{run:n}=e;return n.status===`succeeded`?Y(t.runSummarySucceeded,{agents:n.metrics.doneAgentCount,artifacts:n.metrics.artifactCount}):n.status===`failed`||n.status===`timeout`?n.error?.message??t.runSummaryFailedFallback:n.status===`cancelled`?t.runSummaryCancelled:Y(t.runSummaryActive,{done:n.metrics.doneAgentCount,total:n.metrics.agentCount})}function nn(e,t){let{run:n}=e;return n.status===`failed`?t.diagnosticFailedHint:n.status===`timeout`?t.diagnosticTimeoutHint:n.status===`cancelled`?t.diagnosticCancelledHint:n.status===`succeeded`&&n.metrics.errorAgentCount>0?t.diagnosticPartialHint:null}function rn(e){return K(e)}function an(e){return!e||typeof e!=`object`||!(`kind`in e)?`unknown`:e.kind===`chat`?`chat · ${e.sessionKey}`:e.kind===`webui`?e.sessionKey?`webui · ${e.sessionKey}`:`webui`:e.kind===`cron`?`cron · ${e.scheduleId}`:e.kind===`api`?e.requestId?`api · ${e.requestId}`:`api`:e.kind===`im`?`${e.channel} · ${e.chatId}`:String(e.kind)}function on({view:e,comparison:t,currentDefinition:n,loading:r,language:o,localeTag:s,onCancel:c,onRetry:l,onReplay:d,onOpenRunId:f,ownerAgentId:p,onClose:m}){let h=a(o).workflows,g=le(o),v=re(),[y,b]=(0,Z.useState)(!0),[w,T]=(0,Z.useState)(`result`),[E,D]=(0,Z.useState)(!1),[O,k]=(0,Z.useState)(null),[j,M]=(0,Z.useState)(!1),[ee,P]=(0,Z.useState)(null),[F,L]=(0,Z.useState)(null),[,R]=(0,Z.useState)(0),z=e?.run.status,B=z?I.has(z):!1;(0,Z.useEffect)(()=>{e?.run.id&&(b(B||z===`failed`||z===`timeout`),T(`result`),k(null),P(null))},[e?.run.id,B,z,e?.run.metrics.errorAgentCount]),(0,Z.useEffect)(()=>{if(!B)return;let e=window.setInterval(()=>R(e=>e+1),1e3);return()=>window.clearInterval(e)},[B]);let V=(0,Z.useMemo)(()=>e?Se(e):null,[e]),te=(0,Z.useMemo)(()=>V?x(V):{phases:[],unphased:null},[V]),H=(0,Z.useMemo)(()=>O==null||!V?null:V.agents.find(e=>e.id===O)??null,[O,V]),ne=(0,Z.useCallback)(e=>{k(e.id)},[]),ie=(0,Z.useMemo)(()=>e?Fe(e):[],[e]),U=e?J(e.run.result):void 0,ae=U?yn(U):null,oe=U?ce(U):``,se=!!U,ue=(0,Z.useCallback)(async()=>{se&&await S(oe)&&(M(!0),window.setTimeout(()=>M(!1),1500))},[se,oe]),de=(0,Z.useCallback)(()=>{if(!se||!e)return;let t=new Blob([oe],{type:`text/markdown;charset=utf-8`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${e.run.definitionId}-${e.run.id.slice(0,8)}.md`,r.click(),URL.revokeObjectURL(n)},[se,oe,e]),fe=(0,Z.useCallback)(()=>{if(!e)return;let t=rn(e);t&&v(Be(t))},[v,e]),pe=(0,Z.useCallback)(async t=>{if(e){P(null),L(t.id);try{_n(await C(e.run.id,t.id,{ownerAgentId:p}),t.name||t.id)}catch(e){P(e instanceof Error?e.message:String(e))}finally{L(null)}}},[p,e]),me=(0,Z.useCallback)(t=>{if(!e||!t.prompt)return;let n=rn(e);if(!n){S(t.prompt);return}v(Be(n,t.prompt))},[v,e]),ye=(0,Z.useCallback)(t=>{if(!e||t==null)return;let n=String(t),r=e.agents.findIndex(e=>String(e.id)===n);if(r<0)return;let i=Number.parseInt(n,10);k(Number.isFinite(i)?i:r+1)},[e]),xe=e?rn(e):null;if(r)return(0,$.jsx)(ve,{open:!0,onOpenChange:e=>!e&&m(),children:(0,$.jsxs)(be,{children:[(0,$.jsx)(Oe,{className:`xopc-dialog-overlay fixed inset-0 z-65 bg-scrim backdrop-blur-[1px]`}),(0,$.jsxs)(ge,{className:`fixed left-1/2 top-1/2 z-66 flex h-[min(85vh,44rem)] w-[min(100%-2rem,48rem)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,children:[(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-5 py-4`,children:[(0,$.jsx)(q,{className:`text-base font-semibold tracking-tight text-fg`,children:h.runSummaryTitle}),(0,$.jsx)(X,{type:`button`,variant:`ghost`,className:`size-9 shrink-0 p-0`,"aria-label":h.pickStartClose,onClick:m,children:(0,$.jsx)(G,{className:`size-5`,"aria-hidden":!0})})]}),(0,$.jsx)(`div`,{className:`p-5 text-sm text-fg-muted`,children:h.loading})]})]})});if(!e||!V)return null;let{run:we}=e,Te=e.controls.canCancel&&B,Ee=B&&we.startedAtMs!=null?he(Date.now()-we.startedAtMs):he(we.metrics.durationMs??void 0),De=tn(e,h),je=nn(e,h),Me=we.metadata,Ne=an(we.source),Pe=e.controls.canRetry&&e.agents.some(e=>(e.status===`error`||e.status===`skipped`)&&e.prompt?.trim()),Ie=e.controls.canRetry&&(e.phases.some(t=>t.status===`failed`&&e.agents.some(e=>e.phaseId===t.id&&e.prompt?.trim()))||e.agents.some(e=>(e.status===`error`||e.status===`skipped`)&&e.phaseId&&e.prompt?.trim())),Le=we.goal?.trim()||we.title,Re=ie.length>0||!!je,ze=!!xe||Te,Ve=e.controls.canRetry||Pe||Ie,Ue=se,We=ze||Ve||Ue;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(ve,{open:!0,onOpenChange:e=>!e&&m(),children:(0,$.jsxs)(be,{children:[(0,$.jsx)(Oe,{className:`xopc-dialog-overlay fixed inset-0 z-65 bg-scrim backdrop-blur-[1px]`}),(0,$.jsxs)(ge,{className:`fixed left-1/2 top-1/2 z-66 flex h-[min(90vh,52rem)] w-[min(100%-2rem,64rem)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,children:[(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-edge px-5 py-4`,children:[(0,$.jsx)(q,{className:`truncate text-base font-semibold tracking-tight text-fg`,children:Le}),(0,$.jsx)(X,{type:`button`,variant:`ghost`,className:`size-9 shrink-0 p-0`,"aria-label":h.pickStartClose,onClick:m,children:(0,$.jsx)(G,{className:`size-5`,"aria-hidden":!0})})]}),(0,$.jsxs)(`section`,{className:`min-h-0 flex-1 overflow-y-auto p-5`,children:[(0,$.jsxs)(`header`,{className:`rounded-2xl border border-edge-subtle bg-surface-base/60 p-4`,children:[(0,$.jsx)(`div`,{className:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between`,children:(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,$.jsx)(`h2`,{className:`text-lg font-semibold leading-7 text-fg`,children:Le}),(0,$.jsx)(`span`,{className:i(`rounded-full px-2 py-0.5 text-xs font-medium`,He(we.status)),children:$t(we.status,h)})]}),(0,$.jsxs)(`p`,{className:`mt-1 text-xs text-fg-subtle`,children:[we.title,` · `,we.definitionId]}),(0,$.jsx)(`p`,{className:`mt-3 text-sm leading-6 text-fg-muted`,children:De}),je?(0,$.jsx)(`p`,{className:`mt-2 text-xs leading-5 text-fg-subtle`,children:je}):null]})}),(0,$.jsxs)(`dl`,{className:`mt-4 grid gap-3 sm:grid-cols-2 lg:grid-cols-4`,children:[(0,$.jsx)(On,{label:h.metrics.startedAt,value:Ae(we.startedAtMs??we.createdAtMs,s)}),(0,$.jsx)(On,{label:h.metrics.duration,value:Ee}),(0,$.jsx)(On,{label:h.metrics.agents,value:Y(h.agentProgress,{done:we.metrics.doneAgentCount,total:we.metrics.agentCount})}),(0,$.jsx)(On,{label:h.metrics.artifacts,value:String(we.metrics.artifactCount)})]})]}),(0,$.jsx)(cn,{activeTab:w,onChange:T,labels:h,hasDiagnostics:Re,artifactCount:ae?.artifacts.length??e.artifacts.length}),w===`result`?(0,$.jsxs)(`section`,{className:`mt-5 space-y-4`,children:[se?(0,$.jsx)(`div`,{className:`rounded-xl border border-edge bg-surface-base/50 p-3`,children:(0,$.jsx)(Ce,{result:U,labels:g.result})}):(0,$.jsx)(`div`,{className:`rounded-xl border border-dashed border-edge p-4 text-sm text-fg-muted`,children:h.noResult}),We?(0,$.jsxs)(`section`,{className:`rounded-2xl border border-edge-subtle bg-surface-base/35 p-4`,children:[(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:h.nextActionsTitle}),(0,$.jsxs)(`div`,{className:`mt-3 grid gap-3 lg:grid-cols-3`,children:[ze?(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`h4`,{className:`text-xs font-medium text-fg-subtle`,children:h.primaryActionsTitle}),(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[xe?(0,$.jsxs)(X,{variant:`primary`,onClick:fe,children:[(0,$.jsx)(ke,{className:`size-4`,"aria-hidden":!0}),h.continueInChat]}):null,Te?(0,$.jsxs)(X,{variant:`secondary`,onClick:c,className:`text-red-600 dark:text-red-300`,children:[(0,$.jsx)(_e,{className:`size-4`,"aria-hidden":!0}),h.cancel]}):null]})]}):null,Ve?(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`h4`,{className:`text-xs font-medium text-fg-subtle`,children:h.recoveryActionsTitle}),(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[Pe?(0,$.jsxs)(X,{variant:`secondary`,onClick:()=>d(`failed_agents`),children:[(0,$.jsx)(A,{className:`size-4`,"aria-hidden":!0}),h.replayFailedAgents]}):null,Ie?(0,$.jsxs)(X,{variant:`secondary`,onClick:()=>d(`failed_phases`),children:[(0,$.jsx)(A,{className:`size-4`,"aria-hidden":!0}),h.replayFailedPhases]}):null,e.controls.canRetry?(0,$.jsxs)(X,{variant:`secondary`,onClick:l,children:[(0,$.jsx)(A,{className:`size-4`,"aria-hidden":!0}),h.rerun]}):null]})]}):null,Ue?(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`h4`,{className:`text-xs font-medium text-fg-subtle`,children:h.resultActionsTitle}),(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,$.jsxs)(X,{variant:`secondary`,onClick:ue,children:[j?(0,$.jsx)(_,{className:`size-4`,"aria-hidden":!0}):(0,$.jsx)(u,{className:`size-4`,"aria-hidden":!0}),j?h.copied:h.copyResult]}),(0,$.jsxs)(X,{variant:`secondary`,onClick:de,children:[(0,$.jsx)(W,{className:`size-4`,"aria-hidden":!0}),h.exportResult]})]})]}):null]})]}):null,(0,$.jsx)(dn,{view:e,comparison:t,labels:h,onOpenRunId:f})]}):null,w===`process`?(0,$.jsx)(ln,{snapshot:V,rollup:te,view:e,labels:h,cardLabels:g,isActive:B,processExpanded:y,logsExpanded:E,drawerAgentId:O,durationText:Ee,onToggleProcess:()=>b(e=>!e),onToggleLogs:()=>D(e=>!e),onSelectAgent:ne}):null,w===`diagnostics`?(0,$.jsx)(sn,{diagnostics:ie,labels:h,hint:je,onOpenAgent:ye}):null,w===`artifacts`?(0,$.jsx)(gn,{outcome:ae,labels:h,downloadingArtifactId:F,downloadError:ee,onCopyText:e=>void S(e),onDownloadArtifact:e=>void pe(e),onStartFollowUp:me}):null,w===`debug`?(0,$.jsx)(bn,{agents:V.agents,labels:h,metadataItems:[{label:h.metadataSession,value:Me?.sessionKey??K(e)??`—`},{label:h.metadataSource,value:Ne},{label:h.metadataDefinition,value:`${Me?.definition.version??we.definitionVersion} · ${Me?.definition.source??`unknown`}`},{label:h.metadataDefinitionHash,value:fn(Me?.definition,n,h)},{label:h.metadataPermissions,value:pn(Me?.definition)},{label:h.metadataRetryOf,value:Me?.retryOfRunId??`—`}],defaultExpanded:!0}):null]})]})]})}),(0,$.jsx)(N,{open:O!=null&&H!=null,agent:H,snapshot:V,sessionKey:null,ownerAgentId:p,onClose:()=>k(null),labels:g.drawer})]})}function sn(e){let t=(0,Q.c)(13),{diagnostics:n,labels:r,hint:i,onOpenAgent:a}=e;if(n.length===0&&!i)return null;let o;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=(0,$.jsx)(`div`,{className:`rounded-xl bg-rose-500/10 p-2 text-rose-700 dark:text-rose-300`,children:(0,$.jsx)(oe,{className:`size-4`,"aria-hidden":!0})}),t[0]=o):o=t[0];let s;t[1]===r.reliabilityTitle?s=t[2]:(s=(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:r.reliabilityTitle}),t[1]=r.reliabilityTitle,t[2]=s);let c=i??r.reliabilityHint,l;t[3]===c?l=t[4]:(l=(0,$.jsx)(`p`,{className:`mt-1 text-xs leading-5 text-fg-subtle`,children:c}),t[3]=c,t[4]=l);let u;t[5]!==n||t[6]!==r||t[7]!==a?(u=n.length>0?(0,$.jsx)(`ul`,{className:`mt-3 space-y-2`,children:n.slice(0,5).map(e=>(0,$.jsx)(`li`,{className:`rounded-xl border border-edge-subtle bg-surface-panel px-3 py-2`,children:(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:un(e,r)}),e.message?(0,$.jsx)(`div`,{className:`mt-0.5 text-xs leading-5 text-fg-muted`,children:e.message}):null,e.detail?(0,$.jsx)(`div`,{className:`mt-0.5 line-clamp-2 text-xs leading-5 text-fg-subtle`,children:e.detail}):null]}),e.agentId==null?null:(0,$.jsx)(X,{type:`button`,variant:`ghost`,className:`h-8 shrink-0 px-2 text-xs`,onClick:()=>a(e.agentId),children:r.openAgentDetails})]})},e.key))}):null,t[5]=n,t[6]=r,t[7]=a,t[8]=u):u=t[8];let d;return t[9]!==s||t[10]!==l||t[11]!==u?(d=(0,$.jsx)(`section`,{className:`mt-5 rounded-2xl border border-rose-500/20 bg-rose-500/5 p-4`,children:(0,$.jsxs)(`div`,{className:`flex items-start gap-3`,children:[o,(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[s,l,u]})]})}),t[9]=s,t[10]=l,t[11]=u,t[12]=d):d=t[12],d}function cn(e){let t=(0,Q.c)(22),{activeTab:n,onChange:r,labels:a,hasDiagnostics:o,artifactCount:s}=e,c;t[0]===a.resultTitle?c=t[1]:(c={id:`result`,label:a.resultTitle},t[0]=a.resultTitle,t[1]=c);let l;t[2]===a.process?l=t[3]:(l={id:`process`,label:a.process},t[2]=a.process,t[3]=l);let u=o?1:void 0,d;t[4]!==a.diagnosticsTitle||t[5]!==u?(d={id:`diagnostics`,label:a.diagnosticsTitle,count:u},t[4]=a.diagnosticsTitle,t[5]=u,t[6]=d):d=t[6];let f=s||void 0,p;t[7]!==a.outcomeArtifacts||t[8]!==f?(p={id:`artifacts`,label:a.outcomeArtifacts,count:f},t[7]=a.outcomeArtifacts,t[8]=f,t[9]=p):p=t[9];let m;t[10]===a.debugDetailsTitle?m=t[11]:(m={id:`debug`,label:a.debugDetailsTitle},t[10]=a.debugDetailsTitle,t[11]=m);let h;t[12]!==c||t[13]!==l||t[14]!==d||t[15]!==p||t[16]!==m?(h=[c,l,d,p,m],t[12]=c,t[13]=l,t[14]=d,t[15]=p,t[16]=m,t[17]=h):h=t[17];let g=h,_;return t[18]!==n||t[19]!==r||t[20]!==g?(_=(0,$.jsx)(`div`,{className:`mt-5 flex overflow-x-auto border-b border-edge pb-2`,children:(0,$.jsx)(`div`,{className:`-mx-1 flex gap-1 overflow-x-auto px-1 pb-1`,role:`tablist`,children:g.map(e=>(0,$.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":n===e.id,onClick:()=>r(e.id),className:i(`inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium`,We.focusRingPanel,We.press,n===e.id?`bg-accent-soft text-accent-fg`:`text-fg-muted hover:bg-surface-hover hover:text-fg`),children:[e.label,e.count?(0,$.jsx)(`span`,{className:`rounded-full bg-surface-hover px-1.5 py-0.5 text-[10px] tabular-nums text-fg-subtle`,children:e.count}):null]},e.id))})}),t[18]=n,t[19]=r,t[20]=g,t[21]=_):_=t[21],_}function ln(e){let t=(0,Q.c)(36),{snapshot:n,rollup:r,view:a,labels:o,cardLabels:s,isActive:c,processExpanded:l,logsExpanded:u,drawerAgentId:d,durationText:f,onToggleProcess:p,onToggleLogs:m,onSelectAgent:h}=e,g;t[0]===o.process?g=t[1]:(g=(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:o.process}),t[0]=o.process,t[1]=g);let _;t[2]!==o.agentProgress||t[3]!==a.run.metrics.agentCount||t[4]!==a.run.metrics.doneAgentCount?(_=Y(o.agentProgress,{done:a.run.metrics.doneAgentCount,total:a.run.metrics.agentCount}),t[2]=o.agentProgress,t[3]=a.run.metrics.agentCount,t[4]=a.run.metrics.doneAgentCount,t[5]=_):_=t[5];let v;t[6]!==f||t[7]!==_?(v=(0,$.jsxs)(`p`,{className:`mt-1 text-xs text-fg-subtle`,children:[_,` · `,f]}),t[6]=f,t[7]=_,t[8]=v):v=t[8];let y;t[9]!==g||t[10]!==v?(y=(0,$.jsxs)(`div`,{className:`min-w-0`,children:[g,v]}),t[9]=g,t[10]=v,t[11]=y):y=t[11];let b=l?`rotate-180`:null,x;t[12]===b?x=t[13]:(x=i(`size-4 shrink-0 text-fg-subtle transition-transform`,b),t[12]=b,t[13]=x);let S;t[14]===x?S=t[15]:(S=(0,$.jsx)(R,{className:x,"aria-hidden":!0}),t[14]=x,t[15]=S);let C;t[16]!==p||t[17]!==l||t[18]!==y||t[19]!==S?(C=(0,$.jsxs)(`button`,{type:`button`,className:`flex w-full items-center justify-between gap-4 px-4 py-3 text-left`,onClick:p,"aria-expanded":l,children:[y,S]}),t[16]=p,t[17]=l,t[18]=y,t[19]=S,t[20]=C):C=t[20];let w;t[21]!==s||t[22]!==d||t[23]!==c||t[24]!==o||t[25]!==u||t[26]!==h||t[27]!==m||t[28]!==l||t[29]!==r||t[30]!==n||t[31]!==a.phases?(w=l?(0,$.jsxs)(`div`,{className:`border-t border-edge px-4 pb-4 pt-4`,children:[c?(0,$.jsx)(M,{snapshot:n,labels:s,logsExpanded:u,onToggleLogs:m,selectedAgentId:d,onSelectAgent:h}):(0,$.jsx)(j,{rollup:r,currentPhase:n.currentPhase,labels:s.phase,recentLogs:n.logs,recentLogsHeading:s.recentLogsHeading,showAllLogsLabel:s.showAllLogs,logsExpanded:u,onToggleLogs:m,selectedAgentId:d,onSelectAgent:h}),a.phases.length>0?(0,$.jsx)(`div`,{className:`mt-4 grid gap-2 sm:grid-cols-2`,children:a.phases.map(e=>(0,$.jsx)(`div`,{className:`rounded-xl border border-edge bg-surface-panel px-3 py-2`,children:(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,$.jsx)(`span`,{className:`text-sm font-medium text-fg`,children:e.title}),(0,$.jsx)(`span`,{className:`text-xs text-fg-subtle`,children:en(e.status,o)})]})},e.id))}):null]}):null,t[21]=s,t[22]=d,t[23]=c,t[24]=o,t[25]=u,t[26]=h,t[27]=m,t[28]=l,t[29]=r,t[30]=n,t[31]=a.phases,t[32]=w):w=t[32];let T;return t[33]!==C||t[34]!==w?(T=(0,$.jsxs)(`div`,{className:`mt-5 rounded-2xl border border-edge bg-surface-base/35`,children:[C,w]}),t[33]=C,t[34]=w,t[35]=T):T=t[35],T}function un(e,t){return e.kind===`run_error`?e.code?Y(t.diagnosticsRunErrorWithCode,{code:e.code}):t.diagnosticsRunError:e.kind===`agent_error`?Y(t.diagnosticsAgentError,{agent:e.agentLabel??String(e.agentId??`—`)}):e.kind===`step_error`?Y(t.diagnosticsStepError,{agent:e.agentLabel??String(e.agentId??`—`),step:e.stepLabel??e.stepId??`—`}):Y(t.diagnosticsAgentSkipped,{agent:e.agentLabel??String(e.agentId??`—`)})}function dn(e){let t=(0,Q.c)(36),{view:n,comparison:r,labels:i,onOpenRunId:a}=e,o=n.run.metadata?.replay;if(!o)return null;let s;t[0]===i.replayLineageTitle?s=t[1]:(s=(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:i.replayLineageTitle}),t[0]=i.replayLineageTitle,t[1]=s);let c;t[2]!==i||t[3]!==o.scope||t[4]!==o.targetCount?(c=Y(i.replayLineageSummary,{scope:hn(o.scope,i),count:o.targetCount}),t[2]=i,t[3]=o.scope,t[4]=o.targetCount,t[5]=c):c=t[5];let l;t[6]===c?l=t[7]:(l=(0,$.jsx)(`p`,{className:`mt-1 text-xs leading-5 text-fg-subtle`,children:c}),t[6]=c,t[7]=l);let u;t[8]!==i.replaySourceRun||t[9]!==o.sourceRunId?(u=(0,$.jsx)(kn,{label:i.replaySourceRun,value:o.sourceRunId}),t[8]=i.replaySourceRun,t[9]=o.sourceRunId,t[10]=u):u=t[10];let d=i.replayTargetAgents,f;t[11]===o.agentIds?f=t[12]:(f=o.agentIds.join(`, `),t[11]=o.agentIds,t[12]=f);let p;t[13]!==i.replayTargetAgents||t[14]!==f?(p=(0,$.jsx)(kn,{label:d,value:f}),t[13]=i.replayTargetAgents,t[14]=f,t[15]=p):p=t[15];let m;t[16]!==u||t[17]!==p?(m=(0,$.jsxs)(`dl`,{className:`mt-3 grid gap-2 text-xs sm:grid-cols-2`,children:[u,p]}),t[16]=u,t[17]=p,t[18]=m):m=t[18];let h;t[19]!==r||t[20]!==i.replayDurationDelta||t[21]!==i.replayFixedAgents||t[22]!==i.replayStillFailingAgents?(h=r?(0,$.jsxs)(`div`,{className:`mt-3 grid gap-2 sm:grid-cols-3`,children:[(0,$.jsx)(On,{label:i.replayFixedAgents,value:String(r.fixedAgentIds.length)}),(0,$.jsx)(On,{label:i.replayStillFailingAgents,value:String(r.stillFailingAgentIds.length)}),(0,$.jsx)(On,{label:i.replayDurationDelta,value:mn(r.durationDeltaMs)})]}):null,t[19]=r,t[20]=i.replayDurationDelta,t[21]=i.replayFixedAgents,t[22]=i.replayStillFailingAgents,t[23]=h):h=t[23];let g;t[24]!==s||t[25]!==l||t[26]!==m||t[27]!==h?(g=(0,$.jsxs)(`div`,{className:`min-w-0`,children:[s,l,m,h]}),t[24]=s,t[25]=l,t[26]=m,t[27]=h,t[28]=g):g=t[28];let _;t[29]!==i.replayOpenSource||t[30]!==a||t[31]!==o.sourceRunId?(_=a?(0,$.jsx)(X,{type:`button`,variant:`secondary`,className:`shrink-0`,onClick:()=>a(o.sourceRunId),children:i.replayOpenSource}):null,t[29]=i.replayOpenSource,t[30]=a,t[31]=o.sourceRunId,t[32]=_):_=t[32];let v;return t[33]!==g||t[34]!==_?(v=(0,$.jsx)(`section`,{className:`mt-5 rounded-2xl border border-edge-subtle bg-surface-base/35 p-4`,children:(0,$.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[g,_]})}),t[33]=g,t[34]=_,t[35]=v):v=t[35],v}function fn(e,t,n){if(!e?.contentHash)return n.definitionHashUnavailable;let r=e.contentHash.slice(0,8);return t?.contentHash?t.contentHash===e.contentHash?`${r} · ${n.definitionHashMatches}`:`${r} · ${n.definitionHashDrifted}`:`${r} · ${n.definitionHashCurrentUnknown}`}function pn(e){let t=e?.permissions;if(!t)return`—`;let n=[t.tools?.length?`tools:${t.tools.join(`,`)}`:null,t.network==null?null:`network:${t.network?`on`:`off`}`,t.fileSystem?`fs:${t.fileSystem}`:null,t.approvalRequired?`approval`:null].filter(Boolean);return n.length>0?n.join(` · `):`—`}function mn(e){return e==null?`—`:`${e>0?`+`:e<0?`-`:``}${he(Math.abs(e))}`}function hn(e,t){return e===`failed_phases`?t.replayScopeFailedPhases:t.replayScopeFailedAgents}function gn(e){let t=(0,Q.c)(20),{outcome:n,labels:r,downloadingArtifactId:i,downloadError:a,onCopyText:o,onDownloadArtifact:s,onStartFollowUp:c}=e;if(!n||!n.artifacts.length&&!n.followUps.length&&n.structuredOutput===void 0){let e;return t[0]===r.noArtifacts?e=t[1]:(e=(0,$.jsx)(`section`,{className:`mt-5 rounded-xl border border-dashed border-edge p-4 text-sm text-fg-muted`,children:r.noArtifacts}),t[0]=r.noArtifacts,t[1]=e),e}let l;t[2]!==a||t[3]!==i||t[4]!==r||t[5]!==s||t[6]!==n.artifacts?(l=n.artifacts.length>0?(0,$.jsxs)(vn,{title:r.outcomeArtifacts,children:[(0,$.jsx)(`ul`,{className:`space-y-2`,children:n.artifacts.map(e=>(0,$.jsxs)(`li`,{className:`min-w-0 rounded-lg bg-surface-base px-2.5 py-2`,children:[(0,$.jsx)(`div`,{className:`truncate text-sm font-medium text-fg`,title:e.title??e.name,children:e.title??e.name}),(0,$.jsx)(`div`,{className:`mt-0.5 text-xs text-fg-subtle`,children:e.mimeType}),(0,$.jsxs)(`button`,{type:`button`,className:`mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent-fg hover:underline disabled:cursor-wait disabled:opacity-60`,disabled:i===e.id,onClick:()=>s(e),children:[(0,$.jsx)(W,{className:`size-3`,"aria-hidden":!0}),i===e.id?r.downloadingArtifact:r.downloadArtifact]})]},e.id))}),a?(0,$.jsx)(`p`,{className:`mt-2 text-xs leading-5 text-rose-600 dark:text-rose-400`,children:a}):null]}):null,t[2]=a,t[3]=i,t[4]=r,t[5]=s,t[6]=n.artifacts,t[7]=l):l=t[7];let u;t[8]!==r||t[9]!==o||t[10]!==c||t[11]!==n.followUps?(u=n.followUps.length>0?(0,$.jsx)(vn,{title:r.outcomeFollowUps,children:(0,$.jsx)(`ul`,{className:`space-y-2`,children:n.followUps.map(e=>(0,$.jsxs)(`li`,{className:`rounded-lg bg-surface-base px-2.5 py-2`,children:[(0,$.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:e.title}),e.prompt?(0,$.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-2`,children:[(0,$.jsx)(`button`,{type:`button`,className:`text-xs font-medium text-accent-fg hover:underline`,onClick:()=>c(e),children:r.startFollowUp}),(0,$.jsx)(`button`,{type:`button`,className:`text-xs font-medium text-fg-subtle hover:text-fg`,onClick:()=>o(e.prompt??``),children:r.copyPrompt})]}):null]},e.id))})}):null,t[8]=r,t[9]=o,t[10]=c,t[11]=n.followUps,t[12]=u):u=t[12];let d;t[13]!==r||t[14]!==n.structuredOutput?(d=n.structuredOutput===void 0?null:(0,$.jsx)(vn,{title:r.outcomeStructuredOutput,children:(0,$.jsx)(`pre`,{className:`max-h-44 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-surface-base p-2 font-mono text-xs leading-5 text-fg-muted`,children:ce(n.structuredOutput)})}),t[13]=r,t[14]=n.structuredOutput,t[15]=d):d=t[15];let f;return t[16]!==l||t[17]!==u||t[18]!==d?(f=(0,$.jsxs)(`div`,{className:`mt-5 grid gap-3 lg:grid-cols-3`,children:[l,u,d]}),t[16]=l,t[17]=u,t[18]=d,t[19]=f):f=t[19],f}function _n(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),URL.revokeObjectURL(n)}function vn(e){let t=(0,Q.c)(7),{title:n,children:r}=e,i;t[0]===n?i=t[1]:(i=(0,$.jsx)(`h4`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-subtle`,children:n}),t[0]=n,t[1]=i);let a;t[2]===r?a=t[3]:(a=(0,$.jsx)(`div`,{className:`mt-2`,children:r}),t[2]=r,t[3]=a);let o;return t[4]!==i||t[5]!==a?(o=(0,$.jsxs)(`section`,{className:`min-w-0 rounded-xl border border-edge-subtle bg-surface-base/35 p-3`,children:[i,a]}),t[4]=i,t[5]=a,t[6]=o):o=t[6],o}function yn(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=Array.isArray(t.artifacts)?t.artifacts:[],r=Array.isArray(t.followUps)?t.followUps:[];return n.length===0&&r.length===0&&t.structuredOutput===void 0?null:{artifacts:n,followUps:r,structuredOutput:t.structuredOutput}}function bn(e){let t=(0,Q.c)(27),{agents:n,labels:r,metadataItems:a,defaultExpanded:o}=e,[s,c]=(0,Z.useState)(o),l,u;t[0]===o?(l=t[1],u=t[2]):(l=()=>{c(o)},u=[o],t[0]=o,t[1]=l,t[2]=u),(0,Z.useEffect)(l,u);let d;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(d=()=>c(Sn),t[3]=d):d=t[3];let f;t[4]===r.debugDetailsTitle?f=t[5]:(f=(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:r.debugDetailsTitle}),t[4]=r.debugDetailsTitle,t[5]=f);let p;t[6]===r.debugDetailsHint?p=t[7]:(p=(0,$.jsx)(`p`,{className:`text-xs leading-5 text-fg-subtle`,children:r.debugDetailsHint}),t[6]=r.debugDetailsHint,t[7]=p);let m;t[8]!==f||t[9]!==p?(m=(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[f,p]}),t[8]=f,t[9]=p,t[10]=m):m=t[10];let h=s?`rotate-180`:null,g;t[11]===h?g=t[12]:(g=i(`mt-0.5 size-4 shrink-0 text-fg-subtle transition-transform`,h),t[11]=h,t[12]=g);let _;t[13]===g?_=t[14]:(_=(0,$.jsx)(R,{className:g,"aria-hidden":!0}),t[13]=g,t[14]=_);let v;t[15]!==s||t[16]!==m||t[17]!==_?(v=(0,$.jsxs)(`button`,{type:`button`,className:`flex w-full items-start justify-between gap-4 px-4 py-3 text-left`,onClick:d,"aria-expanded":s,children:[m,_]}),t[15]=s,t[16]=m,t[17]=_,t[18]=v):v=t[18];let y;t[19]!==n||t[20]!==s||t[21]!==r||t[22]!==a?(y=s?(0,$.jsxs)(`div`,{className:`border-t border-edge px-4 py-4`,children:[(0,$.jsx)(Cn,{agents:n,labels:r}),(0,$.jsx)(`div`,{className:`mt-4 grid gap-3 rounded-xl border border-edge-subtle bg-surface-panel/60 p-3 sm:grid-cols-2 lg:grid-cols-3`,children:a.map(xn)})]}):null,t[19]=n,t[20]=s,t[21]=r,t[22]=a,t[23]=y):y=t[23];let b;return t[24]!==v||t[25]!==y?(b=(0,$.jsxs)(`section`,{className:`mt-6 rounded-2xl border border-edge bg-surface-base/35`,children:[v,y]}),t[24]=v,t[25]=y,t[26]=b):b=t[26],b}function xn(e){return(0,$.jsx)(kn,{label:e.label,value:e.value},e.label)}function Sn(e){return!e}function Cn(e){let t=(0,Q.c)(15),{agents:n,labels:r}=e;if(n.length===0)return null;let a;t[0]===r.agentIoTitle?a=t[1]:(a=(0,$.jsx)(`h4`,{className:`text-sm font-semibold text-fg`,children:r.agentIoTitle}),t[0]=r.agentIoTitle,t[1]=a);let o;t[2]===r.agentIoHint?o=t[3]:(o=(0,$.jsx)(`p`,{className:`mt-1 text-xs leading-5 text-fg-subtle`,children:r.agentIoHint}),t[2]=r.agentIoHint,t[3]=o);let s;if(t[4]!==n||t[5]!==r){let e;t[7]===r?e=t[8]:(e=e=>{let t=e.error||e.resultPreview||r.agentNoOutput;return(0,$.jsxs)(`article`,{className:`rounded-xl border border-edge-subtle bg-surface-panel p-3`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,$.jsx)(`div`,{className:`min-w-0 text-sm font-medium text-fg`,children:e.label}),(0,$.jsx)(`span`,{className:i(`rounded-full px-2 py-0.5 text-xs font-medium`,Dn(e.status)),children:r.agentStatus[e.status]??e.status})]}),(0,$.jsxs)(`div`,{className:`mt-3 grid gap-3 lg:grid-cols-2`,children:[(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-[10px] font-medium uppercase tracking-wide text-fg-subtle`,children:r.agentInputHeading}),(0,$.jsx)(`pre`,{className:`mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap wrap-break-word rounded-lg border border-edge-subtle bg-surface-base/50 p-2 font-mono text-xs leading-5 text-fg-muted`,children:e.prompt||`—`})]}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-[10px] font-medium uppercase tracking-wide text-fg-subtle`,children:r.agentOutputHeading}),(0,$.jsx)(`div`,{className:i(`mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap wrap-break-word rounded-lg border border-edge-subtle bg-surface-base/50 p-2 text-xs leading-5`,e.error?`font-mono text-rose-600 dark:text-rose-400`:`text-fg-muted`),children:t})]})]}),(0,$.jsx)(wn,{agent:e,labels:r})]},e.id)},t[7]=r,t[8]=e),s=n.map(e),t[4]=n,t[5]=r,t[6]=s}else s=t[6];let c;t[9]===s?c=t[10]:(c=(0,$.jsx)(`div`,{className:`mt-3 grid gap-3`,children:s}),t[9]=s,t[10]=c);let l;return t[11]!==a||t[12]!==o||t[13]!==c?(l=(0,$.jsxs)(`section`,{children:[a,o,c]}),t[11]=a,t[12]=o,t[13]=c,t[14]=l):l=t[14],l}function wn(e){let t=(0,Q.c)(21),{agent:n,labels:r}=e,i=n.invocation;if(!i)return null;let a=i.resolvedModelRef??i.modelRef,o;t[0]!==r.agentInvocationModel||t[1]!==a?(o={label:r.agentInvocationModel,value:a},t[0]=r.agentInvocationModel,t[1]=a,t[2]=o):o=t[2];let s;t[3]===i.toolset?s=t[4]:(s=i.toolset?.join(`, `),t[3]=i.toolset,t[4]=s);let c;t[5]!==r.agentInvocationTools||t[6]!==s?(c={label:r.agentInvocationTools,value:s},t[5]=r.agentInvocationTools,t[6]=s,t[7]=c):c=t[7];let l=i.maxIterations==null?void 0:String(i.maxIterations),u;t[8]!==r.agentInvocationIterations||t[9]!==l?(u={label:r.agentInvocationIterations,value:l},t[8]=r.agentInvocationIterations,t[9]=l,t[10]=u):u=t[10];let d=i.schema?r.agentInvocationSchemaPresent:void 0,f;t[11]!==r.agentInvocationSchema||t[12]!==d?(f={label:r.agentInvocationSchema,value:d},t[11]=r.agentInvocationSchema,t[12]=d,t[13]=f):f=t[13];let p;t[14]!==o||t[15]!==c||t[16]!==u||t[17]!==f?(p=[o,c,u,f].filter(En),t[14]=o,t[15]=c,t[16]=u,t[17]=f,t[18]=p):p=t[18];let m=p;if(m.length===0)return null;let h;return t[19]===m?h=t[20]:(h=(0,$.jsx)(`dl`,{className:`mt-3 grid gap-2 border-t border-edge-subtle pt-3 text-xs sm:grid-cols-2 lg:grid-cols-4`,children:m.map(Tn)}),t[19]=m,t[20]=h),h}function Tn(e){return(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`dt`,{className:`text-fg-subtle`,children:e.label}),(0,$.jsx)(`dd`,{className:`mt-0.5 truncate font-medium text-fg-muted`,title:e.value,children:e.value})]},e.label)}function En(e){return!!e.value}function Dn(e){return e===`done`?`bg-emerald-500/10 text-emerald-700 dark:text-emerald-300`:e===`error`?`bg-rose-500/10 text-rose-700 dark:text-rose-300`:e===`running`?`bg-accent-soft text-accent-fg`:`bg-surface-hover text-fg-subtle`}function On(e){let t=(0,Q.c)(7),{label:n,value:r}=e,i;t[0]===n?i=t[1]:(i=(0,$.jsx)(`dt`,{className:`text-xs text-fg-subtle`,children:n}),t[0]=n,t[1]=i);let a;t[2]===r?a=t[3]:(a=(0,$.jsx)(`dd`,{className:`mt-1 text-sm font-semibold text-fg`,children:r}),t[2]=r,t[3]=a);let o;return t[4]!==i||t[5]!==a?(o=(0,$.jsxs)(`div`,{className:`rounded-xl border border-edge bg-surface-base/40 p-3`,children:[i,a]}),t[4]=i,t[5]=a,t[6]=o):o=t[6],o}function kn(e){let t=(0,Q.c)(7),{label:n,value:r}=e,i;t[0]===n?i=t[1]:(i=(0,$.jsx)(`div`,{className:`text-xs text-fg-subtle`,children:n}),t[0]=n,t[1]=i);let a;t[2]===r?a=t[3]:(a=(0,$.jsx)(`div`,{className:`mt-1 truncate text-sm font-medium text-fg`,title:r,children:r}),t[2]=r,t[3]=a);let o;return t[4]!==i||t[5]!==a?(o=(0,$.jsxs)(`div`,{className:`min-w-0`,children:[i,a]}),t[4]=i,t[5]=a,t[6]=o):o=t[6],o}var An=`mt-1.5 w-full rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`;function jn(e){return!!(e&&e.type===`object`&&e.properties&&!Array.isArray(e.properties))}function Mn({schema:e,value:t,onChange:n,labels:r}){let a=(0,Z.useMemo)(()=>Fn(e),[e]),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(()=>JSON.stringify(t,null,2)),[u,d]=(0,Z.useState)(null);if(a.length===0)return null;let f=(e,r)=>{let i={...t,[e]:r};(r===``||r===void 0)&&delete i[e],n(i),o&&l(JSON.stringify(i,null,2))},p=e=>{l(e);try{let t=e.trim()?JSON.parse(e):{};if(!t||typeof t!=`object`||Array.isArray(t)){d(r.rawJsonInvalid);return}d(null),n(t)}catch{d(r.rawJsonInvalid)}};return(0,$.jsxs)(`section`,{className:`rounded-2xl border border-edge-subtle bg-surface-base/35 p-4`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:r.inputSchemaHeading}),(0,$.jsx)(`button`,{type:`button`,className:`text-xs font-medium text-accent-fg hover:underline`,onClick:()=>{let e=!o;s(e),e&&(l(JSON.stringify(t,null,2)),d(null))},children:r.rawJson})]}),o?(0,$.jsxs)(`div`,{className:`mt-3`,children:[(0,$.jsx)(`textarea`,{value:c,onChange:e=>p(e.target.value),spellCheck:!1,className:i(An,`min-h-40 font-mono text-xs leading-5`)}),u?(0,$.jsx)(`p`,{className:`mt-1 text-xs text-red-600 dark:text-red-300`,children:u}):null]}):(0,$.jsx)(`div`,{className:`mt-3 grid gap-3`,children:a.map(e=>(0,$.jsx)(Nn,{field:e,value:t[e.key],labels:r,onChange:t=>f(e.key,t)},e.key))})]})}function Nn(e){let t=(0,Q.c)(18),{field:n,value:r,labels:a,onChange:o}=e,s=n.schema.title||n.key,c=typeof n.schema.description==`string`?n.schema.description:void 0,l=Array.isArray(n.schema.type)?n.schema.type[0]:n.schema.type,u;t[0]===n.schema.enum?u=t[1]:(u=Array.isArray(n.schema.enum)?n.schema.enum:[],t[0]=n.schema.enum,t[1]=u);let d=u,f=String(s),p=n.required?` *`:``,m;t[2]!==f||t[3]!==p?(m=(0,$.jsxs)(`span`,{className:`text-xs font-medium text-fg`,children:[f,p]}),t[2]=f,t[3]=p,t[4]=m):m=t[4];let h;t[5]===c?h=t[6]:(h=c?(0,$.jsx)(`p`,{className:`mt-0.5 text-xs leading-5 text-fg-subtle`,children:c}):null,t[5]=c,t[6]=h);let g;t[7]!==c||t[8]!==d||t[9]!==a||t[10]!==o||t[11]!==l||t[12]!==r?(g=d.length>0?(0,$.jsxs)(`select`,{value:r==null?``:String(r),onChange:e=>o(e.target.value),className:An,children:[(0,$.jsx)(`option`,{value:``}),d.map(Pn)]}):l===`boolean`?(0,$.jsxs)(`select`,{value:typeof r==`boolean`?String(r):``,onChange:e=>o(e.target.value===``?void 0:e.target.value===`true`),className:An,children:[(0,$.jsx)(`option`,{value:``}),(0,$.jsx)(`option`,{value:`true`,children:a.booleanTrue}),(0,$.jsx)(`option`,{value:`false`,children:a.booleanFalse})]}):l===`number`||l===`integer`?(0,$.jsx)(`input`,{type:`number`,value:typeof r==`number`||typeof r==`string`?String(r):``,onChange:e=>o(e.target.value===``?void 0:Number(e.target.value)),className:An}):(0,$.jsx)(`textarea`,{value:typeof r==`string`?r:r==null?``:String(r),onChange:e=>o(e.target.value),className:i(An,c&&c.length>80?`min-h-20 resize-y`:`min-h-10 resize-y`)}),t[7]=c,t[8]=d,t[9]=a,t[10]=o,t[11]=l,t[12]=r,t[13]=g):g=t[13];let _;return t[14]!==m||t[15]!==h||t[16]!==g?(_=(0,$.jsxs)(`label`,{className:`block`,children:[m,h,g]}),t[14]=m,t[15]=h,t[16]=g,t[17]=_):_=t[17],_}function Pn(e){return(0,$.jsx)(`option`,{value:String(e),children:String(e)},String(e))}function Fn(e){let t=e.properties??{},n=new Set(e.required??[]);return Object.entries(t).map(([e,t])=>({key:e,schema:t,required:n.has(e)}))}function In(e){let t=(0,Q.c)(12),{examples:n,labels:r,onSelect:i}=e;if(n.length===0)return null;let a;t[0]===r.examplePrompts?a=t[1]:(a=(0,$.jsx)(`div`,{className:`text-xs font-medium text-fg-muted`,children:r.examplePrompts}),t[0]=r.examplePrompts,t[1]=a);let o;if(t[2]!==n||t[3]!==i){let e;t[5]===i?e=t[6]:(e=e=>(0,$.jsx)(`button`,{type:`button`,onClick:()=>i(e),className:`rounded-lg border border-edge bg-surface-base/50 px-3 py-2 text-left text-xs text-fg-muted hover:bg-surface-hover`,children:e.text},`${e.field}:${e.text}`),t[5]=i,t[6]=e),o=n.map(e),t[2]=n,t[3]=i,t[4]=o}else o=t[4];let s;t[7]===o?s=t[8]:(s=(0,$.jsx)(`div`,{className:`mt-2 flex flex-col gap-1.5`,children:o}),t[7]=o,t[8]=s);let c;return t[9]!==a||t[10]!==s?(c=(0,$.jsxs)(`div`,{children:[a,s]}),t[9]=a,t[10]=s,t[11]=c):c=t[11],c}function Ln(e,t){let n=e.metadata.estimatedAgents;return n?n.min===n.max?Y(t.agentScaleExact,{count:n.min}):Y(t.agentScaleRange,{min:n.min,max:n.max}):Y(t.agentScaleExact,{count:e.defaults.maxSubagents})}function Rn(e,t,n,r){let i=Object.values(t).map(e=>e.trim()).filter(Boolean),a=e.trim()||n;return a&&i.unshift(a),i.length===0?r.noInputSummary:i.join(` · `)}function zn(e){let t=(0,Q.c)(58),{open:n,definition:r,language:o,starting:s,onClose:c,onStart:l}=e,u=a(o).workflows,[d,p]=(0,Z.useState)(``),m;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(m={},t[0]=m):m=t[0];let[g,_]=(0,Z.useState)(m),v;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(v={},t[1]=v):v=t[1];let[y,b]=(0,Z.useState)(v),[x,S]=(0,Z.useState)(``),[C,w]=(0,Z.useState)(``),[T,E]=(0,Z.useState)(!1),D;t[2]!==r||t[3]!==o?(D=r?f(r,o):null,t[2]=r,t[3]=o,t[4]=D):D=t[4];let O=D,k;t[5]===r?k=t[6]:(k=r?Re[r.name]??[]:[],t[5]=r,t[6]=k);let A=k,j;t[7]===O?.examplePrompts?j=t[8]:(j=O?.examplePrompts??[],t[7]=O?.examplePrompts,t[8]=j);let M=j,ee=r?.inputSchema,N;t[9]===ee?N=t[10]:(N=jn(ee),t[9]=ee,t[10]=N);let P=N,F=!P&&A.length>0,I;t[11]!==x||t[12]!==r?.defaults?(I=x.trim()?Number(x):r?.defaults.concurrency,t[11]=x,t[12]=r?.defaults,t[13]=I):I=t[13];let L=I,z;t[14]!==r?.defaults||t[15]!==C?(z=C.trim()?Number(C):r?.defaults.maxSubagents,t[14]=r?.defaults,t[15]=C,t[16]=z):z=t[16];let B=z,V=r&&O?P&&Object.keys(y).length>0?Object.entries(y).map(Hn).join(` · `):Rn(d,g,O.description,u):u.noInputSummary,te;t[17]!==r||t[18]!==n?(te=()=>{!n||!r||(p(``),_({}),b({}),S(``),w(``),E(!1))},t[17]=r,t[18]=n,t[19]=te):te=t[19];let H=r?.id,ne;if(t[20]!==n||t[21]!==H?(ne=[n,H],t[20]=n,t[21]=H,t[22]=ne):ne=t[22],(0,Z.useEffect)(te,ne),!r||!O)return null;let re;t[23]===Symbol.for(`react.memo_cache_sentinel`)?(re=e=>{Te(e,p,_)},t[23]=re):re=t[23];let ie=re,U;t[24]!==g||t[25]!==x||t[26]!==d||t[27]!==P||t[28]!==O.description||t[29]!==C||t[30]!==l||t[31]!==y?(U=()=>{let e=P&&Object.keys(y).length>0?y:Ee(g);l({goal:d.trim()||O.description,input:e,concurrency:x.trim()?Number(x):void 0,maxSubagents:C.trim()?Number(C):void 0})},t[24]=g,t[25]=x,t[26]=d,t[27]=P,t[28]=O.description,t[29]=C,t[30]=l,t[31]=y,t[32]=U):U=t[32];let W=U,ae;t[33]===c?ae=t[34]:(ae=e=>!e&&c(),t[33]=c,t[34]=ae);let G;t[35]===Symbol.for(`react.memo_cache_sentinel`)?(G=(0,$.jsx)(Oe,{className:`xopc-dialog-overlay fixed inset-0 z-65 bg-scrim backdrop-blur-[1px]`}),t[35]=G):G=t[35];let K;t[36]===O.description?K=t[37]:(K=(0,$.jsx)(je,{className:`mt-1 text-sm text-fg-muted`,children:O.description}),t[36]=O.description,t[37]=K);let oe;t[38]===Symbol.for(`react.memo_cache_sentinel`)?(oe=(0,$.jsx)(ze,{className:`size-3.5 shrink-0 text-fg-subtle`,"aria-hidden":!0}),t[38]=oe):oe=t[38];let se;t[39]===Symbol.for(`react.memo_cache_sentinel`)?(se=(0,$.jsx)(pe,{className:`size-3.5 shrink-0 text-fg-subtle`,"aria-hidden":!0}),t[39]=se):se=t[39];let ce;t[40]===Symbol.for(`react.memo_cache_sentinel`)?(ce=(0,$.jsx)(h,{className:`size-3.5 shrink-0 text-fg-subtle`,"aria-hidden":!0}),t[40]=ce):ce=t[40];let le;t[41]===Symbol.for(`react.memo_cache_sentinel`)?(le=e=>p(e.target.value),t[41]=le):le=t[41];let ue;t[42]===Symbol.for(`react.memo_cache_sentinel`)?(ue=()=>E(Bn),t[42]=ue):ue=t[42];let fe=u.advancedSettings,me=T&&`rotate-180`,he;t[43]===me?he=t[44]:(he=i(`size-4 transition-transform`,me),t[43]=me,t[44]=he);let _e;t[45]===he?_e=t[46]:(_e=(0,$.jsx)(R,{className:he}),t[45]=he,t[46]=_e);let J;t[47]!==u.cancelDialog||t[48]!==c||t[49]!==s?(J=(0,$.jsx)(X,{variant:`secondary`,onClick:c,disabled:s,children:u.cancelDialog}),t[47]=u.cancelDialog,t[48]=c,t[49]=s,t[50]=J):J=t[50];let ye=s?u.starting:u.start,xe;t[51]!==s||t[52]!==W||t[53]!==ye?(xe=(0,$.jsx)(X,{variant:`primary`,onClick:W,disabled:s,children:ye}),t[51]=s,t[52]=W,t[53]=ye,t[54]=xe):xe=t[54];let Se;return t[55]!==J||t[56]!==xe?(Se=(0,$.jsxs)(`div`,{className:`flex justify-end gap-2 border-t border-edge px-5 py-4`,children:[J,xe]}),t[55]=J,t[56]=xe,t[57]=Se):Se=t[57],(0,$.jsx)(ve,{open:n,onOpenChange:ae,children:(0,$.jsxs)(be,{children:[G,(0,$.jsxs)(ge,{className:`fixed left-1/2 top-1/2 z-66 flex max-h-[min(85vh,40rem)] w-[min(100%-2rem,32rem)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none`,children:[(0,$.jsxs)(`div`,{className:`border-b border-edge px-5 py-4`,children:[(0,$.jsxs)(q,{className:`text-base font-semibold text-fg`,children:[u.startTitle,` · `,r.title]}),K]}),(0,$.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-4 overflow-auto px-5 py-4`,children:[(0,$.jsxs)(`section`,{className:`rounded-2xl border border-edge bg-surface-base/70 p-4`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`h3`,{className:`text-sm font-semibold text-fg`,children:u.runPlanPreview}),(0,$.jsx)(`p`,{className:`mt-1 line-clamp-2 text-xs leading-5 text-fg-muted`,children:V})]}),(0,$.jsx)(`span`,{className:`shrink-0 rounded-full bg-accent-soft px-2 py-1 text-[11px] font-medium text-accent-fg`,children:u.readyToStart})]}),(0,$.jsxs)(`div`,{className:`mt-4 grid gap-2 text-xs text-fg-muted sm:grid-cols-3`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-2 rounded-xl bg-surface-panel px-2.5 py-2`,children:[oe,(0,$.jsx)(`span`,{children:Y(u.phaseCount,{count:r.phases.length})})]}),(0,$.jsxs)(`div`,{className:`flex items-center gap-2 rounded-xl bg-surface-panel px-2.5 py-2`,children:[se,(0,$.jsx)(`span`,{children:Ln(r,u)})]}),(0,$.jsxs)(`div`,{className:`flex items-center gap-2 rounded-xl bg-surface-panel px-2.5 py-2`,children:[ce,(0,$.jsx)(`span`,{children:Y(u.runLimitsSummary,{concurrency:L??r.defaults.concurrency,max:B??r.defaults.maxSubagents})})]})]}),r.phases.length>0?(0,$.jsxs)(`div`,{className:`mt-4`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] font-medium uppercase tracking-wide text-fg-subtle`,children:[(0,$.jsx)(de,{className:`size-3.5`,"aria-hidden":!0}),u.startPlanPhases]}),(0,$.jsx)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5`,children:r.phases.map(Vn)})]}):null]}),P&&r.inputSchema?(0,$.jsx)(Mn,{schema:r.inputSchema,value:y,onChange:b,labels:{inputSchemaHeading:u.inputSchemaHeading,rawJson:u.rawJson,rawJsonInvalid:u.rawJsonInvalid,booleanTrue:u.booleanTrue,booleanFalse:u.booleanFalse}}):null,!P&&A.map(e=>(0,$.jsxs)(`label`,{className:`block`,children:[(0,$.jsxs)(`span`,{className:`text-xs font-medium text-fg`,children:[Un(u,e.labelKey),e.required?` *`:``]}),e.multiline?(0,$.jsx)(`textarea`,{value:g[e.key]??``,onChange:t=>_(n=>({...n,[e.key]:t.target.value})),placeholder:Un(u,e.placeholderKey),className:`mt-1.5 min-h-20 w-full resize-y rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`}):(0,$.jsx)(`input`,{value:g[e.key]??``,onChange:t=>_(n=>({...n,[e.key]:t.target.value})),placeholder:Un(u,e.placeholderKey),className:`mt-1.5 w-full rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`})]},e.key)),F?(0,$.jsx)(In,{examples:M,labels:u,onSelect:ie}):null,(0,$.jsxs)(`label`,{className:`block`,children:[(0,$.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:u.goalLabel}),(0,$.jsx)(`textarea`,{value:d,onChange:le,placeholder:u.goalPlaceholder,className:`mt-1.5 min-h-24 w-full resize-y rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`})]}),F?null:(0,$.jsx)(In,{examples:M,labels:u,onSelect:ie}),(0,$.jsxs)(`div`,{className:`rounded-xl border border-edge`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`flex w-full items-center justify-between px-3 py-2.5 text-left text-sm text-fg`,onClick:ue,children:[fe,_e]}),T?(0,$.jsxs)(`div`,{className:`grid gap-3 border-t border-edge px-3 pb-3 pt-3 sm:grid-cols-2`,children:[(0,$.jsx)(`input`,{value:x,onChange:e=>S(e.target.value),placeholder:Y(u.concurrencyPlaceholder,{default:r.defaults.concurrency}),inputMode:`numeric`,className:`rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`}),(0,$.jsx)(`input`,{value:C,onChange:e=>w(e.target.value),placeholder:Y(u.maxSubagentsPlaceholder,{default:r.defaults.maxSubagents}),inputMode:`numeric`,className:`rounded-xl border border-edge bg-surface-base px-3 py-2 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus:ring-2 focus:ring-accent/20`})]}):null]})]}),Se]})]})})}function Bn(e){return!e}function Vn(e,t){return(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[t>0?(0,$.jsx)(`span`,{className:`text-fg-subtle`,children:`→`}):null,(0,$.jsx)(`span`,{className:`rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1 text-[11px] text-fg-muted`,children:e.title})]},e.id)}function Hn(e){let[t,n]=e;return`${t}: ${String(n)}`}function Un(e,t){return e.args[t]??t}function Wn(e){let t=(0,Q.c)(30),{stats:n,language:r}=e,i,o,s;if(t[0]!==r||t[1]!==n){s=Symbol.for(`react.early_return_sentinel`);bb0:{if(i=a(r).workflows,!n||n.totalRuns===0){s=null;break bb0}o=n.topDefinitions[0]?Y(i.statsTopWorkflow,{name:n.topDefinitions[0].definitionId,count:n.topDefinitions[0].count}):null}t[0]=r,t[1]=n,t[2]=i,t[3]=o,t[4]=s}else i=t[2],o=t[3],s=t[4];if(s!==Symbol.for(`react.early_return_sentinel`))return s;let c=o,l=i.statsTotalRuns,u=String(n.totalRuns),d;t[5]!==i.statsTotalRuns||t[6]!==u?(d=(0,$.jsx)(Gn,{label:l,value:u}),t[5]=i.statsTotalRuns,t[6]=u,t[7]=d):d=t[7];let f=i.statsActiveRuns,p=String(n.activeRuns),m;t[8]!==i.statsActiveRuns||t[9]!==p?(m=(0,$.jsx)(Gn,{label:f,value:p}),t[8]=i.statsActiveRuns,t[9]=p,t[10]=m):m=t[10];let h;t[11]!==n.succeededRuns||t[12]!==n.totalRuns?(h=n.totalRuns>0?`${Math.round(n.succeededRuns/n.totalRuns*100)}%`:`—`,t[11]=n.succeededRuns,t[12]=n.totalRuns,t[13]=h):h=t[13];let g;t[14]!==i.statsSuccessRate||t[15]!==h?(g=(0,$.jsx)(Gn,{label:i.statsSuccessRate,value:h}),t[14]=i.statsSuccessRate,t[15]=h,t[16]=g):g=t[16];let _;t[17]===n.averageDurationMs?_=t[18]:(_=n.averageDurationMs==null?`—`:he(n.averageDurationMs),t[17]=n.averageDurationMs,t[18]=_);let v;t[19]!==i.statsAvgDuration||t[20]!==_?(v=(0,$.jsx)(Gn,{label:i.statsAvgDuration,value:_}),t[19]=i.statsAvgDuration,t[20]=_,t[21]=v):v=t[21];let y;t[22]===c?y=t[23]:(y=c?(0,$.jsx)(`span`,{className:`min-w-0 truncate text-xs text-fg-muted`,children:c}):null,t[22]=c,t[23]=y);let b;return t[24]!==g||t[25]!==v||t[26]!==y||t[27]!==d||t[28]!==m?(b=(0,$.jsxs)(`section`,{className:`flex min-w-0 flex-wrap items-center gap-2 rounded-lg border border-edge bg-surface-panel/70 px-3 py-2`,children:[d,m,g,v,y]}),t[24]=g,t[25]=v,t[26]=y,t[27]=d,t[28]=m,t[29]=b):b=t[29],b}function Gn(e){let t=(0,Q.c)(7),{label:n,value:r}=e,i;t[0]===n?i=t[1]:(i=(0,$.jsx)(`span`,{children:n}),t[0]=n,t[1]=i);let a;t[2]===r?a=t[3]:(a=(0,$.jsx)(`span`,{className:`font-semibold tabular-nums text-fg`,children:r}),t[2]=r,t[3]=a);let o;return t[4]!==i||t[5]!==a?(o=(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-muted px-2.5 py-1 text-xs text-fg-muted`,children:[i,a]}),t[4]=i,t[5]=a,t[6]=o):o=t[6],o}function Kn(e){let t=(0,Q.c)(20),{vm:n}=e,{labels:r,loading:i,refreshAll:a,setManageOpen:o,setPickStartOpen:s}=n,c;t[0]===s?c=t[1]:(c=()=>s(!0),t[0]=s,t[1]=c);let l;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,$.jsx)(D,{className:`size-4`,"aria-hidden":!0}),t[2]=l):l=t[2];let u;t[3]!==r.boardStart||t[4]!==c?(u=(0,$.jsxs)(X,{variant:`primary`,className:`h-9 rounded-lg`,onClick:c,children:[l,r.boardStart]}),t[3]=r.boardStart,t[4]=c,t[5]=u):u=t[5];let d;t[6]===o?d=t[7]:(d=()=>o(!0),t[6]=o,t[7]=d);let f;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=(0,$.jsx)(ne,{className:`size-4`,"aria-hidden":!0}),t[8]=f):f=t[8];let p;t[9]!==r.addWorkflow||t[10]!==d?(p=(0,$.jsxs)(X,{variant:`secondary`,className:`h-9 rounded-lg`,onClick:d,children:[f,r.addWorkflow]}),t[9]=r.addWorkflow,t[10]=d,t[11]=p):p=t[11];let m;t[12]!==r.refresh||t[13]!==i||t[14]!==a?(m=(0,$.jsx)(Ie,{className:`size-9 shrink-0 p-0`,loading:i,label:r.refresh,onClick:a}),t[12]=r.refresh,t[13]=i,t[14]=a,t[15]=m):m=t[15];let h;return t[16]!==u||t[17]!==p||t[18]!==m?(h=(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[u,p,m]}),t[16]=u,t[17]=p,t[18]=m,t[19]=h):h=t[19],h}var qn=[`attention`,`running`,`queued`,`recent`];function Jn(e){return e.status===`failed`||e.status===`timeout`||e.status===`cancelled`?`attention`:e.status===`running`?`running`:e.status===`queued`?`queued`:e.status===`succeeded`?`recent`:null}function Yn(e){return e.completedAtMs??e.startedAtMs??e.createdAtMs}function Xn(e,t){let n=[...t];return e===`queued`?n.sort((e,t)=>e.createdAtMs-t.createdAtMs):n.sort((e,t)=>Yn(t)-Yn(e))}function Zn(e){let t=new Map(qn.map(e=>[e,[]]));for(let n of e){let e=Jn(n);e&&t.get(e)?.push(n)}for(let e of qn)t.set(e,Xn(e,t.get(e)??[]));return t}function Qn(e){let t=(0,Q.c)(205),{vm:n}=e,{language:r,localeTag:o,labels:s,hasToken:c,definitions:l,runs:u,searchQuery:f,setSearchQuery:p,ownerAgentId:m,agentOptions:h,setOwnerAgentId:_,workflowFilterId:v,setWorkflowFilterId:y,triggerFilter:b,setTriggerFilter:x,selectedRunId:S,selectedRunView:C,selectedRunComparison:w,selectedRunLoading:T,selectedRunError:E,openRunDetails:D,closeRunDetails:O,openRunDetailsById:k,openRunInChat:A,pickStartOpen:j,setPickStartOpen:M,startDefinition:ee,setStartDefinition:N,detailDefinition:P,setDetailDefinition:I,manageOpen:R,setManageOpen:z,workflowEditorDraft:B,openWorkflowEditor:V,actionError:te,actionFeedback:H,starting:ne,savingWorkflow:re,loading:ie,error:U,stats:W,submitStart:ae,cancelRun:G,retryRun:K,replayRun:q,saveCustomWorkflow:oe,saveDraftAndStart:se}=n,ce=L(tr),le=L(er),[ue,de]=(0,Z.useState)(`operations`),fe;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(fe=Date.now(),t[0]=fe):fe=t[0];let pe=fe,me=Zn(tt(u,{searchQuery:f,workflowFilterId:v,triggerFilter:b})),he;t[1]!==le||t[2]!==c||t[3]!==s.statsActiveRuns||t[4]!==s.statsTotalRuns||t[5]!==s.subtitleBoard||t[6]!==s.title||t[7]!==ce||t[8]!==W||t[9]!==n?(he=()=>{if(!c){le();return}return ce({startExtra:null,main:(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`h1`,{className:`truncate text-base font-semibold tracking-tight text-fg`,children:s.title}),(0,$.jsx)(`p`,{className:`truncate text-xs text-fg-muted`,children:W?`${s.statsTotalRuns}: ${W.totalRuns} · ${s.statsActiveRuns}: ${W.activeRuns}`:s.subtitleBoard})]}),end:(0,$.jsx)(Kn,{vm:n})}),()=>le()},t[1]=le,t[2]=c,t[3]=s.statsActiveRuns,t[4]=s.statsTotalRuns,t[5]=s.subtitleBoard,t[6]=s.title,t[7]=ce,t[8]=W,t[9]=n,t[10]=he):he=t[10];let ge;if(t[11]!==le||t[12]!==c||t[13]!==s.statsActiveRuns||t[14]!==s.statsTotalRuns||t[15]!==s.subtitleBoard||t[16]!==s.title||t[17]!==ie||t[18]!==W||t[19]!==n?(ge=[le,c,s.title,s.statsActiveRuns,s.statsTotalRuns,s.subtitleBoard,ie,W,n,n.refreshAll,n.setManageOpen,n.setSearchQuery],t[11]=le,t[12]=c,t[13]=s.statsActiveRuns,t[14]=s.statsTotalRuns,t[15]=s.subtitleBoard,t[16]=s.title,t[17]=ie,t[18]=W,t[19]=n,t[20]=ge):ge=t[20],(0,Z.useLayoutEffect)(he,ge),!c){let e;t[21]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,$.jsx)(F,{className:`size-10 text-accent-fg`,"aria-hidden":!0}),t[21]=e):e=t[21];let n;t[22]===s.title?n=t[23]:(n=(0,$.jsx)(`h1`,{className:`mt-4 text-xl font-semibold text-fg`,children:s.title}),t[22]=s.title,t[23]=n);let r;t[24]===s.needToken?r=t[25]:(r=(0,$.jsx)(`p`,{className:`mt-2 max-w-md text-sm leading-6 text-fg-muted`,children:s.needToken}),t[24]=s.needToken,t[25]=r);let i;return t[26]!==n||t[27]!==r?(i=(0,$.jsx)(`main`,{className:`min-h-0 flex-1 overflow-auto bg-surface-base`,children:(0,$.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col items-center px-4 py-16 text-center sm:px-8`,children:[e,n,r]})}),t[26]=n,t[27]=r,t[28]=i):i=t[28],i}let _e;t[29]===Symbol.for(`react.memo_cache_sentinel`)?(_e=(0,$.jsx)(we,{className:`pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-fg-subtle`,"aria-hidden":!0}),t[29]=_e):_e=t[29];let J;t[30]===p?J=t[31]:(J=e=>p(e.target.value),t[30]=p,t[31]=J);let ve=s.searchPlaceholder,ye;t[32]===Symbol.for(`react.memo_cache_sentinel`)?(ye=i(`h-9 w-full rounded-lg border border-edge bg-surface-panel py-2 pl-9 pr-3 text-sm text-fg shadow-surface`,`placeholder:text-fg-subtle`,We.focusRingPanel),t[32]=ye):ye=t[32];let Y;t[33]!==s.searchPlaceholder||t[34]!==f||t[35]!==J?(Y=(0,$.jsxs)(`div`,{className:`relative min-w-48 flex-1 sm:max-w-xs`,children:[_e,(0,$.jsx)(`input`,{value:f,onChange:J,placeholder:ve,className:ye})]}),t[33]=s.searchPlaceholder,t[34]=f,t[35]=J,t[36]=Y):Y=t[36];let be;t[37]!==h||t[38]!==r||t[39]!==m||t[40]!==_?(be=h.length>1?(0,$.jsx)(`select`,{value:m??``,"aria-label":`Agent`,onChange:e=>_(e.target.value),className:i(`h-9 min-w-32 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface`,We.focusRingPanel),children:h.map(e=>(0,$.jsx)(`option`,{value:e.id,children:d(e,a(r).agentsSettings)},e.id))}):null,t[37]=h,t[38]=r,t[39]=m,t[40]=_,t[41]=be):be=t[41];let Se=s.boardTriggerFilterAria,Ce;t[42]===x?Ce=t[43]:(Ce=e=>x(e.target.value),t[42]=x,t[43]=Ce);let Te;t[44]===Symbol.for(`react.memo_cache_sentinel`)?(Te=i(`h-9 min-w-[7.5rem] rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface`,We.focusRingPanel),t[44]=Te):Te=t[44];let Ee;t[45]===s.boardTriggerFilterAll?Ee=t[46]:(Ee=(0,$.jsx)(`option`,{value:`all`,children:s.boardTriggerFilterAll}),t[45]=s.boardTriggerFilterAll,t[46]=Ee);let De;t[47]===s.boardTriggerFilterCron?De=t[48]:(De=(0,$.jsx)(`option`,{value:`cron`,children:s.boardTriggerFilterCron}),t[47]=s.boardTriggerFilterCron,t[48]=De);let Oe;t[49]===s.boardTriggerFilterWebui?Oe=t[50]:(Oe=(0,$.jsx)(`option`,{value:`webui`,children:s.boardTriggerFilterWebui}),t[49]=s.boardTriggerFilterWebui,t[50]=Oe);let ke;t[51]===s.boardTriggerFilterChat?ke=t[52]:(ke=(0,$.jsx)(`option`,{value:`chat`,children:s.boardTriggerFilterChat}),t[51]=s.boardTriggerFilterChat,t[52]=ke);let Ae;t[53]===s.boardTriggerFilterApi?Ae=t[54]:(Ae=(0,$.jsx)(`option`,{value:`api`,children:s.boardTriggerFilterApi}),t[53]=s.boardTriggerFilterApi,t[54]=Ae);let je;t[55]!==s.boardTriggerFilterAria||t[56]!==Ce||t[57]!==Ee||t[58]!==De||t[59]!==Oe||t[60]!==ke||t[61]!==Ae||t[62]!==b?(je=(0,$.jsxs)(`select`,{value:b,"aria-label":Se,onChange:Ce,className:Te,children:[Ee,De,Oe,ke,Ae]}),t[55]=s.boardTriggerFilterAria,t[56]=Ce,t[57]=Ee,t[58]=De,t[59]=Oe,t[60]=ke,t[61]=Ae,t[62]=b,t[63]=je):je=t[63];let Me=s.boardWorkflowFilterAria,X;t[64]===y?X=t[65]:(X=e=>y(e.target.value),t[64]=y,t[65]=X);let Ne;t[66]===Symbol.for(`react.memo_cache_sentinel`)?(Ne=i(`h-9 min-w-40 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface`,We.focusRingPanel),t[66]=Ne):Ne=t[66];let Pe;t[67]===s.boardWorkflowFilterAll?Pe=t[68]:(Pe=(0,$.jsx)(`option`,{value:``,children:s.boardWorkflowFilterAll}),t[67]=s.boardWorkflowFilterAll,t[68]=Pe);let Fe;t[69]===l?Fe=t[70]:(Fe=l.map($n),t[69]=l,t[70]=Fe);let Ie;t[71]!==s.boardWorkflowFilterAria||t[72]!==X||t[73]!==Pe||t[74]!==Fe||t[75]!==v?(Ie=(0,$.jsxs)(`select`,{value:v,"aria-label":Me,onChange:X,className:Ne,children:[Pe,Fe]}),t[71]=s.boardWorkflowFilterAria,t[72]=X,t[73]=Pe,t[74]=Fe,t[75]=v,t[76]=Ie):Ie=t[76];let Le=ue===`operations`?`bg-surface-panel text-fg shadow-surface`:`text-fg-muted hover:text-fg`,Re;t[77]===Le?Re=t[78]:(Re=i(`inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-medium transition-colors`,Le),t[77]=Le,t[78]=Re);let ze,Be;t[79]===Symbol.for(`react.memo_cache_sentinel`)?(ze=()=>de(`operations`),Be=(0,$.jsx)(xe,{className:`size-3.5`,"aria-hidden":!0}),t[79]=ze,t[80]=Be):(ze=t[79],Be=t[80]);let Ve;t[81]!==s.viewModes.operations||t[82]!==Re?(Ve=(0,$.jsxs)(`button`,{type:`button`,className:Re,onClick:ze,children:[Be,s.viewModes.operations]}),t[81]=s.viewModes.operations,t[82]=Re,t[83]=Ve):Ve=t[83];let He=ue===`board`?`bg-surface-panel text-fg shadow-surface`:`text-fg-muted hover:text-fg`,Ue;t[84]===He?Ue=t[85]:(Ue=i(`inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-medium transition-colors`,He),t[84]=He,t[85]=Ue);let Ge,Ke;t[86]===Symbol.for(`react.memo_cache_sentinel`)?(Ge=()=>de(`board`),Ke=(0,$.jsx)(g,{className:`size-3.5`,"aria-hidden":!0}),t[86]=Ge,t[87]=Ke):(Ge=t[86],Ke=t[87]);let qe;t[88]!==s.viewModes.board||t[89]!==Ue?(qe=(0,$.jsxs)(`button`,{type:`button`,className:Ue,onClick:Ge,children:[Ke,s.viewModes.board]}),t[88]=s.viewModes.board,t[89]=Ue,t[90]=qe):qe=t[90];let Je;t[91]!==Ve||t[92]!==qe?(Je=(0,$.jsxs)(`div`,{className:`flex rounded-lg border border-edge bg-surface-muted p-0.5`,children:[Ve,qe]}),t[91]=Ve,t[92]=qe,t[93]=Je):Je=t[93];let Ye;t[94]!==Y||t[95]!==be||t[96]!==je||t[97]!==Ie||t[98]!==Je?(Ye=(0,$.jsxs)(`section`,{className:`mx-auto flex w-full max-w-app-main flex-wrap items-center gap-2 rounded-lg border border-edge bg-surface-panel/70 px-3 py-2`,children:[Y,be,je,Ie,Je]}),t[94]=Y,t[95]=be,t[96]=je,t[97]=Ie,t[98]=Je,t[99]=Ye):Ye=t[99];let Xe;t[100]===H?Xe=t[101]:(Xe=H?(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-app-main rounded-xl border border-emerald-500/25 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-800 dark:text-emerald-200`,children:H}):null,t[100]=H,t[101]=Xe);let Ze;t[102]!==te||t[103]!==U?(Ze=te??U?(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-app-main rounded-xl border border-red-500/25 bg-red-500/10 px-3 py-2 text-sm text-red-700 dark:text-red-300`,children:te??U}):null,t[102]=te,t[103]=U,t[104]=Ze):Ze=t[104];let Qe;t[105]!==r||t[106]!==W?(Qe=(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-app-main`,children:(0,$.jsx)(Wn,{stats:W,language:r})}),t[105]=r,t[106]=W,t[107]=Qe):Qe=t[107];let $e;t[108]===E?$e=t[109]:($e=E?(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-app-main rounded-xl border border-amber-500/25 bg-amber-500/10 px-3 py-2 text-sm text-amber-800 dark:text-amber-200`,children:E}):null,t[108]=E,t[109]=$e);let et=ue===`operations`?(0,$.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto pb-3`,children:(0,$.jsx)(`div`,{className:`mx-auto grid w-full max-w-app-main gap-4`,children:qn.map(e=>{let t=me.get(e)??[];return(0,$.jsxs)(`section`,{className:`rounded-lg border border-edge bg-surface-panel/60`,children:[(0,$.jsxs)(`header`,{className:`flex flex-wrap items-start justify-between gap-3 border-b border-edge-subtle px-4 py-3`,children:[(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`h2`,{className:`text-sm font-semibold text-fg`,children:s.operationSections[e].title}),(0,$.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:s.operationSections[e].description})]}),(0,$.jsx)(`span`,{className:`rounded-full bg-surface-hover px-2.5 py-1 text-xs font-semibold tabular-nums text-fg-muted`,children:t.length})]}),(0,$.jsxs)(`div`,{className:`grid gap-2 p-2.5 md:grid-cols-2 xl:grid-cols-3`,children:[t.map(e=>(0,$.jsx)(ft,{run:e,language:r,localeTag:o,nowMs:pe,selected:e.id===S,onOpen:D,onOpenChat:A,onCancel:e=>void G(e),onRetry:e=>void K(e)},e.id)),!ie&&t.length===0?(0,$.jsx)(`div`,{className:`flex min-h-24 items-center justify-center rounded-md border border-dashed border-edge bg-surface-panel/40 px-4 py-5 text-center text-xs text-fg-subtle md:col-span-2 xl:col-span-3`,children:s.operationSections[e].empty}):null]})]},e)})})}):(0,$.jsx)(`div`,{className:`mx-auto min-h-0 w-full max-w-app-main flex-1`,children:(0,$.jsx)(_t,{runs:u,language:r,localeTag:o,labels:{boardEmptyTitle:s.boardEmptyTitle,boardEmptyHint:s.boardEmptyHint,boardStart:s.boardStart,loading:s.loading},searchQuery:f,workflowFilterId:v,triggerFilter:b,selectedRunId:S,loading:ie,onOpenRun:D,onOpenRunChat:A,onCancelRun:e=>void G(e),onRetryRun:e=>void K(e),onStart:()=>M(!0)})}),nt;t[110]!==Ye||t[111]!==Xe||t[112]!==Ze||t[113]!==Qe||t[114]!==$e||t[115]!==et?(nt=(0,$.jsxs)(`div`,{className:`flex min-h-0 w-full flex-1 flex-col gap-4 px-4 py-5 sm:px-6 2xl:px-8`,children:[Ye,Xe,Ze,Qe,$e,et]}),t[110]=Ye,t[111]=Xe,t[112]=Ze,t[113]=Qe,t[114]=$e,t[115]=et,t[116]=nt):nt=t[116];let rt;if(t[117]!==l||t[118]!==C?.run){let e;t[120]===C?.run?e=t[121]:(e=e=>e.id===C?.run.definitionId,t[120]=C?.run,t[121]=e),rt=l.find(e),t[117]=l,t[118]=C?.run,t[119]=rt}else rt=t[119];let it=!!S&&T,at;t[122]!==G||t[123]!==S?(at=()=>{S&&G(S)},t[122]=G,t[123]=S,t[124]=at):at=t[124];let ot;t[125]!==K||t[126]!==S?(ot=()=>{S&&K(S)},t[125]=K,t[126]=S,t[127]=ot):ot=t[127];let st;t[128]!==q||t[129]!==S?(st=e=>{S&&q(S,e)},t[128]=q,t[129]=S,t[130]=st):st=t[130];let ct;t[131]!==O||t[132]!==r||t[133]!==o||t[134]!==k||t[135]!==m||t[136]!==w||t[137]!==C||t[138]!==rt||t[139]!==it||t[140]!==at||t[141]!==ot||t[142]!==st?(ct=(0,$.jsx)(on,{view:C,comparison:w,currentDefinition:rt,loading:it,language:r,localeTag:o,onCancel:at,onRetry:ot,onReplay:st,onOpenRunId:k,ownerAgentId:m,onClose:O}),t[131]=O,t[132]=r,t[133]=o,t[134]=k,t[135]=m,t[136]=w,t[137]=C,t[138]=rt,t[139]=it,t[140]=at,t[141]=ot,t[142]=st,t[143]=ct):ct=t[143];let lt;t[144]===M?lt=t[145]:(lt=()=>M(!1),t[144]=M,t[145]=lt);let ut;t[146]!==M||t[147]!==N?(ut=e=>{M(!1),N(e)},t[146]=M,t[147]=N,t[148]=ut):ut=t[148];let dt;t[149]!==I||t[150]!==M?(dt=e=>{M(!1),I(e)},t[149]=I,t[150]=M,t[151]=dt):dt=t[151];let pt;t[152]!==l||t[153]!==r||t[154]!==V||t[155]!==j||t[156]!==lt||t[157]!==ut||t[158]!==dt?(pt=(0,$.jsx)(Zt,{open:j,definitions:l,language:r,onClose:lt,onPick:ut,onDetail:dt,onEdit:V}),t[152]=l,t[153]=r,t[154]=V,t[155]=j,t[156]=lt,t[157]=ut,t[158]=dt,t[159]=pt):pt=t[159];let mt=ee!=null,ht;t[160]===N?ht=t[161]:(ht=()=>N(null),t[160]=N,t[161]=ht);let gt;t[162]===ae?gt=t[163]:(gt=e=>void ae(e),t[162]=ae,t[163]=gt);let vt;t[164]!==r||t[165]!==ee||t[166]!==ne||t[167]!==mt||t[168]!==ht||t[169]!==gt?(vt=(0,$.jsx)(zn,{open:mt,definition:ee,language:r,starting:ne,onClose:ht,onStart:gt}),t[164]=r,t[165]=ee,t[166]=ne,t[167]=mt,t[168]=ht,t[169]=gt,t[170]=vt):vt=t[170];let yt=P!=null,bt;t[171]===I?bt=t[172]:(bt=()=>I(null),t[171]=I,t[172]=bt);let xt;t[173]!==P||t[174]!==I||t[175]!==N?(xt=()=>{P&&(I(null),N(P))},t[173]=P,t[174]=I,t[175]=N,t[176]=xt):xt=t[176];let Ct;t[177]!==P||t[178]!==r||t[179]!==yt||t[180]!==bt||t[181]!==xt?(Ct=(0,$.jsx)(Bt,{open:yt,definition:P,language:r,onClose:bt,onRun:xt}),t[177]=P,t[178]=r,t[179]=yt,t[180]=bt,t[181]=xt,t[182]=Ct):Ct=t[182];let wt;t[183]===B?wt=t[184]:(wt=B?{mode:B.mode,name:B.initialName,script:B.initialScript,sourceTitle:B.definition.title}:null,t[183]=B,t[184]=wt);let Tt;t[185]===z?Tt=t[186]:(Tt=()=>z(!1),t[185]=z,t[186]=Tt);let Et;t[187]===oe?Et=t[188]:(Et=e=>oe(e),t[187]=oe,t[188]=Et);let Dt;t[189]!==r||t[190]!==R||t[191]!==m||t[192]!==se||t[193]!==re||t[194]!==wt||t[195]!==Tt||t[196]!==Et?(Dt=(0,$.jsx)(St,{open:R,language:r,ownerAgentId:m,saving:re,initialDraft:wt,onClose:Tt,onSave:Et,onSaveAndStart:se}),t[189]=r,t[190]=R,t[191]=m,t[192]=se,t[193]=re,t[194]=wt,t[195]=Tt,t[196]=Et,t[197]=Dt):Dt=t[197];let Ot;return t[198]!==nt||t[199]!==ct||t[200]!==pt||t[201]!==vt||t[202]!==Ct||t[203]!==Dt?(Ot=(0,$.jsxs)(`main`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden bg-surface-base`,children:[nt,ct,pt,vt,Ct,Dt]}),t[198]=nt,t[199]=ct,t[200]=pt,t[201]=vt,t[202]=Ct,t[203]=Dt,t[204]=Ot):Ot=t[204],Ot}function $n(e){return(0,$.jsx)(`option`,{value:e.id,children:e.title},e.id)}function er(e){return e.clearPageHeader}function tr(e){return e.setPageHeader}function nr(){let e=o(e=>e.language),t=a(e).workflows,n=e===`zh`?`zh-CN`:`en-US`,r=s(e=>e.token),i=!!r,l=re(),[u,d]=k(),f=u.get(`q`)??``,p=u.get(`wf`)?.trim()??``,h=u.get(`trigger`)?.trim()||`all`,g=u.get(`run`)?.trim()??``,_=u.get(`agent`)?.trim()??``,[y,x]=(0,Z.useState)(null),[S,C]=(0,Z.useState)(!1),[T,D]=(0,Z.useState)(null),[O,A]=(0,Z.useState)(!1),[j,M]=(0,Z.useState)(null),[N,F]=(0,Z.useState)(null),[I,L]=(0,Z.useState)(null),[R,z]=(0,Z.useState)(!1),[B,ne]=(0,Z.useState)(!1),U=c(i?[`workflow-agents`,r]:null,se,{revalidateOnFocus:!1}),W=(0,Z.useMemo)(()=>{let e=U.data?.agents??[];return _&&e.some(e=>e.id===_)||_&&e.length===0?_:U.data?.defaultId??(_||void 0)},[U.data,_]),G=c(i?[`workflow-definitions`,r]:null,E,{revalidateOnFocus:!1}),K=c(i&&W?[`workflow-runs`,r,W]:null,()=>Me(100,{ownerAgentId:W}),{revalidateOnFocus:!1,refreshInterval:e=>e?.length&&e.some(e=>e.status===`queued`||e.status===`running`)?3e3:0}),q=c(i&&W?[`workflow-stats`,r,W,p]:null,()=>H(p,{ownerAgentId:W}),{revalidateOnFocus:!1});(0,Z.useEffect)(()=>{if(!I)return;let e=window.setTimeout(()=>L(null),4e3);return()=>window.clearTimeout(e)},[I]);let oe=G.data??[],ce=U.data?.agents??[],le=K.data??[],de=g||null,fe=Ne(de,{ownerAgentId:W}),pe=c(i&&W&&de&&fe.view?.run.metadata?.replay?[`workflow-run-comparison`,r,W,de]:null,()=>V(de,{ownerAgentId:W}),{revalidateOnFocus:!1}),me=(0,Z.useMemo)(()=>ue(oe,f,`all`,`all`),[oe,f]),he=(0,Z.useCallback)(e=>{e&&M(null),A(e)},[]),ge=(0,Z.useCallback)(e=>{let t=new Set(oe.map(e=>e.name)),n=`${e.name}_copy`;if(!t.has(n))return n;for(let e=2;e<100;e+=1){let r=`${n}_${e}`;if(!t.has(r))return r}return`${n}_${Date.now()}`},[oe]),_e=(0,Z.useCallback)((e,n)=>{let r=e.runtime?.source??``;if(!r.trim()){F(t.editWorkflowSourceMissing);return}let i=n??(e.metadata.source===`user`?`edit`:`copy`),a=i===`edit`?e.name:ge(e);F(null),C(!1),M({mode:i,definition:e,initialName:a,initialScript:i===`copy`?rr(r,a):r}),A(!0)},[ge,t.editWorkflowSourceMissing]),J=(0,Z.useCallback)(e=>{d(t=>{let n=new URLSearchParams(t);return e(n,t),n},{replace:!0})},[d]);(0,Z.useEffect)(()=>{let e=U.data?.agents??[];!_||e.length===0||e.some(e=>e.id===_)||J(e=>{U.data?.defaultId?e.set(m,U.data.defaultId):e.delete(m),e.delete(`run`)})},[U.data,_,J]);let ve=(0,Z.useCallback)(e=>{J(t=>{let n=e.trim();n?t.set(`q`,n):t.delete(`q`)})},[J]),ye=(0,Z.useCallback)(e=>{J(t=>{let n=e.trim();n?t.set(m,n):t.delete(m),t.delete(`run`)})},[J]),be=(0,Z.useCallback)(e=>{J(t=>{let n=e.trim();n?t.set(`wf`,n):t.delete(`wf`)})},[J]),xe=(0,Z.useCallback)(e=>{J(t=>{let n=e.trim();n&&n!==`all`?t.set(ee,n):t.delete(ee)})},[J]),Se=(0,Z.useCallback)(e=>{J(t=>{W&&t.set(m,W),t.set(`run`,e.id)})},[W,J]),Ce=(0,Z.useCallback)(()=>{J(e=>{e.delete(`run`)})},[J]),we=(0,Z.useCallback)(e=>{J(t=>{W&&t.set(m,W),t.set(`run`,e)})},[W,J]),Te=(0,Z.useCallback)(e=>{let t=Je(e);t&&l(Be(t))},[l]);(0,Z.useEffect)(()=>{u.get(`tab`)&&J(e=>{e.delete(`tab`)})},[J,u]),(0,Z.useEffect)(()=>{let e=u.get(`def`),t=u.get(v)===`1`,n=u.get(b)===`1`;if(!e||!oe.length)return;let r=oe.find(t=>t.id===e||t.name===e);r&&(n?_e(r,`copy`):t?x(r):D(r),J(e=>{e.delete(`def`),e.delete(v),e.delete(b)}))},[oe,_e,J,u]),(0,Z.useEffect)(()=>{let e=()=>{K.mutate(),q.mutate()};return window.addEventListener(`workflow-event-appended`,e),window.addEventListener(`workflow-run-updated`,e),window.addEventListener(`workflow-run-error`,e),()=>{window.removeEventListener(`workflow-event-appended`,e),window.removeEventListener(`workflow-run-updated`,e),window.removeEventListener(`workflow-run-error`,e)}},[K,q]);let Ee=(0,Z.useCallback)(()=>{U.mutate(),G.mutate(),K.mutate(),q.mutate()},[U,G,K,q]),De=(0,Z.useCallback)(async e=>{if(y){z(!0),F(null);try{let n=await P({definitionId:y.id,goal:e.goal,input:e.input,agentId:W,concurrency:e.concurrency,maxSubagents:e.maxSubagents});x(null),await K.mutate(),await q.mutate(),L(t.startSuccess),J(e=>{W&&e.set(m,W),e.set(`run`,n.runId)})}catch(e){F(e instanceof Error?e.message:t.startFailed)}finally{z(!1)}}},[t.startFailed,t.startSuccess,W,J,K,y,q]),Oe=(0,Z.useCallback)(async e=>{try{await Ue(e,{ownerAgentId:W}),await K.mutate(),await q.mutate()}catch(e){let n=e instanceof Error?e.message:t.cancelFailed;if(/not active|already finished/i.test(n)){await K.mutate(),await q.mutate();return}F(n)}},[t.cancelFailed,W,K,q]),ke=(0,Z.useCallback)(async e=>{try{let t=await ae(e,{ownerAgentId:W});await K.mutate(),await q.mutate(),J(e=>{W&&e.set(m,W),e.set(`run`,t.runId)})}catch(e){F(e instanceof Error?e.message:t.retryFailed)}},[t.retryFailed,W,J,K,q]),Ae=(0,Z.useCallback)(async(e,n)=>{try{let t=await w(e,n,{ownerAgentId:W});await K.mutate(),await q.mutate(),J(e=>{W&&e.set(m,W),e.set(`run`,t.runId)})}catch(e){F(e instanceof Error?e.message:t.retryFailed)}},[t.retryFailed,W,J,K,q]),je=(0,Z.useCallback)(async e=>{ne(!0),F(null);try{let n=await ie(e.name,e.script);return A(!1),M(null),await G.mutate(),L(t.saveWorkflowSuccess),n}catch(e){F(e instanceof Error?e.message:t.saveWorkflowFailed)}finally{ne(!1)}},[G,t.saveWorkflowFailed,t.saveWorkflowSuccess]),X=(0,Z.useCallback)(async e=>{ne(!0),F(null);try{let n=await ie(e.name,e.script);await G.mutate();let r=await P({definitionId:n.id,goal:e.goal,input:{goal:e.goal},agentId:W});A(!1),M(null),await K.mutate(),await q.mutate(),L(t.startSuccess),J(e=>{W&&e.set(m,W),e.set(`run`,r.runId)})}catch(e){F(e instanceof Error?e.message:t.startFailed)}finally{ne(!1)}},[G,t.startFailed,t.startSuccess,W,J,K,q]),Pe=(0,Z.useCallback)(async e=>{if(e.metadata.source===`user`&&window.confirm(Y(t.deleteConfirm,{name:e.name}))){F(null);try{await te(e.id),await G.mutate(),L(t.deleteWorkflowSuccess)}catch(e){F(e instanceof Error?e.message:t.deleteWorkflowFailed)}}},[G,t]),Fe=U.isLoading||G.isLoading||K.isLoading,Ie=U.error?.message??G.error?.message??K.error?.message??null;return{language:e,localeTag:n,labels:t,hasToken:i,searchQuery:f,setSearchQuery:ve,ownerAgentId:W,agentOptions:ce,setOwnerAgentId:ye,workflowFilterId:p,setWorkflowFilterId:be,triggerFilter:h,setTriggerFilter:xe,definitions:oe,filteredDefinitions:me,runs:le,selectedRunId:de,selectedRunView:fe.view,selectedRunComparison:pe.data,selectedRunLoading:fe.loading,selectedRunError:fe.error?.message??pe.error?.message??null,openRunDetails:Se,closeRunDetails:Ce,openRunDetailsById:we,openRunInChat:Te,pickStartOpen:S,setPickStartOpen:C,startDefinition:y,setStartDefinition:x,detailDefinition:T,setDetailDefinition:D,manageOpen:O,setManageOpen:he,workflowEditorDraft:j,openWorkflowEditor:_e,actionError:N,actionFeedback:I,starting:R,savingWorkflow:B,loading:Fe,error:Ie,stats:q.data,refreshAll:Ee,submitStart:De,cancelRun:Oe,retryRun:ke,replayRun:Ae,saveCustomWorkflow:je,saveDraftAndStart:X,removeCustomWorkflow:Pe}}function rr(e,t){return e.replace(/(name\s*:\s*['"`])([^'"`]+)(['"`])/,(e,n,r,i)=>`${n}${t}${i}`)}function ir(){let e=(0,Q.c)(2),t=nr(),n;return e[0]===t?n=e[1]:(n=(0,$.jsx)(Qn,{vm:t}),e[0]=t,e[1]=n),n}export{ir as WorkflowsPage};
@@ -10,7 +10,7 @@
10
10
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.pngv=20260623-2" />
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260623-2" />
12
12
  <title>xopc</title>
13
- <script type="module" crossorigin src="/assets/index-DefIdW9q.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-C8ytlAF2.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
@@ -23,12 +23,12 @@
23
23
  <link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/locale-store-DjbfSsfA.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
26
- <link rel="modulepreload" crossorigin href="/assets/messages-BN_WiUg0.js">
27
- <link rel="modulepreload" crossorigin href="/assets/fetch-D9QqUtzZ.js">
28
- <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-N7Z_sz7p.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/messages-BqzIDrlr.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/fetch-CTsREQIe.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-C1KAHrd2.js">
29
29
  <link rel="modulepreload" crossorigin href="/assets/toast-z0toXu32.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/theme-store-CD2wtgZV.js">
31
- <link rel="stylesheet" crossorigin href="/assets/index-DzmWBkq-.css">
31
+ <link rel="stylesheet" crossorigin href="/assets/index-CVpJW2NS.css">
32
32
  </head>
33
33
  <body>
34
34
  <div id="root"></div>
@@ -3,13 +3,13 @@
3
3
  <g transform="translate(50 50) scale(0.92) translate(-50 -50)">
4
4
  <!-- Goal loop: outer system boundary + inner feedback loop -->
5
5
  <g stroke-linecap="round" fill="none">
6
- <g stroke="#000000" stroke-width="4">
6
+ <g stroke="#111111" stroke-opacity="0.9" stroke-width="4">
7
7
  <path d="M 29.375 23.602 A 33.5 33.5 0 0 1 70.625 23.602" />
8
8
  <path d="M 76.398 29.375 A 33.5 33.5 0 0 1 76.398 70.625" />
9
9
  <path d="M 70.625 76.398 A 33.5 33.5 0 0 1 29.375 76.398" />
10
10
  <path d="M 23.602 70.625 A 33.5 33.5 0 0 1 23.602 29.375" />
11
11
  </g>
12
- <g stroke="#000000" stroke-width="3.2" transform="rotate(45 50 50)">
12
+ <g stroke="#3a6bff" stroke-width="3.2" transform="rotate(45 50 50)">
13
13
  <path d="M 35.011 29.370 A 25.5 25.5 0 0 1 64.989 29.370" />
14
14
  <path d="M 70.630 35.011 A 25.5 25.5 0 0 1 70.630 64.989" />
15
15
  <path d="M 64.989 70.630 A 25.5 25.5 0 0 1 35.011 70.630" />
@@ -18,7 +18,8 @@
18
18
  </g>
19
19
  <!-- Central hub -->
20
20
  <path
21
- fill="#000000"
21
+ fill="#111111"
22
+ fill-opacity="0.92"
22
23
  transform="translate(50 50) scale(0.72) translate(-50 -50)"
23
24
  d="M 61.000 50.000 L 61.159 50.548 L 61.629 51.145 L 62.381 51.837 L 63.374 52.660 L 64.550 53.645 L 65.843 54.806 L 67.178 56.146 L 68.478 57.654 L 69.667 59.302 L 70.676 61.051 L 71.443 62.853 L 71.921 64.647 L 72.075 66.372 L 71.888 67.963 L 71.359 69.359 L 70.506 70.506 L 69.359 71.359 L 67.963 71.888 L 66.372 72.075 L 64.647 71.921 L 62.853 71.443 L 61.051 70.676 L 59.302 69.667 L 57.654 68.478 L 56.146 67.178 L 54.806 65.843 L 53.645 64.550 L 52.660 63.374 L 51.837 62.381 L 51.145 61.629 L 50.548 61.159 L 50.000 61.000 L 49.452 61.159 L 48.855 61.629 L 48.163 62.381 L 47.340 63.374 L 46.355 64.550 L 45.194 65.843 L 43.854 67.178 L 42.346 68.478 L 40.698 69.667 L 38.949 70.676 L 37.147 71.443 L 35.353 71.921 L 33.628 72.075 L 32.037 71.888 L 30.641 71.359 L 29.494 70.506 L 28.641 69.359 L 28.112 67.963 L 27.925 66.372 L 28.079 64.647 L 28.557 62.853 L 29.324 61.051 L 30.333 59.302 L 31.522 57.654 L 32.822 56.146 L 34.157 54.806 L 35.450 53.645 L 36.626 52.660 L 37.619 51.837 L 38.371 51.145 L 38.841 50.548 L 39.000 50.000 L 38.841 49.452 L 38.371 48.855 L 37.619 48.163 L 36.626 47.340 L 35.450 46.355 L 34.157 45.194 L 32.822 43.854 L 31.522 42.346 L 30.333 40.698 L 29.324 38.949 L 28.557 37.147 L 28.079 35.353 L 27.925 33.628 L 28.112 32.037 L 28.641 30.641 L 29.494 29.494 L 30.641 28.641 L 32.037 28.112 L 33.628 27.925 L 35.353 28.079 L 37.147 28.557 L 38.949 29.324 L 40.698 30.333 L 42.346 31.522 L 43.854 32.822 L 45.194 34.157 L 46.355 35.450 L 47.340 36.626 L 48.163 37.619 L 48.855 38.371 L 49.452 38.841 L 50.000 39.000 L 50.548 38.841 L 51.145 38.371 L 51.837 37.619 L 52.660 36.626 L 53.645 35.450 L 54.806 34.157 L 56.146 32.822 L 57.654 31.522 L 59.302 30.333 L 61.051 29.324 L 62.853 28.557 L 64.647 28.079 L 66.372 27.925 L 67.963 28.112 L 69.359 28.641 L 70.506 29.494 L 71.359 30.641 L 71.888 32.037 L 72.075 33.628 L 71.921 35.353 L 71.443 37.147 L 70.676 38.949 L 69.667 40.698 L 68.478 42.346 L 67.178 43.854 L 65.843 45.194 L 64.550 46.355 L 63.374 47.340 L 62.381 48.163 L 61.629 48.855 L 61.159 49.452 L 61.000 50.000 Z"
24
25
  />
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.0.114";
2
+ var version = "0.0.116";
3
3
  //#endregion
4
4
  export { version };
5
5
 
@@ -337,7 +337,14 @@ var ToolResultGuard = class {
337
337
  isSynthetic: false
338
338
  }));
339
339
  if (!persisted) return;
340
- return this.originalAppend(capToolResultForPersistence(persisted, this.maxToolResultChars));
340
+ const finalToolResult = capToolResultForPersistence(persisted, this.maxToolResultChars);
341
+ const result = this.originalAppend(finalToolResult);
342
+ if (this.opts.sessionKey) emitSessionTranscriptUpdate({
343
+ sessionKey: this.opts.sessionKey,
344
+ message: finalToolResult,
345
+ messageId: typeof result === "string" ? result : void 0
346
+ });
347
+ return result;
341
348
  }
342
349
  const stopReason = nextMessage.stopReason;
343
350
  const toolCalls = nextRole === "assistant" && stopReason !== "aborted" && stopReason !== "error" ? extractToolCallsFromAssistant(nextMessage) : [];
@@ -1 +1 @@
1
- {"version":3,"file":"session-tool-result-guard.js","names":[],"sources":["../../../../src/agent/embedded/session-tool-result-guard.ts"],"sourcesContent":["/**\n * Session tool-result guard — wraps a pi `SessionManager.appendMessage` to:\n * 1. cap oversized tool-result text + details so they cannot blow up the next\n * LLM request (size + persistence limits).\n * 2. track pending tool-call IDs so missing tool results can be synthesised\n * (some providers refuse a turn that has an orphan tool_use block).\n * 3. drop assistant `toolCall` blocks whose tool name is not in the allowlist\n * (these would also trigger provider 400s).\n * 4. broadcast `xopc:transcript-row` updates so the gateway UI can stream them.\n *\n * Previously this module shipped with three sibling files\n * (`session-tool-result-state.ts`, `session-raw-append-message.ts`,\n * `session-tool-result-guard-wrapper.ts`). They are now consolidated here as\n * private constructs around the `ToolResultGuard` class. Pi-coding-agent owns\n * the `SessionManager` instance and calls `appendMessage` from inside the\n * runtime, so we still need to monkey-patch that method — but the patched\n * implementation is just `guard.guardedAppend.bind(guard)` and all state lives\n * on the class.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { SessionManager } from '@earendil-works/pi-coding-agent';\n\nimport type { Config } from '../../config/schema.js';\nimport {\n boundedJsonUtf8Bytes,\n firstEnumerableOwnKeys,\n jsonUtf8BytesOrInfinity,\n type BoundedJsonUtf8Bytes,\n} from '../../infra/json-utf8-bytes.js';\nimport { emitSessionTranscriptUpdate } from '../../session/transcript-events.js';\nimport { normalizeOptionalString } from '../../utils/string-coerce.js';\nimport { formatContextLimitTruncationNotice } from './tool-result-context-guard.js';\nimport {\n DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS,\n resolveLiveToolResultMaxChars,\n truncateToolResultMessage,\n} from './tool-result-truncation.js';\nimport {\n makeMissingToolResult,\n sanitizeToolCallInputs,\n} from '../transcript/session-transcript-repair.js';\nimport {\n extractToolCallsFromAssistant,\n extractToolResultId,\n} from '../transcript/tool-call-id.js';\n\n// ── Public surface ──────────────────────────────────────────────────────────\n\nexport type BeforeMessageWriteHookEvent = { message: AgentMessage };\nexport type BeforeMessageWriteHookResult =\n | { block?: boolean; message?: AgentMessage }\n | undefined;\n\nexport interface ToolResultGuardOptions {\n /** Optional session key for transcript update broadcasts. */\n sessionKey?: string;\n /** Optional transform applied to any message before persistence. */\n transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;\n /**\n * Optional, synchronous transform applied to toolResult messages *before* they are\n * persisted to the session transcript.\n */\n transformToolResultForPersistence?: (\n message: AgentMessage,\n meta: { toolCallId?: string; toolName?: string; isSynthetic?: boolean },\n ) => AgentMessage;\n /**\n * Whether to synthesize missing tool results to satisfy strict providers.\n * Defaults to true.\n */\n allowSyntheticToolResults?: boolean;\n missingToolResultText?: string;\n /**\n * Optional set/list of tool names accepted for assistant toolCall/toolUse blocks.\n * When set, tool calls with unknown names are dropped before persistence.\n */\n allowedToolNames?: Iterable<string>;\n /**\n * Synchronous hook invoked before any message is written to the session JSONL.\n * If the hook returns { block: true }, the message is silently dropped.\n * If it returns { message }, the modified message is written instead.\n */\n beforeMessageWriteHook?: (event: BeforeMessageWriteHookEvent) => BeforeMessageWriteHookResult;\n maxToolResultChars?: number;\n}\n\nexport interface InstallSessionToolResultGuardResult {\n flushPendingToolResults: () => void;\n clearPendingToolResults: () => void;\n getPendingIds: () => string[];\n}\n\n/** Idempotent wrapper that also adds the helper methods consumers expect. */\nexport type GuardedPiTranscriptManager = SessionManager & {\n flushPendingToolResults?: () => void;\n clearPendingToolResults?: () => void;\n};\n\n/**\n * Install the guard on a SessionManager and return its control API.\n * Subsequent assistant/toolResult writes by pi-coding-agent flow through the\n * guard transparently.\n */\nexport function installSessionToolResultGuard(\n sessionManager: SessionManager,\n opts: ToolResultGuardOptions = {},\n): InstallSessionToolResultGuardResult {\n const guard = new ToolResultGuard(sessionManager, opts);\n guard.attach();\n return {\n flushPendingToolResults: () => guard.flushPending(),\n clearPendingToolResults: () => guard.clearPending(),\n getPendingIds: () => guard.getPendingIds(),\n };\n}\n\n/**\n * Convenience wrapper used by the embedded runner pool: install the guard\n * (idempotent), pin the size cap from the model context window, and expose\n * `flushPendingToolResults` / `clearPendingToolResults` directly on the\n * SessionManager instance so callers do not need to keep the install result.\n */\nexport function guardSessionManager(\n sessionManager: SessionManager,\n opts?: {\n agentId?: string;\n sessionKey?: string;\n config?: Config;\n contextWindowTokens?: number;\n allowSyntheticToolResults?: boolean;\n missingToolResultText?: string;\n allowedToolNames?: Iterable<string>;\n transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;\n },\n): GuardedPiTranscriptManager {\n if (typeof (sessionManager as GuardedPiTranscriptManager).flushPendingToolResults === 'function') {\n return sessionManager as GuardedPiTranscriptManager;\n }\n\n const result = installSessionToolResultGuard(sessionManager, {\n sessionKey: opts?.sessionKey,\n transformMessageForPersistence: opts?.transformMessageForPersistence,\n allowSyntheticToolResults: opts?.allowSyntheticToolResults,\n missingToolResultText: opts?.missingToolResultText,\n allowedToolNames: opts?.allowedToolNames,\n maxToolResultChars:\n typeof opts?.contextWindowTokens === 'number'\n ? resolveLiveToolResultMaxChars({\n contextWindowTokens: opts.contextWindowTokens,\n cfg: opts?.config,\n agentId: opts?.agentId,\n })\n : undefined,\n });\n const tagged = sessionManager as GuardedPiTranscriptManager;\n tagged.flushPendingToolResults = result.flushPendingToolResults;\n tagged.clearPendingToolResults = result.clearPendingToolResults;\n return tagged;\n}\n\n/**\n * Recover the original (un-guarded) appendMessage for a session manager.\n * Useful for callers that need a low-level \"bypass the guard\" write path.\n */\nexport function getRawSessionAppendMessage(\n sessionManager: SessionManager,\n): SessionManager['appendMessage'] {\n const stored = (sessionManager as SessionManagerWithRawAppend)[RAW_APPEND_MESSAGE];\n return stored ?? sessionManager.appendMessage.bind(sessionManager);\n}\n\n// ── Internal: persistence + truncation helpers ──────────────────────────────\n\nfunction resolveMaxToolResultChars(opts: { maxToolResultChars?: number }): number {\n return Math.max(1, opts.maxToolResultChars ?? DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS);\n}\n\nfunction capToolResultSize(msg: AgentMessage, maxChars: number): AgentMessage {\n if ((msg as { role?: string }).role !== 'toolResult') {\n return msg;\n }\n return truncateToolResultMessage(msg, maxChars, {\n suffix: (truncatedChars) => formatContextLimitTruncationNotice(truncatedChars),\n minKeepChars: 2_000,\n });\n}\n\n// `details` is runtime/UI metadata, not model-visible tool output. Keep the\n// session JSONL useful for debugging without letting metadata blobs dominate\n// disk, replay repair, transcript broadcasts, or future tooling that reads raw\n// sessions. Model-visible text belongs in tool result `content`.\nconst MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES = 8_192;\nconst MAX_PERSISTED_DETAIL_STRING_CHARS = 2_000;\nconst MAX_PERSISTED_DETAIL_SESSION_COUNT = 10;\nconst MAX_PERSISTED_DETAIL_FALLBACK_STRING_CHARS = 200;\n\nfunction originalDetailsSizeFields(size: BoundedJsonUtf8Bytes): Record<string, number> {\n return size.complete\n ? { originalDetailsBytes: size.bytes }\n : { originalDetailsBytesAtLeast: size.bytes };\n}\n\nfunction truncatePersistedDetailString(\n value: string,\n maxChars = MAX_PERSISTED_DETAIL_STRING_CHARS,\n): string {\n if (value.length <= maxChars) {\n return value;\n }\n return `${value.slice(0, maxChars)}\\n\\n[xopc persisted detail truncated: ${\n value.length - maxChars\n } chars omitted]`;\n}\n\nfunction sanitizePersistedSessionDetail(value: unknown): unknown {\n if (!value || typeof value !== 'object') {\n return value;\n }\n const src = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of [\n 'sessionId',\n 'status',\n 'pid',\n 'startedAt',\n 'endedAt',\n 'runtimeMs',\n 'cwd',\n 'name',\n 'truncated',\n 'exitCode',\n 'exitSignal',\n ]) {\n const field = src[key];\n if (field !== undefined) {\n out[key] = typeof field === 'string' ? truncatePersistedDetailString(field, 500) : field;\n }\n }\n if (typeof src.command === 'string') {\n out.command = truncatePersistedDetailString(src.command, 500);\n }\n return out;\n}\n\nfunction buildPersistedDetailsFallback(\n src: Record<string, unknown> | undefined,\n originalSize: BoundedJsonUtf8Bytes,\n sanitizedBytes?: number,\n): Record<string, unknown> {\n const fallback: Record<string, unknown> = {\n persistedDetailsTruncated: true,\n finalDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n };\n if (sanitizedBytes !== undefined) {\n fallback.sanitizedDetailsBytes = sanitizedBytes;\n }\n if (src) {\n fallback.originalDetailKeys = firstEnumerableOwnKeys(src, 40);\n for (const key of ['status', 'sessionId', 'pid', 'exitCode', 'exitSignal', 'truncated']) {\n const field = src[key];\n if (field !== undefined) {\n fallback[key] =\n typeof field === 'string'\n ? truncatePersistedDetailString(field, MAX_PERSISTED_DETAIL_FALLBACK_STRING_CHARS)\n : field;\n }\n }\n }\n return fallback;\n}\n\nfunction enforcePersistedDetailsByteCap(\n value: Record<string, unknown>,\n src: Record<string, unknown> | undefined,\n originalSize: BoundedJsonUtf8Bytes,\n): Record<string, unknown> {\n const sanitizedBytes = jsonUtf8BytesOrInfinity(value);\n if (sanitizedBytes <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return value;\n }\n const fallback = buildPersistedDetailsFallback(src, originalSize, sanitizedBytes);\n if (jsonUtf8BytesOrInfinity(fallback) <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return fallback;\n }\n return {\n persistedDetailsTruncated: true,\n finalDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n sanitizedDetailsBytes: sanitizedBytes,\n };\n}\n\nfunction sanitizeToolResultDetailsForPersistence(details: unknown): unknown {\n if (details === undefined || details === null) {\n return details;\n }\n const originalSize = boundedJsonUtf8Bytes(details, MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES);\n if (originalSize.complete && originalSize.bytes <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return details;\n }\n if (typeof details !== 'object') {\n return enforcePersistedDetailsByteCap(\n {\n persistedDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n valueType: typeof details,\n },\n undefined,\n originalSize,\n );\n }\n const src = details as Record<string, unknown>;\n const out: Record<string, unknown> = {\n persistedDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n originalDetailKeys: firstEnumerableOwnKeys(src, 40),\n };\n for (const key of [\n 'status',\n 'sessionId',\n 'pid',\n 'startedAt',\n 'endedAt',\n 'cwd',\n 'name',\n 'exitCode',\n 'exitSignal',\n 'retryInMs',\n 'total',\n 'totalLines',\n 'totalChars',\n 'truncated',\n 'fullOutputPath',\n 'truncation',\n ]) {\n const field = src[key];\n if (field !== undefined) {\n out[key] = typeof field === 'string' ? truncatePersistedDetailString(field) : field;\n }\n }\n if (typeof src.tail === 'string') {\n out.tail = truncatePersistedDetailString(src.tail);\n }\n if (Array.isArray(src.sessions)) {\n out.sessions = src.sessions\n .slice(0, MAX_PERSISTED_DETAIL_SESSION_COUNT)\n .map(sanitizePersistedSessionDetail);\n if (src.sessions.length > MAX_PERSISTED_DETAIL_SESSION_COUNT) {\n out.sessionsTruncated = src.sessions.length - MAX_PERSISTED_DETAIL_SESSION_COUNT;\n }\n }\n return enforcePersistedDetailsByteCap(out, src, originalSize);\n}\n\nfunction capToolResultDetails(msg: AgentMessage): AgentMessage {\n if ((msg as { role?: string }).role !== 'toolResult') {\n return msg;\n }\n const details = (msg as { details?: unknown }).details;\n const sanitizedDetails = sanitizeToolResultDetailsForPersistence(details);\n if (sanitizedDetails === details) {\n return msg;\n }\n const next = { ...msg } as AgentMessage & { details?: unknown };\n next.details = sanitizedDetails;\n return next;\n}\n\nfunction capToolResultForPersistence(msg: AgentMessage, maxChars: number): AgentMessage {\n return capToolResultDetails(capToolResultSize(msg, maxChars));\n}\n\nfunction normalizePersistedToolResultName(\n message: AgentMessage,\n fallbackName?: string,\n): AgentMessage {\n if ((message as { role?: unknown }).role !== 'toolResult') {\n return message;\n }\n const toolResult = message as Extract<AgentMessage, { role: 'toolResult' }>;\n const rawToolName = (toolResult as { toolName?: unknown }).toolName;\n const normalizedToolName = normalizeOptionalString(rawToolName);\n if (normalizedToolName) {\n if (rawToolName === normalizedToolName) {\n return toolResult;\n }\n return { ...toolResult, toolName: normalizedToolName };\n }\n\n const normalizedFallback = normalizeOptionalString(fallbackName);\n if (normalizedFallback) {\n return { ...toolResult, toolName: normalizedFallback };\n }\n\n if (typeof rawToolName === 'string') {\n return { ...toolResult, toolName: 'unknown' };\n }\n return toolResult;\n}\n\n// ── Internal: raw-append symbol storage ─────────────────────────────────────\n\nconst RAW_APPEND_MESSAGE = Symbol('xopc.session.rawAppendMessage');\n\ntype SessionManagerWithRawAppend = SessionManager & {\n [RAW_APPEND_MESSAGE]?: SessionManager['appendMessage'];\n};\n\nfunction rememberOriginalAppend(\n sessionManager: SessionManager,\n): SessionManager['appendMessage'] {\n const tagged = sessionManager as SessionManagerWithRawAppend;\n const stored = tagged[RAW_APPEND_MESSAGE];\n if (stored) {\n return stored;\n }\n const original = sessionManager.appendMessage.bind(sessionManager);\n tagged[RAW_APPEND_MESSAGE] = original;\n return original;\n}\n\n// ── Internal: pending tool-call state ──────────────────────────────────────\n\ntype PendingToolCall = { id: string; name?: string };\n\nclass PendingToolCallTracker {\n private readonly pending = new Map<string, string | undefined>();\n\n size(): number {\n return this.pending.size;\n }\n\n getToolName(id: string): string | undefined {\n return this.pending.get(id);\n }\n\n delete(id: string): void {\n this.pending.delete(id);\n }\n\n clear(): void {\n this.pending.clear();\n }\n\n trackToolCalls(calls: readonly PendingToolCall[]): void {\n for (const call of calls) {\n this.pending.set(call.id, call.name);\n }\n }\n\n entries(): IterableIterator<[string, string | undefined]> {\n return this.pending.entries();\n }\n\n getPendingIds(): string[] {\n return Array.from(this.pending.keys());\n }\n\n shouldFlushForSanitizedDrop(): boolean {\n return this.pending.size > 0;\n }\n\n shouldFlushBeforeNonToolResult(nextRole: unknown, toolCallCount: number): boolean {\n return this.pending.size > 0 && (toolCallCount === 0 || nextRole !== 'assistant');\n }\n\n shouldFlushBeforeNewToolCalls(toolCallCount: number): boolean {\n return this.pending.size > 0 && toolCallCount > 0;\n }\n}\n\n// ── ToolResultGuard class ──────────────────────────────────────────────────\n\nclass ToolResultGuard {\n private readonly sessionManager: SessionManager;\n private readonly opts: ToolResultGuardOptions;\n private readonly pending = new PendingToolCallTracker();\n private readonly originalAppend: SessionManager['appendMessage'];\n private readonly allowSyntheticToolResults: boolean;\n private readonly maxToolResultChars: number;\n\n constructor(sessionManager: SessionManager, opts: ToolResultGuardOptions) {\n this.sessionManager = sessionManager;\n this.opts = opts;\n this.originalAppend = rememberOriginalAppend(sessionManager);\n this.allowSyntheticToolResults = opts.allowSyntheticToolResults ?? true;\n this.maxToolResultChars = resolveMaxToolResultChars(opts);\n }\n\n /** Monkey-patch the session manager so pi-coding-agent's internal appendMessage flows through us. */\n attach(): void {\n const bound = this.guardedAppend.bind(this);\n this.sessionManager.appendMessage = bound as SessionManager['appendMessage'];\n }\n\n flushPending(): void {\n if (this.pending.size() === 0) {\n return;\n }\n if (this.allowSyntheticToolResults) {\n for (const [id, name] of this.pending.entries()) {\n const synthetic = makeMissingToolResult({\n toolCallId: id,\n toolName: name,\n text: this.opts.missingToolResultText,\n });\n const flushed = this.applyBeforeWriteHook(\n this.persistToolResult(this.persistMessage(synthetic), {\n toolCallId: id,\n toolName: name,\n isSynthetic: true,\n }),\n );\n if (flushed) {\n this.originalAppend(capToolResultForPersistence(flushed, this.maxToolResultChars) as never);\n }\n }\n }\n this.pending.clear();\n }\n\n clearPending(): void {\n this.pending.clear();\n }\n\n getPendingIds(): string[] {\n return this.pending.getPendingIds();\n }\n\n private persistMessage(message: AgentMessage): AgentMessage {\n const transformer = this.opts.transformMessageForPersistence;\n return transformer ? transformer(message) : message;\n }\n\n private persistToolResult(\n message: AgentMessage,\n meta: { toolCallId?: string; toolName?: string; isSynthetic?: boolean },\n ): AgentMessage {\n const transformer = this.opts.transformToolResultForPersistence;\n return transformer ? transformer(message, meta) : message;\n }\n\n /**\n * Run the before_message_write hook. Returns the (possibly modified) message,\n * or null if the message should be blocked.\n */\n private applyBeforeWriteHook(msg: AgentMessage): AgentMessage | null {\n const beforeWrite = this.opts.beforeMessageWriteHook;\n if (!beforeWrite) {\n return msg;\n }\n const result = beforeWrite({ message: msg });\n if (result?.block) {\n return null;\n }\n if (result?.message) {\n return result.message;\n }\n return msg;\n }\n\n private guardedAppend(message: AgentMessage): unknown {\n let nextMessage = message;\n const role = (message as { role?: unknown }).role;\n if (role === 'assistant') {\n const sanitized = sanitizeToolCallInputs([message], {\n allowedToolNames: this.opts.allowedToolNames,\n });\n if (sanitized.length === 0) {\n if (this.pending.shouldFlushForSanitizedDrop()) {\n this.flushPending();\n }\n return undefined;\n }\n nextMessage = sanitized[0];\n }\n const nextRole = (nextMessage as { role?: unknown }).role;\n\n if (nextRole === 'toolResult') {\n const id = extractToolResultId(nextMessage as Extract<AgentMessage, { role: 'toolResult' }>);\n const toolName = id ? this.pending.getToolName(id) : undefined;\n if (id) {\n this.pending.delete(id);\n }\n const normalizedToolResult = normalizePersistedToolResultName(nextMessage, toolName);\n // Apply hard size cap before persistence to prevent oversized tool results\n // from consuming the entire context window on subsequent LLM calls.\n const capped = capToolResultForPersistence(\n this.persistMessage(normalizedToolResult),\n this.maxToolResultChars,\n );\n const persisted = this.applyBeforeWriteHook(\n this.persistToolResult(capped, {\n toolCallId: id ?? undefined,\n toolName,\n isSynthetic: false,\n }),\n );\n if (!persisted) {\n return undefined;\n }\n return this.originalAppend(capToolResultForPersistence(persisted, this.maxToolResultChars) as never);\n }\n\n // Skip tool call extraction for aborted/errored assistant messages.\n // When stopReason is \"error\" or \"aborted\", the tool_use blocks may be incomplete\n // and should not have synthetic tool_results created. Creating synthetic results\n // for incomplete tool calls causes API 400 errors:\n // \"unexpected tool_use_id found in tool_result blocks\"\n // This matches the behavior in repairToolUseResultPairing (session-transcript-repair.ts)\n const stopReason = (nextMessage as { stopReason?: string }).stopReason;\n const toolCalls =\n nextRole === 'assistant' && stopReason !== 'aborted' && stopReason !== 'error'\n ? extractToolCallsFromAssistant(nextMessage as Extract<AgentMessage, { role: 'assistant' }>)\n : [];\n\n // Always clear pending tool call state before appending non-tool-result messages.\n // flushPendingToolResults() only inserts synthetic results when allowSyntheticToolResults\n // is true; it always clears the pending map. Without this, providers that disable\n // synthetic results (e.g. OpenAI) accumulate stale pending state when a user message\n // interrupts in-flight tool calls, leaving orphaned tool_use blocks in the transcript\n // that cause API 400 errors on subsequent requests.\n if (this.pending.shouldFlushBeforeNonToolResult(nextRole, toolCalls.length)) {\n this.flushPending();\n }\n // If new tool calls arrive while older ones are pending, flush the old ones first.\n if (this.pending.shouldFlushBeforeNewToolCalls(toolCalls.length)) {\n this.flushPending();\n }\n\n const finalMessage = this.applyBeforeWriteHook(this.persistMessage(nextMessage));\n if (!finalMessage) {\n return undefined;\n }\n const result = this.originalAppend(finalMessage as never);\n\n if (this.opts.sessionKey) {\n emitSessionTranscriptUpdate({\n sessionKey: this.opts.sessionKey,\n message: finalMessage,\n messageId: typeof result === 'string' ? result : undefined,\n });\n }\n\n if (toolCalls.length > 0) {\n this.pending.trackToolCalls(toolCalls);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-tool-result-guard.js","names":[],"sources":["../../../../src/agent/embedded/session-tool-result-guard.ts"],"sourcesContent":["/**\n * Session tool-result guard — wraps a pi `SessionManager.appendMessage` to:\n * 1. cap oversized tool-result text + details so they cannot blow up the next\n * LLM request (size + persistence limits).\n * 2. track pending tool-call IDs so missing tool results can be synthesised\n * (some providers refuse a turn that has an orphan tool_use block).\n * 3. drop assistant `toolCall` blocks whose tool name is not in the allowlist\n * (these would also trigger provider 400s).\n * 4. broadcast `xopc:transcript-row` updates so the gateway UI can stream them.\n *\n * Previously this module shipped with three sibling files\n * (`session-tool-result-state.ts`, `session-raw-append-message.ts`,\n * `session-tool-result-guard-wrapper.ts`). They are now consolidated here as\n * private constructs around the `ToolResultGuard` class. Pi-coding-agent owns\n * the `SessionManager` instance and calls `appendMessage` from inside the\n * runtime, so we still need to monkey-patch that method — but the patched\n * implementation is just `guard.guardedAppend.bind(guard)` and all state lives\n * on the class.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { SessionManager } from '@earendil-works/pi-coding-agent';\n\nimport type { Config } from '../../config/schema.js';\nimport {\n boundedJsonUtf8Bytes,\n firstEnumerableOwnKeys,\n jsonUtf8BytesOrInfinity,\n type BoundedJsonUtf8Bytes,\n} from '../../infra/json-utf8-bytes.js';\nimport { emitSessionTranscriptUpdate } from '../../session/transcript-events.js';\nimport { normalizeOptionalString } from '../../utils/string-coerce.js';\nimport { formatContextLimitTruncationNotice } from './tool-result-context-guard.js';\nimport {\n DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS,\n resolveLiveToolResultMaxChars,\n truncateToolResultMessage,\n} from './tool-result-truncation.js';\nimport {\n makeMissingToolResult,\n sanitizeToolCallInputs,\n} from '../transcript/session-transcript-repair.js';\nimport {\n extractToolCallsFromAssistant,\n extractToolResultId,\n} from '../transcript/tool-call-id.js';\n\n// ── Public surface ──────────────────────────────────────────────────────────\n\nexport type BeforeMessageWriteHookEvent = { message: AgentMessage };\nexport type BeforeMessageWriteHookResult =\n | { block?: boolean; message?: AgentMessage }\n | undefined;\n\nexport interface ToolResultGuardOptions {\n /** Optional session key for transcript update broadcasts. */\n sessionKey?: string;\n /** Optional transform applied to any message before persistence. */\n transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;\n /**\n * Optional, synchronous transform applied to toolResult messages *before* they are\n * persisted to the session transcript.\n */\n transformToolResultForPersistence?: (\n message: AgentMessage,\n meta: { toolCallId?: string; toolName?: string; isSynthetic?: boolean },\n ) => AgentMessage;\n /**\n * Whether to synthesize missing tool results to satisfy strict providers.\n * Defaults to true.\n */\n allowSyntheticToolResults?: boolean;\n missingToolResultText?: string;\n /**\n * Optional set/list of tool names accepted for assistant toolCall/toolUse blocks.\n * When set, tool calls with unknown names are dropped before persistence.\n */\n allowedToolNames?: Iterable<string>;\n /**\n * Synchronous hook invoked before any message is written to the session JSONL.\n * If the hook returns { block: true }, the message is silently dropped.\n * If it returns { message }, the modified message is written instead.\n */\n beforeMessageWriteHook?: (event: BeforeMessageWriteHookEvent) => BeforeMessageWriteHookResult;\n maxToolResultChars?: number;\n}\n\nexport interface InstallSessionToolResultGuardResult {\n flushPendingToolResults: () => void;\n clearPendingToolResults: () => void;\n getPendingIds: () => string[];\n}\n\n/** Idempotent wrapper that also adds the helper methods consumers expect. */\nexport type GuardedPiTranscriptManager = SessionManager & {\n flushPendingToolResults?: () => void;\n clearPendingToolResults?: () => void;\n};\n\n/**\n * Install the guard on a SessionManager and return its control API.\n * Subsequent assistant/toolResult writes by pi-coding-agent flow through the\n * guard transparently.\n */\nexport function installSessionToolResultGuard(\n sessionManager: SessionManager,\n opts: ToolResultGuardOptions = {},\n): InstallSessionToolResultGuardResult {\n const guard = new ToolResultGuard(sessionManager, opts);\n guard.attach();\n return {\n flushPendingToolResults: () => guard.flushPending(),\n clearPendingToolResults: () => guard.clearPending(),\n getPendingIds: () => guard.getPendingIds(),\n };\n}\n\n/**\n * Convenience wrapper used by the embedded runner pool: install the guard\n * (idempotent), pin the size cap from the model context window, and expose\n * `flushPendingToolResults` / `clearPendingToolResults` directly on the\n * SessionManager instance so callers do not need to keep the install result.\n */\nexport function guardSessionManager(\n sessionManager: SessionManager,\n opts?: {\n agentId?: string;\n sessionKey?: string;\n config?: Config;\n contextWindowTokens?: number;\n allowSyntheticToolResults?: boolean;\n missingToolResultText?: string;\n allowedToolNames?: Iterable<string>;\n transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;\n },\n): GuardedPiTranscriptManager {\n if (typeof (sessionManager as GuardedPiTranscriptManager).flushPendingToolResults === 'function') {\n return sessionManager as GuardedPiTranscriptManager;\n }\n\n const result = installSessionToolResultGuard(sessionManager, {\n sessionKey: opts?.sessionKey,\n transformMessageForPersistence: opts?.transformMessageForPersistence,\n allowSyntheticToolResults: opts?.allowSyntheticToolResults,\n missingToolResultText: opts?.missingToolResultText,\n allowedToolNames: opts?.allowedToolNames,\n maxToolResultChars:\n typeof opts?.contextWindowTokens === 'number'\n ? resolveLiveToolResultMaxChars({\n contextWindowTokens: opts.contextWindowTokens,\n cfg: opts?.config,\n agentId: opts?.agentId,\n })\n : undefined,\n });\n const tagged = sessionManager as GuardedPiTranscriptManager;\n tagged.flushPendingToolResults = result.flushPendingToolResults;\n tagged.clearPendingToolResults = result.clearPendingToolResults;\n return tagged;\n}\n\n/**\n * Recover the original (un-guarded) appendMessage for a session manager.\n * Useful for callers that need a low-level \"bypass the guard\" write path.\n */\nexport function getRawSessionAppendMessage(\n sessionManager: SessionManager,\n): SessionManager['appendMessage'] {\n const stored = (sessionManager as SessionManagerWithRawAppend)[RAW_APPEND_MESSAGE];\n return stored ?? sessionManager.appendMessage.bind(sessionManager);\n}\n\n// ── Internal: persistence + truncation helpers ──────────────────────────────\n\nfunction resolveMaxToolResultChars(opts: { maxToolResultChars?: number }): number {\n return Math.max(1, opts.maxToolResultChars ?? DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS);\n}\n\nfunction capToolResultSize(msg: AgentMessage, maxChars: number): AgentMessage {\n if ((msg as { role?: string }).role !== 'toolResult') {\n return msg;\n }\n return truncateToolResultMessage(msg, maxChars, {\n suffix: (truncatedChars) => formatContextLimitTruncationNotice(truncatedChars),\n minKeepChars: 2_000,\n });\n}\n\n// `details` is runtime/UI metadata, not model-visible tool output. Keep the\n// session JSONL useful for debugging without letting metadata blobs dominate\n// disk, replay repair, transcript broadcasts, or future tooling that reads raw\n// sessions. Model-visible text belongs in tool result `content`.\nconst MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES = 8_192;\nconst MAX_PERSISTED_DETAIL_STRING_CHARS = 2_000;\nconst MAX_PERSISTED_DETAIL_SESSION_COUNT = 10;\nconst MAX_PERSISTED_DETAIL_FALLBACK_STRING_CHARS = 200;\n\nfunction originalDetailsSizeFields(size: BoundedJsonUtf8Bytes): Record<string, number> {\n return size.complete\n ? { originalDetailsBytes: size.bytes }\n : { originalDetailsBytesAtLeast: size.bytes };\n}\n\nfunction truncatePersistedDetailString(\n value: string,\n maxChars = MAX_PERSISTED_DETAIL_STRING_CHARS,\n): string {\n if (value.length <= maxChars) {\n return value;\n }\n return `${value.slice(0, maxChars)}\\n\\n[xopc persisted detail truncated: ${\n value.length - maxChars\n } chars omitted]`;\n}\n\nfunction sanitizePersistedSessionDetail(value: unknown): unknown {\n if (!value || typeof value !== 'object') {\n return value;\n }\n const src = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of [\n 'sessionId',\n 'status',\n 'pid',\n 'startedAt',\n 'endedAt',\n 'runtimeMs',\n 'cwd',\n 'name',\n 'truncated',\n 'exitCode',\n 'exitSignal',\n ]) {\n const field = src[key];\n if (field !== undefined) {\n out[key] = typeof field === 'string' ? truncatePersistedDetailString(field, 500) : field;\n }\n }\n if (typeof src.command === 'string') {\n out.command = truncatePersistedDetailString(src.command, 500);\n }\n return out;\n}\n\nfunction buildPersistedDetailsFallback(\n src: Record<string, unknown> | undefined,\n originalSize: BoundedJsonUtf8Bytes,\n sanitizedBytes?: number,\n): Record<string, unknown> {\n const fallback: Record<string, unknown> = {\n persistedDetailsTruncated: true,\n finalDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n };\n if (sanitizedBytes !== undefined) {\n fallback.sanitizedDetailsBytes = sanitizedBytes;\n }\n if (src) {\n fallback.originalDetailKeys = firstEnumerableOwnKeys(src, 40);\n for (const key of ['status', 'sessionId', 'pid', 'exitCode', 'exitSignal', 'truncated']) {\n const field = src[key];\n if (field !== undefined) {\n fallback[key] =\n typeof field === 'string'\n ? truncatePersistedDetailString(field, MAX_PERSISTED_DETAIL_FALLBACK_STRING_CHARS)\n : field;\n }\n }\n }\n return fallback;\n}\n\nfunction enforcePersistedDetailsByteCap(\n value: Record<string, unknown>,\n src: Record<string, unknown> | undefined,\n originalSize: BoundedJsonUtf8Bytes,\n): Record<string, unknown> {\n const sanitizedBytes = jsonUtf8BytesOrInfinity(value);\n if (sanitizedBytes <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return value;\n }\n const fallback = buildPersistedDetailsFallback(src, originalSize, sanitizedBytes);\n if (jsonUtf8BytesOrInfinity(fallback) <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return fallback;\n }\n return {\n persistedDetailsTruncated: true,\n finalDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n sanitizedDetailsBytes: sanitizedBytes,\n };\n}\n\nfunction sanitizeToolResultDetailsForPersistence(details: unknown): unknown {\n if (details === undefined || details === null) {\n return details;\n }\n const originalSize = boundedJsonUtf8Bytes(details, MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES);\n if (originalSize.complete && originalSize.bytes <= MAX_PERSISTED_TOOL_RESULT_DETAILS_BYTES) {\n return details;\n }\n if (typeof details !== 'object') {\n return enforcePersistedDetailsByteCap(\n {\n persistedDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n valueType: typeof details,\n },\n undefined,\n originalSize,\n );\n }\n const src = details as Record<string, unknown>;\n const out: Record<string, unknown> = {\n persistedDetailsTruncated: true,\n ...originalDetailsSizeFields(originalSize),\n originalDetailKeys: firstEnumerableOwnKeys(src, 40),\n };\n for (const key of [\n 'status',\n 'sessionId',\n 'pid',\n 'startedAt',\n 'endedAt',\n 'cwd',\n 'name',\n 'exitCode',\n 'exitSignal',\n 'retryInMs',\n 'total',\n 'totalLines',\n 'totalChars',\n 'truncated',\n 'fullOutputPath',\n 'truncation',\n ]) {\n const field = src[key];\n if (field !== undefined) {\n out[key] = typeof field === 'string' ? truncatePersistedDetailString(field) : field;\n }\n }\n if (typeof src.tail === 'string') {\n out.tail = truncatePersistedDetailString(src.tail);\n }\n if (Array.isArray(src.sessions)) {\n out.sessions = src.sessions\n .slice(0, MAX_PERSISTED_DETAIL_SESSION_COUNT)\n .map(sanitizePersistedSessionDetail);\n if (src.sessions.length > MAX_PERSISTED_DETAIL_SESSION_COUNT) {\n out.sessionsTruncated = src.sessions.length - MAX_PERSISTED_DETAIL_SESSION_COUNT;\n }\n }\n return enforcePersistedDetailsByteCap(out, src, originalSize);\n}\n\nfunction capToolResultDetails(msg: AgentMessage): AgentMessage {\n if ((msg as { role?: string }).role !== 'toolResult') {\n return msg;\n }\n const details = (msg as { details?: unknown }).details;\n const sanitizedDetails = sanitizeToolResultDetailsForPersistence(details);\n if (sanitizedDetails === details) {\n return msg;\n }\n const next = { ...msg } as AgentMessage & { details?: unknown };\n next.details = sanitizedDetails;\n return next;\n}\n\nfunction capToolResultForPersistence(msg: AgentMessage, maxChars: number): AgentMessage {\n return capToolResultDetails(capToolResultSize(msg, maxChars));\n}\n\nfunction normalizePersistedToolResultName(\n message: AgentMessage,\n fallbackName?: string,\n): AgentMessage {\n if ((message as { role?: unknown }).role !== 'toolResult') {\n return message;\n }\n const toolResult = message as Extract<AgentMessage, { role: 'toolResult' }>;\n const rawToolName = (toolResult as { toolName?: unknown }).toolName;\n const normalizedToolName = normalizeOptionalString(rawToolName);\n if (normalizedToolName) {\n if (rawToolName === normalizedToolName) {\n return toolResult;\n }\n return { ...toolResult, toolName: normalizedToolName };\n }\n\n const normalizedFallback = normalizeOptionalString(fallbackName);\n if (normalizedFallback) {\n return { ...toolResult, toolName: normalizedFallback };\n }\n\n if (typeof rawToolName === 'string') {\n return { ...toolResult, toolName: 'unknown' };\n }\n return toolResult;\n}\n\n// ── Internal: raw-append symbol storage ─────────────────────────────────────\n\nconst RAW_APPEND_MESSAGE = Symbol('xopc.session.rawAppendMessage');\n\ntype SessionManagerWithRawAppend = SessionManager & {\n [RAW_APPEND_MESSAGE]?: SessionManager['appendMessage'];\n};\n\nfunction rememberOriginalAppend(\n sessionManager: SessionManager,\n): SessionManager['appendMessage'] {\n const tagged = sessionManager as SessionManagerWithRawAppend;\n const stored = tagged[RAW_APPEND_MESSAGE];\n if (stored) {\n return stored;\n }\n const original = sessionManager.appendMessage.bind(sessionManager);\n tagged[RAW_APPEND_MESSAGE] = original;\n return original;\n}\n\n// ── Internal: pending tool-call state ──────────────────────────────────────\n\ntype PendingToolCall = { id: string; name?: string };\n\nclass PendingToolCallTracker {\n private readonly pending = new Map<string, string | undefined>();\n\n size(): number {\n return this.pending.size;\n }\n\n getToolName(id: string): string | undefined {\n return this.pending.get(id);\n }\n\n delete(id: string): void {\n this.pending.delete(id);\n }\n\n clear(): void {\n this.pending.clear();\n }\n\n trackToolCalls(calls: readonly PendingToolCall[]): void {\n for (const call of calls) {\n this.pending.set(call.id, call.name);\n }\n }\n\n entries(): IterableIterator<[string, string | undefined]> {\n return this.pending.entries();\n }\n\n getPendingIds(): string[] {\n return Array.from(this.pending.keys());\n }\n\n shouldFlushForSanitizedDrop(): boolean {\n return this.pending.size > 0;\n }\n\n shouldFlushBeforeNonToolResult(nextRole: unknown, toolCallCount: number): boolean {\n return this.pending.size > 0 && (toolCallCount === 0 || nextRole !== 'assistant');\n }\n\n shouldFlushBeforeNewToolCalls(toolCallCount: number): boolean {\n return this.pending.size > 0 && toolCallCount > 0;\n }\n}\n\n// ── ToolResultGuard class ──────────────────────────────────────────────────\n\nclass ToolResultGuard {\n private readonly sessionManager: SessionManager;\n private readonly opts: ToolResultGuardOptions;\n private readonly pending = new PendingToolCallTracker();\n private readonly originalAppend: SessionManager['appendMessage'];\n private readonly allowSyntheticToolResults: boolean;\n private readonly maxToolResultChars: number;\n\n constructor(sessionManager: SessionManager, opts: ToolResultGuardOptions) {\n this.sessionManager = sessionManager;\n this.opts = opts;\n this.originalAppend = rememberOriginalAppend(sessionManager);\n this.allowSyntheticToolResults = opts.allowSyntheticToolResults ?? true;\n this.maxToolResultChars = resolveMaxToolResultChars(opts);\n }\n\n /** Monkey-patch the session manager so pi-coding-agent's internal appendMessage flows through us. */\n attach(): void {\n const bound = this.guardedAppend.bind(this);\n this.sessionManager.appendMessage = bound as SessionManager['appendMessage'];\n }\n\n flushPending(): void {\n if (this.pending.size() === 0) {\n return;\n }\n if (this.allowSyntheticToolResults) {\n for (const [id, name] of this.pending.entries()) {\n const synthetic = makeMissingToolResult({\n toolCallId: id,\n toolName: name,\n text: this.opts.missingToolResultText,\n });\n const flushed = this.applyBeforeWriteHook(\n this.persistToolResult(this.persistMessage(synthetic), {\n toolCallId: id,\n toolName: name,\n isSynthetic: true,\n }),\n );\n if (flushed) {\n this.originalAppend(capToolResultForPersistence(flushed, this.maxToolResultChars) as never);\n }\n }\n }\n this.pending.clear();\n }\n\n clearPending(): void {\n this.pending.clear();\n }\n\n getPendingIds(): string[] {\n return this.pending.getPendingIds();\n }\n\n private persistMessage(message: AgentMessage): AgentMessage {\n const transformer = this.opts.transformMessageForPersistence;\n return transformer ? transformer(message) : message;\n }\n\n private persistToolResult(\n message: AgentMessage,\n meta: { toolCallId?: string; toolName?: string; isSynthetic?: boolean },\n ): AgentMessage {\n const transformer = this.opts.transformToolResultForPersistence;\n return transformer ? transformer(message, meta) : message;\n }\n\n /**\n * Run the before_message_write hook. Returns the (possibly modified) message,\n * or null if the message should be blocked.\n */\n private applyBeforeWriteHook(msg: AgentMessage): AgentMessage | null {\n const beforeWrite = this.opts.beforeMessageWriteHook;\n if (!beforeWrite) {\n return msg;\n }\n const result = beforeWrite({ message: msg });\n if (result?.block) {\n return null;\n }\n if (result?.message) {\n return result.message;\n }\n return msg;\n }\n\n private guardedAppend(message: AgentMessage): unknown {\n let nextMessage = message;\n const role = (message as { role?: unknown }).role;\n if (role === 'assistant') {\n const sanitized = sanitizeToolCallInputs([message], {\n allowedToolNames: this.opts.allowedToolNames,\n });\n if (sanitized.length === 0) {\n if (this.pending.shouldFlushForSanitizedDrop()) {\n this.flushPending();\n }\n return undefined;\n }\n nextMessage = sanitized[0];\n }\n const nextRole = (nextMessage as { role?: unknown }).role;\n\n if (nextRole === 'toolResult') {\n const id = extractToolResultId(nextMessage as Extract<AgentMessage, { role: 'toolResult' }>);\n const toolName = id ? this.pending.getToolName(id) : undefined;\n if (id) {\n this.pending.delete(id);\n }\n const normalizedToolResult = normalizePersistedToolResultName(nextMessage, toolName);\n // Apply hard size cap before persistence to prevent oversized tool results\n // from consuming the entire context window on subsequent LLM calls.\n const capped = capToolResultForPersistence(\n this.persistMessage(normalizedToolResult),\n this.maxToolResultChars,\n );\n const persisted = this.applyBeforeWriteHook(\n this.persistToolResult(capped, {\n toolCallId: id ?? undefined,\n toolName,\n isSynthetic: false,\n }),\n );\n if (!persisted) {\n return undefined;\n }\n const finalToolResult = capToolResultForPersistence(persisted, this.maxToolResultChars);\n const result = this.originalAppend(finalToolResult as never);\n\n if (this.opts.sessionKey) {\n emitSessionTranscriptUpdate({\n sessionKey: this.opts.sessionKey,\n message: finalToolResult,\n messageId: typeof result === 'string' ? result : undefined,\n });\n }\n\n return result;\n }\n\n // Skip tool call extraction for aborted/errored assistant messages.\n // When stopReason is \"error\" or \"aborted\", the tool_use blocks may be incomplete\n // and should not have synthetic tool_results created. Creating synthetic results\n // for incomplete tool calls causes API 400 errors:\n // \"unexpected tool_use_id found in tool_result blocks\"\n // This matches the behavior in repairToolUseResultPairing (session-transcript-repair.ts)\n const stopReason = (nextMessage as { stopReason?: string }).stopReason;\n const toolCalls =\n nextRole === 'assistant' && stopReason !== 'aborted' && stopReason !== 'error'\n ? extractToolCallsFromAssistant(nextMessage as Extract<AgentMessage, { role: 'assistant' }>)\n : [];\n\n // Always clear pending tool call state before appending non-tool-result messages.\n // flushPendingToolResults() only inserts synthetic results when allowSyntheticToolResults\n // is true; it always clears the pending map. Without this, providers that disable\n // synthetic results (e.g. OpenAI) accumulate stale pending state when a user message\n // interrupts in-flight tool calls, leaving orphaned tool_use blocks in the transcript\n // that cause API 400 errors on subsequent requests.\n if (this.pending.shouldFlushBeforeNonToolResult(nextRole, toolCalls.length)) {\n this.flushPending();\n }\n // If new tool calls arrive while older ones are pending, flush the old ones first.\n if (this.pending.shouldFlushBeforeNewToolCalls(toolCalls.length)) {\n this.flushPending();\n }\n\n const finalMessage = this.applyBeforeWriteHook(this.persistMessage(nextMessage));\n if (!finalMessage) {\n return undefined;\n }\n const result = this.originalAppend(finalMessage as never);\n\n if (this.opts.sessionKey) {\n emitSessionTranscriptUpdate({\n sessionKey: this.opts.sessionKey,\n message: finalMessage,\n messageId: typeof result === 'string' ? result : undefined,\n });\n }\n\n if (toolCalls.length > 0) {\n this.pending.trackToolCalls(toolCalls);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
@@ -8,6 +8,7 @@ export type DecomposeChecklistResult = {
8
8
  };
9
9
  export declare function decomposeGoalChecklist(opts: {
10
10
  goal: string;
11
+ existingChecklist?: string;
11
12
  judgeModelRef: string;
12
13
  signal?: AbortSignal;
13
14
  judgeTimeoutMs?: number;
@@ -39,6 +40,7 @@ export declare function evaluateGoalChecklistJudge(opts: {
39
40
  numberedChecklist: string;
40
41
  lastResponse: string;
41
42
  historyExcerpt: string;
43
+ goalContextExcerpt?: string;
42
44
  judgeModelRef: string;
43
45
  signal?: AbortSignal;
44
46
  judgeTimeoutMs?: number;
@@ -8,7 +8,7 @@ init_providers();
8
8
  const GOAL_TRUNC = 4e3;
9
9
  const RESPONSE_SNIPPET = 4e3;
10
10
  const HISTORY_TRUNC = 24e3;
11
- const DECOMPOSE_SYSTEM = "You break a user goal into an EXTREMELY detailed checklist of concrete, verifiable completion criteria. Bias toward more items. Each item is one factual statement about finished work.\n\nReply ONLY with a single JSON object on one line:\n{\"items\":[{\"text\":\"...\"},...]}\nUse at least 3 items when the goal warrants it.";
11
+ const DECOMPOSE_SYSTEM = "You break a user goal into an EXTREMELY detailed checklist of concrete, verifiable completion criteria. Bias toward more items. Each item is one factual statement about finished work.\n\nIf existing acceptance criteria are provided, return only missing supplemental criteria. Do not repeat, rewrite, or replace existing criteria.\n\nReply ONLY with a single JSON object on one line:\n{\"items\":[{\"text\":\"...\"},...]}\nUse at least 3 items when the goal warrants it.";
12
12
  const DECOMPOSE_USER = "Goal:\n{goal}\n\nReturn JSON only.";
13
13
  const EVALUATE_CHECKLIST_SYSTEM = "You evaluate an autonomous agent's progress on a goal with a numbered checklist.\nFor each pending item, decide if evidence in the agent snippet and/or history excerpt shows it is satisfied.\nFlip pending→completed only with clear evidence; pending→impossible only if truly unachievable here.\nDo not regress completed/impossible items — omit them from updates.\n\nReply ONLY with one JSON object on one line:\n{\"verdict\":\"continue|done|blocked|needs_input\",\"confidence\":0.0,\"reason\":\"...\",\"nextAction\":\"...\",\"missingEvidence\":[\"...\"],\"userQuestion\":\"...\",\"updates\":[{\"index\":1,\"status\":\"completed|impossible\",\"evidence\":\"short citation\"}],\"new_items\":[{\"text\":\"...\"}]}\nUse verdict=done only when all checklist criteria are complete/impossible. Use needs_input when the next step requires user input. Use blocked when external progress is impossible.";
14
14
  function extractJsonObject(raw) {
@@ -52,9 +52,10 @@ async function decomposeGoalChecklist(opts) {
52
52
  const timer = setTimeout(() => controller.abort(), timeoutMs);
53
53
  const merged = opts.signal ? AbortSignal.any([opts.signal, controller.signal]) : controller.signal;
54
54
  try {
55
+ const existingChecklist = opts.existingChecklist?.trim();
55
56
  const user = {
56
57
  role: "user",
57
- content: `${DECOMPOSE_SYSTEM}\n\n${DECOMPOSE_USER.replace("{goal}", truncateGoalText(goal, GOAL_TRUNC))}` + judgeResponseLanguageNote(locale),
58
+ content: `${DECOMPOSE_SYSTEM}\n\n${DECOMPOSE_USER.replace("{goal}", truncateGoalText(goal, GOAL_TRUNC)) + (existingChecklist ? `\n\nExisting acceptance criteria:\n${truncateGoalText(existingChecklist, GOAL_TRUNC)}\n\nReturn only missing supplemental criteria as JSON.` : "")}` + judgeResponseLanguageNote(locale),
58
59
  timestamp: Date.now()
59
60
  };
60
61
  const apiKey = await resolveGoalJudgeApiKey(model);
@@ -125,7 +126,7 @@ async function evaluateGoalChecklistJudge(opts) {
125
126
  parseFailed: false
126
127
  };
127
128
  }
128
- const userBody = `Goal:\n${truncateGoalText(opts.goal, 2e3)}\n\nCurrent checklist (1-based indices):\n${opts.numberedChecklist}\n\nAgent's most recent response (snippet):\n${truncateGoalText(opts.lastResponse, RESPONSE_SNIPPET)}\n\nRecent conversation excerpt (JSON or text, may be truncated):\n${truncateGoalText(opts.historyExcerpt, HISTORY_TRUNC) || "(none)"}`;
129
+ const userBody = `Goal:\n${truncateGoalText(opts.goal, 2e3)}\n\nCurrent checklist (1-based indices):\n${opts.numberedChecklist}\n\nOriginal goal context and attachments:\n${truncateGoalText(opts.goalContextExcerpt ?? "", 4e3) || "(none)"}\n\nAgent's most recent response (snippet):\n${truncateGoalText(opts.lastResponse, RESPONSE_SNIPPET)}\n\nRecent conversation excerpt (JSON or text, may be truncated):\n${truncateGoalText(opts.historyExcerpt, HISTORY_TRUNC) || "(none)"}`;
129
130
  const timeoutMs = typeof opts.judgeTimeoutMs === "number" && Number.isFinite(opts.judgeTimeoutMs) ? Math.max(5e3, Math.min(12e4, Math.floor(opts.judgeTimeoutMs))) : DEFAULT_JUDGE_TIMEOUT_MS;
130
131
  const controller = new AbortController();
131
132
  const timer = setTimeout(() => controller.abort(), timeoutMs);