@xopcai/xopc 0.0.102 → 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 (995) hide show
  1. package/README.md +8 -5
  2. package/README.zh-CN.md +8 -5
  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 +2 -2
  20. package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +66 -1
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  24. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  25. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  26. package/dist/extensions/telegram/src/command-handler.js +1 -2
  27. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  28. package/dist/extensions/telegram/src/config-schema.js +2 -2
  29. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  30. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  31. package/dist/extensions/telegram/src/doctor.js +68 -0
  32. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  33. package/dist/extensions/telegram/src/index.d.ts +8 -1
  34. package/dist/extensions/telegram/src/index.js +15 -2
  35. package/dist/extensions/telegram/src/index.js.map +1 -0
  36. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  37. package/dist/extensions/telegram/src/plugin.js +32 -12
  38. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  39. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  40. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  41. package/dist/extensions/telegram/src/send-options.js +8 -5
  42. package/dist/extensions/telegram/src/send-options.js.map +1 -1
  43. package/dist/extensions/telegram/xopc.extension.json +412 -5
  44. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  45. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  46. package/dist/extensions/weixin/src/api/api.js +1 -1
  47. package/dist/extensions/weixin/src/index.d.ts +8 -0
  48. package/dist/extensions/weixin/src/index.js +12 -1
  49. package/dist/extensions/weixin/src/index.js.map +1 -0
  50. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  51. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  52. package/dist/extensions/weixin/src/plugin.js +77 -2
  53. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  54. package/dist/extensions/weixin/xopc.extension.json +52 -0
  55. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  56. package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
  57. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  58. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  59. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  60. package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
  61. package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
  62. package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
  63. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  64. package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
  65. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  66. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  67. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  68. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  69. package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
  70. package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
  71. package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
  72. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  73. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  74. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
  79. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  80. package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
  81. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  82. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  84. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  85. package/dist/gateway/static/root/index.html +6 -5
  86. package/dist/package.js +1 -1
  87. package/dist/src/agent/agent-manager.d.ts +18 -6
  88. package/dist/src/agent/agent-manager.js +60 -35
  89. package/dist/src/agent/agent-manager.js.map +1 -1
  90. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  91. package/dist/src/agent/builtin-agent-ids.js +17 -0
  92. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  93. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  94. package/dist/src/agent/child-agent-factory.js +28 -8
  95. package/dist/src/agent/child-agent-factory.js.map +1 -1
  96. package/dist/src/agent/context/workspace-seed.js +1 -1
  97. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  98. package/dist/src/agent/embedded/run-turn.js +8 -2
  99. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  100. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  101. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  102. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  103. package/dist/src/agent/embedded/types.d.ts +36 -35
  104. package/dist/src/agent/fallback/candidates.js +1 -1
  105. package/dist/src/agent/fallback/candidates.js.map +1 -1
  106. package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
  107. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
  108. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  109. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  110. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  111. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  112. package/dist/src/agent/models/manager.d.ts +1 -1
  113. package/dist/src/agent/models/manager.js +1 -1
  114. package/dist/src/agent/models/manager.js.map +1 -1
  115. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  116. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  117. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  118. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  119. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  120. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  121. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  122. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  124. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  125. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  126. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  127. package/dist/src/agent/service-inbound-utils.js +1 -17
  128. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  129. package/dist/src/agent/service.d.ts +4 -4
  130. package/dist/src/agent/service.js +27 -15
  131. package/dist/src/agent/service.js.map +1 -1
  132. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  133. package/dist/src/agent/session/session-config-service.js +9 -1
  134. package/dist/src/agent/session/session-config-service.js.map +1 -1
  135. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  136. package/dist/src/agent/session/session-inspector.js +4 -0
  137. package/dist/src/agent/session/session-inspector.js.map +1 -1
  138. package/dist/src/agent/skills/config.js +1 -3
  139. package/dist/src/agent/skills/config.js.map +1 -1
  140. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  141. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  142. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  143. package/dist/src/agent/skills/hub-pull.js +1 -1
  144. package/dist/src/agent/skills/index.js +20 -5
  145. package/dist/src/agent/skills/index.js.map +1 -1
  146. package/dist/src/agent/skills/installer.js +14 -27
  147. package/dist/src/agent/skills/installer.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  149. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  151. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  152. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  153. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  154. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  155. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  156. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  157. package/dist/src/agent/skills/skill-manager.js +3 -3
  158. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  159. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  160. package/dist/src/agent/skills/skill-view-path.js +3 -66
  161. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  162. package/dist/src/agent/skills/test-framework.js +2 -3
  163. package/dist/src/agent/skills/test-framework.js.map +1 -1
  164. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  165. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  166. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  167. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  168. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  169. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  170. package/dist/src/agent/tool-manuals/index.js +28 -0
  171. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  172. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  173. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  174. package/dist/src/agent/tools/factory.js +7 -5
  175. package/dist/src/agent/tools/factory.js.map +1 -1
  176. package/dist/src/agent/tools/index.d.ts +1 -0
  177. package/dist/src/agent/tools/index.js +5 -4
  178. package/dist/src/agent/tools/send-media.js +1 -2
  179. package/dist/src/agent/tools/send-media.js.map +1 -1
  180. package/dist/src/agent/tools/session-search-tool.js +1 -1
  181. package/dist/src/agent/tools/shell.js +1 -1
  182. package/dist/src/agent/tools/skills-tools.js +37 -8
  183. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  184. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  185. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  186. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  187. package/dist/src/agent/tools/web-extract.js +2 -2
  188. package/dist/src/agent/tools/web.js +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  190. package/dist/src/agent/workflow/catalog.js +66 -25
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  193. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  194. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  195. package/dist/src/agent/workflow/types.d.ts +10 -0
  196. package/dist/src/auth/credentials.d.ts +7 -0
  197. package/dist/src/auth/credentials.js +45 -7
  198. package/dist/src/auth/credentials.js.map +1 -1
  199. package/dist/src/auth/index.d.ts +1 -1
  200. package/dist/src/auth/index.js.map +1 -1
  201. package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
  202. package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
  203. package/dist/src/auth/oauth/google-antigravity.js +1 -1
  204. package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
  205. package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
  206. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
  207. package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
  208. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
  209. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
  210. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
  211. package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
  212. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
  213. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
  214. package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
  215. package/dist/src/auth/oauth/index.js +2 -2
  216. package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
  217. package/dist/src/auth/oauth/kimi-coding.js +1 -1
  218. package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
  219. package/dist/src/auth/oauth/minimax-cn.js +1 -1
  220. package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
  221. package/dist/src/auth/oauth/minimax.js +1 -1
  222. package/dist/src/auth/oauth/minimax.js.map +1 -1
  223. package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
  224. package/dist/src/auth/oauth/openai-codex.js +318 -1
  225. package/dist/src/auth/oauth/openai-codex.js.map +1 -0
  226. package/dist/src/auth/profiles/store.js +3 -2
  227. package/dist/src/auth/profiles/store.js.map +1 -1
  228. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  229. package/dist/src/browser/actions/registry.js +2 -2
  230. package/dist/src/browser/cdp-local-launcher.js +1 -1
  231. package/dist/src/browser/index.js +3 -3
  232. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  233. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  234. package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
  235. package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
  236. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
  237. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  238. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  239. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  240. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  241. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  242. package/dist/src/channels/dock.d.ts +0 -7
  243. package/dist/src/channels/dock.js +1 -21
  244. package/dist/src/channels/index.d.ts +1 -3
  245. package/dist/src/channels/index.js +1 -5
  246. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  247. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  248. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  249. package/dist/src/channels/manager.d.ts +1 -0
  250. package/dist/src/channels/manager.js +3 -0
  251. package/dist/src/channels/manager.js.map +1 -1
  252. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  253. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  254. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  256. package/dist/src/channels/pairing/pairing-service.js +8 -27
  257. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  258. package/dist/src/channels/plugin-types.d.ts +3 -1
  259. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  260. package/dist/src/channels/telegram/index.js +1 -1
  261. package/dist/src/chat-commands/builtins/config.js +4 -4
  262. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/model.js +2 -2
  264. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  265. package/dist/src/chat-commands/config-paths.js +1 -1
  266. package/dist/src/chat-commands/config-paths.js.map +1 -1
  267. package/dist/src/chat-commands/context.js +1 -1
  268. package/dist/src/chat-commands/context.js.map +1 -1
  269. package/dist/src/cli/bin.js +1 -1
  270. package/dist/src/cli/command-manifest.js +2 -2
  271. package/dist/src/cli/command-manifest.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +2 -2
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/agents.js +2 -4
  275. package/dist/src/cli/commands/agents.js.map +1 -1
  276. package/dist/src/cli/commands/auth.js +40 -52
  277. package/dist/src/cli/commands/auth.js.map +1 -1
  278. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  279. package/dist/src/cli/commands/channels.d.ts +1 -5
  280. package/dist/src/cli/commands/channels.js +115 -281
  281. package/dist/src/cli/commands/channels.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +2 -2
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  285. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  287. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  288. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  289. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  292. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +2 -1
  294. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  295. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  296. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  297. package/dist/src/cli/commands/extension-pack.js +2 -1
  298. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  299. package/dist/src/cli/commands/models.js +192 -54
  300. package/dist/src/cli/commands/models.js.map +1 -1
  301. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  302. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  303. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  304. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  305. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  306. package/dist/src/cli/commands/onboard/model.d.ts +1 -4
  307. package/dist/src/cli/commands/onboard/model.js +257 -184
  308. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  309. package/dist/src/cli/commands/onboard.js +4 -6
  310. package/dist/src/cli/commands/onboard.js.map +1 -1
  311. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  312. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  313. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  314. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  315. package/dist/src/cli/commands/tui.js +13 -5
  316. package/dist/src/cli/commands/tui.js.map +1 -1
  317. package/dist/src/cli/extension-cli-register.js +1 -1
  318. package/dist/src/cli/utils/oauth-login.d.ts +17 -0
  319. package/dist/src/cli/utils/oauth-login.js +93 -0
  320. package/dist/src/cli/utils/oauth-login.js.map +1 -0
  321. package/dist/src/cli/utils/oauth-providers.js +2 -2
  322. package/dist/src/commands/agents.config.d.ts +3 -3
  323. package/dist/src/commands/agents.config.js +7 -7
  324. package/dist/src/commands/agents.config.js.map +1 -1
  325. package/dist/src/config/agent-profile.d.ts +1 -1
  326. package/dist/src/config/agent-profile.js +6 -2
  327. package/dist/src/config/agent-profile.js.map +1 -1
  328. package/dist/src/config/agent-typed-models.d.ts +2 -2
  329. package/dist/src/config/agent-typed-models.js +13 -2
  330. package/dist/src/config/agent-typed-models.js.map +1 -1
  331. package/dist/src/config/index.js +3 -3
  332. package/dist/src/config/integration.d.ts +1 -1
  333. package/dist/src/config/loader.d.ts +0 -1
  334. package/dist/src/config/loader.js +4 -9
  335. package/dist/src/config/loader.js.map +1 -1
  336. package/dist/src/config/models-json.d.ts +6 -6
  337. package/dist/src/config/rules.js +2 -12
  338. package/dist/src/config/rules.js.map +1 -1
  339. package/dist/src/config/schema.d.ts +74 -47
  340. package/dist/src/config/schema.js +28 -66
  341. package/dist/src/config/schema.js.map +1 -1
  342. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  343. package/dist/src/config/validate-channel-configs.js +29 -10
  344. package/dist/src/config/validate-channel-configs.js.map +1 -1
  345. package/dist/src/cron/executor.js +1 -4
  346. package/dist/src/cron/executor.js.map +1 -1
  347. package/dist/src/extensions/activation-context.js +3 -1
  348. package/dist/src/extensions/activation-context.js.map +1 -1
  349. package/dist/src/extensions/activation-planner.js +12 -0
  350. package/dist/src/extensions/activation-planner.js.map +1 -1
  351. package/dist/src/extensions/api.d.ts +5 -1
  352. package/dist/src/extensions/api.js +12 -0
  353. package/dist/src/extensions/api.js.map +1 -1
  354. package/dist/src/extensions/discover-extensions.js +17 -13
  355. package/dist/src/extensions/discover-extensions.js.map +1 -1
  356. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  357. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  358. package/dist/src/extensions/index.js +12 -4
  359. package/dist/src/extensions/index.js.map +1 -0
  360. package/dist/src/extensions/loader.d.ts +5 -1
  361. package/dist/src/extensions/loader.js +12 -11
  362. package/dist/src/extensions/loader.js.map +1 -1
  363. package/dist/src/extensions/manifest-registry.js +98 -93
  364. package/dist/src/extensions/manifest-registry.js.map +1 -1
  365. package/dist/src/extensions/normalize-manifest.js +91 -15
  366. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  367. package/dist/src/extensions/sdk/index.js +1 -1
  368. package/dist/src/extensions/sdk/testing.js +4 -0
  369. package/dist/src/extensions/sdk/testing.js.map +1 -1
  370. package/dist/src/extensions/types/core.d.ts +32 -1
  371. package/dist/src/extensions/types/manifest.d.ts +60 -0
  372. package/dist/src/extensions/types/tui.d.ts +414 -5
  373. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  374. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  375. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  376. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  377. package/dist/src/gateway/agent-run-relay.js +10 -3
  378. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  379. package/dist/src/gateway/agents-admin.d.ts +32 -19
  380. package/dist/src/gateway/agents-admin.js +113 -93
  381. package/dist/src/gateway/agents-admin.js.map +1 -1
  382. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  383. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  384. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  385. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  386. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  387. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  388. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  389. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  391. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  392. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  393. package/dist/src/gateway/hono/oauth-async.js +2 -2
  394. package/dist/src/gateway/hono/oauth.js +2 -2
  395. package/dist/src/gateway/hono/routes/agents.js +83 -48
  396. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  397. package/dist/src/gateway/hono/routes/channels.js +134 -214
  398. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  399. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  400. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  401. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  402. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  403. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  404. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  405. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  406. package/dist/src/gateway/hono/routes/config.js +5 -2
  407. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  408. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  410. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/models.js +25 -5
  412. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  413. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  414. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  416. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  417. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  418. package/dist/src/gateway/hono/routes/tui.js +16 -0
  419. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  420. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  421. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  422. package/dist/src/gateway/hono/sse.d.ts +5 -7
  423. package/dist/src/gateway/hono/sse.js +21 -38
  424. package/dist/src/gateway/hono/sse.js.map +1 -1
  425. package/dist/src/gateway/protocol.js.map +1 -1
  426. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  427. package/dist/src/gateway/service/agent-runner.js +1 -1
  428. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  429. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  430. package/dist/src/gateway/service/marketplace-service.js +7 -4
  431. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  432. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  433. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  434. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  435. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  436. package/dist/src/gateway/service/sessions-api.js +12 -0
  437. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  438. package/dist/src/gateway/service.d.ts +6 -0
  439. package/dist/src/gateway/service.js +73 -57
  440. package/dist/src/gateway/service.js.map +1 -1
  441. package/dist/src/mcp/channel-bridge.js +1 -1
  442. package/dist/src/media/store.js +3 -0
  443. package/dist/src/media/store.js.map +1 -1
  444. package/dist/src/notes/service.js +1 -1
  445. package/dist/src/notes/service.js.map +1 -1
  446. package/dist/src/project-trust/trust-store.d.ts +30 -0
  447. package/dist/src/project-trust/trust-store.js +194 -0
  448. package/dist/src/project-trust/trust-store.js.map +1 -0
  449. package/dist/src/providers/index.d.ts +4 -4
  450. package/dist/src/providers/index.js +41 -22
  451. package/dist/src/providers/index.js.map +1 -1
  452. package/dist/src/providers/presentation.d.ts +34 -0
  453. package/dist/src/providers/presentation.js +162 -0
  454. package/dist/src/providers/presentation.js.map +1 -0
  455. package/dist/src/routing/resolve-route.d.ts +0 -3
  456. package/dist/src/routing/resolve-route.js.map +1 -1
  457. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  458. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  459. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  460. package/dist/src/session/client-history.d.ts +32 -0
  461. package/dist/src/session/client-history.js +232 -1
  462. package/dist/src/session/client-history.js.map +1 -1
  463. package/dist/src/session/manager.d.ts +37 -4
  464. package/dist/src/session/manager.js +39 -15
  465. package/dist/src/session/manager.js.map +1 -1
  466. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  467. package/dist/src/session/session-context-for-llm.js +105 -2
  468. package/dist/src/session/session-context-for-llm.js.map +1 -1
  469. package/dist/src/session/store.d.ts +37 -0
  470. package/dist/src/session/store.js +127 -2
  471. package/dist/src/session/store.js.map +1 -1
  472. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  473. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  474. package/dist/src/session/types.d.ts +14 -1
  475. package/dist/src/session/types.js.map +1 -1
  476. package/dist/src/share/share-thumbnail.js +1 -1
  477. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  478. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  479. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  480. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  481. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  482. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  483. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  484. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  485. package/dist/src/storage/sqlite/schema.js +1 -1
  486. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  487. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  488. package/dist/src/storage/sqlite/session-repository.js +52 -25
  489. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  490. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  491. package/dist/src/tui/backends/embedded-backend.js +227 -39
  492. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  493. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  494. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  495. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  496. package/dist/src/tui/chat-history.d.ts +5 -1
  497. package/dist/src/tui/chat-history.js +78 -8
  498. package/dist/src/tui/chat-history.js.map +1 -1
  499. package/dist/src/tui/clipboard-text.d.ts +5 -0
  500. package/dist/src/tui/clipboard-text.js +46 -0
  501. package/dist/src/tui/clipboard-text.js.map +1 -0
  502. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  503. package/dist/src/tui/components/assistant-message.js +115 -9
  504. package/dist/src/tui/components/assistant-message.js.map +1 -1
  505. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  506. package/dist/src/tui/components/bash-execution.js +31 -3
  507. package/dist/src/tui/components/bash-execution.js.map +1 -1
  508. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  509. package/dist/src/tui/components/bash-summary.js +87 -0
  510. package/dist/src/tui/components/bash-summary.js.map +1 -0
  511. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  512. package/dist/src/tui/components/branch-message-summary.js +43 -0
  513. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  514. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  515. package/dist/src/tui/components/branch-summary.js +51 -0
  516. package/dist/src/tui/components/branch-summary.js.map +1 -0
  517. package/dist/src/tui/components/chat-log.d.ts +46 -6
  518. package/dist/src/tui/components/chat-log.js +183 -21
  519. package/dist/src/tui/components/chat-log.js.map +1 -1
  520. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  521. package/dist/src/tui/components/compaction-summary.js +46 -0
  522. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  523. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  524. package/dist/src/tui/components/custom-editor.js +2 -0
  525. package/dist/src/tui/components/custom-editor.js.map +1 -1
  526. package/dist/src/tui/components/custom-message.d.ts +23 -0
  527. package/dist/src/tui/components/custom-message.js +65 -0
  528. package/dist/src/tui/components/custom-message.js.map +1 -0
  529. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  530. package/dist/src/tui/components/extension-dialog.js +127 -0
  531. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  532. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  533. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  534. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  535. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  536. package/dist/src/tui/components/searchable-select-list.js +82 -10
  537. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  538. package/dist/src/tui/components/session-selector.d.ts +18 -4
  539. package/dist/src/tui/components/session-selector.js +207 -40
  540. package/dist/src/tui/components/session-selector.js.map +1 -1
  541. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  542. package/dist/src/tui/components/settings-selector.js +126 -7
  543. package/dist/src/tui/components/settings-selector.js.map +1 -1
  544. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  545. package/dist/src/tui/components/thinking-selector.js +48 -0
  546. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  547. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  548. package/dist/src/tui/components/tool-execution.js +378 -28
  549. package/dist/src/tui/components/tool-execution.js.map +1 -1
  550. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  551. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  552. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  553. package/dist/src/tui/components/tui-header.d.ts +9 -2
  554. package/dist/src/tui/components/tui-header.js +25 -5
  555. package/dist/src/tui/components/tui-header.js.map +1 -1
  556. package/dist/src/tui/components/user-message.d.ts +4 -2
  557. package/dist/src/tui/components/user-message.js +42 -9
  558. package/dist/src/tui/components/user-message.js.map +1 -1
  559. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  560. package/dist/src/tui/components/visual-truncate.js +27 -0
  561. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  562. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  563. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  564. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  565. package/dist/src/tui/extension-host/host.d.ts +31 -1
  566. package/dist/src/tui/extension-host/host.js +123 -6
  567. package/dist/src/tui/extension-host/host.js.map +1 -1
  568. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  569. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  570. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  571. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  572. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  573. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  574. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  575. package/dist/src/tui/extension-host/runtime.js +547 -85
  576. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  577. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  578. package/dist/src/tui/extension-host/surface.js +30 -6
  579. package/dist/src/tui/extension-host/surface.js.map +1 -1
  580. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  581. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  582. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  583. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  584. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  585. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  586. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  587. package/dist/src/tui/tui-agent-events.js +200 -59
  588. package/dist/src/tui/tui-agent-events.js.map +1 -1
  589. package/dist/src/tui/tui-backend.d.ts +169 -3
  590. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  591. package/dist/src/tui/tui-command-formatters.js +594 -0
  592. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  593. package/dist/src/tui/tui-commands.d.ts +57 -7
  594. package/dist/src/tui/tui-commands.js +639 -43
  595. package/dist/src/tui/tui-commands.js.map +1 -1
  596. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  597. package/dist/src/tui/tui-context-usage.js +9 -1
  598. package/dist/src/tui/tui-context-usage.js.map +1 -1
  599. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  600. package/dist/src/tui/tui-extension-user-message.js +32 -0
  601. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  602. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  603. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  604. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  605. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  606. package/dist/src/tui/tui-local-shell.js +50 -8
  607. package/dist/src/tui/tui-local-shell.js.map +1 -1
  608. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  609. package/dist/src/tui/tui-model-picker.js +152 -0
  610. package/dist/src/tui/tui-model-picker.js.map +1 -0
  611. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  612. package/dist/src/tui/tui-oauth-login.js +189 -0
  613. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  614. package/dist/src/tui/tui-overlays.d.ts +3 -3
  615. package/dist/src/tui/tui-overlays.js +6 -7
  616. package/dist/src/tui/tui-overlays.js.map +1 -1
  617. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  618. package/dist/src/tui/tui-picker-overlay.js +340 -30
  619. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  620. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  621. package/dist/src/tui/tui-picker-services.js +1 -0
  622. package/dist/src/tui/tui-run-state.d.ts +11 -0
  623. package/dist/src/tui/tui-run-state.js +114 -0
  624. package/dist/src/tui/tui-run-state.js.map +1 -0
  625. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  626. package/dist/src/tui/tui-runtime-hints.js +18 -0
  627. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  628. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  629. package/dist/src/tui/tui-scoped-models.js +2 -2
  630. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  631. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  632. package/dist/src/tui/tui-session-actions.js +21 -9
  633. package/dist/src/tui/tui-session-actions.js.map +1 -1
  634. package/dist/src/tui/tui-session-format.d.ts +4 -1
  635. package/dist/src/tui/tui-session-format.js +17 -3
  636. package/dist/src/tui/tui-session-format.js.map +1 -1
  637. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  638. package/dist/src/tui/tui-session-snapshot.js +184 -0
  639. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  640. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  641. package/dist/src/tui/tui-session-stats.js +59 -0
  642. package/dist/src/tui/tui-session-stats.js.map +1 -0
  643. package/dist/src/tui/tui-settings.d.ts +21 -0
  644. package/dist/src/tui/tui-settings.js +28 -1
  645. package/dist/src/tui/tui-settings.js.map +1 -1
  646. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  647. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  648. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  649. package/dist/src/tui/tui-startup-resources.js +39 -0
  650. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  651. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  652. package/dist/src/tui/tui-startup-text.js +58 -0
  653. package/dist/src/tui/tui-startup-text.js.map +1 -0
  654. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  655. package/dist/src/tui/tui-stdio-filter.js +11 -7
  656. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  657. package/dist/src/tui/tui-submit.d.ts +2 -0
  658. package/dist/src/tui/tui-submit.js +2 -1
  659. package/dist/src/tui/tui-submit.js.map +1 -1
  660. package/dist/src/tui/tui-tool-diff.js +61 -7
  661. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  662. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  663. package/dist/src/tui/tui-tool-result.js +74 -0
  664. package/dist/src/tui/tui-tool-result.js.map +1 -0
  665. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  666. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  667. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  668. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  669. package/dist/src/tui/tui-transcript-tree.js +316 -0
  670. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  671. package/dist/src/tui/tui-types.d.ts +25 -34
  672. package/dist/src/tui/tui-types.js +12 -0
  673. package/dist/src/tui/tui-types.js.map +1 -1
  674. package/dist/src/tui/tui.js +1288 -112
  675. package/dist/src/tui/tui.js.map +1 -1
  676. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  677. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  678. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  679. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  680. package/dist/src/workflows/domain/definition-utils.js +18 -8
  681. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  682. package/dist/src/workflows/domain/definition.d.ts +25 -0
  683. package/dist/src/workflows/domain/event.d.ts +1 -0
  684. package/dist/src/workflows/domain/result.d.ts +15 -0
  685. package/dist/src/workflows/domain/run.d.ts +2 -0
  686. package/dist/src/workflows/domain/run.js.map +1 -1
  687. package/dist/src/workflows/engine/projector.js +4 -0
  688. package/dist/src/workflows/engine/projector.js.map +1 -1
  689. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  690. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  691. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  692. package/dist/src/workflows/index.d.ts +1 -0
  693. package/dist/src/workflows/index.js +4 -1
  694. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  695. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  696. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  697. package/dist/src/workflows/registry/index.d.ts +2 -0
  698. package/dist/src/workflows/registry/index.js +2 -0
  699. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  700. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  701. package/dist/src/workflows/runtime/index.d.ts +2 -0
  702. package/dist/src/workflows/runtime/index.js +2 -1
  703. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  704. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  705. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  706. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  707. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  708. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  709. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  710. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  711. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  712. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  713. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  714. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  715. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  716. package/package.json +21 -15
  717. package/skills/creative/frontend-design/SKILL.md +1 -1
  718. package/skills/creative/theme-factory/SKILL.md +1 -1
  719. package/skills/documents/xlsx/SKILL.md +1 -1
  720. package/skills/engineering/diagnose/SKILL.md +2 -2
  721. package/skills/engineering/tdd/SKILL.md +1 -1
  722. package/skills/tools/github/SKILL.md +6 -1
  723. package/skills/tools/webapp-testing/SKILL.md +4 -1
  724. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  725. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  726. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  727. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  728. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  729. package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
  730. package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
  731. package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
  732. package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
  733. package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
  734. package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
  735. package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
  736. package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
  737. package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
  738. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
  739. package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
  740. package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
  741. package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
  742. package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
  743. package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
  744. package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
  745. package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
  746. package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
  747. package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
  748. package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
  749. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  750. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  751. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  752. package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
  753. package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
  754. package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
  755. package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
  756. package/dist/src/channels/dock.js.map +0 -1
  757. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  758. package/dist/src/channels/plugins/bundled.js +0 -10
  759. package/dist/src/channels/plugins/bundled.js.map +0 -1
  760. package/dist/src/channels/registry.d.ts +0 -25
  761. package/dist/src/channels/registry.js +0 -82
  762. package/dist/src/channels/registry.js.map +0 -1
  763. package/dist/src/config/localized-text.d.ts +0 -6
  764. package/dist/src/config/localized-text.js +0 -42
  765. package/dist/src/config/localized-text.js.map +0 -1
  766. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  767. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  768. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  769. package/dist/src/tui/stream-assembler.d.ts +0 -22
  770. package/dist/src/tui/stream-assembler.js +0 -63
  771. package/dist/src/tui/stream-assembler.js.map +0 -1
  772. package/skills/browser/SKILL-zh.md +0 -188
  773. package/skills/business/company-values/SKILL-zh.md +0 -80
  774. package/skills/business/company-values/SKILL.md +0 -80
  775. package/skills/business/find-community/SKILL-zh.md +0 -50
  776. package/skills/business/find-community/SKILL.md +0 -50
  777. package/skills/business/first-customers/SKILL-zh.md +0 -76
  778. package/skills/business/first-customers/SKILL.md +0 -76
  779. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  780. package/skills/business/grow-sustainably/SKILL.md +0 -92
  781. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  782. package/skills/business/marketing-plan/SKILL.md +0 -100
  783. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  784. package/skills/business/minimalist-review/SKILL.md +0 -82
  785. package/skills/business/mvp/SKILL-zh.md +0 -81
  786. package/skills/business/mvp/SKILL.md +0 -81
  787. package/skills/business/pricing/SKILL-zh.md +0 -64
  788. package/skills/business/pricing/SKILL.md +0 -64
  789. package/skills/business/processize/SKILL-zh.md +0 -91
  790. package/skills/business/processize/SKILL.md +0 -91
  791. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  792. package/skills/business/validate-idea/SKILL.md +0 -68
  793. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  794. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  795. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  796. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  797. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  798. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  799. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  800. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  801. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  802. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  803. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  804. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  805. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  806. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  807. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  808. package/skills/documents/docx/LICENSE.txt +0 -30
  809. package/skills/documents/docx/SKILL-zh.md +0 -590
  810. package/skills/documents/docx/SKILL.md +0 -590
  811. package/skills/documents/docx/scripts/__init__.py +0 -1
  812. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  813. package/skills/documents/docx/scripts/comment.py +0 -318
  814. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  815. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  816. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  817. package/skills/documents/docx/scripts/office/pack.py +0 -159
  818. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  819. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  820. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  821. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  822. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  823. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  824. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  825. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  826. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  827. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  828. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  829. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  830. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  831. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  832. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  833. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  834. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  835. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  836. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  837. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  838. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  839. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  840. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  841. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  842. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  843. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  844. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  845. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  846. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  847. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  848. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  849. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  850. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  851. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  852. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  853. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  854. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  855. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  856. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  857. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  858. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  859. package/skills/documents/docx/scripts/office/validate.py +0 -111
  860. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  861. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  862. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  863. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  864. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  865. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  866. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  867. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  868. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  869. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  870. package/skills/documents/pdf/LICENSE.txt +0 -30
  871. package/skills/documents/pdf/SKILL-zh.md +0 -314
  872. package/skills/documents/pdf/SKILL.md +0 -314
  873. package/skills/documents/pdf/forms.md +0 -294
  874. package/skills/documents/pdf/reference.md +0 -612
  875. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  876. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  877. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  878. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  879. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  880. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  881. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  882. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  883. package/skills/documents/pptx/LICENSE.txt +0 -30
  884. package/skills/documents/pptx/SKILL-zh.md +0 -232
  885. package/skills/documents/pptx/SKILL.md +0 -232
  886. package/skills/documents/pptx/editing.md +0 -205
  887. package/skills/documents/pptx/pptxgenjs.md +0 -420
  888. package/skills/documents/pptx/scripts/__init__.py +0 -0
  889. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  890. package/skills/documents/pptx/scripts/clean.py +0 -286
  891. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  892. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  893. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  894. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  895. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  896. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  897. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  898. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  899. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  900. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  901. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  902. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  903. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  904. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  905. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  906. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  907. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  908. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  909. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  910. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  911. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  912. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  913. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  914. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  915. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  916. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  917. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  918. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  919. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  920. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  921. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  922. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  923. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  924. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  925. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  926. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  927. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  928. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  929. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  930. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  931. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  932. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  933. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  934. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  935. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  936. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  937. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  938. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  939. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  940. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  941. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  942. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  943. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  944. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  945. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  946. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  947. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  948. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  949. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  950. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  951. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  952. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  953. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  954. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  955. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  956. package/skills/engineering/to-issues/SKILL.md +0 -81
  957. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  958. package/skills/engineering/to-prd/SKILL.md +0 -74
  959. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  960. package/skills/engineering/zoom-out/SKILL.md +0 -7
  961. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  962. package/skills/tools/github/SKILL-zh.md +0 -48
  963. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  964. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  965. package/skills/tools/internal-comms/SKILL.md +0 -32
  966. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  967. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  968. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  969. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  970. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  971. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  972. package/skills/tools/skill-creator/SKILL.md +0 -485
  973. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  974. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  975. package/skills/tools/skill-creator/agents/grader.md +0 -223
  976. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  977. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  978. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  979. package/skills/tools/skill-creator/references/schemas.md +0 -430
  980. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  981. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  982. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  983. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  984. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  985. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  986. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  987. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  988. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  989. package/skills/tools/summarize/SKILL-zh.md +0 -47
  990. package/skills/tools/weather/SKILL-zh.md +0 -46
  991. package/skills/tools/weather/SKILL.md +0 -46
  992. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
  993. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
  994. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
  995. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
@@ -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":";;AAcA,MAAM,uBAAuB;AAE7B,SAAgB,iCAAiC,SAAgC;CAC/E,MAAM,QAAQ,qBAAqB,KAAK,QAAQ,MAAM,CAAC;AACvD,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,MAAM,OAAO,SAAS,MAAM,IAAI,GAAG;AACzC,QAAO,OAAO,SAAS,IAAI,IAAI,MAAM,IAAI,MAAM;;AAGjD,SAAS,SAAS,OAAgD;AAChE,QAAO,SAAS,OAAO,UAAU,WAAY,QAAoC;;AAGnF,SAAS,YAAY,OAAoC;AACvD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,SAAS,aAAa,MAAc,MAAM,IAAY;CACpD,MAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACnD,KAAI,WAAW,UAAU,IAAK,QAAO;AACrC,QAAO,GAAG,WAAW,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC;;AAGhE,SAAS,eAAe,SAA0B;AAChD,QAAO,aAAa,YAAY,QAAQ,CAAC;;AAG3C,SAAS,YAAY,SAA0B;AAC7C,KAAI,OAAO,YAAY,SACrB,QAAO;AAET,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;CAET,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,OAAO,UAAU,UAAU;AAC7B,SAAM,KAAK,MAAM;AACjB;;EAEF,MAAM,MAAM,SAAS,MAAM;AAC3B,MAAI,CAAC,IAAK;EACV,MAAM,OAAO,YAAY,IAAI,KAAK;AAClC,MAAI,SAAS,OACX,OAAM,KAAK,YAAY,IAAI,KAAK,IAAI,GAAG;WAC9B,SAAS,WAClB,OAAM,KAAK,sBACT,YAAY,IAAI,KAAK,IAAI,YAAY,IAAI,SAAS,IAAI,QACtD,SAAS,IAAI,UAAU,IAAI,SAAS,IAAI,KAAK,IAAI,EAAE,CACpD,CAAC;WACO,SAAS,WAAW,SAAS,YACtC,OAAM,KAAK,UAAU;WACZ,KACT,OAAM,KAAK,IAAI,KAAK,GAAG;;AAG3B,QAAO,MAAM,OAAO,QAAQ,CAAC,KAAK,IAAI;;AAGxC,SAAS,sBAAsB,MAAc,MAAuC;CAClF,MAAM,OAAO,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,UAAU,IAAI;AACtE,KAAI,SAAS,UAAU,SAAS,aAAa;EAC3C,MAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,KAAA;EAC/D,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAA;EAC5D,IAAI,UAAU;AACd,MAAI,WAAW,KAAA,KAAa,UAAU,KAAA,GAAW;GAC/C,MAAM,QAAQ,UAAU;GACxB,MAAM,MAAM,UAAU,KAAA,IAAY,QAAQ,QAAQ,IAAI,KAAA;AACtD,cAAW,IAAI,QAAQ,QAAQ,KAAA,IAAY,IAAI,QAAQ;;AAEzD,SAAO,UAAU,WAAW,OAAO;;AAErC,KAAI,SAAS,WAAW,SAAS,aAAc,QAAO,WAAW,QAAQ,OAAO;AAChF,KAAI,SAAS,OAAQ,QAAO,UAAU,QAAQ,OAAO;AACrD,KAAI,SAAS,UAAU,SAAS,QAG9B,QAAO,UAAU,cAFE,YAAY,KAAK,QAAQ,IAAI,IACrB,QAAQ,WAAW,IAAI,CAAC,MACd,EAAE,GAAG,CAAC;AAE7C,KAAI,SAAS,OAEX,QAAO,WADS,YAAY,KAAK,QAAQ,IAAI,GACnB,OAAO,QAAQ,IAAI;AAE/C,KAAI,SAAS,OAEX,QAAO,UADS,YAAY,KAAK,QAAQ,IAAI,GACpB,MAAM,QAAQ,IAAI;AAE7C,KAAI,SAAS,KAAM,QAAO,QAAQ,QAAQ,IAAI;CAC9C,MAAM,WAAW,KAAK,UAAU,KAAK;AAErC,QAAO,IAAI,KAAK,IADM,SAAS,SAAS,KAAK,GAAG,SAAS,MAAM,GAAG,GAAG,CAAC,OAAO,SAC3C;;AAQpC,SAAS,wBAAwB,SAA2D;AAC1F,KAAI,CAAC,MAAM,QAAQ,QAAQ,CAAE,QAAO,EAAE;CACtC,MAAM,QAAiD,EAAE;AACzD,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,MAAM,SAAS,MAAM;AAC3B,MAAI,CAAC,OAAO,YAAY,IAAI,KAAK,KAAK,WAAY;EAClD,MAAM,KACJ,YAAY,IAAI,GAAG,IACnB,YAAY,IAAI,WAAW,IAC3B,YAAY,IAAI,aAAa,IAC7B,YAAY,IAAI,cAAc;AAChC,MAAI,CAAC,GAAI;EACT,MAAM,OAAO,YAAY,IAAI,KAAK,IAAI,YAAY,IAAI,SAAS,IAAI;AACnE,QAAM,KAAK;GACT;GACA;GACA,SAAS,sBAAsB,MAAM,SAAS,IAAI,UAAU,IAAI,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;GAC1F,CAAC;;AAEJ,QAAO;;AAGT,SAAS,cAAc,KAAkC;CACvD,MAAM,SAAS,SAAS,IAAI;AAC5B,QACE,YAAY,QAAQ,WAAW,IAC/B,YAAY,QAAQ,aAAa,IACjC,YAAY,QAAQ,cAAc;;AAItC,SAAS,aAAa,KAA8C;CAClE,MAAM,SAAS,SAAS,IAAI;AAC5B,QAAO,YAAY,QAAQ,UAAU,IAAI,YAAY,QAAQ,UAAU;;AAGzE,SAAS,aAAa,KAA2B;CAC/C,MAAM,OAAO,YAAa,IAA2B,KAAK,IAAI;AAC9D,KAAI,SAAS,UAAU,SAAS,aAC9B,QAAO,QAAQ,YAAa,IAA+B,SAAS,IAAI;AAE1E,QAAO;;AAGT,SAAS,WAAW,KAAkC;AACpD,KAAI,yBAAyB,IAAI,CAC/B,QAAO,aAAa,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;AAEjE,KAAI,uBAAuB,IAAI,CAC7B,QAAO,aAAa,IAAI,QAAQ,UAAU,IAAI,UAAU,gBAAgB;AAE1E,KAAI,0BAA0B,IAAI,EAAE;AAClC,MAAI,IAAI,SAAS,eACf,QAAO,aAAa,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,gBAAgB;AAE/F,MAAI,IAAI,SAAS,wBACf,QAAO,aAAa,IAAI,gBAAgB,aAAa,IAAI,kBAAkB,mBAAmB;AAEhG,SAAO,aAAa,IAAI,OAAO,UAAU,IAAI,SAAS,gBAAgB;;AAExE,KAAI,+BAA+B,IAAI,CACrC,QAAO,aAAa,IAAI,WAAW,OAAO;AAE5C,KAAI,+BAA+B,IAAI,EAAE;EACvC,MAAM,SAAS,SAAS,IAAI;EAC5B,MAAM,aAAa,YAAY,QAAQ,WAAW,IAAI;EACtD,MAAM,UAAU,eAAe,QAAQ,QAAQ;AAC/C,SAAO,aAAa,UAAU,GAAG,WAAW,IAAI,YAAY,WAAW;;AAEzE,KAAI,gCAAgC,IAAI,EAAE;AACxC,MAAI,IAAI,SAAS,gBACf,QAAO,aAAa,IAAI,WAAW,iBAAiB;AAEtD,SAAO,aAAa,IAAI,WAAW,wBAAwB;;CAE7D,MAAM,SAAS,SAAS,IAAI;AAC5B,KAAI,QAAQ,SAAS,aACnB,QAAO,aAAa,YAAY,OAAO,QAAQ,IAAI,wBAAwB;CAE7E,MAAM,UAAU,eAAe,QAAQ,QAAQ;AAC/C,KAAI,QAAQ,SAAS,eAAe,CAAC,SAAS;AAC5C,MAAI,OAAO,eAAe,UACxB,QAAO;EAET,MAAM,eAAe,YAAY,OAAO,aAAa;AACrD,MAAI,aACF,QAAO,aAAa,cAAc,GAAG;;AAGzC,QAAO;;AAGT,SAAS,eAAe,KAA8C;AACpE,KAAI,yBAAyB,IAAI,CAC/B,QAAO,IAAI;AAEb,KAAI,uBAAuB,IAAI,CAC7B,QAAO,IAAI;AAEb,KAAI,0BAA0B,IAAI,EAAE;AAClC,MAAI,IAAI,SAAS,eACf,QAAO,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAA;AAElE,MAAI,IAAI,SAAS,wBACf,QAAO,IAAI;AAEb,SAAO,IAAI;;AAEb,KAAI,+BAA+B,IAAI,CACrC,QAAO,IAAI;AAEb,KAAI,+BAA+B,IAAI,EAAE;EACvC,MAAM,SAAS,SAAS,IAAI;AAC5B,SAAO,YAAY,QAAQ,QAAQ,CAAC,MAAM,IAAI,YAAY,QAAQ,WAAW;;AAE/E,KAAI,gCAAgC,IAAI,CACtC,QAAO,IAAI;CAEb,MAAM,SAAS,SAAS,IAAI;AAC5B,KAAI,QAAQ,SAAS,aACnB,QAAO,YAAY,OAAO,QAAQ;CAEpC,MAAM,OAAO,YAAY,QAAQ,QAAQ,CAAC,MAAM;AAChD,QAAO,OAAO,OAAO,KAAA;;AAGvB,SAAgB,uBAAuB,MAAuD;CAC5F,MAAM,UAAoC,EAAE;CAC5C,MAAM,+BAAe,IAAI,KAAqC;CAC9D,MAAM,gCAAgB,IAAI,KAA8B;CACxD,MAAM,eAAgF,EAAE;CACxF,IAAI;CACJ,IAAI,OAAO;AAEX,MAAK,SAAS,KAAK,UAAU;EAC3B,MAAM,KAAK,OAAO,QAAQ;EAC1B,MAAM,SAAS,SAAS,IAAI;EAC5B,IAAI;EACJ,IAAI,QAAQ;EACZ,IAAI,QAAQ;EACZ,IAAI;EACJ,IAAI;AAEJ,MAAI,yBAAyB,IAAI,EAAE;AACjC,WAAQ;AACR,cAAW;AACX,WAAQ,gBAAgB,IAAI;aAClB,SAAS,IAAI,EAAE,SAAU,cAAc;AACjD,WAAQ;AACR,cAAW;AACX,WAAQ,gBAAgB,IAAI;aACnB,uBAAuB,IAAI,EAAE;AACtC,WAAQ,IAAI,QAAQ,SAAS,IAAI,UAAU;AAC3C,cAAW;AACX,WAAQ,gBAAgB,IAAI;AAC5B,OAAI,IAAI,SACN,cAAa,KAAK;IAChB,UAAU,IAAI;IACd,OAAO,IAAI;IACX,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY,KAAA;IAChE,CAAC;aAEK,0BAA0B,IAAI,EAAE;AACzC,WAAQ,IAAI;AACZ,cAAW;AACX,WAAQ,gBAAgB,IAAI;aACnB,+BAA+B,IAAI,EAAE;AAC9C,WAAQ;AACR,cAAW;AACX,WAAQ,gBAAgB,IAAI;aACnB,+BAA+B,IAAI,EAAE;AAC9C,WAAQ,UAAU,YAAY,QAAQ,WAAW,IAAI;AACrD,cAAW;AACX,WAAQ,gBAAgB,IAAI;aACnB,gCAAgC,IAAI,EAAE;AAC/C,WAAQ,IAAI,SAAS,kBAAkB,mBAAmB;AAC1D,cAAW;AACX,WAAQ,gBAAgB,IAAI;SACvB;GACL,MAAM,UAAU;AAChB,UAAO,YAAa,QAA+B,KAAK;AACxD,WAAQ,aAAa,QAAQ;AAC7B,OAAI,SAAS,UAAU,SAAS,cAAc;IAC5C,MAAM,aAAa,cAAc,IAAI;IACrC,MAAM,WAAW,aAAa,cAAc,IAAI,WAAW,GAAG,KAAA;AAC9D,QAAI,UAAU;AACZ,aAAQ,QAAQ,SAAS;AACzB,uBAAkB,SAAS;;;AAG/B,OAAI,SAAS,UAAU,CAAC,eAAe;AACrC,YAAQ;AACR,oBAAgB;AAChB,YAAQ;UACH;AACL,eAAW;AACX,YAAQ;;;EAIZ,MAAM,QAAgC;GACpC;GACA;GACA;GACA;GACA,SAAS,WAAW,IAAI;GACxB,aAAa,eAAe,IAAI;GAChC,WAAW,aAAa,IAAI;GAC7B;AACD,MAAI,SAAU,OAAM,WAAW;AAC/B,MAAI,KAAM,OAAM,OAAO;AACvB,MAAI,gBAAiB,OAAM,kBAAkB;AAC7C,UAAQ,KAAK,MAAM;AAEnB,eAAa,IAAI,IAAI,MAAM;EAC3B,MAAM,aAAa,YAAY,QAAQ,GAAG;AAC1C,MAAI,WACF,cAAa,IAAI,YAAY,MAAM;AAGrC,OAAK,MAAM,YAAY,wBAAwB,QAAQ,QAAQ,CAC7D,eAAc,IAAI,SAAS,IAAI;GAAE,MAAM,SAAS;GAAM,SAAS,SAAS;GAAS,CAAC;GAEpF;AAEF,MAAK,MAAM,UAAU,cAAc;EACjC,MAAM,SAAS,aAAa,IAAI,OAAO,SAAS;AAChD,MAAI,CAAC,OAAQ;AACb,MAAI,OAAO,OAAO,MAAM,EAAE;AACxB,UAAO,YAAY,OAAO,MAAM,MAAM;AACtC,UAAO,iBAAiB,OAAO;SAC1B;AACL,UAAO,OAAO;AACd,UAAO,OAAO;;;AAIlB,2BAA0B,QAAQ;AAElC,QAAO;;AAGT,SAAS,0BAA0B,SAAyC;CAC1E,MAAM,cAAc,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,uBAAuB,IAAI,QAAQ,GAAG,GAAG;AACzF,KAAI,CAAC,YAAa;CAElB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;AAC/D,aAAY,gBAAgB;CAC5B,IAAI,YAAgC,YAAY;AAChD,QAAO,WAAW;EAChB,MAAM,QAAQ,KAAK,IAAI,UAAU;AACjC,MAAI,CAAC,MAAO;AACZ,QAAM,iBAAiB;AACvB,cAAY,MAAM;;;AAItB,SAAS,uBAAuB,OAAwC;AACtE,KAAI,MAAM,UAAU,UAAW,QAAO;AACtC,KAAI,MAAM,UAAU,eAAgB,QAAO;AAC3C,KAAI,MAAM,UAAU,wBAAyB,QAAO;AACpD,KAAI,MAAM,UAAU,eAAgB,QAAO;AAC3C,KAAI,MAAM,MAAM,WAAW,SAAS,CAAE,QAAO;AAC7C,QAAO;;AAGT,SAAgB,+BACd,SACA,MAC0B;AAC1B,KAAI,SAAS,MAAO,QAAO;AAC3B,QAAO,QAAQ,QAAQ,UAAU;AAC/B,MAAI,CAAC,MAAM,iBAAiB,0BAA0B,MAAM,CAC1D,QAAO;AAET,MAAI,SAAS,YACX,QAAO,MAAM,SAAS;AAExB,MAAI,SAAS,eACX,QAAO,QAAQ,MAAM,UAAU;EAEjC,MAAM,SAAS,MAAM,SAAS,UAAU,MAAM,SAAS,gBAAgB,MAAM,MAAM,WAAW,QAAQ;EACtG,MAAM,gBACJ,MAAM,UAAU,aAChB,MAAM,UAAU,kBAChB,MAAM,UAAU,2BAChB,MAAM,UAAU,kBAChB,MAAM,MAAM,WAAW,UAAU,IACjC,MAAM,MAAM,WAAW,SAAS;AAClC,MAAI,SAAS,WACX,QAAO,CAAC,UAAU,CAAC;AAErB,SAAO,CAAC;GACR;;AAGJ,SAAS,0BAA0B,OAAwC;AACzE,KAAI,MAAM,SAAS,YAAa,QAAO;CACvC,MAAM,UAAU,MAAM,SAAS,MAAM;AACrC,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,uBAAuB,KAAK,QAAQ;;AAG7C,SAAgB,wCAAwC,OAAuC;CAC7F,MAAM,UAAU,MAAM,SAAS,MAAM;CACrC,MAAM,kBAAkB,MAAM,iBAAiB,MAAM;CACrD,MAAM,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM;AACzC,KAAI,CAAC,SAAS;AACZ,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,UAAU,SAAS,gBAAgB,MAAM,MAAM,WAAW,QAAQ,CAC7E,QAAO,IAAI,mCAAmC,MAAM,MAAM,CAAC;AAE7D,SAAO,MAAM;;AAEf,KAAI,SAAS,UAAU,SAAS,YAC9B,QAAO,GAAG,KAAK,IAAI;AAErB,KAAI,SAAS,mBAAmB,MAAM,UAAU,gBAC9C,QAAO,WAAW;AAEpB,KAAI,SAAS,UAAU,SAAS,gBAAgB,MAAM,MAAM,WAAW,QAAQ,EAAE;AAC/E,MAAI,gBAAiB,QAAO;AAC5B,SAAO,IAAI,mCAAmC,MAAM,MAAM,CAAC;;AAE7D,KAAI,MAAM,UAAU,eAElB,QAAO,WADO,QAAQ,SAAS,IAAI,GAAI,QAAQ,MAAM,IAAI,CAAC,KAAK,IAAI,UAAW,QACtD;AAE1B,KAAI,MAAM,UAAU,wBAClB,QAAO,IAAI,QAAQ;AAErB,KAAI,MAAM,UAAU,eAClB,QAAO,IAAI,QAAQ;AAErB,KAAI,MAAM,MAAM,WAAW,SAAS,CAClC,QAAO,IAAI,QAAQ;AAErB,KAAI,MAAM,UAAU,aAClB,QAAO,gBAAgB,QAAQ;AAEjC,KAAI,MAAM,UAAU,iBAClB,QAAO,qBAAqB;AAE9B,KAAI,MAAM,MAAM,WAAW,UAAU,CACnC,QAAO,IAAI,MAAM,MAAM,GAAG,UAAU,KAAK,YAAY;AAEvD,QAAO,GAAG,MAAM,MAAM,IAAI;;AAG5B,SAAS,mCAAmC,OAAuB;AACjE,QAAO,MAAM,WAAW,QAAQ,GAAG,MAAM,MAAM,EAAe,IAAI,SAAS"}
@@ -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"}