@evalops/maestro 0.10.50 → 0.10.51

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 (406) hide show
  1. package/dist/agent/agent-outcome.d.ts +54 -0
  2. package/dist/agent/agent-outcome.d.ts.map +1 -0
  3. package/dist/agent/agent-outcome.js +142 -0
  4. package/dist/agent/agent-outcome.js.map +1 -0
  5. package/dist/agent/agent-resume.d.ts.map +1 -1
  6. package/dist/agent/agent-resume.js +3 -3
  7. package/dist/agent/agent-resume.js.map +1 -1
  8. package/dist/agent/agent-run-summary.d.ts +37 -0
  9. package/dist/agent/agent-run-summary.d.ts.map +1 -0
  10. package/dist/agent/agent-run-summary.js +15 -0
  11. package/dist/agent/agent-run-summary.js.map +1 -0
  12. package/dist/agent/agent-work-board.d.ts +82 -0
  13. package/dist/agent/agent-work-board.d.ts.map +1 -0
  14. package/dist/agent/agent-work-board.js +312 -0
  15. package/dist/agent/agent-work-board.js.map +1 -0
  16. package/dist/agent/auto-compaction.d.ts +7 -2
  17. package/dist/agent/auto-compaction.d.ts.map +1 -1
  18. package/dist/agent/auto-compaction.js +23 -10
  19. package/dist/agent/auto-compaction.js.map +1 -1
  20. package/dist/agent/mission-artifacts.d.ts +62 -0
  21. package/dist/agent/mission-artifacts.d.ts.map +1 -0
  22. package/dist/agent/mission-artifacts.js +438 -0
  23. package/dist/agent/mission-artifacts.js.map +1 -0
  24. package/dist/agent/mission-manifest.d.ts +139 -3
  25. package/dist/agent/mission-manifest.d.ts.map +1 -1
  26. package/dist/agent/mission-manifest.js +549 -3
  27. package/dist/agent/mission-manifest.js.map +1 -1
  28. package/dist/agent/mission-store.d.ts +80 -0
  29. package/dist/agent/mission-store.d.ts.map +1 -0
  30. package/dist/agent/mission-store.js +603 -0
  31. package/dist/agent/mission-store.js.map +1 -0
  32. package/dist/agent/modes.d.ts +2 -2
  33. package/dist/agent/modes.d.ts.map +1 -1
  34. package/dist/agent/modes.js +10 -3
  35. package/dist/agent/modes.js.map +1 -1
  36. package/dist/agent/providers/codex-app-server.d.ts.map +1 -1
  37. package/dist/agent/providers/codex-app-server.js +1 -3
  38. package/dist/agent/providers/codex-app-server.js.map +1 -1
  39. package/dist/agent/providers/google-gemini-cli.js +203 -107
  40. package/dist/agent/providers/google.js +100 -41
  41. package/dist/agent/providers/scripted.d.ts.map +1 -1
  42. package/dist/agent/providers/scripted.js +1 -3
  43. package/dist/agent/providers/scripted.js.map +1 -1
  44. package/dist/agent/providers/validation.d.ts.map +1 -1
  45. package/dist/agent/providers/validation.js +1 -3
  46. package/dist/agent/providers/validation.js.map +1 -1
  47. package/dist/agent/providers/vertex.js +203 -107
  48. package/dist/agent/snapshot-store.d.ts +32 -0
  49. package/dist/agent/snapshot-store.d.ts.map +1 -0
  50. package/dist/agent/snapshot-store.js +195 -0
  51. package/dist/agent/snapshot-store.js.map +1 -0
  52. package/dist/agent/specialist-profiles.d.ts +36 -0
  53. package/dist/agent/specialist-profiles.d.ts.map +1 -0
  54. package/dist/agent/specialist-profiles.js +159 -0
  55. package/dist/agent/specialist-profiles.js.map +1 -0
  56. package/dist/agent/subagent-specs.d.ts +4 -1
  57. package/dist/agent/subagent-specs.d.ts.map +1 -1
  58. package/dist/agent/subagent-specs.js +81 -8
  59. package/dist/agent/subagent-specs.js.map +1 -1
  60. package/dist/agent/swarm/coverage-gate.d.ts +37 -0
  61. package/dist/agent/swarm/coverage-gate.d.ts.map +1 -0
  62. package/dist/agent/swarm/coverage-gate.js +48 -0
  63. package/dist/agent/swarm/coverage-gate.js.map +1 -0
  64. package/dist/agent/swarm/executor.d.ts +1 -0
  65. package/dist/agent/swarm/executor.d.ts.map +1 -1
  66. package/dist/agent/swarm/executor.js +151 -15
  67. package/dist/agent/swarm/executor.js.map +1 -1
  68. package/dist/agent/swarm/orchestrator-prompt.d.ts +25 -0
  69. package/dist/agent/swarm/orchestrator-prompt.d.ts.map +1 -0
  70. package/dist/agent/swarm/orchestrator-prompt.js +48 -0
  71. package/dist/agent/swarm/orchestrator-prompt.js.map +1 -0
  72. package/dist/agent/swarm/plan-parser.d.ts.map +1 -1
  73. package/dist/agent/swarm/plan-parser.js +27 -2
  74. package/dist/agent/swarm/plan-parser.js.map +1 -1
  75. package/dist/agent/swarm/types.d.ts +17 -0
  76. package/dist/agent/swarm/types.d.ts.map +1 -1
  77. package/dist/agent/swarm/types.js.map +1 -1
  78. package/dist/agent/swarm/validation-directive.d.ts +21 -0
  79. package/dist/agent/swarm/validation-directive.d.ts.map +1 -0
  80. package/dist/agent/swarm/validation-directive.js +25 -0
  81. package/dist/agent/swarm/validation-directive.js.map +1 -0
  82. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  83. package/dist/agent/transport/tool-execution-bridge.js +4 -1
  84. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  85. package/dist/api/enterprise-routes.d.ts.map +1 -1
  86. package/dist/api/enterprise-routes.js +87 -10
  87. package/dist/api/enterprise-routes.js.map +1 -1
  88. package/dist/api/org-settings-merge.d.ts +12 -0
  89. package/dist/api/org-settings-merge.d.ts.map +1 -0
  90. package/dist/api/org-settings-merge.js +38 -0
  91. package/dist/api/org-settings-merge.js.map +1 -0
  92. package/dist/api/user-settings-merge.d.ts +16 -0
  93. package/dist/api/user-settings-merge.d.ts.map +1 -0
  94. package/dist/api/user-settings-merge.js +37 -0
  95. package/dist/api/user-settings-merge.js.map +1 -0
  96. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -1
  97. package/dist/app-server/daemon-lifecycle-api.js +1 -3
  98. package/dist/app-server/daemon-lifecycle-api.js.map +1 -1
  99. package/dist/app-server/external-agent-import-api.d.ts.map +1 -1
  100. package/dist/app-server/external-agent-import-api.js +1 -3
  101. package/dist/app-server/external-agent-import-api.js.map +1 -1
  102. package/dist/app-server/network-governance-api.d.ts.map +1 -1
  103. package/dist/app-server/network-governance-api.js +1 -3
  104. package/dist/app-server/network-governance-api.js.map +1 -1
  105. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -1
  106. package/dist/app-server/plugin-bundle-api.js +1 -3
  107. package/dist/app-server/plugin-bundle-api.js.map +1 -1
  108. package/dist/app-server/policy-control-api.d.ts.map +1 -1
  109. package/dist/app-server/policy-control-api.js +1 -3
  110. package/dist/app-server/policy-control-api.js.map +1 -1
  111. package/dist/app-server/protocol-modes-api.d.ts.map +1 -1
  112. package/dist/app-server/protocol-modes-api.js +1 -3
  113. package/dist/app-server/protocol-modes-api.js.map +1 -1
  114. package/dist/cli/args.d.ts +2 -0
  115. package/dist/cli/args.d.ts.map +1 -1
  116. package/dist/cli/args.js +15 -0
  117. package/dist/cli/args.js.map +1 -1
  118. package/dist/cli/commands/a2a.d.ts.map +1 -1
  119. package/dist/cli/commands/a2a.js +1 -3
  120. package/dist/cli/commands/a2a.js.map +1 -1
  121. package/dist/cli/commands/agents.d.ts +4 -0
  122. package/dist/cli/commands/agents.d.ts.map +1 -1
  123. package/dist/cli/commands/agents.js +149 -0
  124. package/dist/cli/commands/agents.js.map +1 -1
  125. package/dist/cli/commands/mission.d.ts +4 -0
  126. package/dist/cli/commands/mission.d.ts.map +1 -0
  127. package/dist/cli/commands/mission.js +196 -0
  128. package/dist/cli/commands/mission.js.map +1 -0
  129. package/dist/cli/commands/value.d.ts +10 -0
  130. package/dist/cli/commands/value.d.ts.map +1 -0
  131. package/dist/cli/commands/value.js +33 -0
  132. package/dist/cli/commands/value.js.map +1 -0
  133. package/dist/cli/headless-protocol.d.ts.map +1 -1
  134. package/dist/cli/headless-protocol.js +1 -3
  135. package/dist/cli/headless-protocol.js.map +1 -1
  136. package/dist/cli/help.d.ts.map +1 -1
  137. package/dist/cli/help.js +10 -0
  138. package/dist/cli/help.js.map +1 -1
  139. package/dist/cli/system-prompt.d.ts.map +1 -1
  140. package/dist/cli/system-prompt.js +38 -7
  141. package/dist/cli/system-prompt.js.map +1 -1
  142. package/dist/cli-runtime.js +7756 -2800
  143. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  144. package/dist/cli-tui/client-tools/client-tool-controller.js +1 -3
  145. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  146. package/dist/cli-tui/commands/undo-handlers.d.ts.map +1 -1
  147. package/dist/cli-tui/commands/undo-handlers.js +7 -2
  148. package/dist/cli-tui/commands/undo-handlers.js.map +1 -1
  149. package/dist/cli-tui/tui-renderer/skills-controller.d.ts +3 -0
  150. package/dist/cli-tui/tui-renderer/skills-controller.d.ts.map +1 -1
  151. package/dist/cli-tui/tui-renderer/skills-controller.js +77 -33
  152. package/dist/cli-tui/tui-renderer/skills-controller.js.map +1 -1
  153. package/dist/codex/app-server-client.d.ts.map +1 -1
  154. package/dist/codex/app-server-client.js +1 -3
  155. package/dist/codex/app-server-client.js.map +1 -1
  156. package/dist/codex/compatibility.d.ts.map +1 -1
  157. package/dist/codex/compatibility.js +1 -3
  158. package/dist/codex/compatibility.js.map +1 -1
  159. package/dist/codex/subagent-dispatch-table.d.ts +8 -0
  160. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -1
  161. package/dist/codex/subagent-dispatch-table.js +23 -0
  162. package/dist/codex/subagent-dispatch-table.js.map +1 -1
  163. package/dist/context/manifest.d.ts.map +1 -1
  164. package/dist/context/manifest.js +1 -3
  165. package/dist/context/manifest.js.map +1 -1
  166. package/dist/conversation/render-model.d.ts +0 -36
  167. package/dist/conversation/render-model.d.ts.map +1 -1
  168. package/dist/conversation/render-model.js +1 -3
  169. package/dist/conversation/render-model.js.map +1 -1
  170. package/dist/customer-value/ambient-learning.d.ts +75 -0
  171. package/dist/customer-value/ambient-learning.d.ts.map +1 -0
  172. package/dist/customer-value/ambient-learning.js +472 -0
  173. package/dist/customer-value/ambient-learning.js.map +1 -0
  174. package/dist/customer-value/internal-helpers.d.ts +13 -0
  175. package/dist/customer-value/internal-helpers.d.ts.map +1 -0
  176. package/dist/customer-value/internal-helpers.js +70 -0
  177. package/dist/customer-value/internal-helpers.js.map +1 -0
  178. package/dist/customer-value/report.d.ts +282 -0
  179. package/dist/customer-value/report.d.ts.map +1 -0
  180. package/dist/customer-value/report.js +2085 -0
  181. package/dist/customer-value/report.js.map +1 -0
  182. package/dist/db/schema.d.ts +5 -1
  183. package/dist/db/schema.d.ts.map +1 -1
  184. package/dist/db/schema.js.map +1 -1
  185. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  186. package/dist/evalops/agent-bootstrap.js +1 -3
  187. package/dist/evalops/agent-bootstrap.js.map +1 -1
  188. package/dist/evalops/agent-mcp-metadata.d.ts.map +1 -1
  189. package/dist/evalops/agent-mcp-metadata.js +1 -3
  190. package/dist/evalops/agent-mcp-metadata.js.map +1 -1
  191. package/dist/index.d.ts +1 -0
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +1 -0
  194. package/dist/index.js.map +1 -1
  195. package/dist/installers/maestro-review-workflow.d.ts +38 -0
  196. package/dist/installers/maestro-review-workflow.d.ts.map +1 -0
  197. package/dist/installers/maestro-review-workflow.js +163 -0
  198. package/dist/installers/maestro-review-workflow.js.map +1 -0
  199. package/dist/load-env.d.ts.map +1 -1
  200. package/dist/load-env.js +2 -1
  201. package/dist/load-env.js.map +1 -1
  202. package/dist/main.d.ts.map +1 -1
  203. package/dist/main.js +92 -3
  204. package/dist/main.js.map +1 -1
  205. package/dist/mcp/config.d.ts.map +1 -1
  206. package/dist/mcp/config.js +1 -3
  207. package/dist/mcp/config.js.map +1 -1
  208. package/dist/mcp/elicitation.d.ts.map +1 -1
  209. package/dist/mcp/elicitation.js +1 -3
  210. package/dist/mcp/elicitation.js.map +1 -1
  211. package/dist/mcp/official-registry.d.ts.map +1 -1
  212. package/dist/mcp/official-registry.js +1 -3
  213. package/dist/mcp/official-registry.js.map +1 -1
  214. package/dist/mcp/workspace-trust.d.ts.map +1 -1
  215. package/dist/mcp/workspace-trust.js +1 -3
  216. package/dist/mcp/workspace-trust.js.map +1 -1
  217. package/dist/memory/service-client.d.ts.map +1 -1
  218. package/dist/memory/service-client.js +1 -3
  219. package/dist/memory/service-client.js.map +1 -1
  220. package/dist/models/config-loader.d.ts.map +1 -1
  221. package/dist/models/config-loader.js +1 -3
  222. package/dist/models/config-loader.js.map +1 -1
  223. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
  224. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  225. package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
  226. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  227. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts +61 -0
  228. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts.map +1 -0
  229. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js +183 -0
  230. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js.map +1 -0
  231. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  232. package/dist/node_modules/@evalops/tui/package.json +1 -1
  233. package/dist/oauth/connectors.d.ts.map +1 -1
  234. package/dist/oauth/connectors.js +1 -3
  235. package/dist/oauth/connectors.js.map +1 -1
  236. package/dist/oauth/evalops.d.ts.map +1 -1
  237. package/dist/oauth/evalops.js +1 -3
  238. package/dist/oauth/evalops.js.map +1 -1
  239. package/dist/platform/a2a-client.d.ts.map +1 -1
  240. package/dist/platform/a2a-client.js +1 -3
  241. package/dist/platform/a2a-client.js.map +1 -1
  242. package/dist/platform/a2a-cockpit.d.ts +1 -0
  243. package/dist/platform/a2a-cockpit.d.ts.map +1 -1
  244. package/dist/platform/a2a-cockpit.js +42 -11
  245. package/dist/platform/a2a-cockpit.js.map +1 -1
  246. package/dist/platform/a2a-completion-audit.d.ts +1 -1
  247. package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
  248. package/dist/platform/a2a-completion-audit.js +7 -11
  249. package/dist/platform/a2a-completion-audit.js.map +1 -1
  250. package/dist/platform/a2a-maestro-peer.js +16 -0
  251. package/dist/platform/a2a-maestro-peer.js.map +1 -1
  252. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -1
  253. package/dist/platform/a2a-peer-pairing.js +1 -3
  254. package/dist/platform/a2a-peer-pairing.js.map +1 -1
  255. package/dist/platform/a2a-peer-registry.d.ts.map +1 -1
  256. package/dist/platform/a2a-peer-registry.js +1 -3
  257. package/dist/platform/a2a-peer-registry.js.map +1 -1
  258. package/dist/platform/a2a-task-ledger.d.ts +20 -0
  259. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  260. package/dist/platform/a2a-task-ledger.js +207 -11
  261. package/dist/platform/a2a-task-ledger.js.map +1 -1
  262. package/dist/platform/a2a-work-graph.d.ts.map +1 -1
  263. package/dist/platform/a2a-work-graph.js +1 -3
  264. package/dist/platform/a2a-work-graph.js.map +1 -1
  265. package/dist/platform/operating-layer.d.ts.map +1 -1
  266. package/dist/platform/operating-layer.js +14 -8
  267. package/dist/platform/operating-layer.js.map +1 -1
  268. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  269. package/dist/platform/tool-execution-client.js +19 -2
  270. package/dist/platform/tool-execution-client.js.map +1 -1
  271. package/dist/providers/auth.d.ts.map +1 -1
  272. package/dist/providers/auth.js +1 -3
  273. package/dist/providers/auth.js.map +1 -1
  274. package/dist/runtime/env.d.ts +9 -1
  275. package/dist/runtime/env.d.ts.map +1 -1
  276. package/dist/runtime/env.js +63 -1
  277. package/dist/runtime/env.js.map +1 -1
  278. package/dist/safety/policy.d.ts.map +1 -1
  279. package/dist/safety/policy.js +1 -4
  280. package/dist/safety/policy.js.map +1 -1
  281. package/dist/sandbox/docker-sandbox.d.ts.map +1 -1
  282. package/dist/sandbox/docker-sandbox.js +6 -1
  283. package/dist/sandbox/docker-sandbox.js.map +1 -1
  284. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  285. package/dist/server/handlers/hosted-runner-drain.js +1 -3
  286. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  287. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  288. package/dist/server/handlers/platform-a2a-push.js +53 -2
  289. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  290. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -1
  291. package/dist/server/handlers/runtime-app-server-ws.js +1 -3
  292. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -1
  293. package/dist/server/headless-runtime-service.d.ts +16 -0
  294. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  295. package/dist/server/headless-runtime-service.js +232 -206
  296. package/dist/server/headless-runtime-service.js.map +1 -1
  297. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
  298. package/dist/server/hosted-agent-runtime-progress.js +12 -3
  299. package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
  300. package/dist/server/pending-request-payload.d.ts.map +1 -1
  301. package/dist/server/pending-request-payload.js +1 -3
  302. package/dist/server/pending-request-payload.js.map +1 -1
  303. package/dist/server/route-auth.d.ts.map +1 -1
  304. package/dist/server/route-auth.js +2 -0
  305. package/dist/server/route-auth.js.map +1 -1
  306. package/dist/server/session-serialization.d.ts.map +1 -1
  307. package/dist/server/session-serialization.js +1 -3
  308. package/dist/server/session-serialization.js.map +1 -1
  309. package/dist/services/compliance/normalize.d.ts.map +1 -1
  310. package/dist/services/compliance/normalize.js +1 -3
  311. package/dist/services/compliance/normalize.js.map +1 -1
  312. package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
  313. package/dist/services/intelligent-router/normalize.js +1 -3
  314. package/dist/services/intelligent-router/normalize.js.map +1 -1
  315. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -1
  316. package/dist/services/revenue-attribution/normalize.js +1 -3
  317. package/dist/services/revenue-attribution/normalize.js.map +1 -1
  318. package/dist/services/traces/normalize.d.ts.map +1 -1
  319. package/dist/services/traces/normalize.js +1 -3
  320. package/dist/services/traces/normalize.js.map +1 -1
  321. package/dist/services/workspace-config/normalize.d.ts.map +1 -1
  322. package/dist/services/workspace-config/normalize.js +1 -3
  323. package/dist/services/workspace-config/normalize.js.map +1 -1
  324. package/dist/skills/composer.d.ts.map +1 -1
  325. package/dist/skills/composer.js +13 -1
  326. package/dist/skills/composer.js.map +1 -1
  327. package/dist/skills/index.d.ts +1 -0
  328. package/dist/skills/index.d.ts.map +1 -1
  329. package/dist/skills/index.js +1 -0
  330. package/dist/skills/index.js.map +1 -1
  331. package/dist/skills/learned-guidelines.d.ts +33 -0
  332. package/dist/skills/learned-guidelines.d.ts.map +1 -0
  333. package/dist/skills/learned-guidelines.js +291 -0
  334. package/dist/skills/learned-guidelines.js.map +1 -0
  335. package/dist/skills/linter.d.ts.map +1 -1
  336. package/dist/skills/linter.js +1 -3
  337. package/dist/skills/linter.js.map +1 -1
  338. package/dist/skills/runtime-activation.d.ts +1 -0
  339. package/dist/skills/runtime-activation.d.ts.map +1 -1
  340. package/dist/skills/runtime-activation.js +2 -3
  341. package/dist/skills/runtime-activation.js.map +1 -1
  342. package/dist/skills/tool.d.ts.map +1 -1
  343. package/dist/skills/tool.js +26 -21
  344. package/dist/skills/tool.js.map +1 -1
  345. package/dist/skills/trust-cache.d.ts +7 -0
  346. package/dist/skills/trust-cache.d.ts.map +1 -1
  347. package/dist/skills/trust-cache.js +16 -0
  348. package/dist/skills/trust-cache.js.map +1 -1
  349. package/dist/telemetry/agent-workforce-native-event.d.ts.map +1 -1
  350. package/dist/telemetry/agent-workforce-native-event.js +1 -3
  351. package/dist/telemetry/agent-workforce-native-event.js.map +1 -1
  352. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  353. package/dist/telemetry/maestro-event-bus.js +42 -81
  354. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  355. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  356. package/dist/telemetry/maestro-platform-replay-fixture.js +1 -3
  357. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  358. package/dist/telemetry.d.ts.map +1 -1
  359. package/dist/telemetry.js +54 -43
  360. package/dist/telemetry.js.map +1 -1
  361. package/dist/theme/theme-loader.d.ts.map +1 -1
  362. package/dist/theme/theme-loader.js +1 -3
  363. package/dist/theme/theme-loader.js.map +1 -1
  364. package/dist/tools/apply-patch.d.ts.map +1 -1
  365. package/dist/tools/apply-patch.js +76 -8
  366. package/dist/tools/apply-patch.js.map +1 -1
  367. package/dist/tools/diff-preview.d.ts.map +1 -1
  368. package/dist/tools/diff-preview.js +10 -1
  369. package/dist/tools/diff-preview.js.map +1 -1
  370. package/dist/tools/edit.d.ts.map +1 -1
  371. package/dist/tools/edit.js +17 -0
  372. package/dist/tools/edit.js.map +1 -1
  373. package/dist/tools/write.d.ts.map +1 -1
  374. package/dist/tools/write.js +9 -0
  375. package/dist/tools/write.js.map +1 -1
  376. package/dist/undo/tracker.d.ts +5 -0
  377. package/dist/undo/tracker.d.ts.map +1 -1
  378. package/dist/undo/tracker.js +13 -0
  379. package/dist/undo/tracker.js.map +1 -1
  380. package/dist/utils/fs.d.ts +1 -1
  381. package/dist/utils/fs.d.ts.map +1 -1
  382. package/dist/utils/fs.js +29 -2
  383. package/dist/utils/fs.js.map +1 -1
  384. package/dist/utils/git-stash.d.ts.map +1 -1
  385. package/dist/utils/git-stash.js +15 -8
  386. package/dist/utils/git-stash.js.map +1 -1
  387. package/dist/utils/json.d.ts +11 -0
  388. package/dist/utils/json.d.ts.map +1 -1
  389. package/dist/utils/json.js +9 -0
  390. package/dist/utils/json.js.map +1 -1
  391. package/dist/utils/shell-env.d.ts.map +1 -1
  392. package/dist/utils/shell-env.js +2 -0
  393. package/dist/utils/shell-env.js.map +1 -1
  394. package/dist/utils/url-extractor-git.d.ts +26 -0
  395. package/dist/utils/url-extractor-git.d.ts.map +1 -0
  396. package/dist/utils/url-extractor-git.js +259 -0
  397. package/dist/utils/url-extractor-git.js.map +1 -0
  398. package/dist/utils/url-extractor.d.ts.map +1 -1
  399. package/dist/utils/url-extractor.js +23 -251
  400. package/dist/utils/url-extractor.js.map +1 -1
  401. package/dist/version.json +2 -2
  402. package/package.json +310 -306
  403. package/skills/incident-triage/SKILL.md +19 -1
  404. package/skills/install-code-review/SKILL.md +69 -0
  405. package/skills/security-review/SKILL.md +68 -0
  406. package/skills/security-review/reference/rubric.md +85 -0
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/compliance/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n\ttype AgentActionInput,\n\ttype AgentActionRecord,\n\tCOMPLIANCE_FRAMEWORKS,\n\ttype ComplianceFramework,\n\ttype ComplianceJsonValue,\n\ttype ComplianceReportRequest,\n\ttype GovernanceEvaluationInput,\n\ttype GovernanceEvaluationRecord,\n\ttype NormalizedComplianceReportRequest,\n} from \"./types.js\";\n\nexport class ComplianceValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ComplianceValidationError\";\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new ComplianceValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseDate(\n\tvalue: Date | string | undefined,\n\tlabel: string,\n): Date | undefined {\n\tif (value === undefined) return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(value);\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new ComplianceValidationError(`${label} must be a valid date.`);\n\t}\n\treturn parsed;\n}\n\nexport function parseComplianceFramework(value: string): ComplianceFramework {\n\tconst normalized = value.trim().toLowerCase();\n\tif (COMPLIANCE_FRAMEWORKS.includes(normalized as ComplianceFramework)) {\n\t\treturn normalized as ComplianceFramework;\n\t}\n\tthrow new ComplianceValidationError(\n\t\t\"Invalid compliance framework. Use soc2 or iso27001.\",\n\t);\n}\n\nexport function parseComplianceFrameworks(\n\tvalue: unknown,\n): ComplianceFramework[] {\n\tif (value === undefined || value === null) return [\"soc2\", \"iso27001\"];\n\tif (typeof value === \"string\") {\n\t\treturn Array.from(\n\t\t\tnew Set(\n\t\t\t\tvalue\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((entry) => entry.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map(parseComplianceFramework),\n\t\t\t),\n\t\t);\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new ComplianceValidationError(\"frameworks must be an array.\");\n\t}\n\tconst frameworks = Array.from(\n\t\tnew Set(value.map((entry) => parseComplianceFramework(String(entry)))),\n\t);\n\treturn frameworks.length > 0 ? frameworks : [\"soc2\", \"iso27001\"];\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): ComplianceJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\")\n\t\treturn Number.isFinite(value) ? value : undefined;\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is ComplianceJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, ComplianceJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction sanitizeMetadata(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, ComplianceJsonValue> {\n\tif (!value) return {};\n\tconst sanitized = sanitizeJsonValue(value);\n\treturn isRecord(sanitized)\n\t\t? (sanitized as Record<string, ComplianceJsonValue>)\n\t\t: {};\n}\n\nfunction stableActionId(input: AgentActionInput, timestamp: Date): string {\n\tconst explicit = cleanOptionalString(input.actionId);\n\tif (explicit) return explicit;\n\tconst digest = createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tworkspaceId: input.workspaceId,\n\t\t\t\tagentId: input.agentId,\n\t\t\t\ttype: input.type,\n\t\t\t\tresource: input.resource,\n\t\t\t\ttimestamp: timestamp.toISOString(),\n\t\t\t}),\n\t\t)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\treturn `action_${digest || randomUUID()}`;\n}\n\nfunction stableGovernanceEvaluationId(\n\tinput: GovernanceEvaluationInput,\n\ttimestamp: Date,\n): string {\n\tconst explicit = cleanOptionalString(input.evaluationId);\n\tif (explicit) return explicit;\n\tconst digest = createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tworkspaceId: input.workspaceId,\n\t\t\t\tagentId: input.agentId,\n\t\t\t\tpolicyId: input.policyId,\n\t\t\t\tactionType: input.actionType,\n\t\t\t\tdecision: input.decision,\n\t\t\t\ttimestamp: timestamp.toISOString(),\n\t\t\t}),\n\t\t)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\treturn `governance_${digest || randomUUID()}`;\n}\n\nexport function normalizeAgentActionInput(\n\tinput: AgentActionInput,\n): AgentActionRecord {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\"Agent action must be an object.\");\n\t}\n\tconst timestamp =\n\t\tparseDate(input.timestamp, \"action.timestamp\") ?? new Date();\n\tconst type = cleanRequiredString(input.type, \"action.type\").toLowerCase();\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\tconst agentId = cleanOptionalString(input.agentId);\n\tconst resource = cleanOptionalString(input.resource);\n\tconst description = cleanOptionalString(input.description);\n\treturn {\n\t\tactionId: stableActionId(input, timestamp),\n\t\ttype,\n\t\tstatus: cleanOptionalString(input.status)?.toLowerCase() ?? \"success\",\n\t\ttimestamp: timestamp.toISOString(),\n\t\tmetadata: sanitizeMetadata(input.metadata),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(agentId ? { agentId } : {}),\n\t\t...(resource ? { resource } : {}),\n\t\t...(description ? { description } : {}),\n\t};\n}\n\nexport function normalizeGovernanceEvaluationInput(\n\tinput: GovernanceEvaluationInput,\n): GovernanceEvaluationRecord {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\n\t\t\t\"Governance evaluation must be an object.\",\n\t\t);\n\t}\n\tconst timestamp =\n\t\tparseDate(input.timestamp, \"governanceEvents[].timestamp\") ?? new Date();\n\tconst actionType = cleanRequiredString(\n\t\tinput.actionType,\n\t\t\"governanceEvents[].actionType\",\n\t).toLowerCase();\n\tconst decision = cleanRequiredString(\n\t\tinput.decision,\n\t\t\"governanceEvents[].decision\",\n\t).toLowerCase();\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\tconst agentId = cleanOptionalString(input.agentId);\n\tconst policyId = cleanOptionalString(input.policyId);\n\tconst riskLevel = cleanOptionalString(input.riskLevel)?.toLowerCase();\n\tconst reason = cleanOptionalString(input.reason);\n\treturn {\n\t\tevaluationId: stableGovernanceEvaluationId(input, timestamp),\n\t\tactionType,\n\t\tdecision,\n\t\ttimestamp: timestamp.toISOString(),\n\t\tmetadata: sanitizeMetadata(input.metadata),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(agentId ? { agentId } : {}),\n\t\t...(policyId ? { policyId } : {}),\n\t\t...(riskLevel ? { riskLevel } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function normalizeComplianceReportRequest(\n\tinput: ComplianceReportRequest,\n): NormalizedComplianceReportRequest {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\"Report request must be an object.\");\n\t}\n\tconst reportInput = input as ComplianceReportRequest;\n\tconst from = parseDate(reportInput.from, \"from\");\n\tconst to = parseDate(reportInput.to, \"to\");\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new ComplianceValidationError(\"from must be before or equal to to.\");\n\t}\n\tconst actions = Array.isArray(reportInput.actions)\n\t\t? reportInput.actions.map(normalizeAgentActionInput)\n\t\t: [];\n\tconst governanceEvents = Array.isArray(reportInput.governanceEvents)\n\t\t? reportInput.governanceEvents.map(normalizeGovernanceEvaluationInput)\n\t\t: [];\n\tconst workspaceId = cleanOptionalString(reportInput.workspaceId);\n\treturn {\n\t\tframeworks: parseComplianceFrameworks(reportInput.frameworks),\n\t\tactions,\n\t\tgovernanceEvents,\n\t\tincludeEvidence: reportInput.includeEvidence !== false,\n\t\tincludeArtifact: reportInput.includeArtifact !== false,\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function normalizeComplianceEvidenceQuery(input: {\n\tworkspaceId?: unknown;\n\tfrom?: unknown;\n\tto?: unknown;\n}): {\n\tworkspaceId?: string;\n\tfrom?: Date;\n\tto?: Date;\n} {\n\tconst from = parseDate(\n\t\ttypeof input.from === \"string\" || input.from instanceof Date\n\t\t\t? input.from\n\t\t\t: undefined,\n\t\t\"from\",\n\t);\n\tconst to = parseDate(\n\t\ttypeof input.to === \"string\" || input.to instanceof Date\n\t\t\t? input.to\n\t\t\t: undefined,\n\t\t\"to\",\n\t);\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new ComplianceValidationError(\"from must be before or equal to to.\");\n\t}\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\treturn {\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function actionWithinPeriod(\n\taction: AgentActionRecord,\n\tquery: { from?: Date; to?: Date },\n): boolean {\n\tconst timestamp = new Date(action.timestamp).getTime();\n\tif (query.from && timestamp < query.from.getTime()) return false;\n\tif (query.to && timestamp > query.to.getTime()) return false;\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/compliance/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { isRecord } from \"../../utils/json.js\";\nimport {\n\ttype AgentActionInput,\n\ttype AgentActionRecord,\n\tCOMPLIANCE_FRAMEWORKS,\n\ttype ComplianceFramework,\n\ttype ComplianceJsonValue,\n\ttype ComplianceReportRequest,\n\ttype GovernanceEvaluationInput,\n\ttype GovernanceEvaluationRecord,\n\ttype NormalizedComplianceReportRequest,\n} from \"./types.js\";\n\nexport class ComplianceValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ComplianceValidationError\";\n\t}\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new ComplianceValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseDate(\n\tvalue: Date | string | undefined,\n\tlabel: string,\n): Date | undefined {\n\tif (value === undefined) return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(value);\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new ComplianceValidationError(`${label} must be a valid date.`);\n\t}\n\treturn parsed;\n}\n\nexport function parseComplianceFramework(value: string): ComplianceFramework {\n\tconst normalized = value.trim().toLowerCase();\n\tif (COMPLIANCE_FRAMEWORKS.includes(normalized as ComplianceFramework)) {\n\t\treturn normalized as ComplianceFramework;\n\t}\n\tthrow new ComplianceValidationError(\n\t\t\"Invalid compliance framework. Use soc2 or iso27001.\",\n\t);\n}\n\nexport function parseComplianceFrameworks(\n\tvalue: unknown,\n): ComplianceFramework[] {\n\tif (value === undefined || value === null) return [\"soc2\", \"iso27001\"];\n\tif (typeof value === \"string\") {\n\t\treturn Array.from(\n\t\t\tnew Set(\n\t\t\t\tvalue\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((entry) => entry.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map(parseComplianceFramework),\n\t\t\t),\n\t\t);\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new ComplianceValidationError(\"frameworks must be an array.\");\n\t}\n\tconst frameworks = Array.from(\n\t\tnew Set(value.map((entry) => parseComplianceFramework(String(entry)))),\n\t);\n\treturn frameworks.length > 0 ? frameworks : [\"soc2\", \"iso27001\"];\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): ComplianceJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\")\n\t\treturn Number.isFinite(value) ? value : undefined;\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is ComplianceJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, ComplianceJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction sanitizeMetadata(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, ComplianceJsonValue> {\n\tif (!value) return {};\n\tconst sanitized = sanitizeJsonValue(value);\n\treturn isRecord(sanitized)\n\t\t? (sanitized as Record<string, ComplianceJsonValue>)\n\t\t: {};\n}\n\nfunction stableActionId(input: AgentActionInput, timestamp: Date): string {\n\tconst explicit = cleanOptionalString(input.actionId);\n\tif (explicit) return explicit;\n\tconst digest = createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tworkspaceId: input.workspaceId,\n\t\t\t\tagentId: input.agentId,\n\t\t\t\ttype: input.type,\n\t\t\t\tresource: input.resource,\n\t\t\t\ttimestamp: timestamp.toISOString(),\n\t\t\t}),\n\t\t)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\treturn `action_${digest || randomUUID()}`;\n}\n\nfunction stableGovernanceEvaluationId(\n\tinput: GovernanceEvaluationInput,\n\ttimestamp: Date,\n): string {\n\tconst explicit = cleanOptionalString(input.evaluationId);\n\tif (explicit) return explicit;\n\tconst digest = createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tworkspaceId: input.workspaceId,\n\t\t\t\tagentId: input.agentId,\n\t\t\t\tpolicyId: input.policyId,\n\t\t\t\tactionType: input.actionType,\n\t\t\t\tdecision: input.decision,\n\t\t\t\ttimestamp: timestamp.toISOString(),\n\t\t\t}),\n\t\t)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\treturn `governance_${digest || randomUUID()}`;\n}\n\nexport function normalizeAgentActionInput(\n\tinput: AgentActionInput,\n): AgentActionRecord {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\"Agent action must be an object.\");\n\t}\n\tconst timestamp =\n\t\tparseDate(input.timestamp, \"action.timestamp\") ?? new Date();\n\tconst type = cleanRequiredString(input.type, \"action.type\").toLowerCase();\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\tconst agentId = cleanOptionalString(input.agentId);\n\tconst resource = cleanOptionalString(input.resource);\n\tconst description = cleanOptionalString(input.description);\n\treturn {\n\t\tactionId: stableActionId(input, timestamp),\n\t\ttype,\n\t\tstatus: cleanOptionalString(input.status)?.toLowerCase() ?? \"success\",\n\t\ttimestamp: timestamp.toISOString(),\n\t\tmetadata: sanitizeMetadata(input.metadata),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(agentId ? { agentId } : {}),\n\t\t...(resource ? { resource } : {}),\n\t\t...(description ? { description } : {}),\n\t};\n}\n\nexport function normalizeGovernanceEvaluationInput(\n\tinput: GovernanceEvaluationInput,\n): GovernanceEvaluationRecord {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\n\t\t\t\"Governance evaluation must be an object.\",\n\t\t);\n\t}\n\tconst timestamp =\n\t\tparseDate(input.timestamp, \"governanceEvents[].timestamp\") ?? new Date();\n\tconst actionType = cleanRequiredString(\n\t\tinput.actionType,\n\t\t\"governanceEvents[].actionType\",\n\t).toLowerCase();\n\tconst decision = cleanRequiredString(\n\t\tinput.decision,\n\t\t\"governanceEvents[].decision\",\n\t).toLowerCase();\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\tconst agentId = cleanOptionalString(input.agentId);\n\tconst policyId = cleanOptionalString(input.policyId);\n\tconst riskLevel = cleanOptionalString(input.riskLevel)?.toLowerCase();\n\tconst reason = cleanOptionalString(input.reason);\n\treturn {\n\t\tevaluationId: stableGovernanceEvaluationId(input, timestamp),\n\t\tactionType,\n\t\tdecision,\n\t\ttimestamp: timestamp.toISOString(),\n\t\tmetadata: sanitizeMetadata(input.metadata),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(agentId ? { agentId } : {}),\n\t\t...(policyId ? { policyId } : {}),\n\t\t...(riskLevel ? { riskLevel } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function normalizeComplianceReportRequest(\n\tinput: ComplianceReportRequest,\n): NormalizedComplianceReportRequest {\n\tif (!isRecord(input)) {\n\t\tthrow new ComplianceValidationError(\"Report request must be an object.\");\n\t}\n\tconst reportInput = input as ComplianceReportRequest;\n\tconst from = parseDate(reportInput.from, \"from\");\n\tconst to = parseDate(reportInput.to, \"to\");\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new ComplianceValidationError(\"from must be before or equal to to.\");\n\t}\n\tconst actions = Array.isArray(reportInput.actions)\n\t\t? reportInput.actions.map(normalizeAgentActionInput)\n\t\t: [];\n\tconst governanceEvents = Array.isArray(reportInput.governanceEvents)\n\t\t? reportInput.governanceEvents.map(normalizeGovernanceEvaluationInput)\n\t\t: [];\n\tconst workspaceId = cleanOptionalString(reportInput.workspaceId);\n\treturn {\n\t\tframeworks: parseComplianceFrameworks(reportInput.frameworks),\n\t\tactions,\n\t\tgovernanceEvents,\n\t\tincludeEvidence: reportInput.includeEvidence !== false,\n\t\tincludeArtifact: reportInput.includeArtifact !== false,\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function normalizeComplianceEvidenceQuery(input: {\n\tworkspaceId?: unknown;\n\tfrom?: unknown;\n\tto?: unknown;\n}): {\n\tworkspaceId?: string;\n\tfrom?: Date;\n\tto?: Date;\n} {\n\tconst from = parseDate(\n\t\ttypeof input.from === \"string\" || input.from instanceof Date\n\t\t\t? input.from\n\t\t\t: undefined,\n\t\t\"from\",\n\t);\n\tconst to = parseDate(\n\t\ttypeof input.to === \"string\" || input.to instanceof Date\n\t\t\t? input.to\n\t\t\t: undefined,\n\t\t\"to\",\n\t);\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new ComplianceValidationError(\"from must be before or equal to to.\");\n\t}\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\treturn {\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function actionWithinPeriod(\n\taction: AgentActionRecord,\n\tquery: { from?: Date; to?: Date },\n): boolean {\n\tconst timestamp = new Date(action.timestamp).getTime();\n\tif (query.from && timestamp < query.from.getTime()) return false;\n\tif (query.to && timestamp > query.to.getTime()) return false;\n\treturn true;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/intelligent-router/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAEjC,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,gCAAiC,SAAQ,KAAK;gBAC9C,OAAO,EAAE,MAAM;CAI3B;AAuED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAQpE;AA4DD,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,sBAAsB,EAAE,qBAAqB,EAAE,GAC7C,cAAc,CAyBhB;AAED,MAAM,MAAM,qCAAqC,GAChD,2BAA2B,GAAG;IAC7B,MAAM,EAAE,4BAA4B,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEH,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,2BAA2B,GAChC,qCAAqC,CAiCvC;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,oBAAoB,GACzB,oBAAoB,CActB"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/intelligent-router/normalize.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAEjC,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,gCAAiC,SAAQ,KAAK;gBAC9C,OAAO,EAAE,MAAM;CAI3B;AAmED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAQpE;AA4DD,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,sBAAsB,EAAE,qBAAqB,EAAE,GAC7C,cAAc,CAyBhB;AAED,MAAM,MAAM,qCAAqC,GAChD,2BAA2B,GAAG;IAC7B,MAAM,EAAE,4BAA4B,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEH,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,2BAA2B,GAChC,qCAAqC,CAiCvC;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,oBAAoB,GACzB,oBAAoB,CActB"}
@@ -1,3 +1,4 @@
1
+ import { isRecord } from "../../utils/json.js";
1
2
  import { MODEL_PERFORMANCE_METRIC_SOURCES, ROUTING_STRATEGIES, } from "./types.js";
2
3
  export class IntelligentRouterValidationError extends Error {
3
4
  constructor(message) {
@@ -5,9 +6,6 @@ export class IntelligentRouterValidationError extends Error {
5
6
  this.name = "IntelligentRouterValidationError";
6
7
  }
7
8
  }
8
- function isRecord(value) {
9
- return typeof value === "object" && value !== null && !Array.isArray(value);
10
- }
11
9
  function cleanOptionalString(value) {
12
10
  if (typeof value !== "string")
13
11
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/intelligent-router/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tMODEL_PERFORMANCE_METRIC_SOURCES,\n\ttype ModelPerformanceMetricInput,\n\ttype ModelPerformanceMetricSource,\n\tROUTING_STRATEGIES,\n\ttype RoutingModelCandidate,\n\ttype RoutingOverrideInput,\n\ttype RoutingRequest,\n\ttype RoutingRequestInput,\n\ttype RoutingStrategy,\n} from \"./types.js\";\n\nexport class IntelligentRouterValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"IntelligentRouterValidationError\";\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new IntelligentRouterValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseFiniteNumber(value: unknown, label: string): number | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = typeof value === \"number\" ? value : Number(value);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new IntelligentRouterValidationError(`${label} must be a number.`);\n\t}\n\treturn parsed;\n}\n\nfunction parseOptionalBoolean(value: unknown): boolean | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tif (typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") {\n\t\tconst normalized = value.trim().toLowerCase();\n\t\tif (normalized === \"true\") return true;\n\t\tif (normalized === \"false\") return false;\n\t}\n\tthrow new IntelligentRouterValidationError(\"success must be a boolean.\");\n}\n\nfunction parseMetricSource(value: unknown): ModelPerformanceMetricSource {\n\tif (value === undefined || value === null) return \"production\";\n\tif (typeof value !== \"string\") {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"source must be production or eval.\",\n\t\t);\n\t}\n\tconst normalized = value.trim().toLowerCase();\n\tif (\n\t\tMODEL_PERFORMANCE_METRIC_SOURCES.includes(\n\t\t\tnormalized as ModelPerformanceMetricSource,\n\t\t)\n\t) {\n\t\treturn normalized as ModelPerformanceMetricSource;\n\t}\n\tthrow new IntelligentRouterValidationError(\n\t\t\"source must be production or eval.\",\n\t);\n}\n\nfunction parseOptionalDate(value: unknown, label: string): Date | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(String(value));\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t`${label} must be a valid date.`,\n\t\t);\n\t}\n\treturn parsed;\n}\n\nexport function parseRoutingStrategy(value: unknown): RoutingStrategy {\n\tconst normalized = cleanOptionalString(value)?.toLowerCase() ?? \"balanced\";\n\tif (ROUTING_STRATEGIES.includes(normalized as RoutingStrategy)) {\n\t\treturn normalized as RoutingStrategy;\n\t}\n\tthrow new IntelligentRouterValidationError(\n\t\t\"Invalid routing strategy. Use balanced, quality, cost, or latency.\",\n\t);\n}\n\nfunction normalizeUnavailableModels(value: unknown): string[] {\n\tif (value === undefined || value === null) return [];\n\tif (typeof value === \"string\") {\n\t\treturn value\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"unavailableModels must be an array or comma-separated string.\",\n\t\t);\n\t}\n\treturn value.map((entry) => String(entry).trim()).filter(Boolean);\n}\n\nfunction normalizeAvailableModels(value: unknown): RoutingModelCandidate[] {\n\tif (value === undefined || value === null) return [];\n\tif (!Array.isArray(value)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"availableModels must be an array.\",\n\t\t);\n\t}\n\treturn value.filter(isRecord).map((entry) => {\n\t\tconst provider = cleanRequiredString(entry.provider, \"provider\");\n\t\tconst model = cleanRequiredString(entry.model, \"model\");\n\t\tconst name = cleanOptionalString(entry.name);\n\t\tconst available =\n\t\t\ttypeof entry.available === \"boolean\" ? entry.available : undefined;\n\t\tconst cost = (() => {\n\t\t\tif (!isRecord(entry.cost)) return undefined;\n\t\t\tconst input = parseFiniteNumber(entry.cost.input, \"cost.input\");\n\t\t\tconst output = parseFiniteNumber(entry.cost.output, \"cost.output\");\n\t\t\tconst cacheRead = parseFiniteNumber(\n\t\t\t\tentry.cost.cacheRead,\n\t\t\t\t\"cost.cacheRead\",\n\t\t\t);\n\t\t\tconst cacheWrite = parseFiniteNumber(\n\t\t\t\tentry.cost.cacheWrite,\n\t\t\t\t\"cost.cacheWrite\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\t...(input !== undefined ? { input } : {}),\n\t\t\t\t...(output !== undefined ? { output } : {}),\n\t\t\t\t...(cacheRead !== undefined ? { cacheRead } : {}),\n\t\t\t\t...(cacheWrite !== undefined ? { cacheWrite } : {}),\n\t\t\t};\n\t\t})();\n\t\treturn {\n\t\t\tprovider,\n\t\t\tmodel,\n\t\t\t...(name ? { name } : {}),\n\t\t\t...(cost && Object.keys(cost).length > 0 ? { cost } : {}),\n\t\t\t...(available !== undefined ? { available } : {}),\n\t\t};\n\t});\n}\n\nexport function normalizeRoutingRequest(\n\tinput: RoutingRequestInput,\n\tdefaultAvailableModels: RoutingModelCandidate[],\n): RoutingRequest {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"Routing request must be an object.\",\n\t\t);\n\t}\n\tconst requestInput = input as RoutingRequestInput;\n\tconst taskType = cleanOptionalString(requestInput.taskType) ?? \"chat\";\n\tconst modelHint =\n\t\tcleanOptionalString(requestInput.modelHint) ??\n\t\tcleanOptionalString(requestInput.model_hint);\n\tconst unavailableModels = normalizeUnavailableModels(\n\t\trequestInput.unavailableModels ?? requestInput.unavailable_models,\n\t);\n\tconst availableModels = normalizeAvailableModels(\n\t\trequestInput.availableModels,\n\t);\n\treturn {\n\t\ttaskType,\n\t\tstrategy: parseRoutingStrategy(requestInput.strategy),\n\t\tunavailableModels,\n\t\tavailableModels:\n\t\t\tavailableModels.length > 0 ? availableModels : defaultAvailableModels,\n\t\t...(modelHint ? { modelHint } : {}),\n\t};\n}\n\nexport type NormalizedModelPerformanceMetricInput =\n\tModelPerformanceMetricInput & {\n\t\tsource: ModelPerformanceMetricSource;\n\t\tlatencyMs: number;\n\t\tsuccess: boolean;\n\t\tcostUsd: number;\n\t\tqualityScore: number;\n\t\toccurredAt: Date | string;\n\t};\n\nexport function normalizePerformanceMetricInput(\n\tinput: ModelPerformanceMetricInput,\n): NormalizedModelPerformanceMetricInput {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\"Metric must be an object.\");\n\t}\n\tconst metricInput = input as ModelPerformanceMetricInput;\n\tconst latencyMs = parseFiniteNumber(metricInput.latencyMs, \"latencyMs\") ?? 0;\n\tconst costUsd = parseFiniteNumber(metricInput.costUsd, \"costUsd\") ?? 0;\n\tconst qualityScore =\n\t\tparseFiniteNumber(metricInput.qualityScore, \"qualityScore\") ?? 0.5;\n\tif (latencyMs < 0) {\n\t\tthrow new IntelligentRouterValidationError(\"latencyMs cannot be negative.\");\n\t}\n\tif (costUsd < 0) {\n\t\tthrow new IntelligentRouterValidationError(\"costUsd cannot be negative.\");\n\t}\n\treturn {\n\t\ttaskType: cleanRequiredString(metricInput.taskType, \"taskType\"),\n\t\tprovider: cleanRequiredString(metricInput.provider, \"provider\"),\n\t\tmodel: cleanRequiredString(metricInput.model, \"model\"),\n\t\tsource: parseMetricSource(metricInput.source),\n\t\tlatencyMs,\n\t\tsuccess: parseOptionalBoolean(metricInput.success) ?? true,\n\t\tcostUsd,\n\t\tqualityScore: Math.max(0, Math.min(1, qualityScore)),\n\t\t...(cleanOptionalString(metricInput.evalSuite)\n\t\t\t? { evalSuite: cleanOptionalString(metricInput.evalSuite) }\n\t\t\t: {}),\n\t\t...(cleanOptionalString(metricInput.evalCase)\n\t\t\t? { evalCase: cleanOptionalString(metricInput.evalCase) }\n\t\t\t: {}),\n\t\toccurredAt:\n\t\t\tparseOptionalDate(metricInput.occurredAt, \"occurredAt\") ?? new Date(),\n\t};\n}\n\nexport function normalizeRoutingOverrideInput(\n\tinput: RoutingOverrideInput,\n): RoutingOverrideInput {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\"Override must be an object.\");\n\t}\n\tconst overrideInput = input as RoutingOverrideInput;\n\tconst reason = cleanOptionalString(overrideInput.reason);\n\tconst expiresAt = parseOptionalDate(overrideInput.expiresAt, \"expiresAt\");\n\treturn {\n\t\ttaskType: cleanRequiredString(overrideInput.taskType, \"taskType\"),\n\t\tprovider: cleanRequiredString(overrideInput.provider, \"provider\"),\n\t\tmodel: cleanRequiredString(overrideInput.model, \"model\"),\n\t\t...(reason ? { reason } : {}),\n\t\t...(expiresAt ? { expiresAt } : {}),\n\t};\n}\n"]}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/intelligent-router/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from \"../../utils/json.js\";\nimport {\n\tMODEL_PERFORMANCE_METRIC_SOURCES,\n\ttype ModelPerformanceMetricInput,\n\ttype ModelPerformanceMetricSource,\n\tROUTING_STRATEGIES,\n\ttype RoutingModelCandidate,\n\ttype RoutingOverrideInput,\n\ttype RoutingRequest,\n\ttype RoutingRequestInput,\n\ttype RoutingStrategy,\n} from \"./types.js\";\n\nexport class IntelligentRouterValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"IntelligentRouterValidationError\";\n\t}\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new IntelligentRouterValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseFiniteNumber(value: unknown, label: string): number | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = typeof value === \"number\" ? value : Number(value);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new IntelligentRouterValidationError(`${label} must be a number.`);\n\t}\n\treturn parsed;\n}\n\nfunction parseOptionalBoolean(value: unknown): boolean | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tif (typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") {\n\t\tconst normalized = value.trim().toLowerCase();\n\t\tif (normalized === \"true\") return true;\n\t\tif (normalized === \"false\") return false;\n\t}\n\tthrow new IntelligentRouterValidationError(\"success must be a boolean.\");\n}\n\nfunction parseMetricSource(value: unknown): ModelPerformanceMetricSource {\n\tif (value === undefined || value === null) return \"production\";\n\tif (typeof value !== \"string\") {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"source must be production or eval.\",\n\t\t);\n\t}\n\tconst normalized = value.trim().toLowerCase();\n\tif (\n\t\tMODEL_PERFORMANCE_METRIC_SOURCES.includes(\n\t\t\tnormalized as ModelPerformanceMetricSource,\n\t\t)\n\t) {\n\t\treturn normalized as ModelPerformanceMetricSource;\n\t}\n\tthrow new IntelligentRouterValidationError(\n\t\t\"source must be production or eval.\",\n\t);\n}\n\nfunction parseOptionalDate(value: unknown, label: string): Date | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(String(value));\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t`${label} must be a valid date.`,\n\t\t);\n\t}\n\treturn parsed;\n}\n\nexport function parseRoutingStrategy(value: unknown): RoutingStrategy {\n\tconst normalized = cleanOptionalString(value)?.toLowerCase() ?? \"balanced\";\n\tif (ROUTING_STRATEGIES.includes(normalized as RoutingStrategy)) {\n\t\treturn normalized as RoutingStrategy;\n\t}\n\tthrow new IntelligentRouterValidationError(\n\t\t\"Invalid routing strategy. Use balanced, quality, cost, or latency.\",\n\t);\n}\n\nfunction normalizeUnavailableModels(value: unknown): string[] {\n\tif (value === undefined || value === null) return [];\n\tif (typeof value === \"string\") {\n\t\treturn value\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"unavailableModels must be an array or comma-separated string.\",\n\t\t);\n\t}\n\treturn value.map((entry) => String(entry).trim()).filter(Boolean);\n}\n\nfunction normalizeAvailableModels(value: unknown): RoutingModelCandidate[] {\n\tif (value === undefined || value === null) return [];\n\tif (!Array.isArray(value)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"availableModels must be an array.\",\n\t\t);\n\t}\n\treturn value.filter(isRecord).map((entry) => {\n\t\tconst provider = cleanRequiredString(entry.provider, \"provider\");\n\t\tconst model = cleanRequiredString(entry.model, \"model\");\n\t\tconst name = cleanOptionalString(entry.name);\n\t\tconst available =\n\t\t\ttypeof entry.available === \"boolean\" ? entry.available : undefined;\n\t\tconst cost = (() => {\n\t\t\tif (!isRecord(entry.cost)) return undefined;\n\t\t\tconst input = parseFiniteNumber(entry.cost.input, \"cost.input\");\n\t\t\tconst output = parseFiniteNumber(entry.cost.output, \"cost.output\");\n\t\t\tconst cacheRead = parseFiniteNumber(\n\t\t\t\tentry.cost.cacheRead,\n\t\t\t\t\"cost.cacheRead\",\n\t\t\t);\n\t\t\tconst cacheWrite = parseFiniteNumber(\n\t\t\t\tentry.cost.cacheWrite,\n\t\t\t\t\"cost.cacheWrite\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\t...(input !== undefined ? { input } : {}),\n\t\t\t\t...(output !== undefined ? { output } : {}),\n\t\t\t\t...(cacheRead !== undefined ? { cacheRead } : {}),\n\t\t\t\t...(cacheWrite !== undefined ? { cacheWrite } : {}),\n\t\t\t};\n\t\t})();\n\t\treturn {\n\t\t\tprovider,\n\t\t\tmodel,\n\t\t\t...(name ? { name } : {}),\n\t\t\t...(cost && Object.keys(cost).length > 0 ? { cost } : {}),\n\t\t\t...(available !== undefined ? { available } : {}),\n\t\t};\n\t});\n}\n\nexport function normalizeRoutingRequest(\n\tinput: RoutingRequestInput,\n\tdefaultAvailableModels: RoutingModelCandidate[],\n): RoutingRequest {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\n\t\t\t\"Routing request must be an object.\",\n\t\t);\n\t}\n\tconst requestInput = input as RoutingRequestInput;\n\tconst taskType = cleanOptionalString(requestInput.taskType) ?? \"chat\";\n\tconst modelHint =\n\t\tcleanOptionalString(requestInput.modelHint) ??\n\t\tcleanOptionalString(requestInput.model_hint);\n\tconst unavailableModels = normalizeUnavailableModels(\n\t\trequestInput.unavailableModels ?? requestInput.unavailable_models,\n\t);\n\tconst availableModels = normalizeAvailableModels(\n\t\trequestInput.availableModels,\n\t);\n\treturn {\n\t\ttaskType,\n\t\tstrategy: parseRoutingStrategy(requestInput.strategy),\n\t\tunavailableModels,\n\t\tavailableModels:\n\t\t\tavailableModels.length > 0 ? availableModels : defaultAvailableModels,\n\t\t...(modelHint ? { modelHint } : {}),\n\t};\n}\n\nexport type NormalizedModelPerformanceMetricInput =\n\tModelPerformanceMetricInput & {\n\t\tsource: ModelPerformanceMetricSource;\n\t\tlatencyMs: number;\n\t\tsuccess: boolean;\n\t\tcostUsd: number;\n\t\tqualityScore: number;\n\t\toccurredAt: Date | string;\n\t};\n\nexport function normalizePerformanceMetricInput(\n\tinput: ModelPerformanceMetricInput,\n): NormalizedModelPerformanceMetricInput {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\"Metric must be an object.\");\n\t}\n\tconst metricInput = input as ModelPerformanceMetricInput;\n\tconst latencyMs = parseFiniteNumber(metricInput.latencyMs, \"latencyMs\") ?? 0;\n\tconst costUsd = parseFiniteNumber(metricInput.costUsd, \"costUsd\") ?? 0;\n\tconst qualityScore =\n\t\tparseFiniteNumber(metricInput.qualityScore, \"qualityScore\") ?? 0.5;\n\tif (latencyMs < 0) {\n\t\tthrow new IntelligentRouterValidationError(\"latencyMs cannot be negative.\");\n\t}\n\tif (costUsd < 0) {\n\t\tthrow new IntelligentRouterValidationError(\"costUsd cannot be negative.\");\n\t}\n\treturn {\n\t\ttaskType: cleanRequiredString(metricInput.taskType, \"taskType\"),\n\t\tprovider: cleanRequiredString(metricInput.provider, \"provider\"),\n\t\tmodel: cleanRequiredString(metricInput.model, \"model\"),\n\t\tsource: parseMetricSource(metricInput.source),\n\t\tlatencyMs,\n\t\tsuccess: parseOptionalBoolean(metricInput.success) ?? true,\n\t\tcostUsd,\n\t\tqualityScore: Math.max(0, Math.min(1, qualityScore)),\n\t\t...(cleanOptionalString(metricInput.evalSuite)\n\t\t\t? { evalSuite: cleanOptionalString(metricInput.evalSuite) }\n\t\t\t: {}),\n\t\t...(cleanOptionalString(metricInput.evalCase)\n\t\t\t? { evalCase: cleanOptionalString(metricInput.evalCase) }\n\t\t\t: {}),\n\t\toccurredAt:\n\t\t\tparseOptionalDate(metricInput.occurredAt, \"occurredAt\") ?? new Date(),\n\t};\n}\n\nexport function normalizeRoutingOverrideInput(\n\tinput: RoutingOverrideInput,\n): RoutingOverrideInput {\n\tif (!isRecord(input)) {\n\t\tthrow new IntelligentRouterValidationError(\"Override must be an object.\");\n\t}\n\tconst overrideInput = input as RoutingOverrideInput;\n\tconst reason = cleanOptionalString(overrideInput.reason);\n\tconst expiresAt = parseOptionalDate(overrideInput.expiresAt, \"expiresAt\");\n\treturn {\n\t\ttaskType: cleanRequiredString(overrideInput.taskType, \"taskType\"),\n\t\tprovider: cleanRequiredString(overrideInput.provider, \"provider\"),\n\t\tmodel: cleanRequiredString(overrideInput.model, \"model\"),\n\t\t...(reason ? { reason } : {}),\n\t\t...(expiresAt ? { expiresAt } : {}),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/revenue-attribution/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,MAAM,YAAY,CAAC;AAEpB,qBAAa,iCAAkC,SAAQ,KAAK;gBAC/C,OAAO,EAAE,MAAM;CAI3B;AA+HD,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,mBAAmB,GACxB,wBAAwB,CA6B1B;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACb,GAAG,0BAA0B,CAe7B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/revenue-attribution/normalize.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,MAAM,YAAY,CAAC;AAEpB,qBAAa,iCAAkC,SAAQ,KAAK;gBAC/C,OAAO,EAAE,MAAM;CAI3B;AA2HD,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,mBAAmB,GACxB,wBAAwB,CA6B1B;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACb,GAAG,0BAA0B,CAe7B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -1,3 +1,4 @@
1
+ import { isRecord } from "../../utils/json.js";
1
2
  import { ATTRIBUTION_MODELS, } from "./types.js";
2
3
  export class RevenueAttributionValidationError extends Error {
3
4
  constructor(message) {
@@ -5,9 +6,6 @@ export class RevenueAttributionValidationError extends Error {
5
6
  this.name = "RevenueAttributionValidationError";
6
7
  }
7
8
  }
8
- function isRecord(value) {
9
- return typeof value === "object" && value !== null && !Array.isArray(value);
10
- }
11
9
  function cleanOptionalString(value) {
12
10
  if (typeof value !== "string")
13
11
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/revenue-attribution/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB,GAMlB,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAC3D,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IACjD,CAAC;CACD;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACzD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,iCAAiC,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa;IAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,MAAM,MAAM,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,iCAAiC,CAC1C,GAAG,KAAK,wBAAwB,CAChC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,iCAAiC,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,iCAAiC,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC5C,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC;IACzE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAA8B,CAAC,EAAE,CAAC;QACjE,OAAO,UAA8B,CAAC;IACvC,CAAC;IACD,MAAM,IAAI,iCAAiC,CAC1C,wEAAwE,CACxE,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA0B;IAC5D,MAAM,WAAW,GAAG,WAAW,CAC9B,KAAK,CAAC,oBAAoB,EAC1B,sBAAsB,CACtB,CAAC;IACF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;YAC5C,MAAM,IAAI,iCAAiC,CAC1C,mDAAmD,CACnD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,iCAAiC,CAC1C,4CAA4C,CAC5C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CACzB,KAAc,EACd,KAAK,GAAG,CAAC;IAET,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;aACjD,MAAM,CAAC,CAAC,IAAI,EAAgC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YACzB,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CACxB,KAA0C;IAE1C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC,SAAS,CAAC;QACzB,CAAC,CAAE,SAAkD;QACrD,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC3C,KAA0B;IAE1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,iCAAiC,CAAC,4BAA4B,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,YAAY,GAAG,KAA4B,CAAC;IAClD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO;QACN,WAAW,EAAE,mBAAmB,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,CAAC;QACzE,OAAO,EAAE,mBAAmB,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC;QAC7D,SAAS,EAAE,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC;QACnE,WAAW,EAAE,mBAAmB,CAC/B,YAAY,CAAC,WAAW,EACxB,aAAa,CACb,CAAC,WAAW,EAAE;QACf,gBAAgB,EAAE,qBAAqB,CAAC,YAAY,CAAC,gBAAgB,CAAC;QACtE,oBAAoB,EAAE,yBAAyB,CAAC,YAAY,CAAC;QAC7D,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC;QACpE,sBAAsB,EAAE,WAAW,CAClC,YAAY,CAAC,gBAAgB,EAC7B,kBAAkB,CAClB;QACD,aAAa,EAAE,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC;QAC3D,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC;QACpD,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE;QAC1E,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,KAKnD;IACA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,iCAAiC,CAC1C,qCAAqC,CACrC,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3D,OAAO;QACN,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;QACtD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,OAAO,MAAM,GAAG,SAAS,CAAC;AAC3B,CAAC","sourcesContent":["import {\n\tATTRIBUTION_MODELS,\n\ttype AttributionJsonValue,\n\ttype AttributionModel,\n\ttype NormalizedRevenueOutcome,\n\ttype RevenueAttributionRoiQuery,\n\ttype RevenueOutcomeInput,\n} from \"./types.js\";\n\nexport class RevenueAttributionValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RevenueAttributionValidationError\";\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new RevenueAttributionValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseDate(value: unknown, label: string): Date | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(String(value));\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t`${label} must be a valid date.`,\n\t\t);\n\t}\n\treturn parsed;\n}\n\nfunction parseNumber(value: unknown, label: string): number | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = typeof value === \"number\" ? value : Number(value);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new RevenueAttributionValidationError(`${label} must be a number.`);\n\t}\n\treturn parsed;\n}\n\nfunction nonNegativeNumber(value: unknown, label: string): number {\n\tconst parsed = parseNumber(value, label) ?? 0;\n\tif (parsed < 0) {\n\t\tthrow new RevenueAttributionValidationError(`${label} cannot be negative.`);\n\t}\n\treturn parsed;\n}\n\nfunction toUsdMicros(value: unknown, label: string): number {\n\treturn Math.round(nonNegativeNumber(value, label) * 1_000_000);\n}\n\nfunction parseDurationMs(value: unknown): number {\n\treturn Math.floor(nonNegativeNumber(value, \"durationMs\"));\n}\n\nfunction parseAttributionModel(value: unknown): AttributionModel {\n\tconst normalized = cleanOptionalString(value)?.toLowerCase() ?? \"direct\";\n\tif (ATTRIBUTION_MODELS.includes(normalized as AttributionModel)) {\n\t\treturn normalized as AttributionModel;\n\t}\n\tthrow new RevenueAttributionValidationError(\n\t\t\"Invalid attributionModel. Use direct, assisted, influenced, or custom.\",\n\t);\n}\n\nfunction parseAttributionWeightBps(input: RevenueOutcomeInput): number {\n\tconst explicitBps = parseNumber(\n\t\tinput.attributionWeightBps,\n\t\t\"attributionWeightBps\",\n\t);\n\tif (explicitBps !== undefined) {\n\t\tif (explicitBps < 0 || explicitBps > 10000) {\n\t\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\t\"attributionWeightBps must be between 0 and 10000.\",\n\t\t\t);\n\t\t}\n\t\treturn Math.round(explicitBps);\n\t}\n\tconst weight = parseNumber(input.attributionWeight, \"attributionWeight\");\n\tif (weight === undefined) return 10000;\n\tif (weight < 0 || weight > 1) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\"attributionWeight must be between 0 and 1.\",\n\t\t);\n\t}\n\treturn Math.round(weight * 10000);\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): AttributionJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\")\n\t\treturn Number.isFinite(value) ? value : undefined;\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is AttributionJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, AttributionJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction sanitizeMetadata(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, AttributionJsonValue> {\n\tif (!value) return {};\n\tconst sanitized = sanitizeJsonValue(value);\n\treturn isRecord(sanitized)\n\t\t? (sanitized as Record<string, AttributionJsonValue>)\n\t\t: {};\n}\n\nexport function normalizeRevenueOutcomeInput(\n\tinput: RevenueOutcomeInput,\n): NormalizedRevenueOutcome {\n\tif (!isRecord(input)) {\n\t\tthrow new RevenueAttributionValidationError(\"Outcome must be an object.\");\n\t}\n\tconst outcomeInput = input as RevenueOutcomeInput;\n\tconst actionId = cleanOptionalString(outcomeInput.actionId);\n\tconst traceId = cleanOptionalString(outcomeInput.traceId);\n\treturn {\n\t\tworkspaceId: cleanRequiredString(outcomeInput.workspaceId, \"workspaceId\"),\n\t\tagentId: cleanRequiredString(outcomeInput.agentId, \"agentId\"),\n\t\toutcomeId: cleanRequiredString(outcomeInput.outcomeId, \"outcomeId\"),\n\t\toutcomeType: cleanRequiredString(\n\t\t\toutcomeInput.outcomeType,\n\t\t\t\"outcomeType\",\n\t\t).toLowerCase(),\n\t\tattributionModel: parseAttributionModel(outcomeInput.attributionModel),\n\t\tattributionWeightBps: parseAttributionWeightBps(outcomeInput),\n\t\trevenueUsdMicros: toUsdMicros(outcomeInput.revenueUsd, \"revenueUsd\"),\n\t\tpipelineValueUsdMicros: toUsdMicros(\n\t\t\toutcomeInput.pipelineValueUsd,\n\t\t\t\"pipelineValueUsd\",\n\t\t),\n\t\tcostUsdMicros: toUsdMicros(outcomeInput.costUsd, \"costUsd\"),\n\t\tdurationMs: parseDurationMs(outcomeInput.durationMs),\n\t\toccurredAt: parseDate(outcomeInput.occurredAt, \"occurredAt\") ?? new Date(),\n\t\tmetadata: sanitizeMetadata(outcomeInput.metadata),\n\t\t...(actionId ? { actionId } : {}),\n\t\t...(traceId ? { traceId } : {}),\n\t};\n}\n\nexport function normalizeRevenueAttributionRoiQuery(input: {\n\tagentId?: unknown;\n\tworkspaceId?: unknown;\n\tfrom?: unknown;\n\tto?: unknown;\n}): RevenueAttributionRoiQuery {\n\tconst from = parseDate(input.from, \"from\");\n\tconst to = parseDate(input.to, \"to\");\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\"from must be before or equal to to.\",\n\t\t);\n\t}\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\treturn {\n\t\tagentId: cleanRequiredString(input.agentId, \"agentId\"),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function usdFromMicros(micros: number): number {\n\treturn micros / 1_000_000;\n}\n"]}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/revenue-attribution/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from \"../../utils/json.js\";\nimport {\n\tATTRIBUTION_MODELS,\n\ttype AttributionJsonValue,\n\ttype AttributionModel,\n\ttype NormalizedRevenueOutcome,\n\ttype RevenueAttributionRoiQuery,\n\ttype RevenueOutcomeInput,\n} from \"./types.js\";\n\nexport class RevenueAttributionValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RevenueAttributionValidationError\";\n\t}\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tconst trimmed = cleanOptionalString(value);\n\tif (!trimmed) {\n\t\tthrow new RevenueAttributionValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nfunction parseDate(value: unknown, label: string): Date | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = value instanceof Date ? value : new Date(String(value));\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t`${label} must be a valid date.`,\n\t\t);\n\t}\n\treturn parsed;\n}\n\nfunction parseNumber(value: unknown, label: string): number | undefined {\n\tif (value === undefined || value === null || value === \"\") return undefined;\n\tconst parsed = typeof value === \"number\" ? value : Number(value);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new RevenueAttributionValidationError(`${label} must be a number.`);\n\t}\n\treturn parsed;\n}\n\nfunction nonNegativeNumber(value: unknown, label: string): number {\n\tconst parsed = parseNumber(value, label) ?? 0;\n\tif (parsed < 0) {\n\t\tthrow new RevenueAttributionValidationError(`${label} cannot be negative.`);\n\t}\n\treturn parsed;\n}\n\nfunction toUsdMicros(value: unknown, label: string): number {\n\treturn Math.round(nonNegativeNumber(value, label) * 1_000_000);\n}\n\nfunction parseDurationMs(value: unknown): number {\n\treturn Math.floor(nonNegativeNumber(value, \"durationMs\"));\n}\n\nfunction parseAttributionModel(value: unknown): AttributionModel {\n\tconst normalized = cleanOptionalString(value)?.toLowerCase() ?? \"direct\";\n\tif (ATTRIBUTION_MODELS.includes(normalized as AttributionModel)) {\n\t\treturn normalized as AttributionModel;\n\t}\n\tthrow new RevenueAttributionValidationError(\n\t\t\"Invalid attributionModel. Use direct, assisted, influenced, or custom.\",\n\t);\n}\n\nfunction parseAttributionWeightBps(input: RevenueOutcomeInput): number {\n\tconst explicitBps = parseNumber(\n\t\tinput.attributionWeightBps,\n\t\t\"attributionWeightBps\",\n\t);\n\tif (explicitBps !== undefined) {\n\t\tif (explicitBps < 0 || explicitBps > 10000) {\n\t\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\t\"attributionWeightBps must be between 0 and 10000.\",\n\t\t\t);\n\t\t}\n\t\treturn Math.round(explicitBps);\n\t}\n\tconst weight = parseNumber(input.attributionWeight, \"attributionWeight\");\n\tif (weight === undefined) return 10000;\n\tif (weight < 0 || weight > 1) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\"attributionWeight must be between 0 and 1.\",\n\t\t);\n\t}\n\treturn Math.round(weight * 10000);\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): AttributionJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\")\n\t\treturn Number.isFinite(value) ? value : undefined;\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is AttributionJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, AttributionJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction sanitizeMetadata(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, AttributionJsonValue> {\n\tif (!value) return {};\n\tconst sanitized = sanitizeJsonValue(value);\n\treturn isRecord(sanitized)\n\t\t? (sanitized as Record<string, AttributionJsonValue>)\n\t\t: {};\n}\n\nexport function normalizeRevenueOutcomeInput(\n\tinput: RevenueOutcomeInput,\n): NormalizedRevenueOutcome {\n\tif (!isRecord(input)) {\n\t\tthrow new RevenueAttributionValidationError(\"Outcome must be an object.\");\n\t}\n\tconst outcomeInput = input as RevenueOutcomeInput;\n\tconst actionId = cleanOptionalString(outcomeInput.actionId);\n\tconst traceId = cleanOptionalString(outcomeInput.traceId);\n\treturn {\n\t\tworkspaceId: cleanRequiredString(outcomeInput.workspaceId, \"workspaceId\"),\n\t\tagentId: cleanRequiredString(outcomeInput.agentId, \"agentId\"),\n\t\toutcomeId: cleanRequiredString(outcomeInput.outcomeId, \"outcomeId\"),\n\t\toutcomeType: cleanRequiredString(\n\t\t\toutcomeInput.outcomeType,\n\t\t\t\"outcomeType\",\n\t\t).toLowerCase(),\n\t\tattributionModel: parseAttributionModel(outcomeInput.attributionModel),\n\t\tattributionWeightBps: parseAttributionWeightBps(outcomeInput),\n\t\trevenueUsdMicros: toUsdMicros(outcomeInput.revenueUsd, \"revenueUsd\"),\n\t\tpipelineValueUsdMicros: toUsdMicros(\n\t\t\toutcomeInput.pipelineValueUsd,\n\t\t\t\"pipelineValueUsd\",\n\t\t),\n\t\tcostUsdMicros: toUsdMicros(outcomeInput.costUsd, \"costUsd\"),\n\t\tdurationMs: parseDurationMs(outcomeInput.durationMs),\n\t\toccurredAt: parseDate(outcomeInput.occurredAt, \"occurredAt\") ?? new Date(),\n\t\tmetadata: sanitizeMetadata(outcomeInput.metadata),\n\t\t...(actionId ? { actionId } : {}),\n\t\t...(traceId ? { traceId } : {}),\n\t};\n}\n\nexport function normalizeRevenueAttributionRoiQuery(input: {\n\tagentId?: unknown;\n\tworkspaceId?: unknown;\n\tfrom?: unknown;\n\tto?: unknown;\n}): RevenueAttributionRoiQuery {\n\tconst from = parseDate(input.from, \"from\");\n\tconst to = parseDate(input.to, \"to\");\n\tif (from && to && from.getTime() > to.getTime()) {\n\t\tthrow new RevenueAttributionValidationError(\n\t\t\t\"from must be before or equal to to.\",\n\t\t);\n\t}\n\tconst workspaceId = cleanOptionalString(input.workspaceId);\n\treturn {\n\t\tagentId: cleanRequiredString(input.agentId, \"agentId\"),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\t...(from ? { from } : {}),\n\t\t...(to ? { to } : {}),\n\t};\n}\n\nexport function usdFromMicros(micros: number): number {\n\treturn micros / 1_000_000;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/traces/normalize.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,MAAM,YAAY,CAAC;AAMpB,qBAAa,qBAAsB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI3B;AAiBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAS7D;AAQD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAS5D;AAsKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,MAAM,CASnE;AAED,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,mBAAmB,GACxB,cAAc,CAsBhB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOzE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,cAAc,CAYjB"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/traces/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,MAAM,YAAY,CAAC;AAMpB,qBAAa,qBAAsB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI3B;AAaD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAS7D;AAQD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAS5D;AAsKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,MAAM,CASnE;AAED,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,mBAAmB,GACxB,cAAc,CAsBhB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOzE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,cAAc,CAYjB"}
@@ -1,4 +1,5 @@
1
1
  import { randomBytes } from "node:crypto";
2
+ import { isRecord } from "../../utils/json.js";
2
3
  import { TRACE_SPAN_STATUSES, TRACE_STATUSES, } from "./types.js";
3
4
  const MAX_TRACE_ID_LENGTH = 64;
4
5
  const DEFAULT_TRACE_LIST_LIMIT = 50;
@@ -9,9 +10,6 @@ export class TracesValidationError extends Error {
9
10
  this.name = "TracesValidationError";
10
11
  }
11
12
  }
12
- function isRecord(value) {
13
- return typeof value === "object" && value !== null && !Array.isArray(value);
14
- }
15
13
  function cleanRequiredString(value, label) {
16
14
  if (typeof value !== "string") {
17
15
  throw new TracesValidationError(`${label} is required.`);
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/traces/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport {\n\ttype ExecutionTrace,\n\ttype ExecutionTraceInput,\n\ttype ExecutionTraceSpan,\n\tTRACE_SPAN_STATUSES,\n\tTRACE_STATUSES,\n\ttype TraceJsonValue,\n\ttype TraceListQuery,\n\ttype TraceSpanInput,\n\ttype TraceSpanStatus,\n\ttype TraceStatus,\n} from \"./types.js\";\n\nconst MAX_TRACE_ID_LENGTH = 64;\nconst DEFAULT_TRACE_LIST_LIMIT = 50;\nconst MAX_TRACE_LIST_LIMIT = 100;\n\nexport class TracesValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"TracesValidationError\";\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new TracesValidationError(`${label} is required.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new TracesValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nexport function normalizeTraceSpanName(value: unknown): string {\n\tconst normalized = cleanRequiredString(value, \"span.name\")\n\t\t.replace(/[\\\\/\\s]+/gu, \".\")\n\t\t.replace(/\\.+/gu, \".\")\n\t\t.replace(/^\\.+|\\.+$/gu, \"\");\n\tif (!normalized) {\n\t\tthrow new TracesValidationError(\"span.name is required.\");\n\t}\n\treturn normalized;\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nexport function generateTraceId(): string {\n\treturn randomBytes(16).toString(\"hex\");\n}\n\nexport function generateSpanId(): string {\n\treturn randomBytes(8).toString(\"hex\");\n}\n\nexport function parseTraceStatus(value: unknown): TraceStatus {\n\tconst normalized =\n\t\ttypeof value === \"string\" ? value.trim().toLowerCase() : \"completed\";\n\tif (TRACE_STATUSES.includes(normalized as TraceStatus)) {\n\t\treturn normalized as TraceStatus;\n\t}\n\tthrow new TracesValidationError(\n\t\t\"Invalid trace status. Use running, completed, failed, or timeout.\",\n\t);\n}\n\nfunction parseTraceSpanStatus(\n\tvalue: unknown,\n\thasError: boolean,\n): TraceSpanStatus {\n\tconst normalized =\n\t\ttypeof value === \"string\"\n\t\t\t? value.trim().toLowerCase()\n\t\t\t: hasError\n\t\t\t\t? \"error\"\n\t\t\t\t: \"ok\";\n\tif (TRACE_SPAN_STATUSES.includes(normalized as TraceSpanStatus)) {\n\t\treturn normalized as TraceSpanStatus;\n\t}\n\tthrow new TracesValidationError(\n\t\t\"Invalid span status. Use unset, ok, or error.\",\n\t);\n}\n\nfunction normalizeTraceId(value: unknown): string {\n\tconst traceId = cleanOptionalString(value) ?? generateTraceId();\n\tif (traceId.length > MAX_TRACE_ID_LENGTH) {\n\t\tthrow new TracesValidationError(\n\t\t\t`traceId must be ${MAX_TRACE_ID_LENGTH} characters or fewer.`,\n\t\t);\n\t}\n\treturn traceId;\n}\n\nfunction parseDate(\n\tvalue: Date | string | null | undefined,\n\tlabel: string,\n): Date | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === null) {\n\t\tthrow new TracesValidationError(`${label} must be a valid date.`);\n\t}\n\tconst parsed = value instanceof Date ? value : new Date(value);\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new TracesValidationError(`${label} must be a valid date.`);\n\t}\n\treturn parsed;\n}\n\nfunction normalizeNonNegativeInteger(\n\tvalue: unknown,\n\tlabel: string,\n): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new TracesValidationError(`${label} must be a finite number.`);\n\t}\n\tif (value < 0) {\n\t\tthrow new TracesValidationError(`${label} must be non-negative.`);\n\t}\n\treturn Math.floor(value);\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): TraceJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") {\n\t\treturn Number.isFinite(value) ? value : undefined;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is TraceJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, TraceJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction normalizeAttributes(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, TraceJsonValue> {\n\tif (!value) return {};\n\tconst attributes: Record<string, TraceJsonValue> = {};\n\tfor (const [key, attributeValue] of Object.entries(value)) {\n\t\tconst sanitized = sanitizeJsonValue(attributeValue);\n\t\tif (sanitized !== undefined) {\n\t\t\tattributes[key] = sanitized;\n\t\t}\n\t}\n\treturn attributes;\n}\n\nfunction inferDurationMs(startTime?: Date, endTime?: Date): number | undefined {\n\tif (!startTime || !endTime) return undefined;\n\tconst duration = endTime.getTime() - startTime.getTime();\n\treturn duration >= 0 ? duration : undefined;\n}\n\nfunction normalizeSpan(\n\tinput: TraceSpanInput,\n\tparentSpanId?: string,\n): ExecutionTraceSpan {\n\tif (!isRecord(input)) {\n\t\tthrow new TracesValidationError(\"Each span must be an object.\");\n\t}\n\tconst error = cleanOptionalString(input.error);\n\tconst spanId = cleanOptionalString(input.spanId) ?? generateSpanId();\n\tconst startTime = parseDate(input.startTime, \"span.startTime\");\n\tconst endTime = parseDate(input.endTime, \"span.endTime\");\n\tconst durationMs =\n\t\tnormalizeNonNegativeInteger(input.durationMs, \"span.durationMs\") ??\n\t\tinferDurationMs(startTime, endTime);\n\n\tconst children = Array.isArray(input.children)\n\t\t? input.children.map((child) => normalizeSpan(child, spanId))\n\t\t: undefined;\n\n\tconst normalized: ExecutionTraceSpan = {\n\t\tspanId,\n\t\tname: normalizeTraceSpanName(input.name),\n\t\tkind: cleanOptionalString(input.kind) ?? \"internal\",\n\t\tstatus: parseTraceSpanStatus(input.status, Boolean(error)),\n\t\tattributes: normalizeAttributes(input.attributes),\n\t};\n\tconst resolvedParentSpanId =\n\t\tcleanOptionalString(input.parentSpanId) ?? parentSpanId;\n\tif (resolvedParentSpanId) normalized.parentSpanId = resolvedParentSpanId;\n\tif (startTime) normalized.startTime = startTime.toISOString();\n\tif (endTime) normalized.endTime = endTime.toISOString();\n\tif (durationMs !== undefined) normalized.durationMs = durationMs;\n\tif (input.input !== undefined) {\n\t\tconst sanitizedInput = sanitizeJsonValue(input.input);\n\t\tif (sanitizedInput !== undefined) normalized.input = sanitizedInput;\n\t}\n\tif (input.output !== undefined) {\n\t\tconst sanitizedOutput = sanitizeJsonValue(input.output);\n\t\tif (sanitizedOutput !== undefined) normalized.output = sanitizedOutput;\n\t}\n\tif (error) normalized.error = error;\n\tif (children && children.length > 0) normalized.children = children;\n\treturn normalized;\n}\n\nfunction maxSpanDurationMs(spans: ExecutionTraceSpan[]): number {\n\tlet max = 0;\n\tfor (const span of spans) {\n\t\tif (typeof span.durationMs === \"number\" && span.durationMs > max) {\n\t\t\tmax = span.durationMs;\n\t\t}\n\t\tif (span.children) {\n\t\t\tmax = Math.max(max, maxSpanDurationMs(span.children));\n\t\t}\n\t}\n\treturn max;\n}\n\nexport function countTraceSpans(spans: ExecutionTraceSpan[]): number {\n\tlet count = 0;\n\tfor (const span of spans) {\n\t\tcount += 1;\n\t\tif (span.children) {\n\t\t\tcount += countTraceSpans(span.children);\n\t\t}\n\t}\n\treturn count;\n}\n\nexport function normalizeExecutionTraceInput(\n\tinput: ExecutionTraceInput,\n): ExecutionTrace {\n\tif (!isRecord(input)) {\n\t\tthrow new TracesValidationError(\"Trace payload must be an object.\");\n\t}\n\tif (!Array.isArray(input.spans)) {\n\t\tthrow new TracesValidationError(\"spans must be an array.\");\n\t}\n\tconst spans = input.spans.map((span) => normalizeSpan(span));\n\tconst createdAt = parseDate(input.createdAt, \"createdAt\") ?? new Date();\n\tconst durationMs =\n\t\tnormalizeNonNegativeInteger(input.durationMs, \"durationMs\") ??\n\t\tmaxSpanDurationMs(spans);\n\n\treturn {\n\t\ttraceId: normalizeTraceId(input.traceId),\n\t\tworkspaceId: cleanRequiredString(input.workspaceId, \"workspaceId\"),\n\t\tagentId: cleanRequiredString(input.agentId, \"agentId\"),\n\t\tspans,\n\t\tdurationMs,\n\t\tstatus: parseTraceStatus(input.status),\n\t\tcreatedAt: createdAt.toISOString(),\n\t};\n}\n\nexport function parseTraceLimit(value: string | null | undefined): number {\n\tif (!value) return DEFAULT_TRACE_LIST_LIMIT;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 1) {\n\t\tthrow new TracesValidationError(\"limit must be a positive integer.\");\n\t}\n\treturn Math.min(parsed, MAX_TRACE_LIST_LIMIT);\n}\n\nexport function parseTraceOffset(value: string | null | undefined): number {\n\tif (!value) return 0;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 0) {\n\t\tthrow new TracesValidationError(\"offset must be a non-negative integer.\");\n\t}\n\treturn parsed;\n}\n\nexport function normalizeTraceListQuery(params: {\n\tworkspaceId?: string;\n\tagentId?: string;\n\tstatus?: string;\n\tlimit?: string | null;\n\toffset?: string | null;\n}): TraceListQuery {\n\treturn {\n\t\t...(params.workspaceId\n\t\t\t? { workspaceId: cleanRequiredString(params.workspaceId, \"workspaceId\") }\n\t\t\t: {}),\n\t\t...(params.agentId\n\t\t\t? { agentId: cleanRequiredString(params.agentId, \"agentId\") }\n\t\t\t: {}),\n\t\t...(params.status ? { status: parseTraceStatus(params.status) } : {}),\n\t\tlimit: parseTraceLimit(params.limit),\n\t\toffset: parseTraceOffset(params.offset),\n\t};\n}\n"]}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/traces/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { isRecord } from \"../../utils/json.js\";\nimport {\n\ttype ExecutionTrace,\n\ttype ExecutionTraceInput,\n\ttype ExecutionTraceSpan,\n\tTRACE_SPAN_STATUSES,\n\tTRACE_STATUSES,\n\ttype TraceJsonValue,\n\ttype TraceListQuery,\n\ttype TraceSpanInput,\n\ttype TraceSpanStatus,\n\ttype TraceStatus,\n} from \"./types.js\";\n\nconst MAX_TRACE_ID_LENGTH = 64;\nconst DEFAULT_TRACE_LIST_LIMIT = 50;\nconst MAX_TRACE_LIST_LIMIT = 100;\n\nexport class TracesValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"TracesValidationError\";\n\t}\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new TracesValidationError(`${label} is required.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new TracesValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nexport function normalizeTraceSpanName(value: unknown): string {\n\tconst normalized = cleanRequiredString(value, \"span.name\")\n\t\t.replace(/[\\\\/\\s]+/gu, \".\")\n\t\t.replace(/\\.+/gu, \".\")\n\t\t.replace(/^\\.+|\\.+$/gu, \"\");\n\tif (!normalized) {\n\t\tthrow new TracesValidationError(\"span.name is required.\");\n\t}\n\treturn normalized;\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nexport function generateTraceId(): string {\n\treturn randomBytes(16).toString(\"hex\");\n}\n\nexport function generateSpanId(): string {\n\treturn randomBytes(8).toString(\"hex\");\n}\n\nexport function parseTraceStatus(value: unknown): TraceStatus {\n\tconst normalized =\n\t\ttypeof value === \"string\" ? value.trim().toLowerCase() : \"completed\";\n\tif (TRACE_STATUSES.includes(normalized as TraceStatus)) {\n\t\treturn normalized as TraceStatus;\n\t}\n\tthrow new TracesValidationError(\n\t\t\"Invalid trace status. Use running, completed, failed, or timeout.\",\n\t);\n}\n\nfunction parseTraceSpanStatus(\n\tvalue: unknown,\n\thasError: boolean,\n): TraceSpanStatus {\n\tconst normalized =\n\t\ttypeof value === \"string\"\n\t\t\t? value.trim().toLowerCase()\n\t\t\t: hasError\n\t\t\t\t? \"error\"\n\t\t\t\t: \"ok\";\n\tif (TRACE_SPAN_STATUSES.includes(normalized as TraceSpanStatus)) {\n\t\treturn normalized as TraceSpanStatus;\n\t}\n\tthrow new TracesValidationError(\n\t\t\"Invalid span status. Use unset, ok, or error.\",\n\t);\n}\n\nfunction normalizeTraceId(value: unknown): string {\n\tconst traceId = cleanOptionalString(value) ?? generateTraceId();\n\tif (traceId.length > MAX_TRACE_ID_LENGTH) {\n\t\tthrow new TracesValidationError(\n\t\t\t`traceId must be ${MAX_TRACE_ID_LENGTH} characters or fewer.`,\n\t\t);\n\t}\n\treturn traceId;\n}\n\nfunction parseDate(\n\tvalue: Date | string | null | undefined,\n\tlabel: string,\n): Date | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === null) {\n\t\tthrow new TracesValidationError(`${label} must be a valid date.`);\n\t}\n\tconst parsed = value instanceof Date ? value : new Date(value);\n\tif (Number.isNaN(parsed.getTime())) {\n\t\tthrow new TracesValidationError(`${label} must be a valid date.`);\n\t}\n\treturn parsed;\n}\n\nfunction normalizeNonNegativeInteger(\n\tvalue: unknown,\n\tlabel: string,\n): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new TracesValidationError(`${label} must be a finite number.`);\n\t}\n\tif (value < 0) {\n\t\tthrow new TracesValidationError(`${label} must be non-negative.`);\n\t}\n\treturn Math.floor(value);\n}\n\nfunction sanitizeJsonValue(\n\tvalue: unknown,\n\tdepth = 0,\n): TraceJsonValue | undefined {\n\tif (depth > 12) return String(value);\n\tif (value === null) return null;\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") {\n\t\treturn Number.isFinite(value) ? value : undefined;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.map((item) => sanitizeJsonValue(item, depth + 1))\n\t\t\t.filter((item): item is TraceJsonValue => item !== undefined);\n\t}\n\tif (isRecord(value)) {\n\t\tconst result: Record<string, TraceJsonValue> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst sanitized = sanitizeJsonValue(nestedValue, depth + 1);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tresult[key] = sanitized;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\treturn undefined;\n}\n\nfunction normalizeAttributes(\n\tvalue: Record<string, unknown> | undefined,\n): Record<string, TraceJsonValue> {\n\tif (!value) return {};\n\tconst attributes: Record<string, TraceJsonValue> = {};\n\tfor (const [key, attributeValue] of Object.entries(value)) {\n\t\tconst sanitized = sanitizeJsonValue(attributeValue);\n\t\tif (sanitized !== undefined) {\n\t\t\tattributes[key] = sanitized;\n\t\t}\n\t}\n\treturn attributes;\n}\n\nfunction inferDurationMs(startTime?: Date, endTime?: Date): number | undefined {\n\tif (!startTime || !endTime) return undefined;\n\tconst duration = endTime.getTime() - startTime.getTime();\n\treturn duration >= 0 ? duration : undefined;\n}\n\nfunction normalizeSpan(\n\tinput: TraceSpanInput,\n\tparentSpanId?: string,\n): ExecutionTraceSpan {\n\tif (!isRecord(input)) {\n\t\tthrow new TracesValidationError(\"Each span must be an object.\");\n\t}\n\tconst error = cleanOptionalString(input.error);\n\tconst spanId = cleanOptionalString(input.spanId) ?? generateSpanId();\n\tconst startTime = parseDate(input.startTime, \"span.startTime\");\n\tconst endTime = parseDate(input.endTime, \"span.endTime\");\n\tconst durationMs =\n\t\tnormalizeNonNegativeInteger(input.durationMs, \"span.durationMs\") ??\n\t\tinferDurationMs(startTime, endTime);\n\n\tconst children = Array.isArray(input.children)\n\t\t? input.children.map((child) => normalizeSpan(child, spanId))\n\t\t: undefined;\n\n\tconst normalized: ExecutionTraceSpan = {\n\t\tspanId,\n\t\tname: normalizeTraceSpanName(input.name),\n\t\tkind: cleanOptionalString(input.kind) ?? \"internal\",\n\t\tstatus: parseTraceSpanStatus(input.status, Boolean(error)),\n\t\tattributes: normalizeAttributes(input.attributes),\n\t};\n\tconst resolvedParentSpanId =\n\t\tcleanOptionalString(input.parentSpanId) ?? parentSpanId;\n\tif (resolvedParentSpanId) normalized.parentSpanId = resolvedParentSpanId;\n\tif (startTime) normalized.startTime = startTime.toISOString();\n\tif (endTime) normalized.endTime = endTime.toISOString();\n\tif (durationMs !== undefined) normalized.durationMs = durationMs;\n\tif (input.input !== undefined) {\n\t\tconst sanitizedInput = sanitizeJsonValue(input.input);\n\t\tif (sanitizedInput !== undefined) normalized.input = sanitizedInput;\n\t}\n\tif (input.output !== undefined) {\n\t\tconst sanitizedOutput = sanitizeJsonValue(input.output);\n\t\tif (sanitizedOutput !== undefined) normalized.output = sanitizedOutput;\n\t}\n\tif (error) normalized.error = error;\n\tif (children && children.length > 0) normalized.children = children;\n\treturn normalized;\n}\n\nfunction maxSpanDurationMs(spans: ExecutionTraceSpan[]): number {\n\tlet max = 0;\n\tfor (const span of spans) {\n\t\tif (typeof span.durationMs === \"number\" && span.durationMs > max) {\n\t\t\tmax = span.durationMs;\n\t\t}\n\t\tif (span.children) {\n\t\t\tmax = Math.max(max, maxSpanDurationMs(span.children));\n\t\t}\n\t}\n\treturn max;\n}\n\nexport function countTraceSpans(spans: ExecutionTraceSpan[]): number {\n\tlet count = 0;\n\tfor (const span of spans) {\n\t\tcount += 1;\n\t\tif (span.children) {\n\t\t\tcount += countTraceSpans(span.children);\n\t\t}\n\t}\n\treturn count;\n}\n\nexport function normalizeExecutionTraceInput(\n\tinput: ExecutionTraceInput,\n): ExecutionTrace {\n\tif (!isRecord(input)) {\n\t\tthrow new TracesValidationError(\"Trace payload must be an object.\");\n\t}\n\tif (!Array.isArray(input.spans)) {\n\t\tthrow new TracesValidationError(\"spans must be an array.\");\n\t}\n\tconst spans = input.spans.map((span) => normalizeSpan(span));\n\tconst createdAt = parseDate(input.createdAt, \"createdAt\") ?? new Date();\n\tconst durationMs =\n\t\tnormalizeNonNegativeInteger(input.durationMs, \"durationMs\") ??\n\t\tmaxSpanDurationMs(spans);\n\n\treturn {\n\t\ttraceId: normalizeTraceId(input.traceId),\n\t\tworkspaceId: cleanRequiredString(input.workspaceId, \"workspaceId\"),\n\t\tagentId: cleanRequiredString(input.agentId, \"agentId\"),\n\t\tspans,\n\t\tdurationMs,\n\t\tstatus: parseTraceStatus(input.status),\n\t\tcreatedAt: createdAt.toISOString(),\n\t};\n}\n\nexport function parseTraceLimit(value: string | null | undefined): number {\n\tif (!value) return DEFAULT_TRACE_LIST_LIMIT;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 1) {\n\t\tthrow new TracesValidationError(\"limit must be a positive integer.\");\n\t}\n\treturn Math.min(parsed, MAX_TRACE_LIST_LIMIT);\n}\n\nexport function parseTraceOffset(value: string | null | undefined): number {\n\tif (!value) return 0;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 0) {\n\t\tthrow new TracesValidationError(\"offset must be a non-negative integer.\");\n\t}\n\treturn parsed;\n}\n\nexport function normalizeTraceListQuery(params: {\n\tworkspaceId?: string;\n\tagentId?: string;\n\tstatus?: string;\n\tlimit?: string | null;\n\toffset?: string | null;\n}): TraceListQuery {\n\treturn {\n\t\t...(params.workspaceId\n\t\t\t? { workspaceId: cleanRequiredString(params.workspaceId, \"workspaceId\") }\n\t\t\t: {}),\n\t\t...(params.agentId\n\t\t\t? { agentId: cleanRequiredString(params.agentId, \"agentId\") }\n\t\t\t: {}),\n\t\t...(params.status ? { status: parseTraceStatus(params.status) } : {}),\n\t\tlimit: parseTraceLimit(params.limit),\n\t\toffset: parseTraceOffset(params.offset),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/workspace-config/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,YAAY,CAAC;AAKpB,qBAAa,8BAA+B,SAAQ,KAAK;gBAC5C,OAAO,EAAE,MAAM;CAI3B;AAiBD,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,OAAO,EACpB,KAAK,SAAgB,GACnB,MAAM,CAER;AAyCD,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,OAAO,GACZ,yBAAyB,CAU3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAezE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAwBvE;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,oBAAoB,EAC3B,GAAG,OAAa,GACd,eAAe,CAcjB;AAED,wBAAgB,kCAAkC,CACjD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,GAAG,OAAa,GACd,eAAe,CAuBjB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAStE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASvE;AAED,wBAAgB,iCAAiC,CAAC,MAAM,EAAE;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,wBAAwB,CAK3B"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/workspace-config/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,YAAY,CAAC;AAKpB,qBAAa,8BAA+B,SAAQ,KAAK;gBAC5C,OAAO,EAAE,MAAM;CAI3B;AAaD,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,OAAO,EACpB,KAAK,SAAgB,GACnB,MAAM,CAER;AAyCD,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,OAAO,GACZ,yBAAyB,CAU3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAezE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAwBvE;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,oBAAoB,EAC3B,GAAG,OAAa,GACd,eAAe,CAcjB;AAED,wBAAgB,kCAAkC,CACjD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,GAAG,OAAa,GACd,eAAe,CAuBjB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAStE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASvE;AAED,wBAAgB,iCAAiC,CAAC,MAAM,EAAE;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,wBAAwB,CAK3B"}
@@ -1,3 +1,4 @@
1
+ import { isRecord } from "../../utils/json.js";
1
2
  const DEFAULT_LIST_LIMIT = 50;
2
3
  const MAX_LIST_LIMIT = 100;
3
4
  export class WorkspaceConfigValidationError extends Error {
@@ -6,9 +7,6 @@ export class WorkspaceConfigValidationError extends Error {
6
7
  this.name = "WorkspaceConfigValidationError";
7
8
  }
8
9
  }
9
- function isRecord(value) {
10
- return typeof value === "object" && value !== null && !Array.isArray(value);
11
- }
12
10
  function cleanRequiredString(value, label) {
13
11
  if (typeof value !== "string") {
14
12
  throw new WorkspaceConfigValidationError(`${label} is required.`);
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/workspace-config/normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tWorkspaceConfig,\n\tWorkspaceConfigInput,\n\tWorkspaceConfigListQuery,\n\tWorkspaceConfigPatchInput,\n\tWorkspaceModelPreferences,\n\tWorkspaceRateLimits,\n\tWorkspaceSafetyRules,\n} from \"./types.js\";\n\nconst DEFAULT_LIST_LIMIT = 50;\nconst MAX_LIST_LIMIT = 100;\n\nexport class WorkspaceConfigValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WorkspaceConfigValidationError\";\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new WorkspaceConfigValidationError(`${label} is required.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new WorkspaceConfigValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nexport function normalizeWorkspaceConfigId(\n\tworkspaceId: unknown,\n\tlabel = \"workspaceId\",\n): string {\n\treturn cleanRequiredString(workspaceId, label);\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanStringList(value: unknown): string[] {\n\tif (!Array.isArray(value)) return [];\n\treturn Array.from(\n\t\tnew Set(\n\t\t\tvalue\n\t\t\t\t.map((entry) => cleanOptionalString(entry))\n\t\t\t\t.filter((entry): entry is string => Boolean(entry)),\n\t\t),\n\t);\n}\n\nfunction cleanOptionalBoolean(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction cleanOptionalPositiveInteger(\n\tvalue: unknown,\n\tlabel: string,\n): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t`${label} must be a finite number.`,\n\t\t);\n\t}\n\tif (value < 1) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t`${label} must be a positive integer.`,\n\t\t);\n\t}\n\treturn Math.floor(value);\n}\n\nexport function normalizeModelPreferences(\n\tvalue: unknown,\n): WorkspaceModelPreferences {\n\tconst input = isRecord(value) ? value : {};\n\tconst defaultModel = cleanOptionalString(input.defaultModel);\n\tconst preferredProvider = cleanOptionalString(input.preferredProvider);\n\treturn {\n\t\tallowedModels: cleanStringList(input.allowedModels),\n\t\tblockedModels: cleanStringList(input.blockedModels),\n\t\t...(defaultModel ? { defaultModel } : {}),\n\t\t...(preferredProvider ? { preferredProvider } : {}),\n\t};\n}\n\nexport function normalizeSafetyRules(value: unknown): WorkspaceSafetyRules {\n\tconst input = isRecord(value) ? value : {};\n\tconst requireApprovals = cleanOptionalBoolean(input.requireApprovals);\n\tconst maxTokensPerSession = cleanOptionalPositiveInteger(\n\t\tinput.maxTokensPerSession,\n\t\t\"safetyRules.maxTokensPerSession\",\n\t);\n\treturn {\n\t\tallowedTools: cleanStringList(input.allowedTools),\n\t\tblockedTools: cleanStringList(input.blockedTools),\n\t\trequiredSkills: cleanStringList(input.requiredSkills),\n\t\tfileBoundaries: cleanStringList(input.fileBoundaries),\n\t\t...(requireApprovals !== undefined ? { requireApprovals } : {}),\n\t\t...(maxTokensPerSession ? { maxTokensPerSession } : {}),\n\t};\n}\n\nexport function normalizeRateLimits(value: unknown): WorkspaceRateLimits {\n\tconst input = isRecord(value) ? value : {};\n\tconst requestsPerMinute = cleanOptionalPositiveInteger(\n\t\tinput.requestsPerMinute,\n\t\t\"rateLimits.requestsPerMinute\",\n\t);\n\tconst tokensPerMinute = cleanOptionalPositiveInteger(\n\t\tinput.tokensPerMinute,\n\t\t\"rateLimits.tokensPerMinute\",\n\t);\n\tconst maxConcurrentSessions = cleanOptionalPositiveInteger(\n\t\tinput.maxConcurrentSessions,\n\t\t\"rateLimits.maxConcurrentSessions\",\n\t);\n\tconst maxTokensPerSession = cleanOptionalPositiveInteger(\n\t\tinput.maxTokensPerSession,\n\t\t\"rateLimits.maxTokensPerSession\",\n\t);\n\treturn {\n\t\t...(requestsPerMinute ? { requestsPerMinute } : {}),\n\t\t...(tokensPerMinute ? { tokensPerMinute } : {}),\n\t\t...(maxConcurrentSessions ? { maxConcurrentSessions } : {}),\n\t\t...(maxTokensPerSession ? { maxTokensPerSession } : {}),\n\t};\n}\n\nexport function normalizeWorkspaceConfigInput(\n\tinput: WorkspaceConfigInput,\n\tnow = new Date(),\n): WorkspaceConfig {\n\tif (!isRecord(input)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"Workspace config must be an object.\",\n\t\t);\n\t}\n\treturn {\n\t\tworkspaceId: cleanRequiredString(input.workspaceId, \"workspaceId\"),\n\t\tmodelPreferences: normalizeModelPreferences(input.modelPreferences),\n\t\tsafetyRules: normalizeSafetyRules(input.safetyRules),\n\t\trateLimits: normalizeRateLimits(input.rateLimits),\n\t\tcreatedAt: now.toISOString(),\n\t\tupdatedAt: now.toISOString(),\n\t};\n}\n\nexport function normalizeWorkspaceConfigPatchInput(\n\tworkspaceId: string,\n\tinput: WorkspaceConfigPatchInput,\n\texisting: WorkspaceConfig | null,\n\tnow = new Date(),\n): WorkspaceConfig {\n\tif (!isRecord(input)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"Workspace config must be an object.\",\n\t\t);\n\t}\n\treturn {\n\t\tworkspaceId: cleanRequiredString(workspaceId, \"workspaceId\"),\n\t\tmodelPreferences: normalizeModelPreferences({\n\t\t\t...(existing?.modelPreferences ?? {}),\n\t\t\t...(isRecord(input.modelPreferences) ? input.modelPreferences : {}),\n\t\t}),\n\t\tsafetyRules: normalizeSafetyRules({\n\t\t\t...(existing?.safetyRules ?? {}),\n\t\t\t...(isRecord(input.safetyRules) ? input.safetyRules : {}),\n\t\t}),\n\t\trateLimits: normalizeRateLimits({\n\t\t\t...(existing?.rateLimits ?? {}),\n\t\t\t...(isRecord(input.rateLimits) ? input.rateLimits : {}),\n\t\t}),\n\t\tcreatedAt: existing?.createdAt ?? now.toISOString(),\n\t\tupdatedAt: now.toISOString(),\n\t};\n}\n\nexport function parseWorkspaceConfigLimit(value: string | null): number {\n\tif (!value) return DEFAULT_LIST_LIMIT;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 1) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"limit must be a positive integer.\",\n\t\t);\n\t}\n\treturn Math.min(parsed, MAX_LIST_LIMIT);\n}\n\nexport function parseWorkspaceConfigOffset(value: string | null): number {\n\tif (!value) return 0;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 0) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"offset must be a non-negative integer.\",\n\t\t);\n\t}\n\treturn parsed;\n}\n\nexport function normalizeWorkspaceConfigListQuery(params: {\n\tlimit?: string | null;\n\toffset?: string | null;\n}): WorkspaceConfigListQuery {\n\treturn {\n\t\tlimit: parseWorkspaceConfigLimit(params.limit ?? null),\n\t\toffset: parseWorkspaceConfigOffset(params.offset ?? null),\n\t};\n}\n"]}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/workspace-config/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAW/C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACxD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC9C,CAAC;CACD;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,8BAA8B,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,8BAA8B,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,WAAoB,EACpB,KAAK,GAAG,aAAa;IAErB,OAAO,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,IAAI,CAChB,IAAI,GAAG,CACN,KAAK;SACH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;SAC1C,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACpD,CACD,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,4BAA4B,CACpC,KAAc,EACd,KAAa;IAEb,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,8BAA8B,CACvC,GAAG,KAAK,2BAA2B,CACnC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,8BAA8B,CACvC,GAAG,KAAK,8BAA8B,CACtC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,yBAAyB,CACxC,KAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvE,OAAO;QACN,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC;QACnD,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC;QACnD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,4BAA4B,CACvD,KAAK,CAAC,mBAAmB,EACzB,iCAAiC,CACjC,CAAC;IACF,OAAO;QACN,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;QACjD,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;QACjD,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC;QACrD,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC;QACrD,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,iBAAiB,GAAG,4BAA4B,CACrD,KAAK,CAAC,iBAAiB,EACvB,8BAA8B,CAC9B,CAAC;IACF,MAAM,eAAe,GAAG,4BAA4B,CACnD,KAAK,CAAC,eAAe,EACrB,4BAA4B,CAC5B,CAAC;IACF,MAAM,qBAAqB,GAAG,4BAA4B,CACzD,KAAK,CAAC,qBAAqB,EAC3B,kCAAkC,CAClC,CAAC;IACF,MAAM,mBAAmB,GAAG,4BAA4B,CACvD,KAAK,CAAC,mBAAmB,EACzB,gCAAgC,CAChC,CAAC;IACF,OAAO;QACN,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,KAA2B,EAC3B,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,8BAA8B,CACvC,qCAAqC,CACrC,CAAC;IACH,CAAC;IACD,OAAO;QACN,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;QAClE,gBAAgB,EAAE,yBAAyB,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACnE,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC;QACpD,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC;QACjD,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;KAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CACjD,WAAmB,EACnB,KAAgC,EAChC,QAAgC,EAChC,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,8BAA8B,CACvC,qCAAqC,CACrC,CAAC;IACH,CAAC;IACD,OAAO;QACN,WAAW,EAAE,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC;QAC5D,gBAAgB,EAAE,yBAAyB,CAAC;YAC3C,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC;YACrC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;QACF,WAAW,EAAE,oBAAoB,CAAC;YACjC,GAAG,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QACF,UAAU,EAAE,mBAAmB,CAAC;YAC/B,GAAG,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC;QACF,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG,CAAC,WAAW,EAAE;QACnD,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;KAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAoB;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,kBAAkB,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,8BAA8B,CACvC,mCAAmC,CACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAoB;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,8BAA8B,CACvC,wCAAwC,CACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAGjD;IACA,OAAO;QACN,KAAK,EAAE,yBAAyB,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;QACtD,MAAM,EAAE,0BAA0B,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;KACzD,CAAC;AACH,CAAC","sourcesContent":["import { isRecord } from \"../../utils/json.js\";\nimport type {\n\tWorkspaceConfig,\n\tWorkspaceConfigInput,\n\tWorkspaceConfigListQuery,\n\tWorkspaceConfigPatchInput,\n\tWorkspaceModelPreferences,\n\tWorkspaceRateLimits,\n\tWorkspaceSafetyRules,\n} from \"./types.js\";\n\nconst DEFAULT_LIST_LIMIT = 50;\nconst MAX_LIST_LIMIT = 100;\n\nexport class WorkspaceConfigValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WorkspaceConfigValidationError\";\n\t}\n}\n\nfunction cleanRequiredString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new WorkspaceConfigValidationError(`${label} is required.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new WorkspaceConfigValidationError(`${label} is required.`);\n\t}\n\treturn trimmed;\n}\n\nexport function normalizeWorkspaceConfigId(\n\tworkspaceId: unknown,\n\tlabel = \"workspaceId\",\n): string {\n\treturn cleanRequiredString(workspaceId, label);\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction cleanStringList(value: unknown): string[] {\n\tif (!Array.isArray(value)) return [];\n\treturn Array.from(\n\t\tnew Set(\n\t\t\tvalue\n\t\t\t\t.map((entry) => cleanOptionalString(entry))\n\t\t\t\t.filter((entry): entry is string => Boolean(entry)),\n\t\t),\n\t);\n}\n\nfunction cleanOptionalBoolean(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction cleanOptionalPositiveInteger(\n\tvalue: unknown,\n\tlabel: string,\n): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t`${label} must be a finite number.`,\n\t\t);\n\t}\n\tif (value < 1) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t`${label} must be a positive integer.`,\n\t\t);\n\t}\n\treturn Math.floor(value);\n}\n\nexport function normalizeModelPreferences(\n\tvalue: unknown,\n): WorkspaceModelPreferences {\n\tconst input = isRecord(value) ? value : {};\n\tconst defaultModel = cleanOptionalString(input.defaultModel);\n\tconst preferredProvider = cleanOptionalString(input.preferredProvider);\n\treturn {\n\t\tallowedModels: cleanStringList(input.allowedModels),\n\t\tblockedModels: cleanStringList(input.blockedModels),\n\t\t...(defaultModel ? { defaultModel } : {}),\n\t\t...(preferredProvider ? { preferredProvider } : {}),\n\t};\n}\n\nexport function normalizeSafetyRules(value: unknown): WorkspaceSafetyRules {\n\tconst input = isRecord(value) ? value : {};\n\tconst requireApprovals = cleanOptionalBoolean(input.requireApprovals);\n\tconst maxTokensPerSession = cleanOptionalPositiveInteger(\n\t\tinput.maxTokensPerSession,\n\t\t\"safetyRules.maxTokensPerSession\",\n\t);\n\treturn {\n\t\tallowedTools: cleanStringList(input.allowedTools),\n\t\tblockedTools: cleanStringList(input.blockedTools),\n\t\trequiredSkills: cleanStringList(input.requiredSkills),\n\t\tfileBoundaries: cleanStringList(input.fileBoundaries),\n\t\t...(requireApprovals !== undefined ? { requireApprovals } : {}),\n\t\t...(maxTokensPerSession ? { maxTokensPerSession } : {}),\n\t};\n}\n\nexport function normalizeRateLimits(value: unknown): WorkspaceRateLimits {\n\tconst input = isRecord(value) ? value : {};\n\tconst requestsPerMinute = cleanOptionalPositiveInteger(\n\t\tinput.requestsPerMinute,\n\t\t\"rateLimits.requestsPerMinute\",\n\t);\n\tconst tokensPerMinute = cleanOptionalPositiveInteger(\n\t\tinput.tokensPerMinute,\n\t\t\"rateLimits.tokensPerMinute\",\n\t);\n\tconst maxConcurrentSessions = cleanOptionalPositiveInteger(\n\t\tinput.maxConcurrentSessions,\n\t\t\"rateLimits.maxConcurrentSessions\",\n\t);\n\tconst maxTokensPerSession = cleanOptionalPositiveInteger(\n\t\tinput.maxTokensPerSession,\n\t\t\"rateLimits.maxTokensPerSession\",\n\t);\n\treturn {\n\t\t...(requestsPerMinute ? { requestsPerMinute } : {}),\n\t\t...(tokensPerMinute ? { tokensPerMinute } : {}),\n\t\t...(maxConcurrentSessions ? { maxConcurrentSessions } : {}),\n\t\t...(maxTokensPerSession ? { maxTokensPerSession } : {}),\n\t};\n}\n\nexport function normalizeWorkspaceConfigInput(\n\tinput: WorkspaceConfigInput,\n\tnow = new Date(),\n): WorkspaceConfig {\n\tif (!isRecord(input)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"Workspace config must be an object.\",\n\t\t);\n\t}\n\treturn {\n\t\tworkspaceId: cleanRequiredString(input.workspaceId, \"workspaceId\"),\n\t\tmodelPreferences: normalizeModelPreferences(input.modelPreferences),\n\t\tsafetyRules: normalizeSafetyRules(input.safetyRules),\n\t\trateLimits: normalizeRateLimits(input.rateLimits),\n\t\tcreatedAt: now.toISOString(),\n\t\tupdatedAt: now.toISOString(),\n\t};\n}\n\nexport function normalizeWorkspaceConfigPatchInput(\n\tworkspaceId: string,\n\tinput: WorkspaceConfigPatchInput,\n\texisting: WorkspaceConfig | null,\n\tnow = new Date(),\n): WorkspaceConfig {\n\tif (!isRecord(input)) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"Workspace config must be an object.\",\n\t\t);\n\t}\n\treturn {\n\t\tworkspaceId: cleanRequiredString(workspaceId, \"workspaceId\"),\n\t\tmodelPreferences: normalizeModelPreferences({\n\t\t\t...(existing?.modelPreferences ?? {}),\n\t\t\t...(isRecord(input.modelPreferences) ? input.modelPreferences : {}),\n\t\t}),\n\t\tsafetyRules: normalizeSafetyRules({\n\t\t\t...(existing?.safetyRules ?? {}),\n\t\t\t...(isRecord(input.safetyRules) ? input.safetyRules : {}),\n\t\t}),\n\t\trateLimits: normalizeRateLimits({\n\t\t\t...(existing?.rateLimits ?? {}),\n\t\t\t...(isRecord(input.rateLimits) ? input.rateLimits : {}),\n\t\t}),\n\t\tcreatedAt: existing?.createdAt ?? now.toISOString(),\n\t\tupdatedAt: now.toISOString(),\n\t};\n}\n\nexport function parseWorkspaceConfigLimit(value: string | null): number {\n\tif (!value) return DEFAULT_LIST_LIMIT;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 1) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"limit must be a positive integer.\",\n\t\t);\n\t}\n\treturn Math.min(parsed, MAX_LIST_LIMIT);\n}\n\nexport function parseWorkspaceConfigOffset(value: string | null): number {\n\tif (!value) return 0;\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed < 0) {\n\t\tthrow new WorkspaceConfigValidationError(\n\t\t\t\"offset must be a non-negative integer.\",\n\t\t);\n\t}\n\treturn parsed;\n}\n\nexport function normalizeWorkspaceConfigListQuery(params: {\n\tlimit?: string | null;\n\toffset?: string | null;\n}): WorkspaceConfigListQuery {\n\treturn {\n\t\tlimit: parseWorkspaceConfigLimit(params.limit ?? null),\n\t\toffset: parseWorkspaceConfigOffset(params.offset ?? null),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/skills/composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsC/C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACtB,WAAW,CAOb"}
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/skills/composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiD/C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACtB,WAAW,CAOb"}
@@ -7,6 +7,7 @@
7
7
  * two skills serially. Composition is opt-in per parent skill - skills without
8
8
  * a registered composer pass through unchanged.
9
9
  */
10
+ import { createHash } from "node:crypto";
10
11
  /**
11
12
  * Compose `review` with a repo-defined `review-guidelines` skill, if present.
12
13
  *
@@ -30,7 +31,18 @@ const REVIEW_COMPOSER = {
30
31
  "",
31
32
  guidelines.content,
32
33
  ].join("\n");
33
- return { ...skill, content: composed };
34
+ const contentSha = createHash("sha256")
35
+ .update("composed-skill:v1")
36
+ .update("\0parent:")
37
+ .update(skill.contentSha)
38
+ .update("\0partner:")
39
+ .update(guidelines.name)
40
+ .update("\0partner-sha:")
41
+ .update(guidelines.contentSha)
42
+ .update("\0content:")
43
+ .update(composed)
44
+ .digest("hex");
45
+ return { ...skill, content: composed, contentSha };
34
46
  },
35
47
  };
36
48
  const COMPOSERS = [REVIEW_COMPOSER];
@@ -1 +1 @@
1
- {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/skills/composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH;;;;;;GAMG;AACH,MAAM,eAAe,GAAkB;IACtC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG;YAChB,KAAK,CAAC,OAAO;YACb,EAAE;YACF,0CAA0C;YAC1C,EAAE;YACF,kGAAkG,UAAU,CAAC,UAAU,OAAO;YAC9H,EAAE;YACF,UAAU,CAAC,OAAO;SAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;CACD,CAAC;AAEF,MAAM,SAAS,GAA6B,CAAC,eAAe,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC3B,KAAkB,EAClB,SAAwB;IAExB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["/**\n * Skill composition - splice content from one skill into another at activation time.\n *\n * When the agent activates a skill (e.g., `review`), a composer can splice in\n * the body of a companion skill defined in the repo (e.g., `review-guidelines`)\n * so the agent receives a single composed payload instead of having to invoke\n * two skills serially. Composition is opt-in per parent skill - skills without\n * a registered composer pass through unchanged.\n */\n\nimport type { LoadedSkill } from \"./loader.js\";\n\ninterface SkillComposer {\n\t/** Whether this composer applies to the active skill. */\n\tappliesTo(skill: LoadedSkill): boolean;\n\t/** Produce a composed skill, or return the input if the partner skill is absent. */\n\tcompose(skill: LoadedSkill, allSkills: LoadedSkill[]): LoadedSkill;\n}\n\n/**\n * Compose `review` with a repo-defined `review-guidelines` skill, if present.\n *\n * The guidelines body is appended to the review skill's content under a\n * `## Repository-specific review guidelines` heading. If the repo doesn't\n * define `review-guidelines`, the review skill passes through unchanged.\n */\nconst REVIEW_COMPOSER: SkillComposer = {\n\tappliesTo: (skill) => skill.name === \"review\",\n\tcompose: (skill, allSkills) => {\n\t\tconst guidelines = allSkills.find((s) => s.name === \"review-guidelines\");\n\t\tif (!guidelines) {\n\t\t\treturn skill;\n\t\t}\n\t\tconst composed = [\n\t\t\tskill.content,\n\t\t\t\"\",\n\t\t\t\"## Repository-specific review guidelines\",\n\t\t\t\"\",\n\t\t\t`_The following guidelines are defined by the \\`review-guidelines\\` skill in this repository (\\`${guidelines.sourceType}\\`)._`,\n\t\t\t\"\",\n\t\t\tguidelines.content,\n\t\t].join(\"\\n\");\n\t\treturn { ...skill, content: composed };\n\t},\n};\n\nconst COMPOSERS: readonly SkillComposer[] = [REVIEW_COMPOSER];\n\n/**\n * Apply any registered composer for the active skill. Returns the input\n * unchanged if no composer matches or the partner skill is absent.\n *\n * Composition preserves `name`, `sourceType`, and other identity fields so\n * activation telemetry keyed on the parent skill remains correct.\n */\nexport function composeSkill(\n\tskill: LoadedSkill,\n\tallSkills: LoadedSkill[],\n): LoadedSkill {\n\tfor (const composer of COMPOSERS) {\n\t\tif (composer.appliesTo(skill)) {\n\t\t\treturn composer.compose(skill, allSkills);\n\t\t}\n\t}\n\treturn skill;\n}\n"]}
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/skills/composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC;;;;;;GAMG;AACH,MAAM,eAAe,GAAkB;IACtC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG;YAChB,KAAK,CAAC,OAAO;YACb,EAAE;YACF,0CAA0C;YAC1C,EAAE;YACF,kGAAkG,UAAU,CAAC,UAAU,OAAO;YAC9H,EAAE;YACF,UAAU,CAAC,OAAO;SAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,mBAAmB,CAAC;aAC3B,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;aACxB,MAAM,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aACvB,MAAM,CAAC,gBAAgB,CAAC;aACxB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;aAC7B,MAAM,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,QAAQ,CAAC;aAChB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;CACD,CAAC;AAEF,MAAM,SAAS,GAA6B,CAAC,eAAe,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC3B,KAAkB,EAClB,SAAwB;IAExB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["/**\n * Skill composition - splice content from one skill into another at activation time.\n *\n * When the agent activates a skill (e.g., `review`), a composer can splice in\n * the body of a companion skill defined in the repo (e.g., `review-guidelines`)\n * so the agent receives a single composed payload instead of having to invoke\n * two skills serially. Composition is opt-in per parent skill - skills without\n * a registered composer pass through unchanged.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { LoadedSkill } from \"./loader.js\";\n\ninterface SkillComposer {\n\t/** Whether this composer applies to the active skill. */\n\tappliesTo(skill: LoadedSkill): boolean;\n\t/** Produce a composed skill, or return the input if the partner skill is absent. */\n\tcompose(skill: LoadedSkill, allSkills: LoadedSkill[]): LoadedSkill;\n}\n\n/**\n * Compose `review` with a repo-defined `review-guidelines` skill, if present.\n *\n * The guidelines body is appended to the review skill's content under a\n * `## Repository-specific review guidelines` heading. If the repo doesn't\n * define `review-guidelines`, the review skill passes through unchanged.\n */\nconst REVIEW_COMPOSER: SkillComposer = {\n\tappliesTo: (skill) => skill.name === \"review\",\n\tcompose: (skill, allSkills) => {\n\t\tconst guidelines = allSkills.find((s) => s.name === \"review-guidelines\");\n\t\tif (!guidelines) {\n\t\t\treturn skill;\n\t\t}\n\t\tconst composed = [\n\t\t\tskill.content,\n\t\t\t\"\",\n\t\t\t\"## Repository-specific review guidelines\",\n\t\t\t\"\",\n\t\t\t`_The following guidelines are defined by the \\`review-guidelines\\` skill in this repository (\\`${guidelines.sourceType}\\`)._`,\n\t\t\t\"\",\n\t\t\tguidelines.content,\n\t\t].join(\"\\n\");\n\t\tconst contentSha = createHash(\"sha256\")\n\t\t\t.update(\"composed-skill:v1\")\n\t\t\t.update(\"\\0parent:\")\n\t\t\t.update(skill.contentSha)\n\t\t\t.update(\"\\0partner:\")\n\t\t\t.update(guidelines.name)\n\t\t\t.update(\"\\0partner-sha:\")\n\t\t\t.update(guidelines.contentSha)\n\t\t\t.update(\"\\0content:\")\n\t\t\t.update(composed)\n\t\t\t.digest(\"hex\");\n\t\treturn { ...skill, content: composed, contentSha };\n\t},\n};\n\nconst COMPOSERS: readonly SkillComposer[] = [REVIEW_COMPOSER];\n\n/**\n * Apply any registered composer for the active skill. Returns the input\n * unchanged if no composer matches or the partner skill is absent.\n *\n * Composition preserves `name`, `sourceType`, and other identity fields so\n * activation telemetry keyed on the parent skill remains correct.\n */\nexport function composeSkill(\n\tskill: LoadedSkill,\n\tallSkills: LoadedSkill[],\n): LoadedSkill {\n\tfor (const composer of COMPOSERS) {\n\t\tif (composer.appliesTo(skill)) {\n\t\t\treturn composer.compose(skill, allSkills);\n\t\t}\n\t}\n\treturn skill;\n}\n"]}
@@ -31,6 +31,7 @@
31
31
  */
32
32
  export { type LoadedSkill, type SkillDefinition, type SkillResource, findSkill, findSkillMd, formatSkillForInjection, formatSkillListItem, formatSkillMetadataOnly, formatSkillsForSystemPrompt, getSkillsSummary, loadSkills, parseFrontmatter, searchSkills, skillToDict, skillToJson, skillsToPrompt, stringArrayValue, } from "./loader.js";
33
33
  export { composeSkill } from "./composer.js";
34
+ export { appendLearnedGuideline, defaultUserSkillsDir, formatLearnedGuidelinesForPrompt, getLearnedGuidelinesPath, loadLearnedGuidelines, } from "./learned-guidelines.js";
34
35
  export { type ScaffoldSkillOptions, type ScaffoldSkillResult, scaffoldSkillWithBody, } from "./scaffolder.js";
35
36
  export { createSkillTool, invalidateSkillCache } from "./tool.js";
36
37
  export { type SkillRuntimeActivation, type SkillRuntimeActivationOptions, type SkillRuntimeMcpActivation, type SkillRuntimeMcpServer, type SkillRuntimeResource, type SkillRuntimeResourceDirectories, type SkillRuntimeToolboxActivation, type SkillRuntimeToolboxEntry, buildSkillRuntimeActivation, } from "./runtime-activation.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,qBAAqB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,gCAAgC,EAChC,2BAA2B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,KAAK,uCAAuC,EAC5C,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GACjC,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,gCAAgC,EAChC,wBAAwB,EACxB,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,qBAAqB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,gCAAgC,EAChC,2BAA2B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,KAAK,uCAAuC,EAC5C,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GACjC,MAAM,uBAAuB,CAAC"}
@@ -31,6 +31,7 @@
31
31
  */
32
32
  export { findSkill, findSkillMd, formatSkillForInjection, formatSkillListItem, formatSkillMetadataOnly, formatSkillsForSystemPrompt, getSkillsSummary, loadSkills, parseFrontmatter, searchSkills, skillToDict, skillToJson, skillsToPrompt, stringArrayValue, } from "./loader.js";
33
33
  export { composeSkill } from "./composer.js";
34
+ export { appendLearnedGuideline, defaultUserSkillsDir, formatLearnedGuidelinesForPrompt, getLearnedGuidelinesPath, loadLearnedGuidelines, } from "./learned-guidelines.js";
34
35
  export { scaffoldSkillWithBody, } from "./scaffolder.js";
35
36
  export { createSkillTool, invalidateSkillCache } from "./tool.js";
36
37
  export { buildSkillRuntimeActivation, } from "./runtime-activation.js";