@xopcai/xopc 0.0.142 → 0.0.143

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 (543) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  135. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  136. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  137. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  138. package/dist/src/agent/goals/post-turn.js +5 -4
  139. package/dist/src/agent/goals/post-turn.js.map +1 -1
  140. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  141. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  142. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  143. package/dist/src/agent/memory/context/planner.js +60 -14
  144. package/dist/src/agent/memory/context/planner.js.map +1 -1
  145. package/dist/src/agent/memory/context/types.d.ts +3 -1
  146. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  147. package/dist/src/agent/memory/lifecycle.js +50 -0
  148. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  149. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  150. package/dist/src/agent/memory/source-origin.js +19 -0
  151. package/dist/src/agent/memory/source-origin.js.map +1 -0
  152. package/dist/src/agent/memory/understanding/service.js +5 -0
  153. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  154. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  155. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  156. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  157. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  158. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  159. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  161. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  162. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  163. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  164. package/dist/src/agent/prompt/system-prompt.js +6 -3
  165. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  166. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  167. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  168. package/dist/src/agent/service.d.ts +2 -0
  169. package/dist/src/agent/service.js +9 -3
  170. package/dist/src/agent/service.js.map +1 -1
  171. package/dist/src/agent/starter-agents.js +1 -1
  172. package/dist/src/agent/starter-agents.js.map +1 -1
  173. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  174. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  175. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  176. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  177. package/dist/src/agent/tools/composio-tool.js +252 -35
  178. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  179. package/dist/src/agent/tools/factory.js +7 -3
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  184. package/dist/src/agent/tools/workflow-tool.js +3 -16
  185. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  186. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  187. package/dist/src/agent/workflow/builtins/index.js +226 -41
  188. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  190. package/dist/src/agent/workflow/catalog.js +158 -154
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/index.d.ts +4 -6
  193. package/dist/src/agent/workflow/index.js +2 -5
  194. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  195. package/dist/src/agent/workflow/snapshot.js +2 -2
  196. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  197. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  198. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  199. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  200. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  201. package/dist/src/agent/workflow/types.d.ts +31 -26
  202. package/dist/src/agent-manifest/index.d.ts +1 -0
  203. package/dist/src/agent-manifest/index.js +3 -1
  204. package/dist/src/agent-manifest/index.js.map +1 -1
  205. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  206. package/dist/src/agent-manifest/preset-chain.js +32 -0
  207. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  208. package/dist/src/agent-manifest/resolver.js +3 -10
  209. package/dist/src/agent-manifest/resolver.js.map +1 -1
  210. package/dist/src/agent-manifest/schema.d.ts +4 -4
  211. package/dist/src/automations/api/routes.js +13 -1
  212. package/dist/src/automations/api/routes.js.map +1 -1
  213. package/dist/src/automations/domain/validation.d.ts +14 -14
  214. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  215. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  216. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  217. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  218. package/dist/src/capabilities/store-connector.d.ts +0 -1
  219. package/dist/src/capabilities/store-connector.js +3 -5
  220. package/dist/src/capabilities/store-connector.js.map +1 -1
  221. package/dist/src/chat-commands/builtins/review.js +72 -73
  222. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  223. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  224. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  225. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  226. package/dist/src/cli/commands/extension-create.js +2 -2
  227. package/dist/src/cli/commands/extension-create.js.map +1 -1
  228. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  229. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  230. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  231. package/dist/src/cli/commands/extension-pack.js +3 -2
  232. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  233. package/dist/src/commands/agents.config.d.ts +1 -0
  234. package/dist/src/commands/agents.config.js +1 -0
  235. package/dist/src/commands/agents.config.js.map +1 -1
  236. package/dist/src/config/schema.d.ts +6 -6
  237. package/dist/src/config/schema.js +6 -22
  238. package/dist/src/config/schema.js.map +1 -1
  239. package/dist/src/config/web-patch.d.ts +1 -1
  240. package/dist/src/connectors/approval.d.ts +2 -0
  241. package/dist/src/connectors/approval.js +33 -0
  242. package/dist/src/connectors/approval.js.map +1 -0
  243. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  244. package/dist/src/connectors/auth-provider-registry.js +17 -0
  245. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  246. package/dist/src/connectors/builtin-catalog.js +55 -116
  247. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  248. package/dist/src/connectors/catalog.js +7 -2
  249. package/dist/src/connectors/catalog.js.map +1 -1
  250. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  251. package/dist/src/connectors/composio-catalog.js +237 -0
  252. package/dist/src/connectors/composio-catalog.js.map +1 -0
  253. package/dist/src/connectors/composio-logo.d.ts +1 -0
  254. package/dist/src/connectors/composio-logo.js +51 -0
  255. package/dist/src/connectors/composio-logo.js.map +1 -0
  256. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  257. package/dist/src/connectors/composio-sessions.js +296 -0
  258. package/dist/src/connectors/composio-sessions.js.map +1 -0
  259. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  260. package/dist/src/connectors/composio-triggers.js +48 -5
  261. package/dist/src/connectors/composio-triggers.js.map +1 -1
  262. package/dist/src/connectors/composio.d.ts +31 -2
  263. package/dist/src/connectors/composio.js +374 -151
  264. package/dist/src/connectors/composio.js.map +1 -1
  265. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  266. package/dist/src/connectors/connector-memory-sync.js +90 -0
  267. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  268. package/dist/src/connectors/install.js +35 -92
  269. package/dist/src/connectors/install.js.map +1 -1
  270. package/dist/src/connectors/instances.js +6 -2
  271. package/dist/src/connectors/instances.js.map +1 -1
  272. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  273. package/dist/src/connectors/integration-strategy.js +29 -0
  274. package/dist/src/connectors/integration-strategy.js.map +1 -0
  275. package/dist/src/connectors/policy.d.ts +13 -0
  276. package/dist/src/connectors/policy.js +48 -0
  277. package/dist/src/connectors/policy.js.map +1 -0
  278. package/dist/src/connectors/providers.js +1 -1
  279. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  280. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  281. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  282. package/dist/src/connectors/types.d.ts +113 -4
  283. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  284. package/dist/src/connectors/workflow-preflight.js +70 -0
  285. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  286. package/dist/src/extensions/install-transaction.d.ts +16 -0
  287. package/dist/src/extensions/install-transaction.js +76 -0
  288. package/dist/src/extensions/install-transaction.js.map +1 -0
  289. package/dist/src/extensions/install.d.ts +2 -0
  290. package/dist/src/extensions/install.js +23 -1
  291. package/dist/src/extensions/install.js.map +1 -1
  292. package/dist/src/gateway/agents-admin.d.ts +2 -0
  293. package/dist/src/gateway/agents-admin.js +7 -0
  294. package/dist/src/gateway/agents-admin.js.map +1 -1
  295. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  296. package/dist/src/gateway/capability-presets-admin.js +11 -4
  297. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  298. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  299. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  300. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  301. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  302. package/dist/src/gateway/hono/routes/agents.js +3 -0
  303. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  304. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  305. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  306. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  307. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  308. package/dist/src/gateway/hono/routes/goals.js +22 -3
  309. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  310. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  311. package/dist/src/gateway/hono/routes/home.js +244 -18
  312. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  313. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  314. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  315. package/dist/src/gateway/hono/routes/memory.js +14 -1
  316. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  317. package/dist/src/gateway/hono/routes/projects.js +103 -2
  318. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  319. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  320. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  321. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  322. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  323. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  324. package/dist/src/gateway/hono/routes/you.js +538 -0
  325. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  326. package/dist/src/gateway/hono/sse.d.ts +2 -1
  327. package/dist/src/gateway/hono/sse.js +2 -1
  328. package/dist/src/gateway/hono/sse.js.map +1 -1
  329. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  330. package/dist/src/gateway/service/marketplace-service.js +96 -40
  331. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  332. package/dist/src/gateway/service.d.ts +2 -0
  333. package/dist/src/gateway/service.js +7 -1
  334. package/dist/src/gateway/service.js.map +1 -1
  335. package/dist/src/goals/goal-service.d.ts +7 -5
  336. package/dist/src/goals/goal-service.js +25 -13
  337. package/dist/src/goals/goal-service.js.map +1 -1
  338. package/dist/src/goals/goal-store.js +46 -7
  339. package/dist/src/goals/goal-store.js.map +1 -1
  340. package/dist/src/goals/types.d.ts +24 -0
  341. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  342. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  343. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/index.d.ts +3 -0
  345. package/dist/src/storage/sqlite/index.js +4 -1
  346. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  347. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  348. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  349. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  350. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  351. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  352. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  353. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  354. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  355. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  356. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  357. package/dist/src/storage/sqlite/schema.js +1 -1
  358. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  359. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  360. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  361. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  362. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  363. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  364. package/dist/src/tui/components/assistant-message.js +15 -0
  365. package/dist/src/tui/components/assistant-message.js.map +1 -1
  366. package/dist/src/tui/tui-agent-events.js +85 -1
  367. package/dist/src/tui/tui-agent-events.js.map +1 -1
  368. package/dist/src/tui/tui-command-formatters.js +7 -7
  369. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  370. package/dist/src/tui/tui-commands.js +1 -1
  371. package/dist/src/tui/tui-startup-resources.js +1 -1
  372. package/dist/src/user-context/import.d.ts +12 -0
  373. package/dist/src/user-context/import.js +48 -0
  374. package/dist/src/user-context/import.js.map +1 -0
  375. package/dist/src/user-context/profile.d.ts +37 -0
  376. package/dist/src/user-context/profile.js +165 -0
  377. package/dist/src/user-context/profile.js.map +1 -0
  378. package/dist/src/user-context/projection.d.ts +54 -0
  379. package/dist/src/user-context/projection.js +121 -0
  380. package/dist/src/user-context/projection.js.map +1 -0
  381. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  382. package/dist/src/user-context/source-recommendations.js +86 -0
  383. package/dist/src/user-context/source-recommendations.js.map +1 -0
  384. package/dist/src/user-context/trust-policy.d.ts +11 -0
  385. package/dist/src/user-context/trust-policy.js +31 -0
  386. package/dist/src/user-context/trust-policy.js.map +1 -0
  387. package/dist/src/workflows/authoring/index.d.ts +1 -0
  388. package/dist/src/workflows/authoring/index.js +2 -0
  389. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  390. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  391. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  392. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  393. package/dist/src/workflows/domain/definition-utils.js +28 -26
  394. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  395. package/dist/src/workflows/domain/definition.d.ts +79 -6
  396. package/dist/src/workflows/domain/event.d.ts +18 -2
  397. package/dist/src/workflows/domain/index.js +3 -3
  398. package/dist/src/workflows/domain/run.d.ts +16 -2
  399. package/dist/src/workflows/domain/run.js.map +1 -1
  400. package/dist/src/workflows/domain/validation.d.ts +9 -5
  401. package/dist/src/workflows/domain/validation.js +183 -40
  402. package/dist/src/workflows/domain/validation.js.map +1 -1
  403. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  404. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  405. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  406. package/dist/src/workflows/draft/workflow-draft-service.js +4 -8
  407. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  408. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  409. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  410. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  411. package/dist/src/workflows/engine/projector.js +43 -1
  412. package/dist/src/workflows/engine/projector.js.map +1 -1
  413. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  414. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  415. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  416. package/dist/src/workflows/index.js +4 -7
  417. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  418. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  419. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  420. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  421. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  422. package/dist/src/workflows/runtime/index.d.ts +1 -2
  423. package/dist/src/workflows/runtime/index.js +2 -5
  424. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  425. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  426. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  427. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  428. package/package.json +4 -3
  429. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  430. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  431. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  432. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  433. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  434. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  435. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  436. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  437. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  438. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  439. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  440. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  441. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  442. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  443. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  444. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  445. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  446. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  447. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  448. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  449. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  450. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  451. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  452. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  453. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  454. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  455. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  456. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  457. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  458. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  459. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  460. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  461. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  462. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  463. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  464. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  465. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  466. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  467. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  468. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  469. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  470. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  471. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  472. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  473. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  474. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  475. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  476. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  477. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  478. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  479. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  480. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  481. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  482. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  483. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  484. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  485. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  486. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  487. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  488. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  489. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  490. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  491. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  492. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  493. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  494. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  495. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  496. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  497. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  498. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  499. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  500. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  501. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  502. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  503. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  504. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  505. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  506. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  507. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  508. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  509. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  510. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  511. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  512. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  513. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  514. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  515. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  516. package/dist/src/agent/workflow/builtins/research.js +0 -188
  517. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  518. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  519. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  520. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  521. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  522. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  523. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  524. package/dist/src/agent/workflow/lint.d.ts +0 -38
  525. package/dist/src/agent/workflow/lint.js +0 -74
  526. package/dist/src/agent/workflow/lint.js.map +0 -1
  527. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  528. package/dist/src/agent/workflow/meta-locale.js +0 -62
  529. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  530. package/dist/src/agent/workflow/parser.d.ts +0 -20
  531. package/dist/src/agent/workflow/parser.js +0 -152
  532. package/dist/src/agent/workflow/parser.js.map +0 -1
  533. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  534. package/dist/src/agent/workflow/runtime.js +0 -402
  535. package/dist/src/agent/workflow/runtime.js.map +0 -1
  536. package/dist/src/connectors/oauth.d.ts +0 -22
  537. package/dist/src/connectors/oauth.js +0 -99
  538. package/dist/src/connectors/oauth.js.map +0 -1
  539. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  540. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  541. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  542. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  543. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ CREATE TABLE IF NOT EXISTS user_profile_prompt_state (
2
+ principal_id TEXT PRIMARY KEY,
3
+ state TEXT NOT NULL DEFAULT 'active' CHECK (state IN ('active', 'snoozed')),
4
+ suggestion_hash TEXT,
5
+ snoozed_until TEXT,
6
+ updated_at TEXT NOT NULL
7
+ );
@@ -0,0 +1,12 @@
1
+ CREATE TABLE IF NOT EXISTS goal_contracts (
2
+ goal_id TEXT PRIMARY KEY,
3
+ version INTEGER NOT NULL DEFAULT 1,
4
+ objective TEXT NOT NULL,
5
+ scope_boundary TEXT,
6
+ evidence_plan_json TEXT NOT NULL DEFAULT '[]',
7
+ created_at INTEGER NOT NULL,
8
+ updated_at INTEGER NOT NULL,
9
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
10
+ );
11
+
12
+ ALTER TABLE goal_contracts ADD COLUMN outcome_metric_json TEXT;
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 29;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 36;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
12
12
  /** Baseline schema version applied from schema.sql on first open. */
13
13
  const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 29;
15
+ const XOPC_DB_SCHEMA_VERSION = 36;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function resolveMigrationsDir(override) {
18
18
  if (override) return override;
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
46
46
  * Each step runs in its own transaction and updates schema_meta on success.
47
47
  */
48
48
  function applyPendingMigrations(db, options = {}) {
49
- const targetVersion = options.targetVersion ?? 29;
49
+ const targetVersion = options.targetVersion ?? 36;
50
50
  let currentVersion = readSchemaVersion(db);
51
51
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
52
52
  if (currentVersion >= targetVersion) return currentVersion;
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
62
62
  }
63
63
  /** Inspect schema version without mutating the database. */
64
64
  function inspectSchemaMigrationStatus(db, options = {}) {
65
- const appVersion = options.targetVersion ?? 29;
65
+ const appVersion = options.targetVersion ?? 36;
66
66
  const dbVersion = readSchemaVersion(db);
67
67
  if (dbVersion > appVersion) return {
68
68
  dbVersion,
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 29;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
1
+ {"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 36;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
19
19
  export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 29;
22
+ export const XOPC_DB_SCHEMA_VERSION = 36;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -31,7 +31,7 @@ function ensureXopcDatabaseSchema(db) {
31
31
  bootstrapFreshDatabase(db);
32
32
  currentVersion = 11;
33
33
  }
34
- applyPendingMigrations(db, { targetVersion: 29 });
34
+ applyPendingMigrations(db, { targetVersion: 36 });
35
35
  }
36
36
  //#endregion
37
37
  export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
@@ -0,0 +1,3 @@
1
+ import type { UserProfilePromptState } from '../../user-context/profile.js';
2
+ export declare function getUserProfilePromptState(principalId?: string): UserProfilePromptState;
3
+ export declare function setUserProfilePromptState(input: Pick<UserProfilePromptState, 'state' | 'suggestionHash' | 'snoozedUntil'>, principalId?: string): UserProfilePromptState;
@@ -0,0 +1,34 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ //#region src/storage/sqlite/user-profile-setup-repository.ts
3
+ function fromRow(row) {
4
+ return {
5
+ state: row.state,
6
+ suggestionHash: row.suggestion_hash ?? void 0,
7
+ snoozedUntil: row.snoozed_until ?? void 0,
8
+ updatedAt: row.updated_at
9
+ };
10
+ }
11
+ function getUserProfilePromptState(principalId = "local-owner") {
12
+ const row = getSqliteDatabase().prepare("SELECT * FROM user_profile_prompt_state WHERE principal_id = ?").get(principalId);
13
+ return row ? fromRow(row) : { state: "active" };
14
+ }
15
+ function setUserProfilePromptState(input, principalId = "local-owner") {
16
+ const updatedAt = (/* @__PURE__ */ new Date()).toISOString();
17
+ return runSqliteWriteTransaction((db) => {
18
+ db.prepare(`
19
+ INSERT INTO user_profile_prompt_state (
20
+ principal_id, state, suggestion_hash, snoozed_until, updated_at
21
+ ) VALUES (?, ?, ?, ?, ?)
22
+ ON CONFLICT(principal_id) DO UPDATE SET
23
+ state = excluded.state,
24
+ suggestion_hash = excluded.suggestion_hash,
25
+ snoozed_until = excluded.snoozed_until,
26
+ updated_at = excluded.updated_at
27
+ `).run(principalId, input.state, input.suggestionHash ?? null, input.snoozedUntil ?? null, updatedAt);
28
+ return getUserProfilePromptState(principalId);
29
+ });
30
+ }
31
+ //#endregion
32
+ export { getUserProfilePromptState, setUserProfilePromptState };
33
+
34
+ //# sourceMappingURL=user-profile-setup-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-profile-setup-repository.js","names":[],"sources":["../../../../src/storage/sqlite/user-profile-setup-repository.ts"],"sourcesContent":["import type { UserProfilePromptState } from '../../user-context/profile.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype ProfilePromptRow = {\n principal_id: string;\n state: 'active' | 'snoozed';\n suggestion_hash: string | null;\n snoozed_until: string | null;\n updated_at: string;\n};\n\nfunction fromRow(row: ProfilePromptRow): UserProfilePromptState {\n return {\n state: row.state,\n suggestionHash: row.suggestion_hash ?? undefined,\n snoozedUntil: row.snoozed_until ?? undefined,\n updatedAt: row.updated_at,\n };\n}\n\nexport function getUserProfilePromptState(principalId = 'local-owner'): UserProfilePromptState {\n const row = getSqliteDatabase()\n .prepare('SELECT * FROM user_profile_prompt_state WHERE principal_id = ?')\n .get(principalId) as ProfilePromptRow | undefined;\n return row ? fromRow(row) : { state: 'active' };\n}\n\nexport function setUserProfilePromptState(\n input: Pick<UserProfilePromptState, 'state' | 'suggestionHash' | 'snoozedUntil'>,\n principalId = 'local-owner',\n): UserProfilePromptState {\n const updatedAt = new Date().toISOString();\n return runSqliteWriteTransaction((db) => {\n db.prepare(`\n INSERT INTO user_profile_prompt_state (\n principal_id, state, suggestion_hash, snoozed_until, updated_at\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(principal_id) DO UPDATE SET\n state = excluded.state,\n suggestion_hash = excluded.suggestion_hash,\n snoozed_until = excluded.snoozed_until,\n updated_at = excluded.updated_at\n `).run(\n principalId,\n input.state,\n input.suggestionHash ?? null,\n input.snoozedUntil ?? null,\n updatedAt,\n );\n return getUserProfilePromptState(principalId);\n });\n}\n"],"mappings":";;AAWA,SAAS,QAAQ,KAA+C;AAC9D,QAAO;EACL,OAAO,IAAI;EACX,gBAAgB,IAAI,mBAAmB,KAAA;EACvC,cAAc,IAAI,iBAAiB,KAAA;EACnC,WAAW,IAAI;EAChB;;AAGH,SAAgB,0BAA0B,cAAc,eAAuC;CAC7F,MAAM,MAAM,mBAAmB,CAC5B,QAAQ,iEAAiE,CACzE,IAAI,YAAY;AACnB,QAAO,MAAM,QAAQ,IAAI,GAAG,EAAE,OAAO,UAAU;;AAGjD,SAAgB,0BACd,OACA,cAAc,eACU;CACxB,MAAM,6BAAY,IAAI,MAAM,EAAC,aAAa;AAC1C,QAAO,2BAA2B,OAAO;AACvC,KAAG,QAAQ;;;;;;;;;MAST,CAAC,IACD,aACA,MAAM,OACN,MAAM,kBAAkB,MACxB,MAAM,gBAAgB,MACtB,UACD;AACD,SAAO,0BAA0B,YAAY;GAC7C"}
@@ -0,0 +1,3 @@
1
+ import { type UserTrustLevel, type UserTrustPolicy } from '../../user-context/trust-policy.js';
2
+ export declare function getUserTrustPolicy(principalId?: string): UserTrustPolicy;
3
+ export declare function setUserTrustPolicy(defaultActionLevel: UserTrustLevel, principalId?: string): UserTrustPolicy;
@@ -0,0 +1,34 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { DEFAULT_USER_TRUST_LEVEL, isUserTrustLevel } from "../../user-context/trust-policy.js";
3
+ //#region src/storage/sqlite/user-trust-repository.ts
4
+ function fromRow(row) {
5
+ return {
6
+ principalId: row.principal_id,
7
+ defaultActionLevel: isUserTrustLevel(row.default_action_level) ? row.default_action_level : DEFAULT_USER_TRUST_LEVEL,
8
+ updatedAt: row.updated_at
9
+ };
10
+ }
11
+ function getUserTrustPolicy(principalId = "local-owner") {
12
+ const row = getSqliteDatabase().prepare("SELECT * FROM user_trust_policies WHERE principal_id = ?").get(principalId);
13
+ return row ? fromRow(row) : {
14
+ principalId,
15
+ defaultActionLevel: DEFAULT_USER_TRUST_LEVEL
16
+ };
17
+ }
18
+ function setUserTrustPolicy(defaultActionLevel, principalId = "local-owner") {
19
+ const updatedAt = (/* @__PURE__ */ new Date()).toISOString();
20
+ return runSqliteWriteTransaction((db) => {
21
+ db.prepare(`
22
+ INSERT INTO user_trust_policies (principal_id, default_action_level, updated_at)
23
+ VALUES (?, ?, ?)
24
+ ON CONFLICT(principal_id) DO UPDATE SET
25
+ default_action_level = excluded.default_action_level,
26
+ updated_at = excluded.updated_at
27
+ `).run(principalId, defaultActionLevel, updatedAt);
28
+ return getUserTrustPolicy(principalId);
29
+ });
30
+ }
31
+ //#endregion
32
+ export { getUserTrustPolicy, setUserTrustPolicy };
33
+
34
+ //# sourceMappingURL=user-trust-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-trust-repository.js","names":[],"sources":["../../../../src/storage/sqlite/user-trust-repository.ts"],"sourcesContent":["import {\n DEFAULT_USER_TRUST_LEVEL,\n isUserTrustLevel,\n type UserTrustLevel,\n type UserTrustPolicy,\n} from '../../user-context/trust-policy.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype UserTrustPolicyRow = {\n principal_id: string;\n default_action_level: string;\n updated_at: string;\n};\n\nfunction fromRow(row: UserTrustPolicyRow): UserTrustPolicy {\n return {\n principalId: row.principal_id,\n defaultActionLevel: isUserTrustLevel(row.default_action_level)\n ? row.default_action_level\n : DEFAULT_USER_TRUST_LEVEL,\n updatedAt: row.updated_at,\n };\n}\n\nexport function getUserTrustPolicy(principalId = 'local-owner'): UserTrustPolicy {\n const row = getSqliteDatabase()\n .prepare('SELECT * FROM user_trust_policies WHERE principal_id = ?')\n .get(principalId) as UserTrustPolicyRow | undefined;\n return row ? fromRow(row) : {\n principalId,\n defaultActionLevel: DEFAULT_USER_TRUST_LEVEL,\n };\n}\n\nexport function setUserTrustPolicy(\n defaultActionLevel: UserTrustLevel,\n principalId = 'local-owner',\n): UserTrustPolicy {\n const updatedAt = new Date().toISOString();\n return runSqliteWriteTransaction((db) => {\n db.prepare(`\n INSERT INTO user_trust_policies (principal_id, default_action_level, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(principal_id) DO UPDATE SET\n default_action_level = excluded.default_action_level,\n updated_at = excluded.updated_at\n `).run(principalId, defaultActionLevel, updatedAt);\n return getUserTrustPolicy(principalId);\n });\n}\n"],"mappings":";;;AAcA,SAAS,QAAQ,KAA0C;AACzD,QAAO;EACL,aAAa,IAAI;EACjB,oBAAoB,iBAAiB,IAAI,qBAAqB,GAC1D,IAAI,uBACJ;EACJ,WAAW,IAAI;EAChB;;AAGH,SAAgB,mBAAmB,cAAc,eAAgC;CAC/E,MAAM,MAAM,mBAAmB,CAC5B,QAAQ,2DAA2D,CACnE,IAAI,YAAY;AACnB,QAAO,MAAM,QAAQ,IAAI,GAAG;EAC1B;EACA,oBAAoB;EACrB;;AAGH,SAAgB,mBACd,oBACA,cAAc,eACG;CACjB,MAAM,6BAAY,IAAI,MAAM,EAAC,aAAa;AAC1C,QAAO,2BAA2B,OAAO;AACvC,KAAG,QAAQ;;;;;;MAMT,CAAC,IAAI,aAAa,oBAAoB,UAAU;AAClD,SAAO,mBAAmB,YAAY;GACtC"}
@@ -28,6 +28,20 @@ function isMechanicalToolSummaryLine(line) {
28
28
  }
29
29
  function reviewMarkdown(block) {
30
30
  const findings = Array.isArray(block.findings) ? block.findings : [];
31
+ const status = typeof block.status === "string" ? block.status : "complete";
32
+ const target = typeof block.target === "string" ? block.target : "working tree changes";
33
+ const draft = typeof block.analysisMarkdown === "string" ? block.analysisMarkdown.trim() : "";
34
+ const errorMessage = typeof block.errorMessage === "string" ? block.errorMessage : "";
35
+ if (status === "preparing" || status === "reviewing") {
36
+ const lines = [
37
+ "<< Code review >>",
38
+ "",
39
+ `Reviewing ${target}`,
40
+ status === "preparing" ? "Collecting changes…" : "Review assistant is analyzing the changes…"
41
+ ];
42
+ if (draft) lines.push("", "Review assistant", "", draft);
43
+ return lines.join("\n");
44
+ }
31
45
  const lines = [
32
46
  "<< Code review finished >>",
33
47
  "",
@@ -59,6 +73,7 @@ function reviewMarkdown(block) {
59
73
  lines.push("");
60
74
  lines.push(`Overall correctness: ${correctness}`);
61
75
  if (explanation) lines.push(explanation);
76
+ if (errorMessage) lines.push("", `Review assistant could not complete: ${errorMessage}`);
62
77
  return lines.join("\n");
63
78
  }
64
79
  function hasToolCalls(message) {
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.js","names":[],"sources":["../../../../src/tui/components/assistant-message.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { Container, Markdown, Spacer, Text } from '@earendil-works/pi-tui';\n\nimport { markdownTheme, theme } from '../theme.js';\n\nconst OSC133_ZONE_START = '\\x1b]133;A\\x07';\nconst OSC133_ZONE_END = '\\x1b]133;B\\x07';\nconst OSC133_ZONE_FINAL = '\\x1b]133;C\\x07';\n\nexport type AssistantMessageOptions = {\n hideThinkingBlock?: boolean;\n hiddenThinkingLabel?: string;\n};\n\ntype ContentBlock = Record<string, unknown> & { type?: string };\n\nfunction contentBlocks(message: AgentMessage | undefined): ContentBlock[] {\n const content = (message as { content?: unknown } | undefined)?.content;\n if (typeof content === 'string') {\n return content.trim() ? [{ type: 'text', text: content }] : [];\n }\n return Array.isArray(content)\n ? content.filter((block): block is ContentBlock => !!block && typeof block === 'object')\n : [];\n}\n\nfunction blockText(block: ContentBlock, key: 'text' | 'thinking'): string {\n const value = block[key];\n return typeof value === 'string' ? value : '';\n}\n\nfunction compactToolAdjacentText(text: string, linkedToolCall: boolean): string {\n if (!linkedToolCall) return text;\n const lines = text.split('\\n');\n const kept = lines.filter((line) => !isMechanicalToolSummaryLine(line));\n return kept.join('\\n').trim();\n}\n\nfunction isMechanicalToolSummaryLine(line: string): boolean {\n const normalized = line.trim();\n if (!normalized) return false;\n const withoutBullet = normalized.replace(/^[-*•]\\s+/, '');\n return (\n /^(Added|Deleted|Edited|Modified|Updated)\\s+.+\\(\\+\\d+\\s+-\\d+\\)\\.?$/i.test(withoutBullet) ||\n /^Edited\\s+\\d+\\s+files?\\s+\\(\\+\\d+\\s+-\\d+\\)\\.?$/i.test(withoutBullet) ||\n /^Created\\s+.+\\(\\+\\d+\\s+-0\\)\\.?$/i.test(withoutBullet) ||\n /^Removed\\s+.+\\(\\+0\\s+-\\d+\\)\\.?$/i.test(withoutBullet)\n );\n}\n\nfunction reviewMarkdown(block: ContentBlock): string {\n const findings = Array.isArray(block.findings) ? block.findings : [];\n const lines: string[] = ['<< Code review finished >>', '', 'Code review', ''];\n const source = typeof block.source === 'string' ? block.source : '';\n const correctness = typeof block.overallCorrectness === 'string' ? block.overallCorrectness : 'unknown';\n const modelReviewIncomplete = source === 'local' && correctness === 'unknown';\n if (findings.length === 0) {\n lines.push(modelReviewIncomplete ? 'No model findings were produced.' : 'No findings.');\n } else {\n lines.push('Findings:');\n for (const item of findings) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue;\n const rec = item as Record<string, unknown>;\n const title = typeof rec.title === 'string' ? rec.title : '';\n const body = typeof rec.body === 'string' ? rec.body : '';\n const priority = typeof rec.priority === 'number' ? rec.priority : 2;\n const filePath = typeof rec.filePath === 'string' ? rec.filePath : '';\n const lineStart = typeof rec.lineStart === 'number' ? rec.lineStart : undefined;\n const lineEnd = typeof rec.lineEnd === 'number' ? rec.lineEnd : undefined;\n const loc = filePath\n ? `${filePath}${lineStart ? `:${lineStart}${lineEnd && lineEnd !== lineStart ? `-${lineEnd}` : ''}` : ''}`\n : '';\n const suffix = loc ? ` - ${loc}` : '';\n lines.push(`- [P${priority}] ${title || body.slice(0, 80)}${suffix}`);\n if (body) lines.push(` ${body.replace(/\\n+/g, '\\n ')}`);\n }\n }\n const explanation = typeof block.overallExplanation === 'string' ? block.overallExplanation : '';\n lines.push('');\n lines.push(`Overall correctness: ${correctness}`);\n if (explanation) lines.push(explanation);\n return lines.join('\\n');\n}\n\nfunction hasToolCalls(message: AgentMessage | undefined): boolean {\n return contentBlocks(message).some((block) => block.type === 'toolCall' || block.type === 'tool_use');\n}\n\nfunction stopReason(message: AgentMessage | undefined): string | undefined {\n return (message as { stopReason?: string } | undefined)?.stopReason;\n}\n\nfunction errorMessage(message: AgentMessage | undefined): string | undefined {\n return (message as { errorMessage?: string } | undefined)?.errorMessage;\n}\n\nexport function createAssistantMessageFromText(text: string): AgentMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n timestamp: Date.now(),\n } as AgentMessage;\n}\n\nexport class AssistantMessageComponent extends Container {\n private readonly contentContainer = new Container();\n private message: AgentMessage | undefined;\n private linkedToolCall = false;\n private hideThinkingBlock = false;\n private hiddenThinkingLabel = 'Thinking...';\n\n constructor(message?: AgentMessage, options: AssistantMessageOptions = {}) {\n super();\n this.hideThinkingBlock = options.hideThinkingBlock ?? false;\n this.hiddenThinkingLabel = options.hiddenThinkingLabel ?? 'Thinking...';\n this.addChild(this.contentContainer);\n if (message) {\n this.updateContent(message);\n }\n }\n\n updateContent(message: AgentMessage): void {\n this.message = message;\n this.refresh();\n }\n\n setHasToolCalls(hasTools: boolean): void {\n this.linkedToolCall = hasTools;\n this.refresh();\n }\n\n setHideThinkingBlock(hide: boolean): void {\n if (this.hideThinkingBlock === hide) return;\n this.hideThinkingBlock = hide;\n this.refresh();\n }\n\n setHiddenThinkingLabel(label: string): void {\n if (this.hiddenThinkingLabel === label) return;\n this.hiddenThinkingLabel = label;\n this.refresh();\n }\n\n override invalidate(): void {\n super.invalidate();\n this.refresh();\n }\n\n override render(width: number): string[] {\n const lines = super.render(width);\n if (hasToolCalls(this.message) || this.linkedToolCall || lines.length === 0) return lines;\n lines[0] = OSC133_ZONE_START + lines[0];\n lines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n return lines;\n }\n\n private refresh(): void {\n this.contentContainer.clear();\n const blocks = contentBlocks(this.message);\n const visibleBlocks = blocks.filter((block) => {\n if (block.type === 'text') {\n return compactToolAdjacentText(blockText(block, 'text'), this.linkedToolCall).trim().length > 0;\n }\n if (block.type === 'thinking') return blockText(block, 'thinking').trim().length > 0;\n if (block.type === 'image' || block.type === 'image_url') return true;\n if (block.type === 'review') return true;\n return false;\n });\n const reason = stopReason(this.message);\n const hasErrorState =\n !hasToolCalls(this.message) && !this.linkedToolCall && (reason === 'aborted' || reason === 'error');\n if (visibleBlocks.length === 0 && !hasErrorState) return;\n\n this.contentContainer.addChild(new Spacer(1));\n let renderedVisible = 0;\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!;\n if (block.type === 'text') {\n const text = compactToolAdjacentText(blockText(block, 'text'), this.linkedToolCall).trim();\n if (!text) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.assistantText(line) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n } else if (block.type === 'thinking') {\n const thinking = blockText(block, 'thinking').trim();\n if (!thinking) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n const text = this.hideThinkingBlock ? this.hiddenThinkingLabel : thinking;\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.dim(theme.italic(line)) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n } else if (block.type === 'image' || block.type === 'image_url') {\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.dim('[image]'), 1, 0));\n renderedVisible++;\n } else if (block.type === 'review') {\n const text = reviewMarkdown(block).trim();\n if (!text) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.assistantText(line) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n }\n }\n\n if (hasErrorState) {\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n const text =\n reason === 'aborted'\n ? errorMessage(this.message) && errorMessage(this.message) !== 'Request was aborted'\n ? errorMessage(this.message)!\n : 'Operation aborted'\n : `Error: ${errorMessage(this.message) || 'Unknown error'}`;\n this.contentContainer.addChild(new Text(theme.error(text), 1, 0));\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"assistant-message.js","names":[],"sources":["../../../../src/tui/components/assistant-message.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { Container, Markdown, Spacer, Text } from '@earendil-works/pi-tui';\n\nimport { markdownTheme, theme } from '../theme.js';\n\nconst OSC133_ZONE_START = '\\x1b]133;A\\x07';\nconst OSC133_ZONE_END = '\\x1b]133;B\\x07';\nconst OSC133_ZONE_FINAL = '\\x1b]133;C\\x07';\n\nexport type AssistantMessageOptions = {\n hideThinkingBlock?: boolean;\n hiddenThinkingLabel?: string;\n};\n\ntype ContentBlock = Record<string, unknown> & { type?: string };\n\nfunction contentBlocks(message: AgentMessage | undefined): ContentBlock[] {\n const content = (message as { content?: unknown } | undefined)?.content;\n if (typeof content === 'string') {\n return content.trim() ? [{ type: 'text', text: content }] : [];\n }\n return Array.isArray(content)\n ? content.filter((block): block is ContentBlock => !!block && typeof block === 'object')\n : [];\n}\n\nfunction blockText(block: ContentBlock, key: 'text' | 'thinking'): string {\n const value = block[key];\n return typeof value === 'string' ? value : '';\n}\n\nfunction compactToolAdjacentText(text: string, linkedToolCall: boolean): string {\n if (!linkedToolCall) return text;\n const lines = text.split('\\n');\n const kept = lines.filter((line) => !isMechanicalToolSummaryLine(line));\n return kept.join('\\n').trim();\n}\n\nfunction isMechanicalToolSummaryLine(line: string): boolean {\n const normalized = line.trim();\n if (!normalized) return false;\n const withoutBullet = normalized.replace(/^[-*•]\\s+/, '');\n return (\n /^(Added|Deleted|Edited|Modified|Updated)\\s+.+\\(\\+\\d+\\s+-\\d+\\)\\.?$/i.test(withoutBullet) ||\n /^Edited\\s+\\d+\\s+files?\\s+\\(\\+\\d+\\s+-\\d+\\)\\.?$/i.test(withoutBullet) ||\n /^Created\\s+.+\\(\\+\\d+\\s+-0\\)\\.?$/i.test(withoutBullet) ||\n /^Removed\\s+.+\\(\\+0\\s+-\\d+\\)\\.?$/i.test(withoutBullet)\n );\n}\n\nfunction reviewMarkdown(block: ContentBlock): string {\n const findings = Array.isArray(block.findings) ? block.findings : [];\n const status = typeof block.status === 'string' ? block.status : 'complete';\n const target = typeof block.target === 'string' ? block.target : 'working tree changes';\n const draft = typeof block.analysisMarkdown === 'string' ? block.analysisMarkdown.trim() : '';\n const errorMessage = typeof block.errorMessage === 'string' ? block.errorMessage : '';\n if (status === 'preparing' || status === 'reviewing') {\n const lines = [\n '<< Code review >>',\n '',\n `Reviewing ${target}`,\n status === 'preparing' ? 'Collecting changes…' : 'Review assistant is analyzing the changes…',\n ];\n if (draft) lines.push('', 'Review assistant', '', draft);\n return lines.join('\\n');\n }\n\n const lines: string[] = ['<< Code review finished >>', '', 'Code review', ''];\n const source = typeof block.source === 'string' ? block.source : '';\n const correctness = typeof block.overallCorrectness === 'string' ? block.overallCorrectness : 'unknown';\n const modelReviewIncomplete = source === 'local' && correctness === 'unknown';\n if (findings.length === 0) {\n lines.push(modelReviewIncomplete ? 'No model findings were produced.' : 'No findings.');\n } else {\n lines.push('Findings:');\n for (const item of findings) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue;\n const rec = item as Record<string, unknown>;\n const title = typeof rec.title === 'string' ? rec.title : '';\n const body = typeof rec.body === 'string' ? rec.body : '';\n const priority = typeof rec.priority === 'number' ? rec.priority : 2;\n const filePath = typeof rec.filePath === 'string' ? rec.filePath : '';\n const lineStart = typeof rec.lineStart === 'number' ? rec.lineStart : undefined;\n const lineEnd = typeof rec.lineEnd === 'number' ? rec.lineEnd : undefined;\n const loc = filePath\n ? `${filePath}${lineStart ? `:${lineStart}${lineEnd && lineEnd !== lineStart ? `-${lineEnd}` : ''}` : ''}`\n : '';\n const suffix = loc ? ` - ${loc}` : '';\n lines.push(`- [P${priority}] ${title || body.slice(0, 80)}${suffix}`);\n if (body) lines.push(` ${body.replace(/\\n+/g, '\\n ')}`);\n }\n }\n const explanation = typeof block.overallExplanation === 'string' ? block.overallExplanation : '';\n lines.push('');\n lines.push(`Overall correctness: ${correctness}`);\n if (explanation) lines.push(explanation);\n if (errorMessage) {\n lines.push('', `Review assistant could not complete: ${errorMessage}`);\n }\n return lines.join('\\n');\n}\n\nfunction hasToolCalls(message: AgentMessage | undefined): boolean {\n return contentBlocks(message).some((block) => block.type === 'toolCall' || block.type === 'tool_use');\n}\n\nfunction stopReason(message: AgentMessage | undefined): string | undefined {\n return (message as { stopReason?: string } | undefined)?.stopReason;\n}\n\nfunction errorMessage(message: AgentMessage | undefined): string | undefined {\n return (message as { errorMessage?: string } | undefined)?.errorMessage;\n}\n\nexport function createAssistantMessageFromText(text: string): AgentMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n timestamp: Date.now(),\n } as AgentMessage;\n}\n\nexport class AssistantMessageComponent extends Container {\n private readonly contentContainer = new Container();\n private message: AgentMessage | undefined;\n private linkedToolCall = false;\n private hideThinkingBlock = false;\n private hiddenThinkingLabel = 'Thinking...';\n\n constructor(message?: AgentMessage, options: AssistantMessageOptions = {}) {\n super();\n this.hideThinkingBlock = options.hideThinkingBlock ?? false;\n this.hiddenThinkingLabel = options.hiddenThinkingLabel ?? 'Thinking...';\n this.addChild(this.contentContainer);\n if (message) {\n this.updateContent(message);\n }\n }\n\n updateContent(message: AgentMessage): void {\n this.message = message;\n this.refresh();\n }\n\n setHasToolCalls(hasTools: boolean): void {\n this.linkedToolCall = hasTools;\n this.refresh();\n }\n\n setHideThinkingBlock(hide: boolean): void {\n if (this.hideThinkingBlock === hide) return;\n this.hideThinkingBlock = hide;\n this.refresh();\n }\n\n setHiddenThinkingLabel(label: string): void {\n if (this.hiddenThinkingLabel === label) return;\n this.hiddenThinkingLabel = label;\n this.refresh();\n }\n\n override invalidate(): void {\n super.invalidate();\n this.refresh();\n }\n\n override render(width: number): string[] {\n const lines = super.render(width);\n if (hasToolCalls(this.message) || this.linkedToolCall || lines.length === 0) return lines;\n lines[0] = OSC133_ZONE_START + lines[0];\n lines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n return lines;\n }\n\n private refresh(): void {\n this.contentContainer.clear();\n const blocks = contentBlocks(this.message);\n const visibleBlocks = blocks.filter((block) => {\n if (block.type === 'text') {\n return compactToolAdjacentText(blockText(block, 'text'), this.linkedToolCall).trim().length > 0;\n }\n if (block.type === 'thinking') return blockText(block, 'thinking').trim().length > 0;\n if (block.type === 'image' || block.type === 'image_url') return true;\n if (block.type === 'review') return true;\n return false;\n });\n const reason = stopReason(this.message);\n const hasErrorState =\n !hasToolCalls(this.message) && !this.linkedToolCall && (reason === 'aborted' || reason === 'error');\n if (visibleBlocks.length === 0 && !hasErrorState) return;\n\n this.contentContainer.addChild(new Spacer(1));\n let renderedVisible = 0;\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!;\n if (block.type === 'text') {\n const text = compactToolAdjacentText(blockText(block, 'text'), this.linkedToolCall).trim();\n if (!text) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.assistantText(line) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n } else if (block.type === 'thinking') {\n const thinking = blockText(block, 'thinking').trim();\n if (!thinking) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n const text = this.hideThinkingBlock ? this.hiddenThinkingLabel : thinking;\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.dim(theme.italic(line)) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n } else if (block.type === 'image' || block.type === 'image_url') {\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.dim('[image]'), 1, 0));\n renderedVisible++;\n } else if (block.type === 'review') {\n const text = reviewMarkdown(block).trim();\n if (!text) continue;\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(\n new Markdown(\n text,\n 1,\n 0,\n markdownTheme,\n { color: (line) => theme.assistantText(line) },\n { preserveOrderedListMarkers: true },\n ),\n );\n renderedVisible++;\n }\n }\n\n if (hasErrorState) {\n if (renderedVisible > 0) this.contentContainer.addChild(new Spacer(1));\n const text =\n reason === 'aborted'\n ? errorMessage(this.message) && errorMessage(this.message) !== 'Request was aborted'\n ? errorMessage(this.message)!\n : 'Operation aborted'\n : `Error: ${errorMessage(this.message) || 'Unknown error'}`;\n this.contentContainer.addChild(new Text(theme.error(text), 1, 0));\n }\n }\n}\n"],"mappings":"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"}
@@ -19,6 +19,9 @@ const STREAM_TOUCH_EVENTS = new Set([
19
19
  "assistant_delta",
20
20
  "thinking_delta",
21
21
  "thinking_end",
22
+ "review_start",
23
+ "review_delta",
24
+ "review_end",
22
25
  "review",
23
26
  "tool_start",
24
27
  "tool_update",
@@ -106,11 +109,55 @@ function appendReviewBlock(message, review) {
106
109
  const target = typeof rec.target === "string" ? rec.target : "working tree changes";
107
110
  const existing = content.findIndex((block) => block.type === "review" && block.target === target);
108
111
  if (existing >= 0) {
109
- content[existing] = review;
112
+ content[existing] = {
113
+ ...review,
114
+ reviewId: content[existing].reviewId,
115
+ status: content[existing].status === "error" ? "error" : "complete",
116
+ analysisMarkdown: content[existing].analysisMarkdown,
117
+ errorMessage: content[existing].errorMessage
118
+ };
110
119
  return;
111
120
  }
112
121
  content.push(review);
113
122
  }
123
+ function reviewBlocks(message) {
124
+ const content = message.content;
125
+ return Array.isArray(content) ? content.filter((block) => !!block && typeof block === "object") : [];
126
+ }
127
+ function reviewBlockForId(message, reviewId) {
128
+ return reviewBlocks(message).find((block) => block.type === "review" && block.reviewId === reviewId);
129
+ }
130
+ function startReviewBlock(message, review) {
131
+ const existing = reviewBlockForId(message, review.reviewId);
132
+ if (existing) {
133
+ existing.target = review.target || existing.target;
134
+ existing.status = review.stage;
135
+ return;
136
+ }
137
+ const msg = message;
138
+ if (!Array.isArray(msg.content)) msg.content = [];
139
+ msg.content.push({
140
+ type: "review",
141
+ reviewId: review.reviewId,
142
+ target: review.target || "working tree changes",
143
+ findings: [],
144
+ overallCorrectness: "unknown",
145
+ overallExplanation: "",
146
+ status: review.stage
147
+ });
148
+ }
149
+ function appendReviewDraft(message, reviewId, delta) {
150
+ const review = reviewBlockForId(message, reviewId);
151
+ if (!review || !delta) return;
152
+ review.status = "reviewing";
153
+ review.analysisMarkdown = `${typeof review.analysisMarkdown === "string" ? review.analysisMarkdown : ""}${delta}`;
154
+ }
155
+ function finishReviewBlock(message, reviewId, status, errorMessage) {
156
+ const review = reviewBlockForId(message, reviewId);
157
+ if (!review) return;
158
+ review.status = status;
159
+ if (status === "error" && errorMessage) review.errorMessage = errorMessage;
160
+ }
114
161
  function finalizeThinking(message) {
115
162
  const content = message.content;
116
163
  if (!Array.isArray(content)) return;
@@ -195,6 +242,43 @@ function dispatchAgentEvent(event, data, state, chatLog, tui, setActivityStatus,
195
242
  tui.requestRender();
196
243
  break;
197
244
  }
245
+ case "review_start": {
246
+ const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
247
+ if (!reviewId) break;
248
+ const message = assistantForRun(runId);
249
+ startReviewBlock(message, {
250
+ reviewId,
251
+ target: typeof p.target === "string" ? p.target : "working tree changes",
252
+ stage: p.stage === "preparing" ? "preparing" : "reviewing"
253
+ });
254
+ chatLog.startAssistant(message, runId);
255
+ chatLog.updateAssistant(message, runId);
256
+ markRunEvent(state, "streaming", runId, event, source);
257
+ setActivityStatus("reviewing");
258
+ tui.requestRender();
259
+ break;
260
+ }
261
+ case "review_delta": {
262
+ const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
263
+ const delta = typeof p.delta === "string" ? p.delta : "";
264
+ if (!reviewId || !delta) break;
265
+ const message = assistantForRun(runId);
266
+ appendReviewDraft(message, reviewId, delta);
267
+ chatLog.updateAssistant(message, runId);
268
+ markRunEvent(state, "streaming", runId, event, source);
269
+ setActivityStatus("reviewing");
270
+ tui.requestRender();
271
+ break;
272
+ }
273
+ case "review_end": {
274
+ const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
275
+ if (!reviewId) break;
276
+ const message = assistantForRun(runId);
277
+ finishReviewBlock(message, reviewId, p.status === "error" ? "error" : "complete", typeof p.message === "string" ? p.message : void 0);
278
+ chatLog.updateAssistant(message, runId);
279
+ tui.requestRender();
280
+ break;
281
+ }
198
282
  case "tool_start": {
199
283
  const toolName = String(p.toolName ?? "unknown");
200
284
  const toolCallId = String(p.toolCallId || "");
@@ -1 +1 @@
1
- {"version":3,"file":"tui-agent-events.js","names":[],"sources":["../../../src/tui/tui-agent-events.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { TUI } from '@earendil-works/pi-tui';\n\nimport { formatAgentRunErrorForDisplay } from '../agent/client-error-format.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport { createAssistantMessageFromText } from './components/assistant-message.js';\nimport { markRunEvent, markRunIdleAfterCompletion } from './tui-run-state.js';\nimport type { TuiEventSource, TuiState } from './tui-types.js';\n\nconst seenStreamEventKeys = new Set<string>();\nconst assistantByRun = new Map<string, AgentMessage>();\n\nexport function clearSeenStreamEvents(): void {\n seenStreamEventKeys.clear();\n assistantByRun.clear();\n}\n\nexport function clearSeenStreamEventsForRun(runId: string): void {\n const prefix = `${runId}:`;\n for (const key of Array.from(seenStreamEventKeys)) {\n if (key.startsWith(prefix)) seenStreamEventKeys.delete(key);\n }\n assistantByRun.delete(runId);\n}\n\nconst STREAM_TOUCH_EVENTS = new Set([\n 'run_start',\n 'assistant_message_start',\n 'assistant_delta',\n 'thinking_delta',\n 'thinking_end',\n 'review',\n 'tool_start',\n 'tool_update',\n 'tool_end',\n 'assistant_message_end',\n 'progress',\n]);\n\nconst DIRECT_RESPONSE_OWNED_EVENTS = new Set([...STREAM_TOUCH_EVENTS, 'run_end', 'error']);\n\nfunction resolveEventRunId(data: Record<string, unknown>, state: TuiState): string | null {\n if (typeof data.runId === 'string' && data.runId) return data.runId;\n return state.activeRunId ?? state.runStatus.runId ?? state.runStatus.lastCompletedRunId;\n}\n\nexport function shouldSkipDuplicateBroadcastEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'broadcast') return false;\n if (!DIRECT_RESPONSE_OWNED_EVENTS.has(event)) return false;\n const directRunId = state.runStatus.directStreamRunId;\n if (!directRunId) return false;\n return resolveEventRunId(data, state) === directRunId;\n}\n\nfunction streamEventKey(data: Record<string, unknown>, state: TuiState): string | null {\n const runId = resolveEventRunId(data, state);\n const seq = data.seq;\n if (!runId || typeof seq !== 'number' || !Number.isFinite(seq)) return null;\n return `${runId}:${seq}`;\n}\n\nfunction shouldSkipSeenStreamEvent(\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'agent-response' && source !== 'agent-resume' && source !== 'broadcast') return false;\n const key = streamEventKey(data, state);\n if (!key) return false;\n if (seenStreamEventKeys.has(key)) return true;\n seenStreamEventKeys.add(key);\n return false;\n}\n\nfunction payload(data: Record<string, unknown>): Record<string, unknown> {\n return data.payload && typeof data.payload === 'object' ? data.payload as Record<string, unknown> : {};\n}\n\nfunction assistantForRun(runId: string): AgentMessage {\n let message = assistantByRun.get(runId);\n if (!message) {\n message = createAssistantMessageFromText('') as AgentMessage;\n assistantByRun.set(runId, message);\n }\n return message;\n}\n\nfunction appendAssistantText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'text' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'text', text: delta });\n}\n\nfunction appendThinkingText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'thinking' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'thinking', text: delta, streaming: true });\n}\n\nfunction appendReviewBlock(message: AgentMessage, review: unknown): void {\n if (!review || typeof review !== 'object' || Array.isArray(review)) return;\n const rec = review as { type?: unknown; target?: unknown };\n if (rec.type !== 'review') return;\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n const content = msg.content as Array<Record<string, unknown>>;\n const target = typeof rec.target === 'string' ? rec.target : 'working tree changes';\n const existing = content.findIndex((block) => block.type === 'review' && block.target === target);\n if (existing >= 0) {\n content[existing] = review as Record<string, unknown>;\n return;\n }\n content.push(review as Record<string, unknown>);\n}\n\nfunction finalizeThinking(message: AgentMessage): void {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n const rec = block as { type?: unknown; streaming?: boolean };\n if (rec.type === 'thinking') rec.streaming = false;\n }\n}\n\nfunction errorAssistantMessage(errorContent: string): AgentMessage {\n return {\n ...createAssistantMessageFromText(''),\n stopReason: 'error',\n errorMessage: errorContent,\n } as AgentMessage;\n}\n\nexport function dispatchAgentEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n chatLog: ChatLog,\n tui: TUI,\n setActivityStatus: (status: string) => void,\n touchStreamingActivity?: () => void,\n onRunEnded?: () => void,\n onAssistantFinalized?: (message: AgentMessage, options?: { errorMessage?: string }) => void,\n source: TuiEventSource = 'unknown',\n): void {\n if (shouldSkipSeenStreamEvent(data, state, source)) return;\n if (shouldSkipDuplicateBroadcastEvent(event, data, state, source)) return;\n\n if (STREAM_TOUCH_EVENTS.has(event)) touchStreamingActivity?.();\n\n const runId = resolveEventRunId(data, state) ?? state.activeRunId ?? 'default';\n const p = payload(data);\n\n switch (event) {\n case 'run_start': {\n state.activeRunId = runId;\n markRunEvent(state, 'waiting', runId, event, source);\n setActivityStatus('waiting');\n break;\n }\n case 'user_message': {\n const message = p.message as { content?: unknown } | undefined;\n chatLog.addUser(Array.isArray(message?.content) || typeof message?.content === 'string' ? message.content : []);\n tui.requestRender();\n break;\n }\n case 'user_transcript': {\n chatLog.addUser(String(p.text ?? ''));\n tui.requestRender();\n break;\n }\n case 'assistant_message_start': {\n const message = assistantForRun(runId);\n chatLog.startAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendAssistantText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendThinkingText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'review': {\n const message = assistantForRun(runId);\n appendReviewBlock(message, p.review);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'tool_start': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, p.args ?? {}, runId);\n chatLog.markToolExecutionStarted(toolCallId);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_update': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, {}, runId);\n if ('details' in p) chatLog.updateToolDetails(toolCallId, p.details);\n if (typeof p.textDelta === 'string') chatLog.updateToolResult(toolCallId, { text: p.textDelta }, false, true);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_end': {\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.updateToolResult(toolCallId, p.result, p.status === 'error' || p.status === 'cancelled', false);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_message_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.finalizeAssistant(message, runId);\n assistantByRun.delete(runId);\n onAssistantFinalized?.(message);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'error': {\n const errorContent = formatAgentRunErrorForDisplay(String(p.message ?? 'Unknown error'));\n const message = errorAssistantMessage(errorContent);\n chatLog.finalizeAssistant(message, runId);\n onAssistantFinalized?.(message, { errorMessage: errorContent });\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'run_end': {\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'progress': {\n const stage = typeof p.stage === 'string' ? p.stage : '';\n const message = typeof p.message === 'string' ? p.message : stage;\n state.progressMessage = message || null;\n markRunEvent(state, 'progress', runId, event, source);\n setActivityStatus(message ? `progress: ${message}` : 'running');\n tui.requestRender();\n break;\n }\n }\n}\n\nexport const DEFAULT_STREAMING_WATCHDOG_MS = 30_000;\n"],"mappings":";;;;AASA,MAAM,sCAAsB,IAAI,KAAa;AAC7C,MAAM,iCAAiB,IAAI,KAA2B;AAEtD,SAAgB,wBAA8B;AAC5C,qBAAoB,OAAO;AAC3B,gBAAe,OAAO;;AAGxB,SAAgB,4BAA4B,OAAqB;CAC/D,MAAM,SAAS,GAAG,MAAM;AACxB,MAAK,MAAM,OAAO,MAAM,KAAK,oBAAoB,CAC/C,KAAI,IAAI,WAAW,OAAO,CAAE,qBAAoB,OAAO,IAAI;AAE7D,gBAAe,OAAO,MAAM;;AAG9B,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,+BAA+B,IAAI,IAAI;CAAC,GAAG;CAAqB;CAAW;CAAQ,CAAC;AAE1F,SAAS,kBAAkB,MAA+B,OAAgC;AACxF,KAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAO,QAAO,KAAK;AAC9D,QAAO,MAAM,eAAe,MAAM,UAAU,SAAS,MAAM,UAAU;;AAGvE,SAAgB,kCACd,OACA,MACA,OACA,QACS;AACT,KAAI,WAAW,YAAa,QAAO;AACnC,KAAI,CAAC,6BAA6B,IAAI,MAAM,CAAE,QAAO;CACrD,MAAM,cAAc,MAAM,UAAU;AACpC,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,kBAAkB,MAAM,MAAM,KAAK;;AAG5C,SAAS,eAAe,MAA+B,OAAgC;CACrF,MAAM,QAAQ,kBAAkB,MAAM,MAAM;CAC5C,MAAM,MAAM,KAAK;AACjB,KAAI,CAAC,SAAS,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;AACvE,QAAO,GAAG,MAAM,GAAG;;AAGrB,SAAS,0BACP,MACA,OACA,QACS;AACT,KAAI,WAAW,oBAAoB,WAAW,kBAAkB,WAAW,YAAa,QAAO;CAC/F,MAAM,MAAM,eAAe,MAAM,MAAM;AACvC,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,oBAAoB,IAAI,IAAI,CAAE,QAAO;AACzC,qBAAoB,IAAI,IAAI;AAC5B,QAAO;;AAGT,SAAS,QAAQ,MAAwD;AACvE,QAAO,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAqC,EAAE;;AAGxG,SAAS,gBAAgB,OAA6B;CACpD,IAAI,UAAU,eAAe,IAAI,MAAM;AACvC,KAAI,CAAC,SAAS;AACZ,YAAU,+BAA+B,GAAG;AAC5C,iBAAe,IAAI,OAAO,QAAQ;;AAEpC,QAAO;;AAGT,SAAS,oBAAoB,SAAuB,OAAqB;CACvE,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,KAAI,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU;AAC1D,OAAK,QAAQ;AACb;;AAEF,SAAQ,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAO,CAAC;;AAG7C,SAAS,mBAAmB,SAAuB,OAAqB;CACtE,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,KAAI,MAAM,SAAS,cAAc,OAAO,KAAK,SAAS,UAAU;AAC9D,OAAK,QAAQ;AACb;;AAEF,SAAQ,KAAK;EAAE,MAAM;EAAY,MAAM;EAAO,WAAW;EAAM,CAAC;;AAGlE,SAAS,kBAAkB,SAAuB,QAAuB;AACvE,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAAE;CACpE,MAAM,MAAM;AACZ,KAAI,IAAI,SAAS,SAAU;CAC3B,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,SAAS,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;CAC7D,MAAM,WAAW,QAAQ,WAAW,UAAU,MAAM,SAAS,YAAY,MAAM,WAAW,OAAO;AACjG,KAAI,YAAY,GAAG;AACjB,UAAQ,YAAY;AACpB;;AAEF,SAAQ,KAAK,OAAkC;;AAGjD,SAAS,iBAAiB,SAA6B;CACrD,MAAM,UAAW,QAAkC;AACnD,KAAI,CAAC,MAAM,QAAQ,QAAQ,CAAE;AAC7B,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;EACzC,MAAM,MAAM;AACZ,MAAI,IAAI,SAAS,WAAY,KAAI,YAAY;;;AAIjD,SAAS,sBAAsB,cAAoC;AACjE,QAAO;EACL,GAAG,+BAA+B,GAAG;EACrC,YAAY;EACZ,cAAc;EACf;;AAGH,SAAgB,mBACd,OACA,MACA,OACA,SACA,KACA,mBACA,wBACA,YACA,sBACA,SAAyB,WACnB;AACN,KAAI,0BAA0B,MAAM,OAAO,OAAO,CAAE;AACpD,KAAI,kCAAkC,OAAO,MAAM,OAAO,OAAO,CAAE;AAEnE,KAAI,oBAAoB,IAAI,MAAM,CAAE,2BAA0B;CAE9D,MAAM,QAAQ,kBAAkB,MAAM,MAAM,IAAI,MAAM,eAAe;CACrE,MAAM,IAAI,QAAQ,KAAK;AAEvB,SAAQ,OAAR;EACE,KAAK;AACH,SAAM,cAAc;AACpB,gBAAa,OAAO,WAAW,OAAO,OAAO,OAAO;AACpD,qBAAkB,UAAU;AAC5B;EAEF,KAAK,gBAAgB;GACnB,MAAM,UAAU,EAAE;AAClB,WAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ,IAAI,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU,EAAE,CAAC;AAC/G,OAAI,eAAe;AACnB;;EAEF,KAAK;AACH,WAAQ,QAAQ,OAAO,EAAE,QAAQ,GAAG,CAAC;AACrC,OAAI,eAAe;AACnB;EAEF,KAAK,2BAA2B;GAC9B,MAAM,UAAU,gBAAgB,MAAM;AACtC,WAAQ,eAAe,SAAS,MAAM;AACtC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,mBAAmB;GACtB,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,OAAI,CAAC,MAAO;GACZ,MAAM,UAAU,gBAAgB,MAAM;AACtC,uBAAoB,SAAS,MAAM;AACnC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,kBAAkB;GACrB,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,OAAI,CAAC,MAAO;GACZ,MAAM,UAAU,gBAAgB,MAAM;AACtC,sBAAmB,SAAS,MAAM;AAClC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,gBAAgB;GACnB,MAAM,UAAU,gBAAgB,MAAM;AACtC,oBAAiB,QAAQ;AACzB,WAAQ,gBAAgB,SAAS,MAAM;AACvC,OAAI,eAAe;AACnB;;EAEF,KAAK,UAAU;GACb,MAAM,UAAU,gBAAgB,MAAM;AACtC,qBAAkB,SAAS,EAAE,OAAO;AACpC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,cAAc;GACjB,MAAM,WAAW,OAAO,EAAE,YAAY,UAAU;GAChD,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,UAAU,YAAY,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM;AAC5D,WAAQ,yBAAyB,WAAW;AAC5C,gBAAa,OAAO,QAAQ,OAAO,OAAO,OAAO;AACjD,qBAAkB,UAAU;AAC5B,OAAI,eAAe;AACnB;;EAEF,KAAK,eAAe;GAClB,MAAM,WAAW,OAAO,EAAE,YAAY,UAAU;GAChD,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,UAAU,YAAY,UAAU,EAAE,EAAE,MAAM;AAClD,OAAI,aAAa,EAAG,SAAQ,kBAAkB,YAAY,EAAE,QAAQ;AACpE,OAAI,OAAO,EAAE,cAAc,SAAU,SAAQ,iBAAiB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,KAAK;AAC7G,gBAAa,OAAO,QAAQ,OAAO,OAAO,OAAO;AACjD,qBAAkB,UAAU;AAC5B,OAAI,eAAe;AACnB;;EAEF,KAAK,YAAY;GACf,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,iBAAiB,YAAY,EAAE,QAAQ,EAAE,WAAW,WAAW,EAAE,WAAW,aAAa,MAAM;AACvG,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,yBAAyB;GAC5B,MAAM,UAAU,gBAAgB,MAAM;AACtC,oBAAiB,QAAQ;AACzB,WAAQ,kBAAkB,SAAS,MAAM;AACzC,kBAAe,OAAO,MAAM;AAC5B,0BAAuB,QAAQ;AAC/B,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,SAAS;GACZ,MAAM,eAAe,8BAA8B,OAAO,EAAE,WAAW,gBAAgB,CAAC;GACxF,MAAM,UAAU,sBAAsB,aAAa;AACnD,WAAQ,kBAAkB,SAAS,MAAM;AACzC,0BAAuB,SAAS,EAAE,cAAc,cAAc,CAAC;AAC/D,kBAAe,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,8BAA2B,OAAO,OAAO,OAAO,OAAO;AACvD,qBAAkB,OAAO;AACzB,iBAAc;AACd,OAAI,eAAe;AACnB;;EAEF,KAAK;AACH,kBAAe,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,8BAA2B,OAAO,OAAO,OAAO,OAAO;AACvD,qBAAkB,OAAO;AACzB,iBAAc;AACd,OAAI,eAAe;AACnB;EAEF,KAAK,YAAY;GACf,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;GACtD,MAAM,UAAU,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAC5D,SAAM,kBAAkB,WAAW;AACnC,gBAAa,OAAO,YAAY,OAAO,OAAO,OAAO;AACrD,qBAAkB,UAAU,aAAa,YAAY,UAAU;AAC/D,OAAI,eAAe;AACnB;;;;AAKN,MAAa,gCAAgC"}
1
+ {"version":3,"file":"tui-agent-events.js","names":[],"sources":["../../../src/tui/tui-agent-events.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { TUI } from '@earendil-works/pi-tui';\n\nimport { formatAgentRunErrorForDisplay } from '../agent/client-error-format.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport { createAssistantMessageFromText } from './components/assistant-message.js';\nimport { markRunEvent, markRunIdleAfterCompletion } from './tui-run-state.js';\nimport type { TuiEventSource, TuiState } from './tui-types.js';\n\nconst seenStreamEventKeys = new Set<string>();\nconst assistantByRun = new Map<string, AgentMessage>();\n\nexport function clearSeenStreamEvents(): void {\n seenStreamEventKeys.clear();\n assistantByRun.clear();\n}\n\nexport function clearSeenStreamEventsForRun(runId: string): void {\n const prefix = `${runId}:`;\n for (const key of Array.from(seenStreamEventKeys)) {\n if (key.startsWith(prefix)) seenStreamEventKeys.delete(key);\n }\n assistantByRun.delete(runId);\n}\n\nconst STREAM_TOUCH_EVENTS = new Set([\n 'run_start',\n 'assistant_message_start',\n 'assistant_delta',\n 'thinking_delta',\n 'thinking_end',\n 'review_start',\n 'review_delta',\n 'review_end',\n 'review',\n 'tool_start',\n 'tool_update',\n 'tool_end',\n 'assistant_message_end',\n 'progress',\n]);\n\nconst DIRECT_RESPONSE_OWNED_EVENTS = new Set([...STREAM_TOUCH_EVENTS, 'run_end', 'error']);\n\nfunction resolveEventRunId(data: Record<string, unknown>, state: TuiState): string | null {\n if (typeof data.runId === 'string' && data.runId) return data.runId;\n return state.activeRunId ?? state.runStatus.runId ?? state.runStatus.lastCompletedRunId;\n}\n\nexport function shouldSkipDuplicateBroadcastEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'broadcast') return false;\n if (!DIRECT_RESPONSE_OWNED_EVENTS.has(event)) return false;\n const directRunId = state.runStatus.directStreamRunId;\n if (!directRunId) return false;\n return resolveEventRunId(data, state) === directRunId;\n}\n\nfunction streamEventKey(data: Record<string, unknown>, state: TuiState): string | null {\n const runId = resolveEventRunId(data, state);\n const seq = data.seq;\n if (!runId || typeof seq !== 'number' || !Number.isFinite(seq)) return null;\n return `${runId}:${seq}`;\n}\n\nfunction shouldSkipSeenStreamEvent(\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'agent-response' && source !== 'agent-resume' && source !== 'broadcast') return false;\n const key = streamEventKey(data, state);\n if (!key) return false;\n if (seenStreamEventKeys.has(key)) return true;\n seenStreamEventKeys.add(key);\n return false;\n}\n\nfunction payload(data: Record<string, unknown>): Record<string, unknown> {\n return data.payload && typeof data.payload === 'object' ? data.payload as Record<string, unknown> : {};\n}\n\nfunction assistantForRun(runId: string): AgentMessage {\n let message = assistantByRun.get(runId);\n if (!message) {\n message = createAssistantMessageFromText('') as AgentMessage;\n assistantByRun.set(runId, message);\n }\n return message;\n}\n\nfunction appendAssistantText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'text' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'text', text: delta });\n}\n\nfunction appendThinkingText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'thinking' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'thinking', text: delta, streaming: true });\n}\n\nfunction appendReviewBlock(message: AgentMessage, review: unknown): void {\n if (!review || typeof review !== 'object' || Array.isArray(review)) return;\n const rec = review as { type?: unknown; target?: unknown };\n if (rec.type !== 'review') return;\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n const content = msg.content as Array<Record<string, unknown>>;\n const target = typeof rec.target === 'string' ? rec.target : 'working tree changes';\n const existing = content.findIndex((block) => block.type === 'review' && block.target === target);\n if (existing >= 0) {\n content[existing] = {\n ...(review as Record<string, unknown>),\n reviewId: content[existing].reviewId,\n status: content[existing].status === 'error' ? 'error' : 'complete',\n analysisMarkdown: content[existing].analysisMarkdown,\n errorMessage: content[existing].errorMessage,\n };\n return;\n }\n content.push(review as Record<string, unknown>);\n}\n\ntype ReviewContentBlock = Record<string, unknown> & { type?: unknown };\n\nfunction reviewBlocks(message: AgentMessage): ReviewContentBlock[] {\n const content = (message as { content?: unknown }).content;\n return Array.isArray(content)\n ? content.filter((block): block is ReviewContentBlock => !!block && typeof block === 'object')\n : [];\n}\n\nfunction reviewBlockForId(message: AgentMessage, reviewId: string): ReviewContentBlock | undefined {\n return reviewBlocks(message).find((block) => block.type === 'review' && block.reviewId === reviewId);\n}\n\nfunction startReviewBlock(\n message: AgentMessage,\n review: { reviewId: string; target: string; stage: 'preparing' | 'reviewing' },\n): void {\n const existing = reviewBlockForId(message, review.reviewId);\n if (existing) {\n existing.target = review.target || existing.target;\n existing.status = review.stage;\n return;\n }\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n (msg.content as ReviewContentBlock[]).push({\n type: 'review',\n reviewId: review.reviewId,\n target: review.target || 'working tree changes',\n findings: [],\n overallCorrectness: 'unknown',\n overallExplanation: '',\n status: review.stage,\n });\n}\n\nfunction appendReviewDraft(message: AgentMessage, reviewId: string, delta: string): void {\n const review = reviewBlockForId(message, reviewId);\n if (!review || !delta) return;\n review.status = 'reviewing';\n review.analysisMarkdown = `${typeof review.analysisMarkdown === 'string' ? review.analysisMarkdown : ''}${delta}`;\n}\n\nfunction finishReviewBlock(message: AgentMessage, reviewId: string, status: 'complete' | 'error', errorMessage?: string): void {\n const review = reviewBlockForId(message, reviewId);\n if (!review) return;\n review.status = status;\n if (status === 'error' && errorMessage) review.errorMessage = errorMessage;\n}\n\nfunction finalizeThinking(message: AgentMessage): void {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n const rec = block as { type?: unknown; streaming?: boolean };\n if (rec.type === 'thinking') rec.streaming = false;\n }\n}\n\nfunction errorAssistantMessage(errorContent: string): AgentMessage {\n return {\n ...createAssistantMessageFromText(''),\n stopReason: 'error',\n errorMessage: errorContent,\n } as AgentMessage;\n}\n\nexport function dispatchAgentEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n chatLog: ChatLog,\n tui: TUI,\n setActivityStatus: (status: string) => void,\n touchStreamingActivity?: () => void,\n onRunEnded?: () => void,\n onAssistantFinalized?: (message: AgentMessage, options?: { errorMessage?: string }) => void,\n source: TuiEventSource = 'unknown',\n): void {\n if (shouldSkipSeenStreamEvent(data, state, source)) return;\n if (shouldSkipDuplicateBroadcastEvent(event, data, state, source)) return;\n\n if (STREAM_TOUCH_EVENTS.has(event)) touchStreamingActivity?.();\n\n const runId = resolveEventRunId(data, state) ?? state.activeRunId ?? 'default';\n const p = payload(data);\n\n switch (event) {\n case 'run_start': {\n state.activeRunId = runId;\n markRunEvent(state, 'waiting', runId, event, source);\n setActivityStatus('waiting');\n break;\n }\n case 'user_message': {\n const message = p.message as { content?: unknown } | undefined;\n chatLog.addUser(Array.isArray(message?.content) || typeof message?.content === 'string' ? message.content : []);\n tui.requestRender();\n break;\n }\n case 'user_transcript': {\n chatLog.addUser(String(p.text ?? ''));\n tui.requestRender();\n break;\n }\n case 'assistant_message_start': {\n const message = assistantForRun(runId);\n chatLog.startAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendAssistantText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendThinkingText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'review': {\n const message = assistantForRun(runId);\n appendReviewBlock(message, p.review);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'review_start': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n if (!reviewId) break;\n const message = assistantForRun(runId);\n startReviewBlock(message, {\n reviewId,\n target: typeof p.target === 'string' ? p.target : 'working tree changes',\n stage: p.stage === 'preparing' ? 'preparing' : 'reviewing',\n });\n chatLog.startAssistant(message, runId);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('reviewing');\n tui.requestRender();\n break;\n }\n case 'review_delta': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!reviewId || !delta) break;\n const message = assistantForRun(runId);\n appendReviewDraft(message, reviewId, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('reviewing');\n tui.requestRender();\n break;\n }\n case 'review_end': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n if (!reviewId) break;\n const message = assistantForRun(runId);\n finishReviewBlock(\n message,\n reviewId,\n p.status === 'error' ? 'error' : 'complete',\n typeof p.message === 'string' ? p.message : undefined,\n );\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'tool_start': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, p.args ?? {}, runId);\n chatLog.markToolExecutionStarted(toolCallId);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_update': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, {}, runId);\n if ('details' in p) chatLog.updateToolDetails(toolCallId, p.details);\n if (typeof p.textDelta === 'string') chatLog.updateToolResult(toolCallId, { text: p.textDelta }, false, true);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_end': {\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.updateToolResult(toolCallId, p.result, p.status === 'error' || p.status === 'cancelled', false);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_message_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.finalizeAssistant(message, runId);\n assistantByRun.delete(runId);\n onAssistantFinalized?.(message);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'error': {\n const errorContent = formatAgentRunErrorForDisplay(String(p.message ?? 'Unknown error'));\n const message = errorAssistantMessage(errorContent);\n chatLog.finalizeAssistant(message, runId);\n onAssistantFinalized?.(message, { errorMessage: errorContent });\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'run_end': {\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'progress': {\n const stage = typeof p.stage === 'string' ? p.stage : '';\n const message = typeof p.message === 'string' ? p.message : stage;\n state.progressMessage = message || null;\n markRunEvent(state, 'progress', runId, event, source);\n setActivityStatus(message ? `progress: ${message}` : 'running');\n tui.requestRender();\n break;\n }\n }\n}\n\nexport const DEFAULT_STREAMING_WATCHDOG_MS = 30_000;\n"],"mappings":"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"}
@@ -409,17 +409,17 @@ function formatTuiWorkflowsInfo(entries) {
409
409
  }
410
410
  function formatTuiWorkflowDetail(name) {
411
411
  const loaded = createWorkflowCatalog().load(name);
412
- const meta = loaded.meta;
413
412
  const lines = [
414
413
  `Workflow: ${loaded.name}`,
415
414
  "",
416
- `Source: ${loaded.source}${loaded.path ? ` (${loaded.path})` : ""}`,
417
- `Description: ${meta.description}`
415
+ `Source: ${loaded.metadata.source}`,
416
+ `Description: ${loaded.description}`,
417
+ `Revision: ${loaded.revision}`
418
418
  ];
419
- if (meta.whenToUse) lines.push(`When to use: ${meta.whenToUse}`);
420
- if (meta.tags?.length) lines.push(`Tags: ${meta.tags.join(", ")}`);
421
- if (meta.estimatedAgents) lines.push(`Agents: ${meta.estimatedAgents.min}-${meta.estimatedAgents.max}`);
422
- lines.push("", "Script:", loaded.script.trim());
419
+ if (loaded.metadata.whenToUse) lines.push(`When to use: ${loaded.metadata.whenToUse}`);
420
+ if (loaded.metadata.tags.length) lines.push(`Tags: ${loaded.metadata.tags.join(", ")}`);
421
+ if (loaded.metadata.estimatedAgents) lines.push(`Agents: ${loaded.metadata.estimatedAgents.min}-${loaded.metadata.estimatedAgents.max}`);
422
+ lines.push("", "Flow:", loaded.graph.nodes.map((node) => `- ${node.title} (${node.kind})`).join("\n"));
423
423
  return lines.join("\n");
424
424
  }
425
425
  function formatTuiSessionStatsBlock(stats) {