@xopcai/xopc 0.0.103 → 0.0.104

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 (930) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  64. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  65. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-seed.js +1 -1
  94. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  95. package/dist/src/agent/embedded/run-turn.js +8 -2
  96. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  97. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  98. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  99. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  100. package/dist/src/agent/embedded/types.d.ts +36 -35
  101. package/dist/src/agent/fallback/candidates.js +1 -1
  102. package/dist/src/agent/fallback/candidates.js.map +1 -1
  103. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  104. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  105. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  106. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  107. package/dist/src/agent/models/manager.d.ts +1 -1
  108. package/dist/src/agent/models/manager.js +1 -1
  109. package/dist/src/agent/models/manager.js.map +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  112. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  113. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  114. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  115. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  116. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  117. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  118. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  119. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  120. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  121. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  122. package/dist/src/agent/service-inbound-utils.js +1 -17
  123. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  124. package/dist/src/agent/service.d.ts +4 -4
  125. package/dist/src/agent/service.js +27 -15
  126. package/dist/src/agent/service.js.map +1 -1
  127. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  128. package/dist/src/agent/session/session-config-service.js +9 -1
  129. package/dist/src/agent/session/session-config-service.js.map +1 -1
  130. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  131. package/dist/src/agent/session/session-inspector.js +4 -0
  132. package/dist/src/agent/session/session-inspector.js.map +1 -1
  133. package/dist/src/agent/skills/config.js +1 -3
  134. package/dist/src/agent/skills/config.js.map +1 -1
  135. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  136. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  137. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  138. package/dist/src/agent/skills/hub-pull.js +1 -1
  139. package/dist/src/agent/skills/index.js +20 -5
  140. package/dist/src/agent/skills/index.js.map +1 -1
  141. package/dist/src/agent/skills/installer.js +14 -27
  142. package/dist/src/agent/skills/installer.js.map +1 -1
  143. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  147. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  149. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  151. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  152. package/dist/src/agent/skills/skill-manager.js +3 -3
  153. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  154. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  155. package/dist/src/agent/skills/skill-view-path.js +3 -66
  156. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  157. package/dist/src/agent/skills/test-framework.js +2 -3
  158. package/dist/src/agent/skills/test-framework.js.map +1 -1
  159. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  160. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  161. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  162. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  163. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  164. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  165. package/dist/src/agent/tool-manuals/index.js +28 -0
  166. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  167. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  168. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  169. package/dist/src/agent/tools/factory.js +7 -5
  170. package/dist/src/agent/tools/factory.js.map +1 -1
  171. package/dist/src/agent/tools/index.d.ts +1 -0
  172. package/dist/src/agent/tools/index.js +5 -4
  173. package/dist/src/agent/tools/session-search-tool.js +1 -1
  174. package/dist/src/agent/tools/shell.js +1 -1
  175. package/dist/src/agent/tools/skills-tools.js +37 -8
  176. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  177. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  178. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  179. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  180. package/dist/src/agent/tools/web-extract.js +2 -2
  181. package/dist/src/agent/tools/web.js +1 -1
  182. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  183. package/dist/src/agent/workflow/catalog.js +66 -25
  184. package/dist/src/agent/workflow/catalog.js.map +1 -1
  185. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  186. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  187. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  188. package/dist/src/agent/workflow/types.d.ts +10 -0
  189. package/dist/src/auth/credentials.js +10 -5
  190. package/dist/src/auth/credentials.js.map +1 -1
  191. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  192. package/dist/src/browser/actions/registry.js +2 -2
  193. package/dist/src/browser/cdp-local-launcher.js +1 -1
  194. package/dist/src/browser/index.js +3 -3
  195. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  196. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  197. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  199. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  201. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  202. package/dist/src/channels/dock.d.ts +0 -7
  203. package/dist/src/channels/dock.js +1 -21
  204. package/dist/src/channels/index.d.ts +1 -3
  205. package/dist/src/channels/index.js +1 -5
  206. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  207. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  208. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  209. package/dist/src/channels/manager.d.ts +1 -0
  210. package/dist/src/channels/manager.js +3 -0
  211. package/dist/src/channels/manager.js.map +1 -1
  212. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  213. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  214. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  215. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  216. package/dist/src/channels/pairing/pairing-service.js +8 -27
  217. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  218. package/dist/src/channels/plugin-types.d.ts +3 -1
  219. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  220. package/dist/src/channels/telegram/index.js +1 -1
  221. package/dist/src/chat-commands/builtins/config.js +4 -4
  222. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  223. package/dist/src/chat-commands/config-paths.js +1 -1
  224. package/dist/src/chat-commands/config-paths.js.map +1 -1
  225. package/dist/src/chat-commands/context.js +1 -1
  226. package/dist/src/chat-commands/context.js.map +1 -1
  227. package/dist/src/cli/bin.js +1 -1
  228. package/dist/src/cli/command-manifest.js +1 -1
  229. package/dist/src/cli/command-manifest.js.map +1 -1
  230. package/dist/src/cli/commands/agent.js +2 -2
  231. package/dist/src/cli/commands/agent.js.map +1 -1
  232. package/dist/src/cli/commands/agents.js +2 -4
  233. package/dist/src/cli/commands/agents.js.map +1 -1
  234. package/dist/src/cli/commands/auth.js +1 -1
  235. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  236. package/dist/src/cli/commands/channels.d.ts +1 -5
  237. package/dist/src/cli/commands/channels.js +115 -281
  238. package/dist/src/cli/commands/channels.js.map +1 -1
  239. package/dist/src/cli/commands/config.js +2 -2
  240. package/dist/src/cli/commands/config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  242. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  244. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  247. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  248. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  249. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  250. package/dist/src/cli/commands/extension-dev.js +2 -1
  251. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  252. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  253. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  254. package/dist/src/cli/commands/extension-pack.js +2 -1
  255. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  256. package/dist/src/cli/commands/models.js +7 -4
  257. package/dist/src/cli/commands/models.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  259. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  260. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  261. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  262. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  263. package/dist/src/cli/commands/onboard/model.js +8 -5
  264. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  265. package/dist/src/cli/commands/onboard.js +4 -6
  266. package/dist/src/cli/commands/onboard.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  269. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  270. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  271. package/dist/src/cli/commands/tui.js +13 -5
  272. package/dist/src/cli/commands/tui.js.map +1 -1
  273. package/dist/src/cli/extension-cli-register.js +1 -1
  274. package/dist/src/commands/agents.config.d.ts +3 -3
  275. package/dist/src/commands/agents.config.js +7 -7
  276. package/dist/src/commands/agents.config.js.map +1 -1
  277. package/dist/src/config/agent-profile.d.ts +1 -1
  278. package/dist/src/config/agent-profile.js +6 -2
  279. package/dist/src/config/agent-profile.js.map +1 -1
  280. package/dist/src/config/agent-typed-models.d.ts +2 -2
  281. package/dist/src/config/agent-typed-models.js +13 -2
  282. package/dist/src/config/agent-typed-models.js.map +1 -1
  283. package/dist/src/config/index.js +3 -3
  284. package/dist/src/config/integration.d.ts +1 -1
  285. package/dist/src/config/loader.d.ts +0 -1
  286. package/dist/src/config/loader.js +4 -9
  287. package/dist/src/config/loader.js.map +1 -1
  288. package/dist/src/config/models-json.d.ts +6 -6
  289. package/dist/src/config/rules.js +2 -12
  290. package/dist/src/config/rules.js.map +1 -1
  291. package/dist/src/config/schema.d.ts +74 -47
  292. package/dist/src/config/schema.js +28 -66
  293. package/dist/src/config/schema.js.map +1 -1
  294. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  295. package/dist/src/config/validate-channel-configs.js +29 -10
  296. package/dist/src/config/validate-channel-configs.js.map +1 -1
  297. package/dist/src/cron/executor.js +1 -4
  298. package/dist/src/cron/executor.js.map +1 -1
  299. package/dist/src/extensions/activation-context.js +3 -1
  300. package/dist/src/extensions/activation-context.js.map +1 -1
  301. package/dist/src/extensions/activation-planner.js +12 -0
  302. package/dist/src/extensions/activation-planner.js.map +1 -1
  303. package/dist/src/extensions/api.d.ts +5 -1
  304. package/dist/src/extensions/api.js +12 -0
  305. package/dist/src/extensions/api.js.map +1 -1
  306. package/dist/src/extensions/discover-extensions.js +17 -13
  307. package/dist/src/extensions/discover-extensions.js.map +1 -1
  308. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  309. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  310. package/dist/src/extensions/index.js +12 -4
  311. package/dist/src/extensions/index.js.map +1 -0
  312. package/dist/src/extensions/loader.d.ts +5 -1
  313. package/dist/src/extensions/loader.js +12 -11
  314. package/dist/src/extensions/loader.js.map +1 -1
  315. package/dist/src/extensions/manifest-registry.js +98 -93
  316. package/dist/src/extensions/manifest-registry.js.map +1 -1
  317. package/dist/src/extensions/normalize-manifest.js +91 -15
  318. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  319. package/dist/src/extensions/sdk/index.js +1 -1
  320. package/dist/src/extensions/sdk/testing.js +4 -0
  321. package/dist/src/extensions/sdk/testing.js.map +1 -1
  322. package/dist/src/extensions/types/core.d.ts +32 -1
  323. package/dist/src/extensions/types/manifest.d.ts +60 -0
  324. package/dist/src/extensions/types/tui.d.ts +414 -5
  325. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  326. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  327. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  328. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  329. package/dist/src/gateway/agent-run-relay.js +10 -3
  330. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  331. package/dist/src/gateway/agents-admin.d.ts +32 -19
  332. package/dist/src/gateway/agents-admin.js +113 -93
  333. package/dist/src/gateway/agents-admin.js.map +1 -1
  334. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  335. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  336. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  337. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  338. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  339. package/dist/src/gateway/heartbeat/service.js +1 -1
  340. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  341. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  342. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  343. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  344. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  345. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +83 -48
  347. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +134 -214
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  351. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  353. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  355. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  356. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  357. package/dist/src/gateway/hono/routes/config.js +5 -2
  358. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  359. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  360. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  361. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  362. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  363. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  364. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  365. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  367. package/dist/src/gateway/hono/routes/tui.js +16 -0
  368. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  369. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  370. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  371. package/dist/src/gateway/hono/sse.d.ts +5 -7
  372. package/dist/src/gateway/hono/sse.js +21 -38
  373. package/dist/src/gateway/hono/sse.js.map +1 -1
  374. package/dist/src/gateway/protocol.js.map +1 -1
  375. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  376. package/dist/src/gateway/service/agent-runner.js +1 -1
  377. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  378. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  379. package/dist/src/gateway/service/marketplace-service.js +7 -4
  380. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  381. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  382. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  383. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  384. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  385. package/dist/src/gateway/service/sessions-api.js +12 -0
  386. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  387. package/dist/src/gateway/service.d.ts +6 -0
  388. package/dist/src/gateway/service.js +73 -57
  389. package/dist/src/gateway/service.js.map +1 -1
  390. package/dist/src/heartbeat/index.js +1 -1
  391. package/dist/src/mcp/channel-bridge.js +1 -1
  392. package/dist/src/project-trust/trust-store.d.ts +30 -0
  393. package/dist/src/project-trust/trust-store.js +194 -0
  394. package/dist/src/project-trust/trust-store.js.map +1 -0
  395. package/dist/src/providers/index.d.ts +1 -1
  396. package/dist/src/providers/index.js +18 -7
  397. package/dist/src/providers/index.js.map +1 -1
  398. package/dist/src/routing/resolve-route.d.ts +0 -3
  399. package/dist/src/routing/resolve-route.js.map +1 -1
  400. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  401. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  402. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  403. package/dist/src/session/client-history.d.ts +32 -0
  404. package/dist/src/session/client-history.js +232 -1
  405. package/dist/src/session/client-history.js.map +1 -1
  406. package/dist/src/session/manager.d.ts +37 -4
  407. package/dist/src/session/manager.js +39 -15
  408. package/dist/src/session/manager.js.map +1 -1
  409. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  410. package/dist/src/session/session-context-for-llm.js +105 -2
  411. package/dist/src/session/session-context-for-llm.js.map +1 -1
  412. package/dist/src/session/store.d.ts +37 -0
  413. package/dist/src/session/store.js +127 -2
  414. package/dist/src/session/store.js.map +1 -1
  415. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  416. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  417. package/dist/src/session/types.d.ts +14 -1
  418. package/dist/src/session/types.js.map +1 -1
  419. package/dist/src/share/share-thumbnail.js +1 -1
  420. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  421. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  422. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  423. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  424. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  425. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  426. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  427. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  428. package/dist/src/storage/sqlite/schema.js +1 -1
  429. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  430. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  431. package/dist/src/storage/sqlite/session-repository.js +52 -25
  432. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  433. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  434. package/dist/src/tui/backends/embedded-backend.js +227 -39
  435. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  436. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  437. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  438. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  439. package/dist/src/tui/chat-history.d.ts +5 -1
  440. package/dist/src/tui/chat-history.js +78 -8
  441. package/dist/src/tui/chat-history.js.map +1 -1
  442. package/dist/src/tui/clipboard-text.d.ts +5 -0
  443. package/dist/src/tui/clipboard-text.js +46 -0
  444. package/dist/src/tui/clipboard-text.js.map +1 -0
  445. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  446. package/dist/src/tui/components/assistant-message.js +115 -9
  447. package/dist/src/tui/components/assistant-message.js.map +1 -1
  448. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  449. package/dist/src/tui/components/bash-execution.js +31 -3
  450. package/dist/src/tui/components/bash-execution.js.map +1 -1
  451. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  452. package/dist/src/tui/components/bash-summary.js +87 -0
  453. package/dist/src/tui/components/bash-summary.js.map +1 -0
  454. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  455. package/dist/src/tui/components/branch-message-summary.js +43 -0
  456. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  457. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  458. package/dist/src/tui/components/branch-summary.js +51 -0
  459. package/dist/src/tui/components/branch-summary.js.map +1 -0
  460. package/dist/src/tui/components/chat-log.d.ts +46 -6
  461. package/dist/src/tui/components/chat-log.js +183 -21
  462. package/dist/src/tui/components/chat-log.js.map +1 -1
  463. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  464. package/dist/src/tui/components/compaction-summary.js +46 -0
  465. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  466. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  467. package/dist/src/tui/components/custom-editor.js +2 -0
  468. package/dist/src/tui/components/custom-editor.js.map +1 -1
  469. package/dist/src/tui/components/custom-message.d.ts +23 -0
  470. package/dist/src/tui/components/custom-message.js +65 -0
  471. package/dist/src/tui/components/custom-message.js.map +1 -0
  472. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  473. package/dist/src/tui/components/extension-dialog.js +127 -0
  474. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  475. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  476. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  477. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  478. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  479. package/dist/src/tui/components/searchable-select-list.js +82 -10
  480. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  481. package/dist/src/tui/components/session-selector.d.ts +18 -4
  482. package/dist/src/tui/components/session-selector.js +207 -40
  483. package/dist/src/tui/components/session-selector.js.map +1 -1
  484. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  485. package/dist/src/tui/components/settings-selector.js +126 -7
  486. package/dist/src/tui/components/settings-selector.js.map +1 -1
  487. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  488. package/dist/src/tui/components/thinking-selector.js +48 -0
  489. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  490. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  491. package/dist/src/tui/components/tool-execution.js +378 -28
  492. package/dist/src/tui/components/tool-execution.js.map +1 -1
  493. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  494. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  495. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  496. package/dist/src/tui/components/tui-header.d.ts +9 -2
  497. package/dist/src/tui/components/tui-header.js +25 -5
  498. package/dist/src/tui/components/tui-header.js.map +1 -1
  499. package/dist/src/tui/components/user-message.d.ts +4 -2
  500. package/dist/src/tui/components/user-message.js +42 -9
  501. package/dist/src/tui/components/user-message.js.map +1 -1
  502. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  503. package/dist/src/tui/components/visual-truncate.js +27 -0
  504. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  505. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  506. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  507. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  508. package/dist/src/tui/extension-host/host.d.ts +31 -1
  509. package/dist/src/tui/extension-host/host.js +123 -6
  510. package/dist/src/tui/extension-host/host.js.map +1 -1
  511. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  512. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  513. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  514. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  515. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  516. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  517. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  518. package/dist/src/tui/extension-host/runtime.js +547 -85
  519. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  520. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  521. package/dist/src/tui/extension-host/surface.js +30 -6
  522. package/dist/src/tui/extension-host/surface.js.map +1 -1
  523. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  524. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  525. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  526. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  527. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  528. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  529. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  530. package/dist/src/tui/tui-agent-events.js +200 -59
  531. package/dist/src/tui/tui-agent-events.js.map +1 -1
  532. package/dist/src/tui/tui-backend.d.ts +169 -3
  533. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  534. package/dist/src/tui/tui-command-formatters.js +594 -0
  535. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  536. package/dist/src/tui/tui-commands.d.ts +57 -7
  537. package/dist/src/tui/tui-commands.js +639 -43
  538. package/dist/src/tui/tui-commands.js.map +1 -1
  539. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  540. package/dist/src/tui/tui-context-usage.js +9 -1
  541. package/dist/src/tui/tui-context-usage.js.map +1 -1
  542. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  543. package/dist/src/tui/tui-extension-user-message.js +32 -0
  544. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  545. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  546. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  547. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  548. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  549. package/dist/src/tui/tui-local-shell.js +50 -8
  550. package/dist/src/tui/tui-local-shell.js.map +1 -1
  551. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  552. package/dist/src/tui/tui-model-picker.js +152 -0
  553. package/dist/src/tui/tui-model-picker.js.map +1 -0
  554. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  555. package/dist/src/tui/tui-oauth-login.js +189 -0
  556. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  557. package/dist/src/tui/tui-overlays.d.ts +3 -3
  558. package/dist/src/tui/tui-overlays.js +6 -7
  559. package/dist/src/tui/tui-overlays.js.map +1 -1
  560. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  561. package/dist/src/tui/tui-picker-overlay.js +340 -30
  562. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  563. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  564. package/dist/src/tui/tui-picker-services.js +1 -0
  565. package/dist/src/tui/tui-run-state.d.ts +11 -0
  566. package/dist/src/tui/tui-run-state.js +114 -0
  567. package/dist/src/tui/tui-run-state.js.map +1 -0
  568. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  569. package/dist/src/tui/tui-runtime-hints.js +18 -0
  570. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  571. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  572. package/dist/src/tui/tui-scoped-models.js +2 -2
  573. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  574. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  575. package/dist/src/tui/tui-session-actions.js +21 -9
  576. package/dist/src/tui/tui-session-actions.js.map +1 -1
  577. package/dist/src/tui/tui-session-format.d.ts +4 -1
  578. package/dist/src/tui/tui-session-format.js +17 -3
  579. package/dist/src/tui/tui-session-format.js.map +1 -1
  580. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  581. package/dist/src/tui/tui-session-snapshot.js +184 -0
  582. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  583. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  584. package/dist/src/tui/tui-session-stats.js +59 -0
  585. package/dist/src/tui/tui-session-stats.js.map +1 -0
  586. package/dist/src/tui/tui-settings.d.ts +21 -0
  587. package/dist/src/tui/tui-settings.js +28 -1
  588. package/dist/src/tui/tui-settings.js.map +1 -1
  589. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  591. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  592. package/dist/src/tui/tui-startup-resources.js +39 -0
  593. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  594. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  595. package/dist/src/tui/tui-startup-text.js +58 -0
  596. package/dist/src/tui/tui-startup-text.js.map +1 -0
  597. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  598. package/dist/src/tui/tui-stdio-filter.js +11 -7
  599. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  600. package/dist/src/tui/tui-submit.d.ts +2 -0
  601. package/dist/src/tui/tui-submit.js +2 -1
  602. package/dist/src/tui/tui-submit.js.map +1 -1
  603. package/dist/src/tui/tui-tool-diff.js +61 -7
  604. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  605. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  606. package/dist/src/tui/tui-tool-result.js +74 -0
  607. package/dist/src/tui/tui-tool-result.js.map +1 -0
  608. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  609. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  610. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  611. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  612. package/dist/src/tui/tui-transcript-tree.js +316 -0
  613. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  614. package/dist/src/tui/tui-types.d.ts +25 -34
  615. package/dist/src/tui/tui-types.js +12 -0
  616. package/dist/src/tui/tui-types.js.map +1 -1
  617. package/dist/src/tui/tui.js +1288 -112
  618. package/dist/src/tui/tui.js.map +1 -1
  619. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  620. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  621. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  622. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  623. package/dist/src/workflows/domain/definition-utils.js +18 -8
  624. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  625. package/dist/src/workflows/domain/definition.d.ts +25 -0
  626. package/dist/src/workflows/domain/event.d.ts +1 -0
  627. package/dist/src/workflows/domain/result.d.ts +15 -0
  628. package/dist/src/workflows/domain/run.d.ts +2 -0
  629. package/dist/src/workflows/domain/run.js.map +1 -1
  630. package/dist/src/workflows/engine/projector.js +4 -0
  631. package/dist/src/workflows/engine/projector.js.map +1 -1
  632. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  633. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  634. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  635. package/dist/src/workflows/index.d.ts +1 -0
  636. package/dist/src/workflows/index.js +4 -1
  637. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  638. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  639. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  640. package/dist/src/workflows/registry/index.d.ts +2 -0
  641. package/dist/src/workflows/registry/index.js +2 -0
  642. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  643. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  644. package/dist/src/workflows/runtime/index.d.ts +2 -0
  645. package/dist/src/workflows/runtime/index.js +2 -1
  646. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  647. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  648. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  649. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  650. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  651. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  652. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  653. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  654. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  655. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  656. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  657. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  658. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  659. package/package.json +21 -15
  660. package/skills/creative/frontend-design/SKILL.md +1 -1
  661. package/skills/creative/theme-factory/SKILL.md +1 -1
  662. package/skills/documents/xlsx/SKILL.md +1 -1
  663. package/skills/engineering/diagnose/SKILL.md +2 -2
  664. package/skills/engineering/tdd/SKILL.md +1 -1
  665. package/skills/tools/github/SKILL.md +6 -1
  666. package/skills/tools/webapp-testing/SKILL.md +4 -1
  667. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  668. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  669. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  670. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  671. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  672. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  673. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  674. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  675. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  676. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  677. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  678. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  679. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  680. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  681. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  682. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  683. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  684. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  685. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  686. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  687. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  688. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  689. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  690. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  691. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  692. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  693. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  694. package/dist/src/channels/dock.js.map +0 -1
  695. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  696. package/dist/src/channels/plugins/bundled.js +0 -10
  697. package/dist/src/channels/plugins/bundled.js.map +0 -1
  698. package/dist/src/channels/registry.d.ts +0 -25
  699. package/dist/src/channels/registry.js +0 -82
  700. package/dist/src/channels/registry.js.map +0 -1
  701. package/dist/src/config/localized-text.d.ts +0 -6
  702. package/dist/src/config/localized-text.js +0 -42
  703. package/dist/src/config/localized-text.js.map +0 -1
  704. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  705. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  706. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  707. package/dist/src/tui/stream-assembler.d.ts +0 -22
  708. package/dist/src/tui/stream-assembler.js +0 -63
  709. package/dist/src/tui/stream-assembler.js.map +0 -1
  710. package/skills/browser/SKILL-zh.md +0 -188
  711. package/skills/business/company-values/SKILL-zh.md +0 -80
  712. package/skills/business/company-values/SKILL.md +0 -80
  713. package/skills/business/find-community/SKILL-zh.md +0 -50
  714. package/skills/business/find-community/SKILL.md +0 -50
  715. package/skills/business/first-customers/SKILL-zh.md +0 -76
  716. package/skills/business/first-customers/SKILL.md +0 -76
  717. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  718. package/skills/business/grow-sustainably/SKILL.md +0 -92
  719. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  720. package/skills/business/marketing-plan/SKILL.md +0 -100
  721. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  722. package/skills/business/minimalist-review/SKILL.md +0 -82
  723. package/skills/business/mvp/SKILL-zh.md +0 -81
  724. package/skills/business/mvp/SKILL.md +0 -81
  725. package/skills/business/pricing/SKILL-zh.md +0 -64
  726. package/skills/business/pricing/SKILL.md +0 -64
  727. package/skills/business/processize/SKILL-zh.md +0 -91
  728. package/skills/business/processize/SKILL.md +0 -91
  729. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  730. package/skills/business/validate-idea/SKILL.md +0 -68
  731. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  732. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  733. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  734. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  735. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  736. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  737. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  738. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  739. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  740. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  741. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  742. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  743. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  744. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  745. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  746. package/skills/documents/docx/LICENSE.txt +0 -30
  747. package/skills/documents/docx/SKILL-zh.md +0 -590
  748. package/skills/documents/docx/SKILL.md +0 -590
  749. package/skills/documents/docx/scripts/__init__.py +0 -1
  750. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  751. package/skills/documents/docx/scripts/comment.py +0 -318
  752. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  753. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  754. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  755. package/skills/documents/docx/scripts/office/pack.py +0 -159
  756. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  757. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  758. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  759. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  760. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  761. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  762. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  763. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  764. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  765. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  766. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  767. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  768. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  769. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  770. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  771. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  772. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  773. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  774. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  775. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  783. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  784. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  785. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  786. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  787. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  788. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  789. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  790. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  791. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  792. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  793. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  794. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  795. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  796. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  797. package/skills/documents/docx/scripts/office/validate.py +0 -111
  798. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  799. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  800. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  801. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  802. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  803. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  804. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  805. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  806. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  807. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  808. package/skills/documents/pdf/LICENSE.txt +0 -30
  809. package/skills/documents/pdf/SKILL-zh.md +0 -314
  810. package/skills/documents/pdf/SKILL.md +0 -314
  811. package/skills/documents/pdf/forms.md +0 -294
  812. package/skills/documents/pdf/reference.md +0 -612
  813. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  814. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  815. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  816. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  817. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  818. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  819. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  820. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  821. package/skills/documents/pptx/LICENSE.txt +0 -30
  822. package/skills/documents/pptx/SKILL-zh.md +0 -232
  823. package/skills/documents/pptx/SKILL.md +0 -232
  824. package/skills/documents/pptx/editing.md +0 -205
  825. package/skills/documents/pptx/pptxgenjs.md +0 -420
  826. package/skills/documents/pptx/scripts/__init__.py +0 -0
  827. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  828. package/skills/documents/pptx/scripts/clean.py +0 -286
  829. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  830. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  831. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  832. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  833. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  834. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  835. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  836. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  837. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  838. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  839. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  840. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  841. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  842. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  843. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  844. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  845. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  846. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  847. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  848. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  849. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  850. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  851. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  852. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  860. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  861. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  862. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  863. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  864. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  865. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  866. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  867. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  868. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  869. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  870. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  871. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  872. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  873. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  874. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  875. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  876. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  877. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  878. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  879. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  880. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  881. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  882. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  883. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  884. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  885. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  886. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  887. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  888. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  889. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  890. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  891. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  892. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  893. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  894. package/skills/engineering/to-issues/SKILL.md +0 -81
  895. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  896. package/skills/engineering/to-prd/SKILL.md +0 -74
  897. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  898. package/skills/engineering/zoom-out/SKILL.md +0 -7
  899. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  900. package/skills/tools/github/SKILL-zh.md +0 -48
  901. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  902. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  903. package/skills/tools/internal-comms/SKILL.md +0 -32
  904. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  905. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  906. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  907. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  908. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  909. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  910. package/skills/tools/skill-creator/SKILL.md +0 -485
  911. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  912. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  913. package/skills/tools/skill-creator/agents/grader.md +0 -223
  914. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  915. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  916. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  917. package/skills/tools/skill-creator/references/schemas.md +0 -430
  918. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  919. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  920. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  921. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  922. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  923. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  924. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  925. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  926. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  927. package/skills/tools/summarize/SKILL-zh.md +0 -47
  928. package/skills/tools/weather/SKILL-zh.md +0 -46
  929. package/skills/tools/weather/SKILL.md +0 -46
  930. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-transcript-tree-picker.js","names":[],"sources":["../../../src/tui/tui-transcript-tree-picker.ts"],"sourcesContent":["import {\n Input,\n type Component,\n type Focusable,\n type Keybinding,\n type KeybindingsManager,\n type SelectItem,\n truncateToWidth,\n visibleWidth,\n} from '@earendil-works/pi-tui';\nimport { randomUUID } from 'node:crypto';\n\nimport { SearchableSelectList } from './components/searchable-select-list.js';\nimport { formatKeyIds, formatKeyText } from './format-tui-hotkeys.js';\nimport type { TuiTranscriptTreeEntry } from './tui-backend.js';\nimport { searchableSelectListTheme, theme } from './theme.js';\nimport type { TuiSettings, TreeFilterMode } from './tui-settings.js';\nimport {\n filterTuiTranscriptTreeEntries,\n formatTuiTranscriptTreeEntryDisplayText,\n} from './tui-transcript-tree.js';\n\nfunction formatSelectNavigationHint(keybindings: KeybindingsManager): string {\n const up = formatKeyIds(keybindings, 'tui.select.up', { capitalize: true });\n const down = formatKeyIds(keybindings, 'tui.select.down', { capitalize: true });\n return `${up}/${down}`;\n}\n\nexport function formatTranscriptTreeOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Transcript tree (${nav} · type to filter · ${confirm} inspect · ${cancel} close)`;\n}\n\nexport function formatTranscriptTreeFilterHint(\n keybindings: KeybindingsManager,\n filterMode: TuiSettings['treeFilterMode'],\n): string {\n const base = formatTranscriptTreeOpenedHint(keybindings);\n const fold = formatKeyIds(keybindings, 'app.tree.foldOrUp', { capitalize: true });\n const unfold = formatKeyIds(keybindings, 'app.tree.unfoldOrDown', { capitalize: true });\n const editLabel = formatKeyIds(keybindings, 'app.tree.editLabel', { capitalize: true });\n const cycle = formatKeyIds(keybindings, 'app.tree.filter.cycleForward', { capitalize: true });\n const filter = filterMode === 'default' ? '' : ` [${filterMode}]`;\n return `${base}${filter} · ${fold}/${unfold} fold · ${editLabel} label · ${cycle} filter`;\n}\n\nconst TRANSCRIPT_TREE_HELP_ITEMS: Array<{\n keys: Keybinding[];\n label: string;\n labelFirst?: boolean;\n}> = [\n { keys: ['tui.select.up', 'tui.select.down'], label: 'move' },\n { keys: ['tui.editor.cursorLeft', 'tui.editor.cursorRight'], label: 'page' },\n { keys: ['app.tree.foldOrUp', 'app.tree.unfoldOrDown'], label: 'branch' },\n { keys: ['app.tree.editLabel'], label: 'label' },\n { keys: ['app.tree.toggleLabelTimestamp'], label: 'label time' },\n {\n keys: [\n 'app.tree.filter.default',\n 'app.tree.filter.noTools',\n 'app.tree.filter.userOnly',\n 'app.tree.filter.labeledOnly',\n 'app.tree.filter.all',\n ],\n label: 'filters',\n labelFirst: true,\n },\n {\n keys: ['app.tree.filter.cycleForward', 'app.tree.filter.cycleBackward'],\n label: 'cycle',\n labelFirst: true,\n },\n];\n\nexport function formatTranscriptTreeHelpLines(\n keybindings: KeybindingsManager,\n width: number,\n): string[] {\n const availableWidth = Math.max(1, width);\n const items = TRANSCRIPT_TREE_HELP_ITEMS.map(({ keys, label, labelFirst }) => {\n const keyText = formatTranscriptTreeHelpKeys(keybindings, keys);\n if (!keyText) return label;\n return labelFirst ? `${label} ${keyText}` : `${keyText} ${label}`;\n });\n const indent = ' ';\n const separator = ' · ';\n const lines: string[] = [];\n let current = '';\n\n for (const item of items) {\n const indentedItem = `${indent}${item}`;\n const candidate = current ? `${current}${separator}${item}` : indentedItem;\n if (!current || visibleWidth(candidate) <= availableWidth) {\n current = candidate;\n continue;\n }\n lines.push(truncateToWidth(current, availableWidth, ''));\n current = visibleWidth(indentedItem) <= availableWidth ? indentedItem : item;\n }\n\n if (current) {\n lines.push(truncateToWidth(current, availableWidth, ''));\n }\n return lines;\n}\n\nfunction formatTranscriptTreeHelpKeys(\n keybindings: KeybindingsManager,\n ids: Keybinding[],\n): string {\n const keys = ids.map((id) => keybindings.getKeys(id)[0]).filter((key) => key !== undefined);\n if (keys.length === 0) return '';\n return formatTranscriptTreeHelpKeyText(compactTranscriptTreeHelpKeys(keys.map(String)));\n}\n\nfunction compactTranscriptTreeHelpKeys(keys: string[]): string {\n if (keys.length === 1) return keys[0] ?? '';\n const parts = keys.map((key) => {\n const separatorIndex = key.lastIndexOf('+');\n return separatorIndex === -1\n ? { prefix: '', suffix: key }\n : { prefix: key.slice(0, separatorIndex + 1), suffix: key.slice(separatorIndex + 1) };\n });\n const prefix = parts[0]?.prefix ?? '';\n return prefix && parts.every((part) => part.prefix === prefix)\n ? `${prefix}${parts.map((part) => part.suffix).join('/')}`\n : keys.join('/');\n}\n\nfunction formatTranscriptTreeHelpKeyText(key: string): string {\n return formatKeyText(key, { capitalize: true })\n .replace(/\\bpageUp\\b/gi, 'pgup')\n .replace(/\\bpageDown\\b/gi, 'pgdn')\n .replace(/\\bup\\b/gi, '↑')\n .replace(/\\bdown\\b/gi, '↓')\n .replace(/\\bleft\\b/gi, '←')\n .replace(/\\bright\\b/gi, '→');\n}\n\nexport function formatUserMessageForkOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Fork from message (${nav} · type to filter · ${confirm} fork · ${cancel} close)`;\n}\n\nexport function defaultTranscriptForkKey(currentSessionKey: string, entryId: string): string {\n const suffix = randomUUID().slice(0, 8);\n const cleanEntry = entryId.replace(/[^a-z0-9_.-]+/gi, '-');\n return `${currentSessionKey}:fork:${cleanEntry}-${suffix}`;\n}\n\nfunction formatLabelTimestamp(timestamp: string, now = new Date()): string {\n const date = new Date(timestamp);\n if (Number.isNaN(date.getTime())) return '';\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const time = `${hours}:${minutes}`;\n if (\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate()\n ) {\n return time;\n }\n const month = date.getMonth() + 1;\n const day = date.getDate();\n if (date.getFullYear() === now.getFullYear()) {\n return `${month}/${day} ${time}`;\n }\n const year = date.getFullYear().toString().slice(-2);\n return `${year}/${month}/${day} ${time}`;\n}\n\nfunction transcriptTreeLabel(\n entry: TuiTranscriptTreeEntry,\n options: { showLabelTimestamps?: boolean; prefix?: string } = {},\n): string {\n const marker = options.prefix ?? (entry.depth === 0 ? '- ' : ' └─ ');\n const activeMarker = entry.isOnActivePath || entry.isCurrentLeaf ? '• ' : '';\n const turn = entry.turn > 0 ? `#${entry.turn} ` : '';\n const labelTime =\n options.showLabelTimestamps && entry.labelTimestamp\n ? `${formatLabelTimestamp(entry.labelTimestamp)} `\n : '';\n const userLabel = entry.userLabel ? `[${entry.userLabel}] ${labelTime}` : '';\n return `${marker}${activeMarker}${turn}${userLabel}${formatTuiTranscriptTreeEntryDisplayText(entry)}`;\n}\n\nexport function transcriptTreeSelectItems(\n entries: TuiTranscriptTreeEntry[],\n options: {\n showLabelTimestamps?: boolean;\n foldedIds?: ReadonlySet<string>;\n foldableIds?: ReadonlySet<string>;\n allEntries?: TuiTranscriptTreeEntry[];\n } = {},\n): SelectItem[] {\n const prefixes = transcriptTreePrefixes(entries, options.allEntries ?? entries);\n return entries.map((entry) => {\n const displayText = formatTuiTranscriptTreeEntryDisplayText(entry);\n return {\n value: entry.id,\n label: `${formatTranscriptFoldMarker(entry.id, options)}${transcriptTreeLabel(entry, {\n ...options,\n prefix: prefixes.get(entry.id),\n })}`,\n description: entry.createdAt ?? entry.id,\n searchText: [\n entry.id,\n entry.parentId ?? '',\n entry.label,\n displayText,\n entry.userLabel ?? '',\n entry.labelTimestamp ?? '',\n entry.isOnActivePath || entry.isCurrentLeaf ? 'active current' : '',\n entry.role ?? '',\n entry.preview ?? '',\n entry.createdAt ?? '',\n ].join(' '),\n };\n });\n}\n\nfunction transcriptTreePrefixes(\n entries: TuiTranscriptTreeEntry[],\n allEntries: TuiTranscriptTreeEntry[] = entries,\n): Map<string, string> {\n const byId = new Map(allEntries.map((entry) => [entry.id, entry]));\n const visibleIds = new Set(entries.map((entry) => entry.id));\n const parentByEntryId = new Map<string, string | null>();\n const childrenByParentId = new Map<string | null, string[]>();\n\n const nearestVisibleParent = (entry: TuiTranscriptTreeEntry, index: number): string | null => {\n let parentId = entry.parentId;\n while (parentId) {\n if (visibleIds.has(parentId)) return parentId;\n parentId = byId.get(parentId)?.parentId;\n }\n if (entry.depth > 0) {\n for (let i = index - 1; i >= 0; i -= 1) {\n const candidate = entries[i];\n if (candidate && candidate.depth < entry.depth) return candidate.id;\n }\n }\n return null;\n };\n\n for (const [index, entry] of entries.entries()) {\n const parentId = nearestVisibleParent(entry, index);\n parentByEntryId.set(entry.id, parentId);\n const children = childrenByParentId.get(parentId) ?? [];\n children.push(entry.id);\n childrenByParentId.set(parentId, children);\n }\n\n const prefixes = new Map<string, string>();\n for (const entry of entries) {\n const visibleParentId = parentByEntryId.get(entry.id) ?? null;\n if (visibleParentId === null) {\n prefixes.set(entry.id, '- ');\n continue;\n }\n\n const ancestors: string[] = [];\n let parentId: string | null | undefined = visibleParentId;\n while (parentId) {\n ancestors.unshift(parentId);\n parentId = parentByEntryId.get(parentId) ?? null;\n }\n\n let prefix = ' ';\n for (const ancestor of ancestors.slice(1)) {\n prefix += hasFollowingSibling(ancestor, parentByEntryId.get(ancestor) ?? null, childrenByParentId)\n ? '│ '\n : ' ';\n }\n prefix += hasFollowingSibling(entry.id, visibleParentId, childrenByParentId) ? '├─ ' : '└─ ';\n prefixes.set(entry.id, prefix);\n }\n return prefixes;\n}\n\nfunction hasFollowingSibling(\n entryId: string,\n parentId: string | null,\n childrenByParentId: Map<string | null, string[]>,\n): boolean {\n const siblings = childrenByParentId.get(parentId) ?? [];\n return siblings.indexOf(entryId) < siblings.length - 1;\n}\n\nfunction formatTranscriptFoldMarker(\n entryId: string,\n options: { foldedIds?: ReadonlySet<string>; foldableIds?: ReadonlySet<string> },\n): string {\n if (options.foldedIds?.has(entryId)) return '⊞ ';\n if (options.foldableIds?.has(entryId)) return '⊟ ';\n return '';\n}\n\nconst TREE_FILTER_MODES: TreeFilterMode[] = ['default', 'no-tools', 'user-only', 'labeled-only', 'all'];\n\nfunction transcriptTreeStatusLabels(mode: TreeFilterMode, showLabelTimestamps: boolean): string {\n const labels: string[] = [];\n if (mode === 'no-tools') labels.push('[no-tools]');\n if (mode === 'user-only') labels.push('[user]');\n if (mode === 'labeled-only') labels.push('[labeled]');\n if (mode === 'all') labels.push('[all]');\n if (showLabelTimestamps) labels.push('[+label time]');\n return labels.length > 0 ? ` ${labels.join(' ')}` : '';\n}\n\nfunction filterTranscriptTreeSelectItems(items: SelectItem[], query: string): SelectItem[] {\n const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return items;\n return items.filter((item) => {\n const searchText = (item as SelectItem & { searchText?: string }).searchText ?? '';\n const text = [item.label, item.description ?? '', searchText].join(' ').toLowerCase();\n return tokens.every((token) => text.includes(token));\n });\n}\n\nexport class TranscriptTreeSelectList implements Component, Focusable {\n private readonly list: SearchableSelectList;\n private filterMode: TreeFilterMode;\n private labelInput: Input | null = null;\n private labelEntry: TuiTranscriptTreeEntry | null = null;\n private showLabelTimestamps = false;\n private readonly foldedEntryIds = new Set<string>();\n private lastSelectedEntryId: string | undefined;\n\n onSelect?: (item: SelectItem) => void;\n onCancel?: () => void;\n onFilterChange?: (mode: TreeFilterMode) => void;\n onLabelSubmit?: (entry: TuiTranscriptTreeEntry, label: string | undefined) => void;\n\n constructor(\n private readonly entries: TuiTranscriptTreeEntry[],\n initialFilterMode: TreeFilterMode,\n private readonly keybindings: KeybindingsManager,\n private readonly maxVisible: number,\n ) {\n this.filterMode = initialFilterMode;\n this.list = new SearchableSelectList(\n transcriptTreeSelectItems(filterTuiTranscriptTreeEntries(entries, this.filterMode), {\n showLabelTimestamps: this.showLabelTimestamps,\n }),\n maxVisible,\n searchableSelectListTheme,\n {\n searchPromptText: 'Type to search: ',\n filterItems: filterTranscriptTreeSelectItems,\n },\n );\n this.list.onSelect = (item) => this.onSelect?.(item);\n this.list.onCancel = () => this.onCancel?.();\n this.refreshItems({ selectedId: this.initialSelectedEntryId() });\n }\n\n get focused(): boolean {\n return this.labelInput?.focused ?? this.list.focused;\n }\n\n set focused(value: boolean) {\n if (this.labelInput) {\n this.labelInput.focused = value;\n return;\n }\n this.list.focused = value;\n }\n\n getFilterMode(): TreeFilterMode {\n return this.filterMode;\n }\n\n private initialSelectedEntryId(): string | undefined {\n return (\n this.entries.find((entry) => entry.isCurrentLeaf)?.id ??\n [...this.entries].reverse().find((entry) => entry.isOnActivePath)?.id\n );\n }\n\n private filteredEntries(mode: TreeFilterMode): TuiTranscriptTreeEntry[] {\n const baseEntries = filterTuiTranscriptTreeEntries(this.entries, mode);\n if (this.foldedEntryIds.size === 0) return baseEntries;\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n return baseEntries.filter((entry) => {\n let parentId = entry.parentId;\n while (parentId) {\n if (this.foldedEntryIds.has(parentId)) return false;\n parentId = byId.get(parentId)?.parentId;\n }\n return true;\n });\n }\n\n private visibleUnfoldedEntries(mode = this.filterMode): TuiTranscriptTreeEntry[] {\n return filterTuiTranscriptTreeEntries(this.entries, mode);\n }\n\n private hasVisibleChild(entryId: string): boolean {\n const maps = this.visibleTreeMaps(this.visibleUnfoldedEntries());\n return this.isFoldableEntryId(entryId, maps);\n }\n\n private isFoldableEntryId(\n entryId: string,\n maps: {\n childrenByParentId: Map<string | null, string[]>;\n parentByEntryId: Map<string, string | null>;\n },\n ): boolean {\n const children = maps.childrenByParentId.get(entryId);\n if (!children || children.length === 0) return false;\n const parentId = maps.parentByEntryId.get(entryId);\n if (!parentId) return true;\n return (maps.childrenByParentId.get(parentId)?.length ?? 0) > 1;\n }\n\n private nearestVisibleEntryId(\n entryId: string | undefined,\n visibleEntries: TuiTranscriptTreeEntry[],\n ): string | undefined {\n if (!entryId) return undefined;\n const visibleIds = new Set(visibleEntries.map((entry) => entry.id));\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n let currentId: string | undefined = entryId;\n while (currentId) {\n if (visibleIds.has(currentId)) return currentId;\n currentId = byId.get(currentId)?.parentId;\n }\n return undefined;\n }\n\n private visibleTreeMaps(visibleEntries: TuiTranscriptTreeEntry[]): {\n childrenByParentId: Map<string | null, string[]>;\n parentByEntryId: Map<string, string | null>;\n indexByEntryId: Map<string, number>;\n } {\n const visibleIds = new Set(visibleEntries.map((entry) => entry.id));\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n const childrenByParentId = new Map<string | null, string[]>();\n const parentByEntryId = new Map<string, string | null>();\n const indexByEntryId = new Map<string, number>();\n\n childrenByParentId.set(null, []);\n const nearestVisibleParent = (entry: TuiTranscriptTreeEntry): string | null => {\n let parentId = entry.parentId;\n while (parentId) {\n if (visibleIds.has(parentId)) return parentId;\n parentId = byId.get(parentId)?.parentId;\n }\n return null;\n };\n\n visibleEntries.forEach((entry, index) => {\n const parentId = nearestVisibleParent(entry);\n parentByEntryId.set(entry.id, parentId);\n indexByEntryId.set(entry.id, index);\n const siblings = childrenByParentId.get(parentId) ?? [];\n siblings.push(entry.id);\n childrenByParentId.set(parentId, siblings);\n });\n\n return { childrenByParentId, parentByEntryId, indexByEntryId };\n }\n\n private moveToBranchSegment(direction: 'up' | 'down'): void {\n const selectedId = this.list.getSelectedItem()?.value;\n if (!selectedId) return;\n const visibleEntries = this.filteredEntries(this.filterMode);\n const maps = this.visibleTreeMaps(visibleEntries);\n let currentId = selectedId;\n\n if (direction === 'down') {\n while (true) {\n const children = maps.childrenByParentId.get(currentId) ?? [];\n if (children.length === 0) {\n this.list.setSelectedValue(currentId);\n return;\n }\n if (children.length > 1) {\n this.list.setSelectedValue(children[0]!);\n return;\n }\n currentId = children[0]!;\n }\n }\n\n while (true) {\n const parentId = maps.parentByEntryId.get(currentId) ?? null;\n if (parentId === null) {\n this.list.setSelectedValue(currentId);\n return;\n }\n const children = maps.childrenByParentId.get(parentId) ?? [];\n if (children.length > 1) {\n const segmentIndex = maps.indexByEntryId.get(currentId);\n const selectedIndex = maps.indexByEntryId.get(selectedId);\n if (segmentIndex !== undefined && selectedIndex !== undefined && segmentIndex < selectedIndex) {\n this.list.setSelectedValue(currentId);\n return;\n }\n }\n currentId = parentId;\n }\n }\n\n private refreshItems(options: { mode?: TreeFilterMode; selectedId?: string } = {}): void {\n const mode = options.mode ?? this.filterMode;\n const selectedId = options.selectedId ?? this.list.getSelectedItem()?.value ?? this.lastSelectedEntryId;\n const visibleEntries = this.filteredEntries(mode);\n const unfoldedVisibleEntries = this.visibleUnfoldedEntries(mode);\n const unfoldedMaps = this.visibleTreeMaps(unfoldedVisibleEntries);\n const foldableIds = new Set(\n unfoldedVisibleEntries\n .filter((entry) => this.isFoldableEntryId(entry.id, unfoldedMaps))\n .map((entry) => entry.id),\n );\n this.list.setItems(\n transcriptTreeSelectItems(visibleEntries, {\n showLabelTimestamps: this.showLabelTimestamps,\n foldedIds: this.foldedEntryIds,\n foldableIds,\n allEntries: this.entries,\n }),\n );\n const targetId = this.nearestVisibleEntryId(selectedId, visibleEntries);\n if (targetId) {\n this.list.setSelectedValue(targetId);\n }\n this.rememberSelectedEntry();\n }\n\n private setFilterMode(mode: TreeFilterMode): void {\n const selectedId = this.list.getSelectedItem()?.value;\n this.filterMode = mode;\n this.foldedEntryIds.clear();\n this.refreshItems({ mode, selectedId });\n this.onFilterChange?.(mode);\n }\n\n private foldSelectedEntry(): boolean {\n const selectedId = this.list.getSelectedItem()?.value;\n if (!selectedId || !this.hasVisibleChild(selectedId) || this.foldedEntryIds.has(selectedId)) {\n return false;\n }\n this.foldedEntryIds.add(selectedId);\n this.refreshItems({ selectedId });\n return true;\n }\n\n private unfoldSelectedEntry(): boolean {\n const selectedId = this.list.getSelectedItem()?.value;\n if (!selectedId || !this.foldedEntryIds.delete(selectedId)) {\n return false;\n }\n this.refreshItems({ selectedId });\n return true;\n }\n\n private clearSearchAndFolds(): boolean {\n if (this.list.getSearchQuery().length === 0) return false;\n const selectedId = this.list.getSelectedItem()?.value ?? this.lastSelectedEntryId;\n this.foldedEntryIds.clear();\n this.refreshItems({ selectedId });\n this.list.clearSearch({ selectedValue: selectedId });\n this.rememberSelectedEntry();\n return true;\n }\n\n private pageSelection(direction: 'up' | 'down'): void {\n const visibleEntries = this.filteredEntries(this.filterMode);\n const selectedId = this.list.getSelectedItem()?.value;\n const selectedIndex = selectedId\n ? visibleEntries.findIndex((entry) => entry.id === selectedId)\n : 0;\n const currentIndex = selectedIndex >= 0 ? selectedIndex : 0;\n const delta = direction === 'up' ? -this.maxVisible : this.maxVisible;\n const nextIndex = Math.max(0, Math.min(visibleEntries.length - 1, currentIndex + delta));\n const nextEntry = visibleEntries[nextIndex];\n if (nextEntry) {\n this.list.setSelectedValue(nextEntry.id);\n }\n }\n\n updateEntryLabel(entryId: string, label: string | undefined): void {\n const entry = this.entries.find((candidate) => candidate.id === entryId);\n if (!entry) return;\n if (label?.trim()) {\n entry.userLabel = label.trim();\n entry.labelTimestamp = new Date().toISOString();\n } else {\n delete entry.userLabel;\n delete entry.labelTimestamp;\n }\n this.refreshItems();\n }\n\n private toggleFilterMode(mode: TreeFilterMode): void {\n this.setFilterMode(this.filterMode === mode ? 'default' : mode);\n }\n\n private cycleFilter(delta: 1 | -1): void {\n const idx = TREE_FILTER_MODES.indexOf(this.filterMode);\n const next = TREE_FILTER_MODES[(idx + delta + TREE_FILTER_MODES.length) % TREE_FILTER_MODES.length]!;\n this.setFilterMode(next);\n }\n\n private rememberSelectedEntry(): void {\n const selectedId = this.list.getSelectedItem()?.value;\n if (selectedId) {\n this.lastSelectedEntryId = selectedId;\n }\n }\n\n handleInput(keyData: string): void {\n if (this.labelInput) {\n if (this.keybindings.matches(keyData, 'tui.select.confirm')) {\n const value = this.labelInput.getValue().trim();\n const entry = this.labelEntry;\n this.labelInput = null;\n this.labelEntry = null;\n if (entry) {\n this.onLabelSubmit?.(entry, value || undefined);\n }\n return;\n }\n if (this.keybindings.matches(keyData, 'tui.select.cancel')) {\n this.labelInput = null;\n this.labelEntry = null;\n return;\n }\n this.labelInput.handleInput(keyData);\n return;\n }\n\n if (this.keybindings.matches(keyData, 'app.tree.filter.default')) {\n this.setFilterMode('default');\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.noTools')) {\n this.toggleFilterMode('no-tools');\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.userOnly')) {\n this.toggleFilterMode('user-only');\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.labeledOnly')) {\n this.toggleFilterMode('labeled-only');\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.all')) {\n this.toggleFilterMode('all');\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.cycleForward')) {\n this.cycleFilter(1);\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.filter.cycleBackward')) {\n this.cycleFilter(-1);\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.foldOrUp')) {\n if (!this.foldSelectedEntry()) {\n this.moveToBranchSegment('up');\n }\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.unfoldOrDown')) {\n if (!this.unfoldSelectedEntry()) {\n this.moveToBranchSegment('down');\n }\n return;\n }\n if (\n this.keybindings.matches(keyData, 'tui.editor.cursorLeft') ||\n this.keybindings.matches(keyData, 'tui.select.pageUp')\n ) {\n this.pageSelection('up');\n return;\n }\n if (\n this.keybindings.matches(keyData, 'tui.editor.cursorRight') ||\n this.keybindings.matches(keyData, 'tui.select.pageDown')\n ) {\n this.pageSelection('down');\n return;\n }\n if (this.keybindings.matches(keyData, 'tui.select.cancel')) {\n if (this.clearSearchAndFolds()) return;\n this.onCancel?.();\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.editLabel')) {\n const item = this.list.getSelectedItem();\n const entry = item ? this.entries.find((candidate) => candidate.id === item.value) : undefined;\n if (entry) {\n this.labelEntry = entry;\n this.labelInput = new Input();\n if (entry.userLabel) {\n this.labelInput.setValue(entry.userLabel);\n }\n this.labelInput.focused = this.list.focused;\n }\n return;\n }\n if (this.keybindings.matches(keyData, 'app.tree.toggleLabelTimestamp')) {\n this.showLabelTimestamps = !this.showLabelTimestamps;\n this.refreshItems();\n return;\n }\n const queryBefore = this.list.getSearchQuery();\n const selectedId = this.list.getSelectedItem()?.value ?? this.lastSelectedEntryId;\n if (this.list.getSelectedItem()?.value) {\n this.lastSelectedEntryId = this.list.getSelectedItem()?.value;\n }\n this.list.handleInput(keyData);\n if (this.list.getSearchQuery() !== queryBefore) {\n if (this.foldedEntryIds.size > 0) {\n this.foldedEntryIds.clear();\n this.refreshItems({ selectedId });\n return;\n }\n if (selectedId) {\n this.list.setSelectedValue(selectedId);\n }\n this.rememberSelectedEntry();\n }\n }\n\n render(width: number): string[] {\n const stats = this.list.getSelectionStats();\n const statusText = theme.dim(\n `(${stats.selected}/${stats.total})${transcriptTreeStatusLabels(this.filterMode, this.showLabelTimestamps)}`,\n );\n if (this.labelInput) {\n const target = this.labelEntry?.userLabel ?? this.labelEntry?.label ?? this.labelEntry?.id ?? 'entry';\n const confirm = formatKeyIds(this.keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(this.keybindings, 'tui.select.cancel', { capitalize: true });\n return [\n statusText,\n theme.dim(`label ${target} (empty to clear)`),\n ...this.labelInput.render(Math.max(1, width)),\n theme.dim(`${confirm} save · ${cancel} cancel`),\n ];\n }\n const listLines = this.list.render(width);\n const renderedListLines =\n stats.total === 0\n ? listLines.map((line) =>\n line.includes('No matches') ? searchableSelectListTheme.noMatch(' No entries found') : line,\n )\n : listLines;\n return [\n statusText,\n ...renderedListLines,\n '',\n ...formatTranscriptTreeHelpLines(this.keybindings, width).map((line) => theme.dim(line)),\n ];\n }\n\n invalidate(): void {\n this.list.invalidate();\n }\n\n getSelectedItem(): SelectItem | null {\n return this.list.getSelectedItem();\n }\n}\n\nexport function userMessageForkSelectItems(entries: TuiTranscriptTreeEntry[]): SelectItem[] {\n return entries\n .filter((entry) => entry.role === 'user')\n .map((entry, index, all) => ({\n value: entry.id,\n label: entry.preview?.trim() || `User message ${index + 1}`,\n description: `Message ${index + 1} of ${all.length}`,\n searchText: [entry.id, entry.preview ?? '', entry.contentText ?? '', entry.createdAt ?? ''].join(' '),\n }));\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type TranscriptStoredRow } from '../session/session-context-for-llm.js';
2
+ import type { TuiTranscriptTreeEntry } from './tui-backend.js';
3
+ import type { TreeFilterMode } from './tui-settings.js';
4
+ export declare function transcriptTreeEntryIdToRowNumber(entryId: string): number | null;
5
+ export declare function buildTuiTranscriptTree(rows: TranscriptStoredRow[]): TuiTranscriptTreeEntry[];
6
+ export declare function filterTuiTranscriptTreeEntries(entries: TuiTranscriptTreeEntry[], mode: TreeFilterMode): TuiTranscriptTreeEntry[];
7
+ export declare function formatTuiTranscriptTreeEntryDisplayText(entry: TuiTranscriptTreeEntry): string;
@@ -0,0 +1,316 @@
1
+ import { isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry } from "../session/session-context-for-llm.js";
2
+ //#region src/tui/tui-transcript-tree.ts
3
+ const TRANSCRIPT_ROW_ID_RE = /^row-(\d+)$/;
4
+ function transcriptTreeEntryIdToRowNumber(entryId) {
5
+ const match = TRANSCRIPT_ROW_ID_RE.exec(entryId.trim());
6
+ if (!match) return null;
7
+ const row = Number.parseInt(match[1], 10);
8
+ return Number.isFinite(row) && row > 0 ? row : null;
9
+ }
10
+ function asRecord(value) {
11
+ return value && typeof value === "object" ? value : null;
12
+ }
13
+ function stringValue(value) {
14
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
15
+ }
16
+ function truncateText(text, max = 96) {
17
+ const normalized = text.replace(/\s+/g, " ").trim();
18
+ if (normalized.length <= max) return normalized;
19
+ return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
20
+ }
21
+ function contentPreview(content) {
22
+ return truncateText(contentText(content));
23
+ }
24
+ function contentText(content) {
25
+ if (typeof content === "string") return content;
26
+ if (!Array.isArray(content)) return "";
27
+ const parts = [];
28
+ for (const block of content) {
29
+ if (typeof block === "string") {
30
+ parts.push(block);
31
+ continue;
32
+ }
33
+ const obj = asRecord(block);
34
+ if (!obj) continue;
35
+ const type = stringValue(obj.type);
36
+ if (type === "text") parts.push(stringValue(obj.text) ?? "");
37
+ else if (type === "toolCall") parts.push(formatToolCallPreview(stringValue(obj.name) ?? stringValue(obj.toolName) ?? "tool", asRecord(obj.arguments) ?? asRecord(obj.args) ?? {}));
38
+ else if (type === "image" || type === "image_url") parts.push("[image]");
39
+ else if (type) parts.push(`[${type}]`);
40
+ }
41
+ return parts.filter(Boolean).join(" ");
42
+ }
43
+ function formatToolCallPreview(name, args) {
44
+ const path = stringValue(args.path) ?? stringValue(args.file_path) ?? "";
45
+ if (name === "read" || name === "read_file") {
46
+ const offset = typeof args.offset === "number" ? args.offset : void 0;
47
+ const limit = typeof args.limit === "number" ? args.limit : void 0;
48
+ let display = path;
49
+ if (offset !== void 0 || limit !== void 0) {
50
+ const start = offset ?? 1;
51
+ const end = limit !== void 0 ? start + limit - 1 : void 0;
52
+ display += `:${start}${end !== void 0 ? `-${end}` : ""}`;
53
+ }
54
+ return `[read: ${display || "file"}]`;
55
+ }
56
+ if (name === "write" || name === "write_file") return `[write: ${path || "file"}]`;
57
+ if (name === "edit") return `[edit: ${path || "file"}]`;
58
+ if (name === "bash" || name === "shell") return `[bash: ${truncateText((stringValue(args.command) ?? "").replace(/[\n\t]/g, " ").trim(), 53)}]`;
59
+ if (name === "grep") return `[grep: /${stringValue(args.pattern) ?? ""}/ in ${path || "."}]`;
60
+ if (name === "find") return `[find: ${stringValue(args.pattern) ?? ""} in ${path || "."}]`;
61
+ if (name === "ls") return `[ls: ${path || "."}]`;
62
+ const argsText = JSON.stringify(args);
63
+ return `[${name}: ${argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText}]`;
64
+ }
65
+ function collectToolCallDisplays(content) {
66
+ if (!Array.isArray(content)) return [];
67
+ const calls = [];
68
+ for (const block of content) {
69
+ const obj = asRecord(block);
70
+ if (!obj || stringValue(obj.type) !== "toolCall") continue;
71
+ const id = stringValue(obj.id) ?? stringValue(obj.toolCallId) ?? stringValue(obj.tool_call_id) ?? stringValue(obj.tool_call_id$);
72
+ if (!id) continue;
73
+ const name = stringValue(obj.name) ?? stringValue(obj.toolName) ?? "tool";
74
+ calls.push({
75
+ id,
76
+ name,
77
+ preview: formatToolCallPreview(name, asRecord(obj.arguments) ?? asRecord(obj.args) ?? {})
78
+ });
79
+ }
80
+ return calls;
81
+ }
82
+ function rowToolCallId(row) {
83
+ const record = asRecord(row);
84
+ return stringValue(record?.toolCallId) ?? stringValue(record?.tool_call_id) ?? stringValue(record?.tool_call_id$);
85
+ }
86
+ function rowCreatedAt(row) {
87
+ const record = asRecord(row);
88
+ return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);
89
+ }
90
+ function messageLabel(row) {
91
+ const role = stringValue(row.role) ?? "message";
92
+ if (role === "tool" || role === "toolResult") return `tool:${stringValue(row.toolName) ?? "result"}`;
93
+ return role;
94
+ }
95
+ function rowPreview(row) {
96
+ if (isTranscriptContextEntry(row)) return truncateText(row.text ?? JSON.stringify(row.data ?? {}));
97
+ if (isTranscriptLabelEntry(row)) return truncateText(row.label ? `label: ${row.label}` : "label cleared");
98
+ if (isTranscriptMetadataEntry(row)) {
99
+ if (row.type === "model_change") return truncateText([row.provider, row.modelId].filter(Boolean).join("/") || "model changed");
100
+ if (row.type === "thinking_level_change") return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : "thinking changed");
101
+ return truncateText(row.name ? `title: ${row.name}` : "title cleared");
102
+ }
103
+ if (isTranscriptBashExecutionEntry(row)) return truncateText(row.command ?? "bash");
104
+ if (isTranscriptCustomMessageEntry(row)) {
105
+ const record = asRecord(row);
106
+ const customType = stringValue(record?.customType) ?? "custom";
107
+ const preview = contentPreview(record?.content);
108
+ return truncateText(preview ? `${customType}: ${preview}` : customType);
109
+ }
110
+ if (isTranscriptSummaryMessageEntry(row)) {
111
+ if (row.role === "branchSummary") return truncateText(row.summary ?? "branch summary");
112
+ return truncateText(row.summary ?? "compaction checkpoint");
113
+ }
114
+ const record = asRecord(row);
115
+ if (record?.type === "compaction") return truncateText(stringValue(record.summary) ?? "compaction checkpoint");
116
+ const preview = contentPreview(record?.content);
117
+ if (record?.role === "assistant" && !preview) {
118
+ if (record.stopReason === "aborted") return "(aborted)";
119
+ const errorMessage = stringValue(record.errorMessage);
120
+ if (errorMessage) return truncateText(errorMessage, 80);
121
+ }
122
+ return preview;
123
+ }
124
+ function rowContentText(row) {
125
+ if (isTranscriptContextEntry(row)) return row.text;
126
+ if (isTranscriptLabelEntry(row)) return row.label;
127
+ if (isTranscriptMetadataEntry(row)) {
128
+ if (row.type === "model_change") return [row.provider, row.modelId].filter(Boolean).join("/") || void 0;
129
+ if (row.type === "thinking_level_change") return row.thinkingLevel;
130
+ return row.name;
131
+ }
132
+ if (isTranscriptBashExecutionEntry(row)) return row.command;
133
+ if (isTranscriptCustomMessageEntry(row)) {
134
+ const record = asRecord(row);
135
+ return contentText(record?.content).trim() || stringValue(record?.customType);
136
+ }
137
+ if (isTranscriptSummaryMessageEntry(row)) return row.summary;
138
+ const record = asRecord(row);
139
+ if (record?.type === "compaction") return stringValue(record.summary);
140
+ const text = contentText(record?.content).trim();
141
+ return text ? text : void 0;
142
+ }
143
+ function buildTuiTranscriptTree(rows) {
144
+ const entries = [];
145
+ const byOriginalId = /* @__PURE__ */ new Map();
146
+ const toolCallsById = /* @__PURE__ */ new Map();
147
+ const labelChanges = [];
148
+ let currentTurnId;
149
+ let turn = 0;
150
+ rows.forEach((row, index) => {
151
+ const id = `row-${index + 1}`;
152
+ const record = asRecord(row);
153
+ let parentId;
154
+ let depth = 0;
155
+ let label = "entry";
156
+ let role;
157
+ let toolCallPreview;
158
+ if (isTranscriptContextEntry(row)) {
159
+ label = "context";
160
+ parentId = currentTurnId;
161
+ depth = currentTurnId ? 1 : 0;
162
+ } else if (asRecord(row)?.type === "compaction") {
163
+ label = "compaction";
164
+ parentId = currentTurnId;
165
+ depth = currentTurnId ? 1 : 0;
166
+ } else if (isTranscriptLabelEntry(row)) {
167
+ label = row.label ? `label:${row.label}` : "label:cleared";
168
+ parentId = currentTurnId;
169
+ depth = currentTurnId ? 1 : 0;
170
+ if (row.targetId) labelChanges.push({
171
+ targetId: row.targetId,
172
+ label: row.label,
173
+ timestamp: typeof row.timestamp === "string" ? row.timestamp : void 0
174
+ });
175
+ } else if (isTranscriptMetadataEntry(row)) {
176
+ label = row.type;
177
+ parentId = currentTurnId;
178
+ depth = currentTurnId ? 1 : 0;
179
+ } else if (isTranscriptBashExecutionEntry(row)) {
180
+ label = "bashExecution";
181
+ parentId = currentTurnId;
182
+ depth = currentTurnId ? 1 : 0;
183
+ } else if (isTranscriptCustomMessageEntry(row)) {
184
+ label = `custom:${stringValue(record?.customType) ?? "message"}`;
185
+ parentId = currentTurnId;
186
+ depth = currentTurnId ? 1 : 0;
187
+ } else if (isTranscriptSummaryMessageEntry(row)) {
188
+ label = row.role === "branchSummary" ? "branch_summary" : "compaction";
189
+ parentId = currentTurnId;
190
+ depth = currentTurnId ? 1 : 0;
191
+ } else {
192
+ const message = row;
193
+ role = stringValue(message.role);
194
+ label = messageLabel(message);
195
+ if (role === "tool" || role === "toolResult") {
196
+ const toolCallId = rowToolCallId(row);
197
+ const toolCall = toolCallId ? toolCallsById.get(toolCallId) : void 0;
198
+ if (toolCall) {
199
+ label = `tool:${toolCall.name}`;
200
+ toolCallPreview = toolCall.preview;
201
+ }
202
+ }
203
+ if (role === "user" || !currentTurnId) {
204
+ turn += 1;
205
+ currentTurnId = id;
206
+ depth = 0;
207
+ } else {
208
+ parentId = currentTurnId;
209
+ depth = 1;
210
+ }
211
+ }
212
+ const entry = {
213
+ id,
214
+ depth,
215
+ label,
216
+ turn,
217
+ preview: rowPreview(row),
218
+ contentText: rowContentText(row),
219
+ createdAt: rowCreatedAt(row)
220
+ };
221
+ if (parentId) entry.parentId = parentId;
222
+ if (role) entry.role = role;
223
+ if (toolCallPreview) entry.toolCallPreview = toolCallPreview;
224
+ entries.push(entry);
225
+ byOriginalId.set(id, entry);
226
+ const originalId = stringValue(record?.id);
227
+ if (originalId) byOriginalId.set(originalId, entry);
228
+ for (const toolCall of collectToolCallDisplays(record?.content)) toolCallsById.set(toolCall.id, {
229
+ name: toolCall.name,
230
+ preview: toolCall.preview
231
+ });
232
+ });
233
+ for (const change of labelChanges) {
234
+ const target = byOriginalId.get(change.targetId);
235
+ if (!target) continue;
236
+ if (change.label?.trim()) {
237
+ target.userLabel = change.label.trim();
238
+ target.labelTimestamp = change.timestamp;
239
+ } else {
240
+ delete target.userLabel;
241
+ delete target.labelTimestamp;
242
+ }
243
+ }
244
+ markCurrentTranscriptPath(entries);
245
+ return entries;
246
+ }
247
+ function markCurrentTranscriptPath(entries) {
248
+ const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);
249
+ if (!currentLeaf) return;
250
+ const byId = new Map(entries.map((entry) => [entry.id, entry]));
251
+ currentLeaf.isCurrentLeaf = true;
252
+ let currentId = currentLeaf.id;
253
+ while (currentId) {
254
+ const entry = byId.get(currentId);
255
+ if (!entry) break;
256
+ entry.isOnActivePath = true;
257
+ currentId = entry.parentId;
258
+ }
259
+ }
260
+ function isCurrentLeafCandidate(entry) {
261
+ if (entry.label === "context") return false;
262
+ if (entry.label === "model_change") return false;
263
+ if (entry.label === "thinking_level_change") return false;
264
+ if (entry.label === "session_info") return false;
265
+ if (entry.label.startsWith("label:")) return false;
266
+ return true;
267
+ }
268
+ function filterTuiTranscriptTreeEntries(entries, mode) {
269
+ if (mode === "all") return entries;
270
+ return entries.filter((entry) => {
271
+ if (!entry.isCurrentLeaf && isEmptyAssistantTreeEntry(entry)) return false;
272
+ if (mode === "user-only") return entry.role === "user";
273
+ if (mode === "labeled-only") return Boolean(entry.userLabel);
274
+ const isTool = entry.role === "tool" || entry.role === "toolResult" || entry.label.startsWith("tool:");
275
+ const isBookkeeping = entry.label === "context" || entry.label === "model_change" || entry.label === "thinking_level_change" || entry.label === "session_info" || entry.label.startsWith("custom:") || entry.label.startsWith("label:");
276
+ if (mode === "no-tools") return !isTool && !isBookkeeping;
277
+ return !isBookkeeping;
278
+ });
279
+ }
280
+ function isEmptyAssistantTreeEntry(entry) {
281
+ if (entry.role !== "assistant") return false;
282
+ const preview = entry.preview?.trim();
283
+ if (!preview) return true;
284
+ return /^(?:\[[^\]]+\]\s*)+$/.test(preview);
285
+ }
286
+ function formatTuiTranscriptTreeEntryDisplayText(entry) {
287
+ const preview = entry.preview?.trim();
288
+ const toolCallPreview = entry.toolCallPreview?.trim();
289
+ const role = entry.role?.trim() || entry.label;
290
+ if (!preview) {
291
+ if (role === "assistant") return "assistant: (no content)";
292
+ if (role === "tool" || role === "toolResult" || entry.label.startsWith("tool:")) return `[${formatTuiTranscriptToolDisplayName(entry.label)}]`;
293
+ return entry.label;
294
+ }
295
+ if (role === "user" || role === "assistant") return `${role}: ${preview}`;
296
+ if (role === "bashExecution" || entry.label === "bashExecution") return `[bash]: ${preview}`;
297
+ if (role === "tool" || role === "toolResult" || entry.label.startsWith("tool:")) {
298
+ if (toolCallPreview) return toolCallPreview;
299
+ return `[${formatTuiTranscriptToolDisplayName(entry.label)}]`;
300
+ }
301
+ if (entry.label === "model_change") return `[model: ${preview.includes("/") ? preview.split("/").pop() ?? preview : preview}]`;
302
+ if (entry.label === "thinking_level_change") return `[${preview}]`;
303
+ if (entry.label === "session_info") return `[${preview}]`;
304
+ if (entry.label.startsWith("label:")) return `[${preview}]`;
305
+ if (entry.label === "compaction") return `[compaction: ${preview}]`;
306
+ if (entry.label === "branch_summary") return `[branch summary]: ${preview}`;
307
+ if (entry.label.startsWith("custom:")) return `[${entry.label}]${preview ? `: ${preview}` : ""}`;
308
+ return `${entry.label}: ${preview}`;
309
+ }
310
+ function formatTuiTranscriptToolDisplayName(label) {
311
+ return label.startsWith("tool:") ? label.slice(5) || "tool" : label;
312
+ }
313
+ //#endregion
314
+ export { buildTuiTranscriptTree, filterTuiTranscriptTreeEntries, formatTuiTranscriptTreeEntryDisplayText, transcriptTreeEntryIdToRowNumber };
315
+
316
+ //# sourceMappingURL=tui-transcript-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-transcript-tree.js","names":[],"sources":["../../../src/tui/tui-transcript-tree.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport {\n isTranscriptBashExecutionEntry,\n isTranscriptContextEntry,\n isTranscriptCustomMessageEntry,\n isTranscriptLabelEntry,\n isTranscriptMetadataEntry,\n isTranscriptSummaryMessageEntry,\n type TranscriptStoredRow,\n} from '../session/session-context-for-llm.js';\nimport type { TuiTranscriptTreeEntry } from './tui-backend.js';\nimport type { TreeFilterMode } from './tui-settings.js';\n\nconst TRANSCRIPT_ROW_ID_RE = /^row-(\\d+)$/;\n\nexport function transcriptTreeEntryIdToRowNumber(entryId: string): number | null {\n const match = TRANSCRIPT_ROW_ID_RE.exec(entryId.trim());\n if (!match) return null;\n const row = Number.parseInt(match[1], 10);\n return Number.isFinite(row) && row > 0 ? row : null;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction truncateText(text: string, max = 96): 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\nfunction contentPreview(content: unknown): string {\n return truncateText(contentText(content));\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n const obj = asRecord(block);\n if (!obj) continue;\n const type = stringValue(obj.type);\n if (type === 'text') {\n parts.push(stringValue(obj.text) ?? '');\n } else if (type === 'toolCall') {\n parts.push(formatToolCallPreview(\n stringValue(obj.name) ?? stringValue(obj.toolName) ?? 'tool',\n asRecord(obj.arguments) ?? asRecord(obj.args) ?? {},\n ));\n } else if (type === 'image' || type === 'image_url') {\n parts.push('[image]');\n } else if (type) {\n parts.push(`[${type}]`);\n }\n }\n return parts.filter(Boolean).join(' ');\n}\n\nfunction formatToolCallPreview(name: string, args: Record<string, unknown>): string {\n const path = stringValue(args.path) ?? stringValue(args.file_path) ?? '';\n if (name === 'read' || name === 'read_file') {\n const offset = typeof args.offset === 'number' ? args.offset : undefined;\n const limit = typeof args.limit === 'number' ? args.limit : undefined;\n let display = path;\n if (offset !== undefined || limit !== undefined) {\n const start = offset ?? 1;\n const end = limit !== undefined ? start + limit - 1 : undefined;\n display += `:${start}${end !== undefined ? `-${end}` : ''}`;\n }\n return `[read: ${display || 'file'}]`;\n }\n if (name === 'write' || name === 'write_file') return `[write: ${path || 'file'}]`;\n if (name === 'edit') return `[edit: ${path || 'file'}]`;\n if (name === 'bash' || name === 'shell') {\n const rawCommand = stringValue(args.command) ?? '';\n const command = rawCommand.replace(/[\\n\\t]/g, ' ').trim();\n return `[bash: ${truncateText(command, 53)}]`;\n }\n if (name === 'grep') {\n const pattern = stringValue(args.pattern) ?? '';\n return `[grep: /${pattern}/ in ${path || '.'}]`;\n }\n if (name === 'find') {\n const pattern = stringValue(args.pattern) ?? '';\n return `[find: ${pattern} in ${path || '.'}]`;\n }\n if (name === 'ls') return `[ls: ${path || '.'}]`;\n const argsText = JSON.stringify(args);\n const truncatedArgs = argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText;\n return `[${name}: ${truncatedArgs}]`;\n}\n\ninterface ToolCallDisplay {\n name: string;\n preview: string;\n}\n\nfunction collectToolCallDisplays(content: unknown): Array<{ id: string } & ToolCallDisplay> {\n if (!Array.isArray(content)) return [];\n const calls: Array<{ id: string } & ToolCallDisplay> = [];\n for (const block of content) {\n const obj = asRecord(block);\n if (!obj || stringValue(obj.type) !== 'toolCall') continue;\n const id =\n stringValue(obj.id) ??\n stringValue(obj.toolCallId) ??\n stringValue(obj.tool_call_id) ??\n stringValue(obj.tool_call_id$);\n if (!id) continue;\n const name = stringValue(obj.name) ?? stringValue(obj.toolName) ?? 'tool';\n calls.push({\n id,\n name,\n preview: formatToolCallPreview(name, asRecord(obj.arguments) ?? asRecord(obj.args) ?? {}),\n });\n }\n return calls;\n}\n\nfunction rowToolCallId(row: unknown): string | undefined {\n const record = asRecord(row);\n return (\n stringValue(record?.toolCallId) ??\n stringValue(record?.tool_call_id) ??\n stringValue(record?.tool_call_id$)\n );\n}\n\nfunction rowCreatedAt(row: TranscriptStoredRow): string | undefined {\n const record = asRecord(row);\n return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);\n}\n\nfunction messageLabel(row: AgentMessage): string {\n const role = stringValue((row as { role?: unknown }).role) ?? 'message';\n if (role === 'tool' || role === 'toolResult') {\n return `tool:${stringValue((row as { toolName?: unknown }).toolName) ?? 'result'}`;\n }\n return role;\n}\n\nfunction rowPreview(row: TranscriptStoredRow): string {\n if (isTranscriptContextEntry(row)) {\n return truncateText(row.text ?? JSON.stringify(row.data ?? {}));\n }\n if (isTranscriptLabelEntry(row)) {\n return truncateText(row.label ? `label: ${row.label}` : 'label cleared');\n }\n if (isTranscriptMetadataEntry(row)) {\n if (row.type === 'model_change') {\n return truncateText([row.provider, row.modelId].filter(Boolean).join('/') || 'model changed');\n }\n if (row.type === 'thinking_level_change') {\n return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : 'thinking changed');\n }\n return truncateText(row.name ? `title: ${row.name}` : 'title cleared');\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return truncateText(row.command ?? 'bash');\n }\n if (isTranscriptCustomMessageEntry(row)) {\n const record = asRecord(row);\n const customType = stringValue(record?.customType) ?? 'custom';\n const preview = contentPreview(record?.content);\n return truncateText(preview ? `${customType}: ${preview}` : customType);\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n if (row.role === 'branchSummary') {\n return truncateText(row.summary ?? 'branch summary');\n }\n return truncateText(row.summary ?? 'compaction checkpoint');\n }\n const record = asRecord(row);\n if (record?.type === 'compaction') {\n return truncateText(stringValue(record.summary) ?? 'compaction checkpoint');\n }\n const preview = contentPreview(record?.content);\n if (record?.role === 'assistant' && !preview) {\n if (record.stopReason === 'aborted') {\n return '(aborted)';\n }\n const errorMessage = stringValue(record.errorMessage);\n if (errorMessage) {\n return truncateText(errorMessage, 80);\n }\n }\n return preview;\n}\n\nfunction rowContentText(row: TranscriptStoredRow): string | undefined {\n if (isTranscriptContextEntry(row)) {\n return row.text;\n }\n if (isTranscriptLabelEntry(row)) {\n return row.label;\n }\n if (isTranscriptMetadataEntry(row)) {\n if (row.type === 'model_change') {\n return [row.provider, row.modelId].filter(Boolean).join('/') || undefined;\n }\n if (row.type === 'thinking_level_change') {\n return row.thinkingLevel;\n }\n return row.name;\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return row.command;\n }\n if (isTranscriptCustomMessageEntry(row)) {\n const record = asRecord(row);\n return contentText(record?.content).trim() || stringValue(record?.customType);\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n return row.summary;\n }\n const record = asRecord(row);\n if (record?.type === 'compaction') {\n return stringValue(record.summary);\n }\n const text = contentText(record?.content).trim();\n return text ? text : undefined;\n}\n\nexport function buildTuiTranscriptTree(rows: TranscriptStoredRow[]): TuiTranscriptTreeEntry[] {\n const entries: TuiTranscriptTreeEntry[] = [];\n const byOriginalId = new Map<string, TuiTranscriptTreeEntry>();\n const toolCallsById = new Map<string, ToolCallDisplay>();\n const labelChanges: Array<{ targetId: string; label?: string; timestamp?: string }> = [];\n let currentTurnId: string | undefined;\n let turn = 0;\n\n rows.forEach((row, index) => {\n const id = `row-${index + 1}`;\n const record = asRecord(row);\n let parentId: string | undefined;\n let depth = 0;\n let label = 'entry';\n let role: string | undefined;\n let toolCallPreview: string | undefined;\n\n if (isTranscriptContextEntry(row)) {\n label = 'context';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if ((asRecord(row)?.type) === 'compaction') {\n label = 'compaction';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptLabelEntry(row)) {\n label = row.label ? `label:${row.label}` : 'label:cleared';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n if (row.targetId) {\n labelChanges.push({\n targetId: row.targetId,\n label: row.label,\n timestamp: typeof row.timestamp === 'string' ? row.timestamp : undefined,\n });\n }\n } else if (isTranscriptMetadataEntry(row)) {\n label = row.type;\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptBashExecutionEntry(row)) {\n label = 'bashExecution';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptCustomMessageEntry(row)) {\n label = `custom:${stringValue(record?.customType) ?? 'message'}`;\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptSummaryMessageEntry(row)) {\n label = row.role === 'branchSummary' ? 'branch_summary' : 'compaction';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else {\n const message = row as AgentMessage;\n role = stringValue((message as { role?: unknown }).role);\n label = messageLabel(message);\n if (role === 'tool' || role === 'toolResult') {\n const toolCallId = rowToolCallId(row);\n const toolCall = toolCallId ? toolCallsById.get(toolCallId) : undefined;\n if (toolCall) {\n label = `tool:${toolCall.name}`;\n toolCallPreview = toolCall.preview;\n }\n }\n if (role === 'user' || !currentTurnId) {\n turn += 1;\n currentTurnId = id;\n depth = 0;\n } else {\n parentId = currentTurnId;\n depth = 1;\n }\n }\n\n const entry: TuiTranscriptTreeEntry = {\n id,\n depth,\n label,\n turn,\n preview: rowPreview(row),\n contentText: rowContentText(row),\n createdAt: rowCreatedAt(row),\n };\n if (parentId) entry.parentId = parentId;\n if (role) entry.role = role;\n if (toolCallPreview) entry.toolCallPreview = toolCallPreview;\n entries.push(entry);\n\n byOriginalId.set(id, entry);\n const originalId = stringValue(record?.id);\n if (originalId) {\n byOriginalId.set(originalId, entry);\n }\n\n for (const toolCall of collectToolCallDisplays(record?.content)) {\n toolCallsById.set(toolCall.id, { name: toolCall.name, preview: toolCall.preview });\n }\n });\n\n for (const change of labelChanges) {\n const target = byOriginalId.get(change.targetId);\n if (!target) continue;\n if (change.label?.trim()) {\n target.userLabel = change.label.trim();\n target.labelTimestamp = change.timestamp;\n } else {\n delete target.userLabel;\n delete target.labelTimestamp;\n }\n }\n\n markCurrentTranscriptPath(entries);\n\n return entries;\n}\n\nfunction markCurrentTranscriptPath(entries: TuiTranscriptTreeEntry[]): void {\n const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);\n if (!currentLeaf) return;\n\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n currentLeaf.isCurrentLeaf = true;\n let currentId: string | undefined = currentLeaf.id;\n while (currentId) {\n const entry = byId.get(currentId);\n if (!entry) break;\n entry.isOnActivePath = true;\n currentId = entry.parentId;\n }\n}\n\nfunction isCurrentLeafCandidate(entry: TuiTranscriptTreeEntry): boolean {\n if (entry.label === 'context') return false;\n if (entry.label === 'model_change') return false;\n if (entry.label === 'thinking_level_change') return false;\n if (entry.label === 'session_info') return false;\n if (entry.label.startsWith('label:')) return false;\n return true;\n}\n\nexport function filterTuiTranscriptTreeEntries(\n entries: TuiTranscriptTreeEntry[],\n mode: TreeFilterMode,\n): TuiTranscriptTreeEntry[] {\n if (mode === 'all') return entries;\n return entries.filter((entry) => {\n if (!entry.isCurrentLeaf && isEmptyAssistantTreeEntry(entry)) {\n return false;\n }\n if (mode === 'user-only') {\n return entry.role === 'user';\n }\n if (mode === 'labeled-only') {\n return Boolean(entry.userLabel);\n }\n const isTool = entry.role === 'tool' || entry.role === 'toolResult' || entry.label.startsWith('tool:');\n const isBookkeeping =\n entry.label === 'context' ||\n entry.label === 'model_change' ||\n entry.label === 'thinking_level_change' ||\n entry.label === 'session_info' ||\n entry.label.startsWith('custom:') ||\n entry.label.startsWith('label:');\n if (mode === 'no-tools') {\n return !isTool && !isBookkeeping;\n }\n return !isBookkeeping;\n });\n}\n\nfunction isEmptyAssistantTreeEntry(entry: TuiTranscriptTreeEntry): boolean {\n if (entry.role !== 'assistant') return false;\n const preview = entry.preview?.trim();\n if (!preview) return true;\n return /^(?:\\[[^\\]]+\\]\\s*)+$/.test(preview);\n}\n\nexport function formatTuiTranscriptTreeEntryDisplayText(entry: TuiTranscriptTreeEntry): string {\n const preview = entry.preview?.trim();\n const toolCallPreview = entry.toolCallPreview?.trim();\n const role = entry.role?.trim() || entry.label;\n if (!preview) {\n if (role === 'assistant') return 'assistant: (no content)';\n if (role === 'tool' || role === 'toolResult' || entry.label.startsWith('tool:')) {\n return `[${formatTuiTranscriptToolDisplayName(entry.label)}]`;\n }\n return entry.label;\n }\n if (role === 'user' || role === 'assistant') {\n return `${role}: ${preview}`;\n }\n if (role === 'bashExecution' || entry.label === 'bashExecution') {\n return `[bash]: ${preview}`;\n }\n if (role === 'tool' || role === 'toolResult' || entry.label.startsWith('tool:')) {\n if (toolCallPreview) return toolCallPreview;\n return `[${formatTuiTranscriptToolDisplayName(entry.label)}]`;\n }\n if (entry.label === 'model_change') {\n const model = preview.includes('/') ? (preview.split('/').pop() ?? preview) : preview;\n return `[model: ${model}]`;\n }\n if (entry.label === 'thinking_level_change') {\n return `[${preview}]`;\n }\n if (entry.label === 'session_info') {\n return `[${preview}]`;\n }\n if (entry.label.startsWith('label:')) {\n return `[${preview}]`;\n }\n if (entry.label === 'compaction') {\n return `[compaction: ${preview}]`;\n }\n if (entry.label === 'branch_summary') {\n return `[branch summary]: ${preview}`;\n }\n if (entry.label.startsWith('custom:')) {\n return `[${entry.label}]${preview ? `: ${preview}` : ''}`;\n }\n return `${entry.label}: ${preview}`;\n}\n\nfunction formatTuiTranscriptToolDisplayName(label: string): string {\n return label.startsWith('tool:') ? label.slice('tool:'.length) || 'tool' : label;\n}\n"],"mappings":"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"}
@@ -10,6 +10,10 @@ export interface TuiOptions {
10
10
  thinking?: string;
11
11
  /** Single message to send on start, then stay open. */
12
12
  message?: string;
13
+ /** Workspace directory for the new TUI session. */
14
+ workdir?: string;
15
+ /** Use the launch directory as the new TUI session workspace when no workdir is set. */
16
+ useStartupCwd?: boolean;
13
17
  /** Run in embedded (local) mode — no gateway required. */
14
18
  local?: boolean;
15
19
  /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */
@@ -19,39 +23,6 @@ export type TuiExitReason = 'exit' | 'signal';
19
23
  export interface TuiResult {
20
24
  exitReason: TuiExitReason;
21
25
  }
22
- /** SSE events emitted by POST /api/agent. */
23
- export interface AgentSSEStatusEvent {
24
- status: string;
25
- runId: string;
26
- }
27
- export interface AgentSSETokenEvent {
28
- content: string;
29
- }
30
- export interface AgentSSEThinkingEvent {
31
- content: string;
32
- isDelta?: boolean;
33
- }
34
- export interface AgentSSEToolStartEvent {
35
- toolName: string;
36
- toolCallId: string;
37
- args?: unknown;
38
- }
39
- export interface AgentSSEToolEndEvent {
40
- toolName: string;
41
- toolCallId: string;
42
- isError: boolean;
43
- result?: string;
44
- }
45
- export interface AgentSSEErrorEvent {
46
- content: string;
47
- }
48
- export interface AgentSSEResultEvent {
49
- ok: boolean;
50
- payload?: {
51
- status?: string;
52
- summary?: string;
53
- };
54
- }
55
26
  /** Parsed SSE event from the stream. */
56
27
  export interface ParsedSSEEvent {
57
28
  event: string;
@@ -59,17 +30,34 @@ export interface ParsedSSEEvent {
59
30
  id?: string;
60
31
  }
61
32
  /** Activity status for the TUI status bar. */
62
- export type ActivityStatus = 'idle' | 'sending' | 'waiting' | 'streaming' | 'running' | 'compacting';
33
+ export type ActivityStatus = 'idle' | 'sending' | 'waiting' | 'streaming' | 'running' | 'compacting' | 'stalled' | 'recovering' | 'aborting';
34
+ export type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';
35
+ export type TuiRunPhase = 'idle' | 'sending' | 'waiting' | 'streaming' | 'tool' | 'progress' | 'stalled' | 'recovering' | 'aborting';
36
+ export interface TuiRunStatus {
37
+ phase: TuiRunPhase;
38
+ runId: string | null;
39
+ directStreamRunId: string | null;
40
+ lastCompletedRunId: string | null;
41
+ source: TuiEventSource;
42
+ lastEvent: string | null;
43
+ lastActivityAt: number | null;
44
+ stalledAt: number | null;
45
+ recoveredAt: number | null;
46
+ }
63
47
  /** Session metadata shown in the TUI footer. */
64
48
  export interface SessionInfo {
65
49
  model?: string;
66
50
  modelProvider?: string;
67
51
  thinkingLevel?: string;
52
+ reasoningLevel?: string;
53
+ verboseLevel?: string;
68
54
  contextTokens?: number | null;
69
55
  totalTokens?: number | null;
70
56
  contextWindow?: number | null;
71
57
  contextUsagePercent?: number | null;
72
58
  displayName?: string;
59
+ effectiveWorkspacePath?: string;
60
+ workingDirectoryLocked?: boolean;
73
61
  }
74
62
  /** Mutable state bag for the TUI runtime. */
75
63
  export interface TuiState {
@@ -77,6 +65,7 @@ export interface TuiState {
77
65
  activeRunId: string | null;
78
66
  isConnected: boolean;
79
67
  activityStatus: ActivityStatus;
68
+ runStatus: TuiRunStatus;
80
69
  connectionStatus: string;
81
70
  sessionInfo: SessionInfo;
82
71
  autoMessageSent: boolean;
@@ -88,6 +77,8 @@ export interface TuiState {
88
77
  exitRequested: boolean;
89
78
  /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */
90
79
  messageFollowUpQueue: string[];
80
+ /** Queued Enter-while-busy steering messages after the first in-flight steer. */
81
+ steeringQueue: string[];
91
82
  /** Ctrl+P cycle filter; `null` = all models from catalog. */
92
83
  scopedModelRefs: string[] | null;
93
84
  /** Last Escape timestamp for double-press actions. */
@@ -5,6 +5,17 @@ function createInitialState(sessionKey) {
5
5
  activeRunId: null,
6
6
  isConnected: false,
7
7
  activityStatus: "idle",
8
+ runStatus: {
9
+ phase: "idle",
10
+ runId: null,
11
+ directStreamRunId: null,
12
+ lastCompletedRunId: null,
13
+ source: "unknown",
14
+ lastEvent: null,
15
+ lastActivityAt: null,
16
+ stalledAt: null,
17
+ recoveredAt: null
18
+ },
8
19
  connectionStatus: "connecting",
9
20
  sessionInfo: {},
10
21
  autoMessageSent: false,
@@ -14,6 +25,7 @@ function createInitialState(sessionKey) {
14
25
  lastCtrlCAt: 0,
15
26
  exitRequested: false,
16
27
  messageFollowUpQueue: [],
28
+ steeringQueue: [],
17
29
  scopedModelRefs: null,
18
30
  lastEscapeAt: 0,
19
31
  progressMessage: 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 /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\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/** SSE events emitted by POST /api/agent. */\nexport interface AgentSSEStatusEvent {\n status: string;\n runId: string;\n}\n\nexport interface AgentSSETokenEvent {\n content: string;\n}\n\nexport interface AgentSSEThinkingEvent {\n content: string;\n isDelta?: boolean;\n}\n\nexport interface AgentSSEToolStartEvent {\n toolName: string;\n toolCallId: string;\n args?: unknown;\n}\n\nexport interface AgentSSEToolEndEvent {\n toolName: string;\n toolCallId: string;\n isError: boolean;\n result?: string;\n}\n\nexport interface AgentSSEErrorEvent {\n content: string;\n}\n\nexport interface AgentSSEResultEvent {\n ok: boolean;\n payload?: { status?: string; summary?: string };\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\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\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 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 /** 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 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 scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";AAsHA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EACf,sBAAsB,EAAE;EACxB,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 /** 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":";AAwHA,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"}