@xopcai/xopc 0.0.125 → 0.0.126

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 (326) hide show
  1. package/README.md +56 -102
  2. package/README.zh-CN.md +51 -98
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  8. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +1 -1
  14. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  17. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKDKICZV.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
  18. package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
  19. package/dist/gateway/static/root/assets/{app-management-settings-panel-DI4BqHKW.js → app-management-settings-panel-D9-HW6cy.js} +1 -1
  20. package/dist/gateway/static/root/assets/{appearance-settings-6_ie3NQ4.js → appearance-settings-BHlahIDL.js} +1 -1
  21. package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
  22. package/dist/gateway/static/root/assets/{archive-plugin-kUHEJ1HK.js → archive-plugin-B-aoIt0w.js} +1 -1
  23. package/dist/gateway/static/root/assets/{attachment-load-Dm-9prpU.js → attachment-load-BD0G0FD5.js} +1 -1
  24. package/dist/gateway/static/root/assets/{automation-suggestion-card-OTxQTPnC.js → automation-suggestion-card-iJRVI7aZ.js} +1 -1
  25. package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
  26. package/dist/gateway/static/root/assets/{binary-plugins-DllA_jQ0.js → binary-plugins-B0mNlVSz.js} +1 -1
  27. package/dist/gateway/static/root/assets/{block-editor-Cm6CWNj1.js → block-editor-CJY9Lu5G.js} +6 -6
  28. package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
  29. package/dist/gateway/static/root/assets/{capability-presets-api-VJ89b6I2.js → capability-presets-api-Bgc8ag55.js} +1 -1
  30. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-BaPj8wC2.js → capability-presets-settings-panel-B1nIi0TC.js} +1 -1
  31. package/dist/gateway/static/root/assets/{channel-recipient-api-B5PwBEUx.js → channel-recipient-api-0sauApoC.js} +1 -1
  32. package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
  33. package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
  34. package/dist/gateway/static/root/assets/{directory-picker-path-field-DySMzOF6.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
  35. package/dist/gateway/static/root/assets/{dreaming-settings-D_AjSnV_.js → dreaming-settings-4bvpk5wr.js} +2 -2
  36. package/dist/gateway/static/root/assets/{extension-debug-page-BaM0FpW7.js → extension-debug-page-BbyczVZ3.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-DuZWVOGA.js → extension-page-DLN1I3DR.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-DarVtbmJ.js → extension-settings-page-D9VGHmYJ.js} +1 -1
  39. package/dist/gateway/static/root/assets/{fetch-NFKfkqrd.js → fetch-5V96dUz3.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-config-api-CFEm9rgy.js → gateway-config-api-BtIzObwp.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-settings-BMk2S5td.js → gateway-settings-KFsGGDhg.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-startup-retry-Dtwh_yGg.js → gateway-startup-retry-DEMad2wt.js} +1 -1
  43. package/dist/gateway/static/root/assets/{goal-create-dialog-BKP7ylcG.js → goal-create-dialog-4PcF6Sh6.js} +1 -1
  44. package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
  45. package/dist/gateway/static/root/assets/{goals-config-api-DTWZNA_Y.js → goals-config-api-CVN7-pdM.js} +1 -1
  46. package/dist/gateway/static/root/assets/{goals-page-CTmA3hWK.js → goals-page-CUdgJuDn.js} +2 -2
  47. package/dist/gateway/static/root/assets/{goals-settings-Bhct0ZT-.js → goals-settings-IYCH3-Pi.js} +1 -1
  48. package/dist/gateway/static/root/assets/{heartbeat-settings-C-UxSU4a.js → heartbeat-settings-Cf_a2Bmz.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
  50. package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DCjy2y4d.js → keyboard-shortcuts-settings-lKTg6St7.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
  53. package/dist/gateway/static/root/assets/{markdown-split-BaqxP-GQ.js → markdown-split-Bv4k6iGJ.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-DQ_EXloK.js → media-plugins-Bbi8g3N8.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
  56. package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
  57. package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
  58. package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-EIZhLppK.js → page-tabs-Cp395RYD.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-r_uB4Epr.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
  64. package/dist/gateway/static/root/assets/{save-bar-controls-B132Uf-2.js → save-bar-controls-BItmzAzI.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schedule-field-B5qshALm.js → schedule-field-BQ8IjjCn.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schema-form-CvLmkdS9.js → schema-form-BRpD6x3d.js} +1 -1
  67. package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-collapsible-section-pRlvqsAf.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
  70. package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
  73. package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
  74. package/dist/gateway/static/root/assets/{share-preview-page-v6-IOp8t.js → share-preview-page-DbYZNAPb.js} +1 -1
  75. package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
  76. package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
  77. package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
  78. package/dist/gateway/static/root/assets/{system-settings-panel-HUU2FFjM.js → system-settings-panel-DKDAojWM.js} +1 -1
  79. package/dist/gateway/static/root/assets/{typed-models-lib-AH160QHh.js → typed-models-lib-BCCV4Kkp.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-channel-catalog-BXzDmjCQ.js → use-channel-catalog-NBqg3iFY.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DxwnQvQ3.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
  82. package/dist/gateway/static/root/assets/{utils-i5POEtqd.js → utils-DPGVr3tS.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
  84. package/dist/gateway/static/root/assets/{work-item-detail-page-CD6FL_Rs.js → work-item-detail-page-BrCZpAWh.js} +1 -1
  85. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-ClVVMgN-.js → workflow-run-setup-panel-BTkRVNAh.js} +2 -2
  86. package/dist/gateway/static/root/assets/{workflow-start-dialog-Dv4ZA1T0.js → workflow-start-dialog-DAImVtdO.js} +1 -1
  87. package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
  88. package/dist/gateway/static/root/index.html +5 -5
  89. package/dist/package.js +1 -1
  90. package/dist/src/activity/context.d.ts +11 -0
  91. package/dist/src/activity/context.js +36 -0
  92. package/dist/src/activity/context.js.map +1 -0
  93. package/dist/src/activity/emitter.d.ts +6 -0
  94. package/dist/src/activity/emitter.js +43 -0
  95. package/dist/src/activity/emitter.js.map +1 -0
  96. package/dist/src/activity/index.d.ts +3 -0
  97. package/dist/src/activity/index.js +3 -0
  98. package/dist/src/activity/service.d.ts +12 -0
  99. package/dist/src/activity/service.js +59 -0
  100. package/dist/src/activity/service.js.map +1 -0
  101. package/dist/src/activity/types.d.ts +109 -0
  102. package/dist/src/activity/types.js +1 -0
  103. package/dist/src/agent/agent-manager.d.ts +7 -0
  104. package/dist/src/agent/agent-manager.js +7 -4
  105. package/dist/src/agent/agent-manager.js.map +1 -1
  106. package/dist/src/agent/context/project-context.js +2 -2
  107. package/dist/src/agent/context/workspace-seed.js +2 -2
  108. package/dist/src/agent/embedded/run-for-session.js +1 -1
  109. package/dist/src/agent/goals/post-turn.js +2 -2
  110. package/dist/src/agent/ipc/bus.js +1 -1
  111. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  113. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  114. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  115. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  116. package/dist/src/agent/models/manager.js +1 -1
  117. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  118. package/dist/src/agent/service.js +6 -3
  119. package/dist/src/agent/service.js.map +1 -1
  120. package/dist/src/agent/service.types.d.ts +7 -0
  121. package/dist/src/agent/session/session-inspector.js +1 -1
  122. package/dist/src/agent/skills/hub-pull.js +1 -1
  123. package/dist/src/agent/tool-manuals/index.js +15 -6
  124. package/dist/src/agent/tool-manuals/index.js.map +1 -1
  125. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
  126. package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
  127. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
  128. package/dist/src/agent/tools/factory.d.ts +7 -0
  129. package/dist/src/agent/tools/factory.js +9 -0
  130. package/dist/src/agent/tools/factory.js.map +1 -1
  131. package/dist/src/agent/tools/goal-tool.js +2 -2
  132. package/dist/src/agent/tools/index.d.ts +1 -0
  133. package/dist/src/agent/tools/index.js +2 -1
  134. package/dist/src/agent/tools/workflow-tool.js +1 -1
  135. package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
  136. package/dist/src/agent/tools/xopc-use-tool.js +636 -0
  137. package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
  138. package/dist/src/agent-manifest/schema.d.ts +27 -27
  139. package/dist/src/automations/api/routes.js +1 -1
  140. package/dist/src/automations/domain/validation.d.ts +55 -55
  141. package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
  142. package/dist/src/automations/service/action-executor.js +2 -2
  143. package/dist/src/browser/cdp-local-launcher.js +1 -1
  144. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  145. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  146. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  147. package/dist/src/browser/stealth.js +1 -1
  148. package/dist/src/chat-commands/agent-edit.js +1 -1
  149. package/dist/src/chat-commands/builtins/config.js +1 -1
  150. package/dist/src/chat-commands/builtins/goal.js +2 -2
  151. package/dist/src/chat-commands/context.js +1 -1
  152. package/dist/src/cli/commands/agent.js +1 -1
  153. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  154. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  155. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  156. package/dist/src/cli/commands/extension-pack.js +1 -1
  157. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  158. package/dist/src/cli/commands/goal.js +3 -3
  159. package/dist/src/cli/commands/init.js +1 -1
  160. package/dist/src/cli/commands/project.js +4 -4
  161. package/dist/src/config/agent-profile.js +1 -1
  162. package/dist/src/config/gateway-bind.js +1 -1
  163. package/dist/src/config/index.js +1 -1
  164. package/dist/src/config/loader.js +1 -1
  165. package/dist/src/config/models-json.d.ts +14 -14
  166. package/dist/src/config/models-json.js +1 -1
  167. package/dist/src/config/schema.d.ts +60 -60
  168. package/dist/src/daemon/launchd.js +1 -1
  169. package/dist/src/daemon/systemd.js +1 -1
  170. package/dist/src/extensions/discover-extensions.js +1 -1
  171. package/dist/src/extensions/loader.js +2 -2
  172. package/dist/src/gateway/agents-admin.js +1 -1
  173. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
  174. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  175. package/dist/src/gateway/hono/middleware/log-context.js +8 -1
  176. package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
  177. package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
  178. package/dist/src/gateway/hono/routes/activity.js +72 -0
  179. package/dist/src/gateway/hono/routes/activity.js.map +1 -0
  180. package/dist/src/gateway/hono/routes/goals.js +1 -1
  181. package/dist/src/gateway/hono/routes/index.js +2 -0
  182. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  183. package/dist/src/gateway/hono/routes/memory.js +2 -2
  184. package/dist/src/gateway/hono/routes/projects.js +65 -15
  185. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  186. package/dist/src/gateway/hono/routes/sessions.js +101 -2
  187. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  188. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  189. package/dist/src/gateway/lock.js +1 -1
  190. package/dist/src/gateway/ports.js +1 -1
  191. package/dist/src/gateway/service/sessions-api.d.ts +10 -0
  192. package/dist/src/gateway/service/sessions-api.js +31 -0
  193. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  194. package/dist/src/gateway/service.js +12 -9
  195. package/dist/src/gateway/service.js.map +1 -1
  196. package/dist/src/goals/goal-store.js +1 -1
  197. package/dist/src/goals/goal-store.js.map +1 -1
  198. package/dist/src/goals/goal-workflow-judge.js +1 -1
  199. package/dist/src/infra/ports.js +1 -1
  200. package/dist/src/infra/ssh-tunnel.js +1 -1
  201. package/dist/src/infra/update-check.js +1 -1
  202. package/dist/src/infra/update-restart.js +1 -1
  203. package/dist/src/mcp/channel-bridge.js +1 -1
  204. package/dist/src/migrations/runner.js +1 -1
  205. package/dist/src/notes/service.js +65 -6
  206. package/dist/src/notes/service.js.map +1 -1
  207. package/dist/src/notes/store.js +1 -1
  208. package/dist/src/projects/project-service.d.ts +2 -1
  209. package/dist/src/projects/project-service.js +59 -2
  210. package/dist/src/projects/project-service.js.map +1 -1
  211. package/dist/src/projects/project-store.d.ts +2 -1
  212. package/dist/src/projects/project-store.js +43 -0
  213. package/dist/src/projects/project-store.js.map +1 -1
  214. package/dist/src/projects/types.d.ts +10 -0
  215. package/dist/src/projects/workspace.js +1 -1
  216. package/dist/src/routing/agent-session-key.js +1 -1
  217. package/dist/src/routing/resolve-route.js +1 -1
  218. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  219. package/dist/src/session/client-history.d.ts +3 -0
  220. package/dist/src/session/client-history.js +24 -9
  221. package/dist/src/session/client-history.js.map +1 -1
  222. package/dist/src/session/init-session-turn.js +1 -1
  223. package/dist/src/session/resolve-session.js +1 -1
  224. package/dist/src/session/session-title.js +2 -2
  225. package/dist/src/session/store.js +1 -1
  226. package/dist/src/session/types.d.ts +4 -0
  227. package/dist/src/session/types.js.map +1 -1
  228. package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
  229. package/dist/src/storage/sqlite/activity-repository.js +208 -0
  230. package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
  231. package/dist/src/storage/sqlite/connection.js +1 -1
  232. package/dist/src/storage/sqlite/index.d.ts +1 -0
  233. package/dist/src/storage/sqlite/index.js +2 -1
  234. package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
  235. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  236. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  237. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  238. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  239. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  240. package/dist/src/storage/sqlite/schema.js +1 -1
  241. package/dist/src/storage/sqlite/schema.sql +63 -0
  242. package/dist/src/storage/sqlite/session-repository.js +11 -0
  243. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  244. package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
  245. package/dist/src/tui/backends/embedded-backend.js +76 -7
  246. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  247. package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
  248. package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
  249. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  250. package/dist/src/tui/chat-history.js +16 -3
  251. package/dist/src/tui/chat-history.js.map +1 -1
  252. package/dist/src/tui/clipboard-image.js +1 -1
  253. package/dist/src/tui/components/chat-log.d.ts +23 -3
  254. package/dist/src/tui/components/chat-log.js +68 -9
  255. package/dist/src/tui/components/chat-log.js.map +1 -1
  256. package/dist/src/tui/components/tui-bottom-bar.js +9 -5
  257. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  258. package/dist/src/tui/tui-backend.d.ts +16 -0
  259. package/dist/src/tui/tui-command-formatters.js +2 -2
  260. package/dist/src/tui/tui-commands.d.ts +9 -0
  261. package/dist/src/tui/tui-commands.js +95 -6
  262. package/dist/src/tui/tui-commands.js.map +1 -1
  263. package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
  264. package/dist/src/tui/tui-picker-overlay.js +36 -1
  265. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  266. package/dist/src/tui/tui-picker-services.d.ts +13 -0
  267. package/dist/src/tui/tui-run-state.js +11 -0
  268. package/dist/src/tui/tui-run-state.js.map +1 -1
  269. package/dist/src/tui/tui-run-status-format.d.ts +3 -0
  270. package/dist/src/tui/tui-run-status-format.js +33 -0
  271. package/dist/src/tui/tui-run-status-format.js.map +1 -0
  272. package/dist/src/tui/tui-session-actions.d.ts +5 -0
  273. package/dist/src/tui/tui-session-actions.js +24 -0
  274. package/dist/src/tui/tui-session-actions.js.map +1 -1
  275. package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
  276. package/dist/src/tui/tui-timeline-picker.js +81 -0
  277. package/dist/src/tui/tui-timeline-picker.js.map +1 -0
  278. package/dist/src/tui/tui-timeline.d.ts +15 -0
  279. package/dist/src/tui/tui-timeline.js +65 -0
  280. package/dist/src/tui/tui-timeline.js.map +1 -0
  281. package/dist/src/tui/tui-types.d.ts +1 -0
  282. package/dist/src/tui/tui-types.js +1 -0
  283. package/dist/src/tui/tui-types.js.map +1 -1
  284. package/dist/src/tui/tui.js +31 -25
  285. package/dist/src/tui/tui.js.map +1 -1
  286. package/dist/src/utils/index.js +1 -1
  287. package/dist/src/utils/logger/index.js +1 -1
  288. package/dist/src/utils/logger/stats.d.ts +3 -3
  289. package/dist/src/utils/logger.js +1 -1
  290. package/dist/src/work-items/agent-context.d.ts +5 -1
  291. package/dist/src/work-items/agent-context.js +39 -3
  292. package/dist/src/work-items/agent-context.js.map +1 -1
  293. package/dist/src/work-items/work-item-service.d.ts +2 -0
  294. package/dist/src/work-items/work-item-service.js +97 -0
  295. package/dist/src/work-items/work-item-service.js.map +1 -1
  296. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  297. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  298. package/package.json +5 -5
  299. package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +0 -2
  300. package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +0 -1
  301. package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +0 -1
  302. package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +0 -8
  303. package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +0 -1
  304. package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +0 -2
  305. package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +0 -1
  306. package/dist/gateway/static/root/assets/index-BNHDd2j1.css +0 -1
  307. package/dist/gateway/static/root/assets/index-BPXLPMuY.js +0 -193
  308. package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +0 -2
  309. package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +0 -3
  310. package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +0 -2
  311. package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +0 -1
  312. package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +0 -2
  313. package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +0 -1
  314. package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +0 -1
  315. package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +0 -1
  316. package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +0 -1
  317. package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +0 -1
  318. package/dist/gateway/static/root/assets/settings-form-section-BBYUDLVd.js +0 -1
  319. package/dist/gateway/static/root/assets/settings-page-DaO7zYZM.js +0 -1
  320. package/dist/gateway/static/root/assets/settings-page-layout-D8g9PAek.js +0 -1
  321. package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +0 -1
  322. package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +0 -1
  323. package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +0 -1
  324. package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +0 -2
  325. package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +0 -1
  326. package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +0 -18
@@ -0,0 +1,15 @@
1
+ import type { SessionTimelineItem } from '../session/transcript-outline.js';
2
+ export interface TuiTimelineTurn {
3
+ id: string;
4
+ turn: number;
5
+ displayIndex: number;
6
+ rowNumber?: number;
7
+ preview: string;
8
+ timestamp?: number;
9
+ toolCount: number;
10
+ running: boolean;
11
+ }
12
+ export declare function buildTuiTimelineTurns(items: readonly SessionTimelineItem[]): TuiTimelineTurn[];
13
+ export declare function findTimelineTurnByNumber(turns: readonly TuiTimelineTurn[], turnNumber: number): TuiTimelineTurn | undefined;
14
+ export declare function findNearestTimelineTurnByDisplayIndex(turns: readonly TuiTimelineTurn[], displayIndex: number): TuiTimelineTurn | undefined;
15
+ export declare function formatTimelineToolSummary(toolCount: number): string;
@@ -0,0 +1,65 @@
1
+ //#region src/tui/tui-timeline.ts
2
+ function compactText(text, max = 72) {
3
+ const normalized = text.replace(/\s+/g, " ").trim();
4
+ if (normalized.length <= max) return normalized;
5
+ return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
6
+ }
7
+ function buildTuiTimelineTurns(items) {
8
+ const turns = [];
9
+ let current = null;
10
+ let currentToolKeys = /* @__PURE__ */ new Set();
11
+ let lastDisplayIndex = 0;
12
+ for (const item of items) {
13
+ if (typeof item.displayIndex === "number" && Number.isFinite(item.displayIndex)) lastDisplayIndex = item.displayIndex;
14
+ if (item.kind === "turn" && item.role === "user") {
15
+ const turn = item.turn || turns.length + 1;
16
+ current = {
17
+ id: item.id,
18
+ turn,
19
+ displayIndex: item.displayIndex ?? lastDisplayIndex,
20
+ preview: compactText(item.preview || item.title || "Message"),
21
+ toolCount: 0,
22
+ running: false,
23
+ ...item.rowNumber !== void 0 ? { rowNumber: item.rowNumber } : {},
24
+ ...item.timestamp !== void 0 ? { timestamp: item.timestamp } : {}
25
+ };
26
+ turns.push(current);
27
+ currentToolKeys = /* @__PURE__ */ new Set();
28
+ continue;
29
+ }
30
+ if (!current) continue;
31
+ if (item.kind === "tool" || item.kind === "file" || item.kind === "command") {
32
+ const key = `${item.id}:${item.meta?.toolName ?? item.title ?? item.kind}`;
33
+ if (currentToolKeys.has(key)) {
34
+ current.running ||= item.status === "running";
35
+ continue;
36
+ }
37
+ currentToolKeys.add(key);
38
+ current.toolCount += 1;
39
+ current.running ||= item.status === "running";
40
+ }
41
+ }
42
+ return turns;
43
+ }
44
+ function findTimelineTurnByNumber(turns, turnNumber) {
45
+ return turns.find((turn) => turn.turn === turnNumber);
46
+ }
47
+ function findNearestTimelineTurnByDisplayIndex(turns, displayIndex) {
48
+ let selected = turns[0];
49
+ for (const turn of turns) {
50
+ if (turn.displayIndex <= displayIndex) {
51
+ selected = turn;
52
+ continue;
53
+ }
54
+ break;
55
+ }
56
+ return selected;
57
+ }
58
+ function formatTimelineToolSummary(toolCount) {
59
+ if (toolCount <= 0) return "0 tools";
60
+ return `${toolCount} tool${toolCount === 1 ? "" : "s"}`;
61
+ }
62
+ //#endregion
63
+ export { buildTuiTimelineTurns, findNearestTimelineTurnByDisplayIndex, findTimelineTurnByNumber, formatTimelineToolSummary };
64
+
65
+ //# sourceMappingURL=tui-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-timeline.js","names":[],"sources":["../../../src/tui/tui-timeline.ts"],"sourcesContent":["import type { SessionTimelineItem } from '../session/transcript-outline.js';\n\nexport interface TuiTimelineTurn {\n id: string;\n turn: number;\n displayIndex: number;\n rowNumber?: number;\n preview: string;\n timestamp?: number;\n toolCount: number;\n running: boolean;\n}\n\nfunction compactText(text: string, max = 72): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= max) return normalized;\n return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;\n}\n\nexport function buildTuiTimelineTurns(items: readonly SessionTimelineItem[]): TuiTimelineTurn[] {\n const turns: TuiTimelineTurn[] = [];\n let current: TuiTimelineTurn | null = null;\n let currentToolKeys = new Set<string>();\n let lastDisplayIndex = 0;\n\n for (const item of items) {\n if (typeof item.displayIndex === 'number' && Number.isFinite(item.displayIndex)) {\n lastDisplayIndex = item.displayIndex;\n }\n\n if (item.kind === 'turn' && item.role === 'user') {\n const turn = item.turn || turns.length + 1;\n current = {\n id: item.id,\n turn,\n displayIndex: item.displayIndex ?? lastDisplayIndex,\n preview: compactText(item.preview || item.title || 'Message'),\n toolCount: 0,\n running: false,\n ...(item.rowNumber !== undefined ? { rowNumber: item.rowNumber } : {}),\n ...(item.timestamp !== undefined ? { timestamp: item.timestamp } : {}),\n };\n turns.push(current);\n currentToolKeys = new Set();\n continue;\n }\n\n if (!current) continue;\n\n if (item.kind === 'tool' || item.kind === 'file' || item.kind === 'command') {\n const key = `${item.id}:${item.meta?.toolName ?? item.title ?? item.kind}`;\n if (currentToolKeys.has(key)) {\n current.running ||= item.status === 'running';\n continue;\n }\n currentToolKeys.add(key);\n current.toolCount += 1;\n current.running ||= item.status === 'running';\n }\n }\n\n return turns;\n}\n\nexport function findTimelineTurnByNumber(\n turns: readonly TuiTimelineTurn[],\n turnNumber: number,\n): TuiTimelineTurn | undefined {\n return turns.find((turn) => turn.turn === turnNumber);\n}\n\nexport function findNearestTimelineTurnByDisplayIndex(\n turns: readonly TuiTimelineTurn[],\n displayIndex: number,\n): TuiTimelineTurn | undefined {\n let selected = turns[0];\n for (const turn of turns) {\n if (turn.displayIndex <= displayIndex) {\n selected = turn;\n continue;\n }\n break;\n }\n return selected;\n}\n\nexport function formatTimelineToolSummary(toolCount: number): string {\n if (toolCount <= 0) return '0 tools';\n return `${toolCount} tool${toolCount === 1 ? '' : 's'}`;\n}\n"],"mappings":";AAaA,SAAS,YAAY,MAAc,MAAM,IAAY;CACnD,MAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACnD,KAAI,WAAW,UAAU,IAAK,QAAO;AACrC,QAAO,GAAG,WAAW,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC;;AAGhE,SAAgB,sBAAsB,OAA0D;CAC9F,MAAM,QAA2B,EAAE;CACnC,IAAI,UAAkC;CACtC,IAAI,kCAAkB,IAAI,KAAa;CACvC,IAAI,mBAAmB;AAEvB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,OAAO,KAAK,iBAAiB,YAAY,OAAO,SAAS,KAAK,aAAa,CAC7E,oBAAmB,KAAK;AAG1B,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ;GAChD,MAAM,OAAO,KAAK,QAAQ,MAAM,SAAS;AACzC,aAAU;IACR,IAAI,KAAK;IACT;IACA,cAAc,KAAK,gBAAgB;IACnC,SAAS,YAAY,KAAK,WAAW,KAAK,SAAS,UAAU;IAC7D,WAAW;IACX,SAAS;IACT,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;IACrE,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;IACtE;AACD,SAAM,KAAK,QAAQ;AACnB,qCAAkB,IAAI,KAAK;AAC3B;;AAGF,MAAI,CAAC,QAAS;AAEd,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,WAAW;GAC3E,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,KAAK,MAAM,YAAY,KAAK,SAAS,KAAK;AACpE,OAAI,gBAAgB,IAAI,IAAI,EAAE;AAC5B,YAAQ,YAAY,KAAK,WAAW;AACpC;;AAEF,mBAAgB,IAAI,IAAI;AACxB,WAAQ,aAAa;AACrB,WAAQ,YAAY,KAAK,WAAW;;;AAIxC,QAAO;;AAGT,SAAgB,yBACd,OACA,YAC6B;AAC7B,QAAO,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW;;AAGvD,SAAgB,sCACd,OACA,cAC6B;CAC7B,IAAI,WAAW,MAAM;AACrB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,gBAAgB,cAAc;AACrC,cAAW;AACX;;AAEF;;AAEF,QAAO;;AAGT,SAAgB,0BAA0B,WAA2B;AACnE,KAAI,aAAa,EAAG,QAAO;AAC3B,QAAO,GAAG,UAAU,OAAO,cAAc,IAAI,KAAK"}
@@ -42,6 +42,7 @@ export interface TuiRunStatus {
42
42
  lastCompletedRunId: string | null;
43
43
  source: TuiEventSource;
44
44
  lastEvent: string | null;
45
+ startedAt: number | null;
45
46
  lastActivityAt: number | null;
46
47
  stalledAt: number | null;
47
48
  recoveredAt: number | null;
@@ -12,6 +12,7 @@ function createInitialState(sessionKey) {
12
12
  lastCompletedRunId: null,
13
13
  source: "unknown",
14
14
  lastEvent: null,
15
+ startedAt: null,
15
16
  lastActivityAt: null,
16
17
  stalledAt: null,
17
18
  recoveredAt: null
@@ -1 +1 @@
1
- {"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Agent id for a fresh TUI session. */\n agentId?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Workspace directory for the new TUI session. */\n workdir?: string;\n /** Use the launch directory as the new TUI session workspace when no workdir is set. */\n useStartupCwd?: boolean;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */\n theme?: string;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running'\n | 'compacting'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';\n\nexport type TuiRunPhase =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'tool'\n | 'progress'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport interface TuiRunStatus {\n phase: TuiRunPhase;\n runId: string | null;\n directStreamRunId: string | null;\n lastCompletedRunId: string | null;\n source: TuiEventSource;\n lastEvent: string | null;\n lastActivityAt: number | null;\n stalledAt: number | null;\n recoveredAt: number | null;\n}\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n reasoningLevel?: string;\n verboseLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\n effectiveWorkspacePath?: string;\n workingDirectoryLocked?: boolean;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n runStatus: TuiRunStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */\n messageFollowUpQueue: string[];\n /** Queued Enter-while-busy steering messages after the first in-flight steer. */\n steeringQueue: string[];\n /** Ctrl+P cycle filter; `null` = all models from catalog. */\n scopedModelRefs: string[] | null;\n /** Last Escape timestamp for double-press actions. */\n lastEscapeAt: number;\n /** Human-readable progress from SSE `progress` events. */\n progressMessage: string | null;\n /** Session compaction in flight (local /compact handler). */\n isCompacting: boolean;\n /** Messages queued while compacting. */\n compactionQueue: string[];\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n runStatus: {\n phase: 'idle',\n runId: null,\n directStreamRunId: null,\n lastCompletedRunId: null,\n source: 'unknown',\n lastEvent: null,\n lastActivityAt: null,\n stalledAt: null,\n recoveredAt: null,\n },\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n messageFollowUpQueue: [],\n steeringQueue: [],\n scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";AA0HA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;GACT,OAAO;GACP,OAAO;GACP,mBAAmB;GACnB,oBAAoB;GACpB,QAAQ;GACR,WAAW;GACX,gBAAgB;GAChB,WAAW;GACX,aAAa;GACd;EACD,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EACf,sBAAsB,EAAE;EACxB,eAAe,EAAE;EACjB,iBAAiB;EACjB,cAAc;EACd,iBAAiB;EACjB,cAAc;EACd,iBAAiB,EAAE;EACpB"}
1
+ {"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Agent id for a fresh TUI session. */\n agentId?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Workspace directory for the new TUI session. */\n workdir?: string;\n /** Use the launch directory as the new TUI session workspace when no workdir is set. */\n useStartupCwd?: boolean;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */\n theme?: string;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running'\n | 'compacting'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';\n\nexport type TuiRunPhase =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'tool'\n | 'progress'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport interface TuiRunStatus {\n phase: TuiRunPhase;\n runId: string | null;\n directStreamRunId: string | null;\n lastCompletedRunId: string | null;\n source: TuiEventSource;\n lastEvent: string | null;\n startedAt: number | null;\n lastActivityAt: number | null;\n stalledAt: number | null;\n recoveredAt: number | null;\n}\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n reasoningLevel?: string;\n verboseLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\n effectiveWorkspacePath?: string;\n workingDirectoryLocked?: boolean;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n runStatus: TuiRunStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */\n messageFollowUpQueue: string[];\n /** Queued Enter-while-busy steering messages after the first in-flight steer. */\n steeringQueue: string[];\n /** Ctrl+P cycle filter; `null` = all models from catalog. */\n scopedModelRefs: string[] | null;\n /** Last Escape timestamp for double-press actions. */\n lastEscapeAt: number;\n /** Human-readable progress from SSE `progress` events. */\n progressMessage: string | null;\n /** Session compaction in flight (local /compact handler). */\n isCompacting: boolean;\n /** Messages queued while compacting. */\n compactionQueue: string[];\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n runStatus: {\n phase: 'idle',\n runId: null,\n directStreamRunId: null,\n lastCompletedRunId: null,\n source: 'unknown',\n lastEvent: null,\n startedAt: null,\n lastActivityAt: null,\n stalledAt: null,\n recoveredAt: null,\n },\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n messageFollowUpQueue: [],\n steeringQueue: [],\n scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";AA2HA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;GACT,OAAO;GACP,OAAO;GACP,mBAAmB;GACnB,oBAAoB;GACpB,QAAQ;GACR,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,WAAW;GACX,aAAa;GACd;EACD,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EACf,sBAAsB,EAAE;EACxB,eAAe,EAAE;EACjB,iBAAiB;EACjB,cAAc;EACd,iBAAiB;EACjB,cAAc;EACd,iBAAiB,EAAE;EACpB"}
@@ -35,7 +35,8 @@ import { createLocalShellRunner } from "./tui-local-shell.js";
35
35
  import { filterModelsForCycle, loadScopedModelRefs, saveScopedModelRefs } from "./tui-scoped-models.js";
36
36
  import { openModelPickerOverlay } from "./tui-model-picker.js";
37
37
  import { runTuiOAuthLogin } from "./tui-oauth-login.js";
38
- import { openAgentPickerOverlay, openProjectTrustOverlay, openReviewLauncherOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
38
+ import { openAgentPickerOverlay, openProjectTrustOverlay, openReviewLauncherOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTimelineOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
39
+ import { formatActiveRunStatus, formatRunDuration } from "./tui-run-status-format.js";
39
40
  import { formatBusyResponseHint, formatSteerUnavailableHint, formatSuspendUnsupportedHint } from "./tui-runtime-hints.js";
40
41
  import { createSessionActions } from "./tui-session-actions.js";
41
42
  import { TuiSessionSnapshot } from "./tui-session-snapshot.js";
@@ -55,8 +56,8 @@ import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
55
56
  import { tmpdir } from "node:os";
56
57
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
57
58
  import { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
58
- import { randomUUID } from "node:crypto";
59
59
  import { spawnSync } from "node:child_process";
60
+ import { randomUUID } from "node:crypto";
60
61
  import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
61
62
  import { Buffer } from "node:buffer";
62
63
  //#region src/tui/tui.ts
@@ -265,6 +266,7 @@ async function runTui(opts) {
265
266
  const statusContainer = new Container();
266
267
  const bottomBar = new TuiBottomBar(() => state, () => opts.thinking, () => formatKeyIds(keybindings, "app.message.dequeue", { capitalize: true }));
267
268
  const chatLog = new ChatLog(keybindings);
269
+ chatLog.setViewportRowsProvider(() => Math.max(8, tui.terminal.rows - 8));
268
270
  let startupResources;
269
271
  let startupCardShown = false;
270
272
  chatLog.setShowThinking(state.showThinking);
@@ -844,7 +846,9 @@ async function runTui(opts) {
844
846
  "streaming",
845
847
  "running",
846
848
  "compacting",
847
- "recovering"
849
+ "stalled",
850
+ "recovering",
851
+ "aborting"
848
852
  ]);
849
853
  const syncTerminalProgress = () => {
850
854
  if (!tuiSettings.showTerminalProgress) {
@@ -860,14 +864,10 @@ async function runTui(opts) {
860
864
  if (state.activeRunId && state.runStatus.lastActivityAt == null) state.runStatus = {
861
865
  ...state.runStatus,
862
866
  runId: state.activeRunId,
867
+ startedAt: state.runStatus.startedAt ?? lastStreamActivityAt,
863
868
  lastActivityAt: lastStreamActivityAt
864
869
  };
865
870
  };
866
- const formatElapsed = (startMs) => {
867
- const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1e3));
868
- if (totalSeconds < 60) return `${totalSeconds}s`;
869
- return `${Math.floor(totalSeconds / 60)}m ${totalSeconds % 60}s`;
870
- };
871
871
  const renderStatus = () => {
872
872
  const isBusy = busyStates.has(state.activityStatus);
873
873
  if (isBusy && extensionWorkingVisible) {
@@ -877,15 +877,15 @@ async function runTui(opts) {
877
877
  statusLoader = new Loader(tui, (spinner) => theme.accent(spinner), (text) => theme.bold(theme.accentSoft(text)), "", extensionWorkingIndicator);
878
878
  statusContainer.addChild(statusLoader);
879
879
  }
880
- const elapsed = formatElapsed(statusStartedAt);
881
- const loaderMessage = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;
882
- statusLoader.setMessage(`${loaderMessage} ${elapsed} | ${state.connectionStatus}`);
880
+ const renderLoaderMessage = () => {
881
+ const activeRunStatus = formatActiveRunStatus(state);
882
+ if (activeRunStatus) return activeRunStatus;
883
+ const elapsed = formatRunDuration(Date.now() - statusStartedAt);
884
+ return `${state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus} (${elapsed})`;
885
+ };
886
+ statusLoader.setMessage(`xopc • ${renderLoaderMessage()} | ${state.connectionStatus}`);
883
887
  if (!elapsedTimerId) elapsedTimerId = setInterval(() => {
884
- if (statusStartedAt && statusLoader) {
885
- const el = formatElapsed(statusStartedAt);
886
- const message = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;
887
- statusLoader.setMessage(`${message} • ${el} | ${state.connectionStatus}`);
888
- }
888
+ if (statusStartedAt && statusLoader) statusLoader.setMessage(`xopc • ${renderLoaderMessage()} | ${state.connectionStatus}`);
889
889
  }, 1e3);
890
890
  } else {
891
891
  if (!isBusy) {
@@ -955,7 +955,7 @@ async function runTui(opts) {
955
955
  process.exit(0);
956
956
  });
957
957
  };
958
- const { refreshSessionInfo, loadHistory: loadSessionHistory, setSession, abortActive, resetCurrentSession, clearChatForSessionSwitch } = createSessionActions({
958
+ const { refreshSessionInfo, loadHistory: loadSessionHistory, loadHistoryWindow, setSession, abortActive, resetCurrentSession, clearChatForSessionSwitch } = createSessionActions({
959
959
  client,
960
960
  chatLog,
961
961
  tui,
@@ -1035,7 +1035,7 @@ async function runTui(opts) {
1035
1035
  if (streamRecoveryPromise) return streamRecoveryPromise;
1036
1036
  const runId = state.activeRunId;
1037
1037
  markRunRecovering(state, Date.now());
1038
- state.progressMessage = "recovering stream history";
1038
+ state.progressMessage = "Reconnecting output";
1039
1039
  setActivityStatus("recovering");
1040
1040
  streamRecoveryPromise = (async () => {
1041
1041
  try {
@@ -1049,20 +1049,19 @@ async function runTui(opts) {
1049
1049
  runId
1050
1050
  });
1051
1051
  if (resumed.ok) {
1052
- state.progressMessage = "resuming stream";
1052
+ state.progressMessage = "Reconnecting output";
1053
1053
  setActivityStatus("recovering");
1054
- chatLog.addSystem(theme.dim(`Reattached to active run after ${reason}.`));
1055
1054
  } else {
1056
1055
  markRunRecoveryComplete(state, Date.now());
1057
- state.progressMessage = "stream stalled; resume unavailable";
1056
+ state.progressMessage = "Output stale";
1058
1057
  setActivityStatus("stalled");
1059
- chatLog.addSystem(theme.dim(`Recovered persisted history after ${reason}, but could not resume stream: ${resumed.reason ?? "run relay unavailable"}. Press Escape or /abort to stop it.`));
1058
+ chatLog.addSystem(theme.dim(`Output connection is stale. The task may still be running, but xopc could not reattach to live output: ${resumed.reason ?? "run relay unavailable"}. Press Escape or /abort to stop it.`));
1060
1059
  }
1061
1060
  } else {
1062
1061
  markRunRecoveryComplete(state, Date.now());
1063
- state.progressMessage = "stream stalled; waiting for new events or abort";
1062
+ state.progressMessage = "Output stale";
1064
1063
  setActivityStatus("stalled");
1065
- chatLog.addSystem(theme.dim(`Recovered persisted history after ${reason}. Active run is still marked stalled; press Escape or /abort to stop it.`));
1064
+ chatLog.addSystem(theme.dim("Output connection is stale. The task may still be running. Press Escape or /abort to stop it."));
1066
1065
  }
1067
1066
  }
1068
1067
  } catch (error) {
@@ -1432,6 +1431,7 @@ async function runTui(opts) {
1432
1431
  sendSteeringToActiveRun(text);
1433
1432
  };
1434
1433
  const sendMessage = (text) => {
1434
+ chatLog.jumpToLatest();
1435
1435
  if (state.activeRunId && pendingImageAttachments.length > 0) {
1436
1436
  chatLog.addSystem(theme.dim("Image attachments cannot be steered into an active run. Wait for this reply to finish, then send."));
1437
1437
  tui.requestRender();
@@ -1582,6 +1582,7 @@ async function runTui(opts) {
1582
1582
  openReviewLauncher: () => {},
1583
1583
  openSessionPicker: () => {},
1584
1584
  openSessionTree: () => {},
1585
+ openTimeline: (_initialSearch) => {},
1585
1586
  openTranscriptTree: () => {},
1586
1587
  openUserMessageFork: () => {},
1587
1588
  openScopedModels: () => {},
@@ -1654,6 +1655,9 @@ async function runTui(opts) {
1654
1655
  getSessionStats: () => client.getSessionStats(state.currentSessionKey),
1655
1656
  getStartupResources: () => startupResources,
1656
1657
  loadTranscriptTree: () => client.loadTranscriptTree(state.currentSessionKey),
1658
+ loadTimeline: () => client.loadTimeline(state.currentSessionKey),
1659
+ loadHistoryWindow,
1660
+ loadSessionHistory: () => loadSessionHistory(),
1657
1661
  exportSession: exportCurrentSession,
1658
1662
  importSession: importSessionExport,
1659
1663
  createShare: createShareLink,
@@ -1827,6 +1831,7 @@ async function runTui(opts) {
1827
1831
  switchAgentSession,
1828
1832
  clearChatForSessionSwitch,
1829
1833
  loadSessionHistory,
1834
+ loadHistoryWindow,
1830
1835
  setEditorText: (text) => editor.setText(text),
1831
1836
  setModelChoices,
1832
1837
  getScopedModelRefs: () => state.scopedModelRefs,
@@ -1852,6 +1857,7 @@ async function runTui(opts) {
1852
1857
  uiOverlays.openReviewLauncher = () => void openReviewLauncherOverlay(pickerSvc);
1853
1858
  uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);
1854
1859
  uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);
1860
+ uiOverlays.openTimeline = (initialSearch) => void openTimelineOverlay(pickerSvc, initialSearch);
1855
1861
  uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);
1856
1862
  uiOverlays.openUserMessageFork = () => void openUserMessageForkOverlay(pickerSvc);
1857
1863
  uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);
@@ -1959,7 +1965,7 @@ async function runTui(opts) {
1959
1965
  const now = Date.now();
1960
1966
  if (!isActiveRunStreamStale(state, now, 3e4)) return;
1961
1967
  if (!markActiveRunStalled(state, now)) return;
1962
- chatLog.addSystem(theme.dim("No stream activity for 30s; preserving active run and reloading persisted history."));
1968
+ state.progressMessage = "Reconnecting output";
1963
1969
  setActivityStatus("stalled");
1964
1970
  recoverActiveRunFromHistory("stream watchdog");
1965
1971
  tui.requestRender();