@evalops/maestro 0.10.8 → 0.10.11

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 (1009) hide show
  1. package/README.md +3 -1
  2. package/dist/agent/action-approval.d.ts +6 -0
  3. package/dist/agent/action-approval.d.ts.map +1 -1
  4. package/dist/agent/action-approval.js.map +1 -1
  5. package/dist/agent/agent.d.ts +13 -1
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +368 -1
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/auto-compaction.d.ts +4 -4
  10. package/dist/agent/auto-compaction.d.ts.map +1 -1
  11. package/dist/agent/auto-compaction.js.map +1 -1
  12. package/dist/agent/compaction-cleanup.d.ts +2 -0
  13. package/dist/agent/compaction-cleanup.d.ts.map +1 -1
  14. package/dist/agent/compaction-cleanup.js +17 -2
  15. package/dist/agent/compaction-cleanup.js.map +1 -1
  16. package/dist/agent/compaction.d.ts +3 -1
  17. package/dist/agent/compaction.d.ts.map +1 -1
  18. package/dist/agent/compaction.js +10 -2
  19. package/dist/agent/compaction.js.map +1 -1
  20. package/dist/agent/context-manager.d.ts +4 -0
  21. package/dist/agent/context-manager.d.ts.map +1 -1
  22. package/dist/agent/context-manager.js +8 -0
  23. package/dist/agent/context-manager.js.map +1 -1
  24. package/dist/agent/context-providers.d.ts +2 -0
  25. package/dist/agent/context-providers.d.ts.map +1 -1
  26. package/dist/agent/context-providers.js +3 -2
  27. package/dist/agent/context-providers.js.map +1 -1
  28. package/dist/agent/providers/google-gemini-cli.js +17 -5
  29. package/dist/agent/providers/google.js +174 -144
  30. package/dist/agent/providers/openai-codex-responses.d.ts +4 -0
  31. package/dist/agent/providers/openai-codex-responses.d.ts.map +1 -0
  32. package/dist/agent/providers/openai-codex-responses.js +637 -0
  33. package/dist/agent/providers/openai-codex-responses.js.map +1 -0
  34. package/dist/agent/providers/openai-codex-session.d.ts +18 -0
  35. package/dist/agent/providers/openai-codex-session.d.ts.map +1 -0
  36. package/dist/agent/providers/openai-codex-session.js +53 -0
  37. package/dist/agent/providers/openai-codex-session.js.map +1 -0
  38. package/dist/agent/providers/openai-responses-sdk.d.ts.map +1 -1
  39. package/dist/agent/providers/openai-responses-sdk.js +16 -6
  40. package/dist/agent/providers/openai-responses-sdk.js.map +1 -1
  41. package/dist/agent/providers/openai-shared.d.ts +12 -5
  42. package/dist/agent/providers/openai-shared.d.ts.map +1 -1
  43. package/dist/agent/providers/openai-shared.js +291 -2
  44. package/dist/agent/providers/openai-shared.js.map +1 -1
  45. package/dist/agent/providers/openai.d.ts +1 -1
  46. package/dist/agent/providers/openai.d.ts.map +1 -1
  47. package/dist/agent/providers/openai.js +48 -20
  48. package/dist/agent/providers/openai.js.map +1 -1
  49. package/dist/agent/providers/vertex.js +7 -0
  50. package/dist/agent/tracing.d.ts +16 -5
  51. package/dist/agent/tracing.d.ts.map +1 -1
  52. package/dist/agent/tracing.js +44 -2
  53. package/dist/agent/tracing.js.map +1 -1
  54. package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
  55. package/dist/agent/transport/create-provider-stream.js +9 -0
  56. package/dist/agent/transport/create-provider-stream.js.map +1 -1
  57. package/dist/agent/transport/tool-execution-bridge.d.ts +86 -0
  58. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -0
  59. package/dist/agent/transport/tool-execution-bridge.js +665 -0
  60. package/dist/agent/transport/tool-execution-bridge.js.map +1 -0
  61. package/dist/agent/transport/tool-execution.d.ts +3 -0
  62. package/dist/agent/transport/tool-execution.d.ts.map +1 -1
  63. package/dist/agent/transport/tool-execution.js +16 -1
  64. package/dist/agent/transport/tool-execution.js.map +1 -1
  65. package/dist/agent/transport/tool-safety-pipeline.d.ts +7 -1
  66. package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
  67. package/dist/agent/transport/tool-safety-pipeline.js +207 -40
  68. package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
  69. package/dist/agent/transport/tool-update-queue.d.ts +2 -0
  70. package/dist/agent/transport/tool-update-queue.d.ts.map +1 -1
  71. package/dist/agent/transport/tool-update-queue.js.map +1 -1
  72. package/dist/agent/transport.d.ts +3 -0
  73. package/dist/agent/transport.d.ts.map +1 -1
  74. package/dist/agent/transport.js +96 -16
  75. package/dist/agent/transport.js.map +1 -1
  76. package/dist/agent/types.d.ts +50 -2
  77. package/dist/agent/types.d.ts.map +1 -1
  78. package/dist/agent/types.js.map +1 -1
  79. package/dist/approvals/platform-action-approval.d.ts +32 -0
  80. package/dist/approvals/platform-action-approval.d.ts.map +1 -0
  81. package/dist/approvals/platform-action-approval.js +210 -0
  82. package/dist/approvals/platform-action-approval.js.map +1 -0
  83. package/dist/approvals/service-client.d.ts +56 -0
  84. package/dist/approvals/service-client.d.ts.map +1 -0
  85. package/dist/approvals/service-client.js +316 -0
  86. package/dist/approvals/service-client.js.map +1 -0
  87. package/dist/audit/logger.d.ts +4 -4
  88. package/dist/bootstrap/auth-setup.d.ts +2 -2
  89. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  90. package/dist/bootstrap/auth-setup.js +4 -7
  91. package/dist/bootstrap/auth-setup.js.map +1 -1
  92. package/dist/cli/args.d.ts +2 -0
  93. package/dist/cli/args.d.ts.map +1 -1
  94. package/dist/cli/args.js +29 -0
  95. package/dist/cli/args.js.map +1 -1
  96. package/dist/cli/commands/codex.d.ts +2 -0
  97. package/dist/cli/commands/codex.d.ts.map +1 -0
  98. package/dist/cli/commands/codex.js +65 -0
  99. package/dist/cli/commands/codex.js.map +1 -0
  100. package/dist/cli/commands/config.js +1 -1
  101. package/dist/cli/commands/config.js.map +1 -1
  102. package/dist/cli/commands/evalops.d.ts +2 -0
  103. package/dist/cli/commands/evalops.d.ts.map +1 -0
  104. package/dist/cli/commands/evalops.js +74 -0
  105. package/dist/cli/commands/evalops.js.map +1 -0
  106. package/dist/cli/commands/hosted-runner.d.ts +23 -0
  107. package/dist/cli/commands/hosted-runner.d.ts.map +1 -0
  108. package/dist/cli/commands/hosted-runner.js +241 -0
  109. package/dist/cli/commands/hosted-runner.js.map +1 -0
  110. package/dist/cli/commands/init.d.ts +4 -0
  111. package/dist/cli/commands/init.d.ts.map +1 -0
  112. package/dist/cli/commands/init.js +140 -0
  113. package/dist/cli/commands/init.js.map +1 -0
  114. package/dist/cli/commands/memory.d.ts.map +1 -1
  115. package/dist/cli/commands/memory.js +23 -30
  116. package/dist/cli/commands/memory.js.map +1 -1
  117. package/dist/cli/commands/remote.d.ts +3 -0
  118. package/dist/cli/commands/remote.d.ts.map +1 -0
  119. package/dist/cli/commands/remote.js +631 -0
  120. package/dist/cli/commands/remote.js.map +1 -0
  121. package/dist/cli/commands/stats.d.ts +7 -0
  122. package/dist/cli/commands/stats.d.ts.map +1 -0
  123. package/dist/cli/commands/stats.js +167 -0
  124. package/dist/cli/commands/stats.js.map +1 -0
  125. package/dist/cli/headless-protocol.d.ts +16 -1
  126. package/dist/cli/headless-protocol.d.ts.map +1 -1
  127. package/dist/cli/headless-protocol.js +60 -4
  128. package/dist/cli/headless-protocol.js.map +1 -1
  129. package/dist/cli/headless.d.ts.map +1 -1
  130. package/dist/cli/headless.js +1 -0
  131. package/dist/cli/headless.js.map +1 -1
  132. package/dist/cli/help.d.ts.map +1 -1
  133. package/dist/cli/help.js +44 -1
  134. package/dist/cli/help.js.map +1 -1
  135. package/dist/cli/jsonl-writer.d.ts.map +1 -1
  136. package/dist/cli/jsonl-writer.js +19 -6
  137. package/dist/cli/jsonl-writer.js.map +1 -1
  138. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  139. package/dist/cli-tui/client-tools/client-tool-controller.js +17 -1
  140. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  141. package/dist/cli-tui/commands/access-command.js +1 -1
  142. package/dist/cli-tui/commands/access-command.js.map +1 -1
  143. package/dist/cli-tui/commands/audit-command.js +1 -1
  144. package/dist/cli-tui/commands/audit-command.js.map +1 -1
  145. package/dist/cli-tui/commands/command-catalog.d.ts +29 -0
  146. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -0
  147. package/dist/cli-tui/commands/command-catalog.js +645 -0
  148. package/dist/cli-tui/commands/command-catalog.js.map +1 -0
  149. package/dist/cli-tui/commands/command-registry-adapter.d.ts +12 -0
  150. package/dist/cli-tui/commands/command-registry-adapter.d.ts.map +1 -0
  151. package/dist/cli-tui/commands/command-registry-adapter.js +120 -0
  152. package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -0
  153. package/dist/cli-tui/commands/command-suite-catalog.d.ts +14 -0
  154. package/dist/cli-tui/commands/command-suite-catalog.d.ts.map +1 -0
  155. package/dist/cli-tui/commands/command-suite-catalog.js +147 -0
  156. package/dist/cli-tui/commands/command-suite-catalog.js.map +1 -0
  157. package/dist/cli-tui/commands/{grouped-command-handlers.d.ts → command-suite-handlers.d.ts} +27 -26
  158. package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -0
  159. package/dist/cli-tui/commands/command-suite-handlers.js +110 -0
  160. package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -0
  161. package/dist/cli-tui/commands/hotkeys-command.d.ts +1 -1
  162. package/dist/cli-tui/commands/hotkeys-command.d.ts.map +1 -1
  163. package/dist/cli-tui/commands/hotkeys-command.js +2 -2
  164. package/dist/cli-tui/commands/hotkeys-command.js.map +1 -1
  165. package/dist/cli-tui/commands/limits-command.js +1 -1
  166. package/dist/cli-tui/commands/limits-command.js.map +1 -1
  167. package/dist/cli-tui/commands/pii-command.js +1 -1
  168. package/dist/cli-tui/commands/pii-command.js.map +1 -1
  169. package/dist/cli-tui/commands/registry.d.ts +1 -1
  170. package/dist/cli-tui/commands/registry.d.ts.map +1 -1
  171. package/dist/cli-tui/commands/registry.js +29 -921
  172. package/dist/cli-tui/commands/registry.js.map +1 -1
  173. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.d.ts +2 -1
  174. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -0
  175. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.js +22 -6
  176. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -0
  177. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.d.ts +0 -1
  178. package/dist/cli-tui/commands/subcommands/config-commands.d.ts.map +1 -0
  179. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.js +2 -2
  180. package/dist/cli-tui/commands/subcommands/config-commands.js.map +1 -0
  181. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.d.ts +1 -2
  182. package/dist/cli-tui/commands/subcommands/diag-commands.d.ts.map +1 -0
  183. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.js +5 -7
  184. package/dist/cli-tui/commands/subcommands/diag-commands.js.map +1 -0
  185. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.d.ts +0 -2
  186. package/dist/cli-tui/commands/subcommands/git-commands.d.ts.map +1 -0
  187. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.js +2 -2
  188. package/dist/cli-tui/commands/subcommands/git-commands.js.map +1 -0
  189. package/dist/cli-tui/commands/{grouped → subcommands}/index.d.ts +2 -2
  190. package/dist/cli-tui/commands/subcommands/index.d.ts.map +1 -0
  191. package/dist/cli-tui/commands/{grouped → subcommands}/index.js +2 -2
  192. package/dist/cli-tui/commands/subcommands/index.js.map +1 -0
  193. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.d.ts +0 -1
  194. package/dist/cli-tui/commands/subcommands/safety-commands.d.ts.map +1 -0
  195. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.js +12 -12
  196. package/dist/cli-tui/commands/subcommands/safety-commands.js.map +1 -0
  197. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.d.ts +1 -2
  198. package/dist/cli-tui/commands/subcommands/session-commands.d.ts.map +1 -0
  199. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.js +3 -3
  200. package/dist/cli-tui/commands/subcommands/session-commands.js.map +1 -0
  201. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.d.ts +0 -1
  202. package/dist/cli-tui/commands/subcommands/tools-commands.d.ts.map +1 -0
  203. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.js +2 -2
  204. package/dist/cli-tui/commands/subcommands/tools-commands.js.map +1 -0
  205. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.d.ts +0 -1
  206. package/dist/cli-tui/commands/subcommands/ui-commands.d.ts.map +1 -0
  207. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.js +5 -5
  208. package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -0
  209. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.d.ts +1 -2
  210. package/dist/cli-tui/commands/subcommands/undo-commands.d.ts.map +1 -0
  211. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.js +6 -6
  212. package/dist/cli-tui/commands/subcommands/undo-commands.js.map +1 -0
  213. package/dist/cli-tui/commands/subcommands/usage-commands.d.ts.map +1 -0
  214. package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.js +2 -2
  215. package/dist/cli-tui/commands/subcommands/usage-commands.js.map +1 -0
  216. package/dist/cli-tui/commands/{grouped → subcommands}/utils.d.ts +15 -15
  217. package/dist/cli-tui/commands/subcommands/utils.d.ts.map +1 -0
  218. package/dist/cli-tui/commands/{grouped → subcommands}/utils.js +13 -8
  219. package/dist/cli-tui/commands/subcommands/utils.js.map +1 -0
  220. package/dist/cli-tui/commands/types.d.ts +3 -3
  221. package/dist/cli-tui/commands/types.d.ts.map +1 -1
  222. package/dist/cli-tui/commands/types.js.map +1 -1
  223. package/dist/cli-tui/editor-view.d.ts +1 -1
  224. package/dist/cli-tui/editor-view.d.ts.map +1 -1
  225. package/dist/cli-tui/editor-view.js +1 -1
  226. package/dist/cli-tui/editor-view.js.map +1 -1
  227. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts +4 -0
  228. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  229. package/dist/cli-tui/oauth/oauth-flow-controller.js +76 -5
  230. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  231. package/dist/cli-tui/run/run-controller.d.ts +2 -2
  232. package/dist/cli-tui/run/run-controller.d.ts.map +1 -1
  233. package/dist/cli-tui/run/run-controller.js +3 -2
  234. package/dist/cli-tui/run/run-controller.js.map +1 -1
  235. package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
  236. package/dist/cli-tui/run/run-shell-command.js +11 -3
  237. package/dist/cli-tui/run/run-shell-command.js.map +1 -1
  238. package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
  239. package/dist/cli-tui/run/streaming-shell-command.js +11 -3
  240. package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
  241. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  242. package/dist/cli-tui/selectors/model-selector.js +1 -0
  243. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  244. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts +8 -0
  245. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts.map +1 -1
  246. package/dist/cli-tui/tui-renderer/agent-event-bridge.js +23 -2
  247. package/dist/cli-tui/tui-renderer/agent-event-bridge.js.map +1 -1
  248. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts +3 -3
  249. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
  250. package/dist/cli-tui/tui-renderer/command-registry-options.js +12 -2
  251. package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
  252. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +32 -0
  253. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -0
  254. package/dist/cli-tui/tui-renderer/command-suite-wiring.js +108 -0
  255. package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -0
  256. package/dist/cli-tui/tui-renderer/input-controller.d.ts +2 -2
  257. package/dist/cli-tui/tui-renderer/input-controller.d.ts.map +1 -1
  258. package/dist/cli-tui/tui-renderer/input-controller.js +2 -2
  259. package/dist/cli-tui/tui-renderer/input-controller.js.map +1 -1
  260. package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
  261. package/dist/cli-tui/tui-renderer/ui-state-controller.js +1 -1
  262. package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
  263. package/dist/cli-tui/tui-renderer.d.ts +1 -3
  264. package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
  265. package/dist/cli-tui/tui-renderer.js +37 -83
  266. package/dist/cli-tui/tui-renderer.js.map +1 -1
  267. package/dist/cli-tui/utils/runtime-badges.d.ts +8 -0
  268. package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
  269. package/dist/cli-tui/utils/runtime-badges.js +58 -0
  270. package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
  271. package/dist/cli.js +42555 -23133
  272. package/dist/cli.js.map +1 -1
  273. package/dist/config/env-vars.d.ts +4 -0
  274. package/dist/config/env-vars.d.ts.map +1 -1
  275. package/dist/config/env-vars.js +4 -0
  276. package/dist/config/env-vars.js.map +1 -1
  277. package/dist/config/feature-flags.d.ts +44 -0
  278. package/dist/config/feature-flags.d.ts.map +1 -1
  279. package/dist/config/feature-flags.js +214 -0
  280. package/dist/config/feature-flags.js.map +1 -1
  281. package/dist/connectors/service-client.d.ts +98 -0
  282. package/dist/connectors/service-client.d.ts.map +1 -0
  283. package/dist/connectors/service-client.js +459 -0
  284. package/dist/connectors/service-client.js.map +1 -0
  285. package/dist/conversation/render-model.d.ts.map +1 -1
  286. package/dist/conversation/render-model.js +53 -3
  287. package/dist/conversation/render-model.js.map +1 -1
  288. package/dist/db/health.d.ts +8 -0
  289. package/dist/db/health.d.ts.map +1 -0
  290. package/dist/db/health.js +64 -0
  291. package/dist/db/health.js.map +1 -0
  292. package/dist/db/migrate.d.ts +301 -0
  293. package/dist/db/migrate.d.ts.map +1 -1
  294. package/dist/db/migrate.js +186 -0
  295. package/dist/db/migrate.js.map +1 -1
  296. package/dist/db/migrations/0000_initial.sql +308 -0
  297. package/dist/db/migrations/0001_shared_sessions.sql +18 -0
  298. package/dist/db/migrations/0002_usage_metrics.sql +28 -0
  299. package/dist/db/migrations/0003_execution_traces.sql +18 -0
  300. package/dist/db/migrations/0004_workspace_config.sql +11 -0
  301. package/dist/db/migrations/0005_revenue_attribution.sql +31 -0
  302. package/dist/db/migrations/0006_hosted_session_storage.sql +51 -0
  303. package/dist/db/migrations/0007_reconcile_legacy_audit_hash_cache.sql +24 -0
  304. package/dist/db/migrations/0008_reconcile_legacy_webhook_deliveries.sql +290 -0
  305. package/dist/db/migrations/meta/0000_snapshot.json +2438 -0
  306. package/dist/db/migrations/meta/_journal.json +69 -0
  307. package/dist/db/schema.d.ts +2232 -844
  308. package/dist/db/schema.d.ts.map +1 -1
  309. package/dist/db/schema.js +187 -1
  310. package/dist/db/schema.js.map +1 -1
  311. package/dist/evalops/agent-bootstrap.d.ts +73 -0
  312. package/dist/evalops/agent-bootstrap.d.ts.map +1 -0
  313. package/dist/evalops/agent-bootstrap.js +380 -0
  314. package/dist/evalops/agent-bootstrap.js.map +1 -0
  315. package/dist/export-html.d.ts.map +1 -1
  316. package/dist/export-html.js +7 -4
  317. package/dist/export-html.js.map +1 -1
  318. package/dist/headless/utility-command-manager.d.ts +2 -1
  319. package/dist/headless/utility-command-manager.d.ts.map +1 -1
  320. package/dist/headless/utility-command-manager.js +12 -6
  321. package/dist/headless/utility-command-manager.js.map +1 -1
  322. package/dist/headless/utility-file-read.d.ts +1 -0
  323. package/dist/headless/utility-file-read.d.ts.map +1 -1
  324. package/dist/headless/utility-file-read.js +5 -1
  325. package/dist/headless/utility-file-read.js.map +1 -1
  326. package/dist/headless/utility-file-search.d.ts +1 -0
  327. package/dist/headless/utility-file-search.d.ts.map +1 -1
  328. package/dist/headless/utility-file-search.js +4 -1
  329. package/dist/headless/utility-file-search.js.map +1 -1
  330. package/dist/headless/utility-file-watch-manager.d.ts +2 -1
  331. package/dist/headless/utility-file-watch-manager.d.ts.map +1 -1
  332. package/dist/headless/utility-file-watch-manager.js +6 -2
  333. package/dist/headless/utility-file-watch-manager.js.map +1 -1
  334. package/dist/headless/workspace-root.d.ts +8 -0
  335. package/dist/headless/workspace-root.d.ts.map +1 -0
  336. package/dist/headless/workspace-root.js +74 -0
  337. package/dist/headless/workspace-root.js.map +1 -0
  338. package/dist/hooks/notification-hooks.d.ts +5 -0
  339. package/dist/hooks/notification-hooks.d.ts.map +1 -1
  340. package/dist/hooks/notification-hooks.js +4 -0
  341. package/dist/hooks/notification-hooks.js.map +1 -1
  342. package/dist/lsp/diagnostic-deltas.d.ts +20 -0
  343. package/dist/lsp/diagnostic-deltas.d.ts.map +1 -0
  344. package/dist/lsp/diagnostic-deltas.js +92 -0
  345. package/dist/lsp/diagnostic-deltas.js.map +1 -0
  346. package/dist/lsp/diagnostic-repair.d.ts +48 -0
  347. package/dist/lsp/diagnostic-repair.d.ts.map +1 -0
  348. package/dist/lsp/diagnostic-repair.js +143 -0
  349. package/dist/lsp/diagnostic-repair.js.map +1 -0
  350. package/dist/main.d.ts.map +1 -1
  351. package/dist/main.js +127 -37
  352. package/dist/main.js.map +1 -1
  353. package/dist/mcp/config.d.ts +4 -2
  354. package/dist/mcp/config.d.ts.map +1 -1
  355. package/dist/mcp/config.js +58 -14
  356. package/dist/mcp/config.js.map +1 -1
  357. package/dist/mcp/index.d.ts +1 -0
  358. package/dist/mcp/index.d.ts.map +1 -1
  359. package/dist/mcp/index.js +1 -0
  360. package/dist/mcp/index.js.map +1 -1
  361. package/dist/mcp/manager.d.ts +1 -0
  362. package/dist/mcp/manager.d.ts.map +1 -1
  363. package/dist/mcp/manager.js +1 -0
  364. package/dist/mcp/manager.js.map +1 -1
  365. package/dist/mcp/platform-plugin.d.ts +3 -0
  366. package/dist/mcp/platform-plugin.d.ts.map +1 -0
  367. package/dist/mcp/platform-plugin.js +117 -0
  368. package/dist/mcp/platform-plugin.js.map +1 -0
  369. package/dist/mcp/tool-bridge.d.ts +15 -0
  370. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  371. package/dist/mcp/tool-bridge.js +194 -6
  372. package/dist/mcp/tool-bridge.js.map +1 -1
  373. package/dist/memory/platform-memory-client.d.ts +130 -0
  374. package/dist/memory/platform-memory-client.d.ts.map +1 -0
  375. package/dist/memory/platform-memory-client.js +330 -0
  376. package/dist/memory/platform-memory-client.js.map +1 -0
  377. package/dist/memory/service-client.d.ts.map +1 -1
  378. package/dist/memory/service-client.js +1 -2
  379. package/dist/memory/service-client.js.map +1 -1
  380. package/dist/models/builtin.d.ts.map +1 -1
  381. package/dist/models/builtin.js +137 -0
  382. package/dist/models/builtin.js.map +1 -1
  383. package/dist/models/config-loader.d.ts +10 -10
  384. package/dist/models/config-loader.d.ts.map +1 -1
  385. package/dist/models/config-loader.js +1 -0
  386. package/dist/models/config-loader.js.map +1 -1
  387. package/dist/models/registry.d.ts +1 -0
  388. package/dist/models/registry.d.ts.map +1 -1
  389. package/dist/models/registry.js +1 -0
  390. package/dist/models/registry.js.map +1 -1
  391. package/dist/oauth/connectors.d.ts +25 -0
  392. package/dist/oauth/connectors.d.ts.map +1 -0
  393. package/dist/oauth/connectors.js +253 -0
  394. package/dist/oauth/connectors.js.map +1 -0
  395. package/dist/oauth/device-identity.d.ts +18 -0
  396. package/dist/oauth/device-identity.d.ts.map +1 -0
  397. package/dist/oauth/device-identity.js +193 -0
  398. package/dist/oauth/device-identity.js.map +1 -0
  399. package/dist/oauth/evalops.d.ts.map +1 -1
  400. package/dist/oauth/evalops.js +74 -15
  401. package/dist/oauth/evalops.js.map +1 -1
  402. package/dist/oauth/index.d.ts +1 -1
  403. package/dist/oauth/index.d.ts.map +1 -1
  404. package/dist/oauth/index.js +31 -1
  405. package/dist/oauth/index.js.map +1 -1
  406. package/dist/oauth/openai-codex.d.ts +16 -0
  407. package/dist/oauth/openai-codex.d.ts.map +1 -0
  408. package/dist/oauth/openai-codex.js +300 -0
  409. package/dist/oauth/openai-codex.js.map +1 -0
  410. package/dist/opentelemetry.d.ts.map +1 -1
  411. package/dist/opentelemetry.js +9 -2
  412. package/dist/opentelemetry.js.map +1 -1
  413. package/dist/platform/agent-runtime-client.d.ts +279 -0
  414. package/dist/platform/agent-runtime-client.d.ts.map +1 -0
  415. package/dist/platform/agent-runtime-client.js +515 -0
  416. package/dist/platform/agent-runtime-client.js.map +1 -0
  417. package/dist/platform/cerebro-facts-client.d.ts +56 -0
  418. package/dist/platform/cerebro-facts-client.d.ts.map +1 -0
  419. package/dist/platform/cerebro-facts-client.js +297 -0
  420. package/dist/platform/cerebro-facts-client.js.map +1 -0
  421. package/dist/platform/client.d.ts +2 -1
  422. package/dist/platform/client.d.ts.map +1 -1
  423. package/dist/platform/client.js +9 -26
  424. package/dist/platform/client.js.map +1 -1
  425. package/dist/platform/core-services.d.ts +128 -0
  426. package/dist/platform/core-services.d.ts.map +1 -1
  427. package/dist/platform/core-services.js +128 -0
  428. package/dist/platform/core-services.js.map +1 -1
  429. package/dist/platform/maestro-timeline-client.d.ts +22 -0
  430. package/dist/platform/maestro-timeline-client.d.ts.map +1 -0
  431. package/dist/platform/maestro-timeline-client.js +373 -0
  432. package/dist/platform/maestro-timeline-client.js.map +1 -0
  433. package/dist/platform/tool-execution-client.d.ts +104 -0
  434. package/dist/platform/tool-execution-client.d.ts.map +1 -0
  435. package/dist/platform/tool-execution-client.js +284 -0
  436. package/dist/platform/tool-execution-client.js.map +1 -0
  437. package/dist/prompts/service-client.d.ts.map +1 -1
  438. package/dist/prompts/service-client.js +5 -2
  439. package/dist/prompts/service-client.js.map +1 -1
  440. package/dist/providers/anthropic-auth.d.ts.map +1 -1
  441. package/dist/providers/anthropic-auth.js +8 -6
  442. package/dist/providers/anthropic-auth.js.map +1 -1
  443. package/dist/providers/api-keys.d.ts +1 -0
  444. package/dist/providers/api-keys.d.ts.map +1 -1
  445. package/dist/providers/api-keys.js +5 -0
  446. package/dist/providers/api-keys.js.map +1 -1
  447. package/dist/providers/auth.d.ts +2 -1
  448. package/dist/providers/auth.d.ts.map +1 -1
  449. package/dist/providers/auth.js +26 -3
  450. package/dist/providers/auth.js.map +1 -1
  451. package/dist/remote-runner/attach-client.d.ts +41 -0
  452. package/dist/remote-runner/attach-client.d.ts.map +1 -0
  453. package/dist/remote-runner/attach-client.js +692 -0
  454. package/dist/remote-runner/attach-client.js.map +1 -0
  455. package/dist/remote-runner/client.d.ts +205 -0
  456. package/dist/remote-runner/client.d.ts.map +1 -0
  457. package/dist/remote-runner/client.js +633 -0
  458. package/dist/remote-runner/client.js.map +1 -0
  459. package/dist/safety/action-firewall.d.ts +6 -1
  460. package/dist/safety/action-firewall.d.ts.map +1 -1
  461. package/dist/safety/action-firewall.js +62 -26
  462. package/dist/safety/action-firewall.js.map +1 -1
  463. package/dist/safety/governance-service-client.d.ts +36 -0
  464. package/dist/safety/governance-service-client.d.ts.map +1 -0
  465. package/dist/safety/governance-service-client.js +279 -0
  466. package/dist/safety/governance-service-client.js.map +1 -0
  467. package/dist/safety/policy.d.ts +13 -2
  468. package/dist/safety/policy.d.ts.map +1 -1
  469. package/dist/safety/policy.js +474 -52
  470. package/dist/safety/policy.js.map +1 -1
  471. package/dist/sdk-tools.d.ts +21 -0
  472. package/dist/sdk-tools.d.ts.map +1 -1
  473. package/dist/sdk-tools.js +16 -0
  474. package/dist/sdk-tools.js.map +1 -1
  475. package/dist/server/app-context.d.ts +25 -0
  476. package/dist/server/app-context.d.ts.map +1 -1
  477. package/dist/server/app-context.js.map +1 -1
  478. package/dist/server/approval-service.d.ts +7 -8
  479. package/dist/server/approval-service.d.ts.map +1 -1
  480. package/dist/server/approval-service.js +12 -24
  481. package/dist/server/approval-service.js.map +1 -1
  482. package/dist/server/authz.d.ts +23 -2
  483. package/dist/server/authz.d.ts.map +1 -1
  484. package/dist/server/authz.js +153 -17
  485. package/dist/server/authz.js.map +1 -1
  486. package/dist/server/handlers/approvals.d.ts.map +1 -1
  487. package/dist/server/handlers/approvals.js +3 -10
  488. package/dist/server/handlers/approvals.js.map +1 -1
  489. package/dist/server/handlers/branch.d.ts.map +1 -1
  490. package/dist/server/handlers/branch.js +29 -20
  491. package/dist/server/handlers/branch.js.map +1 -1
  492. package/dist/server/handlers/bridge.d.ts.map +1 -1
  493. package/dist/server/handlers/bridge.js +3 -2
  494. package/dist/server/handlers/bridge.js.map +1 -1
  495. package/dist/server/handlers/chat-ws.d.ts.map +1 -1
  496. package/dist/server/handlers/chat-ws.js +23 -31
  497. package/dist/server/handlers/chat-ws.js.map +1 -1
  498. package/dist/server/handlers/chat.d.ts.map +1 -1
  499. package/dist/server/handlers/chat.js +105 -46
  500. package/dist/server/handlers/chat.js.map +1 -1
  501. package/dist/server/handlers/compliance.d.ts +3 -0
  502. package/dist/server/handlers/compliance.d.ts.map +1 -0
  503. package/dist/server/handlers/compliance.js +53 -0
  504. package/dist/server/handlers/compliance.js.map +1 -0
  505. package/dist/server/handlers/context.d.ts.map +1 -1
  506. package/dist/server/handlers/context.js +3 -8
  507. package/dist/server/handlers/context.js.map +1 -1
  508. package/dist/server/handlers/fleet.d.ts +4 -0
  509. package/dist/server/handlers/fleet.d.ts.map +1 -0
  510. package/dist/server/handlers/fleet.js +9 -0
  511. package/dist/server/handlers/fleet.js.map +1 -0
  512. package/dist/server/handlers/headless-sessions.d.ts +4 -0
  513. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  514. package/dist/server/handlers/headless-sessions.js +168 -3
  515. package/dist/server/handlers/headless-sessions.js.map +1 -1
  516. package/dist/server/handlers/health.d.ts +31 -2
  517. package/dist/server/handlers/health.d.ts.map +1 -1
  518. package/dist/server/handlers/health.js +82 -8
  519. package/dist/server/handlers/health.js.map +1 -1
  520. package/dist/server/handlers/hosted-runner-drain.d.ts +128 -0
  521. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -0
  522. package/dist/server/handlers/hosted-runner-drain.js +373 -0
  523. package/dist/server/handlers/hosted-runner-drain.js.map +1 -0
  524. package/dist/server/handlers/hosted-runner-identity.d.ts +17 -0
  525. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -0
  526. package/dist/server/handlers/hosted-runner-identity.js +39 -0
  527. package/dist/server/handlers/hosted-runner-identity.js.map +1 -0
  528. package/dist/server/handlers/intelligent-router.d.ts +3 -0
  529. package/dist/server/handlers/intelligent-router.d.ts.map +1 -0
  530. package/dist/server/handlers/intelligent-router.js +141 -0
  531. package/dist/server/handlers/intelligent-router.js.map +1 -0
  532. package/dist/server/handlers/models.d.ts.map +1 -1
  533. package/dist/server/handlers/models.js +14 -0
  534. package/dist/server/handlers/models.js.map +1 -1
  535. package/dist/server/handlers/pending-requests.d.ts +8 -0
  536. package/dist/server/handlers/pending-requests.d.ts.map +1 -0
  537. package/dist/server/handlers/pending-requests.js +149 -0
  538. package/dist/server/handlers/pending-requests.js.map +1 -0
  539. package/dist/server/handlers/revenue-attribution.d.ts +3 -0
  540. package/dist/server/handlers/revenue-attribution.d.ts.map +1 -0
  541. package/dist/server/handlers/revenue-attribution.js +45 -0
  542. package/dist/server/handlers/revenue-attribution.js.map +1 -0
  543. package/dist/server/handlers/runtime-app-server-ws.d.ts +10 -0
  544. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -0
  545. package/dist/server/handlers/runtime-app-server-ws.js +206 -0
  546. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -0
  547. package/dist/server/handlers/session-artifacts.js +2 -2
  548. package/dist/server/handlers/session-artifacts.js.map +1 -1
  549. package/dist/server/handlers/session-attachments.js +3 -3
  550. package/dist/server/handlers/session-attachments.js.map +1 -1
  551. package/dist/server/handlers/session-timeline.d.ts +11 -0
  552. package/dist/server/handlers/session-timeline.d.ts.map +1 -0
  553. package/dist/server/handlers/session-timeline.js +77 -0
  554. package/dist/server/handlers/session-timeline.js.map +1 -0
  555. package/dist/server/handlers/sessions.d.ts +11 -0
  556. package/dist/server/handlers/sessions.d.ts.map +1 -1
  557. package/dist/server/handlers/sessions.js +68 -100
  558. package/dist/server/handlers/sessions.js.map +1 -1
  559. package/dist/server/handlers/traces.d.ts +3 -0
  560. package/dist/server/handlers/traces.d.ts.map +1 -0
  561. package/dist/server/handlers/traces.js +60 -0
  562. package/dist/server/handlers/traces.js.map +1 -0
  563. package/dist/server/handlers/usage-analytics.d.ts +3 -0
  564. package/dist/server/handlers/usage-analytics.d.ts.map +1 -0
  565. package/dist/server/handlers/usage-analytics.js +40 -0
  566. package/dist/server/handlers/usage-analytics.js.map +1 -0
  567. package/dist/server/handlers/workspace-config.d.ts +3 -0
  568. package/dist/server/handlers/workspace-config.d.ts.map +1 -0
  569. package/dist/server/handlers/workspace-config.js +62 -0
  570. package/dist/server/handlers/workspace-config.js.map +1 -0
  571. package/dist/server/headless-in-process-host.d.ts +8 -1
  572. package/dist/server/headless-in-process-host.d.ts.map +1 -1
  573. package/dist/server/headless-in-process-host.js +6 -0
  574. package/dist/server/headless-in-process-host.js.map +1 -1
  575. package/dist/server/headless-runtime-service.d.ts +99 -1
  576. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  577. package/dist/server/headless-runtime-service.js +286 -23
  578. package/dist/server/headless-runtime-service.js.map +1 -1
  579. package/dist/server/hosted-session-manager.d.ts +103 -0
  580. package/dist/server/hosted-session-manager.d.ts.map +1 -0
  581. package/dist/server/hosted-session-manager.js +629 -0
  582. package/dist/server/hosted-session-manager.js.map +1 -0
  583. package/dist/server/pending-request-payload.d.ts +4 -0
  584. package/dist/server/pending-request-payload.d.ts.map +1 -0
  585. package/dist/server/pending-request-payload.js +107 -0
  586. package/dist/server/pending-request-payload.js.map +1 -0
  587. package/dist/server/request-context.d.ts +4 -0
  588. package/dist/server/request-context.d.ts.map +1 -1
  589. package/dist/server/request-context.js +9 -0
  590. package/dist/server/request-context.js.map +1 -1
  591. package/dist/server/routes.d.ts.map +1 -1
  592. package/dist/server/routes.js +149 -1
  593. package/dist/server/routes.js.map +1 -1
  594. package/dist/server/runtime-ws-access.d.ts +16 -0
  595. package/dist/server/runtime-ws-access.d.ts.map +1 -0
  596. package/dist/server/runtime-ws-access.js +21 -0
  597. package/dist/server/runtime-ws-access.js.map +1 -0
  598. package/dist/server/server-middlewares.d.ts +1 -1
  599. package/dist/server/server-middlewares.d.ts.map +1 -1
  600. package/dist/server/server-middlewares.js +35 -27
  601. package/dist/server/server-middlewares.js.map +1 -1
  602. package/dist/server/server-request-manager.d.ts +8 -27
  603. package/dist/server/server-request-manager.d.ts.map +1 -1
  604. package/dist/server/server-request-manager.js +7 -0
  605. package/dist/server/server-request-manager.js.map +1 -1
  606. package/dist/server/server-utils.d.ts +2 -1
  607. package/dist/server/server-utils.d.ts.map +1 -1
  608. package/dist/server/server-utils.js +11 -1
  609. package/dist/server/server-utils.js.map +1 -1
  610. package/dist/server/session-event-env.d.ts +2 -0
  611. package/dist/server/session-event-env.d.ts.map +1 -0
  612. package/dist/server/session-event-env.js +8 -0
  613. package/dist/server/session-event-env.js.map +1 -0
  614. package/dist/server/session-initialization.d.ts +25 -4
  615. package/dist/server/session-initialization.d.ts.map +1 -1
  616. package/dist/server/session-initialization.js +22 -5
  617. package/dist/server/session-initialization.js.map +1 -1
  618. package/dist/server/session-scope.d.ts +4 -0
  619. package/dist/server/session-scope.d.ts.map +1 -1
  620. package/dist/server/session-scope.js +44 -4
  621. package/dist/server/session-scope.js.map +1 -1
  622. package/dist/server/session-timeline.d.ts +13 -0
  623. package/dist/server/session-timeline.d.ts.map +1 -0
  624. package/dist/server/session-timeline.js +566 -0
  625. package/dist/server/session-timeline.js.map +1 -0
  626. package/dist/services/compliance/controls.d.ts +6 -0
  627. package/dist/services/compliance/controls.d.ts.map +1 -0
  628. package/dist/services/compliance/controls.js +113 -0
  629. package/dist/services/compliance/controls.js.map +1 -0
  630. package/dist/services/compliance/index.d.ts +6 -0
  631. package/dist/services/compliance/index.d.ts.map +1 -0
  632. package/dist/services/compliance/index.js +5 -0
  633. package/dist/services/compliance/index.js.map +1 -0
  634. package/dist/services/compliance/normalize.d.ts +23 -0
  635. package/dist/services/compliance/normalize.d.ts.map +1 -0
  636. package/dist/services/compliance/normalize.js +226 -0
  637. package/dist/services/compliance/normalize.js.map +1 -0
  638. package/dist/services/compliance/recorder.d.ts +22 -0
  639. package/dist/services/compliance/recorder.d.ts.map +1 -0
  640. package/dist/services/compliance/recorder.js +89 -0
  641. package/dist/services/compliance/recorder.js.map +1 -0
  642. package/dist/services/compliance/service.d.ts +24 -0
  643. package/dist/services/compliance/service.d.ts.map +1 -0
  644. package/dist/services/compliance/service.js +426 -0
  645. package/dist/services/compliance/service.js.map +1 -0
  646. package/dist/services/compliance/types.d.ts +185 -0
  647. package/dist/services/compliance/types.d.ts.map +1 -0
  648. package/dist/services/compliance/types.js +2 -0
  649. package/dist/services/compliance/types.js.map +1 -0
  650. package/dist/services/intelligent-router/index.d.ts +5 -0
  651. package/dist/services/intelligent-router/index.d.ts.map +1 -0
  652. package/dist/services/intelligent-router/index.js +5 -0
  653. package/dist/services/intelligent-router/index.js.map +1 -0
  654. package/dist/services/intelligent-router/normalize.d.ts +9 -0
  655. package/dist/services/intelligent-router/normalize.d.ts.map +1 -0
  656. package/dist/services/intelligent-router/normalize.js +169 -0
  657. package/dist/services/intelligent-router/normalize.js.map +1 -0
  658. package/dist/services/intelligent-router/recorder.d.ts +24 -0
  659. package/dist/services/intelligent-router/recorder.d.ts.map +1 -0
  660. package/dist/services/intelligent-router/recorder.js +98 -0
  661. package/dist/services/intelligent-router/recorder.js.map +1 -0
  662. package/dist/services/intelligent-router/service.d.ts +22 -0
  663. package/dist/services/intelligent-router/service.d.ts.map +1 -0
  664. package/dist/services/intelligent-router/service.js +328 -0
  665. package/dist/services/intelligent-router/service.js.map +1 -0
  666. package/dist/services/intelligent-router/types.d.ts +98 -0
  667. package/dist/services/intelligent-router/types.d.ts.map +1 -0
  668. package/dist/services/intelligent-router/types.js +7 -0
  669. package/dist/services/intelligent-router/types.js.map +1 -0
  670. package/dist/services/revenue-attribution/index.d.ts +4 -0
  671. package/dist/services/revenue-attribution/index.d.ts.map +1 -0
  672. package/dist/services/revenue-attribution/index.js +4 -0
  673. package/dist/services/revenue-attribution/index.js.map +1 -0
  674. package/dist/services/revenue-attribution/normalize.d.ts +13 -0
  675. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -0
  676. package/dist/services/revenue-attribution/normalize.js +155 -0
  677. package/dist/services/revenue-attribution/normalize.js.map +1 -0
  678. package/dist/services/revenue-attribution/service.d.ts +21 -0
  679. package/dist/services/revenue-attribution/service.d.ts.map +1 -0
  680. package/dist/services/revenue-attribution/service.js +248 -0
  681. package/dist/services/revenue-attribution/service.js.map +1 -0
  682. package/dist/services/revenue-attribution/types.d.ts +96 -0
  683. package/dist/services/revenue-attribution/types.d.ts.map +1 -0
  684. package/dist/services/revenue-attribution/types.js +7 -0
  685. package/dist/services/revenue-attribution/types.js.map +1 -0
  686. package/dist/services/traces/index.d.ts +5 -0
  687. package/dist/services/traces/index.d.ts.map +1 -0
  688. package/dist/services/traces/index.js +4 -0
  689. package/dist/services/traces/index.js.map +1 -0
  690. package/dist/services/traces/normalize.d.ts +20 -0
  691. package/dist/services/traces/normalize.d.ts.map +1 -0
  692. package/dist/services/traces/normalize.js +261 -0
  693. package/dist/services/traces/normalize.js.map +1 -0
  694. package/dist/services/traces/otel.d.ts +3 -0
  695. package/dist/services/traces/otel.d.ts.map +1 -0
  696. package/dist/services/traces/otel.js +173 -0
  697. package/dist/services/traces/otel.js.map +1 -0
  698. package/dist/services/traces/service.d.ts +17 -0
  699. package/dist/services/traces/service.d.ts.map +1 -0
  700. package/dist/services/traces/service.js +197 -0
  701. package/dist/services/traces/service.js.map +1 -0
  702. package/dist/services/traces/types.d.ts +130 -0
  703. package/dist/services/traces/types.d.ts.map +1 -0
  704. package/dist/services/traces/types.js +8 -0
  705. package/dist/services/traces/types.js.map +1 -0
  706. package/dist/services/usage-analytics/aggregation.d.ts +18 -0
  707. package/dist/services/usage-analytics/aggregation.d.ts.map +1 -0
  708. package/dist/services/usage-analytics/aggregation.js +130 -0
  709. package/dist/services/usage-analytics/aggregation.js.map +1 -0
  710. package/dist/services/usage-analytics/index.d.ts +5 -0
  711. package/dist/services/usage-analytics/index.d.ts.map +1 -0
  712. package/dist/services/usage-analytics/index.js +4 -0
  713. package/dist/services/usage-analytics/index.js.map +1 -0
  714. package/dist/services/usage-analytics/recorder.d.ts +16 -0
  715. package/dist/services/usage-analytics/recorder.d.ts.map +1 -0
  716. package/dist/services/usage-analytics/recorder.js +128 -0
  717. package/dist/services/usage-analytics/recorder.js.map +1 -0
  718. package/dist/services/usage-analytics/service.d.ts +15 -0
  719. package/dist/services/usage-analytics/service.d.ts.map +1 -0
  720. package/dist/services/usage-analytics/service.js +210 -0
  721. package/dist/services/usage-analytics/service.js.map +1 -0
  722. package/dist/services/usage-analytics/types.d.ts +80 -0
  723. package/dist/services/usage-analytics/types.d.ts.map +1 -0
  724. package/dist/services/usage-analytics/types.js +2 -0
  725. package/dist/services/usage-analytics/types.js.map +1 -0
  726. package/dist/services/workspace-config/index.d.ts +6 -0
  727. package/dist/services/workspace-config/index.d.ts.map +1 -0
  728. package/dist/services/workspace-config/index.js +5 -0
  729. package/dist/services/workspace-config/index.js.map +1 -0
  730. package/dist/services/workspace-config/middleware.d.ts +5 -0
  731. package/dist/services/workspace-config/middleware.d.ts.map +1 -0
  732. package/dist/services/workspace-config/middleware.js +98 -0
  733. package/dist/services/workspace-config/middleware.js.map +1 -0
  734. package/dist/services/workspace-config/normalize.d.ts +17 -0
  735. package/dist/services/workspace-config/normalize.d.ts.map +1 -0
  736. package/dist/services/workspace-config/normalize.js +148 -0
  737. package/dist/services/workspace-config/normalize.js.map +1 -0
  738. package/dist/services/workspace-config/policy.d.ts +16 -0
  739. package/dist/services/workspace-config/policy.d.ts.map +1 -0
  740. package/dist/services/workspace-config/policy.js +77 -0
  741. package/dist/services/workspace-config/policy.js.map +1 -0
  742. package/dist/services/workspace-config/service.d.ts +20 -0
  743. package/dist/services/workspace-config/service.d.ts.map +1 -0
  744. package/dist/services/workspace-config/service.js +162 -0
  745. package/dist/services/workspace-config/service.js.map +1 -0
  746. package/dist/services/workspace-config/types.d.ts +71 -0
  747. package/dist/services/workspace-config/types.d.ts.map +1 -0
  748. package/dist/services/workspace-config/types.js +2 -0
  749. package/dist/services/workspace-config/types.js.map +1 -0
  750. package/dist/session/manager.d.ts.map +1 -1
  751. package/dist/session/manager.js +10 -0
  752. package/dist/session/manager.js.map +1 -1
  753. package/dist/session/migration.d.ts.map +1 -1
  754. package/dist/session/migration.js +2 -1
  755. package/dist/session/migration.js.map +1 -1
  756. package/dist/session/session-memory.d.ts.map +1 -1
  757. package/dist/session/session-memory.js +7 -1
  758. package/dist/session/session-memory.js.map +1 -1
  759. package/dist/session/types.d.ts +1 -2
  760. package/dist/session/types.d.ts.map +1 -1
  761. package/dist/session/types.js +1 -22
  762. package/dist/session/types.js.map +1 -1
  763. package/dist/session/wire-format.d.ts +7 -0
  764. package/dist/session/wire-format.d.ts.map +1 -0
  765. package/dist/session/wire-format.generated.d.ts +95 -0
  766. package/dist/session/wire-format.generated.d.ts.map +1 -0
  767. package/dist/session/wire-format.generated.js +111 -0
  768. package/dist/session/wire-format.generated.js.map +1 -0
  769. package/dist/session/wire-format.js +145 -0
  770. package/dist/session/wire-format.js.map +1 -0
  771. package/dist/shared-memory/client.d.ts.map +1 -1
  772. package/dist/shared-memory/client.js +22 -22
  773. package/dist/shared-memory/client.js.map +1 -1
  774. package/dist/skills/artifact-metadata.d.ts +16 -0
  775. package/dist/skills/artifact-metadata.d.ts.map +1 -0
  776. package/dist/skills/artifact-metadata.js +86 -0
  777. package/dist/skills/artifact-metadata.js.map +1 -0
  778. package/dist/skills/loader.d.ts +2 -2
  779. package/dist/skills/loader.d.ts.map +1 -1
  780. package/dist/skills/loader.js +1 -0
  781. package/dist/skills/loader.js.map +1 -1
  782. package/dist/skills/service-client.d.ts +42 -0
  783. package/dist/skills/service-client.d.ts.map +1 -0
  784. package/dist/skills/service-client.js +258 -0
  785. package/dist/skills/service-client.js.map +1 -0
  786. package/dist/skills/tool.d.ts +3 -0
  787. package/dist/skills/tool.d.ts.map +1 -1
  788. package/dist/skills/tool.js +67 -5
  789. package/dist/skills/tool.js.map +1 -1
  790. package/dist/telemetry/index.d.ts +4 -0
  791. package/dist/telemetry/index.d.ts.map +1 -1
  792. package/dist/telemetry/index.js +5 -0
  793. package/dist/telemetry/index.js.map +1 -1
  794. package/dist/telemetry/maestro-event-bus.d.ts +440 -0
  795. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -0
  796. package/dist/telemetry/maestro-event-bus.js +784 -0
  797. package/dist/telemetry/maestro-event-bus.js.map +1 -0
  798. package/dist/telemetry/maestro-event-catalog.d.ts +48 -0
  799. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -0
  800. package/dist/telemetry/maestro-event-catalog.js +69 -0
  801. package/dist/telemetry/maestro-event-catalog.js.map +1 -0
  802. package/dist/telemetry/maestro-platform-replay-fixture.d.ts +24 -0
  803. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -0
  804. package/dist/telemetry/maestro-platform-replay-fixture.js +400 -0
  805. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -0
  806. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +29 -0
  807. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -0
  808. package/dist/telemetry/maestro-publisher-conformance-fixture.js +240 -0
  809. package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -0
  810. package/dist/telemetry/meter-service-client.d.ts +0 -33
  811. package/dist/telemetry/meter-service-client.d.ts.map +1 -1
  812. package/dist/telemetry/meter-service-client.js +22 -50
  813. package/dist/telemetry/meter-service-client.js.map +1 -1
  814. package/dist/telemetry/turn-tracker.d.ts.map +1 -1
  815. package/dist/telemetry/turn-tracker.js +5 -5
  816. package/dist/telemetry/turn-tracker.js.map +1 -1
  817. package/dist/telemetry/wide-events.d.ts +8 -0
  818. package/dist/telemetry/wide-events.d.ts.map +1 -1
  819. package/dist/telemetry/wide-events.js +28 -0
  820. package/dist/telemetry/wide-events.js.map +1 -1
  821. package/dist/telemetry.d.ts +1 -1
  822. package/dist/telemetry.d.ts.map +1 -1
  823. package/dist/telemetry.js +14 -4
  824. package/dist/telemetry.js.map +1 -1
  825. package/dist/timeline/redaction.d.ts +5 -0
  826. package/dist/timeline/redaction.d.ts.map +1 -0
  827. package/dist/timeline/redaction.js +119 -0
  828. package/dist/timeline/redaction.js.map +1 -0
  829. package/dist/tools/ask-user.d.ts +26 -0
  830. package/dist/tools/ask-user.d.ts.map +1 -1
  831. package/dist/tools/ask-user.js +33 -1
  832. package/dist/tools/ask-user.js.map +1 -1
  833. package/dist/tools/background/task-types.d.ts +1 -1
  834. package/dist/tools/edit.d.ts +2 -0
  835. package/dist/tools/edit.d.ts.map +1 -1
  836. package/dist/tools/edit.js +27 -7
  837. package/dist/tools/edit.js.map +1 -1
  838. package/dist/tools/index.d.ts +9 -0
  839. package/dist/tools/index.d.ts.map +1 -1
  840. package/dist/tools/pipeline.d.ts.map +1 -1
  841. package/dist/tools/pipeline.js +16 -7
  842. package/dist/tools/pipeline.js.map +1 -1
  843. package/dist/tools/write.d.ts +2 -0
  844. package/dist/tools/write.d.ts.map +1 -1
  845. package/dist/tools/write.js +24 -6
  846. package/dist/tools/write.js.map +1 -1
  847. package/dist/tracking/cost-tracker.d.ts +15 -12
  848. package/dist/tracking/cost-tracker.d.ts.map +1 -1
  849. package/dist/tracking/cost-tracker.js +29 -40
  850. package/dist/tracking/cost-tracker.js.map +1 -1
  851. package/dist/utils/checkpoint-profiler.d.ts +29 -0
  852. package/dist/utils/checkpoint-profiler.d.ts.map +1 -0
  853. package/dist/utils/checkpoint-profiler.js +118 -0
  854. package/dist/utils/checkpoint-profiler.js.map +1 -0
  855. package/dist/utils/downstream-http.d.ts +21 -0
  856. package/dist/utils/downstream-http.d.ts.map +1 -0
  857. package/dist/utils/downstream-http.js +151 -0
  858. package/dist/utils/downstream-http.js.map +1 -0
  859. package/dist/utils/downstream.d.ts +18 -0
  860. package/dist/utils/downstream.d.ts.map +1 -0
  861. package/dist/utils/downstream.js +47 -0
  862. package/dist/utils/downstream.js.map +1 -0
  863. package/dist/utils/logger.d.ts +3 -1
  864. package/dist/utils/logger.d.ts.map +1 -1
  865. package/dist/utils/logger.js +12 -1
  866. package/dist/utils/logger.js.map +1 -1
  867. package/dist/utils/oauth-http.d.ts +8 -0
  868. package/dist/utils/oauth-http.d.ts.map +1 -0
  869. package/dist/utils/oauth-http.js +41 -0
  870. package/dist/utils/oauth-http.js.map +1 -0
  871. package/dist/utils/path-utils.d.ts +2 -0
  872. package/dist/utils/path-utils.d.ts.map +1 -0
  873. package/dist/utils/path-utils.js +12 -0
  874. package/dist/utils/path-utils.js.map +1 -0
  875. package/dist/utils/path-validation.d.ts +1 -1
  876. package/dist/utils/path-validation.d.ts.map +1 -1
  877. package/dist/utils/path-validation.js +3 -3
  878. package/dist/utils/path-validation.js.map +1 -1
  879. package/dist/version.json +2 -2
  880. package/dist/web-server.d.ts +7 -1
  881. package/dist/web-server.d.ts.map +1 -1
  882. package/dist/web-server.js +117 -15
  883. package/dist/web-server.js.map +1 -1
  884. package/dist/webhooks/delivery.d.ts.map +1 -1
  885. package/dist/webhooks/delivery.js +9 -12
  886. package/dist/webhooks/delivery.js.map +1 -1
  887. package/node_modules/@bufbuild/protobuf/dist/cjs/descriptors.d.ts +12 -5
  888. package/node_modules/@bufbuild/protobuf/dist/cjs/from-binary.js +7 -7
  889. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.d.ts +1 -1
  890. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.js +1 -1
  891. package/node_modules/@bufbuild/protobuf/dist/cjs/reflect/path.d.ts +1 -1
  892. package/node_modules/@bufbuild/protobuf/dist/cjs/registry.js +24 -1
  893. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.d.ts +1 -1
  894. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.js +9 -10
  895. package/node_modules/@bufbuild/protobuf/dist/cjs/types.d.ts +1 -1
  896. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.d.ts +9 -7
  897. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.js +18 -8
  898. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.d.ts +4 -2
  899. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.js +8 -1
  900. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  901. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  902. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  903. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  904. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  905. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  906. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.js +38 -2
  907. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  908. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  909. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.d.ts +10 -0
  910. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.js +24 -0
  911. package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts +12 -5
  912. package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js +7 -7
  913. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.d.ts +1 -1
  914. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.js +2 -2
  915. package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts +1 -1
  916. package/node_modules/@bufbuild/protobuf/dist/esm/registry.js +24 -1
  917. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.d.ts +1 -1
  918. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.js +10 -11
  919. package/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts +1 -1
  920. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts +9 -7
  921. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js +18 -8
  922. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts +4 -2
  923. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js +8 -1
  924. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  925. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  926. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  927. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  928. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  929. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  930. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +37 -1
  931. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  932. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  933. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.d.ts +10 -0
  934. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js +23 -0
  935. package/node_modules/@bufbuild/protobuf/package.json +1 -1
  936. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +305 -2
  937. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
  938. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +34 -4
  939. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
  940. package/node_modules/@evalops/contracts/dist/index.d.ts +88 -0
  941. package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  942. package/node_modules/@evalops/contracts/dist/index.js +2 -0
  943. package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  944. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +77 -77
  945. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
  946. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +1 -1
  947. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
  948. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +182 -0
  949. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -0
  950. package/node_modules/@evalops/contracts/dist/runtime-app-server.js +83 -0
  951. package/node_modules/@evalops/contracts/dist/runtime-app-server.js.map +1 -0
  952. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +133 -0
  953. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -0
  954. package/node_modules/@evalops/contracts/dist/runtime-server-request.js +68 -0
  955. package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -0
  956. package/node_modules/@evalops/contracts/dist/schemas.d.ts +178 -0
  957. package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
  958. package/node_modules/@evalops/contracts/dist/schemas.js +165 -0
  959. package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
  960. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts +2 -0
  961. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts.map +1 -0
  962. package/node_modules/@evalops/contracts/dist/typebox-utils.js +5 -0
  963. package/node_modules/@evalops/contracts/dist/typebox-utils.js.map +1 -0
  964. package/node_modules/@evalops/contracts/dist/validators.d.ts +4 -1
  965. package/node_modules/@evalops/contracts/dist/validators.d.ts.map +1 -1
  966. package/node_modules/@evalops/contracts/dist/validators.js +4 -1
  967. package/node_modules/@evalops/contracts/dist/validators.js.map +1 -1
  968. package/node_modules/@evalops/contracts/package.json +1 -1
  969. package/node_modules/@evalops/tui/package.json +1 -1
  970. package/node_modules/string-width/index.js +93 -9
  971. package/node_modules/string-width/package.json +1 -1
  972. package/package.json +32 -25
  973. package/dist/cli-tui/commands/grouped/auth-commands.d.ts.map +0 -1
  974. package/dist/cli-tui/commands/grouped/auth-commands.js.map +0 -1
  975. package/dist/cli-tui/commands/grouped/config-commands.d.ts.map +0 -1
  976. package/dist/cli-tui/commands/grouped/config-commands.js.map +0 -1
  977. package/dist/cli-tui/commands/grouped/diag-commands.d.ts.map +0 -1
  978. package/dist/cli-tui/commands/grouped/diag-commands.js.map +0 -1
  979. package/dist/cli-tui/commands/grouped/git-commands.d.ts.map +0 -1
  980. package/dist/cli-tui/commands/grouped/git-commands.js.map +0 -1
  981. package/dist/cli-tui/commands/grouped/index.d.ts.map +0 -1
  982. package/dist/cli-tui/commands/grouped/index.js.map +0 -1
  983. package/dist/cli-tui/commands/grouped/safety-commands.d.ts.map +0 -1
  984. package/dist/cli-tui/commands/grouped/safety-commands.js.map +0 -1
  985. package/dist/cli-tui/commands/grouped/session-commands.d.ts.map +0 -1
  986. package/dist/cli-tui/commands/grouped/session-commands.js.map +0 -1
  987. package/dist/cli-tui/commands/grouped/tools-commands.d.ts.map +0 -1
  988. package/dist/cli-tui/commands/grouped/tools-commands.js.map +0 -1
  989. package/dist/cli-tui/commands/grouped/ui-commands.d.ts.map +0 -1
  990. package/dist/cli-tui/commands/grouped/ui-commands.js.map +0 -1
  991. package/dist/cli-tui/commands/grouped/undo-commands.d.ts.map +0 -1
  992. package/dist/cli-tui/commands/grouped/undo-commands.js.map +0 -1
  993. package/dist/cli-tui/commands/grouped/usage-commands.d.ts.map +0 -1
  994. package/dist/cli-tui/commands/grouped/usage-commands.js.map +0 -1
  995. package/dist/cli-tui/commands/grouped/utils.d.ts.map +0 -1
  996. package/dist/cli-tui/commands/grouped/utils.js.map +0 -1
  997. package/dist/cli-tui/commands/grouped-command-handlers.d.ts.map +0 -1
  998. package/dist/cli-tui/commands/grouped-command-handlers.js +0 -135
  999. package/dist/cli-tui/commands/grouped-command-handlers.js.map +0 -1
  1000. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts +0 -78
  1001. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts.map +0 -1
  1002. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js +0 -129
  1003. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js.map +0 -1
  1004. package/node_modules/@evalops/memory/dist/client.d.ts +0 -94
  1005. package/node_modules/@evalops/memory/dist/client.js +0 -503
  1006. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.d.ts +0 -608
  1007. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.js +0 -187
  1008. package/node_modules/@evalops/memory/package.json +0 -26
  1009. /package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"export-html.js","sourceRoot":"","sources":["../src/export-html.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tcopyFileSync,\n\tcreateReadStream,\n\tcreateWriteStream,\n\texistsSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentState, AppMessage } from \"./agent/types.js\";\nimport {\n\ttype RenderableAssistantMessage,\n\ttype RenderableMessage,\n\ttype RenderableToolCall,\n\ttype RenderableToolResultMessage,\n\ttype RenderableUserMessage,\n\tbuildConversationModel,\n\tisRenderableAssistantMessage,\n\tisRenderableToolResultMessage,\n\tisRenderableUserMessage,\n} from \"./conversation/render-model.js\";\nimport { getPackageVersion } from \"./package-metadata.js\";\nimport { sanitizePayload } from \"./safety/context-firewall.js\";\nimport type {\n\tPortableSessionExportSession,\n\tSessionHeaderEntry,\n\tSessionManager,\n} from \"./session/manager.js\";\nimport type { SessionEntry } from \"./session/types.js\";\nimport { getHomeDir } from \"./utils/path-expansion.js\";\n\nconst normalizeForCompare = (value: string): string =>\n\tprocess.platform === \"win32\" ? value.toLowerCase() : value;\n\nconst VERSION = getPackageVersion();\n\ninterface SessionFileParseResult {\n\theader: SessionHeaderEntry | null;\n\tmessages: AppMessage[];\n}\n\ninterface PortableExportOptions {\n\tredactSecrets?: boolean;\n}\n\nasync function parseSessionFile(\n\tsessionFile: string,\n): Promise<SessionFileParseResult> {\n\tconst messages: AppMessage[] = [];\n\tlet header: SessionHeaderEntry | null = null;\n\tconst stream = createReadStream(sessionFile, { encoding: \"utf8\" });\n\tconst rl = createInterface({\n\t\tinput: stream,\n\t\tcrlfDelay: Number.POSITIVE_INFINITY,\n\t});\n\ttry {\n\t\tfor await (const line of rl) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst entry = JSON.parse(trimmed);\n\t\t\t\tif (entry.type === \"session\" && !header) {\n\t\t\t\t\theader = entry as SessionHeaderEntry;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entry.type === \"message\" && entry.message) {\n\t\t\t\t\tmessages.push(entry.message as AppMessage);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore malformed lines\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.close();\n\t}\n\treturn { header, messages };\n}\n\nasync function withSessionWriter(\n\toutputPath: string,\n\twrite: (stream: ReturnType<typeof createWriteStream>) => Promise<void>,\n): Promise<void> {\n\tconst stream = createWriteStream(outputPath, { encoding: \"utf8\" });\n\ttry {\n\t\tawait write(stream);\n\t\tawait new Promise<void>((resolvePromise, reject) => {\n\t\t\tstream.end((error?: Error | null) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolvePromise();\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tstream.destroy();\n\t\tthrow error;\n\t}\n}\n\nfunction sanitizeEntryForPortableExport(entry: SessionEntry): SessionEntry {\n\treturn sanitizePayload(entry, {\n\t\tredactSecrets: true,\n\t\tvaultCredentials: false,\n\t\tmaxStringLength: Number.MAX_SAFE_INTEGER,\n\t\tmaxArrayLength: Number.MAX_SAFE_INTEGER,\n\t\ttruncateLargeBlobs: false,\n\t}) as SessionEntry;\n}\n\nasync function streamPortableEntries(\n\tsessionFile: string,\n\tonEntry: (entry: SessionEntry) => Promise<void> | void,\n): Promise<void> {\n\tconst stream = createReadStream(sessionFile, { encoding: \"utf8\" });\n\tconst rl = createInterface({\n\t\tinput: stream,\n\t\tcrlfDelay: Number.POSITIVE_INFINITY,\n\t});\n\ttry {\n\t\tfor await (const line of rl) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet entry: SessionEntry;\n\t\t\ttry {\n\t\t\t\tentry = JSON.parse(trimmed) as SessionEntry;\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed lines so partial or truncated session files remain exportable.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait onEntry(entry);\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.close();\n\t}\n}\n\nasync function writePortableEntryArray(\n\tstream: ReturnType<typeof createWriteStream>,\n\tsessionFile: string,\n\toptions: PortableExportOptions = {},\n): Promise<void> {\n\tstream.write(\"[\");\n\tlet wroteEntry = false;\n\tawait streamPortableEntries(sessionFile, async (entry) => {\n\t\tconst exportedEntry = options.redactSecrets\n\t\t\t? sanitizeEntryForPortableExport(entry)\n\t\t\t: entry;\n\t\tstream.write(wroteEntry ? \",\" : \"\");\n\t\tstream.write(JSON.stringify(exportedEntry));\n\t\twroteEntry = true;\n\t});\n\tstream.write(\"]\");\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&#039;\");\n}\n\n/**\n * Shorten path with tilde notation\n */\nfunction shortenPath(path: string): string {\n\tconst home = getHomeDir();\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\");\n\tconst normalizedHome = home.replace(/\\\\/g, \"/\");\n\tconst pathCheck = normalizeForCompare(normalizedPath);\n\tconst homeCheck = normalizeForCompare(normalizedHome);\n\tif (pathCheck === homeCheck) {\n\t\treturn \"~\";\n\t}\n\tif (pathCheck.startsWith(`${homeCheck}/`)) {\n\t\treturn `~${normalizedPath.slice(normalizedHome.length)}`;\n\t}\n\treturn path;\n}\n\n/**\n * Replace tabs with 3 spaces\n */\nfunction replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\n/**\n * Format tool execution matching TUI ToolExecutionComponent\n */\nfunction formatToolExecution(\n\ttoolCall: RenderableToolCall,\n\tresult?: RenderableToolResultMessage,\n): string {\n\tconst toolName = toolCall.name;\n\tconst args = toolCall.arguments;\n\tconst getArg = (key: string): string => {\n\t\tconst value = args?.[key];\n\t\treturn typeof value === \"string\" ? value : \"\";\n\t};\n\tlet html = \"\";\n\t// Get text output from result\n\tconst getTextOutput = (): string => {\n\t\treturn result?.textContent ?? \"\";\n\t};\n\n\t// Format based on tool type (matching TUI logic exactly)\n\tif (toolName === \"bash\") {\n\t\tconst command = getArg(\"command\");\n\t\thtml = `<div class=\"tool-command\">$ ${escapeHtml(command || \"...\")}</div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\tconst lines = output.split(\"\\n\");\n\t\t\t\tconst maxLines = 5;\n\t\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\t// Truncated output - make it expandable\n\t\t\t\t\thtml +=\n\t\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t} else {\n\t\t\t\t\t// Short output - show all\n\t\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"read\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\tconst offset = getArg(\"offset\");\n\t\tconst limit = getArg(\"limit\");\n\n\t\t// Build path display with line number suffix if offset/limit provided\n\t\tlet pathDisplay = escapeHtml(path || \"...\");\n\t\tif (offset !== undefined || limit !== undefined) {\n\t\t\tconst startLine = offset !== undefined ? Number(offset) : 1;\n\t\t\tconst endLine = limit !== undefined ? startLine + Number(limit) - 1 : \"\";\n\t\t\tpathDisplay += `<span style=\"color: #b5bd68\">:${startLine}${endLine ? `-${endLine}` : \"\"}</span>`;\n\t\t}\n\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">read</span> <span class=\"tool-path\">${pathDisplay}</span></div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput();\n\t\t\tconst lines = output.split(\"\\n\");\n\t\t\tconst maxLines = 10;\n\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\tif (remaining > 0) {\n\t\t\t\t// Truncated output - make it expandable\n\t\t\t\thtml +=\n\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += \"</div>\";\n\t\t\t} else {\n\t\t\t\t// Short output - show all\n\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"write\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\tconst fileContent = getArg(\"content\");\n\t\tconst lines = fileContent ? fileContent.split(\"\\n\") : [];\n\t\tconst totalLines = lines.length;\n\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">write</span> <span class=\"tool-path\">${escapeHtml(path || \"...\")}</span>`;\n\t\tif (totalLines > 10) {\n\t\t\thtml += ` <span class=\"line-count\">(${totalLines} lines)</span>`;\n\t\t}\n\t\thtml += \"</div>\";\n\n\t\tif (fileContent) {\n\t\t\tconst maxLines = 10;\n\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\tif (remaining > 0) {\n\t\t\t\t// Truncated output - make it expandable\n\t\t\t\thtml +=\n\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += \"</div>\";\n\t\t\t} else {\n\t\t\t\t// Short output - show all\n\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t}\n\t\t}\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"edit\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">edit</span> <span class=\"tool-path\">${escapeHtml(path || \"...\")}</span></div>`;\n\n\t\t// Show diff if available from result.details.diff\n\t\tconst diff =\n\t\t\ttypeof result?.raw.details === \"object\" &&\n\t\t\tresult.raw.details !== null &&\n\t\t\t\"diff\" in result.raw.details &&\n\t\t\ttypeof (result.raw.details as { diff?: unknown }).diff === \"string\"\n\t\t\t\t? (result.raw.details as { diff: string }).diff\n\t\t\t\t: null;\n\t\tif (diff) {\n\t\t\tconst diffLines = diff.split(\"\\n\");\n\t\t\thtml += '<div class=\"tool-diff\">';\n\t\t\tfor (const line of diffLines) {\n\t\t\t\tif (line.startsWith(\"+\")) {\n\t\t\t\t\thtml += `<div class=\"diff-line-new\">${escapeHtml(line)}</div>`;\n\t\t\t\t} else if (line.startsWith(\"-\")) {\n\t\t\t\t\thtml += `<div class=\"diff-line-old\">${escapeHtml(line)}</div>`;\n\t\t\t\t} else {\n\t\t\t\t\thtml += `<div class=\"diff-line-context\">${escapeHtml(line)}</div>`;\n\t\t\t\t}\n\t\t\t}\n\t\t\thtml += \"</div>\";\n\t\t}\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Generic tool\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">${escapeHtml(toolName)}</span></div>`;\n\t\thtml += `<div class=\"tool-output\"><pre>${escapeHtml(JSON.stringify(args, null, 2))}</pre></div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (result?.images?.length) {\n\t\tconst imageItems = result.images\n\t\t\t.map(\n\t\t\t\t(image, index) =>\n\t\t\t\t\t`<div class=\"attachment-item\">🖼 ${escapeHtml(image.mimeType || \"image\")} <span>Image ${index + 1}</span></div>`,\n\t\t\t)\n\t\t\t.join(\"\");\n\t\thtml += `<div class=\"attachment-list\">${imageItems}</div>`;\n\t}\n\n\treturn html;\n}\n\nfunction formatRenderableMessageHtml(\n\tmessage: RenderableMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tif (isRenderableUserMessage(message)) {\n\t\treturn formatUserMessageHtml(message);\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\treturn formatAssistantMessageHtml(message, toolResultsMap);\n\t}\n\treturn \"\";\n}\n\nfunction formatUserMessageHtml(message: RenderableUserMessage): string {\n\tconst textContent = message.text.trim();\n\tconst textHtml = textContent\n\t\t? `<div>${escapeHtml(textContent).replace(/\\n/g, \"<br>\")}</div>`\n\t\t: \"\";\n\tconst attachmentsHtml = message.attachments.length\n\t\t? `<div class=\"attachment-list\">${message.attachments\n\t\t\t\t.map(\n\t\t\t\t\t(attachment) =>\n\t\t\t\t\t\t`<div class=\"attachment-item\">📎 ${escapeHtml(attachment.fileName)} <span>${escapeHtml(attachment.mimeType)}</span></div>`,\n\t\t\t\t)\n\t\t\t\t.join(\"\")}</div>`\n\t\t: \"\";\n\tif (!textHtml && !attachmentsHtml) {\n\t\treturn \"\";\n\t}\n\n\treturn `\n\t<div class=\"message-wrapper\">\n\t\t<div class=\"message-header\">\n\t\t\t<div class=\"user-avatar\">U</div>\n\t\t\tUser\n\t\t</div>\n\t\t<div class=\"user-message\">${textHtml}${attachmentsHtml}</div>\n\t</div>`;\n}\n\nfunction formatAssistantMessageHtml(\n\tmessage: RenderableAssistantMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tlet html = \"\";\n\n\t// Open wrapper\n\thtml += `<div class=\"message-wrapper\">\n\t\t<div class=\"message-header\">\n\t\t\t<div class=\"assistant-avatar\">AI</div>\n\t\t\tMaestro\n\t\t</div>\n\t\t<div class=\"assistant-message\">`;\n\n\tfor (const text of message.textBlocks) {\n\t\thtml += `<div class=\"assistant-text\">${escapeHtml(text).replace(/\\n/g, \"<br>\")}</div>`;\n\t}\n\tfor (const thinking of message.thinkingBlocks) {\n\t\thtml += `<div class=\"thinking-text\">${escapeHtml(thinking).replace(/\\n/g, \"<br>\")}</div>`;\n\t}\n\tfor (const toolCall of message.toolCalls) {\n\t\tconst toolResult = toolResultsMap.get(toolCall.id);\n\t\tconst toolHtml = formatToolExecution(toolCall, toolResult);\n\t\thtml += `<div class=\"tool-execution\">${toolHtml}</div>`;\n\t}\n\tif (message.toolCalls.length === 0) {\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\thtml += '<div class=\"error-text\">Aborted</div>';\n\t\t} else if (message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\thtml += `<div class=\"error-text\">Error: ${escapeHtml(errorMsg)}</div>`;\n\t\t}\n\t}\n\n\t// Close wrapper\n\thtml += \"</div></div>\";\n\n\treturn html;\n}\n\n/**\n * Export session to a self-contained HTML file matching TUI visual style\n */\nexport async function exportSessionToHtml(\n\tsessionManager: SessionManager,\n\tstate: AgentState,\n\toutputPath?: string,\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tconst timestamp = new Date().toISOString();\n\tconst { header: sessionHeader, messages } =\n\t\tawait parseSessionFile(sessionFile);\n\tconst renderableMessages = buildConversationModel(messages);\n\tconst toolResultsMap = new Map(\n\t\trenderableMessages\n\t\t\t.filter((message): message is RenderableToolResultMessage =>\n\t\t\t\tisRenderableToolResultMessage(message),\n\t\t\t)\n\t\t\t.map((message) => [message.toolCallId, message] as const),\n\t);\n\tconst visibleMessages = renderableMessages.filter(\n\t\t(message) => !isRenderableToolResultMessage(message),\n\t);\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.html`;\n\t})();\n\n\tconst messagesHtml = visibleMessages\n\t\t.map((message) => formatRenderableMessageHtml(message, toolResultsMap))\n\t\t.join(\"\");\n\n\tconst html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Session Export - ${basename(sessionFile)}</title>\n <style>\n :root {\n --bg-color: #0d1117;\n --container-bg: #161b22;\n --border-color: #30363d;\n --text-primary: #c9d1d9;\n --text-secondary: #8b949e;\n --text-dim: #6e7681;\n --accent-color: #58a6ff;\n --success-color: #238636;\n --error-color: #f85149;\n --warning-color: #d29922;\n --user-bg: #1f2428;\n --assistant-bg: #161b22;\n --code-bg: #0d1117;\n --font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \"Liberation Mono\", monospace;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: var(--font-sans);\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-primary);\n background: var(--bg-color);\n padding: 24px;\n }\n\n .container {\n max-width: 1000px;\n margin: 0 auto;\n }\n\n .header {\n margin-bottom: 32px;\n padding: 24px;\n background: var(--container-bg);\n border: 1px solid var(--border-color);\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.12);\n }\n\n .header h1 {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 16px;\n color: var(--accent-color);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .header-info {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n font-size: 13px;\n }\n\n .info-item {\n color: var(--text-secondary);\n display: flex;\n align-items: center;\n }\n\n .info-label {\n font-weight: 500;\n margin-right: 8px;\n color: var(--text-dim);\n min-width: 70px;\n }\n\n .info-value {\n color: var(--text-primary);\n font-family: var(--font-mono);\n }\n\n .messages {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* Message Containers */\n .message-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-secondary);\n margin-left: 4px;\n }\n\n .user-avatar, .assistant-avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: bold;\n }\n\n .user-avatar {\n background: var(--accent-color);\n color: #fff;\n }\n\n .assistant-avatar {\n background: var(--success-color);\n color: #fff;\n }\n\n /* User Message */\n .user-message {\n background: var(--user-bg);\n padding: 16px 20px;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 13px;\n }\n\n .attachment-list {\n margin-top: 12px;\n border-top: 1px solid var(--border-color);\n padding-top: 8px;\n }\n\n .attachment-item {\n color: var(--text-secondary);\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n /* Assistant Message */\n .assistant-message {\n background: transparent;\n }\n\n .assistant-text {\n padding: 4px 0;\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 13px;\n color: var(--text-primary);\n margin-bottom: 12px;\n }\n\n /* Thinking Text */\n .thinking-text {\n padding: 12px 16px;\n margin-bottom: 12px;\n background: var(--container-bg);\n border-left: 3px solid var(--text-dim);\n color: var(--text-secondary);\n font-style: italic;\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 12px;\n border-radius: 0 4px 4px 0;\n }\n\n /* Tools */\n .tool-execution {\n background: var(--container-bg);\n border: 1px solid var(--border-color);\n border-radius: 6px;\n margin-top: 12px;\n overflow: hidden;\n font-family: var(--font-mono);\n font-size: 12px;\n }\n\n .tool-header {\n padding: 8px 12px;\n background: rgba(255, 255, 255, 0.03);\n border-bottom: 1px solid var(--border-color);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .tool-name {\n font-weight: 600;\n color: var(--accent-color);\n }\n\n .tool-path {\n color: var(--text-secondary);\n }\n\n .line-count {\n color: var(--text-dim);\n font-size: 11px;\n }\n\n .tool-command {\n color: var(--text-primary);\n font-weight: 500;\n }\n\n .tool-output {\n padding: 12px;\n color: var(--text-secondary);\n white-space: pre-wrap;\n overflow-x: auto;\n background: var(--code-bg);\n }\n\n .tool-output.expandable {\n cursor: pointer;\n position: relative;\n }\n\n .tool-output.expandable:hover {\n background: rgba(255, 255, 255, 0.02);\n }\n\n .tool-output.expandable .output-full {\n display: none;\n }\n\n .tool-output.expandable.expanded .output-preview {\n display: none;\n }\n\n .tool-output.expandable.expanded .output-full {\n display: block;\n }\n\n .expand-hint {\n color: var(--accent-color);\n font-size: 11px;\n margin-top: 8px;\n opacity: 0.8;\n }\n\n /* Diff Styling */\n .tool-diff {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n\n .diff-line-new {\n background: rgba(46, 160, 67, 0.15);\n color: #e6ffec;\n padding: 0 4px;\n }\n\n .diff-line-old {\n background: rgba(248, 81, 73, 0.15);\n color: #ffdad8;\n padding: 0 4px;\n }\n\n .diff-line-context {\n color: var(--text-dim);\n padding: 0 4px;\n }\n\n /* Error */\n .error-text {\n color: var(--error-color);\n padding: 12px;\n background: rgba(248, 81, 73, 0.1);\n border-radius: 6px;\n margin-top: 8px;\n }\n\n /* Footer */\n .footer {\n margin-top: 48px;\n padding-top: 24px;\n text-align: center;\n color: var(--text-dim);\n font-size: 12px;\n border-top: 1px solid var(--border-color);\n }\n\n @media print {\n body {\n background: white;\n color: black;\n }\n .header, .user-message, .tool-execution, .thinking-text {\n border: 1px solid #ddd;\n background: none;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>Maestro Session Export</h1>\n <div class=\"header-info\">\n <div class=\"info-item\">\n <span class=\"info-label\">Session</span>\n <span class=\"info-value\">${escapeHtml(sessionHeader?.id || \"unknown\")}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Date</span>\n <span class=\"info-value\">${sessionHeader?.timestamp ? new Date(sessionHeader.timestamp).toLocaleString() : timestamp}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">${escapeHtml(sessionHeader?.model || state.model.id)}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Messages</span>\n <span class=\"info-value\">${visibleMessages.length}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Directory</span>\n <span class=\"info-value\">${escapeHtml(shortenPath(sessionHeader?.cwd || process.cwd()))}</span>\n </div>\n </div>\n </div>\n\n <div class=\"messages\">\n ${messagesHtml}\n </div>\n\n <div class=\"footer\">\n Generated by Maestro v${VERSION} on ${new Date().toLocaleString()}\n </div>\n </div>\n</body>\n</html>`;\n\n\twriteFileSync(resolvedOutputPath, html, \"utf8\");\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToText(\n\tsessionManager: SessionManager,\n\t_state: AgentState,\n\toutputPath?: string,\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tconst timestamp = new Date().toISOString();\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.txt`;\n\t})();\n\n\tconst { messages } = await parseSessionFile(sessionFile);\n\tconst renderableMessages = buildConversationModel(messages);\n\tconst toolResultsMap = new Map(\n\t\trenderableMessages\n\t\t\t.filter((message): message is RenderableToolResultMessage =>\n\t\t\t\tisRenderableToolResultMessage(message),\n\t\t\t)\n\t\t\t.map((message) => [message.toolCallId, message] as const),\n\t);\n\n\tconst output: string[] = [];\n\toutput.push(`Session export: ${basename(sessionFile)}`);\n\toutput.push(`Generated: ${timestamp}`);\n\toutput.push(\"\");\n\n\tfor (const message of renderableMessages) {\n\t\tconst textBlock = formatMessageAsText(message, toolResultsMap);\n\t\tif (textBlock) {\n\t\t\toutput.push(textBlock, \"\");\n\t\t}\n\t}\n\n\twriteFileSync(resolvedOutputPath, output.join(\"\\n\"), \"utf-8\");\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToJsonl(\n\tsessionManager: SessionManager,\n\toutputPath?: string,\n\toptions: PortableExportOptions = {},\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !existsSync(sessionFile)) {\n\t\tthrow new Error(\"No persisted session is available to export.\");\n\t}\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\treturn basename(sessionFile);\n\t})();\n\n\tif (options.redactSecrets) {\n\t\tawait withSessionWriter(resolvedOutputPath, async (stream) => {\n\t\t\tawait streamPortableEntries(sessionFile, async (entry) => {\n\t\t\t\tconst sanitized = sanitizeEntryForPortableExport(entry);\n\t\t\t\tstream.write(`${JSON.stringify(sanitized)}\\n`);\n\t\t\t});\n\t\t});\n\t\treturn resolvedOutputPath;\n\t}\n\n\tcopyFileSync(sessionFile, resolvedOutputPath);\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToJson(\n\tsessionManager: SessionManager,\n\toutputPath?: string,\n\toptions: PortableExportOptions = {},\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !existsSync(sessionFile)) {\n\t\tthrow new Error(\"No persisted session is available to export.\");\n\t}\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.json`;\n\t})();\n\n\tconst portableBundle = sessionManager.getPortableSessionBundle();\n\n\tawait withSessionWriter(resolvedOutputPath, async (stream) => {\n\t\tstream.write(\n\t\t\t`{\"format\":\"maestro-session-export.v1\",\"exportedAt\":${JSON.stringify(new Date().toISOString())},\"sessionId\":${JSON.stringify(portableBundle.selectedSessionId)},\"entries\":`,\n\t\t);\n\t\tawait writePortableEntryArray(stream, sessionFile, options);\n\t\tstream.write(',\"sessions\":[');\n\t\tlet wroteSession = false;\n\t\tfor (const session of portableBundle.sessions) {\n\t\t\tstream.write(wroteSession ? \",\" : \"\");\n\t\t\tawait writePortableSession(stream, session, options);\n\t\t\twroteSession = true;\n\t\t}\n\t\tstream.write(\"]}\\n\");\n\t});\n\n\treturn resolvedOutputPath;\n}\n\nasync function writePortableSession(\n\tstream: ReturnType<typeof createWriteStream>,\n\tsession: PortableSessionExportSession,\n\toptions: PortableExportOptions = {},\n): Promise<void> {\n\tstream.write(\n\t\t`{\"sessionId\":${JSON.stringify(session.sessionId)},\"parentSessionId\":${JSON.stringify(session.parentSessionId ?? null)},\"entries\":`,\n\t);\n\tawait writePortableEntryArray(stream, session.sessionFile, options);\n\tstream.write(\"}\");\n}\n\nfunction formatMessageAsText(\n\tmessage: RenderableMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tif (isRenderableUserMessage(message)) {\n\t\tconst parts: string[] = [];\n\t\tif (message.text.trim()) {\n\t\t\tparts.push(message.text.trim());\n\t\t}\n\t\tif (message.attachments.length) {\n\t\t\tparts.push(\n\t\t\t\t...message.attachments.map(\n\t\t\t\t\t(attachment) =>\n\t\t\t\t\t\t`[attachment] ${attachment.fileName} (${attachment.mimeType})`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (!parts.length) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn `User:\\n${parts.join(\"\\n\")}`;\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\tconst parts: string[] = [];\n\t\tfor (const text of message.textBlocks) {\n\t\t\tif (text.trim()) {\n\t\t\t\tparts.push(text.trim());\n\t\t\t}\n\t\t}\n\t\tfor (const thinking of message.thinkingBlocks) {\n\t\t\tif (thinking.trim()) {\n\t\t\t\tparts.push(`[thinking]\\n${thinking.trim()}`);\n\t\t\t}\n\t\t}\n\t\tfor (const toolCall of message.toolCalls) {\n\t\t\tconst argsString = JSON.stringify(toolCall.arguments, null, 2);\n\t\t\tparts.push(`[tool call] ${toolCall.name}\\n${argsString}\\n`);\n\t\t\tconst result = toolResultsMap.get(toolCall.id);\n\t\t\tif (result?.textContent) {\n\t\t\t\tparts.push(`[tool result] ${toolCall.name}\\n${result.textContent}`);\n\t\t\t}\n\t\t}\n\t\tif (parts.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn `Assistant:\\n${parts.join(\"\\n\\n\")}`;\n\t}\n\tif (isRenderableToolResultMessage(message)) {\n\t\tconst lines: string[] = [];\n\t\tif (message.textContent.trim()) {\n\t\t\tlines.push(message.textContent.trim());\n\t\t}\n\t\tif (message.images.length) {\n\t\t\tlines.push(\n\t\t\t\t...message.images.map(\n\t\t\t\t\t(image) => `[image] ${image.mimeType || \"attachment\"}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\treturn `Tool ${message.toolName} (${message.toolCallId}):\\n${text}`;\n\t}\n\treturn \"\";\n}\n"]}
1
+ {"version":3,"file":"export-html.js","sourceRoot":"","sources":["../src/export-html.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tcopyFileSync,\n\tcreateReadStream,\n\tcreateWriteStream,\n\texistsSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentState, AppMessage } from \"./agent/types.js\";\nimport {\n\ttype RenderableAssistantMessage,\n\ttype RenderableMessage,\n\ttype RenderableToolCall,\n\ttype RenderableToolResultMessage,\n\ttype RenderableUserMessage,\n\tbuildConversationModel,\n\tisRenderableAssistantMessage,\n\tisRenderableToolResultMessage,\n\tisRenderableUserMessage,\n} from \"./conversation/render-model.js\";\nimport { sanitizePayload } from \"./safety/context-firewall.js\";\nimport type {\n\tPortableSessionExportSession,\n\tSessionHeaderEntry,\n\tSessionManager,\n} from \"./session/manager.js\";\nimport { type SessionEntry, parseSessionEntry } from \"./session/types.js\";\nimport { getHomeDir } from \"./utils/path-expansion.js\";\n\nconst normalizeForCompare = (value: string): string =>\n\tprocess.platform === \"win32\" ? value.toLowerCase() : value;\n\n// Get version from package.json without import assertions (Node16 compatible)\nconst packageJson = createRequire(import.meta.url)(\"../package.json\") as {\n\tversion?: string;\n};\nconst VERSION = packageJson.version ?? \"unknown\";\n\ninterface SessionFileParseResult {\n\theader: SessionHeaderEntry | null;\n\tmessages: AppMessage[];\n}\n\ninterface PortableExportOptions {\n\tredactSecrets?: boolean;\n}\n\nasync function parseSessionFile(\n\tsessionFile: string,\n): Promise<SessionFileParseResult> {\n\tconst messages: AppMessage[] = [];\n\tlet header: SessionHeaderEntry | null = null;\n\tconst stream = createReadStream(sessionFile, { encoding: \"utf8\" });\n\tconst rl = createInterface({\n\t\tinput: stream,\n\t\tcrlfDelay: Number.POSITIVE_INFINITY,\n\t});\n\ttry {\n\t\tfor await (const line of rl) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst entry = parseSessionEntry(trimmed);\n\t\t\t\tif (entry.type === \"session\" && !header) {\n\t\t\t\t\theader = entry as SessionHeaderEntry;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entry.type === \"message\" && entry.message) {\n\t\t\t\t\tmessages.push(entry.message as AppMessage);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore malformed lines\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.close();\n\t}\n\treturn { header, messages };\n}\n\nasync function withSessionWriter(\n\toutputPath: string,\n\twrite: (stream: ReturnType<typeof createWriteStream>) => Promise<void>,\n): Promise<void> {\n\tconst stream = createWriteStream(outputPath, { encoding: \"utf8\" });\n\ttry {\n\t\tawait write(stream);\n\t\tawait new Promise<void>((resolvePromise, reject) => {\n\t\t\tstream.end((error?: Error | null) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolvePromise();\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tstream.destroy();\n\t\tthrow error;\n\t}\n}\n\nfunction sanitizeEntryForPortableExport(entry: SessionEntry): SessionEntry {\n\treturn sanitizePayload(entry, {\n\t\tredactSecrets: true,\n\t\tvaultCredentials: false,\n\t\tmaxStringLength: Number.MAX_SAFE_INTEGER,\n\t\tmaxArrayLength: Number.MAX_SAFE_INTEGER,\n\t\ttruncateLargeBlobs: false,\n\t}) as SessionEntry;\n}\n\nasync function streamPortableEntries(\n\tsessionFile: string,\n\tonEntry: (entry: SessionEntry) => Promise<void> | void,\n): Promise<void> {\n\tconst stream = createReadStream(sessionFile, { encoding: \"utf8\" });\n\tconst rl = createInterface({\n\t\tinput: stream,\n\t\tcrlfDelay: Number.POSITIVE_INFINITY,\n\t});\n\ttry {\n\t\tfor await (const line of rl) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet entry: SessionEntry;\n\t\t\ttry {\n\t\t\t\tentry = parseSessionEntry(trimmed);\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed lines so partial or truncated session files remain exportable.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait onEntry(entry);\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.close();\n\t}\n}\n\nasync function writePortableEntryArray(\n\tstream: ReturnType<typeof createWriteStream>,\n\tsessionFile: string,\n\toptions: PortableExportOptions = {},\n): Promise<void> {\n\tstream.write(\"[\");\n\tlet wroteEntry = false;\n\tawait streamPortableEntries(sessionFile, async (entry) => {\n\t\tconst exportedEntry = options.redactSecrets\n\t\t\t? sanitizeEntryForPortableExport(entry)\n\t\t\t: entry;\n\t\tstream.write(wroteEntry ? \",\" : \"\");\n\t\tstream.write(JSON.stringify(exportedEntry));\n\t\twroteEntry = true;\n\t});\n\tstream.write(\"]\");\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&#039;\");\n}\n\n/**\n * Shorten path with tilde notation\n */\nfunction shortenPath(path: string): string {\n\tconst home = getHomeDir();\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\");\n\tconst normalizedHome = home.replace(/\\\\/g, \"/\");\n\tconst pathCheck = normalizeForCompare(normalizedPath);\n\tconst homeCheck = normalizeForCompare(normalizedHome);\n\tif (pathCheck === homeCheck) {\n\t\treturn \"~\";\n\t}\n\tif (pathCheck.startsWith(`${homeCheck}/`)) {\n\t\treturn `~${normalizedPath.slice(normalizedHome.length)}`;\n\t}\n\treturn path;\n}\n\n/**\n * Replace tabs with 3 spaces\n */\nfunction replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\n/**\n * Format tool execution matching TUI ToolExecutionComponent\n */\nfunction formatToolExecution(\n\ttoolCall: RenderableToolCall,\n\tresult?: RenderableToolResultMessage,\n): string {\n\tconst toolName = toolCall.name;\n\tconst args = toolCall.arguments;\n\tconst getArg = (key: string): string => {\n\t\tconst value = args?.[key];\n\t\treturn typeof value === \"string\" ? value : \"\";\n\t};\n\tlet html = \"\";\n\t// Get text output from result\n\tconst getTextOutput = (): string => {\n\t\treturn result?.textContent ?? \"\";\n\t};\n\n\t// Format based on tool type (matching TUI logic exactly)\n\tif (toolName === \"bash\") {\n\t\tconst command = getArg(\"command\");\n\t\thtml = `<div class=\"tool-command\">$ ${escapeHtml(command || \"...\")}</div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\tconst lines = output.split(\"\\n\");\n\t\t\t\tconst maxLines = 5;\n\t\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\t// Truncated output - make it expandable\n\t\t\t\t\thtml +=\n\t\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t} else {\n\t\t\t\t\t// Short output - show all\n\t\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\t\thtml += `<div>${escapeHtml(line)}</div>`;\n\t\t\t\t\t}\n\t\t\t\t\thtml += \"</div>\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"read\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\tconst offset = getArg(\"offset\");\n\t\tconst limit = getArg(\"limit\");\n\n\t\t// Build path display with line number suffix if offset/limit provided\n\t\tlet pathDisplay = escapeHtml(path || \"...\");\n\t\tif (offset !== undefined || limit !== undefined) {\n\t\t\tconst startLine = offset !== undefined ? Number(offset) : 1;\n\t\t\tconst endLine = limit !== undefined ? startLine + Number(limit) - 1 : \"\";\n\t\t\tpathDisplay += `<span style=\"color: #b5bd68\">:${startLine}${endLine ? `-${endLine}` : \"\"}</span>`;\n\t\t}\n\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">read</span> <span class=\"tool-path\">${pathDisplay}</span></div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput();\n\t\t\tconst lines = output.split(\"\\n\");\n\t\t\tconst maxLines = 10;\n\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\tif (remaining > 0) {\n\t\t\t\t// Truncated output - make it expandable\n\t\t\t\thtml +=\n\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += \"</div>\";\n\t\t\t} else {\n\t\t\t\t// Short output - show all\n\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"write\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\tconst fileContent = getArg(\"content\");\n\t\tconst lines = fileContent ? fileContent.split(\"\\n\") : [];\n\t\tconst totalLines = lines.length;\n\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">write</span> <span class=\"tool-path\">${escapeHtml(path || \"...\")}</span>`;\n\t\tif (totalLines > 10) {\n\t\t\thtml += ` <span class=\"line-count\">(${totalLines} lines)</span>`;\n\t\t}\n\t\thtml += \"</div>\";\n\n\t\tif (fileContent) {\n\t\t\tconst maxLines = 10;\n\t\t\tconst displayLines = lines.slice(0, maxLines);\n\t\t\tconst remaining = lines.length - maxLines;\n\n\t\t\tif (remaining > 0) {\n\t\t\t\t// Truncated output - make it expandable\n\t\t\t\thtml +=\n\t\t\t\t\t'<div class=\"tool-output expandable\" onclick=\"this.classList.toggle(\\'expanded\\')\">';\n\t\t\t\thtml += '<div class=\"output-preview\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += `<div class=\"expand-hint\">... (${remaining} more lines) - click to expand</div>`;\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += '<div class=\"output-full\">';\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t\thtml += \"</div>\";\n\t\t\t} else {\n\t\t\t\t// Short output - show all\n\t\t\t\thtml += '<div class=\"tool-output\">';\n\t\t\t\tfor (const line of displayLines) {\n\t\t\t\t\thtml += `<div>${escapeHtml(replaceTabs(line))}</div>`;\n\t\t\t\t}\n\t\t\t\thtml += \"</div>\";\n\t\t\t}\n\t\t}\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t} else if (toolName === \"edit\") {\n\t\tconst path = shortenPath(getArg(\"file_path\") || getArg(\"path\"));\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">edit</span> <span class=\"tool-path\">${escapeHtml(path || \"...\")}</span></div>`;\n\n\t\t// Show diff if available from result.details.diff\n\t\tconst diff =\n\t\t\ttypeof result?.raw.details === \"object\" &&\n\t\t\tresult.raw.details !== null &&\n\t\t\t\"diff\" in result.raw.details &&\n\t\t\ttypeof (result.raw.details as { diff?: unknown }).diff === \"string\"\n\t\t\t\t? (result.raw.details as { diff: string }).diff\n\t\t\t\t: null;\n\t\tif (diff) {\n\t\t\tconst diffLines = diff.split(\"\\n\");\n\t\t\thtml += '<div class=\"tool-diff\">';\n\t\t\tfor (const line of diffLines) {\n\t\t\t\tif (line.startsWith(\"+\")) {\n\t\t\t\t\thtml += `<div class=\"diff-line-new\">${escapeHtml(line)}</div>`;\n\t\t\t\t} else if (line.startsWith(\"-\")) {\n\t\t\t\t\thtml += `<div class=\"diff-line-old\">${escapeHtml(line)}</div>`;\n\t\t\t\t} else {\n\t\t\t\t\thtml += `<div class=\"diff-line-context\">${escapeHtml(line)}</div>`;\n\t\t\t\t}\n\t\t\t}\n\t\t\thtml += \"</div>\";\n\t\t}\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput().trim();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Generic tool\n\t\thtml = `<div class=\"tool-header\"><span class=\"tool-name\">${escapeHtml(toolName)}</span></div>`;\n\t\thtml += `<div class=\"tool-output\"><pre>${escapeHtml(JSON.stringify(args, null, 2))}</pre></div>`;\n\n\t\tif (result) {\n\t\t\tconst output = getTextOutput();\n\t\t\tif (output) {\n\t\t\t\thtml += `<div class=\"tool-output\"><div>${escapeHtml(output)}</div></div>`;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (result?.images?.length) {\n\t\tconst imageItems = result.images\n\t\t\t.map(\n\t\t\t\t(image, index) =>\n\t\t\t\t\t`<div class=\"attachment-item\">🖼 ${escapeHtml(image.mimeType || \"image\")} <span>Image ${index + 1}</span></div>`,\n\t\t\t)\n\t\t\t.join(\"\");\n\t\thtml += `<div class=\"attachment-list\">${imageItems}</div>`;\n\t}\n\n\treturn html;\n}\n\nfunction formatRenderableMessageHtml(\n\tmessage: RenderableMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tif (isRenderableUserMessage(message)) {\n\t\treturn formatUserMessageHtml(message);\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\treturn formatAssistantMessageHtml(message, toolResultsMap);\n\t}\n\treturn \"\";\n}\n\nfunction formatUserMessageHtml(message: RenderableUserMessage): string {\n\tconst textContent = message.text.trim();\n\tconst textHtml = textContent\n\t\t? `<div>${escapeHtml(textContent).replace(/\\n/g, \"<br>\")}</div>`\n\t\t: \"\";\n\tconst attachmentsHtml = message.attachments.length\n\t\t? `<div class=\"attachment-list\">${message.attachments\n\t\t\t\t.map(\n\t\t\t\t\t(attachment) =>\n\t\t\t\t\t\t`<div class=\"attachment-item\">📎 ${escapeHtml(attachment.fileName)} <span>${escapeHtml(attachment.mimeType)}</span></div>`,\n\t\t\t\t)\n\t\t\t\t.join(\"\")}</div>`\n\t\t: \"\";\n\tif (!textHtml && !attachmentsHtml) {\n\t\treturn \"\";\n\t}\n\n\treturn `\n\t<div class=\"message-wrapper\">\n\t\t<div class=\"message-header\">\n\t\t\t<div class=\"user-avatar\">U</div>\n\t\t\tUser\n\t\t</div>\n\t\t<div class=\"user-message\">${textHtml}${attachmentsHtml}</div>\n\t</div>`;\n}\n\nfunction formatAssistantMessageHtml(\n\tmessage: RenderableAssistantMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tlet html = \"\";\n\n\t// Open wrapper\n\thtml += `<div class=\"message-wrapper\">\n\t\t<div class=\"message-header\">\n\t\t\t<div class=\"assistant-avatar\">AI</div>\n\t\t\tMaestro\n\t\t</div>\n\t\t<div class=\"assistant-message\">`;\n\n\tfor (const text of message.textBlocks) {\n\t\thtml += `<div class=\"assistant-text\">${escapeHtml(text).replace(/\\n/g, \"<br>\")}</div>`;\n\t}\n\tfor (const thinking of message.thinkingBlocks) {\n\t\thtml += `<div class=\"thinking-text\">${escapeHtml(thinking).replace(/\\n/g, \"<br>\")}</div>`;\n\t}\n\tfor (const toolCall of message.toolCalls) {\n\t\tconst toolResult = toolResultsMap.get(toolCall.id);\n\t\tconst toolHtml = formatToolExecution(toolCall, toolResult);\n\t\thtml += `<div class=\"tool-execution\">${toolHtml}</div>`;\n\t}\n\tif (message.toolCalls.length === 0) {\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\thtml += '<div class=\"error-text\">Aborted</div>';\n\t\t} else if (message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\thtml += `<div class=\"error-text\">Error: ${escapeHtml(errorMsg)}</div>`;\n\t\t}\n\t}\n\n\t// Close wrapper\n\thtml += \"</div></div>\";\n\n\treturn html;\n}\n\n/**\n * Export session to a self-contained HTML file matching TUI visual style\n */\nexport async function exportSessionToHtml(\n\tsessionManager: SessionManager,\n\tstate: AgentState,\n\toutputPath?: string,\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tconst timestamp = new Date().toISOString();\n\tconst { header: sessionHeader, messages } =\n\t\tawait parseSessionFile(sessionFile);\n\tconst renderableMessages = buildConversationModel(messages);\n\tconst toolResultsMap = new Map(\n\t\trenderableMessages\n\t\t\t.filter((message): message is RenderableToolResultMessage =>\n\t\t\t\tisRenderableToolResultMessage(message),\n\t\t\t)\n\t\t\t.map((message) => [message.toolCallId, message] as const),\n\t);\n\tconst visibleMessages = renderableMessages.filter(\n\t\t(message) => !isRenderableToolResultMessage(message),\n\t);\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.html`;\n\t})();\n\n\tconst messagesHtml = visibleMessages\n\t\t.map((message) => formatRenderableMessageHtml(message, toolResultsMap))\n\t\t.join(\"\");\n\n\tconst html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Session Export - ${basename(sessionFile)}</title>\n <style>\n :root {\n --bg-color: #0d1117;\n --container-bg: #161b22;\n --border-color: #30363d;\n --text-primary: #c9d1d9;\n --text-secondary: #8b949e;\n --text-dim: #6e7681;\n --accent-color: #58a6ff;\n --success-color: #238636;\n --error-color: #f85149;\n --warning-color: #d29922;\n --user-bg: #1f2428;\n --assistant-bg: #161b22;\n --code-bg: #0d1117;\n --font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \"Liberation Mono\", monospace;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: var(--font-sans);\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-primary);\n background: var(--bg-color);\n padding: 24px;\n }\n\n .container {\n max-width: 1000px;\n margin: 0 auto;\n }\n\n .header {\n margin-bottom: 32px;\n padding: 24px;\n background: var(--container-bg);\n border: 1px solid var(--border-color);\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.12);\n }\n\n .header h1 {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 16px;\n color: var(--accent-color);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .header-info {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n font-size: 13px;\n }\n\n .info-item {\n color: var(--text-secondary);\n display: flex;\n align-items: center;\n }\n\n .info-label {\n font-weight: 500;\n margin-right: 8px;\n color: var(--text-dim);\n min-width: 70px;\n }\n\n .info-value {\n color: var(--text-primary);\n font-family: var(--font-mono);\n }\n\n .messages {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* Message Containers */\n .message-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-secondary);\n margin-left: 4px;\n }\n\n .user-avatar, .assistant-avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: bold;\n }\n\n .user-avatar {\n background: var(--accent-color);\n color: #fff;\n }\n\n .assistant-avatar {\n background: var(--success-color);\n color: #fff;\n }\n\n /* User Message */\n .user-message {\n background: var(--user-bg);\n padding: 16px 20px;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 13px;\n }\n\n .attachment-list {\n margin-top: 12px;\n border-top: 1px solid var(--border-color);\n padding-top: 8px;\n }\n\n .attachment-item {\n color: var(--text-secondary);\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n /* Assistant Message */\n .assistant-message {\n background: transparent;\n }\n\n .assistant-text {\n padding: 4px 0;\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 13px;\n color: var(--text-primary);\n margin-bottom: 12px;\n }\n\n /* Thinking Text */\n .thinking-text {\n padding: 12px 16px;\n margin-bottom: 12px;\n background: var(--container-bg);\n border-left: 3px solid var(--text-dim);\n color: var(--text-secondary);\n font-style: italic;\n white-space: pre-wrap;\n word-wrap: break-word;\n font-family: var(--font-mono);\n font-size: 12px;\n border-radius: 0 4px 4px 0;\n }\n\n /* Tools */\n .tool-execution {\n background: var(--container-bg);\n border: 1px solid var(--border-color);\n border-radius: 6px;\n margin-top: 12px;\n overflow: hidden;\n font-family: var(--font-mono);\n font-size: 12px;\n }\n\n .tool-header {\n padding: 8px 12px;\n background: rgba(255, 255, 255, 0.03);\n border-bottom: 1px solid var(--border-color);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .tool-name {\n font-weight: 600;\n color: var(--accent-color);\n }\n\n .tool-path {\n color: var(--text-secondary);\n }\n\n .line-count {\n color: var(--text-dim);\n font-size: 11px;\n }\n\n .tool-command {\n color: var(--text-primary);\n font-weight: 500;\n }\n\n .tool-output {\n padding: 12px;\n color: var(--text-secondary);\n white-space: pre-wrap;\n overflow-x: auto;\n background: var(--code-bg);\n }\n\n .tool-output.expandable {\n cursor: pointer;\n position: relative;\n }\n\n .tool-output.expandable:hover {\n background: rgba(255, 255, 255, 0.02);\n }\n\n .tool-output.expandable .output-full {\n display: none;\n }\n\n .tool-output.expandable.expanded .output-preview {\n display: none;\n }\n\n .tool-output.expandable.expanded .output-full {\n display: block;\n }\n\n .expand-hint {\n color: var(--accent-color);\n font-size: 11px;\n margin-top: 8px;\n opacity: 0.8;\n }\n\n /* Diff Styling */\n .tool-diff {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n\n .diff-line-new {\n background: rgba(46, 160, 67, 0.15);\n color: #e6ffec;\n padding: 0 4px;\n }\n\n .diff-line-old {\n background: rgba(248, 81, 73, 0.15);\n color: #ffdad8;\n padding: 0 4px;\n }\n\n .diff-line-context {\n color: var(--text-dim);\n padding: 0 4px;\n }\n\n /* Error */\n .error-text {\n color: var(--error-color);\n padding: 12px;\n background: rgba(248, 81, 73, 0.1);\n border-radius: 6px;\n margin-top: 8px;\n }\n\n /* Footer */\n .footer {\n margin-top: 48px;\n padding-top: 24px;\n text-align: center;\n color: var(--text-dim);\n font-size: 12px;\n border-top: 1px solid var(--border-color);\n }\n\n @media print {\n body {\n background: white;\n color: black;\n }\n .header, .user-message, .tool-execution, .thinking-text {\n border: 1px solid #ddd;\n background: none;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>Maestro Session Export</h1>\n <div class=\"header-info\">\n <div class=\"info-item\">\n <span class=\"info-label\">Session</span>\n <span class=\"info-value\">${escapeHtml(sessionHeader?.id || \"unknown\")}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Date</span>\n <span class=\"info-value\">${sessionHeader?.timestamp ? new Date(sessionHeader.timestamp).toLocaleString() : timestamp}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">${escapeHtml(sessionHeader?.model || state.model.id)}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Messages</span>\n <span class=\"info-value\">${visibleMessages.length}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Directory</span>\n <span class=\"info-value\">${escapeHtml(shortenPath(sessionHeader?.cwd || process.cwd()))}</span>\n </div>\n </div>\n </div>\n\n <div class=\"messages\">\n ${messagesHtml}\n </div>\n\n <div class=\"footer\">\n Generated by Maestro v${VERSION} on ${new Date().toLocaleString()}\n </div>\n </div>\n</body>\n</html>`;\n\n\twriteFileSync(resolvedOutputPath, html, \"utf8\");\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToText(\n\tsessionManager: SessionManager,\n\t_state: AgentState,\n\toutputPath?: string,\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tconst timestamp = new Date().toISOString();\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.txt`;\n\t})();\n\n\tconst { messages } = await parseSessionFile(sessionFile);\n\tconst renderableMessages = buildConversationModel(messages);\n\tconst toolResultsMap = new Map(\n\t\trenderableMessages\n\t\t\t.filter((message): message is RenderableToolResultMessage =>\n\t\t\t\tisRenderableToolResultMessage(message),\n\t\t\t)\n\t\t\t.map((message) => [message.toolCallId, message] as const),\n\t);\n\n\tconst output: string[] = [];\n\toutput.push(`Session export: ${basename(sessionFile)}`);\n\toutput.push(`Generated: ${timestamp}`);\n\toutput.push(\"\");\n\n\tfor (const message of renderableMessages) {\n\t\tconst textBlock = formatMessageAsText(message, toolResultsMap);\n\t\tif (textBlock) {\n\t\t\toutput.push(textBlock, \"\");\n\t\t}\n\t}\n\n\twriteFileSync(resolvedOutputPath, output.join(\"\\n\"), \"utf-8\");\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToJsonl(\n\tsessionManager: SessionManager,\n\toutputPath?: string,\n\toptions: PortableExportOptions = {},\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !existsSync(sessionFile)) {\n\t\tthrow new Error(\"No persisted session is available to export.\");\n\t}\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\treturn basename(sessionFile);\n\t})();\n\n\tif (options.redactSecrets) {\n\t\tawait withSessionWriter(resolvedOutputPath, async (stream) => {\n\t\t\tawait streamPortableEntries(sessionFile, async (entry) => {\n\t\t\t\tconst sanitized = sanitizeEntryForPortableExport(entry);\n\t\t\t\tstream.write(`${JSON.stringify(sanitized)}\\n`);\n\t\t\t});\n\t\t});\n\t\treturn resolvedOutputPath;\n\t}\n\n\tcopyFileSync(sessionFile, resolvedOutputPath);\n\treturn resolvedOutputPath;\n}\n\nexport async function exportSessionToJson(\n\tsessionManager: SessionManager,\n\toutputPath?: string,\n\toptions: PortableExportOptions = {},\n): Promise<string> {\n\tawait sessionManager.flush();\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !existsSync(sessionFile)) {\n\t\tthrow new Error(\"No persisted session is available to export.\");\n\t}\n\n\tconst resolvedOutputPath = (() => {\n\t\tif (outputPath) {\n\t\t\treturn outputPath;\n\t\t}\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\treturn `${sessionBasename}.json`;\n\t})();\n\n\tconst portableBundle = sessionManager.getPortableSessionBundle();\n\n\tawait withSessionWriter(resolvedOutputPath, async (stream) => {\n\t\tstream.write(\n\t\t\t`{\"format\":\"maestro-session-export.v1\",\"exportedAt\":${JSON.stringify(new Date().toISOString())},\"sessionId\":${JSON.stringify(portableBundle.selectedSessionId)},\"entries\":`,\n\t\t);\n\t\tawait writePortableEntryArray(stream, sessionFile, options);\n\t\tstream.write(',\"sessions\":[');\n\t\tlet wroteSession = false;\n\t\tfor (const session of portableBundle.sessions) {\n\t\t\tstream.write(wroteSession ? \",\" : \"\");\n\t\t\tawait writePortableSession(stream, session, options);\n\t\t\twroteSession = true;\n\t\t}\n\t\tstream.write(\"]}\\n\");\n\t});\n\n\treturn resolvedOutputPath;\n}\n\nasync function writePortableSession(\n\tstream: ReturnType<typeof createWriteStream>,\n\tsession: PortableSessionExportSession,\n\toptions: PortableExportOptions = {},\n): Promise<void> {\n\tstream.write(\n\t\t`{\"sessionId\":${JSON.stringify(session.sessionId)},\"parentSessionId\":${JSON.stringify(session.parentSessionId ?? null)},\"entries\":`,\n\t);\n\tawait writePortableEntryArray(stream, session.sessionFile, options);\n\tstream.write(\"}\");\n}\n\nfunction formatMessageAsText(\n\tmessage: RenderableMessage,\n\ttoolResultsMap: Map<string, RenderableToolResultMessage>,\n): string {\n\tif (isRenderableUserMessage(message)) {\n\t\tconst parts: string[] = [];\n\t\tif (message.text.trim()) {\n\t\t\tparts.push(message.text.trim());\n\t\t}\n\t\tif (message.attachments.length) {\n\t\t\tparts.push(\n\t\t\t\t...message.attachments.map(\n\t\t\t\t\t(attachment) =>\n\t\t\t\t\t\t`[attachment] ${attachment.fileName} (${attachment.mimeType})`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (!parts.length) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn `User:\\n${parts.join(\"\\n\")}`;\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\tconst parts: string[] = [];\n\t\tfor (const text of message.textBlocks) {\n\t\t\tif (text.trim()) {\n\t\t\t\tparts.push(text.trim());\n\t\t\t}\n\t\t}\n\t\tfor (const thinking of message.thinkingBlocks) {\n\t\t\tif (thinking.trim()) {\n\t\t\t\tparts.push(`[thinking]\\n${thinking.trim()}`);\n\t\t\t}\n\t\t}\n\t\tfor (const toolCall of message.toolCalls) {\n\t\t\tconst argsString = JSON.stringify(toolCall.arguments, null, 2);\n\t\t\tparts.push(`[tool call] ${toolCall.name}\\n${argsString}\\n`);\n\t\t\tconst result = toolResultsMap.get(toolCall.id);\n\t\t\tif (result?.textContent) {\n\t\t\t\tparts.push(`[tool result] ${toolCall.name}\\n${result.textContent}`);\n\t\t\t}\n\t\t}\n\t\tif (parts.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn `Assistant:\\n${parts.join(\"\\n\\n\")}`;\n\t}\n\tif (isRenderableToolResultMessage(message)) {\n\t\tconst lines: string[] = [];\n\t\tif (message.textContent.trim()) {\n\t\t\tlines.push(message.textContent.trim());\n\t\t}\n\t\tif (message.images.length) {\n\t\t\tlines.push(\n\t\t\t\t...message.images.map(\n\t\t\t\t\t(image) => `[image] ${image.mimeType || \"attachment\"}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\treturn `Tool ${message.toolName} (${message.toolCallId}):\\n${text}`;\n\t}\n\treturn \"\";\n}\n"]}
@@ -58,8 +58,9 @@ export interface HeadlessUtilityCommandSnapshot {
58
58
  }
59
59
  export declare class HeadlessUtilityCommandManager {
60
60
  private readonly emit;
61
+ private readonly workspaceRoot?;
61
62
  private readonly commands;
62
- constructor(emit: (event: HeadlessUtilityCommandEvent) => void);
63
+ constructor(emit: (event: HeadlessUtilityCommandEvent) => void, workspaceRoot?: string | undefined);
63
64
  snapshot(): HeadlessUtilityCommandSnapshot[];
64
65
  get(commandId: string): HeadlessUtilityCommandSnapshot | undefined;
65
66
  start(request: HeadlessUtilityCommandStartRequest): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"utility-command-manager.d.ts","sourceRoot":"","sources":["../../src/headless/utility-command-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utility-command-manager.d.ts","sourceRoot":"","sources":["../../src/headless/utility-command-manager.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
2
2
  import { getShellConfig, killProcessTree, killProcessTreeGracefully, parseCommandArguments, validateShellParams, } from "../tools/shell-utils.js";
3
3
  import { appendHeadlessOutput } from "./output-buffer.js";
4
4
  import { HEADLESS_PTY_HELPER_SCRIPT, encodeHeadlessPtyHelperConfig, getHeadlessPtyPythonCommand, } from "./pty-helper.js";
5
+ import { resolveWorkspacePath } from "./workspace-root.js";
5
6
  const DEFAULT_PTY_COLUMNS = 80;
6
7
  const DEFAULT_PTY_ROWS = 24;
7
8
  function normalizeTerminalMode(value) {
@@ -31,8 +32,9 @@ function buildSnapshot(commandId, active) {
31
32
  };
32
33
  }
33
34
  export class HeadlessUtilityCommandManager {
34
- constructor(emit) {
35
+ constructor(emit, workspaceRoot) {
35
36
  this.emit = emit;
37
+ this.workspaceRoot = workspaceRoot;
36
38
  this.commands = new Map();
37
39
  }
38
40
  snapshot() {
@@ -53,11 +55,15 @@ export class HeadlessUtilityCommandManager {
53
55
  const terminalMode = normalizeTerminalMode(request.terminal_mode);
54
56
  const allowStdin = request.allow_stdin ?? false;
55
57
  const { resolvedCwd } = validateShellParams(request.command, request.cwd, request.env);
58
+ const commandCwd = resolveWorkspacePath(resolvedCwd, this.workspaceRoot) ??
59
+ resolveWorkspacePath(undefined, this.workspaceRoot) ??
60
+ resolvedCwd ??
61
+ process.cwd();
56
62
  const env = request.env ? { ...process.env, ...request.env } : process.env;
57
63
  if (terminalMode === "pty") {
58
64
  await this.startPtyCommand({
59
65
  ...request,
60
- cwd: resolvedCwd,
66
+ cwd: commandCwd,
61
67
  shell_mode: shellMode,
62
68
  terminal_mode: terminalMode,
63
69
  allow_stdin: allowStdin,
@@ -71,7 +77,7 @@ export class HeadlessUtilityCommandManager {
71
77
  if (shellMode === "shell") {
72
78
  const { shell, args } = getShellConfig();
73
79
  child = spawn(shell, [...args, request.command], {
74
- cwd: resolvedCwd,
80
+ cwd: commandCwd,
75
81
  env,
76
82
  stdio: [allowStdin ? "pipe" : "ignore", "pipe", "pipe"],
77
83
  });
@@ -82,7 +88,7 @@ export class HeadlessUtilityCommandManager {
82
88
  throw new Error("Command must contain an executable to run");
83
89
  }
84
90
  child = spawn(parsed[0], parsed.slice(1), {
85
- cwd: resolvedCwd,
91
+ cwd: commandCwd,
86
92
  env,
87
93
  stdio: [allowStdin ? "pipe" : "ignore", "pipe", "pipe"],
88
94
  });
@@ -90,7 +96,7 @@ export class HeadlessUtilityCommandManager {
90
96
  const active = {
91
97
  child,
92
98
  command: request.command,
93
- cwd: resolvedCwd,
99
+ cwd: commandCwd,
94
100
  shell_mode: shellMode,
95
101
  terminal_mode: terminalMode,
96
102
  allow_stdin: allowStdin,
@@ -102,7 +108,7 @@ export class HeadlessUtilityCommandManager {
102
108
  type: "started",
103
109
  command_id: request.command_id,
104
110
  command: request.command,
105
- cwd: resolvedCwd,
111
+ cwd: commandCwd,
106
112
  shell_mode: shellMode,
107
113
  terminal_mode: terminalMode,
108
114
  pid: child.pid ?? undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"utility-command-manager.js","sourceRoot":"","sources":["../../src/headless/utility-command-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport type {\n\tHeadlessUtilityCommandShellMode,\n\tHeadlessUtilityCommandStream,\n\tHeadlessUtilityCommandTerminalMode,\n} from \"@evalops/contracts\";\nimport {\n\tgetShellConfig,\n\tkillProcessTree,\n\tkillProcessTreeGracefully,\n\tparseCommandArguments,\n\tvalidateShellParams,\n} from \"../tools/shell-utils.js\";\nimport { appendHeadlessOutput } from \"./output-buffer.js\";\nimport {\n\tHEADLESS_PTY_HELPER_SCRIPT,\n\tencodeHeadlessPtyHelperConfig,\n\tgetHeadlessPtyPythonCommand,\n} from \"./pty-helper.js\";\n\nexport interface HeadlessUtilityCommandStartRequest {\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tenv?: Record<string, string>;\n\tshell_mode?: HeadlessUtilityCommandShellMode;\n\tterminal_mode?: HeadlessUtilityCommandTerminalMode;\n\tallow_stdin?: boolean;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n}\n\nexport interface HeadlessUtilityCommandStartedEvent {\n\ttype: \"started\";\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tpid?: number;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n}\n\nexport interface HeadlessUtilityCommandResizedEvent {\n\ttype: \"resized\";\n\tcommand_id: string;\n\tcolumns: number;\n\trows: number;\n}\n\nexport interface HeadlessUtilityCommandOutputEvent {\n\ttype: \"output\";\n\tcommand_id: string;\n\tstream: HeadlessUtilityCommandStream;\n\tcontent: string;\n}\n\nexport interface HeadlessUtilityCommandExitedEvent {\n\ttype: \"exited\";\n\tcommand_id: string;\n\tsuccess: boolean;\n\texit_code?: number | null;\n\tsignal?: string | null;\n\treason?: string;\n}\n\nexport type HeadlessUtilityCommandEvent =\n\t| HeadlessUtilityCommandStartedEvent\n\t| HeadlessUtilityCommandResizedEvent\n\t| HeadlessUtilityCommandOutputEvent\n\t| HeadlessUtilityCommandExitedEvent;\n\ninterface PtyCommandState {\n\tlineBuffer: string;\n\terrorOutput: string;\n\tstartResolved: boolean;\n}\n\ninterface ActiveCommand {\n\tchild: ChildProcess;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tallow_stdin: boolean;\n\towner_connection_id?: string;\n\toutput: string;\n\tcolumns?: number;\n\trows?: number;\n\treason?: string;\n\tpty?: PtyCommandState;\n}\n\nexport interface HeadlessUtilityCommandSnapshot {\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tpid?: number;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n\toutput: string;\n}\n\ninterface ParsedPtyControlMessage {\n\ttype: \"started\" | \"output\" | \"resized\" | \"exited\" | \"error\";\n\tpid?: number;\n\tcontent?: string;\n\tcolumns?: number;\n\trows?: number;\n\tsuccess?: boolean;\n\texit_code?: number | null;\n\tsignal?: string | null;\n\treason?: string;\n\tmessage?: string;\n}\n\nconst DEFAULT_PTY_COLUMNS = 80;\nconst DEFAULT_PTY_ROWS = 24;\n\nfunction normalizeTerminalMode(\n\tvalue?: HeadlessUtilityCommandTerminalMode,\n): HeadlessUtilityCommandTerminalMode {\n\treturn value ?? \"pipe\";\n}\n\nfunction normalizePtyDimension(\n\tvalue: number | undefined,\n\tfallback: number,\n\tlabel: string,\n): number {\n\tif (value === undefined) {\n\t\treturn fallback;\n\t}\n\tif (!Number.isInteger(value) || value <= 0) {\n\t\tthrow new Error(`Utility command ${label} must be a positive integer`);\n\t}\n\treturn value;\n}\n\nfunction buildSnapshot(\n\tcommandId: string,\n\tactive: ActiveCommand,\n): HeadlessUtilityCommandSnapshot {\n\treturn {\n\t\tcommand_id: commandId,\n\t\tcommand: active.command,\n\t\tcwd: active.cwd,\n\t\tshell_mode: active.shell_mode,\n\t\tterminal_mode: active.terminal_mode,\n\t\tpid: active.child.pid ?? undefined,\n\t\tcolumns: active.columns,\n\t\trows: active.rows,\n\t\towner_connection_id: active.owner_connection_id,\n\t\toutput: active.output,\n\t};\n}\n\nexport class HeadlessUtilityCommandManager {\n\tprivate readonly commands = new Map<string, ActiveCommand>();\n\n\tconstructor(\n\t\tprivate readonly emit: (event: HeadlessUtilityCommandEvent) => void,\n\t) {}\n\n\tsnapshot(): HeadlessUtilityCommandSnapshot[] {\n\t\treturn Array.from(this.commands.entries()).map(([commandId, active]) =>\n\t\t\tbuildSnapshot(commandId, active),\n\t\t);\n\t}\n\n\tget(commandId: string): HeadlessUtilityCommandSnapshot | undefined {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn buildSnapshot(commandId, active);\n\t}\n\n\tasync start(request: HeadlessUtilityCommandStartRequest): Promise<void> {\n\t\tif (this.commands.has(request.command_id)) {\n\t\t\tthrow new Error(`Utility command already exists: ${request.command_id}`);\n\t\t}\n\n\t\tconst shellMode = request.shell_mode ?? \"shell\";\n\t\tconst terminalMode = normalizeTerminalMode(request.terminal_mode);\n\t\tconst allowStdin = request.allow_stdin ?? false;\n\t\tconst { resolvedCwd } = validateShellParams(\n\t\t\trequest.command,\n\t\t\trequest.cwd,\n\t\t\trequest.env,\n\t\t);\n\t\tconst env = request.env ? { ...process.env, ...request.env } : process.env;\n\n\t\tif (terminalMode === \"pty\") {\n\t\t\tawait this.startPtyCommand({\n\t\t\t\t...request,\n\t\t\t\tcwd: resolvedCwd,\n\t\t\t\tshell_mode: shellMode,\n\t\t\t\tterminal_mode: terminalMode,\n\t\t\t\tallow_stdin: allowStdin,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.columns !== undefined || request.rows !== undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Utility command columns and rows require terminal_mode=pty\",\n\t\t\t);\n\t\t}\n\n\t\tlet child: ChildProcess;\n\t\tif (shellMode === \"shell\") {\n\t\t\tconst { shell, args } = getShellConfig();\n\t\t\tchild = spawn(shell, [...args, request.command], {\n\t\t\t\tcwd: resolvedCwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [allowStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} else {\n\t\t\tconst parsed = parseCommandArguments(request.command);\n\t\t\tif (parsed.length === 0) {\n\t\t\t\tthrow new Error(\"Command must contain an executable to run\");\n\t\t\t}\n\t\t\tchild = spawn(parsed[0]!, parsed.slice(1), {\n\t\t\t\tcwd: resolvedCwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [allowStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t}\n\n\t\tconst active: ActiveCommand = {\n\t\t\tchild,\n\t\t\tcommand: request.command,\n\t\t\tcwd: resolvedCwd,\n\t\t\tshell_mode: shellMode,\n\t\t\tterminal_mode: terminalMode,\n\t\t\tallow_stdin: allowStdin,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\toutput: \"\",\n\t\t};\n\t\tthis.commands.set(request.command_id, active);\n\t\tthis.emit({\n\t\t\ttype: \"started\",\n\t\t\tcommand_id: request.command_id,\n\t\t\tcommand: request.command,\n\t\t\tcwd: resolvedCwd,\n\t\t\tshell_mode: shellMode,\n\t\t\tterminal_mode: terminalMode,\n\t\t\tpid: child.pid ?? undefined,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t});\n\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst content = chunk.toString(\"utf8\");\n\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\tthis.emit({\n\t\t\t\ttype: \"output\",\n\t\t\t\tcommand_id: request.command_id,\n\t\t\t\tstream: \"stdout\",\n\t\t\t\tcontent,\n\t\t\t});\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst content = chunk.toString(\"utf8\");\n\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\tthis.emit({\n\t\t\t\ttype: \"output\",\n\t\t\t\tcommand_id: request.command_id,\n\t\t\t\tstream: \"stderr\",\n\t\t\t\tcontent,\n\t\t\t});\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tthis.finish(request.command_id, {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: error.message,\n\t\t\t});\n\t\t});\n\t\tchild.on(\"close\", (exitCode, signal) => {\n\t\t\tthis.finish(request.command_id, {\n\t\t\t\tsuccess: exitCode === 0 && !signal,\n\t\t\t\texit_code: exitCode,\n\t\t\t\tsignal,\n\t\t\t\treason: active.reason,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync terminate(\n\t\tcommandId: string,\n\t\tforce = false,\n\t\treason?: string,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\treturn;\n\t\t}\n\t\tactive.reason =\n\t\t\treason ??\n\t\t\tactive.reason ??\n\t\t\t(force ? \"Force terminated by controller\" : \"Terminated by controller\");\n\n\t\tif (active.terminal_mode === \"pty\") {\n\t\t\ttry {\n\t\t\t\tawait this.sendPtyControl(active, {\n\t\t\t\t\ttype: \"terminate\",\n\t\t\t\t\tforce,\n\t\t\t\t\treason: active.reason,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tconst pid = active.child.pid;\n\t\t\t\tif (pid) {\n\t\t\t\t\tkillProcessTree(pid);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst pid = active.child.pid;\n\t\tif (!pid) {\n\t\t\treturn;\n\t\t}\n\t\tif (force) {\n\t\t\tkillProcessTree(pid);\n\t\t\treturn;\n\t\t}\n\t\tawait killProcessTreeGracefully(pid);\n\t}\n\n\tasync writeStdin(\n\t\tcommandId: string,\n\t\tcontent: string,\n\t\teof = false,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\tthrow new Error(`Utility command not found: ${commandId}`);\n\t\t}\n\t\tif (!active.allow_stdin) {\n\t\t\tthrow new Error(`Utility command stdin is not enabled: ${commandId}`);\n\t\t}\n\n\t\tif (active.terminal_mode === \"pty\") {\n\t\t\tawait this.sendPtyControl(active, {\n\t\t\t\ttype: \"stdin\",\n\t\t\t\tcontent,\n\t\t\t\teof,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst stdin = active.child.stdin;\n\t\tif (!stdin || stdin.destroyed || stdin.writableEnded) {\n\t\t\tif (!content && eof) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new Error(`Utility command stdin is not writable: ${commandId}`);\n\t\t}\n\t\tif (content) {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstdin.write(content, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tif (eof && !stdin.destroyed && !stdin.writableEnded) {\n\t\t\tstdin.end();\n\t\t}\n\t}\n\n\tasync resize(\n\t\tcommandId: string,\n\t\tcolumns: number,\n\t\trows: number,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\tthrow new Error(`Utility command not found: ${commandId}`);\n\t\t}\n\t\tif (active.terminal_mode !== \"pty\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Utility command resize is only supported for PTY commands: ${commandId}`,\n\t\t\t);\n\t\t}\n\t\tawait this.sendPtyControl(active, {\n\t\t\ttype: \"resize\",\n\t\t\tcolumns: normalizePtyDimension(columns, DEFAULT_PTY_COLUMNS, \"columns\"),\n\t\t\trows: normalizePtyDimension(rows, DEFAULT_PTY_ROWS, \"rows\"),\n\t\t});\n\t}\n\n\tasync dispose(reason = \"Headless runtime disposed\"): Promise<void> {\n\t\tconst commandIds = Array.from(this.commands.keys());\n\t\tfor (const commandId of commandIds) {\n\t\t\tconst active = this.commands.get(commandId);\n\t\t\tif (!active) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.terminate(commandId, false, reason);\n\t\t\t} catch {\n\t\t\t\t// Best-effort shutdown.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync disposeOwnedByConnection(\n\t\tconnectionId: string,\n\t\treason: string,\n\t): Promise<void> {\n\t\tconst commandIds = Array.from(this.commands.entries())\n\t\t\t.filter(([, active]) => active.owner_connection_id === connectionId)\n\t\t\t.map(([commandId]) => commandId);\n\t\tfor (const commandId of commandIds) {\n\t\t\tconst active = this.commands.get(commandId);\n\t\t\tif (!active) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.terminate(commandId, false, reason);\n\t\t\t} catch {\n\t\t\t\t// Best-effort shutdown.\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async startPtyCommand(\n\t\trequest: HeadlessUtilityCommandStartRequest & {\n\t\t\tcwd?: string;\n\t\t\tshell_mode: HeadlessUtilityCommandShellMode;\n\t\t\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\t\t\tallow_stdin: boolean;\n\t\t},\n\t): Promise<void> {\n\t\tif (process.platform === \"win32\") {\n\t\t\tthrow new Error(\"PTY utility commands are not supported on Windows\");\n\t\t}\n\n\t\tconst columns = normalizePtyDimension(\n\t\t\trequest.columns,\n\t\t\tDEFAULT_PTY_COLUMNS,\n\t\t\t\"columns\",\n\t\t);\n\t\tconst rows = normalizePtyDimension(request.rows, DEFAULT_PTY_ROWS, \"rows\");\n\t\tconst env = request.env ? { ...process.env, ...request.env } : process.env;\n\t\tconst directArgv =\n\t\t\trequest.shell_mode === \"direct\"\n\t\t\t\t? parseCommandArguments(request.command)\n\t\t\t\t: [];\n\t\tif (request.shell_mode === \"direct\" && directArgv.length === 0) {\n\t\t\tthrow new Error(\"Command must contain an executable to run\");\n\t\t}\n\t\tconst config = {\n\t\t\tcommand: request.command,\n\t\t\tcwd: request.cwd,\n\t\t\tenv: request.env,\n\t\t\tshell_mode: request.shell_mode,\n\t\t\tcolumns,\n\t\t\trows,\n\t\t\t...(request.shell_mode === \"direct\" ? { argv: directArgv } : {}),\n\t\t} as const;\n\n\t\tconst child = spawn(\n\t\t\tgetHeadlessPtyPythonCommand(),\n\t\t\t[\"-c\", HEADLESS_PTY_HELPER_SCRIPT, encodeHeadlessPtyHelperConfig(config)],\n\t\t\t{\n\t\t\t\tcwd: request.cwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t},\n\t\t);\n\t\tconst active: ActiveCommand = {\n\t\t\tchild,\n\t\t\tcommand: request.command,\n\t\t\tcwd: request.cwd,\n\t\t\tshell_mode: request.shell_mode,\n\t\t\tterminal_mode: request.terminal_mode,\n\t\t\tallow_stdin: request.allow_stdin,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\toutput: \"\",\n\t\t\tcolumns,\n\t\t\trows,\n\t\t\tpty: {\n\t\t\t\tlineBuffer: \"\",\n\t\t\t\terrorOutput: \"\",\n\t\t\t\tstartResolved: false,\n\t\t\t},\n\t\t};\n\t\tthis.commands.set(request.command_id, active);\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tlet startSettled = false;\n\t\t\tconst settleStart = (callback: () => void) => {\n\t\t\t\tif (startSettled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstartSettled = true;\n\t\t\t\tcallback();\n\t\t\t};\n\t\t\tconst finishWithError = (message: string) => {\n\t\t\t\tactive.reason = message;\n\t\t\t\tsettleStart(() => reject(new Error(message)));\n\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\treason: message,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\t\tconst ptyState = active.pty;\n\t\t\t\tif (!ptyState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tptyState.lineBuffer += chunk.toString(\"utf8\");\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst newlineIndex = ptyState.lineBuffer.indexOf(\"\\n\");\n\t\t\t\t\tif (newlineIndex === -1) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst rawLine = ptyState.lineBuffer.slice(0, newlineIndex).trim();\n\t\t\t\t\tptyState.lineBuffer = ptyState.lineBuffer.slice(newlineIndex + 1);\n\t\t\t\t\tif (!rawLine) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet message: ParsedPtyControlMessage;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmessage = JSON.parse(rawLine) as ParsedPtyControlMessage;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tfinishWithError(\"Malformed PTY helper message\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase \"started\":\n\t\t\t\t\t\t\tactive.columns = message.columns ?? active.columns;\n\t\t\t\t\t\t\tactive.rows = message.rows ?? active.rows;\n\t\t\t\t\t\t\tptyState.startResolved = true;\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"started\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tcommand: request.command,\n\t\t\t\t\t\t\t\tcwd: request.cwd,\n\t\t\t\t\t\t\t\tshell_mode: request.shell_mode,\n\t\t\t\t\t\t\t\tterminal_mode: request.terminal_mode,\n\t\t\t\t\t\t\t\tpid: message.pid ?? child.pid ?? undefined,\n\t\t\t\t\t\t\t\tcolumns: active.columns,\n\t\t\t\t\t\t\t\trows: active.rows,\n\t\t\t\t\t\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsettleStart(resolve);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"output\": {\n\t\t\t\t\t\t\tconst content = message.content ?? \"\";\n\t\t\t\t\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"output\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tstream: \"stdout\",\n\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"resized\":\n\t\t\t\t\t\t\tactive.columns = message.columns ?? active.columns;\n\t\t\t\t\t\t\tactive.rows = message.rows ?? active.rows;\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"resized\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tcolumns: active.columns ?? columns,\n\t\t\t\t\t\t\t\trows: active.rows ?? rows,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\t\tfinishWithError(\n\t\t\t\t\t\t\t\tmessage.message ?? \"PTY utility command helper failed\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tcase \"exited\":\n\t\t\t\t\t\t\tsettleStart(resolve);\n\t\t\t\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\t\t\t\tsuccess: message.success ?? false,\n\t\t\t\t\t\t\t\texit_code: message.exit_code,\n\t\t\t\t\t\t\t\tsignal: message.signal,\n\t\t\t\t\t\t\t\treason:\n\t\t\t\t\t\t\t\t\tmessage.reason ?? active.reason ?? active.pty?.errorOutput,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\t\tconst ptyState = active.pty;\n\t\t\t\tif (!ptyState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tptyState.errorOutput = appendHeadlessOutput(\n\t\t\t\t\tptyState.errorOutput,\n\t\t\t\t\tchunk.toString(\"utf8\"),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tfinishWithError(error.message);\n\t\t\t});\n\n\t\t\tchild.on(\"close\", (exitCode, signal) => {\n\t\t\t\tif (this.commands.has(request.command_id)) {\n\t\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\t\tsuccess: exitCode === 0 && !signal,\n\t\t\t\t\t\texit_code: exitCode,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\treason: active.reason ?? active.pty?.errorOutput,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsettleStart(() => {\n\t\t\t\t\tif (active.pty?.startResolved) {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\tactive.reason ??\n\t\t\t\t\t\t\t\tactive.pty?.errorOutput ??\n\t\t\t\t\t\t\t\t\"PTY utility command exited before startup completed\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async sendPtyControl(\n\t\tactive: ActiveCommand,\n\t\tcontrol:\n\t\t\t| { type: \"stdin\"; content: string; eof: boolean }\n\t\t\t| { type: \"resize\"; columns: number; rows: number }\n\t\t\t| { type: \"terminate\"; force: boolean; reason?: string },\n\t): Promise<void> {\n\t\tconst stdin = active.child.stdin;\n\t\tif (!stdin || stdin.destroyed || stdin.writableEnded) {\n\t\t\tthrow new Error(\"PTY utility command control channel is not writable\");\n\t\t}\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tstdin.write(`${JSON.stringify(control)}\\n`, (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate finish(\n\t\tcommandId: string,\n\t\tevent: Omit<HeadlessUtilityCommandExitedEvent, \"type\" | \"command_id\">,\n\t): void {\n\t\tif (!this.commands.has(commandId)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.commands.delete(commandId);\n\t\tthis.emit({\n\t\t\ttype: \"exited\",\n\t\t\tcommand_id: commandId,\n\t\t\t...event,\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"utility-command-manager.js","sourceRoot":"","sources":["../../src/headless/utility-command-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport type {\n\tHeadlessUtilityCommandShellMode,\n\tHeadlessUtilityCommandStream,\n\tHeadlessUtilityCommandTerminalMode,\n} from \"@evalops/contracts\";\nimport {\n\tgetShellConfig,\n\tkillProcessTree,\n\tkillProcessTreeGracefully,\n\tparseCommandArguments,\n\tvalidateShellParams,\n} from \"../tools/shell-utils.js\";\nimport { appendHeadlessOutput } from \"./output-buffer.js\";\nimport {\n\tHEADLESS_PTY_HELPER_SCRIPT,\n\tencodeHeadlessPtyHelperConfig,\n\tgetHeadlessPtyPythonCommand,\n} from \"./pty-helper.js\";\nimport { resolveWorkspacePath } from \"./workspace-root.js\";\n\nexport interface HeadlessUtilityCommandStartRequest {\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tenv?: Record<string, string>;\n\tshell_mode?: HeadlessUtilityCommandShellMode;\n\tterminal_mode?: HeadlessUtilityCommandTerminalMode;\n\tallow_stdin?: boolean;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n}\n\nexport interface HeadlessUtilityCommandStartedEvent {\n\ttype: \"started\";\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tpid?: number;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n}\n\nexport interface HeadlessUtilityCommandResizedEvent {\n\ttype: \"resized\";\n\tcommand_id: string;\n\tcolumns: number;\n\trows: number;\n}\n\nexport interface HeadlessUtilityCommandOutputEvent {\n\ttype: \"output\";\n\tcommand_id: string;\n\tstream: HeadlessUtilityCommandStream;\n\tcontent: string;\n}\n\nexport interface HeadlessUtilityCommandExitedEvent {\n\ttype: \"exited\";\n\tcommand_id: string;\n\tsuccess: boolean;\n\texit_code?: number | null;\n\tsignal?: string | null;\n\treason?: string;\n}\n\nexport type HeadlessUtilityCommandEvent =\n\t| HeadlessUtilityCommandStartedEvent\n\t| HeadlessUtilityCommandResizedEvent\n\t| HeadlessUtilityCommandOutputEvent\n\t| HeadlessUtilityCommandExitedEvent;\n\ninterface PtyCommandState {\n\tlineBuffer: string;\n\terrorOutput: string;\n\tstartResolved: boolean;\n}\n\ninterface ActiveCommand {\n\tchild: ChildProcess;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tallow_stdin: boolean;\n\towner_connection_id?: string;\n\toutput: string;\n\tcolumns?: number;\n\trows?: number;\n\treason?: string;\n\tpty?: PtyCommandState;\n}\n\nexport interface HeadlessUtilityCommandSnapshot {\n\tcommand_id: string;\n\tcommand: string;\n\tcwd?: string;\n\tshell_mode: HeadlessUtilityCommandShellMode;\n\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\tpid?: number;\n\tcolumns?: number;\n\trows?: number;\n\towner_connection_id?: string;\n\toutput: string;\n}\n\ninterface ParsedPtyControlMessage {\n\ttype: \"started\" | \"output\" | \"resized\" | \"exited\" | \"error\";\n\tpid?: number;\n\tcontent?: string;\n\tcolumns?: number;\n\trows?: number;\n\tsuccess?: boolean;\n\texit_code?: number | null;\n\tsignal?: string | null;\n\treason?: string;\n\tmessage?: string;\n}\n\nconst DEFAULT_PTY_COLUMNS = 80;\nconst DEFAULT_PTY_ROWS = 24;\n\nfunction normalizeTerminalMode(\n\tvalue?: HeadlessUtilityCommandTerminalMode,\n): HeadlessUtilityCommandTerminalMode {\n\treturn value ?? \"pipe\";\n}\n\nfunction normalizePtyDimension(\n\tvalue: number | undefined,\n\tfallback: number,\n\tlabel: string,\n): number {\n\tif (value === undefined) {\n\t\treturn fallback;\n\t}\n\tif (!Number.isInteger(value) || value <= 0) {\n\t\tthrow new Error(`Utility command ${label} must be a positive integer`);\n\t}\n\treturn value;\n}\n\nfunction buildSnapshot(\n\tcommandId: string,\n\tactive: ActiveCommand,\n): HeadlessUtilityCommandSnapshot {\n\treturn {\n\t\tcommand_id: commandId,\n\t\tcommand: active.command,\n\t\tcwd: active.cwd,\n\t\tshell_mode: active.shell_mode,\n\t\tterminal_mode: active.terminal_mode,\n\t\tpid: active.child.pid ?? undefined,\n\t\tcolumns: active.columns,\n\t\trows: active.rows,\n\t\towner_connection_id: active.owner_connection_id,\n\t\toutput: active.output,\n\t};\n}\n\nexport class HeadlessUtilityCommandManager {\n\tprivate readonly commands = new Map<string, ActiveCommand>();\n\n\tconstructor(\n\t\tprivate readonly emit: (event: HeadlessUtilityCommandEvent) => void,\n\t\tprivate readonly workspaceRoot?: string,\n\t) {}\n\n\tsnapshot(): HeadlessUtilityCommandSnapshot[] {\n\t\treturn Array.from(this.commands.entries()).map(([commandId, active]) =>\n\t\t\tbuildSnapshot(commandId, active),\n\t\t);\n\t}\n\n\tget(commandId: string): HeadlessUtilityCommandSnapshot | undefined {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn buildSnapshot(commandId, active);\n\t}\n\n\tasync start(request: HeadlessUtilityCommandStartRequest): Promise<void> {\n\t\tif (this.commands.has(request.command_id)) {\n\t\t\tthrow new Error(`Utility command already exists: ${request.command_id}`);\n\t\t}\n\n\t\tconst shellMode = request.shell_mode ?? \"shell\";\n\t\tconst terminalMode = normalizeTerminalMode(request.terminal_mode);\n\t\tconst allowStdin = request.allow_stdin ?? false;\n\t\tconst { resolvedCwd } = validateShellParams(\n\t\t\trequest.command,\n\t\t\trequest.cwd,\n\t\t\trequest.env,\n\t\t);\n\t\tconst commandCwd =\n\t\t\tresolveWorkspacePath(resolvedCwd, this.workspaceRoot) ??\n\t\t\tresolveWorkspacePath(undefined, this.workspaceRoot) ??\n\t\t\tresolvedCwd ??\n\t\t\tprocess.cwd();\n\t\tconst env = request.env ? { ...process.env, ...request.env } : process.env;\n\n\t\tif (terminalMode === \"pty\") {\n\t\t\tawait this.startPtyCommand({\n\t\t\t\t...request,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tshell_mode: shellMode,\n\t\t\t\tterminal_mode: terminalMode,\n\t\t\t\tallow_stdin: allowStdin,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.columns !== undefined || request.rows !== undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Utility command columns and rows require terminal_mode=pty\",\n\t\t\t);\n\t\t}\n\n\t\tlet child: ChildProcess;\n\t\tif (shellMode === \"shell\") {\n\t\t\tconst { shell, args } = getShellConfig();\n\t\t\tchild = spawn(shell, [...args, request.command], {\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [allowStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} else {\n\t\t\tconst parsed = parseCommandArguments(request.command);\n\t\t\tif (parsed.length === 0) {\n\t\t\t\tthrow new Error(\"Command must contain an executable to run\");\n\t\t\t}\n\t\t\tchild = spawn(parsed[0]!, parsed.slice(1), {\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [allowStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t}\n\n\t\tconst active: ActiveCommand = {\n\t\t\tchild,\n\t\t\tcommand: request.command,\n\t\t\tcwd: commandCwd,\n\t\t\tshell_mode: shellMode,\n\t\t\tterminal_mode: terminalMode,\n\t\t\tallow_stdin: allowStdin,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\toutput: \"\",\n\t\t};\n\t\tthis.commands.set(request.command_id, active);\n\t\tthis.emit({\n\t\t\ttype: \"started\",\n\t\t\tcommand_id: request.command_id,\n\t\t\tcommand: request.command,\n\t\t\tcwd: commandCwd,\n\t\t\tshell_mode: shellMode,\n\t\t\tterminal_mode: terminalMode,\n\t\t\tpid: child.pid ?? undefined,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t});\n\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst content = chunk.toString(\"utf8\");\n\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\tthis.emit({\n\t\t\t\ttype: \"output\",\n\t\t\t\tcommand_id: request.command_id,\n\t\t\t\tstream: \"stdout\",\n\t\t\t\tcontent,\n\t\t\t});\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst content = chunk.toString(\"utf8\");\n\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\tthis.emit({\n\t\t\t\ttype: \"output\",\n\t\t\t\tcommand_id: request.command_id,\n\t\t\t\tstream: \"stderr\",\n\t\t\t\tcontent,\n\t\t\t});\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tthis.finish(request.command_id, {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: error.message,\n\t\t\t});\n\t\t});\n\t\tchild.on(\"close\", (exitCode, signal) => {\n\t\t\tthis.finish(request.command_id, {\n\t\t\t\tsuccess: exitCode === 0 && !signal,\n\t\t\t\texit_code: exitCode,\n\t\t\t\tsignal,\n\t\t\t\treason: active.reason,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync terminate(\n\t\tcommandId: string,\n\t\tforce = false,\n\t\treason?: string,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\treturn;\n\t\t}\n\t\tactive.reason =\n\t\t\treason ??\n\t\t\tactive.reason ??\n\t\t\t(force ? \"Force terminated by controller\" : \"Terminated by controller\");\n\n\t\tif (active.terminal_mode === \"pty\") {\n\t\t\ttry {\n\t\t\t\tawait this.sendPtyControl(active, {\n\t\t\t\t\ttype: \"terminate\",\n\t\t\t\t\tforce,\n\t\t\t\t\treason: active.reason,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tconst pid = active.child.pid;\n\t\t\t\tif (pid) {\n\t\t\t\t\tkillProcessTree(pid);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst pid = active.child.pid;\n\t\tif (!pid) {\n\t\t\treturn;\n\t\t}\n\t\tif (force) {\n\t\t\tkillProcessTree(pid);\n\t\t\treturn;\n\t\t}\n\t\tawait killProcessTreeGracefully(pid);\n\t}\n\n\tasync writeStdin(\n\t\tcommandId: string,\n\t\tcontent: string,\n\t\teof = false,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\tthrow new Error(`Utility command not found: ${commandId}`);\n\t\t}\n\t\tif (!active.allow_stdin) {\n\t\t\tthrow new Error(`Utility command stdin is not enabled: ${commandId}`);\n\t\t}\n\n\t\tif (active.terminal_mode === \"pty\") {\n\t\t\tawait this.sendPtyControl(active, {\n\t\t\t\ttype: \"stdin\",\n\t\t\t\tcontent,\n\t\t\t\teof,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst stdin = active.child.stdin;\n\t\tif (!stdin || stdin.destroyed || stdin.writableEnded) {\n\t\t\tif (!content && eof) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new Error(`Utility command stdin is not writable: ${commandId}`);\n\t\t}\n\t\tif (content) {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstdin.write(content, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tif (eof && !stdin.destroyed && !stdin.writableEnded) {\n\t\t\tstdin.end();\n\t\t}\n\t}\n\n\tasync resize(\n\t\tcommandId: string,\n\t\tcolumns: number,\n\t\trows: number,\n\t): Promise<void> {\n\t\tconst active = this.commands.get(commandId);\n\t\tif (!active) {\n\t\t\tthrow new Error(`Utility command not found: ${commandId}`);\n\t\t}\n\t\tif (active.terminal_mode !== \"pty\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Utility command resize is only supported for PTY commands: ${commandId}`,\n\t\t\t);\n\t\t}\n\t\tawait this.sendPtyControl(active, {\n\t\t\ttype: \"resize\",\n\t\t\tcolumns: normalizePtyDimension(columns, DEFAULT_PTY_COLUMNS, \"columns\"),\n\t\t\trows: normalizePtyDimension(rows, DEFAULT_PTY_ROWS, \"rows\"),\n\t\t});\n\t}\n\n\tasync dispose(reason = \"Headless runtime disposed\"): Promise<void> {\n\t\tconst commandIds = Array.from(this.commands.keys());\n\t\tfor (const commandId of commandIds) {\n\t\t\tconst active = this.commands.get(commandId);\n\t\t\tif (!active) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.terminate(commandId, false, reason);\n\t\t\t} catch {\n\t\t\t\t// Best-effort shutdown.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync disposeOwnedByConnection(\n\t\tconnectionId: string,\n\t\treason: string,\n\t): Promise<void> {\n\t\tconst commandIds = Array.from(this.commands.entries())\n\t\t\t.filter(([, active]) => active.owner_connection_id === connectionId)\n\t\t\t.map(([commandId]) => commandId);\n\t\tfor (const commandId of commandIds) {\n\t\t\tconst active = this.commands.get(commandId);\n\t\t\tif (!active) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.terminate(commandId, false, reason);\n\t\t\t} catch {\n\t\t\t\t// Best-effort shutdown.\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async startPtyCommand(\n\t\trequest: HeadlessUtilityCommandStartRequest & {\n\t\t\tcwd?: string;\n\t\t\tshell_mode: HeadlessUtilityCommandShellMode;\n\t\t\tterminal_mode: HeadlessUtilityCommandTerminalMode;\n\t\t\tallow_stdin: boolean;\n\t\t},\n\t): Promise<void> {\n\t\tif (process.platform === \"win32\") {\n\t\t\tthrow new Error(\"PTY utility commands are not supported on Windows\");\n\t\t}\n\n\t\tconst columns = normalizePtyDimension(\n\t\t\trequest.columns,\n\t\t\tDEFAULT_PTY_COLUMNS,\n\t\t\t\"columns\",\n\t\t);\n\t\tconst rows = normalizePtyDimension(request.rows, DEFAULT_PTY_ROWS, \"rows\");\n\t\tconst env = request.env ? { ...process.env, ...request.env } : process.env;\n\t\tconst directArgv =\n\t\t\trequest.shell_mode === \"direct\"\n\t\t\t\t? parseCommandArguments(request.command)\n\t\t\t\t: [];\n\t\tif (request.shell_mode === \"direct\" && directArgv.length === 0) {\n\t\t\tthrow new Error(\"Command must contain an executable to run\");\n\t\t}\n\t\tconst config = {\n\t\t\tcommand: request.command,\n\t\t\tcwd: request.cwd,\n\t\t\tenv: request.env,\n\t\t\tshell_mode: request.shell_mode,\n\t\t\tcolumns,\n\t\t\trows,\n\t\t\t...(request.shell_mode === \"direct\" ? { argv: directArgv } : {}),\n\t\t} as const;\n\n\t\tconst child = spawn(\n\t\t\tgetHeadlessPtyPythonCommand(),\n\t\t\t[\"-c\", HEADLESS_PTY_HELPER_SCRIPT, encodeHeadlessPtyHelperConfig(config)],\n\t\t\t{\n\t\t\t\tcwd: request.cwd,\n\t\t\t\tenv,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t},\n\t\t);\n\t\tconst active: ActiveCommand = {\n\t\t\tchild,\n\t\t\tcommand: request.command,\n\t\t\tcwd: request.cwd,\n\t\t\tshell_mode: request.shell_mode,\n\t\t\tterminal_mode: request.terminal_mode,\n\t\t\tallow_stdin: request.allow_stdin,\n\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\toutput: \"\",\n\t\t\tcolumns,\n\t\t\trows,\n\t\t\tpty: {\n\t\t\t\tlineBuffer: \"\",\n\t\t\t\terrorOutput: \"\",\n\t\t\t\tstartResolved: false,\n\t\t\t},\n\t\t};\n\t\tthis.commands.set(request.command_id, active);\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tlet startSettled = false;\n\t\t\tconst settleStart = (callback: () => void) => {\n\t\t\t\tif (startSettled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstartSettled = true;\n\t\t\t\tcallback();\n\t\t\t};\n\t\t\tconst finishWithError = (message: string) => {\n\t\t\t\tactive.reason = message;\n\t\t\t\tsettleStart(() => reject(new Error(message)));\n\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\treason: message,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\t\tconst ptyState = active.pty;\n\t\t\t\tif (!ptyState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tptyState.lineBuffer += chunk.toString(\"utf8\");\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst newlineIndex = ptyState.lineBuffer.indexOf(\"\\n\");\n\t\t\t\t\tif (newlineIndex === -1) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst rawLine = ptyState.lineBuffer.slice(0, newlineIndex).trim();\n\t\t\t\t\tptyState.lineBuffer = ptyState.lineBuffer.slice(newlineIndex + 1);\n\t\t\t\t\tif (!rawLine) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet message: ParsedPtyControlMessage;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmessage = JSON.parse(rawLine) as ParsedPtyControlMessage;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tfinishWithError(\"Malformed PTY helper message\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase \"started\":\n\t\t\t\t\t\t\tactive.columns = message.columns ?? active.columns;\n\t\t\t\t\t\t\tactive.rows = message.rows ?? active.rows;\n\t\t\t\t\t\t\tptyState.startResolved = true;\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"started\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tcommand: request.command,\n\t\t\t\t\t\t\t\tcwd: request.cwd,\n\t\t\t\t\t\t\t\tshell_mode: request.shell_mode,\n\t\t\t\t\t\t\t\tterminal_mode: request.terminal_mode,\n\t\t\t\t\t\t\t\tpid: message.pid ?? child.pid ?? undefined,\n\t\t\t\t\t\t\t\tcolumns: active.columns,\n\t\t\t\t\t\t\t\trows: active.rows,\n\t\t\t\t\t\t\t\towner_connection_id: request.owner_connection_id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsettleStart(resolve);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"output\": {\n\t\t\t\t\t\t\tconst content = message.content ?? \"\";\n\t\t\t\t\t\t\tactive.output = appendHeadlessOutput(active.output, content);\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"output\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tstream: \"stdout\",\n\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"resized\":\n\t\t\t\t\t\t\tactive.columns = message.columns ?? active.columns;\n\t\t\t\t\t\t\tactive.rows = message.rows ?? active.rows;\n\t\t\t\t\t\t\tthis.emit({\n\t\t\t\t\t\t\t\ttype: \"resized\",\n\t\t\t\t\t\t\t\tcommand_id: request.command_id,\n\t\t\t\t\t\t\t\tcolumns: active.columns ?? columns,\n\t\t\t\t\t\t\t\trows: active.rows ?? rows,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\t\tfinishWithError(\n\t\t\t\t\t\t\t\tmessage.message ?? \"PTY utility command helper failed\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tcase \"exited\":\n\t\t\t\t\t\t\tsettleStart(resolve);\n\t\t\t\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\t\t\t\tsuccess: message.success ?? false,\n\t\t\t\t\t\t\t\texit_code: message.exit_code,\n\t\t\t\t\t\t\t\tsignal: message.signal,\n\t\t\t\t\t\t\t\treason:\n\t\t\t\t\t\t\t\t\tmessage.reason ?? active.reason ?? active.pty?.errorOutput,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\t\tconst ptyState = active.pty;\n\t\t\t\tif (!ptyState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tptyState.errorOutput = appendHeadlessOutput(\n\t\t\t\t\tptyState.errorOutput,\n\t\t\t\t\tchunk.toString(\"utf8\"),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tfinishWithError(error.message);\n\t\t\t});\n\n\t\t\tchild.on(\"close\", (exitCode, signal) => {\n\t\t\t\tif (this.commands.has(request.command_id)) {\n\t\t\t\t\tthis.finish(request.command_id, {\n\t\t\t\t\t\tsuccess: exitCode === 0 && !signal,\n\t\t\t\t\t\texit_code: exitCode,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\treason: active.reason ?? active.pty?.errorOutput,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsettleStart(() => {\n\t\t\t\t\tif (active.pty?.startResolved) {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\tactive.reason ??\n\t\t\t\t\t\t\t\tactive.pty?.errorOutput ??\n\t\t\t\t\t\t\t\t\"PTY utility command exited before startup completed\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async sendPtyControl(\n\t\tactive: ActiveCommand,\n\t\tcontrol:\n\t\t\t| { type: \"stdin\"; content: string; eof: boolean }\n\t\t\t| { type: \"resize\"; columns: number; rows: number }\n\t\t\t| { type: \"terminate\"; force: boolean; reason?: string },\n\t): Promise<void> {\n\t\tconst stdin = active.child.stdin;\n\t\tif (!stdin || stdin.destroyed || stdin.writableEnded) {\n\t\t\tthrow new Error(\"PTY utility command control channel is not writable\");\n\t\t}\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tstdin.write(`${JSON.stringify(control)}\\n`, (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate finish(\n\t\tcommandId: string,\n\t\tevent: Omit<HeadlessUtilityCommandExitedEvent, \"type\" | \"command_id\">,\n\t): void {\n\t\tif (!this.commands.has(commandId)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.commands.delete(commandId);\n\t\tthis.emit({\n\t\t\ttype: \"exited\",\n\t\t\tcommand_id: commandId,\n\t\t\t...event,\n\t\t});\n\t}\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  export interface HeadlessUtilityFileReadRequest {
2
2
  path: string;
3
3
  cwd?: string;
4
+ workspaceRoot?: string;
4
5
  offset?: number;
5
6
  limit?: number;
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utility-file-read.d.ts","sourceRoot":"","sources":["../../src/headless/utility-file-read.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACnB;AAsBD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,8BAA8B,GACrC,OAAO,CAAC,6BAA6B,CAAC,CA2CxC"}
1
+ {"version":3,"file":"utility-file-read.d.ts","sourceRoot":"","sources":["../../src/headless/utility-file-read.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACnB;AAsBD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,8BAA8B,GACrC,OAAO,CAAC,6BAA6B,CAAC,CA+CxC"}
@@ -2,6 +2,7 @@ import { readFile } from "node:fs/promises";
2
2
  import { relative, resolve } from "node:path";
3
3
  import { isProbablyBinary } from "../utils/file-content.js";
4
4
  import { validatePath } from "../utils/path-validation.js";
5
+ import { assertWithinWorkspaceRoot, resolveWorkspacePath, } from "./workspace-root.js";
5
6
  const DEFAULT_LIMIT = 400;
6
7
  const MAX_LIMIT = 2_000;
7
8
  const MAX_FILE_BYTES = Number.parseInt(process.env.MAESTRO_HEADLESS_UTILITY_FILE_READ_MAX_BYTES || "", 10) || 2 * 1024 * 1024;
@@ -17,7 +18,9 @@ function toLines(text) {
17
18
  return trimmed ? trimmed.split("\n") : [];
18
19
  }
19
20
  export async function readWorkspaceFile(request) {
20
- const cwd = resolve(request.cwd ?? process.cwd());
21
+ const cwd = resolveWorkspacePath(request.cwd, request.workspaceRoot) ??
22
+ resolveWorkspacePath(undefined, request.workspaceRoot) ??
23
+ resolve(process.cwd());
21
24
  const offset = Math.max(1, request.offset ?? 1);
22
25
  const limit = Math.max(1, Math.min(request.limit ?? DEFAULT_LIMIT, MAX_LIMIT));
23
26
  const targetPath = resolve(cwd, request.path);
@@ -27,6 +30,7 @@ export async function readWorkspaceFile(request) {
27
30
  mustBeReadable: true,
28
31
  maxSize: MAX_FILE_BYTES,
29
32
  });
33
+ assertWithinWorkspaceRoot(validatedPath, request.workspaceRoot);
30
34
  const buffer = await readFile(validatedPath);
31
35
  if (isProbablyBinary(buffer)) {
32
36
  throw new Error(`utility_file_read only supports text files: ${request.path}`);