@xopcai/xopc 0.0.118 → 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 (468) hide show
  1. package/README.md +2 -1
  2. package/README.zh-CN.md +2 -1
  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-dzUrQoeZ.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--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.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-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
  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-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.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-BTBLSeUu.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-CYj9FWCp.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-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.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-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.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-B-Svpmza.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-Bss4TiwP.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-BRNjdgKq.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-Dub9sy8r.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-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.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-C8glrdqe.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-DqlWTsDb.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-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
  71. package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.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 +4 -8
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/embedded/run-for-session.js +102 -14
  80. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  81. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  82. package/dist/src/agent/fallback/candidates.js.map +1 -1
  83. package/dist/src/agent/index.js +1 -1
  84. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  85. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  86. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  87. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  88. package/dist/src/agent/lifecycle/progress.js +1 -6
  89. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  90. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  91. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  92. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  93. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  94. package/dist/src/agent/middleware/self-verify.js +0 -2
  95. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  96. package/dist/src/agent/models/index.d.ts +1 -1
  97. package/dist/src/agent/models/manager.d.ts +4 -20
  98. package/dist/src/agent/models/manager.js +9 -126
  99. package/dist/src/agent/models/manager.js.map +1 -1
  100. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  101. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  102. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  103. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  104. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  105. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  106. package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
  107. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  108. package/dist/src/agent/prompt/subagent-context.js +1 -1
  109. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  110. package/dist/src/agent/prompt/types.d.ts +1 -1
  111. package/dist/src/agent/service.d.ts +1 -9
  112. package/dist/src/agent/service.js +3 -40
  113. package/dist/src/agent/service.js.map +1 -1
  114. package/dist/src/agent/service.types.d.ts +2 -2
  115. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  116. package/dist/src/agent/session/session-config-service.js +14 -14
  117. package/dist/src/agent/session/session-config-service.js.map +1 -1
  118. package/dist/src/agent/session/session-inspector.js +3 -2
  119. package/dist/src/agent/session/session-inspector.js.map +1 -1
  120. package/dist/src/agent/starter-agents.js +12 -12
  121. package/dist/src/agent/starter-agents.js.map +1 -1
  122. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  123. package/dist/src/agent/tools/automation-tool.js +102 -0
  124. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  125. package/dist/src/agent/tools/delegate-tool.js +1 -1
  126. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  127. package/dist/src/agent/tools/factory.d.ts +3 -3
  128. package/dist/src/agent/tools/factory.js +2 -2
  129. package/dist/src/agent/tools/factory.js.map +1 -1
  130. package/dist/src/agent/tools/index.d.ts +1 -1
  131. package/dist/src/agent/tools/index.js +2 -2
  132. package/dist/src/agent-manifest/resolver.d.ts +1 -0
  133. package/dist/src/agent-manifest/resolver.js +1 -0
  134. package/dist/src/agent-manifest/resolver.js.map +1 -1
  135. package/dist/src/agent-manifest/schema.d.ts +6 -0
  136. package/dist/src/agent-manifest/schema.js +12 -3
  137. package/dist/src/agent-manifest/schema.js.map +1 -1
  138. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  139. package/dist/src/ai-assist/text-assist.js +56 -0
  140. package/dist/src/ai-assist/text-assist.js.map +1 -1
  141. package/dist/src/auth/profiles/store.js.map +1 -1
  142. package/dist/src/automations/api/routes.d.ts +3 -0
  143. package/dist/src/automations/api/routes.js +193 -0
  144. package/dist/src/automations/api/routes.js.map +1 -0
  145. package/dist/src/automations/domain/index.d.ts +3 -0
  146. package/dist/src/automations/domain/index.js +3 -0
  147. package/dist/src/automations/domain/schedule.d.ts +4 -0
  148. package/dist/src/automations/domain/schedule.js +37 -0
  149. package/dist/src/automations/domain/schedule.js.map +1 -0
  150. package/dist/src/automations/domain/types.d.ts +160 -0
  151. package/dist/src/automations/domain/validation.d.ts +370 -0
  152. package/dist/src/automations/domain/validation.js +149 -0
  153. package/dist/src/automations/domain/validation.js.map +1 -0
  154. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  155. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  156. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  157. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  158. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  159. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  160. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  161. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  162. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  163. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  164. package/dist/src/automations/draft/index.d.ts +3 -0
  165. package/dist/src/automations/draft/index.js +3 -0
  166. package/dist/src/automations/index.d.ts +3 -0
  167. package/dist/src/automations/index.js +8 -0
  168. package/dist/src/automations/product-events.d.ts +5 -0
  169. package/dist/src/automations/product-events.js +21 -0
  170. package/dist/src/automations/product-events.js.map +1 -0
  171. package/dist/src/automations/service/action-executor.d.ts +9 -0
  172. package/dist/src/automations/service/action-executor.js +157 -0
  173. package/dist/src/automations/service/action-executor.js.map +1 -0
  174. package/dist/src/automations/service/automation-service.d.ts +54 -0
  175. package/dist/src/automations/service/automation-service.js +404 -0
  176. package/dist/src/automations/service/automation-service.js.map +1 -0
  177. package/dist/src/automations/service/index.d.ts +2 -0
  178. package/dist/src/automations/service/index.js +3 -0
  179. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  180. package/dist/src/automations/storage/automation-repository.js +61 -0
  181. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  182. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  183. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  184. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  185. package/dist/src/automations/storage/index.d.ts +2 -0
  186. package/dist/src/automations/storage/index.js +3 -0
  187. package/dist/src/channels/plugin-types.d.ts +3 -0
  188. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  189. package/dist/src/cli/command-catalog.js +0 -39
  190. package/dist/src/cli/command-catalog.js.map +1 -1
  191. package/dist/src/cli/command-loaders.js +0 -1
  192. package/dist/src/cli/command-loaders.js.map +1 -1
  193. package/dist/src/cli/command-manifest.js +0 -4
  194. package/dist/src/cli/command-manifest.js.map +1 -1
  195. package/dist/src/cli/commands/agents.js +7 -6
  196. package/dist/src/cli/commands/agents.js.map +1 -1
  197. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  198. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  199. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  200. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  201. package/dist/src/cli/commands/doctor/flow.js +2 -2
  202. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  203. package/dist/src/cli/commands/gateway/call.js +2 -2
  204. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  205. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  206. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  207. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  208. package/dist/src/cli/commands/init.js +26 -8
  209. package/dist/src/cli/commands/init.js.map +1 -1
  210. package/dist/src/cli/commands/tui.js +24 -2
  211. package/dist/src/cli/commands/tui.js.map +1 -1
  212. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  213. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  214. package/dist/src/commands/agents.config.d.ts +9 -0
  215. package/dist/src/commands/agents.config.js +40 -2
  216. package/dist/src/commands/agents.config.js.map +1 -1
  217. package/dist/src/config/agent-profile.js +4 -3
  218. package/dist/src/config/agent-profile.js.map +1 -1
  219. package/dist/src/config/agent-typed-models.js.map +1 -1
  220. package/dist/src/config/config-surface.d.ts +3 -0
  221. package/dist/src/config/index.d.ts +0 -1
  222. package/dist/src/config/index.js +3 -3
  223. package/dist/src/config/index.js.map +1 -1
  224. package/dist/src/config/paths.d.ts +0 -9
  225. package/dist/src/config/paths.js +1 -14
  226. package/dist/src/config/paths.js.map +1 -1
  227. package/dist/src/config/profile.js +0 -1
  228. package/dist/src/config/profile.js.map +1 -1
  229. package/dist/src/config/rules.js +0 -5
  230. package/dist/src/config/rules.js.map +1 -1
  231. package/dist/src/config/schema.d.ts +13 -12
  232. package/dist/src/config/schema.js +22 -26
  233. package/dist/src/config/schema.js.map +1 -1
  234. package/dist/src/config/web-patch.d.ts +0 -12
  235. package/dist/src/config/web-patch.js +2 -29
  236. package/dist/src/config/web-patch.js.map +1 -1
  237. package/dist/src/extensions/api.d.ts +2 -0
  238. package/dist/src/extensions/api.js +10 -0
  239. package/dist/src/extensions/api.js.map +1 -1
  240. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  241. package/dist/src/extensions/extension-registry-impl.js +8 -0
  242. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  243. package/dist/src/extensions/loader.d.ts +3 -3
  244. package/dist/src/extensions/loader.js +3 -3
  245. package/dist/src/extensions/loader.js.map +1 -1
  246. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  247. package/dist/src/extensions/sdk/testing.js +7 -0
  248. package/dist/src/extensions/sdk/testing.js.map +1 -1
  249. package/dist/src/extensions/types/core.d.ts +10 -1
  250. package/dist/src/extensions/types/index.d.ts +1 -1
  251. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  252. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  253. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  254. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  255. package/dist/src/gateway/agents-admin.d.ts +1 -0
  256. package/dist/src/gateway/agents-admin.js +13 -15
  257. package/dist/src/gateway/agents-admin.js.map +1 -1
  258. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  259. package/dist/src/gateway/capability-presets-admin.js +19 -10
  260. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  261. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  262. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  263. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  264. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  265. package/dist/src/gateway/heartbeat/service.js +0 -7
  266. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  267. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  268. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  269. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  270. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  272. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  273. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  274. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  275. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  277. package/dist/src/gateway/hono/routes/home.js +34 -25
  278. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  279. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  281. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  282. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  283. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  284. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  285. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  287. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  288. package/dist/src/gateway/run-loop.js +2 -0
  289. package/dist/src/gateway/run-loop.js.map +1 -1
  290. package/dist/src/gateway/security/operator-scopes.js +5 -1
  291. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  292. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  293. package/dist/src/gateway/service/config-coordinator.js +14 -8
  294. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  295. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  296. package/dist/src/gateway/service/sessions-api.js +6 -1
  297. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  298. package/dist/src/gateway/service.d.ts +7 -3
  299. package/dist/src/gateway/service.js +61 -27
  300. package/dist/src/gateway/service.js.map +1 -1
  301. package/dist/src/goals/goal-service.js +45 -4
  302. package/dist/src/goals/goal-service.js.map +1 -1
  303. package/dist/src/infra/update-restart.js +1 -1
  304. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  305. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  306. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  307. package/dist/src/migrations/index.d.ts +4 -0
  308. package/dist/src/migrations/index.js +4 -0
  309. package/dist/src/migrations/registry.d.ts +8 -0
  310. package/dist/src/migrations/registry.js +18 -0
  311. package/dist/src/migrations/registry.js.map +1 -0
  312. package/dist/src/migrations/runner.d.ts +17 -0
  313. package/dist/src/migrations/runner.js +191 -0
  314. package/dist/src/migrations/runner.js.map +1 -0
  315. package/dist/src/migrations/types.d.ts +34 -0
  316. package/dist/src/notes/service.js +24 -1
  317. package/dist/src/notes/service.js.map +1 -1
  318. package/dist/src/providers/model-registry.d.ts +0 -1
  319. package/dist/src/providers/model-registry.js +0 -3
  320. package/dist/src/providers/model-registry.js.map +1 -1
  321. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  322. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  323. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  324. package/dist/src/session/transcript-outline.d.ts +47 -0
  325. package/dist/src/session/transcript-outline.js +481 -0
  326. package/dist/src/session/transcript-outline.js.map +1 -0
  327. package/dist/src/storage/sqlite/index.d.ts +0 -2
  328. package/dist/src/storage/sqlite/index.js +1 -3
  329. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  330. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  331. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  332. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  333. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  334. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  335. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  336. package/dist/src/storage/sqlite/schema.js +1 -1
  337. package/dist/src/storage/sqlite/schema.sql +56 -46
  338. package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
  339. package/dist/src/tui/backends/embedded-backend.js +18 -7
  340. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  341. package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
  342. package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/tui-backend.d.ts +4 -0
  345. package/dist/src/tui/tui-commands.d.ts +5 -0
  346. package/dist/src/tui/tui-commands.js +43 -0
  347. package/dist/src/tui/tui-commands.js.map +1 -1
  348. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  349. package/dist/src/tui/tui-transcript-tree.js +17 -257
  350. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  351. package/dist/src/tui/tui-types.d.ts +2 -0
  352. package/dist/src/tui/tui-types.js.map +1 -1
  353. package/dist/src/tui/tui.js +7 -2
  354. package/dist/src/tui/tui.js.map +1 -1
  355. package/dist/src/workflows/domain/index.js +1 -1
  356. package/dist/src/workflows/domain/run.d.ts +7 -7
  357. package/dist/src/workflows/domain/run.js.map +1 -1
  358. package/dist/src/workflows/index.js +2 -2
  359. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  360. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  361. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  362. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  363. package/package.json +4 -2
  364. package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
  365. package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
  366. package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
  367. package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
  368. package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
  369. package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
  370. package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
  371. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  372. package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
  373. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  374. package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
  375. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  376. package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
  377. package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
  378. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  379. package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
  380. package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
  381. package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
  382. package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
  383. package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
  384. package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
  385. package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
  386. package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
  387. package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
  388. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
  389. package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
  390. package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
  391. package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
  392. package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
  393. package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
  394. package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
  395. package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
  396. package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
  397. package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
  398. package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
  399. package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
  400. package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
  401. package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
  402. package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
  403. package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
  404. package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
  405. package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
  406. package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
  407. package/dist/src/agent/fallback/error.d.ts +0 -22
  408. package/dist/src/agent/fallback/error.js +0 -32
  409. package/dist/src/agent/fallback/error.js.map +0 -1
  410. package/dist/src/agent/fallback/index.d.ts +0 -5
  411. package/dist/src/agent/fallback/index.js +0 -9
  412. package/dist/src/agent/fallback/index.js.map +0 -1
  413. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  414. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  415. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  416. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  417. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  418. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  419. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  420. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  421. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  422. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  423. package/dist/src/cli/commands/cron-cli.js +0 -15
  424. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  425. package/dist/src/cli/commands/cron.d.ts +0 -4
  426. package/dist/src/cli/commands/cron.js +0 -188
  427. package/dist/src/cli/commands/cron.js.map +0 -1
  428. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  429. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  430. package/dist/src/cron/execution-types.d.ts +0 -42
  431. package/dist/src/cron/executor.d.ts +0 -67
  432. package/dist/src/cron/executor.js +0 -669
  433. package/dist/src/cron/executor.js.map +0 -1
  434. package/dist/src/cron/index.d.ts +0 -7
  435. package/dist/src/cron/index.js +0 -7
  436. package/dist/src/cron/job-content.d.ts +0 -5
  437. package/dist/src/cron/job-content.js +0 -15
  438. package/dist/src/cron/job-content.js.map +0 -1
  439. package/dist/src/cron/run-log-store.d.ts +0 -12
  440. package/dist/src/cron/run-log-store.js +0 -58
  441. package/dist/src/cron/run-log-store.js.map +0 -1
  442. package/dist/src/cron/schedule.d.ts +0 -10
  443. package/dist/src/cron/schedule.js +0 -85
  444. package/dist/src/cron/schedule.js.map +0 -1
  445. package/dist/src/cron/service.d.ts +0 -58
  446. package/dist/src/cron/service.js +0 -419
  447. package/dist/src/cron/service.js.map +0 -1
  448. package/dist/src/cron/types.d.ts +0 -183
  449. package/dist/src/cron/validation.d.ts +0 -500
  450. package/dist/src/cron/validation.js +0 -192
  451. package/dist/src/cron/validation.js.map +0 -1
  452. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  453. package/dist/src/cron/workflow-run-completion.js +0 -72
  454. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  455. package/dist/src/extensions/types/phase4.js +0 -1
  456. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  457. package/dist/src/gateway/hono/routes/cron.js +0 -109
  458. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  459. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  460. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  461. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  462. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  463. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  464. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  465. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  466. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  467. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  468. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -0,0 +1,481 @@
1
+ import { isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry } from "./session-context-for-llm.js";
2
+ //#region src/session/transcript-outline.ts
3
+ function asRecord(value) {
4
+ return value && typeof value === "object" ? value : null;
5
+ }
6
+ function stringValue(value) {
7
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
8
+ }
9
+ function truncateText(text, max = 96) {
10
+ const normalized = text.replace(/\s+/g, " ").trim();
11
+ if (normalized.length <= max) return normalized;
12
+ return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
13
+ }
14
+ function contentPreview(content) {
15
+ return truncateText(contentText(content));
16
+ }
17
+ function contentText(content) {
18
+ if (typeof content === "string") return content;
19
+ if (!Array.isArray(content)) return "";
20
+ const parts = [];
21
+ for (const block of content) {
22
+ if (typeof block === "string") {
23
+ parts.push(block);
24
+ continue;
25
+ }
26
+ const obj = asRecord(block);
27
+ if (!obj) continue;
28
+ const type = stringValue(obj.type);
29
+ if (type === "text") parts.push(stringValue(obj.text) ?? "");
30
+ else if (type === "toolCall" || type === "tool_use" || type === "tool_call") parts.push(formatToolCallPreview(toolNameFromBlock(obj), toolArgsFromBlock(obj)));
31
+ else if (type === "image" || type === "image_url") parts.push("[image]");
32
+ else if (type) parts.push(`[${type}]`);
33
+ }
34
+ return parts.filter(Boolean).join(" ");
35
+ }
36
+ function collectFiles(value, out) {
37
+ if (typeof value === "string") {
38
+ const trimmed = value.trim();
39
+ if (trimmed && /(?:^\.{0,2}\/|[\\/]|\.[a-zA-Z0-9]{1,8}$)/.test(trimmed)) out.add(trimmed);
40
+ return;
41
+ }
42
+ if (Array.isArray(value)) {
43
+ for (const item of value) collectFiles(item, out);
44
+ return;
45
+ }
46
+ const record = asRecord(value);
47
+ if (!record) return;
48
+ for (const key of [
49
+ "path",
50
+ "file",
51
+ "filePath",
52
+ "file_path",
53
+ "targetFile",
54
+ "target_file"
55
+ ]) {
56
+ const file = stringValue(record[key]);
57
+ if (file) out.add(file);
58
+ }
59
+ for (const key of ["files", "paths"]) collectFiles(record[key], out);
60
+ }
61
+ function filesFromArgs(args) {
62
+ const files = /* @__PURE__ */ new Set();
63
+ collectFiles(args, files);
64
+ return [...files].slice(0, 8);
65
+ }
66
+ function toolKind(name, files) {
67
+ const normalized = name.toLowerCase().replace(/[-.]/g, "_");
68
+ if (files.length > 0 || normalized.includes("read") || normalized.includes("write") || normalized.includes("edit") || normalized.includes("patch")) return "file";
69
+ if (normalized.includes("bash") || normalized.includes("shell") || normalized.includes("command")) return "command";
70
+ return "tool";
71
+ }
72
+ function formatToolCallPreview(name, args) {
73
+ const path = stringValue(args.path) ?? stringValue(args.file_path) ?? "";
74
+ if (name === "read" || name === "read_file") {
75
+ const offset = typeof args.offset === "number" ? args.offset : void 0;
76
+ const limit = typeof args.limit === "number" ? args.limit : void 0;
77
+ let display = path;
78
+ if (offset !== void 0 || limit !== void 0) {
79
+ const start = offset ?? 1;
80
+ const end = limit !== void 0 ? start + limit - 1 : void 0;
81
+ display += `:${start}${end !== void 0 ? `-${end}` : ""}`;
82
+ }
83
+ return `[read: ${display || "file"}]`;
84
+ }
85
+ if (name === "write" || name === "write_file") return `[write: ${path || "file"}]`;
86
+ if (name === "edit") return `[edit: ${path || "file"}]`;
87
+ if (name === "bash" || name === "shell") return `[bash: ${truncateText((stringValue(args.command) ?? "").replace(/[\n\t]/g, " ").trim(), 53)}]`;
88
+ if (name === "grep") return `[grep: /${stringValue(args.pattern) ?? ""}/ in ${path || "."}]`;
89
+ if (name === "find") return `[find: ${stringValue(args.pattern) ?? ""} in ${path || "."}]`;
90
+ if (name === "ls") return `[ls: ${path || "."}]`;
91
+ const argsText = JSON.stringify(args);
92
+ return `[${name}: ${argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText}]`;
93
+ }
94
+ function parseJsonRecord(value) {
95
+ if (typeof value !== "string" || !value.trim()) return null;
96
+ try {
97
+ return asRecord(JSON.parse(value));
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
102
+ function toolNameFromBlock(obj) {
103
+ const fn = asRecord(obj.function);
104
+ return stringValue(obj.name) ?? stringValue(obj.toolName) ?? stringValue(fn?.name) ?? "tool";
105
+ }
106
+ function toolArgsFromBlock(obj) {
107
+ const fn = asRecord(obj.function);
108
+ return asRecord(obj.arguments) ?? asRecord(obj.args) ?? asRecord(obj.input) ?? asRecord(fn?.arguments) ?? parseJsonRecord(obj.arguments) ?? parseJsonRecord(obj.args) ?? parseJsonRecord(obj.input) ?? parseJsonRecord(fn?.arguments) ?? {};
109
+ }
110
+ function collectToolCallDisplays(content) {
111
+ if (!Array.isArray(content)) return [];
112
+ const calls = [];
113
+ for (const block of content) {
114
+ const obj = asRecord(block);
115
+ const type = obj ? stringValue(obj.type) : void 0;
116
+ if (!obj || type !== "toolCall" && type !== "tool_use" && type !== "tool_call") continue;
117
+ const id = stringValue(obj.id) ?? stringValue(obj.toolCallId) ?? stringValue(obj.tool_call_id) ?? stringValue(obj.tool_call_id$);
118
+ if (!id) continue;
119
+ const name = toolNameFromBlock(obj);
120
+ const args = toolArgsFromBlock(obj);
121
+ const files = filesFromArgs(args);
122
+ calls.push({
123
+ id,
124
+ name,
125
+ files,
126
+ kind: toolKind(name, files),
127
+ preview: formatToolCallPreview(name, args),
128
+ status: stringValue(obj.status) === "running" ? "running" : void 0
129
+ });
130
+ }
131
+ return calls;
132
+ }
133
+ function rowToolCallId(row) {
134
+ const record = asRecord(row);
135
+ return stringValue(record?.toolCallId) ?? stringValue(record?.tool_call_id) ?? stringValue(record?.tool_call_id$);
136
+ }
137
+ function rowCreatedAt(row) {
138
+ const record = asRecord(row);
139
+ return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);
140
+ }
141
+ function parseTimestamp(value) {
142
+ if (typeof value === "number" && Number.isFinite(value)) return value;
143
+ if (typeof value !== "string" || !value.trim()) return void 0;
144
+ const parsed = Date.parse(value);
145
+ return Number.isFinite(parsed) ? parsed : void 0;
146
+ }
147
+ function messageLabel(row) {
148
+ const role = stringValue(row.role) ?? "message";
149
+ if (role === "tool" || role === "toolResult") return `tool:${stringValue(row.toolName) ?? "result"}`;
150
+ return role;
151
+ }
152
+ function rowPreview(row) {
153
+ if (isTranscriptContextEntry(row)) return truncateText(row.text ?? JSON.stringify(row.data ?? {}));
154
+ if (isTranscriptLabelEntry(row)) return truncateText(row.label ? `label: ${row.label}` : "label cleared");
155
+ if (isTranscriptMetadataEntry(row)) {
156
+ if (row.type === "model_change") return truncateText([row.provider, row.modelId].filter(Boolean).join("/") || "model changed");
157
+ if (row.type === "thinking_level_change") return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : "thinking changed");
158
+ return truncateText(row.name ? `title: ${row.name}` : "title cleared");
159
+ }
160
+ if (isTranscriptBashExecutionEntry(row)) return truncateText(row.command ?? "bash");
161
+ if (isTranscriptCustomMessageEntry(row)) {
162
+ const record = asRecord(row);
163
+ const customType = stringValue(record?.customType) ?? "custom";
164
+ const preview = contentPreview(record?.content);
165
+ return truncateText(preview ? `${customType}: ${preview}` : customType);
166
+ }
167
+ if (isTranscriptSummaryMessageEntry(row)) {
168
+ if (row.role === "branchSummary") return truncateText(row.summary ?? "branch summary");
169
+ return truncateText(row.summary ?? "compaction checkpoint");
170
+ }
171
+ const record = asRecord(row);
172
+ if (record?.type === "compaction") return truncateText(stringValue(record.summary) ?? "compaction checkpoint");
173
+ const preview = contentPreview(record?.content);
174
+ if (record?.role === "assistant" && !preview) {
175
+ if (record.stopReason === "aborted") return "(aborted)";
176
+ const errorMessage = stringValue(record.errorMessage);
177
+ if (errorMessage) return truncateText(errorMessage, 80);
178
+ }
179
+ return preview;
180
+ }
181
+ function rowContentText(row) {
182
+ if (isTranscriptContextEntry(row)) return row.text;
183
+ if (isTranscriptLabelEntry(row)) return row.label;
184
+ if (isTranscriptMetadataEntry(row)) {
185
+ if (row.type === "model_change") return [row.provider, row.modelId].filter(Boolean).join("/") || void 0;
186
+ if (row.type === "thinking_level_change") return row.thinkingLevel;
187
+ return row.name;
188
+ }
189
+ if (isTranscriptBashExecutionEntry(row)) return row.command;
190
+ if (isTranscriptCustomMessageEntry(row)) {
191
+ const record = asRecord(row);
192
+ return contentText(record?.content).trim() || stringValue(record?.customType);
193
+ }
194
+ if (isTranscriptSummaryMessageEntry(row)) return row.summary;
195
+ const record = asRecord(row);
196
+ if (record?.type === "compaction") return stringValue(record.summary);
197
+ const text = contentText(record?.content).trim();
198
+ return text ? text : void 0;
199
+ }
200
+ function roleForTimeline(role) {
201
+ if (role === "user" || role === "assistant" || role === "system") return role;
202
+ }
203
+ function inferStatus(row, toolCall) {
204
+ const record = asRecord(row);
205
+ const rawStatus = stringValue(record?.status);
206
+ if (rawStatus === "running" || rawStatus === "done" || rawStatus === "error") return rawStatus;
207
+ if (toolCall?.status) return toolCall.status;
208
+ if (record?.isError === true || stringValue(record?.errorMessage)) return "error";
209
+ if (isTranscriptBashExecutionEntry(row) && typeof row.exitCode === "number") return row.exitCode === 0 ? "done" : "error";
210
+ if (record?.role === "tool" || record?.role === "toolResult") return "done";
211
+ }
212
+ function titleForEntry(params) {
213
+ if (params.kind === "turn") {
214
+ if (params.role === "user") return `Turn ${params.turn}`;
215
+ return params.role ?? "message";
216
+ }
217
+ if (params.kind === "file" || params.kind === "command" || params.kind === "tool") return params.toolName ?? (params.label.replace(/^tool:/, "") || params.kind);
218
+ if (params.kind === "branch") return "branch summary";
219
+ return params.label;
220
+ }
221
+ function isDisplayMessageRow(row) {
222
+ if (isTranscriptContextEntry(row)) return false;
223
+ if (isTranscriptLabelEntry(row)) return false;
224
+ if (isTranscriptMetadataEntry(row)) return false;
225
+ const record = asRecord(row);
226
+ if (record?.type === "compaction") return false;
227
+ if (isTranscriptSummaryMessageEntry(row)) return false;
228
+ if (record?.role === "tool" || record?.role === "toolResult" || record?.role === "system") return false;
229
+ if (isTranscriptBashExecutionEntry(row) || isTranscriptCustomMessageEntry(row)) return true;
230
+ return Boolean(stringValue(record?.role));
231
+ }
232
+ function displayIndexForRow(params) {
233
+ const { row, role, nextDisplayIndex, lastDisplayRole } = params;
234
+ if (!isDisplayMessageRow(row)) return {
235
+ nextDisplayIndex,
236
+ lastDisplayRole
237
+ };
238
+ if (role === "assistant") {
239
+ if (lastDisplayRole === "assistant") return {
240
+ rowDisplayIndex: Math.max(0, nextDisplayIndex - 1),
241
+ nextDisplayIndex,
242
+ lastDisplayRole
243
+ };
244
+ return {
245
+ rowDisplayIndex: nextDisplayIndex,
246
+ nextDisplayIndex: nextDisplayIndex + 1,
247
+ lastDisplayRole: "assistant"
248
+ };
249
+ }
250
+ return {
251
+ rowDisplayIndex: nextDisplayIndex,
252
+ nextDisplayIndex: nextDisplayIndex + 1,
253
+ lastDisplayRole: "other"
254
+ };
255
+ }
256
+ function classifyRow(params) {
257
+ const { row, label, role, toolCall } = params;
258
+ const record = asRecord(row);
259
+ if (isTranscriptContextEntry(row) || isTranscriptLabelEntry(row) || isTranscriptMetadataEntry(row)) return {
260
+ kind: "context",
261
+ files: []
262
+ };
263
+ if (isTranscriptBashExecutionEntry(row)) return {
264
+ kind: "command",
265
+ files: []
266
+ };
267
+ if (isTranscriptSummaryMessageEntry(row)) return {
268
+ kind: row.role === "branchSummary" ? "branch" : "compaction",
269
+ files: []
270
+ };
271
+ if (record?.type === "compaction") return {
272
+ kind: "compaction",
273
+ files: []
274
+ };
275
+ if (role === "tool" || role === "toolResult" || label.startsWith("tool:")) {
276
+ const toolName = toolCall?.name ?? (label.replace(/^tool:/, "") || stringValue(record?.toolName));
277
+ const files = toolCall?.files ?? filesFromArgs(record ?? {});
278
+ return {
279
+ kind: toolKind(toolName ?? "tool", files),
280
+ files,
281
+ toolName
282
+ };
283
+ }
284
+ return {
285
+ kind: "turn",
286
+ files: []
287
+ };
288
+ }
289
+ function buildTranscriptOutline(rows) {
290
+ const entries = [];
291
+ const byOriginalId = /* @__PURE__ */ new Map();
292
+ const toolCallsById = /* @__PURE__ */ new Map();
293
+ const labelChanges = [];
294
+ let currentTurnId;
295
+ let turn = 0;
296
+ let nextDisplayIndex = 0;
297
+ let lastDisplayRole;
298
+ let lastAssistantDisplayIndex;
299
+ rows.forEach((row, index) => {
300
+ const rowNumber = index + 1;
301
+ const id = `row-${rowNumber}`;
302
+ const record = asRecord(row);
303
+ let parentId;
304
+ let depth = 0;
305
+ let label = "entry";
306
+ let role;
307
+ let toolCallPreview;
308
+ let toolCall;
309
+ if (isTranscriptContextEntry(row)) {
310
+ label = "context";
311
+ parentId = currentTurnId;
312
+ depth = currentTurnId ? 1 : 0;
313
+ } else if (asRecord(row)?.type === "compaction") {
314
+ label = "compaction";
315
+ parentId = currentTurnId;
316
+ depth = currentTurnId ? 1 : 0;
317
+ } else if (isTranscriptLabelEntry(row)) {
318
+ label = row.label ? `label:${row.label}` : "label:cleared";
319
+ parentId = currentTurnId;
320
+ depth = currentTurnId ? 1 : 0;
321
+ if (row.targetId) labelChanges.push({
322
+ targetId: row.targetId,
323
+ label: row.label,
324
+ timestamp: typeof row.timestamp === "string" ? row.timestamp : void 0
325
+ });
326
+ } else if (isTranscriptMetadataEntry(row)) {
327
+ label = row.type;
328
+ parentId = currentTurnId;
329
+ depth = currentTurnId ? 1 : 0;
330
+ } else if (isTranscriptBashExecutionEntry(row)) {
331
+ label = "bashExecution";
332
+ parentId = currentTurnId;
333
+ depth = currentTurnId ? 1 : 0;
334
+ } else if (isTranscriptCustomMessageEntry(row)) {
335
+ label = `custom:${stringValue(record?.customType) ?? "message"}`;
336
+ parentId = currentTurnId;
337
+ depth = currentTurnId ? 1 : 0;
338
+ } else if (isTranscriptSummaryMessageEntry(row)) {
339
+ label = row.role === "branchSummary" ? "branch_summary" : "compaction";
340
+ parentId = currentTurnId;
341
+ depth = currentTurnId ? 1 : 0;
342
+ } else {
343
+ const message = row;
344
+ role = stringValue(message.role);
345
+ label = messageLabel(message);
346
+ if (role === "tool" || role === "toolResult") {
347
+ const toolCallId = rowToolCallId(row);
348
+ toolCall = toolCallId ? toolCallsById.get(toolCallId) : void 0;
349
+ if (toolCall) {
350
+ label = `tool:${toolCall.name}`;
351
+ toolCallPreview = toolCall.preview;
352
+ }
353
+ }
354
+ if (role === "user" || !currentTurnId) {
355
+ turn += 1;
356
+ currentTurnId = id;
357
+ depth = 0;
358
+ } else {
359
+ parentId = currentTurnId;
360
+ depth = 1;
361
+ }
362
+ }
363
+ const display = displayIndexForRow({
364
+ row,
365
+ role,
366
+ nextDisplayIndex,
367
+ lastDisplayRole
368
+ });
369
+ const rowDisplayIndex = display.rowDisplayIndex;
370
+ nextDisplayIndex = display.nextDisplayIndex;
371
+ lastDisplayRole = display.lastDisplayRole;
372
+ if (role === "assistant" && rowDisplayIndex !== void 0) lastAssistantDisplayIndex = rowDisplayIndex;
373
+ const { kind, files, toolName } = classifyRow({
374
+ row,
375
+ label,
376
+ role,
377
+ toolCall
378
+ });
379
+ const preview = rowPreview(row);
380
+ const createdAt = rowCreatedAt(row);
381
+ const content = rowContentText(row);
382
+ const status = inferStatus(row, toolCall);
383
+ const timestamp = parseTimestamp(createdAt ?? record?.timestamp);
384
+ const entryDisplayIndex = rowDisplayIndex ?? (kind === "tool" || kind === "file" || kind === "command" ? lastAssistantDisplayIndex : void 0);
385
+ const meta = toolName || files.length > 0 ? {
386
+ ...toolName ? { toolName } : {},
387
+ ...files.length > 0 ? { files } : {}
388
+ } : void 0;
389
+ const entry = {
390
+ id,
391
+ depth,
392
+ label,
393
+ turn,
394
+ preview,
395
+ kind,
396
+ title: titleForEntry({
397
+ kind,
398
+ label,
399
+ role,
400
+ turn,
401
+ preview,
402
+ toolName
403
+ }),
404
+ rowNumber,
405
+ ...timestamp !== void 0 ? { timestamp } : {},
406
+ ...entryDisplayIndex !== void 0 ? { displayIndex: entryDisplayIndex } : {},
407
+ ...content ? { contentText: content } : {},
408
+ ...createdAt ? { createdAt } : {},
409
+ ...meta ? { meta } : {},
410
+ ...status ? { status } : {}
411
+ };
412
+ if (parentId) entry.parentId = parentId;
413
+ if (role) entry.role = role;
414
+ if (toolCallPreview) entry.toolCallPreview = toolCallPreview;
415
+ entries.push(entry);
416
+ byOriginalId.set(id, entry);
417
+ const originalId = stringValue(record?.id);
418
+ if (originalId) byOriginalId.set(originalId, entry);
419
+ for (const nextToolCall of collectToolCallDisplays(record?.content)) toolCallsById.set(nextToolCall.id, {
420
+ name: nextToolCall.name,
421
+ preview: nextToolCall.preview,
422
+ files: nextToolCall.files,
423
+ kind: nextToolCall.kind,
424
+ status: nextToolCall.status
425
+ });
426
+ });
427
+ for (const change of labelChanges) {
428
+ const target = byOriginalId.get(change.targetId);
429
+ if (!target) continue;
430
+ if (change.label?.trim()) {
431
+ target.userLabel = change.label.trim();
432
+ target.labelTimestamp = change.timestamp;
433
+ } else {
434
+ delete target.userLabel;
435
+ delete target.labelTimestamp;
436
+ }
437
+ }
438
+ markCurrentTranscriptPath(entries);
439
+ return entries;
440
+ }
441
+ function markCurrentTranscriptPath(entries) {
442
+ const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);
443
+ if (!currentLeaf) return;
444
+ const byId = new Map(entries.map((entry) => [entry.id, entry]));
445
+ currentLeaf.isCurrentLeaf = true;
446
+ let currentId = currentLeaf.id;
447
+ while (currentId) {
448
+ const entry = byId.get(currentId);
449
+ if (!entry) break;
450
+ entry.isOnActivePath = true;
451
+ currentId = entry.parentId;
452
+ }
453
+ }
454
+ function isCurrentLeafCandidate(entry) {
455
+ if (entry.label === "context") return false;
456
+ if (entry.label === "model_change") return false;
457
+ if (entry.label === "thinking_level_change") return false;
458
+ if (entry.label === "session_info") return false;
459
+ if (entry.label.startsWith("label:")) return false;
460
+ return true;
461
+ }
462
+ function buildSessionTimeline(rows) {
463
+ return buildTranscriptOutline(rows).map((entry) => ({
464
+ id: entry.id,
465
+ kind: entry.kind,
466
+ ...roleForTimeline(entry.role) ? { role: roleForTimeline(entry.role) } : {},
467
+ title: entry.title,
468
+ ...entry.preview ? { preview: entry.preview } : {},
469
+ ...entry.timestamp !== void 0 ? { timestamp: entry.timestamp } : {},
470
+ depth: entry.depth,
471
+ turn: entry.turn,
472
+ ...entry.displayIndex !== void 0 ? { displayIndex: entry.displayIndex } : {},
473
+ rowNumber: entry.rowNumber,
474
+ ...entry.status ? { status: entry.status } : {},
475
+ ...entry.meta ? { meta: entry.meta } : {}
476
+ }));
477
+ }
478
+ //#endregion
479
+ export { buildSessionTimeline, buildTranscriptOutline };
480
+
481
+ //# sourceMappingURL=transcript-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-outline.js","names":[],"sources":["../../../src/session/transcript-outline.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-context-for-llm.js';\n\nexport type SessionTimelineItemKind =\n | 'turn'\n | 'tool'\n | 'file'\n | 'command'\n | 'context'\n | 'branch'\n | 'compaction';\n\nexport type SessionTimelineItem = {\n id: string;\n kind: SessionTimelineItemKind;\n role?: 'user' | 'assistant' | 'system';\n title: string;\n preview?: string;\n timestamp?: number;\n depth: number;\n turn: number;\n displayIndex?: number;\n rowNumber?: number;\n status?: 'running' | 'done' | 'error';\n meta?: { toolName?: string; files?: string[] };\n};\n\nexport interface TranscriptOutlineEntry {\n id: string;\n parentId?: string;\n depth: number;\n label: string;\n role?: string;\n userLabel?: string;\n labelTimestamp?: string;\n turn: number;\n preview?: string;\n contentText?: string;\n toolCallPreview?: string;\n createdAt?: string;\n isOnActivePath?: boolean;\n isCurrentLeaf?: boolean;\n kind: SessionTimelineItemKind;\n title: string;\n timestamp?: number;\n displayIndex?: number;\n rowNumber: number;\n status?: 'running' | 'done' | 'error';\n meta?: { toolName?: string; files?: string[] };\n}\n\ninterface ToolCallDisplay {\n name: string;\n preview: string;\n files: string[];\n kind: SessionTimelineItemKind;\n status?: 'running' | 'done' | 'error';\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' || type === 'tool_use' || type === 'tool_call') {\n parts.push(formatToolCallPreview(\n toolNameFromBlock(obj),\n toolArgsFromBlock(obj),\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 collectFiles(value: unknown, out: Set<string>): void {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed && /(?:^\\.{0,2}\\/|[\\\\/]|\\.[a-zA-Z0-9]{1,8}$)/.test(trimmed)) {\n out.add(trimmed);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectFiles(item, out);\n return;\n }\n const record = asRecord(value);\n if (!record) return;\n for (const key of ['path', 'file', 'filePath', 'file_path', 'targetFile', 'target_file']) {\n const file = stringValue(record[key]);\n if (file) out.add(file);\n }\n for (const key of ['files', 'paths']) {\n collectFiles(record[key], out);\n }\n}\n\nfunction filesFromArgs(args: Record<string, unknown>): string[] {\n const files = new Set<string>();\n collectFiles(args, files);\n return [...files].slice(0, 8);\n}\n\nfunction toolKind(name: string, files: readonly string[]): SessionTimelineItemKind {\n const normalized = name.toLowerCase().replace(/[-.]/g, '_');\n if (\n files.length > 0 ||\n normalized.includes('read') ||\n normalized.includes('write') ||\n normalized.includes('edit') ||\n normalized.includes('patch')\n ) {\n return 'file';\n }\n if (normalized.includes('bash') || normalized.includes('shell') || normalized.includes('command')) {\n return 'command';\n }\n return 'tool';\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\nfunction parseJsonRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n return asRecord(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction toolNameFromBlock(obj: Record<string, unknown>): string {\n const fn = asRecord(obj.function);\n return stringValue(obj.name) ?? stringValue(obj.toolName) ?? stringValue(fn?.name) ?? 'tool';\n}\n\nfunction toolArgsFromBlock(obj: Record<string, unknown>): Record<string, unknown> {\n const fn = asRecord(obj.function);\n return (\n asRecord(obj.arguments) ??\n asRecord(obj.args) ??\n asRecord(obj.input) ??\n asRecord(fn?.arguments) ??\n parseJsonRecord(obj.arguments) ??\n parseJsonRecord(obj.args) ??\n parseJsonRecord(obj.input) ??\n parseJsonRecord(fn?.arguments) ??\n {}\n );\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 const type = obj ? stringValue(obj.type) : undefined;\n if (!obj || (type !== 'toolCall' && type !== 'tool_use' && type !== 'tool_call')) 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 = toolNameFromBlock(obj);\n const args = toolArgsFromBlock(obj);\n const files = filesFromArgs(args);\n calls.push({\n id,\n name,\n files,\n kind: toolKind(name, files),\n preview: formatToolCallPreview(name, args),\n status: stringValue(obj.status) === 'running' ? 'running' : undefined,\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 parseTimestamp(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value !== 'string' || !value.trim()) return undefined;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : undefined;\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\nfunction roleForTimeline(role: string | undefined): SessionTimelineItem['role'] | undefined {\n if (role === 'user' || role === 'assistant' || role === 'system') return role;\n return undefined;\n}\n\nfunction inferStatus(row: TranscriptStoredRow, toolCall?: ToolCallDisplay): SessionTimelineItem['status'] | undefined {\n const record = asRecord(row);\n const rawStatus = stringValue(record?.status);\n if (rawStatus === 'running' || rawStatus === 'done' || rawStatus === 'error') return rawStatus;\n if (toolCall?.status) return toolCall.status;\n if (record?.isError === true || stringValue(record?.errorMessage)) return 'error';\n if (isTranscriptBashExecutionEntry(row) && typeof row.exitCode === 'number') {\n return row.exitCode === 0 ? 'done' : 'error';\n }\n if (record?.role === 'tool' || record?.role === 'toolResult') return 'done';\n return undefined;\n}\n\nfunction titleForEntry(params: {\n kind: SessionTimelineItemKind;\n label: string;\n role?: string;\n turn: number;\n preview?: string;\n toolName?: string;\n}): string {\n if (params.kind === 'turn') {\n if (params.role === 'user') return `Turn ${params.turn}`;\n return params.role ?? 'message';\n }\n if (params.kind === 'file' || params.kind === 'command' || params.kind === 'tool') {\n return params.toolName ?? (params.label.replace(/^tool:/, '') || params.kind);\n }\n if (params.kind === 'branch') return 'branch summary';\n return params.label;\n}\n\nfunction isDisplayMessageRow(row: TranscriptStoredRow): boolean {\n if (isTranscriptContextEntry(row)) return false;\n if (isTranscriptLabelEntry(row)) return false;\n if (isTranscriptMetadataEntry(row)) return false;\n const record = asRecord(row);\n if (record?.type === 'compaction') return false;\n if (isTranscriptSummaryMessageEntry(row)) return false;\n if (record?.role === 'tool' || record?.role === 'toolResult' || record?.role === 'system') return false;\n if (isTranscriptBashExecutionEntry(row) || isTranscriptCustomMessageEntry(row)) return true;\n return Boolean(stringValue(record?.role));\n}\n\nfunction displayIndexForRow(params: {\n row: TranscriptStoredRow;\n role?: string;\n nextDisplayIndex: number;\n lastDisplayRole?: 'assistant' | 'other';\n}): { rowDisplayIndex?: number; nextDisplayIndex: number; lastDisplayRole?: 'assistant' | 'other' } {\n const { row, role, nextDisplayIndex, lastDisplayRole } = params;\n if (!isDisplayMessageRow(row)) {\n return { nextDisplayIndex, lastDisplayRole };\n }\n if (role === 'assistant') {\n if (lastDisplayRole === 'assistant') {\n return {\n rowDisplayIndex: Math.max(0, nextDisplayIndex - 1),\n nextDisplayIndex,\n lastDisplayRole,\n };\n }\n return {\n rowDisplayIndex: nextDisplayIndex,\n nextDisplayIndex: nextDisplayIndex + 1,\n lastDisplayRole: 'assistant',\n };\n }\n return {\n rowDisplayIndex: nextDisplayIndex,\n nextDisplayIndex: nextDisplayIndex + 1,\n lastDisplayRole: 'other',\n };\n}\n\nfunction classifyRow(params: {\n row: TranscriptStoredRow;\n label: string;\n role?: string;\n toolCall?: ToolCallDisplay;\n}): { kind: SessionTimelineItemKind; files: string[]; toolName?: string } {\n const { row, label, role, toolCall } = params;\n const record = asRecord(row);\n if (isTranscriptContextEntry(row) || isTranscriptLabelEntry(row) || isTranscriptMetadataEntry(row)) {\n return { kind: 'context', files: [] };\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return { kind: 'command', files: [] };\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n return { kind: row.role === 'branchSummary' ? 'branch' : 'compaction', files: [] };\n }\n if (record?.type === 'compaction') {\n return { kind: 'compaction', files: [] };\n }\n if (role === 'tool' || role === 'toolResult' || label.startsWith('tool:')) {\n const toolName = toolCall?.name ?? (label.replace(/^tool:/, '') || stringValue(record?.toolName));\n const files = toolCall?.files ?? filesFromArgs(record ?? {});\n return { kind: toolKind(toolName ?? 'tool', files), files, toolName };\n }\n return { kind: 'turn', files: [] };\n}\n\nexport function buildTranscriptOutline(rows: TranscriptStoredRow[]): TranscriptOutlineEntry[] {\n const entries: TranscriptOutlineEntry[] = [];\n const byOriginalId = new Map<string, TranscriptOutlineEntry>();\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 let nextDisplayIndex = 0;\n let lastDisplayRole: 'assistant' | 'other' | undefined;\n let lastAssistantDisplayIndex: number | undefined;\n\n rows.forEach((row, index) => {\n const rowNumber = index + 1;\n const id = `row-${rowNumber}`;\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 let toolCall: ToolCallDisplay | 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 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 display = displayIndexForRow({\n row,\n role,\n nextDisplayIndex,\n lastDisplayRole,\n });\n const rowDisplayIndex = display.rowDisplayIndex;\n nextDisplayIndex = display.nextDisplayIndex;\n lastDisplayRole = display.lastDisplayRole;\n if (role === 'assistant' && rowDisplayIndex !== undefined) {\n lastAssistantDisplayIndex = rowDisplayIndex;\n }\n const { kind, files, toolName } = classifyRow({ row, label, role, toolCall });\n const preview = rowPreview(row);\n const createdAt = rowCreatedAt(row);\n const content = rowContentText(row);\n const status = inferStatus(row, toolCall);\n const timestamp = parseTimestamp(createdAt ?? record?.timestamp);\n const entryDisplayIndex =\n rowDisplayIndex ??\n (kind === 'tool' || kind === 'file' || kind === 'command'\n ? lastAssistantDisplayIndex\n : undefined);\n const meta =\n toolName || files.length > 0\n ? {\n ...(toolName ? { toolName } : {}),\n ...(files.length > 0 ? { files } : {}),\n }\n : undefined;\n\n const entry: TranscriptOutlineEntry = {\n id,\n depth,\n label,\n turn,\n preview,\n kind,\n title: titleForEntry({ kind, label, role, turn, preview, toolName }),\n rowNumber,\n ...(timestamp !== undefined ? { timestamp } : {}),\n ...(entryDisplayIndex !== undefined ? { displayIndex: entryDisplayIndex } : {}),\n ...(content ? { contentText: content } : {}),\n ...(createdAt ? { createdAt } : {}),\n ...(meta ? { meta } : {}),\n ...(status ? { status } : {}),\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 nextToolCall of collectToolCallDisplays(record?.content)) {\n toolCallsById.set(nextToolCall.id, {\n name: nextToolCall.name,\n preview: nextToolCall.preview,\n files: nextToolCall.files,\n kind: nextToolCall.kind,\n status: nextToolCall.status,\n });\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: TranscriptOutlineEntry[]): 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: TranscriptOutlineEntry): 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 buildSessionTimeline(rows: TranscriptStoredRow[]): SessionTimelineItem[] {\n return buildTranscriptOutline(rows).map((entry) => ({\n id: entry.id,\n kind: entry.kind,\n ...(roleForTimeline(entry.role) ? { role: roleForTimeline(entry.role) } : {}),\n title: entry.title,\n ...(entry.preview ? { preview: entry.preview } : {}),\n ...(entry.timestamp !== undefined ? { timestamp: entry.timestamp } : {}),\n depth: entry.depth,\n turn: entry.turn,\n ...(entry.displayIndex !== undefined ? { displayIndex: entry.displayIndex } : {}),\n rowNumber: entry.rowNumber,\n ...(entry.status ? { status: entry.status } : {}),\n ...(entry.meta ? { meta: entry.meta } : {}),\n }));\n}\n"],"mappings":"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"}
@@ -9,8 +9,6 @@ export { buildDefaultSessionMetadata, type SessionMetadataSeed, } from './sessio
9
9
  export { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow, type SessionConfigRow, type SessionRow, type TranscriptEntryRow, } from './row-mappers.js';
10
10
  export { deleteSessionRecord, ensureSessionRecord, getCurrentSessionId, getGlobalSessionStats, findSessionKeyBySessionId, getSessionPersistedLevels, getSessionMetadata, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats, } from './session-repository.js';
11
11
  export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint, } from './transcript-repository.js';
12
- export { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory, } from './cron-run-repository.js';
13
- export { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs, } from './cron-job-repository.js';
14
12
  export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
15
13
  export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
16
14
  export { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
@@ -10,11 +10,9 @@ import { buildDefaultSessionMetadata } from "./session-metadata.js";
10
10
  import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
11
11
  import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getCurrentSessionId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
12
12
  import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "./transcript-repository.js";
13
- import { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory } from "./cron-run-repository.js";
14
- import { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs } from "./cron-job-repository.js";
15
13
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
16
14
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
17
15
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
18
16
  import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
19
17
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
20
- export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendCronRun, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteCronJob, deleteCronRunsForJob, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getCompactionCheckpointDetail, getCronJob, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listCronJobs, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readAllCronRuns, readCronJobHistory, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, saveCronJob, saveCronJobs, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
18
+ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -0,0 +1,47 @@
1
+ CREATE TABLE IF NOT EXISTS automations (
2
+ automation_id TEXT PRIMARY KEY,
3
+ name TEXT NOT NULL,
4
+ description TEXT,
5
+ enabled INTEGER NOT NULL,
6
+ trigger_json TEXT NOT NULL,
7
+ action_json TEXT NOT NULL,
8
+ after_run_json TEXT,
9
+ reliability_json TEXT,
10
+ state_json TEXT NOT NULL DEFAULT '{}',
11
+ created_at_ms INTEGER NOT NULL,
12
+ updated_at_ms INTEGER NOT NULL
13
+ );
14
+
15
+ CREATE INDEX IF NOT EXISTS idx_automations_enabled
16
+ ON automations(enabled, updated_at_ms DESC);
17
+ CREATE INDEX IF NOT EXISTS idx_automations_updated
18
+ ON automations(updated_at_ms DESC);
19
+
20
+ CREATE TABLE IF NOT EXISTS automation_runs (
21
+ run_id TEXT PRIMARY KEY,
22
+ automation_id TEXT NOT NULL,
23
+ automation_name TEXT NOT NULL,
24
+ status TEXT NOT NULL,
25
+ trigger_snapshot_json TEXT NOT NULL,
26
+ action_snapshot_json TEXT NOT NULL,
27
+ manual INTEGER NOT NULL,
28
+ created_at_ms INTEGER NOT NULL,
29
+ started_at_ms INTEGER,
30
+ ended_at_ms INTEGER,
31
+ duration_ms INTEGER,
32
+ summary TEXT,
33
+ error TEXT,
34
+ session_key TEXT,
35
+ workflow_run_id TEXT,
36
+ model TEXT
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_automation_runs_automation_created
40
+ ON automation_runs(automation_id, created_at_ms DESC);
41
+ CREATE INDEX IF NOT EXISTS idx_automation_runs_created
42
+ ON automation_runs(created_at_ms DESC);
43
+ CREATE INDEX IF NOT EXISTS idx_automation_runs_status_created
44
+ ON automation_runs(status, created_at_ms DESC);
45
+
46
+ DROP TABLE IF EXISTS cron_jobs;
47
+ DROP TABLE IF EXISTS cron_runs;
@@ -0,0 +1,14 @@
1
+ CREATE TABLE IF NOT EXISTS automation_run_events (
2
+ event_id TEXT PRIMARY KEY,
3
+ run_id TEXT NOT NULL,
4
+ automation_id TEXT NOT NULL,
5
+ type TEXT NOT NULL,
6
+ message TEXT NOT NULL,
7
+ data_json TEXT,
8
+ created_at_ms INTEGER NOT NULL
9
+ );
10
+
11
+ CREATE INDEX IF NOT EXISTS idx_automation_run_events_run_created
12
+ ON automation_run_events(run_id, created_at_ms ASC);
13
+ CREATE INDEX IF NOT EXISTS idx_automation_run_events_automation_created
14
+ ON automation_run_events(automation_id, created_at_ms DESC);
@@ -0,0 +1 @@
1
+ ALTER TABLE automations ADD COLUMN safety_json TEXT;