@evalops/maestro 0.10.23 → 0.10.25

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 (376) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +1 -1
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/keys.d.ts +2 -5
  7. package/dist/agent/keys.d.ts.map +1 -1
  8. package/dist/agent/keys.js +4 -5
  9. package/dist/agent/keys.js.map +1 -1
  10. package/dist/agent/modes.d.ts +2 -2
  11. package/dist/agent/modes.d.ts.map +1 -1
  12. package/dist/agent/modes.js +6 -7
  13. package/dist/agent/modes.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +4 -4
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.js +1 -1
  18. package/dist/agent/swarm/executor.d.ts +2 -0
  19. package/dist/agent/swarm/executor.d.ts.map +1 -1
  20. package/dist/agent/swarm/executor.js +208 -35
  21. package/dist/agent/swarm/executor.js.map +1 -1
  22. package/dist/agent/swarm/types.d.ts +2 -0
  23. package/dist/agent/swarm/types.d.ts.map +1 -1
  24. package/dist/agent/swarm/types.js.map +1 -1
  25. package/dist/agent/tool-capability-types.d.ts +36 -0
  26. package/dist/agent/tool-capability-types.d.ts.map +1 -0
  27. package/dist/agent/tool-capability-types.js +2 -0
  28. package/dist/agent/tool-capability-types.js.map +1 -0
  29. package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
  30. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  31. package/dist/agent/transport/tool-execution-bridge.js +28 -15
  32. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  33. package/dist/agent/transport/transport-utils.d.ts.map +1 -1
  34. package/dist/agent/transport/transport-utils.js +2 -3
  35. package/dist/agent/transport/transport-utils.js.map +1 -1
  36. package/dist/agent/transport.js +1 -1
  37. package/dist/agent/transport.js.map +1 -1
  38. package/dist/agent/type-guards.d.ts +1 -1
  39. package/dist/agent/type-guards.js +1 -1
  40. package/dist/agent/type-guards.js.map +1 -1
  41. package/dist/agent/types.d.ts +5 -3
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js +2 -2
  44. package/dist/agent/types.js.map +1 -1
  45. package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
  46. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
  47. package/dist/app-server/daemon-lifecycle-api.js +259 -0
  48. package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
  49. package/dist/app-server/external-agent-import-api.d.ts +30 -0
  50. package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
  51. package/dist/app-server/external-agent-import-api.js +553 -0
  52. package/dist/app-server/external-agent-import-api.js.map +1 -0
  53. package/dist/app-server/host-control-api.d.ts +30 -0
  54. package/dist/app-server/host-control-api.d.ts.map +1 -0
  55. package/dist/app-server/host-control-api.js +343 -0
  56. package/dist/app-server/host-control-api.js.map +1 -0
  57. package/dist/app-server/in-process-client.d.ts +2 -2
  58. package/dist/app-server/in-process-client.d.ts.map +1 -1
  59. package/dist/app-server/in-process-client.js.map +1 -1
  60. package/dist/app-server/network-governance-api.d.ts +26 -0
  61. package/dist/app-server/network-governance-api.d.ts.map +1 -0
  62. package/dist/app-server/network-governance-api.js +476 -0
  63. package/dist/app-server/network-governance-api.js.map +1 -0
  64. package/dist/app-server/plugin-bundle-api.d.ts +17 -0
  65. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
  66. package/dist/app-server/plugin-bundle-api.js +219 -0
  67. package/dist/app-server/plugin-bundle-api.js.map +1 -0
  68. package/dist/app-server/policy-control-api.d.ts +14 -0
  69. package/dist/app-server/policy-control-api.d.ts.map +1 -0
  70. package/dist/app-server/policy-control-api.js +200 -0
  71. package/dist/app-server/policy-control-api.js.map +1 -0
  72. package/dist/app-server/protocol-modes-api.d.ts +22 -0
  73. package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
  74. package/dist/app-server/protocol-modes-api.js +124 -0
  75. package/dist/app-server/protocol-modes-api.js.map +1 -0
  76. package/dist/app-server/sandbox-proof-api.d.ts +21 -0
  77. package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
  78. package/dist/app-server/sandbox-proof-api.js +127 -0
  79. package/dist/app-server/sandbox-proof-api.js.map +1 -0
  80. package/dist/app-server/session-api.d.ts +93 -3
  81. package/dist/app-server/session-api.d.ts.map +1 -1
  82. package/dist/app-server/session-api.js +706 -18
  83. package/dist/app-server/session-api.js.map +1 -1
  84. package/dist/audit/logger.d.ts +1 -1
  85. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  86. package/dist/bootstrap/auth-setup.js +17 -2
  87. package/dist/bootstrap/auth-setup.js.map +1 -1
  88. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  89. package/dist/bootstrap/model-resolution-setup.js +19 -4
  90. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  91. package/dist/cli/args.d.ts +2 -2
  92. package/dist/cli/args.d.ts.map +1 -1
  93. package/dist/cli/args.js +2 -2
  94. package/dist/cli/args.js.map +1 -1
  95. package/dist/cli/commands/a2a.d.ts.map +1 -1
  96. package/dist/cli/commands/a2a.js +226 -14
  97. package/dist/cli/commands/a2a.js.map +1 -1
  98. package/dist/cli/commands/anthropic.d.ts +1 -1
  99. package/dist/cli/commands/anthropic.d.ts.map +1 -1
  100. package/dist/cli/commands/anthropic.js +3 -68
  101. package/dist/cli/commands/anthropic.js.map +1 -1
  102. package/dist/cli/commands/modes.js +1 -1
  103. package/dist/cli/commands/modes.js.map +1 -1
  104. package/dist/cli/help.d.ts.map +1 -1
  105. package/dist/cli/help.js +5 -7
  106. package/dist/cli/help.js.map +1 -1
  107. package/dist/cli/rpc-mode.d.ts +1 -1
  108. package/dist/cli/rpc-mode.js +1 -1
  109. package/dist/cli/rpc-mode.js.map +1 -1
  110. package/dist/cli/session.js +1 -1
  111. package/dist/cli/session.js.map +1 -1
  112. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  113. package/dist/cli-tui/commands/command-catalog.js +7 -12
  114. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  115. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
  116. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  117. package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
  118. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  119. package/dist/cli-tui/custom-editor.d.ts +1 -1
  120. package/dist/cli-tui/custom-editor.js +2 -2
  121. package/dist/cli-tui/custom-editor.js.map +1 -1
  122. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  123. package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
  124. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  125. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  126. package/dist/cli-tui/selectors/model-selector.js +0 -1
  127. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  128. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
  129. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  130. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  131. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
  132. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  133. package/dist/cli-tui/selectors/oauth-selector.js +3 -4
  134. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  135. package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
  136. package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
  137. package/dist/cli-tui/tui-renderer.js +2 -2
  138. package/dist/cli-tui/tui-renderer.js.map +1 -1
  139. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  140. package/dist/cli-tui/utils/footer-utils.js +1 -1
  141. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  142. package/dist/cli.js +15156 -14232
  143. package/dist/commands/prompts.d.ts +1 -1
  144. package/dist/commands/prompts.js +1 -1
  145. package/dist/commands/prompts.js.map +1 -1
  146. package/dist/config/constants.d.ts +2 -2
  147. package/dist/config/constants.d.ts.map +1 -1
  148. package/dist/config/constants.js +2 -2
  149. package/dist/config/constants.js.map +1 -1
  150. package/dist/config/index.d.ts +1 -1
  151. package/dist/config/index.js +1 -1
  152. package/dist/config/index.js.map +1 -1
  153. package/dist/config/toml-config.js +3 -3
  154. package/dist/config/toml-config.js.map +1 -1
  155. package/dist/db/client.d.ts +2 -2
  156. package/dist/db/client.js +2 -2
  157. package/dist/db/client.js.map +1 -1
  158. package/dist/db/migrate.d.ts +1 -1
  159. package/dist/db/migrate.js +1 -1
  160. package/dist/db/migrate.js.map +1 -1
  161. package/dist/db/schema.d.ts +2 -2
  162. package/dist/db/schema.js +1 -1
  163. package/dist/db/schema.js.map +1 -1
  164. package/dist/errors/index.d.ts +2 -2
  165. package/dist/errors/index.js +2 -2
  166. package/dist/errors/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -5
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +17 -14
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/config.d.ts +15 -2
  172. package/dist/mcp/config.d.ts.map +1 -1
  173. package/dist/mcp/config.js +50 -26
  174. package/dist/mcp/config.js.map +1 -1
  175. package/dist/mcp/fathom-cua.d.ts.map +1 -1
  176. package/dist/mcp/fathom-cua.js +10 -0
  177. package/dist/mcp/fathom-cua.js.map +1 -1
  178. package/dist/mcp/manager.d.ts.map +1 -1
  179. package/dist/mcp/manager.js +32 -1
  180. package/dist/mcp/manager.js.map +1 -1
  181. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  182. package/dist/mcp/tool-bridge.js +12 -3
  183. package/dist/mcp/tool-bridge.js.map +1 -1
  184. package/dist/mcp/tool-capabilities.d.ts +5 -0
  185. package/dist/mcp/tool-capabilities.d.ts.map +1 -0
  186. package/dist/mcp/tool-capabilities.js +271 -0
  187. package/dist/mcp/tool-capabilities.js.map +1 -0
  188. package/dist/mcp/types.d.ts +6 -1
  189. package/dist/mcp/types.d.ts.map +1 -1
  190. package/dist/mcp/types.js.map +1 -1
  191. package/dist/models/config-loader.d.ts +1 -1
  192. package/dist/models/factory-integration.d.ts +1 -1
  193. package/dist/models/factory-integration.js +1 -1
  194. package/dist/models/factory-integration.js.map +1 -1
  195. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +3 -3
  196. package/dist/node_modules/@evalops/contracts/dist/index.js +2 -2
  197. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  198. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
  199. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  200. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
  201. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  202. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  203. package/dist/node_modules/@evalops/tui/package.json +1 -1
  204. package/dist/oauth/connectors.d.ts +2 -2
  205. package/dist/oauth/connectors.d.ts.map +1 -1
  206. package/dist/oauth/connectors.js +3 -5
  207. package/dist/oauth/connectors.js.map +1 -1
  208. package/dist/oauth/github-copilot.d.ts +1 -1
  209. package/dist/oauth/github-copilot.js +1 -1
  210. package/dist/oauth/github-copilot.js.map +1 -1
  211. package/dist/oauth/index.d.ts +10 -8
  212. package/dist/oauth/index.d.ts.map +1 -1
  213. package/dist/oauth/index.js +54 -31
  214. package/dist/oauth/index.js.map +1 -1
  215. package/dist/oauth/openai.d.ts +1 -1
  216. package/dist/oauth/openai.js +2 -2
  217. package/dist/oauth/openai.js.map +1 -1
  218. package/dist/platform/a2a-completion-audit.d.ts +41 -0
  219. package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
  220. package/dist/platform/a2a-completion-audit.js +177 -0
  221. package/dist/platform/a2a-completion-audit.js.map +1 -0
  222. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  223. package/dist/platform/a2a-task-ledger.js +17 -0
  224. package/dist/platform/a2a-task-ledger.js.map +1 -1
  225. package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
  226. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
  227. package/dist/platform/a2a-telemetry-inspect.js +224 -0
  228. package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
  229. package/dist/platform/agent-registry-client.d.ts +8 -0
  230. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  231. package/dist/platform/agent-registry-client.js +9 -1
  232. package/dist/platform/agent-registry-client.js.map +1 -1
  233. package/dist/providers/api-keys.d.ts +2 -2
  234. package/dist/providers/api-keys.js +2 -2
  235. package/dist/providers/api-keys.js.map +1 -1
  236. package/dist/providers/auth.d.ts +3 -6
  237. package/dist/providers/auth.d.ts.map +1 -1
  238. package/dist/providers/auth.js +1 -40
  239. package/dist/providers/auth.js.map +1 -1
  240. package/dist/rpc/index.d.ts +2 -2
  241. package/dist/rpc/index.js +2 -2
  242. package/dist/rpc/index.js.map +1 -1
  243. package/dist/rpc/rpc-types.d.ts +1 -1
  244. package/dist/rpc/rpc-types.js +1 -1
  245. package/dist/rpc/rpc-types.js.map +1 -1
  246. package/dist/safety/nested-agent-guard.js +1 -1
  247. package/dist/safety/nested-agent-guard.js.map +1 -1
  248. package/dist/safety/policy.d.ts +2 -2
  249. package/dist/safety/policy.js +2 -2
  250. package/dist/safety/policy.js.map +1 -1
  251. package/dist/safety/validators/network-policy-validator.d.ts +8 -0
  252. package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
  253. package/dist/safety/validators/network-policy-validator.js +29 -4
  254. package/dist/safety/validators/network-policy-validator.js.map +1 -1
  255. package/dist/sandbox/local-sandbox.d.ts +1 -1
  256. package/dist/sandbox/local-sandbox.js +1 -1
  257. package/dist/sandbox/local-sandbox.js.map +1 -1
  258. package/dist/server/app-context.d.ts +2 -0
  259. package/dist/server/app-context.d.ts.map +1 -1
  260. package/dist/server/app-context.js.map +1 -1
  261. package/dist/server/handlers/attachments.d.ts.map +1 -1
  262. package/dist/server/handlers/attachments.js +1 -0
  263. package/dist/server/handlers/attachments.js.map +1 -1
  264. package/dist/server/handlers/models.d.ts.map +1 -1
  265. package/dist/server/handlers/models.js +3 -1
  266. package/dist/server/handlers/models.js.map +1 -1
  267. package/dist/server/handlers/session-attachments.d.ts.map +1 -1
  268. package/dist/server/handlers/session-attachments.js +2 -0
  269. package/dist/server/handlers/session-attachments.js.map +1 -1
  270. package/dist/server/handlers/sessions.js +1 -1
  271. package/dist/server/handlers/sessions.js.map +1 -1
  272. package/dist/server/handlers/status.d.ts +2 -0
  273. package/dist/server/handlers/status.d.ts.map +1 -1
  274. package/dist/server/handlers/status.js +3 -2
  275. package/dist/server/handlers/status.js.map +1 -1
  276. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  277. package/dist/server/headless-runtime-service.js +32 -3
  278. package/dist/server/headless-runtime-service.js.map +1 -1
  279. package/dist/server/hosted-session-manager.d.ts +2 -0
  280. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  281. package/dist/server/hosted-session-manager.js +9 -0
  282. package/dist/server/hosted-session-manager.js.map +1 -1
  283. package/dist/server/model-selection.d.ts.map +1 -1
  284. package/dist/server/model-selection.js +9 -1
  285. package/dist/server/model-selection.js.map +1 -1
  286. package/dist/server/rate-limiter.d.ts +1 -1
  287. package/dist/server/rate-limiter.js +1 -1
  288. package/dist/server/rate-limiter.js.map +1 -1
  289. package/dist/server/router.d.ts +2 -2
  290. package/dist/server/router.js.map +1 -1
  291. package/dist/server/session-serialization.d.ts +9 -9
  292. package/dist/server/session-serialization.js +15 -15
  293. package/dist/server/session-serialization.js.map +1 -1
  294. package/dist/session/manager.d.ts +5 -0
  295. package/dist/session/manager.d.ts.map +1 -1
  296. package/dist/session/manager.js +56 -8
  297. package/dist/session/manager.js.map +1 -1
  298. package/dist/session/session-catalog.d.ts +2 -0
  299. package/dist/session/session-catalog.d.ts.map +1 -1
  300. package/dist/session/session-catalog.js +6 -0
  301. package/dist/session/session-catalog.js.map +1 -1
  302. package/dist/session/session-context.d.ts +2 -0
  303. package/dist/session/session-context.d.ts.map +1 -1
  304. package/dist/session/session-context.js +15 -0
  305. package/dist/session/session-context.js.map +1 -1
  306. package/dist/session/types.d.ts +7 -0
  307. package/dist/session/types.d.ts.map +1 -1
  308. package/dist/session/types.js.map +1 -1
  309. package/dist/session/wire-format.generated.d.ts +1 -0
  310. package/dist/session/wire-format.generated.d.ts.map +1 -1
  311. package/dist/session/wire-format.generated.js +1 -0
  312. package/dist/session/wire-format.generated.js.map +1 -1
  313. package/dist/shared-memory/contract.d.ts +4 -4
  314. package/dist/shared-memory/contract.js +2 -2
  315. package/dist/shared-memory/contract.js.map +1 -1
  316. package/dist/telemetry/index.d.ts +2 -2
  317. package/dist/telemetry/index.d.ts.map +1 -1
  318. package/dist/telemetry/index.js +2 -2
  319. package/dist/telemetry/index.js.map +1 -1
  320. package/dist/telemetry/maestro-event-bus.d.ts +57 -0
  321. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  322. package/dist/telemetry/maestro-event-bus.js +59 -1
  323. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  324. package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
  325. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  326. package/dist/telemetry/maestro-event-catalog.js +24 -0
  327. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  328. package/dist/telemetry/mcp-beacon.d.ts +2 -0
  329. package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
  330. package/dist/telemetry/mcp-beacon.js +15 -0
  331. package/dist/telemetry/mcp-beacon.js.map +1 -1
  332. package/dist/telemetry/metrics.d.ts +62 -0
  333. package/dist/telemetry/metrics.d.ts.map +1 -1
  334. package/dist/telemetry/metrics.js +84 -0
  335. package/dist/telemetry/metrics.js.map +1 -1
  336. package/dist/telemetry.d.ts +44 -0
  337. package/dist/telemetry.d.ts.map +1 -1
  338. package/dist/telemetry.js +84 -2
  339. package/dist/telemetry.js.map +1 -1
  340. package/dist/theme/theme-loader.js +2 -2
  341. package/dist/theme/theme-loader.js.map +1 -1
  342. package/dist/theme/theme-schema.json +2 -2
  343. package/dist/theme/theme.d.ts +1 -1
  344. package/dist/theme/theme.js.map +1 -1
  345. package/dist/tools/background/task-types.d.ts +1 -1
  346. package/dist/tools/extract-document.d.ts +1 -0
  347. package/dist/tools/extract-document.d.ts.map +1 -1
  348. package/dist/tools/extract-document.js +2 -1
  349. package/dist/tools/extract-document.js.map +1 -1
  350. package/dist/tools/index.d.ts +55 -55
  351. package/dist/tools/index.js +1 -1
  352. package/dist/tools/index.js.map +1 -1
  353. package/dist/tools/tool-dsl.d.ts +1 -1
  354. package/dist/tools/tool-dsl.js +1 -1
  355. package/dist/tools/tool-dsl.js.map +1 -1
  356. package/dist/utils/document-extractor.d.ts +1 -0
  357. package/dist/utils/document-extractor.d.ts.map +1 -1
  358. package/dist/utils/document-extractor.js +320 -40
  359. package/dist/utils/document-extractor.js.map +1 -1
  360. package/dist/utils/logger.d.ts +1 -1
  361. package/dist/utils/logger.js +1 -1
  362. package/dist/utils/logger.js.map +1 -1
  363. package/dist/version.json +2 -2
  364. package/dist/web-server.d.ts +1 -1
  365. package/dist/web-server.d.ts.map +1 -1
  366. package/dist/web-server.js +12 -8
  367. package/dist/web-server.js.map +1 -1
  368. package/package.json +4 -2
  369. package/dist/oauth/anthropic.d.ts +0 -17
  370. package/dist/oauth/anthropic.d.ts.map +0 -1
  371. package/dist/oauth/anthropic.js +0 -81
  372. package/dist/oauth/anthropic.js.map +0 -1
  373. package/dist/providers/anthropic-auth.d.ts +0 -75
  374. package/dist/providers/anthropic-auth.d.ts.map +0 -1
  375. package/dist/providers/anthropic-auth.js +0 -221
  376. package/dist/providers/anthropic-auth.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Factory Integration
3
- * Reads and converts Factory config files (~/.factory/) into Composer model configuration.
3
+ * Reads and converts Factory config files (~/.factory/) into Maestro model configuration.
4
4
  */
5
5
  import { existsSync } from "node:fs";
6
6
  import { join } from "node:path";
@@ -1 +1 @@
1
- {"version":3,"file":"factory-integration.js","sourceRoot":"","sources":["../../src/models/factory-integration.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Factory Integration\n * Reads and converts Factory config files (~/.factory/) into Composer model configuration.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getStoredCredentials } from \"../agent/keys.js\";\nimport type { Api } from \"../agent/types.js\";\nimport { parseJsonOr, safeJsonParse } from \"../utils/json.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport {\n\ttype CustomModel,\n\ttype CustomModelConfig,\n\ttype CustomProvider,\n\tapplyProviderLoader,\n\treadJsonFile,\n} from \"./config-loader.js\";\nimport { normalizeBaseUrl } from \"./url-normalize.js\";\n\nconst logger = createLogger(\"models:registry\");\n\nexport const FACTORY_HOME =\n\tresolveEnvPath(process.env.FACTORY_HOME) ?? join(getHomeDir(), \".factory\");\nexport const FACTORY_CONFIG_PATH = join(FACTORY_HOME, \"config.json\");\nexport const FACTORY_SETTINGS_PATH = join(FACTORY_HOME, \"settings.json\");\nexport const FACTORY_KEYS_PATH = join(FACTORY_HOME, \"keys.json\");\n\nexport let factoryDataCache:\n\t| { config: CustomModelConfig; modelProviderMap: Map<string, string> }\n\t| null\n\t| undefined;\n\nexport function clearFactoryCache(): void {\n\tfactoryDataCache = undefined;\n}\n\ninterface FactoryModelEntry {\n\tmodel: string;\n\tmodel_display_name?: string;\n\tbase_url?: string;\n\tapi_key?: string;\n\tprovider?: string;\n\tmax_tokens?: number;\n}\n\ninterface FactoryConfigFile {\n\tcustom_models?: FactoryModelEntry[];\n\tapi_keys?: Record<string, string>;\n}\n\nconst FACTORY_API_MAP: Record<string, Api> = {\n\tanthropic: \"anthropic-messages\",\n\topenai: \"openai-responses\",\n\tgoogle: \"google-generative-ai\",\n};\n\nfunction sanitizeId(value: string): string {\n\treturn (\n\t\tvalue\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t\t.replace(/^-+/, \"\")\n\t\t\t.replace(/-+$/, \"\") || \"provider\"\n\t);\n}\n\nfunction capitalize(value: string): string {\n\treturn value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction deriveProviderApi(provider?: string): Api {\n\tif (provider && FACTORY_API_MAP[provider as keyof typeof FACTORY_API_MAP]) {\n\t\treturn FACTORY_API_MAP[provider as keyof typeof FACTORY_API_MAP]!;\n\t}\n\treturn \"openai-responses\";\n}\n\nfunction deriveProviderName(provider?: string, baseUrl?: string): string {\n\tconst base = provider ? capitalize(provider) : \"Factory\";\n\tif (!baseUrl) {\n\t\treturn `Factory ${base}`;\n\t}\n\ttry {\n\t\tconst host = new URL(baseUrl).hostname;\n\t\treturn `Factory ${base} (${host})`;\n\t} catch {\n\t\treturn `Factory ${base}`;\n\t}\n}\n\nexport function buildFactoryData(): {\n\tconfig: CustomModelConfig;\n\tmodelProviderMap: Map<string, string>;\n} | null {\n\tif (!existsSync(FACTORY_CONFIG_PATH)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst raw = readJsonFile(FACTORY_CONFIG_PATH);\n\t\tif (!raw) {\n\t\t\treturn null;\n\t\t}\n\t\tconst result = safeJsonParse<FactoryConfigFile>(raw, \".factory.json\");\n\t\tif (!result.success) {\n\t\t\tlogger.warn(\"Failed to parse .factory.json\", {\n\t\t\t\terror: \"error\" in result ? result.error.message : \"Unknown error\",\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t\tconst parsed = result.data;\n\t\tif (!parsed.custom_models?.length) {\n\t\t\treturn null;\n\t\t}\n\t\tconst factoryKeys = parsed.api_keys ?? {};\n\t\tconst providers: CustomProvider[] = [];\n\t\tconst modelProviderMap = new Map<string, string>();\n\t\tconst providerKeyMap = new Map<string, CustomProvider>();\n\t\tconst usedIds = new Set<string>();\n\n\t\tfor (const entry of parsed.custom_models) {\n\t\t\tif (!entry?.model || !entry.base_url) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Normalize provider base URLs using shared function\n\t\t\tconst api = deriveProviderApi(entry.provider);\n\t\t\tconst normalizedBaseUrl = normalizeBaseUrl(\n\t\t\t\tentry.base_url,\n\t\t\t\tentry.provider ?? \"factory\",\n\t\t\t\tapi,\n\t\t\t);\n\n\t\t\tconst inlineKey = entry.api_key;\n\t\t\tconst storedKey =\n\t\t\t\tfactoryKeys[entry.provider ?? \"factory\"] ??\n\t\t\t\tgetStoredCredentials(entry.provider ?? \"factory\").apiKey;\n\t\t\tconst uniqueKey = `${entry.provider ?? \"factory\"}|${normalizedBaseUrl}|${inlineKey ?? storedKey ?? \"\"}`;\n\t\t\tlet provider = providerKeyMap.get(uniqueKey);\n\t\t\tif (!provider) {\n\t\t\t\tconst sanitized = sanitizeId(entry.provider ?? \"factory\");\n\t\t\t\tlet id = `factory-${sanitized}`;\n\t\t\t\tlet counter = 2;\n\t\t\t\twhile (usedIds.has(id)) {\n\t\t\t\t\tid = `factory-${sanitized}-${counter++}`;\n\t\t\t\t}\n\t\t\t\tusedIds.add(id);\n\t\t\t\tprovider = {\n\t\t\t\t\tid,\n\t\t\t\t\tname: deriveProviderName(entry.provider, normalizedBaseUrl),\n\t\t\t\t\tapi: deriveProviderApi(entry.provider),\n\t\t\t\t\tbaseUrl: normalizedBaseUrl,\n\t\t\t\t\tapiKey: inlineKey ?? storedKey,\n\t\t\t\t\tmodels: [],\n\t\t\t\t};\n\t\t\t\tproviderKeyMap.set(uniqueKey, provider);\n\t\t\t\tproviders.push(provider);\n\t\t\t}\n\t\t\tconst maxTokens =\n\t\t\t\ttypeof entry.max_tokens === \"number\" && entry.max_tokens > 0\n\t\t\t\t\t? entry.max_tokens\n\t\t\t\t\t: 8192;\n\t\t\tconst model: CustomModel = {\n\t\t\t\tid: entry.model,\n\t\t\t\tname: entry.model_display_name || entry.model,\n\t\t\t\tbaseUrl: normalizedBaseUrl,\n\t\t\t\tcontextWindow: maxTokens,\n\t\t\t\tmaxTokens,\n\t\t\t};\n\t\t\tprovider.models ??= [];\n\t\t\tprovider.models.push(model);\n\t\t\tmodelProviderMap.set(entry.model, provider.id);\n\t\t}\n\n\t\tif (providers.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Apply provider-specific loaders to Factory providers too\n\t\tconst enhancedProviders = providers\n\t\t\t.map((provider) =>\n\t\t\t\tapplyProviderLoader(provider, { includeDisabled: true }),\n\t\t\t)\n\t\t\t.filter((provider): provider is CustomProvider => Boolean(provider));\n\n\t\treturn {\n\t\t\tconfig: { providers: enhancedProviders },\n\t\t\tmodelProviderMap,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function ensureFactoryData(): {\n\tconfig: CustomModelConfig;\n\tmodelProviderMap: Map<string, string>;\n} | null {\n\tif (factoryDataCache === undefined) {\n\t\tfactoryDataCache = buildFactoryData();\n\t}\n\treturn factoryDataCache ?? null;\n}\n\nexport function stripJsonComments(input: string): string {\n\tlet insideString = false;\n\tlet previousChar = \"\";\n\tlet result = \"\";\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst char = input[i]!;\n\t\tconst next = input[i + 1];\n\t\tif (!insideString && char === \"/\" && next === \"/\") {\n\t\t\twhile (i < input.length && input[i] !== \"\\n\") {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tresult += \"\\n\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (!insideString && char === \"/\" && next === \"*\") {\n\t\t\ti += 2;\n\t\t\twhile (i < input.length && !(input[i] === \"*\" && input[i + 1] === \"/\")) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && previousChar !== \"\\\\\") {\n\t\t\tinsideString = !insideString;\n\t\t}\n\t\tresult += char;\n\t\tpreviousChar = char;\n\t}\n\treturn result;\n}\n\nfunction readFactorySettingsModel(): string | null {\n\tconst raw = existsSync(FACTORY_SETTINGS_PATH)\n\t\t? readJsonFile(FACTORY_SETTINGS_PATH)\n\t\t: null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst sanitized = stripJsonComments(raw);\n\t\tconst parsed = parseJsonOr<{ model?: string }>(sanitized, {});\n\t\tif (parsed && typeof parsed.model === \"string\" && parsed.model.trim()) {\n\t\t\treturn parsed.model.trim();\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getFactoryDefaultModelSelection(): {\n\tprovider: string;\n\tmodelId: string;\n} | null {\n\tconst selection = readFactorySettingsModel();\n\tif (!selection) {\n\t\treturn null;\n\t}\n\tconst factoryData = ensureFactoryData();\n\tif (!factoryData) {\n\t\treturn null;\n\t}\n\tconst provider = factoryData.modelProviderMap.get(selection);\n\tif (!provider) {\n\t\treturn null;\n\t}\n\treturn { provider, modelId: selection };\n}\n\nexport function readFactoryConfigSnapshot(): CustomModelConfig | null {\n\tconst data = buildFactoryData();\n\tif (data) {\n\t\tfactoryDataCache = data;\n\t}\n\treturn data?.config ?? null;\n}\n\nexport function getFactoryConfigPath(): string {\n\treturn FACTORY_CONFIG_PATH;\n}\n\nexport function getFactorySettingsPath(): string {\n\treturn FACTORY_SETTINGS_PATH;\n}\n"]}
1
+ {"version":3,"file":"factory-integration.js","sourceRoot":"","sources":["../../src/models/factory-integration.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Factory Integration\n * Reads and converts Factory config files (~/.factory/) into Maestro model configuration.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getStoredCredentials } from \"../agent/keys.js\";\nimport type { Api } from \"../agent/types.js\";\nimport { parseJsonOr, safeJsonParse } from \"../utils/json.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport {\n\ttype CustomModel,\n\ttype CustomModelConfig,\n\ttype CustomProvider,\n\tapplyProviderLoader,\n\treadJsonFile,\n} from \"./config-loader.js\";\nimport { normalizeBaseUrl } from \"./url-normalize.js\";\n\nconst logger = createLogger(\"models:registry\");\n\nexport const FACTORY_HOME =\n\tresolveEnvPath(process.env.FACTORY_HOME) ?? join(getHomeDir(), \".factory\");\nexport const FACTORY_CONFIG_PATH = join(FACTORY_HOME, \"config.json\");\nexport const FACTORY_SETTINGS_PATH = join(FACTORY_HOME, \"settings.json\");\nexport const FACTORY_KEYS_PATH = join(FACTORY_HOME, \"keys.json\");\n\nexport let factoryDataCache:\n\t| { config: CustomModelConfig; modelProviderMap: Map<string, string> }\n\t| null\n\t| undefined;\n\nexport function clearFactoryCache(): void {\n\tfactoryDataCache = undefined;\n}\n\ninterface FactoryModelEntry {\n\tmodel: string;\n\tmodel_display_name?: string;\n\tbase_url?: string;\n\tapi_key?: string;\n\tprovider?: string;\n\tmax_tokens?: number;\n}\n\ninterface FactoryConfigFile {\n\tcustom_models?: FactoryModelEntry[];\n\tapi_keys?: Record<string, string>;\n}\n\nconst FACTORY_API_MAP: Record<string, Api> = {\n\tanthropic: \"anthropic-messages\",\n\topenai: \"openai-responses\",\n\tgoogle: \"google-generative-ai\",\n};\n\nfunction sanitizeId(value: string): string {\n\treturn (\n\t\tvalue\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t\t.replace(/^-+/, \"\")\n\t\t\t.replace(/-+$/, \"\") || \"provider\"\n\t);\n}\n\nfunction capitalize(value: string): string {\n\treturn value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction deriveProviderApi(provider?: string): Api {\n\tif (provider && FACTORY_API_MAP[provider as keyof typeof FACTORY_API_MAP]) {\n\t\treturn FACTORY_API_MAP[provider as keyof typeof FACTORY_API_MAP]!;\n\t}\n\treturn \"openai-responses\";\n}\n\nfunction deriveProviderName(provider?: string, baseUrl?: string): string {\n\tconst base = provider ? capitalize(provider) : \"Factory\";\n\tif (!baseUrl) {\n\t\treturn `Factory ${base}`;\n\t}\n\ttry {\n\t\tconst host = new URL(baseUrl).hostname;\n\t\treturn `Factory ${base} (${host})`;\n\t} catch {\n\t\treturn `Factory ${base}`;\n\t}\n}\n\nexport function buildFactoryData(): {\n\tconfig: CustomModelConfig;\n\tmodelProviderMap: Map<string, string>;\n} | null {\n\tif (!existsSync(FACTORY_CONFIG_PATH)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst raw = readJsonFile(FACTORY_CONFIG_PATH);\n\t\tif (!raw) {\n\t\t\treturn null;\n\t\t}\n\t\tconst result = safeJsonParse<FactoryConfigFile>(raw, \".factory.json\");\n\t\tif (!result.success) {\n\t\t\tlogger.warn(\"Failed to parse .factory.json\", {\n\t\t\t\terror: \"error\" in result ? result.error.message : \"Unknown error\",\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t\tconst parsed = result.data;\n\t\tif (!parsed.custom_models?.length) {\n\t\t\treturn null;\n\t\t}\n\t\tconst factoryKeys = parsed.api_keys ?? {};\n\t\tconst providers: CustomProvider[] = [];\n\t\tconst modelProviderMap = new Map<string, string>();\n\t\tconst providerKeyMap = new Map<string, CustomProvider>();\n\t\tconst usedIds = new Set<string>();\n\n\t\tfor (const entry of parsed.custom_models) {\n\t\t\tif (!entry?.model || !entry.base_url) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Normalize provider base URLs using shared function\n\t\t\tconst api = deriveProviderApi(entry.provider);\n\t\t\tconst normalizedBaseUrl = normalizeBaseUrl(\n\t\t\t\tentry.base_url,\n\t\t\t\tentry.provider ?? \"factory\",\n\t\t\t\tapi,\n\t\t\t);\n\n\t\t\tconst inlineKey = entry.api_key;\n\t\t\tconst storedKey =\n\t\t\t\tfactoryKeys[entry.provider ?? \"factory\"] ??\n\t\t\t\tgetStoredCredentials(entry.provider ?? \"factory\").apiKey;\n\t\t\tconst uniqueKey = `${entry.provider ?? \"factory\"}|${normalizedBaseUrl}|${inlineKey ?? storedKey ?? \"\"}`;\n\t\t\tlet provider = providerKeyMap.get(uniqueKey);\n\t\t\tif (!provider) {\n\t\t\t\tconst sanitized = sanitizeId(entry.provider ?? \"factory\");\n\t\t\t\tlet id = `factory-${sanitized}`;\n\t\t\t\tlet counter = 2;\n\t\t\t\twhile (usedIds.has(id)) {\n\t\t\t\t\tid = `factory-${sanitized}-${counter++}`;\n\t\t\t\t}\n\t\t\t\tusedIds.add(id);\n\t\t\t\tprovider = {\n\t\t\t\t\tid,\n\t\t\t\t\tname: deriveProviderName(entry.provider, normalizedBaseUrl),\n\t\t\t\t\tapi: deriveProviderApi(entry.provider),\n\t\t\t\t\tbaseUrl: normalizedBaseUrl,\n\t\t\t\t\tapiKey: inlineKey ?? storedKey,\n\t\t\t\t\tmodels: [],\n\t\t\t\t};\n\t\t\t\tproviderKeyMap.set(uniqueKey, provider);\n\t\t\t\tproviders.push(provider);\n\t\t\t}\n\t\t\tconst maxTokens =\n\t\t\t\ttypeof entry.max_tokens === \"number\" && entry.max_tokens > 0\n\t\t\t\t\t? entry.max_tokens\n\t\t\t\t\t: 8192;\n\t\t\tconst model: CustomModel = {\n\t\t\t\tid: entry.model,\n\t\t\t\tname: entry.model_display_name || entry.model,\n\t\t\t\tbaseUrl: normalizedBaseUrl,\n\t\t\t\tcontextWindow: maxTokens,\n\t\t\t\tmaxTokens,\n\t\t\t};\n\t\t\tprovider.models ??= [];\n\t\t\tprovider.models.push(model);\n\t\t\tmodelProviderMap.set(entry.model, provider.id);\n\t\t}\n\n\t\tif (providers.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Apply provider-specific loaders to Factory providers too\n\t\tconst enhancedProviders = providers\n\t\t\t.map((provider) =>\n\t\t\t\tapplyProviderLoader(provider, { includeDisabled: true }),\n\t\t\t)\n\t\t\t.filter((provider): provider is CustomProvider => Boolean(provider));\n\n\t\treturn {\n\t\t\tconfig: { providers: enhancedProviders },\n\t\t\tmodelProviderMap,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function ensureFactoryData(): {\n\tconfig: CustomModelConfig;\n\tmodelProviderMap: Map<string, string>;\n} | null {\n\tif (factoryDataCache === undefined) {\n\t\tfactoryDataCache = buildFactoryData();\n\t}\n\treturn factoryDataCache ?? null;\n}\n\nexport function stripJsonComments(input: string): string {\n\tlet insideString = false;\n\tlet previousChar = \"\";\n\tlet result = \"\";\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst char = input[i]!;\n\t\tconst next = input[i + 1];\n\t\tif (!insideString && char === \"/\" && next === \"/\") {\n\t\t\twhile (i < input.length && input[i] !== \"\\n\") {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tresult += \"\\n\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (!insideString && char === \"/\" && next === \"*\") {\n\t\t\ti += 2;\n\t\t\twhile (i < input.length && !(input[i] === \"*\" && input[i + 1] === \"/\")) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && previousChar !== \"\\\\\") {\n\t\t\tinsideString = !insideString;\n\t\t}\n\t\tresult += char;\n\t\tpreviousChar = char;\n\t}\n\treturn result;\n}\n\nfunction readFactorySettingsModel(): string | null {\n\tconst raw = existsSync(FACTORY_SETTINGS_PATH)\n\t\t? readJsonFile(FACTORY_SETTINGS_PATH)\n\t\t: null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst sanitized = stripJsonComments(raw);\n\t\tconst parsed = parseJsonOr<{ model?: string }>(sanitized, {});\n\t\tif (parsed && typeof parsed.model === \"string\" && parsed.model.trim()) {\n\t\t\treturn parsed.model.trim();\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getFactoryDefaultModelSelection(): {\n\tprovider: string;\n\tmodelId: string;\n} | null {\n\tconst selection = readFactorySettingsModel();\n\tif (!selection) {\n\t\treturn null;\n\t}\n\tconst factoryData = ensureFactoryData();\n\tif (!factoryData) {\n\t\treturn null;\n\t}\n\tconst provider = factoryData.modelProviderMap.get(selection);\n\tif (!provider) {\n\t\treturn null;\n\t}\n\treturn { provider, modelId: selection };\n}\n\nexport function readFactoryConfigSnapshot(): CustomModelConfig | null {\n\tconst data = buildFactoryData();\n\tif (data) {\n\t\tfactoryDataCache = data;\n\t}\n\treturn data?.config ?? null;\n}\n\nexport function getFactoryConfigPath(): string {\n\treturn FACTORY_CONFIG_PATH;\n}\n\nexport function getFactorySettingsPath(): string {\n\treturn FACTORY_SETTINGS_PATH;\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * @fileoverview @evalops/contracts - Shared TypeScript Definitions
3
3
  *
4
4
  * This package provides the TypeScript type definitions that form the contract
5
- * between Composer's frontend (Web UI) and backend (API server). All shared
5
+ * between Maestro's frontend (Web UI) and backend (API server). All shared
6
6
  * types, interfaces, and enums are defined here to ensure type safety across
7
7
  * the client-server boundary.
8
8
  *
@@ -28,7 +28,7 @@
28
28
  * // Type-safe message handling
29
29
  * const message: ComposerMessage = {
30
30
  * role: "user",
31
- * content: "Hello, Composer!",
31
+ * content: "Hello, Maestro!",
32
32
  * timestamp: new Date().toISOString(),
33
33
  * };
34
34
  *
@@ -154,7 +154,7 @@ export interface ComposerAttachment {
154
154
  preview?: string;
155
155
  }
156
156
  /**
157
- * A message in the Composer conversation.
157
+ * A message in the Maestro conversation.
158
158
  *
159
159
  * Messages can contain text content, tool calls, thinking traces,
160
160
  * and usage statistics. This is the primary data structure for
@@ -2,7 +2,7 @@
2
2
  * @fileoverview @evalops/contracts - Shared TypeScript Definitions
3
3
  *
4
4
  * This package provides the TypeScript type definitions that form the contract
5
- * between Composer's frontend (Web UI) and backend (API server). All shared
5
+ * between Maestro's frontend (Web UI) and backend (API server). All shared
6
6
  * types, interfaces, and enums are defined here to ensure type safety across
7
7
  * the client-server boundary.
8
8
  *
@@ -28,7 +28,7 @@
28
28
  * // Type-safe message handling
29
29
  * const message: ComposerMessage = {
30
30
  * role: "user",
31
- * content: "Hello, Composer!",
31
+ * content: "Hello, Maestro!",
32
32
  * timestamp: new Date().toISOString(),
33
33
  * };
34
34
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAksC9B,+BAA+B;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["/**\n * @fileoverview @evalops/contracts - Shared TypeScript Definitions\n *\n * This package provides the TypeScript type definitions that form the contract\n * between Composer's frontend (Web UI) and backend (API server). All shared\n * types, interfaces, and enums are defined here to ensure type safety across\n * the client-server boundary.\n *\n * ## Key Types\n *\n * | Type | Description |\n * |------|-------------|\n * | `ComposerMessage` | Chat message with role, content, tools, and usage |\n * | `ComposerSession` | Session with metadata and message history |\n * | `ComposerChatRequest` | Request payload for the chat API |\n * | `ComposerUsage` | Token usage and cost tracking |\n * | `ComposerToolCall` | Tool invocation with status and result |\n *\n * ## Usage\n *\n * ```typescript\n * import type {\n * ComposerMessage,\n * ComposerSession,\n * ComposerChatRequest\n * } from \"@evalops/contracts\";\n *\n * // Type-safe message handling\n * const message: ComposerMessage = {\n * role: \"user\",\n * content: \"Hello, Composer!\",\n * timestamp: new Date().toISOString(),\n * };\n *\n * // Type-safe API request\n * const request: ComposerChatRequest = {\n * messages: [message],\n * model: \"claude-sonnet-4-5\",\n * thinkingLevel: \"medium\",\n * };\n * ```\n *\n * @module @evalops/contracts\n */\n\nexport * from \"./headless-protocol-generated.js\";\nexport * from \"./headless-protocol-schemas.generated.js\";\nexport * as headlessProto from \"./proto/maestro/v1/headless_pb.js\";\nexport * from \"./advisor-effort.js\";\nexport * from \"./artifacts.js\";\nexport * from \"./delegation-prompt.js\";\nexport * from \"./guarded-files-settings.js\";\nexport * from \"./key-value-tokens.js\";\nexport * from \"./mcp-settings.js\";\nexport * from \"./memory.js\";\nexport * from \"./memory-utils.js\";\nexport * from \"./maestro-app-server.js\";\nexport * from \"./onboarding-utils.js\";\nexport * from \"./proto/maestro/v1/headless_pb.js\";\nexport * from \"./runtime-constraints.js\";\nexport * from \"./runtime-app-server.js\";\nexport * from \"./runtime-server-request.js\";\nexport * from \"./scenario.js\";\n\n/**\n * Role of a message in the conversation.\n *\n * - `user` - Messages from the human user\n * - `assistant` - Messages from the AI assistant\n * - `system` - System prompts and instructions\n * - `tool` - Tool execution results\n */\nexport type ComposerRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\n/**\n * Content blocks used for rich message payloads.\n */\nexport interface ComposerTextContent {\n\ttype: \"text\";\n\ttext: string;\n\ttextSignature?: string;\n}\n\nexport interface ComposerImageContent {\n\ttype: \"image\";\n\tdata: string;\n\tmimeType: string;\n}\n\nexport interface ComposerThinkingContent {\n\ttype: \"thinking\";\n\tthinking: string;\n\tthinkingSignature?: string;\n}\n\nexport interface ComposerToolCallContent {\n\ttype: \"toolCall\";\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n\tthoughtSignature?: string;\n}\n\nexport type ComposerContentBlock =\n\t| ComposerTextContent\n\t| ComposerImageContent\n\t| ComposerThinkingContent\n\t| ComposerToolCallContent;\n\n/**\n * Extended thinking/reasoning level for supported models.\n *\n * Higher levels produce more detailed reasoning at the cost of latency:\n * - `off` - No extended thinking\n * - `minimal` - Brief reasoning hints\n * - `low` - Light reasoning\n * - `medium` - Moderate reasoning depth\n * - `high` - Thorough step-by-step reasoning\n */\nexport type ComposerThinkingLevel =\n\t| \"off\"\n\t| \"minimal\"\n\t| \"low\"\n\t| \"medium\"\n\t| \"high\";\n\n/**\n * Represents a tool invocation within a message.\n *\n * Tools are actions the agent can take like reading files, executing commands,\n * or searching the web. Each tool call tracks its execution lifecycle.\n */\nexport interface ComposerToolCall {\n\t/** Name of the tool being invoked (e.g., \"read\", \"bash\", \"search\") */\n\tname: string;\n\t/** Current execution status of the tool call */\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"error\";\n\t/** Arguments passed to the tool */\n\targs?: Record<string, unknown>;\n\t/** Result returned by the tool (if completed) */\n\tresult?: unknown;\n\t/** Unique identifier for this tool call (for matching results) */\n\ttoolCallId?: string;\n}\n\n/**\n * File attachment included in a user message.\n *\n * Attachments can be images (for vision-capable models) or documents\n * (typically accompanied by extracted text for model consumption).\n *\n * `content` is base64-encoded raw bytes. Servers may omit `content` in some\n * read APIs for size reasons; when omitted, `contentOmitted` is set to true.\n */\nexport interface ComposerAttachment {\n\t/** Unique identifier for this attachment */\n\tid: string;\n\t/** Attachment type */\n\ttype: \"image\" | \"document\";\n\t/** Original filename */\n\tfileName: string;\n\t/** MIME type */\n\tmimeType: string;\n\t/** Size in bytes */\n\tsize: number;\n\t/** Base64-encoded file content (may be omitted) */\n\tcontent?: string;\n\t/** True when `content` was intentionally omitted */\n\tcontentOmitted?: boolean;\n\t/** Extracted text content (for documents) */\n\textractedText?: string;\n\t/** Preview image (typically base64, small) */\n\tpreview?: string;\n}\n\n/**\n * A message in the Composer conversation.\n *\n * Messages can contain text content, tool calls, thinking traces,\n * and usage statistics. This is the primary data structure for\n * conversation history.\n */\nexport interface ComposerMessage {\n\t/** Role of the message sender */\n\trole: ComposerRole;\n\t/** Text content of the message */\n\tcontent: string | ComposerContentBlock[];\n\t/** Optional file attachments (for user messages) */\n\tattachments?: ComposerAttachment[];\n\t/** ISO 8601 timestamp when the message was created */\n\ttimestamp?: string;\n\t/** Extended thinking/reasoning trace (for supported models) */\n\tthinking?: string;\n\t/** Tool calls made in this message (for assistant messages) */\n\ttools?: ComposerToolCall[];\n\t/** Name of the tool (for tool result messages) */\n\ttoolName?: string;\n\t/** Whether this message represents an error */\n\tisError?: boolean;\n\t/** Token usage and cost for this message */\n\tusage?: ComposerUsage;\n\t/** Original provider for assistant messages (for cross-provider resume) */\n\tprovider?: string;\n\t/** Original API for assistant messages (for cross-provider resume) */\n\tapi?: string;\n\t/** Original model ID for assistant messages (for cross-provider resume) */\n\tmodel?: string;\n}\n\n/**\n * Cost breakdown for token usage.\n *\n * Costs are typically in USD, calculated based on the model's pricing.\n */\nexport interface ComposerUsageCost {\n\t/** Cost for input tokens */\n\tinput: number;\n\t/** Cost for output tokens */\n\toutput: number;\n\t/** Cost savings from cache reads (if applicable) */\n\tcacheRead?: number;\n\t/** Cost for cache writes (if applicable) */\n\tcacheWrite?: number;\n\t/** Total cost for this message */\n\ttotal?: number;\n}\n\n/**\n * Token usage statistics for a message or session.\n *\n * Tracks input/output tokens and cache utilization for cost monitoring.\n */\nexport interface ComposerUsage {\n\t/** Number of input tokens consumed */\n\tinput: number;\n\t/** Number of output tokens generated */\n\toutput: number;\n\t/** Tokens served from cache (reduces cost) */\n\tcacheRead?: number;\n\t/** Tokens written to cache */\n\tcacheWrite?: number;\n\t/** Calculated cost breakdown */\n\tcost?: ComposerUsageCost;\n}\n\n/**\n * Model capability metadata exposed by the API.\n */\nexport interface ComposerModelCapabilities {\n\tstreaming?: boolean;\n\ttools?: boolean;\n\tvision?: boolean;\n\treasoning?: boolean;\n}\n\n/**\n * Model metadata returned by `/api/models` and `/api/model`.\n */\nexport interface ComposerModel {\n\tid: string;\n\tprovider: string;\n\tname: string;\n\tapi?: string;\n\tcontextWindow?: number;\n\tmaxOutputTokens?: number;\n\tmaxTokens?: number;\n\treasoning?: boolean;\n\tcost?: ComposerUsageCost;\n\tcapabilities?: ComposerModelCapabilities;\n}\n\n/**\n * Response payload for `/api/models`.\n */\nexport interface ComposerModelListResponse {\n\tmodels: ComposerModel[];\n}\n\n/**\n * Argument definition for a custom command.\n */\nexport interface ComposerCommandArg {\n\tname: string;\n\trequired?: boolean;\n}\n\n/**\n * Custom command definition (safe for client consumption).\n */\nexport interface ComposerCommand {\n\tname: string;\n\tdescription?: string;\n\tprompt: string;\n\targs?: ComposerCommandArg[];\n}\n\n/**\n * Response payload for `/api/commands`.\n */\nexport interface ComposerCommandListResponse {\n\tcommands: ComposerCommand[];\n}\n\n/**\n * Command favorites/recents preferences.\n */\nexport interface ComposerCommandPrefs {\n\tfavorites: string[];\n\trecents: string[];\n}\n\n/**\n * Update payload for command preferences.\n */\nexport interface ComposerCommandPrefsUpdate {\n\tfavorites?: string[];\n\trecents?: string[];\n}\n\n/**\n * Response payload for command preference updates.\n */\nexport interface ComposerCommandPrefsWriteResponse {\n\tok: boolean;\n}\n\n/**\n * Request payload for `/api/config`.\n */\nexport interface ComposerConfigWriteRequest {\n\tconfig: Record<string, unknown>;\n}\n\n/**\n * Response payload for `/api/config` GET.\n */\nexport interface ComposerConfigResponse {\n\tconfig: Record<string, unknown>;\n\tconfigPath: string;\n}\n\n/**\n * Response payload for `/api/config` POST.\n */\nexport interface ComposerConfigWriteResponse {\n\tsuccess: boolean;\n}\n\n/**\n * Response payload for `/api/files`.\n */\nexport interface ComposerFilesResponse {\n\tfiles: string[];\n}\n\n/**\n * Request payload for the chat API endpoint.\n *\n * Sent to `POST /api/chat` to initiate or continue a conversation.\n */\nexport interface ComposerChatRequest {\n\t/** Model ID to use (e.g., \"claude-sonnet-4-5-20250929\") */\n\tmodel?: string;\n\t/** Conversation history including the current user message */\n\tmessages: ComposerMessage[];\n\t/** Extended thinking level for supported models */\n\tthinkingLevel?: ComposerThinkingLevel;\n\t/** Session ID to resume (optional - creates new session if omitted) */\n\tsessionId?: string;\n\t/** Whether to stream the response via SSE (default: true) */\n\tstream?: boolean;\n}\n\n/**\n * Request payload for prompt suggestion generation.\n *\n * Sent to `POST /api/prompt-suggestion` to generate a likely next user prompt\n * from the current conversation state.\n */\nexport interface ComposerPromptSuggestionRequest {\n\t/** Optional model preference used to select a suggestion model. */\n\tmodel?: string;\n\t/** Conversation history to summarize into a likely next user prompt. */\n\tmessages: ComposerMessage[];\n\t/** Optional session id for callers that want request correlation. */\n\tsessionId?: string;\n}\n\n/**\n * Response payload for prompt suggestion generation.\n */\nexport interface ComposerPromptSuggestionResponse {\n\t/** Suggested next user prompt, or null when suggestion generation is suppressed. */\n\tsuggestion: string | null;\n\t/** Optional suppression or filtering reason when no suggestion is returned. */\n\tsuppressedReason?: string;\n\t/** Model used to generate the suggestion, when generation ran. */\n\tmodel?: string;\n}\n\n/**\n * Summary metadata for a session (without full message history).\n *\n * Used in session list views for performance.\n */\nexport interface ComposerSessionSummary {\n\t/** Unique session identifier */\n\tid: string;\n\t/** User-assigned or auto-generated title */\n\ttitle?: string;\n\t/** Short persisted recap shown when resuming a session */\n\tresumeSummary?: string;\n\t/** ISO 8601 timestamp when session was created */\n\tcreatedAt: string;\n\t/** ISO 8601 timestamp when session was last updated */\n\tupdatedAt: string;\n\t/** Total number of messages in the session */\n\tmessageCount: number;\n\t/** Whether the session is marked as a favorite */\n\tfavorite?: boolean;\n\t/** User-assigned tags for organization */\n\ttags?: string[];\n}\n\nexport type ComposerSessionMessagesView = \"full\" | \"summary\" | \"notLoaded\";\n\nexport interface ComposerPendingClientToolRequest {\n\ttoolCallId: string;\n\ttoolName: string;\n\targs: unknown;\n\tkind?: \"client_tool\" | \"mcp_elicitation\" | \"user_input\";\n\treason?: string;\n}\n\nexport type ComposerPendingRequestKind =\n\t| \"approval\"\n\t| \"client_tool\"\n\t| \"mcp_elicitation\"\n\t| \"user_input\"\n\t| \"tool_retry\";\n\nexport type ComposerPendingRequestResolution =\n\t| \"approved\"\n\t| \"denied\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"answered\"\n\t| \"retried\"\n\t| \"skipped\"\n\t| \"aborted\"\n\t| \"cancelled\";\n\nexport type ComposerPendingRequestPlatformOperation =\n\t| \"ResolveApproval\"\n\t| \"ResumeToolExecution\"\n\t| \"ResumeRun\";\n\nexport interface ComposerPendingRequestPlatformRef {\n\tsource: \"approvals_service\" | \"tool_execution\";\n\ttoolExecutionId?: string;\n\tapprovalRequestId?: string;\n}\n\nexport interface ComposerPendingRequest {\n\tid: string;\n\tkind: ComposerPendingRequestKind;\n\tstatus: \"pending\";\n\tvisibility: \"user\";\n\tsessionId?: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdisplayName?: string;\n\tsummaryLabel?: string;\n\tactionDescription?: string;\n\targs: unknown;\n\treason: string;\n\tcreatedAt: string;\n\texpiresAt?: string;\n\tsource: \"local\" | \"platform\";\n\tplatform?: ComposerPendingRequestPlatformRef;\n}\n\nexport type ComposerClientToolResultContent =\n\t| ComposerTextContent\n\t| ComposerImageContent;\n\nexport interface ComposerPendingRequestResumeRequest {\n\tkind?: ComposerPendingRequestKind;\n\tsessionId?: string;\n\tdecision?: \"approved\" | \"denied\";\n\taction?: \"retry\" | \"skip\" | \"abort\";\n\tcontent?: ComposerClientToolResultContent[];\n\tisError?: boolean;\n\treason?: string;\n}\n\nexport interface ComposerPendingRequestResumeResponse {\n\tsuccess: true;\n\trequest: {\n\t\tid: string;\n\t\tkind: ComposerPendingRequestKind;\n\t\tsessionId?: string;\n\t\tresolution: ComposerPendingRequestResolution;\n\t\tsource: \"local\" | \"platform\";\n\t\tplatform?: ComposerPendingRequestPlatformRef;\n\t\tplatformOperation?: ComposerPendingRequestPlatformOperation;\n\t};\n}\n\nexport type ComposerRunTimelineVisibility = \"user\" | \"admin\" | \"audit\";\n\nexport type ComposerRunTimelineSource = \"local\" | \"platform\";\n\nexport type ComposerRunTimelineEventType =\n\t| \"session.started\"\n\t| \"session.updated\"\n\t| \"message.user\"\n\t| \"message.assistant\"\n\t| \"tool.requested\"\n\t| \"tool.completed\"\n\t| \"tool.failed\"\n\t| \"file.changed\"\n\t| \"diagnostic.delta\"\n\t| \"artifact.linked\"\n\t| \"policy.decision\"\n\t| \"wait.pending\"\n\t| \"agent.run.started\"\n\t| \"agent.run.completed\"\n\t| \"agent.run.failed\"\n\t| \"compaction.created\"\n\t| \"branch.created\"\n\t| \"model.changed\"\n\t| \"thinking.changed\"\n\t| \"runtime.recovery\"\n\t| \"runtime.finished\"\n\t| \"custom.event\";\n\nexport type ComposerRunTimelineStatus =\n\t| \"pending\"\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"approved\"\n\t| \"denied\"\n\t| \"info\";\n\nexport interface ComposerRunTimelineItem {\n\tid: string;\n\tsessionId: string;\n\ttimestamp: string;\n\ttype: ComposerRunTimelineEventType;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineSource;\n\tstatus?: ComposerRunTimelineStatus;\n\tsummary?: string;\n\trole?: ComposerRole;\n\ttoolCallId?: string;\n\ttoolName?: string;\n\tpendingRequestId?: string;\n\tpendingRequestKind?: ComposerPendingRequestKind;\n\tapprovalRequestId?: string;\n\ttoolExecutionId?: string;\n\tartifactId?: string;\n\tagentRunId?: string;\n\tparentAgentRunId?: string;\n\tchildAgentRunId?: string;\n\tremoteRunnerSessionId?: string;\n\tplatform?: ComposerPendingRequestPlatformRef;\n\tplatformOperation?: ComposerPendingRequestPlatformOperation;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ComposerRunTimelineResponse {\n\tsessionId: string;\n\tsource: ComposerRunTimelineSource;\n\tgeneratedAt: string;\n\tplatformBacked: boolean;\n\tpendingRequestCount: number;\n\titems: ComposerRunTimelineItem[];\n}\n\n/**\n * Full session data including message history.\n *\n * Returned when loading a specific session.\n */\nexport interface ComposerSession extends ComposerSessionSummary {\n\t/** Hydration level used for the messages array. Defaults to full. */\n\tmessagesView?: ComposerSessionMessagesView;\n\t/** Complete conversation history */\n\tmessages: ComposerMessage[];\n\t/** Pending approval requests that still require a decision */\n\tpendingApprovalRequests?: ComposerActionApprovalRequest[];\n\t/** Pending client or ask_user requests that still require client handling */\n\tpendingClientToolRequests?: ComposerPendingClientToolRequest[];\n\t/** Pending tool retry requests that still require a decision */\n\tpendingToolRetryRequests?: ComposerToolRetryRequest[];\n\t/** Unified pending requests for hosted attach, Platform, and admin surfaces */\n\tpendingRequests?: ComposerPendingRequest[];\n}\n\n/**\n * Streaming events emitted while generating assistant messages.\n */\nexport type ComposerAssistantMessageEvent =\n\t| {\n\t\t\ttype: \"start\";\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial?: ComposerMessage;\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_end\";\n\t\t\tcontentIndex: number;\n\t\t\ttoolCall: ComposerToolCallContent;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"done\";\n\t\t\treason: \"stop\" | \"length\" | \"toolUse\";\n\t\t\tmessage: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\treason: \"aborted\" | \"error\";\n\t\t\terror: ComposerMessage;\n\t };\n\nexport interface ComposerActionApprovalRequest {\n\tid: string;\n\ttoolName: string;\n\tdisplayName?: string;\n\tsummaryLabel?: string;\n\tactionDescription?: string;\n\targs: unknown;\n\treason: string;\n\tstartedAtMs?: number;\n\tplatform?: ComposerPendingRequestPlatformRef;\n}\n\nexport interface ComposerActionApprovalDecision {\n\tapproved: boolean;\n\treason?: string;\n\tresolvedBy: \"policy\" | \"user\";\n\tresolvedAtMs?: number;\n}\n\nexport interface ComposerToolRetryRequest {\n\tid: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\targs: unknown;\n\terrorMessage: string;\n\tattempt: number;\n\tmaxAttempts?: number;\n\tsummary?: string;\n}\n\nexport interface ComposerToolRetryDecision {\n\taction: \"retry\" | \"skip\" | \"abort\";\n\treason?: string;\n\tresolvedBy: \"policy\" | \"user\" | \"runtime\";\n}\n\n/**\n * Agent-level streaming events (SSE payloads).\n */\nexport type ComposerAgentEvent =\n\t| { type: \"agent_start\" }\n\t| {\n\t\t\ttype: \"agent_end\";\n\t\t\tmessages: ComposerMessage[];\n\t\t\taborted?: boolean;\n\t\t\tpartialAccepted?: ComposerMessage;\n\t\t\tstopReason?: \"stop\" | \"length\" | \"toolUse\" | \"error\" | \"aborted\";\n\t }\n\t| { type: \"status\"; status: string; details: Record<string, unknown> }\n\t| { type: \"error\"; message: string }\n\t| { type: \"turn_start\" }\n\t| {\n\t\t\ttype: \"turn_end\";\n\t\t\tmessage: ComposerMessage;\n\t\t\ttoolResults: ComposerMessage[];\n\t }\n\t| { type: \"message_start\"; message: ComposerMessage }\n\t| {\n\t\t\ttype: \"message_update\";\n\t\t\tmessage?: ComposerMessage;\n\t\t\tassistantMessageEvent: ComposerAssistantMessageEvent;\n\t }\n\t| { type: \"message_end\"; message: ComposerMessage }\n\t| {\n\t\t\ttype: \"tool_execution_start\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\targs: Record<string, unknown>;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_update\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\targs: Record<string, unknown>;\n\t\t\tpartialResult: unknown;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_end\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\tresult: unknown;\n\t\t\tisError: boolean;\n\t }\n\t| {\n\t\t\ttype: \"tool_batch_summary\";\n\t\t\tsummary: string;\n\t\t\tsummaryLabels: string[];\n\t\t\ttoolCallIds: string[];\n\t\t\ttoolNames: string[];\n\t\t\tcallsSucceeded: number;\n\t\t\tcallsFailed: number;\n\t }\n\t| { type: \"action_approval_required\"; request: ComposerActionApprovalRequest }\n\t| {\n\t\t\ttype: \"action_approval_resolved\";\n\t\t\trequest: ComposerActionApprovalRequest;\n\t\t\tdecision: ComposerActionApprovalDecision;\n\t }\n\t| {\n\t\t\ttype: \"client_tool_request\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t }\n\t| { type: \"tool_retry_required\"; request: ComposerToolRetryRequest }\n\t| {\n\t\t\ttype: \"tool_retry_resolved\";\n\t\t\trequest: ComposerToolRetryRequest;\n\t\t\tdecision: ComposerToolRetryDecision;\n\t }\n\t| {\n\t\t\ttype: \"compaction\";\n\t\t\tsummary: string;\n\t\t\tfirstKeptEntryIndex: number;\n\t\t\ttokensBefore: number;\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\ttimestamp: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_start\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_end\";\n\t\t\tsuccess: boolean;\n\t\t\tattempt: number;\n\t\t\tfinalError?: string;\n\t }\n\t| { type: \"session_update\"; sessionId: string }\n\t| { type: \"heartbeat\" }\n\t| { type: \"aborted\" }\n\t| { type: \"done\" };\n\n/**\n * Error severity levels for API payloads.\n */\nexport type ComposerErrorSeverity = \"error\" | \"warning\" | \"info\";\n\n/**\n * Error categories for API payloads.\n */\nexport type ComposerErrorCategory =\n\t| \"validation\"\n\t| \"permission\"\n\t| \"network\"\n\t| \"timeout\"\n\t| \"filesystem\"\n\t| \"tool\"\n\t| \"session\"\n\t| \"config\"\n\t| \"api\"\n\t| \"internal\";\n\n/**\n * Structured error payload for API responses.\n */\nexport interface ComposerErrorPayload {\n\tcode: string;\n\tcategory: ComposerErrorCategory;\n\tseverity?: ComposerErrorSeverity;\n\tretriable?: boolean;\n\tcontext?: Record<string, unknown>;\n}\n\n/**\n * Standard API error response shape.\n */\nexport interface ComposerErrorResponse {\n\terror: string;\n\tcode?: string;\n\tdetails?: Record<string, unknown>[];\n\tcomposer?: ComposerErrorPayload;\n}\n\n/**\n * Response payload for session list endpoint.\n */\nexport interface ComposerSessionListResponse {\n\t/** Array of session summaries */\n\tsessions: ComposerSessionSummary[];\n}\n\n/**\n * SSE event sent when a session is created or updated.\n *\n * Allows clients to sync session state in real-time.\n */\nexport interface ComposerSessionUpdateEvent {\n\ttype: \"session_update\";\n\t/** ID of the created/updated session */\n\tsessionId: string;\n}\n\n/**\n * Background task resource limit breach metadata.\n */\nexport interface ComposerBackgroundTaskLimitBreach {\n\tkind: \"memory\" | \"cpu\";\n\tlimit: number;\n\tactual: number;\n}\n\n/**\n * Background task history record.\n */\nexport interface ComposerBackgroundTaskHistoryEntry {\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tstatus: string;\n\tcommand: string;\n\ttimestamp: string;\n\trestartAttempts: number;\n\tfailureReason?: string;\n\tlimitBreach?: ComposerBackgroundTaskLimitBreach;\n}\n\n/**\n * Background task health entry.\n */\nexport interface ComposerBackgroundTaskHealthEntry {\n\tid: string;\n\tstatus: string;\n\tsummary: string;\n\tcommand: string;\n\trestarts?: string;\n\tissues: string[];\n\tlastLogLine?: string;\n\tlogTruncated?: boolean;\n\tdurationSeconds: number;\n}\n\n/**\n * Background task health snapshot.\n */\nexport interface ComposerBackgroundTaskHealth {\n\ttotal: number;\n\trunning: number;\n\trestarting: number;\n\tfailed: number;\n\tentries: ComposerBackgroundTaskHealthEntry[];\n\ttruncated: boolean;\n\tnotificationsEnabled: boolean;\n\tdetailsRedacted: boolean;\n\thistory: ComposerBackgroundTaskHistoryEntry[];\n\thistoryTruncated: boolean;\n}\n\nexport type ComposerGuardianTarget = \"staged\" | \"all\";\n\nexport type ComposerGuardianStatus = \"passed\" | \"failed\" | \"skipped\" | \"error\";\n\nexport interface ComposerGuardianToolResult {\n\ttool: string;\n\texitCode: number;\n\tstdout: string;\n\tstderr: string;\n\tdurationMs: number;\n\tskipped?: boolean;\n\treason?: string;\n}\n\nexport interface ComposerGuardianRunResult {\n\tstatus: ComposerGuardianStatus;\n\texitCode: number;\n\tstartedAt: number;\n\tdurationMs: number;\n\ttarget: ComposerGuardianTarget;\n\ttrigger?: string;\n\tfilesScanned: number;\n\tfiles?: string[];\n\tsummary: string;\n\tskipReason?: string;\n\ttoolResults: ComposerGuardianToolResult[];\n}\n\nexport interface ComposerGuardianState {\n\tenabled: boolean;\n\tlastRun?: ComposerGuardianRunResult;\n}\n\nexport interface ComposerGuardianStatusResponse {\n\tenabled: boolean;\n\tstate: ComposerGuardianState;\n}\n\nexport type ComposerGuardianRunResponse = ComposerGuardianRunResult;\n\nexport interface ComposerGuardianConfigRequest {\n\tenabled: boolean;\n}\n\nexport interface ComposerGuardianConfigResponse {\n\tsuccess: boolean;\n\tenabled: boolean;\n}\n\nexport interface ComposerPlanModeState {\n\tactive: boolean;\n\tfilePath: string;\n\tsessionId?: string;\n\tgitBranch?: string;\n\tgitCommitSha?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tname?: string;\n}\n\nexport interface ComposerPlanStatusResponse {\n\tstate: ComposerPlanModeState | null;\n\tcontent: string | null;\n}\n\nexport type ComposerPlanRequest =\n\t| { action: \"enter\"; name?: string; sessionId?: string }\n\t| { action: \"exit\" }\n\t| { action: \"update\"; content: string };\n\nexport type ComposerPlanActionResponse =\n\t| { success: boolean; state: ComposerPlanModeState }\n\t| { success: boolean };\n\nexport interface ComposerBackgroundSettings {\n\tnotificationsEnabled: boolean;\n\tstatusDetailsEnabled: boolean;\n}\n\nexport interface ComposerBackgroundStatusSnapshot {\n\trunning: number;\n\ttotal: number;\n\tfailed: number;\n\tdetailsRedacted: boolean;\n}\n\nexport interface ComposerBackgroundStatusResponse {\n\tsettings: ComposerBackgroundSettings;\n\tsnapshot: ComposerBackgroundStatusSnapshot | null;\n}\n\nexport interface ComposerBackgroundHistoryEntry {\n\ttimestamp: string;\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tcommand: string;\n\tfailureReason?: string;\n\tlimitBreach?: ComposerBackgroundTaskLimitBreach;\n}\n\nexport interface ComposerBackgroundHistoryResponse {\n\thistory: ComposerBackgroundHistoryEntry[];\n\ttruncated: boolean;\n}\n\nexport interface ComposerBackgroundPathResponse {\n\tpath: string;\n\texists: boolean;\n\toverridden: boolean;\n}\n\nexport interface ComposerBackgroundUpdateRequest {\n\tenabled: boolean;\n}\n\nexport interface ComposerBackgroundUpdateResponse {\n\tsuccess: boolean;\n\tmessage: string;\n}\n\nexport type ComposerApprovalMode = \"auto\" | \"prompt\" | \"fail\";\n\nexport interface ComposerApprovalsStatusResponse {\n\tmode: ComposerApprovalMode;\n\tavailableModes: ComposerApprovalMode[];\n}\n\nexport interface ComposerApprovalsUpdateRequest {\n\tmode: ComposerApprovalMode;\n\tsessionId?: string;\n}\n\nexport interface ComposerApprovalsUpdateResponse {\n\tsuccess: boolean;\n\tmode: ComposerApprovalMode;\n\tmessage: string;\n}\n\nexport type ComposerFrameworkScope = \"user\" | \"workspace\";\n\nexport interface ComposerFrameworkStatusResponse {\n\tframework: string;\n\tsource: string;\n\tlocked: boolean;\n\tscope: ComposerFrameworkScope;\n}\n\nexport interface ComposerFrameworkListEntry {\n\tid: string;\n\tsummary: string;\n}\n\nexport interface ComposerFrameworkListResponse {\n\tframeworks: ComposerFrameworkListEntry[];\n}\n\nexport interface ComposerFrameworkUpdateRequest {\n\tframework?: string | null;\n\tscope?: ComposerFrameworkScope;\n}\n\nexport interface ComposerFrameworkUpdateResponse {\n\tsuccess: boolean;\n\tmessage: string;\n\tframework: string | null;\n\tsummary?: string;\n\tscope?: ComposerFrameworkScope;\n}\n\nexport type ComposerChangeType = \"create\" | \"modify\" | \"delete\";\n\nexport interface ComposerFileChange {\n\tid: string;\n\ttype: ComposerChangeType;\n\tpath: string;\n\tbefore: string | null;\n\tafter: string | null;\n\ttoolName: string;\n\ttoolCallId: string;\n\ttimestamp: number;\n\tisGitTracked: boolean;\n\tmessageId?: string;\n}\n\nexport type ComposerUndoRestoreAction = \"restore\" | \"delete\" | \"recreate\";\n\nexport interface ComposerUndoPreview {\n\tchanges: ComposerFileChange[];\n\trestores: Array<{ path: string; action: ComposerUndoRestoreAction }>;\n\tconflicts: Array<{ path: string; reason: string }>;\n}\n\nexport interface ComposerUndoCheckpoint {\n\tname: string;\n\tdescription?: string;\n\tchangeCount: number;\n\ttimestamp: number;\n}\n\nexport interface ComposerUndoStatusResponse {\n\ttotalChanges: number;\n\tcanUndo: boolean;\n\tcheckpoints: ComposerUndoCheckpoint[];\n}\n\nexport interface ComposerUndoHistoryEntry {\n\tdescription: string;\n\tfileCount: number;\n\ttimestamp: number;\n}\n\nexport interface ComposerUndoHistoryResponse {\n\thistory: ComposerUndoHistoryEntry[];\n}\n\nexport interface ComposerUndoPreviewMessage {\n\tmessage: string;\n\tfileCount?: number;\n\tdescription?: string;\n}\n\nexport interface ComposerUndoRequest {\n\taction?: \"undo\" | \"checkpoint\" | \"restore\";\n\tcount?: number;\n\tpreview?: boolean;\n\tforce?: boolean;\n\tname?: string;\n\tdescription?: string;\n}\n\nexport type ComposerUndoOperationResponse =\n\t| { success: boolean; undone: number; errors: string[] }\n\t| { success: boolean; message: string; files?: string[] }\n\t| { message: string }\n\t| { preview: ComposerUndoPreview | ComposerUndoPreviewMessage }\n\t| {\n\t\t\tsuccess: boolean;\n\t\t\tcheckpoint: { name: string; changeCount: number; timestamp: number };\n\t }\n\t| { checkpoints: ComposerUndoCheckpoint[] };\n\nexport interface ComposerProjectOnboardingStep {\n\tkey: \"workspace\" | \"instructions\";\n\ttext: string;\n\tisComplete: boolean;\n\tisEnabled: boolean;\n}\n\nexport interface ComposerProjectOnboardingState {\n\tshouldShow: boolean;\n\tcompleted: boolean;\n\tseenCount: number;\n\tsteps: ComposerProjectOnboardingStep[];\n}\n\n/**\n * Workspace status response payload.\n */\nexport interface ComposerStatusResponse {\n\tcwd: string;\n\tgit: {\n\t\tbranch: string;\n\t\tstatus: {\n\t\t\tmodified: number;\n\t\t\tadded: number;\n\t\t\tdeleted: number;\n\t\t\tuntracked: number;\n\t\t\ttotal: number;\n\t\t};\n\t} | null;\n\tcontext: {\n\t\tagentMd: boolean;\n\t\tclaudeMd: boolean;\n\t};\n\tonboarding?: ComposerProjectOnboardingState;\n\tserver: {\n\t\tuptime: number;\n\t\tversion: string;\n\t\tstaticCacheMaxAgeSeconds?: number;\n\t};\n\tdatabase: {\n\t\tconfigured: boolean;\n\t\tconnected: boolean;\n\t};\n\tbackgroundTasks: ComposerBackgroundTaskHealth | null;\n\thooks: {\n\t\tasyncInFlight: number;\n\t\tconcurrency: {\n\t\t\tmax: number;\n\t\t\tactive: number;\n\t\t\tqueued: number;\n\t\t};\n\t};\n\tlastUpdated: number;\n\tlastLatencyMs: number;\n}\n\n/**\n * Token totals for usage summaries.\n */\nexport interface ComposerUsageTokenTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotal: number;\n}\n\n/**\n * Usage breakdown entry.\n */\nexport interface ComposerUsageBreakdown {\n\tcost: number;\n\trequests: number;\n\ttokens: number;\n\ttokensDetailed: ComposerUsageTokenTotals;\n\tcalls: number;\n\tcachedTokens: number;\n}\n\n/**\n * Usage summary response payload.\n */\nexport interface ComposerUsageSummary {\n\ttotalCost: number;\n\ttotalRequests: number;\n\ttotalTokens: number;\n\ttokensDetailed: ComposerUsageTokenTotals;\n\ttotalTokensDetailed: ComposerUsageTokenTotals;\n\ttotalTokensBreakdown: ComposerUsageTokenTotals;\n\ttotalCachedTokens: number;\n\tbyProvider: Record<string, ComposerUsageBreakdown>;\n\tbyModel: Record<string, ComposerUsageBreakdown>;\n}\n\n/**\n * Usage API response payload.\n */\nexport interface ComposerUsageResponse {\n\tsummary: ComposerUsageSummary;\n\thasData: boolean;\n}\n\n// Runtime schemas + validators\nexport * from \"./schemas.js\";\nexport * from \"./validators.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAksC9B,+BAA+B;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["/**\n * @fileoverview @evalops/contracts - Shared TypeScript Definitions\n *\n * This package provides the TypeScript type definitions that form the contract\n * between Maestro's frontend (Web UI) and backend (API server). All shared\n * types, interfaces, and enums are defined here to ensure type safety across\n * the client-server boundary.\n *\n * ## Key Types\n *\n * | Type | Description |\n * |------|-------------|\n * | `ComposerMessage` | Chat message with role, content, tools, and usage |\n * | `ComposerSession` | Session with metadata and message history |\n * | `ComposerChatRequest` | Request payload for the chat API |\n * | `ComposerUsage` | Token usage and cost tracking |\n * | `ComposerToolCall` | Tool invocation with status and result |\n *\n * ## Usage\n *\n * ```typescript\n * import type {\n * ComposerMessage,\n * ComposerSession,\n * ComposerChatRequest\n * } from \"@evalops/contracts\";\n *\n * // Type-safe message handling\n * const message: ComposerMessage = {\n * role: \"user\",\n * content: \"Hello, Maestro!\",\n * timestamp: new Date().toISOString(),\n * };\n *\n * // Type-safe API request\n * const request: ComposerChatRequest = {\n * messages: [message],\n * model: \"claude-sonnet-4-5\",\n * thinkingLevel: \"medium\",\n * };\n * ```\n *\n * @module @evalops/contracts\n */\n\nexport * from \"./headless-protocol-generated.js\";\nexport * from \"./headless-protocol-schemas.generated.js\";\nexport * as headlessProto from \"./proto/maestro/v1/headless_pb.js\";\nexport * from \"./advisor-effort.js\";\nexport * from \"./artifacts.js\";\nexport * from \"./delegation-prompt.js\";\nexport * from \"./guarded-files-settings.js\";\nexport * from \"./key-value-tokens.js\";\nexport * from \"./mcp-settings.js\";\nexport * from \"./memory.js\";\nexport * from \"./memory-utils.js\";\nexport * from \"./maestro-app-server.js\";\nexport * from \"./onboarding-utils.js\";\nexport * from \"./proto/maestro/v1/headless_pb.js\";\nexport * from \"./runtime-constraints.js\";\nexport * from \"./runtime-app-server.js\";\nexport * from \"./runtime-server-request.js\";\nexport * from \"./scenario.js\";\n\n/**\n * Role of a message in the conversation.\n *\n * - `user` - Messages from the human user\n * - `assistant` - Messages from the AI assistant\n * - `system` - System prompts and instructions\n * - `tool` - Tool execution results\n */\nexport type ComposerRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\n/**\n * Content blocks used for rich message payloads.\n */\nexport interface ComposerTextContent {\n\ttype: \"text\";\n\ttext: string;\n\ttextSignature?: string;\n}\n\nexport interface ComposerImageContent {\n\ttype: \"image\";\n\tdata: string;\n\tmimeType: string;\n}\n\nexport interface ComposerThinkingContent {\n\ttype: \"thinking\";\n\tthinking: string;\n\tthinkingSignature?: string;\n}\n\nexport interface ComposerToolCallContent {\n\ttype: \"toolCall\";\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n\tthoughtSignature?: string;\n}\n\nexport type ComposerContentBlock =\n\t| ComposerTextContent\n\t| ComposerImageContent\n\t| ComposerThinkingContent\n\t| ComposerToolCallContent;\n\n/**\n * Extended thinking/reasoning level for supported models.\n *\n * Higher levels produce more detailed reasoning at the cost of latency:\n * - `off` - No extended thinking\n * - `minimal` - Brief reasoning hints\n * - `low` - Light reasoning\n * - `medium` - Moderate reasoning depth\n * - `high` - Thorough step-by-step reasoning\n */\nexport type ComposerThinkingLevel =\n\t| \"off\"\n\t| \"minimal\"\n\t| \"low\"\n\t| \"medium\"\n\t| \"high\";\n\n/**\n * Represents a tool invocation within a message.\n *\n * Tools are actions the agent can take like reading files, executing commands,\n * or searching the web. Each tool call tracks its execution lifecycle.\n */\nexport interface ComposerToolCall {\n\t/** Name of the tool being invoked (e.g., \"read\", \"bash\", \"search\") */\n\tname: string;\n\t/** Current execution status of the tool call */\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"error\";\n\t/** Arguments passed to the tool */\n\targs?: Record<string, unknown>;\n\t/** Result returned by the tool (if completed) */\n\tresult?: unknown;\n\t/** Unique identifier for this tool call (for matching results) */\n\ttoolCallId?: string;\n}\n\n/**\n * File attachment included in a user message.\n *\n * Attachments can be images (for vision-capable models) or documents\n * (typically accompanied by extracted text for model consumption).\n *\n * `content` is base64-encoded raw bytes. Servers may omit `content` in some\n * read APIs for size reasons; when omitted, `contentOmitted` is set to true.\n */\nexport interface ComposerAttachment {\n\t/** Unique identifier for this attachment */\n\tid: string;\n\t/** Attachment type */\n\ttype: \"image\" | \"document\";\n\t/** Original filename */\n\tfileName: string;\n\t/** MIME type */\n\tmimeType: string;\n\t/** Size in bytes */\n\tsize: number;\n\t/** Base64-encoded file content (may be omitted) */\n\tcontent?: string;\n\t/** True when `content` was intentionally omitted */\n\tcontentOmitted?: boolean;\n\t/** Extracted text content (for documents) */\n\textractedText?: string;\n\t/** Preview image (typically base64, small) */\n\tpreview?: string;\n}\n\n/**\n * A message in the Maestro conversation.\n *\n * Messages can contain text content, tool calls, thinking traces,\n * and usage statistics. This is the primary data structure for\n * conversation history.\n */\nexport interface ComposerMessage {\n\t/** Role of the message sender */\n\trole: ComposerRole;\n\t/** Text content of the message */\n\tcontent: string | ComposerContentBlock[];\n\t/** Optional file attachments (for user messages) */\n\tattachments?: ComposerAttachment[];\n\t/** ISO 8601 timestamp when the message was created */\n\ttimestamp?: string;\n\t/** Extended thinking/reasoning trace (for supported models) */\n\tthinking?: string;\n\t/** Tool calls made in this message (for assistant messages) */\n\ttools?: ComposerToolCall[];\n\t/** Name of the tool (for tool result messages) */\n\ttoolName?: string;\n\t/** Whether this message represents an error */\n\tisError?: boolean;\n\t/** Token usage and cost for this message */\n\tusage?: ComposerUsage;\n\t/** Original provider for assistant messages (for cross-provider resume) */\n\tprovider?: string;\n\t/** Original API for assistant messages (for cross-provider resume) */\n\tapi?: string;\n\t/** Original model ID for assistant messages (for cross-provider resume) */\n\tmodel?: string;\n}\n\n/**\n * Cost breakdown for token usage.\n *\n * Costs are typically in USD, calculated based on the model's pricing.\n */\nexport interface ComposerUsageCost {\n\t/** Cost for input tokens */\n\tinput: number;\n\t/** Cost for output tokens */\n\toutput: number;\n\t/** Cost savings from cache reads (if applicable) */\n\tcacheRead?: number;\n\t/** Cost for cache writes (if applicable) */\n\tcacheWrite?: number;\n\t/** Total cost for this message */\n\ttotal?: number;\n}\n\n/**\n * Token usage statistics for a message or session.\n *\n * Tracks input/output tokens and cache utilization for cost monitoring.\n */\nexport interface ComposerUsage {\n\t/** Number of input tokens consumed */\n\tinput: number;\n\t/** Number of output tokens generated */\n\toutput: number;\n\t/** Tokens served from cache (reduces cost) */\n\tcacheRead?: number;\n\t/** Tokens written to cache */\n\tcacheWrite?: number;\n\t/** Calculated cost breakdown */\n\tcost?: ComposerUsageCost;\n}\n\n/**\n * Model capability metadata exposed by the API.\n */\nexport interface ComposerModelCapabilities {\n\tstreaming?: boolean;\n\ttools?: boolean;\n\tvision?: boolean;\n\treasoning?: boolean;\n}\n\n/**\n * Model metadata returned by `/api/models` and `/api/model`.\n */\nexport interface ComposerModel {\n\tid: string;\n\tprovider: string;\n\tname: string;\n\tapi?: string;\n\tcontextWindow?: number;\n\tmaxOutputTokens?: number;\n\tmaxTokens?: number;\n\treasoning?: boolean;\n\tcost?: ComposerUsageCost;\n\tcapabilities?: ComposerModelCapabilities;\n}\n\n/**\n * Response payload for `/api/models`.\n */\nexport interface ComposerModelListResponse {\n\tmodels: ComposerModel[];\n}\n\n/**\n * Argument definition for a custom command.\n */\nexport interface ComposerCommandArg {\n\tname: string;\n\trequired?: boolean;\n}\n\n/**\n * Custom command definition (safe for client consumption).\n */\nexport interface ComposerCommand {\n\tname: string;\n\tdescription?: string;\n\tprompt: string;\n\targs?: ComposerCommandArg[];\n}\n\n/**\n * Response payload for `/api/commands`.\n */\nexport interface ComposerCommandListResponse {\n\tcommands: ComposerCommand[];\n}\n\n/**\n * Command favorites/recents preferences.\n */\nexport interface ComposerCommandPrefs {\n\tfavorites: string[];\n\trecents: string[];\n}\n\n/**\n * Update payload for command preferences.\n */\nexport interface ComposerCommandPrefsUpdate {\n\tfavorites?: string[];\n\trecents?: string[];\n}\n\n/**\n * Response payload for command preference updates.\n */\nexport interface ComposerCommandPrefsWriteResponse {\n\tok: boolean;\n}\n\n/**\n * Request payload for `/api/config`.\n */\nexport interface ComposerConfigWriteRequest {\n\tconfig: Record<string, unknown>;\n}\n\n/**\n * Response payload for `/api/config` GET.\n */\nexport interface ComposerConfigResponse {\n\tconfig: Record<string, unknown>;\n\tconfigPath: string;\n}\n\n/**\n * Response payload for `/api/config` POST.\n */\nexport interface ComposerConfigWriteResponse {\n\tsuccess: boolean;\n}\n\n/**\n * Response payload for `/api/files`.\n */\nexport interface ComposerFilesResponse {\n\tfiles: string[];\n}\n\n/**\n * Request payload for the chat API endpoint.\n *\n * Sent to `POST /api/chat` to initiate or continue a conversation.\n */\nexport interface ComposerChatRequest {\n\t/** Model ID to use (e.g., \"claude-sonnet-4-5-20250929\") */\n\tmodel?: string;\n\t/** Conversation history including the current user message */\n\tmessages: ComposerMessage[];\n\t/** Extended thinking level for supported models */\n\tthinkingLevel?: ComposerThinkingLevel;\n\t/** Session ID to resume (optional - creates new session if omitted) */\n\tsessionId?: string;\n\t/** Whether to stream the response via SSE (default: true) */\n\tstream?: boolean;\n}\n\n/**\n * Request payload for prompt suggestion generation.\n *\n * Sent to `POST /api/prompt-suggestion` to generate a likely next user prompt\n * from the current conversation state.\n */\nexport interface ComposerPromptSuggestionRequest {\n\t/** Optional model preference used to select a suggestion model. */\n\tmodel?: string;\n\t/** Conversation history to summarize into a likely next user prompt. */\n\tmessages: ComposerMessage[];\n\t/** Optional session id for callers that want request correlation. */\n\tsessionId?: string;\n}\n\n/**\n * Response payload for prompt suggestion generation.\n */\nexport interface ComposerPromptSuggestionResponse {\n\t/** Suggested next user prompt, or null when suggestion generation is suppressed. */\n\tsuggestion: string | null;\n\t/** Optional suppression or filtering reason when no suggestion is returned. */\n\tsuppressedReason?: string;\n\t/** Model used to generate the suggestion, when generation ran. */\n\tmodel?: string;\n}\n\n/**\n * Summary metadata for a session (without full message history).\n *\n * Used in session list views for performance.\n */\nexport interface ComposerSessionSummary {\n\t/** Unique session identifier */\n\tid: string;\n\t/** User-assigned or auto-generated title */\n\ttitle?: string;\n\t/** Short persisted recap shown when resuming a session */\n\tresumeSummary?: string;\n\t/** ISO 8601 timestamp when session was created */\n\tcreatedAt: string;\n\t/** ISO 8601 timestamp when session was last updated */\n\tupdatedAt: string;\n\t/** Total number of messages in the session */\n\tmessageCount: number;\n\t/** Whether the session is marked as a favorite */\n\tfavorite?: boolean;\n\t/** User-assigned tags for organization */\n\ttags?: string[];\n}\n\nexport type ComposerSessionMessagesView = \"full\" | \"summary\" | \"notLoaded\";\n\nexport interface ComposerPendingClientToolRequest {\n\ttoolCallId: string;\n\ttoolName: string;\n\targs: unknown;\n\tkind?: \"client_tool\" | \"mcp_elicitation\" | \"user_input\";\n\treason?: string;\n}\n\nexport type ComposerPendingRequestKind =\n\t| \"approval\"\n\t| \"client_tool\"\n\t| \"mcp_elicitation\"\n\t| \"user_input\"\n\t| \"tool_retry\";\n\nexport type ComposerPendingRequestResolution =\n\t| \"approved\"\n\t| \"denied\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"answered\"\n\t| \"retried\"\n\t| \"skipped\"\n\t| \"aborted\"\n\t| \"cancelled\";\n\nexport type ComposerPendingRequestPlatformOperation =\n\t| \"ResolveApproval\"\n\t| \"ResumeToolExecution\"\n\t| \"ResumeRun\";\n\nexport interface ComposerPendingRequestPlatformRef {\n\tsource: \"approvals_service\" | \"tool_execution\";\n\ttoolExecutionId?: string;\n\tapprovalRequestId?: string;\n}\n\nexport interface ComposerPendingRequest {\n\tid: string;\n\tkind: ComposerPendingRequestKind;\n\tstatus: \"pending\";\n\tvisibility: \"user\";\n\tsessionId?: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdisplayName?: string;\n\tsummaryLabel?: string;\n\tactionDescription?: string;\n\targs: unknown;\n\treason: string;\n\tcreatedAt: string;\n\texpiresAt?: string;\n\tsource: \"local\" | \"platform\";\n\tplatform?: ComposerPendingRequestPlatformRef;\n}\n\nexport type ComposerClientToolResultContent =\n\t| ComposerTextContent\n\t| ComposerImageContent;\n\nexport interface ComposerPendingRequestResumeRequest {\n\tkind?: ComposerPendingRequestKind;\n\tsessionId?: string;\n\tdecision?: \"approved\" | \"denied\";\n\taction?: \"retry\" | \"skip\" | \"abort\";\n\tcontent?: ComposerClientToolResultContent[];\n\tisError?: boolean;\n\treason?: string;\n}\n\nexport interface ComposerPendingRequestResumeResponse {\n\tsuccess: true;\n\trequest: {\n\t\tid: string;\n\t\tkind: ComposerPendingRequestKind;\n\t\tsessionId?: string;\n\t\tresolution: ComposerPendingRequestResolution;\n\t\tsource: \"local\" | \"platform\";\n\t\tplatform?: ComposerPendingRequestPlatformRef;\n\t\tplatformOperation?: ComposerPendingRequestPlatformOperation;\n\t};\n}\n\nexport type ComposerRunTimelineVisibility = \"user\" | \"admin\" | \"audit\";\n\nexport type ComposerRunTimelineSource = \"local\" | \"platform\";\n\nexport type ComposerRunTimelineEventType =\n\t| \"session.started\"\n\t| \"session.updated\"\n\t| \"message.user\"\n\t| \"message.assistant\"\n\t| \"tool.requested\"\n\t| \"tool.completed\"\n\t| \"tool.failed\"\n\t| \"file.changed\"\n\t| \"diagnostic.delta\"\n\t| \"artifact.linked\"\n\t| \"policy.decision\"\n\t| \"wait.pending\"\n\t| \"agent.run.started\"\n\t| \"agent.run.completed\"\n\t| \"agent.run.failed\"\n\t| \"compaction.created\"\n\t| \"branch.created\"\n\t| \"model.changed\"\n\t| \"thinking.changed\"\n\t| \"runtime.recovery\"\n\t| \"runtime.finished\"\n\t| \"custom.event\";\n\nexport type ComposerRunTimelineStatus =\n\t| \"pending\"\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"approved\"\n\t| \"denied\"\n\t| \"info\";\n\nexport interface ComposerRunTimelineItem {\n\tid: string;\n\tsessionId: string;\n\ttimestamp: string;\n\ttype: ComposerRunTimelineEventType;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineSource;\n\tstatus?: ComposerRunTimelineStatus;\n\tsummary?: string;\n\trole?: ComposerRole;\n\ttoolCallId?: string;\n\ttoolName?: string;\n\tpendingRequestId?: string;\n\tpendingRequestKind?: ComposerPendingRequestKind;\n\tapprovalRequestId?: string;\n\ttoolExecutionId?: string;\n\tartifactId?: string;\n\tagentRunId?: string;\n\tparentAgentRunId?: string;\n\tchildAgentRunId?: string;\n\tremoteRunnerSessionId?: string;\n\tplatform?: ComposerPendingRequestPlatformRef;\n\tplatformOperation?: ComposerPendingRequestPlatformOperation;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ComposerRunTimelineResponse {\n\tsessionId: string;\n\tsource: ComposerRunTimelineSource;\n\tgeneratedAt: string;\n\tplatformBacked: boolean;\n\tpendingRequestCount: number;\n\titems: ComposerRunTimelineItem[];\n}\n\n/**\n * Full session data including message history.\n *\n * Returned when loading a specific session.\n */\nexport interface ComposerSession extends ComposerSessionSummary {\n\t/** Hydration level used for the messages array. Defaults to full. */\n\tmessagesView?: ComposerSessionMessagesView;\n\t/** Complete conversation history */\n\tmessages: ComposerMessage[];\n\t/** Pending approval requests that still require a decision */\n\tpendingApprovalRequests?: ComposerActionApprovalRequest[];\n\t/** Pending client or ask_user requests that still require client handling */\n\tpendingClientToolRequests?: ComposerPendingClientToolRequest[];\n\t/** Pending tool retry requests that still require a decision */\n\tpendingToolRetryRequests?: ComposerToolRetryRequest[];\n\t/** Unified pending requests for hosted attach, Platform, and admin surfaces */\n\tpendingRequests?: ComposerPendingRequest[];\n}\n\n/**\n * Streaming events emitted while generating assistant messages.\n */\nexport type ComposerAssistantMessageEvent =\n\t| {\n\t\t\ttype: \"start\";\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"text_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"thinking_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tpartial: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_start\";\n\t\t\tcontentIndex: number;\n\t\t\tpartial?: ComposerMessage;\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_delta\";\n\t\t\tcontentIndex: number;\n\t\t\tdelta: string;\n\t\t\tpartial?: ComposerMessage;\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t }\n\t| {\n\t\t\ttype: \"toolcall_end\";\n\t\t\tcontentIndex: number;\n\t\t\ttoolCall: ComposerToolCallContent;\n\t\t\tpartial?: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"done\";\n\t\t\treason: \"stop\" | \"length\" | \"toolUse\";\n\t\t\tmessage: ComposerMessage;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\treason: \"aborted\" | \"error\";\n\t\t\terror: ComposerMessage;\n\t };\n\nexport interface ComposerActionApprovalRequest {\n\tid: string;\n\ttoolName: string;\n\tdisplayName?: string;\n\tsummaryLabel?: string;\n\tactionDescription?: string;\n\targs: unknown;\n\treason: string;\n\tstartedAtMs?: number;\n\tplatform?: ComposerPendingRequestPlatformRef;\n}\n\nexport interface ComposerActionApprovalDecision {\n\tapproved: boolean;\n\treason?: string;\n\tresolvedBy: \"policy\" | \"user\";\n\tresolvedAtMs?: number;\n}\n\nexport interface ComposerToolRetryRequest {\n\tid: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\targs: unknown;\n\terrorMessage: string;\n\tattempt: number;\n\tmaxAttempts?: number;\n\tsummary?: string;\n}\n\nexport interface ComposerToolRetryDecision {\n\taction: \"retry\" | \"skip\" | \"abort\";\n\treason?: string;\n\tresolvedBy: \"policy\" | \"user\" | \"runtime\";\n}\n\n/**\n * Agent-level streaming events (SSE payloads).\n */\nexport type ComposerAgentEvent =\n\t| { type: \"agent_start\" }\n\t| {\n\t\t\ttype: \"agent_end\";\n\t\t\tmessages: ComposerMessage[];\n\t\t\taborted?: boolean;\n\t\t\tpartialAccepted?: ComposerMessage;\n\t\t\tstopReason?: \"stop\" | \"length\" | \"toolUse\" | \"error\" | \"aborted\";\n\t }\n\t| { type: \"status\"; status: string; details: Record<string, unknown> }\n\t| { type: \"error\"; message: string }\n\t| { type: \"turn_start\" }\n\t| {\n\t\t\ttype: \"turn_end\";\n\t\t\tmessage: ComposerMessage;\n\t\t\ttoolResults: ComposerMessage[];\n\t }\n\t| { type: \"message_start\"; message: ComposerMessage }\n\t| {\n\t\t\ttype: \"message_update\";\n\t\t\tmessage?: ComposerMessage;\n\t\t\tassistantMessageEvent: ComposerAssistantMessageEvent;\n\t }\n\t| { type: \"message_end\"; message: ComposerMessage }\n\t| {\n\t\t\ttype: \"tool_execution_start\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\targs: Record<string, unknown>;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_update\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\targs: Record<string, unknown>;\n\t\t\tpartialResult: unknown;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_end\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tdisplayName?: string;\n\t\t\tsummaryLabel?: string;\n\t\t\tresult: unknown;\n\t\t\tisError: boolean;\n\t }\n\t| {\n\t\t\ttype: \"tool_batch_summary\";\n\t\t\tsummary: string;\n\t\t\tsummaryLabels: string[];\n\t\t\ttoolCallIds: string[];\n\t\t\ttoolNames: string[];\n\t\t\tcallsSucceeded: number;\n\t\t\tcallsFailed: number;\n\t }\n\t| { type: \"action_approval_required\"; request: ComposerActionApprovalRequest }\n\t| {\n\t\t\ttype: \"action_approval_resolved\";\n\t\t\trequest: ComposerActionApprovalRequest;\n\t\t\tdecision: ComposerActionApprovalDecision;\n\t }\n\t| {\n\t\t\ttype: \"client_tool_request\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t }\n\t| { type: \"tool_retry_required\"; request: ComposerToolRetryRequest }\n\t| {\n\t\t\ttype: \"tool_retry_resolved\";\n\t\t\trequest: ComposerToolRetryRequest;\n\t\t\tdecision: ComposerToolRetryDecision;\n\t }\n\t| {\n\t\t\ttype: \"compaction\";\n\t\t\tsummary: string;\n\t\t\tfirstKeptEntryIndex: number;\n\t\t\ttokensBefore: number;\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\ttimestamp: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_start\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_end\";\n\t\t\tsuccess: boolean;\n\t\t\tattempt: number;\n\t\t\tfinalError?: string;\n\t }\n\t| { type: \"session_update\"; sessionId: string }\n\t| { type: \"heartbeat\" }\n\t| { type: \"aborted\" }\n\t| { type: \"done\" };\n\n/**\n * Error severity levels for API payloads.\n */\nexport type ComposerErrorSeverity = \"error\" | \"warning\" | \"info\";\n\n/**\n * Error categories for API payloads.\n */\nexport type ComposerErrorCategory =\n\t| \"validation\"\n\t| \"permission\"\n\t| \"network\"\n\t| \"timeout\"\n\t| \"filesystem\"\n\t| \"tool\"\n\t| \"session\"\n\t| \"config\"\n\t| \"api\"\n\t| \"internal\";\n\n/**\n * Structured error payload for API responses.\n */\nexport interface ComposerErrorPayload {\n\tcode: string;\n\tcategory: ComposerErrorCategory;\n\tseverity?: ComposerErrorSeverity;\n\tretriable?: boolean;\n\tcontext?: Record<string, unknown>;\n}\n\n/**\n * Standard API error response shape.\n */\nexport interface ComposerErrorResponse {\n\terror: string;\n\tcode?: string;\n\tdetails?: Record<string, unknown>[];\n\tcomposer?: ComposerErrorPayload;\n}\n\n/**\n * Response payload for session list endpoint.\n */\nexport interface ComposerSessionListResponse {\n\t/** Array of session summaries */\n\tsessions: ComposerSessionSummary[];\n}\n\n/**\n * SSE event sent when a session is created or updated.\n *\n * Allows clients to sync session state in real-time.\n */\nexport interface ComposerSessionUpdateEvent {\n\ttype: \"session_update\";\n\t/** ID of the created/updated session */\n\tsessionId: string;\n}\n\n/**\n * Background task resource limit breach metadata.\n */\nexport interface ComposerBackgroundTaskLimitBreach {\n\tkind: \"memory\" | \"cpu\";\n\tlimit: number;\n\tactual: number;\n}\n\n/**\n * Background task history record.\n */\nexport interface ComposerBackgroundTaskHistoryEntry {\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tstatus: string;\n\tcommand: string;\n\ttimestamp: string;\n\trestartAttempts: number;\n\tfailureReason?: string;\n\tlimitBreach?: ComposerBackgroundTaskLimitBreach;\n}\n\n/**\n * Background task health entry.\n */\nexport interface ComposerBackgroundTaskHealthEntry {\n\tid: string;\n\tstatus: string;\n\tsummary: string;\n\tcommand: string;\n\trestarts?: string;\n\tissues: string[];\n\tlastLogLine?: string;\n\tlogTruncated?: boolean;\n\tdurationSeconds: number;\n}\n\n/**\n * Background task health snapshot.\n */\nexport interface ComposerBackgroundTaskHealth {\n\ttotal: number;\n\trunning: number;\n\trestarting: number;\n\tfailed: number;\n\tentries: ComposerBackgroundTaskHealthEntry[];\n\ttruncated: boolean;\n\tnotificationsEnabled: boolean;\n\tdetailsRedacted: boolean;\n\thistory: ComposerBackgroundTaskHistoryEntry[];\n\thistoryTruncated: boolean;\n}\n\nexport type ComposerGuardianTarget = \"staged\" | \"all\";\n\nexport type ComposerGuardianStatus = \"passed\" | \"failed\" | \"skipped\" | \"error\";\n\nexport interface ComposerGuardianToolResult {\n\ttool: string;\n\texitCode: number;\n\tstdout: string;\n\tstderr: string;\n\tdurationMs: number;\n\tskipped?: boolean;\n\treason?: string;\n}\n\nexport interface ComposerGuardianRunResult {\n\tstatus: ComposerGuardianStatus;\n\texitCode: number;\n\tstartedAt: number;\n\tdurationMs: number;\n\ttarget: ComposerGuardianTarget;\n\ttrigger?: string;\n\tfilesScanned: number;\n\tfiles?: string[];\n\tsummary: string;\n\tskipReason?: string;\n\ttoolResults: ComposerGuardianToolResult[];\n}\n\nexport interface ComposerGuardianState {\n\tenabled: boolean;\n\tlastRun?: ComposerGuardianRunResult;\n}\n\nexport interface ComposerGuardianStatusResponse {\n\tenabled: boolean;\n\tstate: ComposerGuardianState;\n}\n\nexport type ComposerGuardianRunResponse = ComposerGuardianRunResult;\n\nexport interface ComposerGuardianConfigRequest {\n\tenabled: boolean;\n}\n\nexport interface ComposerGuardianConfigResponse {\n\tsuccess: boolean;\n\tenabled: boolean;\n}\n\nexport interface ComposerPlanModeState {\n\tactive: boolean;\n\tfilePath: string;\n\tsessionId?: string;\n\tgitBranch?: string;\n\tgitCommitSha?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tname?: string;\n}\n\nexport interface ComposerPlanStatusResponse {\n\tstate: ComposerPlanModeState | null;\n\tcontent: string | null;\n}\n\nexport type ComposerPlanRequest =\n\t| { action: \"enter\"; name?: string; sessionId?: string }\n\t| { action: \"exit\" }\n\t| { action: \"update\"; content: string };\n\nexport type ComposerPlanActionResponse =\n\t| { success: boolean; state: ComposerPlanModeState }\n\t| { success: boolean };\n\nexport interface ComposerBackgroundSettings {\n\tnotificationsEnabled: boolean;\n\tstatusDetailsEnabled: boolean;\n}\n\nexport interface ComposerBackgroundStatusSnapshot {\n\trunning: number;\n\ttotal: number;\n\tfailed: number;\n\tdetailsRedacted: boolean;\n}\n\nexport interface ComposerBackgroundStatusResponse {\n\tsettings: ComposerBackgroundSettings;\n\tsnapshot: ComposerBackgroundStatusSnapshot | null;\n}\n\nexport interface ComposerBackgroundHistoryEntry {\n\ttimestamp: string;\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tcommand: string;\n\tfailureReason?: string;\n\tlimitBreach?: ComposerBackgroundTaskLimitBreach;\n}\n\nexport interface ComposerBackgroundHistoryResponse {\n\thistory: ComposerBackgroundHistoryEntry[];\n\ttruncated: boolean;\n}\n\nexport interface ComposerBackgroundPathResponse {\n\tpath: string;\n\texists: boolean;\n\toverridden: boolean;\n}\n\nexport interface ComposerBackgroundUpdateRequest {\n\tenabled: boolean;\n}\n\nexport interface ComposerBackgroundUpdateResponse {\n\tsuccess: boolean;\n\tmessage: string;\n}\n\nexport type ComposerApprovalMode = \"auto\" | \"prompt\" | \"fail\";\n\nexport interface ComposerApprovalsStatusResponse {\n\tmode: ComposerApprovalMode;\n\tavailableModes: ComposerApprovalMode[];\n}\n\nexport interface ComposerApprovalsUpdateRequest {\n\tmode: ComposerApprovalMode;\n\tsessionId?: string;\n}\n\nexport interface ComposerApprovalsUpdateResponse {\n\tsuccess: boolean;\n\tmode: ComposerApprovalMode;\n\tmessage: string;\n}\n\nexport type ComposerFrameworkScope = \"user\" | \"workspace\";\n\nexport interface ComposerFrameworkStatusResponse {\n\tframework: string;\n\tsource: string;\n\tlocked: boolean;\n\tscope: ComposerFrameworkScope;\n}\n\nexport interface ComposerFrameworkListEntry {\n\tid: string;\n\tsummary: string;\n}\n\nexport interface ComposerFrameworkListResponse {\n\tframeworks: ComposerFrameworkListEntry[];\n}\n\nexport interface ComposerFrameworkUpdateRequest {\n\tframework?: string | null;\n\tscope?: ComposerFrameworkScope;\n}\n\nexport interface ComposerFrameworkUpdateResponse {\n\tsuccess: boolean;\n\tmessage: string;\n\tframework: string | null;\n\tsummary?: string;\n\tscope?: ComposerFrameworkScope;\n}\n\nexport type ComposerChangeType = \"create\" | \"modify\" | \"delete\";\n\nexport interface ComposerFileChange {\n\tid: string;\n\ttype: ComposerChangeType;\n\tpath: string;\n\tbefore: string | null;\n\tafter: string | null;\n\ttoolName: string;\n\ttoolCallId: string;\n\ttimestamp: number;\n\tisGitTracked: boolean;\n\tmessageId?: string;\n}\n\nexport type ComposerUndoRestoreAction = \"restore\" | \"delete\" | \"recreate\";\n\nexport interface ComposerUndoPreview {\n\tchanges: ComposerFileChange[];\n\trestores: Array<{ path: string; action: ComposerUndoRestoreAction }>;\n\tconflicts: Array<{ path: string; reason: string }>;\n}\n\nexport interface ComposerUndoCheckpoint {\n\tname: string;\n\tdescription?: string;\n\tchangeCount: number;\n\ttimestamp: number;\n}\n\nexport interface ComposerUndoStatusResponse {\n\ttotalChanges: number;\n\tcanUndo: boolean;\n\tcheckpoints: ComposerUndoCheckpoint[];\n}\n\nexport interface ComposerUndoHistoryEntry {\n\tdescription: string;\n\tfileCount: number;\n\ttimestamp: number;\n}\n\nexport interface ComposerUndoHistoryResponse {\n\thistory: ComposerUndoHistoryEntry[];\n}\n\nexport interface ComposerUndoPreviewMessage {\n\tmessage: string;\n\tfileCount?: number;\n\tdescription?: string;\n}\n\nexport interface ComposerUndoRequest {\n\taction?: \"undo\" | \"checkpoint\" | \"restore\";\n\tcount?: number;\n\tpreview?: boolean;\n\tforce?: boolean;\n\tname?: string;\n\tdescription?: string;\n}\n\nexport type ComposerUndoOperationResponse =\n\t| { success: boolean; undone: number; errors: string[] }\n\t| { success: boolean; message: string; files?: string[] }\n\t| { message: string }\n\t| { preview: ComposerUndoPreview | ComposerUndoPreviewMessage }\n\t| {\n\t\t\tsuccess: boolean;\n\t\t\tcheckpoint: { name: string; changeCount: number; timestamp: number };\n\t }\n\t| { checkpoints: ComposerUndoCheckpoint[] };\n\nexport interface ComposerProjectOnboardingStep {\n\tkey: \"workspace\" | \"instructions\";\n\ttext: string;\n\tisComplete: boolean;\n\tisEnabled: boolean;\n}\n\nexport interface ComposerProjectOnboardingState {\n\tshouldShow: boolean;\n\tcompleted: boolean;\n\tseenCount: number;\n\tsteps: ComposerProjectOnboardingStep[];\n}\n\n/**\n * Workspace status response payload.\n */\nexport interface ComposerStatusResponse {\n\tcwd: string;\n\tgit: {\n\t\tbranch: string;\n\t\tstatus: {\n\t\t\tmodified: number;\n\t\t\tadded: number;\n\t\t\tdeleted: number;\n\t\t\tuntracked: number;\n\t\t\ttotal: number;\n\t\t};\n\t} | null;\n\tcontext: {\n\t\tagentMd: boolean;\n\t\tclaudeMd: boolean;\n\t};\n\tonboarding?: ComposerProjectOnboardingState;\n\tserver: {\n\t\tuptime: number;\n\t\tversion: string;\n\t\tstaticCacheMaxAgeSeconds?: number;\n\t};\n\tdatabase: {\n\t\tconfigured: boolean;\n\t\tconnected: boolean;\n\t};\n\tbackgroundTasks: ComposerBackgroundTaskHealth | null;\n\thooks: {\n\t\tasyncInFlight: number;\n\t\tconcurrency: {\n\t\t\tmax: number;\n\t\t\tactive: number;\n\t\t\tqueued: number;\n\t\t};\n\t};\n\tlastUpdated: number;\n\tlastLatencyMs: number;\n}\n\n/**\n * Token totals for usage summaries.\n */\nexport interface ComposerUsageTokenTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotal: number;\n}\n\n/**\n * Usage breakdown entry.\n */\nexport interface ComposerUsageBreakdown {\n\tcost: number;\n\trequests: number;\n\ttokens: number;\n\ttokensDetailed: ComposerUsageTokenTotals;\n\tcalls: number;\n\tcachedTokens: number;\n}\n\n/**\n * Usage summary response payload.\n */\nexport interface ComposerUsageSummary {\n\ttotalCost: number;\n\ttotalRequests: number;\n\ttotalTokens: number;\n\ttokensDetailed: ComposerUsageTokenTotals;\n\ttotalTokensDetailed: ComposerUsageTokenTotals;\n\ttotalTokensBreakdown: ComposerUsageTokenTotals;\n\ttotalCachedTokens: number;\n\tbyProvider: Record<string, ComposerUsageBreakdown>;\n\tbyModel: Record<string, ComposerUsageBreakdown>;\n}\n\n/**\n * Usage API response payload.\n */\nexport interface ComposerUsageResponse {\n\tsummary: ComposerUsageSummary;\n\thasData: boolean;\n}\n\n// Runtime schemas + validators\nexport * from \"./schemas.js\";\nexport * from \"./validators.js\";\n"]}