@xopcai/xopc 0.0.117 → 0.0.119

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 (590) hide show
  1. package/README.md +26 -24
  2. package/README.zh-CN.md +46 -42
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BBLhJ2C6.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
  8. package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
  9. package/dist/gateway/static/root/assets/{apps-page-DdDx0V4z.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-DZsVqMhU.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CIol6JWX.js → attachment-load-CaCMWh1D.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-B3UauMfp.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-2HJoFchH.js → block-editor-DJRWwWNI.js} +6 -6
  16. package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
  17. package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
  19. package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
  21. package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
  22. package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
  23. package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
  24. package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
  25. package/dist/gateway/static/root/assets/{extension-debug-page-DX5WRE_t.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-Buah7Bw-.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-DuroLVnf.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B5zdl27C.js → fetch-Y7AEX4H3.js} +1 -1
  29. package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-config-api-gT4ZhE7h.js → gateway-config-api-RbMmAOpX.js} +1 -1
  31. package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
  32. package/dist/gateway/static/root/assets/{gateway-startup-retry-B3kL8KGY.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
  33. package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
  34. package/dist/gateway/static/root/assets/{goals-config-api-AR-fVh0P.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-Cpb21ezg.js → goals-page-CS0R-Af2.js} +2 -2
  36. package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
  37. package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
  38. package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
  39. package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
  40. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-DefCgF4o.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-ChbR9LGO.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-B82oP80n.js → media-plugins-SFPQRSxq.js} +1 -1
  44. package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
  45. package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
  46. package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
  47. package/dist/gateway/static/root/assets/{note-image-lightbox-CDknITM3.js → note-image-lightbox-BUYURRgn.js} +1 -1
  48. package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
  49. package/dist/gateway/static/root/assets/{preview-open-alternatives-DV3xQsWB.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
  50. package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-BODCXnvY.js → save-bar-controls-CefkOlRg.js} +1 -1
  52. package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
  53. package/dist/gateway/static/root/assets/{schema-form-qtfEI6QM.js → schema-form-FMKv1vGu.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-BHZKjVcS.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-5i35D-J1.js → settings-form-section-D-4lBl6X.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
  60. package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
  61. package/dist/gateway/static/root/assets/{share-preview-page-B0H63tDv.js → share-preview-page-BDy2btRN.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
  65. package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
  66. package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-BCjP_VHb.js → use-channel-catalog-CjN-51e6.js} +1 -1
  68. package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
  69. package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
  70. package/dist/gateway/static/root/assets/voice-api-key-field-CeEevm7z.js +1 -0
  71. package/dist/gateway/static/root/assets/{voice-player-store-BlF9V05n.js → voice-player-store-B7ykUlHM.js} +1 -1
  72. package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
  73. package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
  74. package/dist/gateway/static/root/index.html +6 -7
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +4 -5
  77. package/dist/src/agent/agent-manager.js +6 -9
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/agent-scope.js +0 -2
  80. package/dist/src/agent/agent-scope.js.map +1 -1
  81. package/dist/src/agent/background-review/prompts.d.ts +2 -2
  82. package/dist/src/agent/background-review/prompts.js +2 -2
  83. package/dist/src/agent/background-review/prompts.js.map +1 -1
  84. package/dist/src/agent/background-review/settings.d.ts +1 -1
  85. package/dist/src/agent/background-review/settings.js +7 -8
  86. package/dist/src/agent/background-review/settings.js.map +1 -1
  87. package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +1 -0
  88. package/dist/src/agent/bootstrap/bootstrap-cache.js +4 -3
  89. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  90. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +4 -0
  91. package/dist/src/agent/bootstrap/bootstrap-files.js +4 -3
  92. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  93. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +4 -2
  94. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  95. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +2 -1
  96. package/dist/src/agent/bootstrap/load-bootstrap-files.js +17 -16
  97. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  98. package/dist/src/agent/bootstrap/types.d.ts +1 -1
  99. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  100. package/dist/src/agent/context/workspace.d.ts +4 -2
  101. package/dist/src/agent/context/workspace.js +5 -4
  102. package/dist/src/agent/context/workspace.js.map +1 -1
  103. package/dist/src/agent/embedded/run-for-session.js +106 -15
  104. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  105. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  106. package/dist/src/agent/fallback/candidates.js +10 -11
  107. package/dist/src/agent/fallback/candidates.js.map +1 -1
  108. package/dist/src/agent/index.js +1 -1
  109. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  110. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  111. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  112. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  113. package/dist/src/agent/lifecycle/progress.js +1 -6
  114. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  115. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  116. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  117. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  118. package/dist/src/agent/memory/builtin-memory-store.d.ts +4 -2
  119. package/dist/src/agent/memory/builtin-memory-store.js +11 -6
  120. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  121. package/dist/src/agent/memory/builtin-provider.js +36 -7
  122. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  123. package/dist/src/agent/memory/candidate-extractor.d.ts +6 -0
  124. package/dist/src/agent/memory/candidate-extractor.js +60 -0
  125. package/dist/src/agent/memory/candidate-extractor.js.map +1 -0
  126. package/dist/src/agent/memory/manager.d.ts +2 -1
  127. package/dist/src/agent/memory/manager.js +27 -3
  128. package/dist/src/agent/memory/manager.js.map +1 -1
  129. package/dist/src/agent/memory/memory-config.js +3 -0
  130. package/dist/src/agent/memory/memory-config.js.map +1 -1
  131. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -1
  132. package/dist/src/agent/memory/types.d.ts +27 -4
  133. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  134. package/dist/src/agent/middleware/self-verify.js +0 -2
  135. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  136. package/dist/src/agent/models/index.d.ts +1 -1
  137. package/dist/src/agent/models/manager.d.ts +4 -20
  138. package/dist/src/agent/models/manager.js +9 -126
  139. package/dist/src/agent/models/manager.js.map +1 -1
  140. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  141. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  142. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  143. package/dist/src/agent/prompt/memory/index.d.ts +4 -2
  144. package/dist/src/agent/prompt/memory/index.js +18 -12
  145. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  146. package/dist/src/agent/prompt/sections/memory-skills.js +1 -1
  147. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
  148. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  149. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  150. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  151. package/dist/src/agent/prompt/service-prompt-builder.js +4 -31
  152. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  153. package/dist/src/agent/prompt/subagent-context.js +1 -1
  154. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  155. package/dist/src/agent/prompt/types.d.ts +1 -1
  156. package/dist/src/agent/reply/post-compaction-context.js +1 -3
  157. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  158. package/dist/src/agent/reply/startup-context.js +1 -5
  159. package/dist/src/agent/reply/startup-context.js.map +1 -1
  160. package/dist/src/agent/service.d.ts +4 -12
  161. package/dist/src/agent/service.js +10 -48
  162. package/dist/src/agent/service.js.map +1 -1
  163. package/dist/src/agent/service.types.d.ts +2 -2
  164. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  165. package/dist/src/agent/session/session-config-service.js +14 -14
  166. package/dist/src/agent/session/session-config-service.js.map +1 -1
  167. package/dist/src/agent/session/session-inspector.js +3 -2
  168. package/dist/src/agent/session/session-inspector.js.map +1 -1
  169. package/dist/src/agent/starter-agents.js +12 -12
  170. package/dist/src/agent/starter-agents.js.map +1 -1
  171. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  172. package/dist/src/agent/tools/automation-tool.js +102 -0
  173. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  174. package/dist/src/agent/tools/curated-memory-tool.js +57 -2
  175. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  176. package/dist/src/agent/tools/delegate-tool.js +1 -1
  177. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  178. package/dist/src/agent/tools/factory.d.ts +3 -3
  179. package/dist/src/agent/tools/factory.js +2 -2
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/web-extract.js +6 -8
  184. package/dist/src/agent/tools/web-extract.js.map +1 -1
  185. package/dist/src/agent-manifest/index.js +2 -2
  186. package/dist/src/agent-manifest/resolver.d.ts +4 -2
  187. package/dist/src/agent-manifest/resolver.js +6 -3
  188. package/dist/src/agent-manifest/resolver.js.map +1 -1
  189. package/dist/src/agent-manifest/schema.d.ts +238 -0
  190. package/dist/src/agent-manifest/schema.js +16 -5
  191. package/dist/src/agent-manifest/schema.js.map +1 -1
  192. package/dist/src/agent-manifest/validator.d.ts +3 -2
  193. package/dist/src/agent-manifest/validator.js +2 -1
  194. package/dist/src/agent-manifest/validator.js.map +1 -1
  195. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  196. package/dist/src/ai-assist/text-assist.js +56 -0
  197. package/dist/src/ai-assist/text-assist.js.map +1 -1
  198. package/dist/src/auth/profiles/store.js.map +1 -1
  199. package/dist/src/automations/api/routes.d.ts +3 -0
  200. package/dist/src/automations/api/routes.js +193 -0
  201. package/dist/src/automations/api/routes.js.map +1 -0
  202. package/dist/src/automations/domain/index.d.ts +3 -0
  203. package/dist/src/automations/domain/index.js +3 -0
  204. package/dist/src/automations/domain/schedule.d.ts +4 -0
  205. package/dist/src/automations/domain/schedule.js +37 -0
  206. package/dist/src/automations/domain/schedule.js.map +1 -0
  207. package/dist/src/automations/domain/types.d.ts +160 -0
  208. package/dist/src/automations/domain/validation.d.ts +370 -0
  209. package/dist/src/automations/domain/validation.js +149 -0
  210. package/dist/src/automations/domain/validation.js.map +1 -0
  211. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  212. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  213. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  214. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  215. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  216. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  217. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  218. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  219. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  220. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  221. package/dist/src/automations/draft/index.d.ts +3 -0
  222. package/dist/src/automations/draft/index.js +3 -0
  223. package/dist/src/automations/index.d.ts +3 -0
  224. package/dist/src/automations/index.js +8 -0
  225. package/dist/src/automations/product-events.d.ts +5 -0
  226. package/dist/src/automations/product-events.js +21 -0
  227. package/dist/src/automations/product-events.js.map +1 -0
  228. package/dist/src/automations/service/action-executor.d.ts +9 -0
  229. package/dist/src/automations/service/action-executor.js +157 -0
  230. package/dist/src/automations/service/action-executor.js.map +1 -0
  231. package/dist/src/automations/service/automation-service.d.ts +54 -0
  232. package/dist/src/automations/service/automation-service.js +404 -0
  233. package/dist/src/automations/service/automation-service.js.map +1 -0
  234. package/dist/src/automations/service/index.d.ts +2 -0
  235. package/dist/src/automations/service/index.js +3 -0
  236. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  237. package/dist/src/automations/storage/automation-repository.js +61 -0
  238. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  239. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  240. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  241. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  242. package/dist/src/automations/storage/index.d.ts +2 -0
  243. package/dist/src/automations/storage/index.js +3 -0
  244. package/dist/src/channels/pipeline.d.ts +1 -1
  245. package/dist/src/channels/pipeline.js.map +1 -1
  246. package/dist/src/channels/plugin-types.d.ts +3 -0
  247. package/dist/src/chat-commands/agent-edit.js +0 -1
  248. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  249. package/dist/src/chat-commands/builtins/model.js +2 -2
  250. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  251. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  252. package/dist/src/cli/command-catalog.js +0 -39
  253. package/dist/src/cli/command-catalog.js.map +1 -1
  254. package/dist/src/cli/command-loaders.js +0 -1
  255. package/dist/src/cli/command-loaders.js.map +1 -1
  256. package/dist/src/cli/command-manifest.d.ts +1 -1
  257. package/dist/src/cli/command-manifest.js +1 -5
  258. package/dist/src/cli/command-manifest.js.map +1 -1
  259. package/dist/src/cli/commands/agents.js +7 -6
  260. package/dist/src/cli/commands/agents.js.map +1 -1
  261. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  262. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  263. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  264. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  265. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -0
  266. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/workspace-status.js +0 -1
  268. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  269. package/dist/src/cli/commands/doctor/flow.js +2 -2
  270. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  271. package/dist/src/cli/commands/gateway/call.js +2 -2
  272. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  273. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  274. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  275. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  276. package/dist/src/cli/commands/init.js +33 -14
  277. package/dist/src/cli/commands/init.js.map +1 -1
  278. package/dist/src/cli/commands/models.js +13 -31
  279. package/dist/src/cli/commands/models.js.map +1 -1
  280. package/dist/src/cli/commands/onboard/model.js +17 -10
  281. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  282. package/dist/src/cli/commands/onboard.js +2 -2
  283. package/dist/src/cli/commands/onboard.js.map +1 -1
  284. package/dist/src/cli/commands/tui.js +26 -4
  285. package/dist/src/cli/commands/tui.js.map +1 -1
  286. package/dist/src/cli/index.d.ts +1 -0
  287. package/dist/src/cli/index.js +10 -5
  288. package/dist/src/cli/index.js.map +1 -1
  289. package/dist/src/cli/registry.js +1 -1
  290. package/dist/src/cli/registry.js.map +1 -1
  291. package/dist/src/cli/templates.d.ts +1 -1
  292. package/dist/src/cli/templates.js +1 -11
  293. package/dist/src/cli/templates.js.map +1 -1
  294. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  295. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  296. package/dist/src/commands/agents.config.d.ts +9 -0
  297. package/dist/src/commands/agents.config.js +42 -12
  298. package/dist/src/commands/agents.config.js.map +1 -1
  299. package/dist/src/config/agent-profile.js +5 -3
  300. package/dist/src/config/agent-profile.js.map +1 -1
  301. package/dist/src/config/agent-typed-models.js +3 -5
  302. package/dist/src/config/agent-typed-models.js.map +1 -1
  303. package/dist/src/config/config-surface.d.ts +3 -0
  304. package/dist/src/config/index.d.ts +0 -1
  305. package/dist/src/config/index.js +3 -3
  306. package/dist/src/config/index.js.map +1 -1
  307. package/dist/src/config/paths.d.ts +8 -10
  308. package/dist/src/config/paths.js +16 -16
  309. package/dist/src/config/paths.js.map +1 -1
  310. package/dist/src/config/profile.js +0 -1
  311. package/dist/src/config/profile.js.map +1 -1
  312. package/dist/src/config/rules.js +0 -5
  313. package/dist/src/config/rules.js.map +1 -1
  314. package/dist/src/config/schema.d.ts +45 -44
  315. package/dist/src/config/schema.js +68 -52
  316. package/dist/src/config/schema.js.map +1 -1
  317. package/dist/src/config/web-patch.d.ts +0 -12
  318. package/dist/src/config/web-patch.js +2 -29
  319. package/dist/src/config/web-patch.js.map +1 -1
  320. package/dist/src/extensions/api.d.ts +2 -0
  321. package/dist/src/extensions/api.js +10 -0
  322. package/dist/src/extensions/api.js.map +1 -1
  323. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  324. package/dist/src/extensions/extension-registry-impl.js +8 -0
  325. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  326. package/dist/src/extensions/loader.d.ts +3 -3
  327. package/dist/src/extensions/loader.js +3 -3
  328. package/dist/src/extensions/loader.js.map +1 -1
  329. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  330. package/dist/src/extensions/sdk/testing.js +7 -0
  331. package/dist/src/extensions/sdk/testing.js.map +1 -1
  332. package/dist/src/extensions/types/core.d.ts +10 -1
  333. package/dist/src/extensions/types/index.d.ts +1 -1
  334. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  335. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  336. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  337. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  338. package/dist/src/gateway/agents-admin.d.ts +8 -0
  339. package/dist/src/gateway/agents-admin.js +63 -34
  340. package/dist/src/gateway/agents-admin.js.map +1 -1
  341. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  342. package/dist/src/gateway/capability-presets-admin.js +19 -10
  343. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  344. package/dist/src/gateway/chat-stream/mapper.js +9 -2
  345. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  346. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  347. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  348. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  349. package/dist/src/gateway/global-defaults-admin.d.ts +36 -0
  350. package/dist/src/gateway/global-defaults-admin.js +146 -0
  351. package/dist/src/gateway/global-defaults-admin.js.map +1 -0
  352. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  353. package/dist/src/gateway/heartbeat/service.js +0 -7
  354. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  355. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  356. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  357. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/agents.js +33 -1
  359. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  360. package/dist/src/gateway/hono/routes/commands-skills.js +4 -5
  361. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  362. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  363. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  364. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  365. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  366. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  367. package/dist/src/gateway/hono/routes/global-defaults.d.ts +3 -0
  368. package/dist/src/gateway/hono/routes/global-defaults.js +61 -0
  369. package/dist/src/gateway/hono/routes/global-defaults.js.map +1 -0
  370. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  371. package/dist/src/gateway/hono/routes/home.js +34 -25
  372. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  373. package/dist/src/gateway/hono/routes/lazy-bundles.js +21 -9
  374. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  375. package/dist/src/gateway/hono/routes/memory.js +75 -4
  376. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  377. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  378. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  379. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  380. package/dist/src/gateway/hono/routes/models.js +1 -1
  381. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  382. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  383. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  384. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  385. package/dist/src/gateway/run-loop.js +2 -0
  386. package/dist/src/gateway/run-loop.js.map +1 -1
  387. package/dist/src/gateway/security/operator-scopes.js +5 -1
  388. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  389. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  390. package/dist/src/gateway/service/config-coordinator.js +14 -8
  391. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  392. package/dist/src/gateway/service/marketplace-service.d.ts +4 -4
  393. package/dist/src/gateway/service/marketplace-service.js +11 -7
  394. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  395. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  396. package/dist/src/gateway/service/sessions-api.js +6 -1
  397. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  398. package/dist/src/gateway/service.d.ts +7 -3
  399. package/dist/src/gateway/service.js +61 -27
  400. package/dist/src/gateway/service.js.map +1 -1
  401. package/dist/src/goals/goal-service.js +45 -4
  402. package/dist/src/goals/goal-service.js.map +1 -1
  403. package/dist/src/infra/update-restart.js +1 -1
  404. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  405. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  406. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  407. package/dist/src/migrations/index.d.ts +4 -0
  408. package/dist/src/migrations/index.js +4 -0
  409. package/dist/src/migrations/registry.d.ts +8 -0
  410. package/dist/src/migrations/registry.js +18 -0
  411. package/dist/src/migrations/registry.js.map +1 -0
  412. package/dist/src/migrations/runner.d.ts +17 -0
  413. package/dist/src/migrations/runner.js +191 -0
  414. package/dist/src/migrations/runner.js.map +1 -0
  415. package/dist/src/migrations/types.d.ts +34 -0
  416. package/dist/src/notes/service.js +27 -2
  417. package/dist/src/notes/service.js.map +1 -1
  418. package/dist/src/providers/index.d.ts +4 -5
  419. package/dist/src/providers/index.js +16 -16
  420. package/dist/src/providers/index.js.map +1 -1
  421. package/dist/src/providers/model-registry.d.ts +0 -1
  422. package/dist/src/providers/model-registry.js +0 -3
  423. package/dist/src/providers/model-registry.js.map +1 -1
  424. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  425. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  426. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  427. package/dist/src/session/session-workspace.js +2 -7
  428. package/dist/src/session/session-workspace.js.map +1 -1
  429. package/dist/src/session/store.js +0 -5
  430. package/dist/src/session/store.js.map +1 -1
  431. package/dist/src/session/transcript-outline.d.ts +47 -0
  432. package/dist/src/session/transcript-outline.js +481 -0
  433. package/dist/src/session/transcript-outline.js.map +1 -0
  434. package/dist/src/storage/sqlite/index.d.ts +1 -3
  435. package/dist/src/storage/sqlite/index.js +2 -4
  436. package/dist/src/storage/sqlite/memory-index-repository.d.ts +1 -0
  437. package/dist/src/storage/sqlite/memory-index-repository.js +15 -14
  438. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  439. package/dist/src/storage/sqlite/memory-records-repository.d.ts +44 -1
  440. package/dist/src/storage/sqlite/memory-records-repository.js +164 -20
  441. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  442. package/dist/src/storage/sqlite/migrations/014_memory_record_governance.sql +10 -0
  443. package/dist/src/storage/sqlite/migrations/015_memory_trace_feedback.sql +4 -0
  444. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  445. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  446. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  447. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  448. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  449. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  450. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  451. package/dist/src/storage/sqlite/schema.js +1 -1
  452. package/dist/src/storage/sqlite/schema.sql +56 -46
  453. package/dist/src/tui/backends/embedded-backend.d.ts +9 -0
  454. package/dist/src/tui/backends/embedded-backend.js +55 -27
  455. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  456. package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -0
  457. package/dist/src/tui/backends/gateway-sse-backend.js +30 -3
  458. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  459. package/dist/src/tui/components/tui-header.d.ts +0 -1
  460. package/dist/src/tui/components/tui-header.js +3 -8
  461. package/dist/src/tui/components/tui-header.js.map +1 -1
  462. package/dist/src/tui/tui-backend.d.ts +4 -0
  463. package/dist/src/tui/tui-commands.d.ts +5 -0
  464. package/dist/src/tui/tui-commands.js +43 -0
  465. package/dist/src/tui/tui-commands.js.map +1 -1
  466. package/dist/src/tui/tui-startup-resources.js +2 -1
  467. package/dist/src/tui/tui-startup-resources.js.map +1 -1
  468. package/dist/src/tui/tui-startup-text.js +12 -12
  469. package/dist/src/tui/tui-startup-text.js.map +1 -1
  470. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  471. package/dist/src/tui/tui-transcript-tree.js +17 -257
  472. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  473. package/dist/src/tui/tui-types.d.ts +2 -0
  474. package/dist/src/tui/tui-types.js.map +1 -1
  475. package/dist/src/tui/tui.js +11 -3
  476. package/dist/src/tui/tui.js.map +1 -1
  477. package/dist/src/workflows/domain/index.js +1 -1
  478. package/dist/src/workflows/domain/run.d.ts +7 -7
  479. package/dist/src/workflows/domain/run.js.map +1 -1
  480. package/dist/src/workflows/index.js +2 -2
  481. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  482. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  483. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  484. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  485. package/package.json +4 -2
  486. package/dist/gateway/static/root/assets/agents-C6xgagZd.js +0 -71
  487. package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +0 -1
  488. package/dist/gateway/static/root/assets/appearance-settings-CGcc54yj.js +0 -1
  489. package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +0 -8
  490. package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +0 -1
  491. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +0 -1
  492. package/dist/gateway/static/root/assets/channels-settings-BYyRzsex.js +0 -1
  493. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  494. package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +0 -2
  495. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  496. package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +0 -1
  497. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  498. package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +0 -3
  499. package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +0 -1
  500. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  501. package/dist/gateway/static/root/assets/format-interval-label-Dn_QKIqb.js +0 -1
  502. package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +0 -1
  503. package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +0 -1
  504. package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +0 -1
  505. package/dist/gateway/static/root/assets/heartbeat-config-api-D7bKFEeO.js +0 -1
  506. package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +0 -1
  507. package/dist/gateway/static/root/assets/index-CwhK8qCh.js +0 -122
  508. package/dist/gateway/static/root/assets/index-CyfhARL-.css +0 -1
  509. package/dist/gateway/static/root/assets/interval-presets-0DtsnxE0.js +0 -1
  510. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BPREtN8B.js +0 -1
  511. package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +0 -3
  512. package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +0 -2
  513. package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +0 -2
  514. package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +0 -1
  515. package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +0 -1
  516. package/dist/gateway/static/root/assets/schedule-field-CgJSCD3B.js +0 -1
  517. package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +0 -1
  518. package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +0 -1
  519. package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +0 -1
  520. package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +0 -1
  521. package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +0 -1
  522. package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +0 -1
  523. package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +0 -2
  524. package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +0 -1
  525. package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +0 -1
  526. package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +0 -1
  527. package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +0 -18
  528. package/dist/src/agent/context/workspace-templates/USER.md +0 -24
  529. package/dist/src/agent/fallback/error.d.ts +0 -22
  530. package/dist/src/agent/fallback/error.js +0 -32
  531. package/dist/src/agent/fallback/error.js.map +0 -1
  532. package/dist/src/agent/fallback/index.d.ts +0 -5
  533. package/dist/src/agent/fallback/index.js +0 -9
  534. package/dist/src/agent/fallback/index.js.map +0 -1
  535. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  536. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  537. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  538. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  539. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  540. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  541. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  542. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  543. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  544. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  545. package/dist/src/cli/commands/cron-cli.js +0 -15
  546. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  547. package/dist/src/cli/commands/cron.d.ts +0 -4
  548. package/dist/src/cli/commands/cron.js +0 -188
  549. package/dist/src/cli/commands/cron.js.map +0 -1
  550. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  551. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  552. package/dist/src/cron/execution-types.d.ts +0 -42
  553. package/dist/src/cron/executor.d.ts +0 -67
  554. package/dist/src/cron/executor.js +0 -669
  555. package/dist/src/cron/executor.js.map +0 -1
  556. package/dist/src/cron/index.d.ts +0 -7
  557. package/dist/src/cron/index.js +0 -7
  558. package/dist/src/cron/job-content.d.ts +0 -5
  559. package/dist/src/cron/job-content.js +0 -15
  560. package/dist/src/cron/job-content.js.map +0 -1
  561. package/dist/src/cron/run-log-store.d.ts +0 -12
  562. package/dist/src/cron/run-log-store.js +0 -58
  563. package/dist/src/cron/run-log-store.js.map +0 -1
  564. package/dist/src/cron/schedule.d.ts +0 -10
  565. package/dist/src/cron/schedule.js +0 -85
  566. package/dist/src/cron/schedule.js.map +0 -1
  567. package/dist/src/cron/service.d.ts +0 -58
  568. package/dist/src/cron/service.js +0 -419
  569. package/dist/src/cron/service.js.map +0 -1
  570. package/dist/src/cron/types.d.ts +0 -183
  571. package/dist/src/cron/validation.d.ts +0 -500
  572. package/dist/src/cron/validation.js +0 -192
  573. package/dist/src/cron/validation.js.map +0 -1
  574. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  575. package/dist/src/cron/workflow-run-completion.js +0 -72
  576. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  577. package/dist/src/extensions/types/phase4.js +0 -1
  578. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  579. package/dist/src/gateway/hono/routes/cron.js +0 -109
  580. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  581. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  582. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  583. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  584. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  585. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  586. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  587. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  588. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  589. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  590. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -1,4 +1,4 @@
1
- import { isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry } from "../session/session-context-for-llm.js";
1
+ import { buildTranscriptOutline } from "../session/transcript-outline.js";
2
2
  //#region src/tui/tui-transcript-tree.ts
3
3
  const TRANSCRIPT_ROW_ID_RE = /^row-(\d+)$/;
4
4
  function transcriptTreeEntryIdToRowNumber(entryId) {
@@ -7,263 +7,23 @@ function transcriptTreeEntryIdToRowNumber(entryId) {
7
7
  const row = Number.parseInt(match[1], 10);
8
8
  return Number.isFinite(row) && row > 0 ? row : null;
9
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
10
  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;
11
+ return buildTranscriptOutline(rows).map((entry) => ({
12
+ id: entry.id,
13
+ ...entry.parentId ? { parentId: entry.parentId } : {},
14
+ depth: entry.depth,
15
+ label: entry.label,
16
+ ...entry.role ? { role: entry.role } : {},
17
+ ...entry.userLabel ? { userLabel: entry.userLabel } : {},
18
+ ...entry.labelTimestamp ? { labelTimestamp: entry.labelTimestamp } : {},
19
+ turn: entry.turn,
20
+ ...entry.preview ? { preview: entry.preview } : {},
21
+ ...entry.contentText ? { contentText: entry.contentText } : {},
22
+ ...entry.toolCallPreview ? { toolCallPreview: entry.toolCallPreview } : {},
23
+ ...entry.createdAt ? { createdAt: entry.createdAt } : {},
24
+ ...entry.isOnActivePath ? { isOnActivePath: entry.isOnActivePath } : {},
25
+ ...entry.isCurrentLeaf ? { isCurrentLeaf: entry.isCurrentLeaf } : {}
26
+ }));
267
27
  }
268
28
  function filterTuiTranscriptTreeEntries(entries, mode) {
269
29
  if (mode === "all") return entries;
@@ -1 +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"}
1
+ {"version":3,"file":"tui-transcript-tree.js","names":[],"sources":["../../../src/tui/tui-transcript-tree.ts"],"sourcesContent":["import type { TranscriptStoredRow } from '../session/session-context-for-llm.js';\nimport { buildTranscriptOutline } from '../session/transcript-outline.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\nexport function buildTuiTranscriptTree(rows: TranscriptStoredRow[]): TuiTranscriptTreeEntry[] {\n return buildTranscriptOutline(rows).map((entry) => ({\n id: entry.id,\n ...(entry.parentId ? { parentId: entry.parentId } : {}),\n depth: entry.depth,\n label: entry.label,\n ...(entry.role ? { role: entry.role } : {}),\n ...(entry.userLabel ? { userLabel: entry.userLabel } : {}),\n ...(entry.labelTimestamp ? { labelTimestamp: entry.labelTimestamp } : {}),\n turn: entry.turn,\n ...(entry.preview ? { preview: entry.preview } : {}),\n ...(entry.contentText ? { contentText: entry.contentText } : {}),\n ...(entry.toolCallPreview ? { toolCallPreview: entry.toolCallPreview } : {}),\n ...(entry.createdAt ? { createdAt: entry.createdAt } : {}),\n ...(entry.isOnActivePath ? { isOnActivePath: entry.isOnActivePath } : {}),\n ...(entry.isCurrentLeaf ? { isCurrentLeaf: entry.isCurrentLeaf } : {}),\n }));\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":";;AAKA,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,SAAgB,uBAAuB,MAAuD;AAC5F,QAAO,uBAAuB,KAAK,CAAC,KAAK,WAAW;EAClD,IAAI,MAAM;EACV,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,UAAU,GAAG,EAAE;EACtD,OAAO,MAAM;EACb,OAAO,MAAM;EACb,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;EAC1C,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,WAAW,GAAG,EAAE;EACzD,GAAI,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,gBAAgB,GAAG,EAAE;EACxE,MAAM,MAAM;EACZ,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,SAAS,GAAG,EAAE;EACnD,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,aAAa,GAAG,EAAE;EAC/D,GAAI,MAAM,kBAAkB,EAAE,iBAAiB,MAAM,iBAAiB,GAAG,EAAE;EAC3E,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,WAAW,GAAG,EAAE;EACzD,GAAI,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,gBAAgB,GAAG,EAAE;EACxE,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,eAAe,GAAG,EAAE;EACtE,EAAE;;AAGL,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"}
@@ -6,6 +6,8 @@ export interface TuiOptions {
6
6
  token?: string;
7
7
  /** Session key to resume. */
8
8
  session?: string;
9
+ /** Agent id for a fresh TUI session. */
10
+ agentId?: string;
9
11
  /** Thinking level override. */
10
12
  thinking?: string;
11
13
  /** Single message to send on start, then stay open. */
@@ -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 /** 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"}
1
+ {"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Agent id for a fresh TUI session. */\n agentId?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Workspace directory for the new TUI session. */\n workdir?: string;\n /** Use the launch directory as the new TUI session workspace when no workdir is set. */\n useStartupCwd?: boolean;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */\n theme?: string;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running'\n | 'compacting'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';\n\nexport type TuiRunPhase =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'tool'\n | 'progress'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport interface TuiRunStatus {\n phase: TuiRunPhase;\n runId: string | null;\n directStreamRunId: string | null;\n lastCompletedRunId: string | null;\n source: TuiEventSource;\n lastEvent: string | null;\n lastActivityAt: number | null;\n stalledAt: number | null;\n recoveredAt: number | null;\n}\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n reasoningLevel?: string;\n verboseLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\n effectiveWorkspacePath?: string;\n workingDirectoryLocked?: boolean;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n runStatus: TuiRunStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */\n messageFollowUpQueue: string[];\n /** Queued Enter-while-busy steering messages after the first in-flight steer. */\n steeringQueue: string[];\n /** Ctrl+P cycle filter; `null` = all models from catalog. */\n scopedModelRefs: string[] | null;\n /** Last Escape timestamp for double-press actions. */\n lastEscapeAt: number;\n /** Human-readable progress from SSE `progress` events. */\n progressMessage: string | null;\n /** Session compaction in flight (local /compact handler). */\n isCompacting: boolean;\n /** Messages queued while compacting. */\n compactionQueue: string[];\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n runStatus: {\n phase: 'idle',\n runId: null,\n directStreamRunId: null,\n lastCompletedRunId: null,\n source: 'unknown',\n lastEvent: null,\n lastActivityAt: null,\n stalledAt: null,\n recoveredAt: null,\n },\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n messageFollowUpQueue: [],\n steeringQueue: [],\n scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";AA0HA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;GACT,OAAO;GACP,OAAO;GACP,mBAAmB;GACnB,oBAAoB;GACpB,QAAQ;GACR,WAAW;GACX,gBAAgB;GAChB,WAAW;GACX,aAAa;GACd;EACD,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EACf,sBAAsB,EAAE;EACxB,eAAe,EAAE;EACjB,iBAAiB;EACjB,cAAc;EACd,iBAAiB;EACjB,cAAc;EACd,iBAAiB,EAAE;EACpB"}
@@ -9,10 +9,11 @@ import { getAllModels, getAllProviders, getApiKey, init_providers, isProviderCon
9
9
  import { renderWorkflowFinalSummary, renderWorkflowPanel } from "../agent/workflow/snapshot.js";
10
10
  import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
11
11
  import { ProjectTrustStore, hasTrustRequiringProjectResources } from "../project-trust/trust-store.js";
12
+ import { ensureStarterAgentsInitialized } from "../agent/starter-agents.js";
12
13
  import "../config/index.js";
14
+ import { MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from "../gateway/chat-limits.js";
13
15
  import { isTerminalWorkflowRunStatus } from "../workflows/domain/run.js";
14
16
  import "../workflows/domain/index.js";
15
- import { MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from "../gateway/chat-limits.js";
16
17
  import { resolveTuiSessionKey, resolveTuiStartupSessionKey } from "../routing/resolve-tui-session-key.js";
17
18
  import { applyThemeById, getBashExcludeBorderColor, getBashModeBorderColor, getCustomThemesDir, getThemeExports, getThinkingBorderColor, initTuiTheme, listAvailableThemeIds, resolveThemePalette } from "./theme-manager.js";
18
19
  import { editorTheme, theme } from "./theme.js";
@@ -175,10 +176,12 @@ async function runTui(opts) {
175
176
  const stdioFilter = installTuiStdioFilter();
176
177
  const restoreStdio = () => stdioFilter.restore();
177
178
  const isLocalMode = opts.local === true;
178
- const config = loadConfig();
179
+ const loadedConfig = loadConfig();
180
+ const config = isLocalMode ? ensureStarterAgentsInitialized(loadedConfig).config : loadedConfig;
179
181
  const startup = resolveTuiStartupSessionKey({
180
182
  cfg: config,
181
183
  sessionOption: opts.session,
184
+ agentOption: opts.agentId,
182
185
  cwd: process.cwd()
183
186
  });
184
187
  let currentAgentId = startup.agentId;
@@ -225,6 +228,7 @@ async function runTui(opts) {
225
228
  sendMessage: (message, options) => sendExtensionMessage(message, options)
226
229
  });
227
230
  const client = isLocalMode ? new EmbeddedBackend({
231
+ config,
228
232
  extensionRegistry,
229
233
  implicitTrustedWorkspace,
230
234
  isWorkspaceTrusted: () => projectTrustSessionDecision
@@ -1618,6 +1622,7 @@ async function runTui(opts) {
1618
1622
  switchModel: switchCurrentModel,
1619
1623
  listSessions: () => client.listSessions(),
1620
1624
  listAgents: () => client.listAgents(),
1625
+ setTuiDefaultAgent: (agentId) => client.setTuiDefaultAgent?.(agentId) ?? Promise.reject(/* @__PURE__ */ new Error("Not available")),
1621
1626
  switchAgentSession,
1622
1627
  getSessionStats: () => client.getSessionStats(state.currentSessionKey),
1623
1628
  getStartupResources: () => startupResources,
@@ -1976,9 +1981,12 @@ async function runTui(opts) {
1976
1981
  }
1977
1982
  await refreshSessionInfoWithBorder();
1978
1983
  await refreshModelChoices();
1979
- await refreshStartupResources();
1980
1984
  await loadSessionHistory({ merge: true });
1981
1985
  showStartupCardOnce();
1986
+ refreshStartupResources().then(() => {
1987
+ updateFooter();
1988
+ tui.requestRender();
1989
+ });
1982
1990
  if (state.activeRunId) recoverActiveRunFromHistory("broadcast reconnect");
1983
1991
  updateHeader();
1984
1992
  updateFooter();