@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
@@ -0,0 +1,16 @@
1
+ import type { UserSettings } from "../db/schema.js";
2
+ /**
3
+ * Merge an incoming user-settings patch onto the previously stored settings.
4
+ *
5
+ * The `maestro` namespace is deep-merged and normalized against the
6
+ * MaestroSettings catalog (`mergeMaestroSettings`), so only typed, valid
7
+ * runtime knobs are ever stored on `users.settings`. Scalar/array fields are
8
+ * replaced.
9
+ *
10
+ * `twoFactor` is managed exclusively by the dedicated 2FA enrollment flow and
11
+ * is never accepted from a generic settings patch — the previous value is
12
+ * always preserved so this endpoint cannot be used to overwrite or strip 2FA
13
+ * state (e.g. backup codes or the TOTP secret).
14
+ */
15
+ export declare function mergeUserSettings(previous: UserSettings | null | undefined, incoming: UserSettings): UserSettings;
16
+ //# sourceMappingURL=user-settings-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-settings-merge.d.ts","sourceRoot":"","sources":["../../src/api/user-settings-merge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,EAAE,YAAY,GACpB,YAAY,CA0Bd"}
@@ -0,0 +1,37 @@
1
+ import { mergeMaestroSettings } from "@evalops/contracts";
2
+ /**
3
+ * Merge an incoming user-settings patch onto the previously stored settings.
4
+ *
5
+ * The `maestro` namespace is deep-merged and normalized against the
6
+ * MaestroSettings catalog (`mergeMaestroSettings`), so only typed, valid
7
+ * runtime knobs are ever stored on `users.settings`. Scalar/array fields are
8
+ * replaced.
9
+ *
10
+ * `twoFactor` is managed exclusively by the dedicated 2FA enrollment flow and
11
+ * is never accepted from a generic settings patch — the previous value is
12
+ * always preserved so this endpoint cannot be used to overwrite or strip 2FA
13
+ * state (e.g. backup codes or the TOTP secret).
14
+ */
15
+ export function mergeUserSettings(previous, incoming) {
16
+ const previousSettings = previous ?? {};
17
+ const result = {
18
+ ...previousSettings,
19
+ ...incoming,
20
+ };
21
+ const mergedMaestro = mergeMaestroSettings(previousSettings.maestro, incoming.maestro);
22
+ if (Object.keys(mergedMaestro).length > 0) {
23
+ result.maestro = mergedMaestro;
24
+ }
25
+ else {
26
+ delete result.maestro;
27
+ }
28
+ // twoFactor is intentionally pinned to the previous value (see docstring).
29
+ if (previousSettings.twoFactor !== undefined) {
30
+ result.twoFactor = previousSettings.twoFactor;
31
+ }
32
+ else {
33
+ delete result.twoFactor;
34
+ }
35
+ return result;
36
+ }
37
+ //# sourceMappingURL=user-settings-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-settings-merge.js","sourceRoot":"","sources":["../../src/api/user-settings-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAChC,QAAyC,EACzC,QAAsB;IAEtB,MAAM,gBAAgB,GAAiB,QAAQ,IAAI,EAAE,CAAC;IAEtD,MAAM,MAAM,GAAiB;QAC5B,GAAG,gBAAgB;QACnB,GAAG,QAAQ;KACX,CAAC;IAEF,MAAM,aAAa,GAAG,oBAAoB,CACzC,gBAAgB,CAAC,OAAO,EACxB,QAAQ,CAAC,OAAO,CAChB,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;IAChC,CAAC;SAAM,CAAC;QACP,OAAO,MAAM,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,2EAA2E;IAC3E,IAAI,gBAAgB,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC/C,CAAC;SAAM,CAAC;QACP,OAAO,MAAM,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["import { mergeMaestroSettings } from \"@evalops/contracts\";\nimport type { UserSettings } from \"../db/schema.js\";\n\n/**\n * Merge an incoming user-settings patch onto the previously stored settings.\n *\n * The `maestro` namespace is deep-merged and normalized against the\n * MaestroSettings catalog (`mergeMaestroSettings`), so only typed, valid\n * runtime knobs are ever stored on `users.settings`. Scalar/array fields are\n * replaced.\n *\n * `twoFactor` is managed exclusively by the dedicated 2FA enrollment flow and\n * is never accepted from a generic settings patch — the previous value is\n * always preserved so this endpoint cannot be used to overwrite or strip 2FA\n * state (e.g. backup codes or the TOTP secret).\n */\nexport function mergeUserSettings(\n\tprevious: UserSettings | null | undefined,\n\tincoming: UserSettings,\n): UserSettings {\n\tconst previousSettings: UserSettings = previous ?? {};\n\n\tconst result: UserSettings = {\n\t\t...previousSettings,\n\t\t...incoming,\n\t};\n\n\tconst mergedMaestro = mergeMaestroSettings(\n\t\tpreviousSettings.maestro,\n\t\tincoming.maestro,\n\t);\n\tif (Object.keys(mergedMaestro).length > 0) {\n\t\tresult.maestro = mergedMaestro;\n\t} else {\n\t\tdelete result.maestro;\n\t}\n\n\t// twoFactor is intentionally pinned to the previous value (see docstring).\n\tif (previousSettings.twoFactor !== undefined) {\n\t\tresult.twoFactor = previousSettings.twoFactor;\n\t} else {\n\t\tdelete result.twoFactor;\n\t}\n\n\treturn result;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-lifecycle-api.d.ts","sourceRoot":"","sources":["../../src/app-server/daemon-lifecycle-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,kCAAkC,EAClC,wCAAwC,EAExC,wCAAwC,EACxC,yCAAyC,EACzC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAGN,iBAAiB,EACjB,MAAM,2CAA2C,CAAC;AAQnD,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,KAAK,WAAW,GAAG,OAAO,iBAAiB,CAAC;AAE5C,qBAAa,oCAAqC,SAAQ,KAAK;IAE7D,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,2CAA2C;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,+BAA+B;IAC/C,YAAY,IAAI,2CAA2C,CAAC;IAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC5E,mBAAmB,CAClB,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,yCAAyC,CAAC,CAAC;IACtD,SAAS,CACR,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACrD,cAAc,CACb,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CACJ,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,sCAAsC;IACtD,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CACjB;AAgND,wBAAgB,qCAAqC,CACpD,OAAO,GAAE,sCAA2C,GAClD,+BAA+B,CAgGjC"}
1
+ {"version":3,"file":"daemon-lifecycle-api.d.ts","sourceRoot":"","sources":["../../src/app-server/daemon-lifecycle-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,kCAAkC,EAClC,wCAAwC,EAExC,wCAAwC,EACxC,yCAAyC,EACzC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAGN,iBAAiB,EACjB,MAAM,2CAA2C,CAAC;AASnD,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,KAAK,WAAW,GAAG,OAAO,iBAAiB,CAAC;AAE5C,qBAAa,oCAAqC,SAAQ,KAAK;IAE7D,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,2CAA2C;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,+BAA+B;IAC/C,YAAY,IAAI,2CAA2C,CAAC;IAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC5E,mBAAmB,CAClB,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,yCAAyC,CAAC,CAAC;IACtD,SAAS,CACR,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACrD,cAAc,CACb,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CACJ,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,wCAAwC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,sCAAsC;IACtD,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CACjB;AA4MD,wBAAgB,qCAAqC,CACpD,OAAO,GAAE,sCAA2C,GAClD,+BAA+B,CAgGjC"}
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
3
3
  import { HostedRunnerDrainStatusValue, drainHostedRunner, } from "../server/handlers/hosted-runner-drain.js";
4
4
  import { hostedRunnerLeaseSnapshot, refreshHostedRunnerLease, } from "../server/hosted-runner-lease.js";
5
5
  import { ApiError } from "../server/server-utils.js";
6
+ import { isRecord } from "../utils/json.js";
6
7
  import { sanitizeWithStaticMask } from "../utils/secret-redactor.js";
7
8
  export class MaestroAppServerDaemonLifecycleError extends Error {
8
9
  constructor(code, message) {
@@ -21,9 +22,6 @@ function optionalString(value, field) {
21
22
  const trimmed = value.trim();
22
23
  return trimmed || undefined;
23
24
  }
24
- function isRecord(value) {
25
- return typeof value === "object" && value !== null && !Array.isArray(value);
26
- }
27
25
  function paramsRecord(params) {
28
26
  if (params === undefined) {
29
27
  return {};
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-lifecycle-api.js","sourceRoot":"","sources":["../../src/app-server/daemon-lifecycle-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type {\n\tMaestroAppServerDaemonStatusResult,\n\tMaestroAppServerRemoteControlDrainResult,\n\tMaestroAppServerRemoteControlLease,\n\tMaestroAppServerRemoteControlLeaseResult,\n\tMaestroAppServerRemoteControlStatusResult,\n} from \"@evalops/contracts\";\nimport type { HostedRunnerContext } from \"../server/app-context.js\";\nimport {\n\ttype HostedRunnerDrainInput,\n\tHostedRunnerDrainStatusValue,\n\tdrainHostedRunner,\n} from \"../server/handlers/hosted-runner-drain.js\";\nimport {\n\thostedRunnerLeaseSnapshot,\n\trefreshHostedRunnerLease,\n} from \"../server/hosted-runner-lease.js\";\nimport { ApiError } from \"../server/server-utils.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype DrainRunner = typeof drainHostedRunner;\n\nexport class MaestroAppServerDaemonLifecycleError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MaestroAppServerDaemonLifecycleError\";\n\t}\n}\n\nexport interface MaestroAppServerDaemonLifecycleCapabilities {\n\tdaemonStatus: boolean;\n\tremoteControlStatus: boolean;\n\tremoteControlLease: boolean;\n\tremoteControlDrain: boolean;\n}\n\nexport interface MaestroAppServerDaemonLifecycle {\n\tcapabilities(): MaestroAppServerDaemonLifecycleCapabilities;\n\tstatus(params?: UnknownRecord): Promise<MaestroAppServerDaemonStatusResult>;\n\tremoteControlStatus(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlStatusResult>;\n\treadLease(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlLeaseResult>;\n\theartbeatLease(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlLeaseResult>;\n\tdrain(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlDrainResult>;\n}\n\nexport interface MaestroAppServerDaemonLifecycleOptions {\n\thostedRunner?: HostedRunnerContext;\n\tdrainRunner?: DrainRunner;\n\tnow?: () => Date;\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(-32602, `Invalid ${field}`);\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed || undefined;\n}\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction paramsRecord(params: unknown): UnknownRecord {\n\tif (params === undefined) {\n\t\treturn {};\n\t}\n\tif (isRecord(params)) {\n\t\treturn params;\n\t}\n\tthrow new MaestroAppServerDaemonLifecycleError(-32602, \"Invalid params\");\n}\n\nfunction optionalStringArray(\n\tvalue: unknown,\n\tfield: string,\n): string[] | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(-32602, `Invalid ${field}`);\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (typeof entry !== \"string\" || !entry.trim()) {\n\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t-32602,\n\t\t\t\t`Invalid ${field}[${index}]`,\n\t\t\t);\n\t\t}\n\t\tif (entry.includes(\"\\0\")) {\n\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t-32602,\n\t\t\t\t`Invalid ${field}[${index}]`,\n\t\t\t);\n\t\t}\n\t\treturn entry.trim();\n\t});\n}\n\nfunction toLease(\n\thostedRunner: HostedRunnerContext,\n\tnow: Date,\n): MaestroAppServerRemoteControlLease {\n\tconst lease = hostedRunnerLeaseSnapshot(hostedRunner, now);\n\treturn {\n\t\tprotocolVersion: lease.protocolVersion,\n\t\trunnerSessionId: lease.runnerSessionId,\n\t\townerInstanceId: lease.ownerInstanceId,\n\t\tworkspaceId: lease.workspaceId,\n\t\tagentId: lease.agentId,\n\t\tagentRunId: lease.agentRunId,\n\t\tmaestroSessionId: lease.maestroSessionId,\n\t\tconfiguredMaestroSessionId: lease.configuredMaestroSessionId,\n\t\tstate: lease.state,\n\t\tgeneration: lease.generation,\n\t\theartbeatAt: lease.heartbeatAt,\n\t\tupdatedAt: lease.updatedAt,\n\t\tleaseTokenPresent: Boolean(lease.leaseToken),\n\t};\n}\n\nfunction nowFromOptions(options: MaestroAppServerDaemonLifecycleOptions): Date {\n\treturn options.now?.() ?? new Date();\n}\n\nasync function remoteControlStatus(\n\toptions: MaestroAppServerDaemonLifecycleOptions,\n): Promise<MaestroAppServerRemoteControlStatusResult> {\n\tconst hostedRunner = options.hostedRunner;\n\tif (!hostedRunner?.enabled) {\n\t\treturn {\n\t\t\tavailable: false,\n\t\t\tstatus: \"unavailable\",\n\t\t\tlease: null,\n\t\t};\n\t}\n\n\tconst now = nowFromOptions(options);\n\tconst maestroSessionId =\n\t\thostedRunner.activeMaestroSessionId ??\n\t\thostedRunner.configuredMaestroSessionId;\n\tconst base = {\n\t\tavailable: true,\n\t\trunnerSessionId: hostedRunner.runnerSessionId,\n\t\townerInstanceId: hostedRunner.ownerInstanceId,\n\t\tworkspaceRoot: hostedRunner.workspaceRoot,\n\t\tsnapshotRoot: hostedRunner.snapshotRoot,\n\t\tworkspaceId: hostedRunner.workspaceId,\n\t\tagentId: hostedRunner.agentId,\n\t\tagentRunId: hostedRunner.agentRunId,\n\t\ta2aMessageId: hostedRunner.a2aMessageId,\n\t\ta2aTaskId: hostedRunner.a2aTaskId,\n\t\tagentRuntimeWorkerQueue: hostedRunner.agentRuntimeWorkerQueue,\n\t\tagentRuntimeCorrelationPath: hostedRunner.agentRuntimeCorrelationPath,\n\t\tmaestroSessionId,\n\t\tlastDrain: hostedRunner.lastDrain\n\t\t\t? { ...hostedRunner.lastDrain }\n\t\t\t: undefined,\n\t\tlease: toLease(hostedRunner, now),\n\t};\n\n\tif (hostedRunner.draining) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"draining\",\n\t\t};\n\t}\n\n\ttry {\n\t\tconst stats = await stat(hostedRunner.workspaceRoot);\n\t\tif (!stats.isDirectory()) {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\terror: \"workspace root is not a directory\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"ready\",\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"unavailable\",\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t};\n\t}\n}\n\nfunction requireHostedRunner(\n\toptions: MaestroAppServerDaemonLifecycleOptions,\n): HostedRunnerContext {\n\tif (!options.hostedRunner?.enabled) {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t-32601,\n\t\t\t\"Remote control lifecycle is not available\",\n\t\t);\n\t}\n\treturn options.hostedRunner;\n}\n\nfunction drainInputFromParams(params: UnknownRecord): HostedRunnerDrainInput {\n\treturn {\n\t\treason:\n\t\t\toptionalString(params.reason, \"reason\") ??\n\t\t\toptionalString(params.stop_reason, \"stop_reason\"),\n\t\trequestedBy:\n\t\t\toptionalString(params.requestedBy, \"requestedBy\") ??\n\t\t\toptionalString(params.requested_by, \"requested_by\"),\n\t\texportPaths:\n\t\t\toptionalStringArray(params.exportPaths, \"exportPaths\") ??\n\t\t\toptionalStringArray(params.export_paths, \"export_paths\"),\n\t};\n}\n\nfunction daemonLifecycleErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction apiStatusToJsonRpcCode(statusCode: number): number {\n\tswitch (statusCode) {\n\t\tcase 400:\n\t\t\treturn -32602;\n\t\tcase 404:\n\t\t\treturn -32004;\n\t\tcase 503:\n\t\t\treturn -32005;\n\t\tdefault:\n\t\t\treturn -32000;\n\t}\n}\n\nfunction toDaemonLifecycleError(\n\terror: unknown,\n): MaestroAppServerDaemonLifecycleError {\n\tif (error instanceof MaestroAppServerDaemonLifecycleError) {\n\t\treturn error;\n\t}\n\tif (error instanceof ApiError) {\n\t\treturn new MaestroAppServerDaemonLifecycleError(\n\t\t\tapiStatusToJsonRpcCode(error.statusCode),\n\t\t\terror.message,\n\t\t);\n\t}\n\treturn new MaestroAppServerDaemonLifecycleError(\n\t\t-32000,\n\t\tdaemonLifecycleErrorMessage(error),\n\t);\n}\n\nexport function createMaestroAppServerDaemonLifecycle(\n\toptions: MaestroAppServerDaemonLifecycleOptions = {},\n): MaestroAppServerDaemonLifecycle {\n\tconst drainRunner = options.drainRunner ?? drainHostedRunner;\n\treturn {\n\t\tcapabilities() {\n\t\t\tconst remoteControlAvailable = Boolean(options.hostedRunner?.enabled);\n\t\t\treturn {\n\t\t\t\tdaemonStatus: true,\n\t\t\t\tremoteControlStatus: remoteControlAvailable,\n\t\t\t\tremoteControlLease: remoteControlAvailable,\n\t\t\t\tremoteControlDrain: remoteControlAvailable,\n\t\t\t};\n\t\t},\n\n\t\tasync status() {\n\t\t\treturn {\n\t\t\t\tdaemon: {\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t\tppid: process.ppid,\n\t\t\t\t\tplatform: process.platform,\n\t\t\t\t\tarch: process.arch,\n\t\t\t\t\tnodeVersion: process.version,\n\t\t\t\t\tcwd: resolve(process.cwd()),\n\t\t\t\t\tuptimeMs: Math.round(process.uptime() * 1000),\n\t\t\t\t},\n\t\t\t\tremoteControl: await remoteControlStatus(options),\n\t\t\t};\n\t\t},\n\n\t\tasync remoteControlStatus() {\n\t\t\trequireHostedRunner(options);\n\t\t\treturn remoteControlStatus(options);\n\t\t},\n\n\t\tasync readLease() {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\treturn {\n\t\t\t\tavailable: true,\n\t\t\t\tlease: toLease(hostedRunner, nowFromOptions(options)),\n\t\t\t};\n\t\t},\n\n\t\tasync heartbeatLease() {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\tconst lease = refreshHostedRunnerLease(\n\t\t\t\thostedRunner,\n\t\t\t\tnowFromOptions(options),\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tavailable: true,\n\t\t\t\tlease: {\n\t\t\t\t\tprotocolVersion: lease.protocolVersion,\n\t\t\t\t\trunnerSessionId: lease.runnerSessionId,\n\t\t\t\t\townerInstanceId: lease.ownerInstanceId,\n\t\t\t\t\tworkspaceId: lease.workspaceId,\n\t\t\t\t\tagentId: lease.agentId,\n\t\t\t\t\tagentRunId: lease.agentRunId,\n\t\t\t\t\tmaestroSessionId: lease.maestroSessionId,\n\t\t\t\t\tconfiguredMaestroSessionId: lease.configuredMaestroSessionId,\n\t\t\t\t\tstate: lease.state,\n\t\t\t\t\tgeneration: lease.generation,\n\t\t\t\t\theartbeatAt: lease.heartbeatAt,\n\t\t\t\t\tupdatedAt: lease.updatedAt,\n\t\t\t\t\tleaseTokenPresent: Boolean(lease.leaseToken),\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tasync drain(params = {}) {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\tlet result: Awaited<ReturnType<DrainRunner>>;\n\t\t\ttry {\n\t\t\t\tresult = await drainRunner(drainInputFromParams(paramsRecord(params)), {\n\t\t\t\t\thostedRunner,\n\t\t\t\t\tnow: options.now,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthrow toDaemonLifecycleError(error);\n\t\t\t}\n\t\t\tif (!result) {\n\t\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t\t-32601,\n\t\t\t\t\t\"Remote control drain is not available\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdrained: result.status === HostedRunnerDrainStatusValue.Drained,\n\t\t\t\tstatus: result.status,\n\t\t\t\trunnerSessionId: result.runner_session_id,\n\t\t\t\treason: result.reason,\n\t\t\t\trequestedBy: result.requested_by,\n\t\t\t\tmanifestPath: result.manifest_path,\n\t\t\t\tmanifest: result.manifest,\n\t\t\t\tremoteControl: await remoteControlStatus(options),\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"daemon-lifecycle-api.js","sourceRoot":"","sources":["../../src/app-server/daemon-lifecycle-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type {\n\tMaestroAppServerDaemonStatusResult,\n\tMaestroAppServerRemoteControlDrainResult,\n\tMaestroAppServerRemoteControlLease,\n\tMaestroAppServerRemoteControlLeaseResult,\n\tMaestroAppServerRemoteControlStatusResult,\n} from \"@evalops/contracts\";\nimport type { HostedRunnerContext } from \"../server/app-context.js\";\nimport {\n\ttype HostedRunnerDrainInput,\n\tHostedRunnerDrainStatusValue,\n\tdrainHostedRunner,\n} from \"../server/handlers/hosted-runner-drain.js\";\nimport {\n\thostedRunnerLeaseSnapshot,\n\trefreshHostedRunnerLease,\n} from \"../server/hosted-runner-lease.js\";\nimport { ApiError } from \"../server/server-utils.js\";\nimport { isRecord } from \"../utils/json.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype DrainRunner = typeof drainHostedRunner;\n\nexport class MaestroAppServerDaemonLifecycleError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MaestroAppServerDaemonLifecycleError\";\n\t}\n}\n\nexport interface MaestroAppServerDaemonLifecycleCapabilities {\n\tdaemonStatus: boolean;\n\tremoteControlStatus: boolean;\n\tremoteControlLease: boolean;\n\tremoteControlDrain: boolean;\n}\n\nexport interface MaestroAppServerDaemonLifecycle {\n\tcapabilities(): MaestroAppServerDaemonLifecycleCapabilities;\n\tstatus(params?: UnknownRecord): Promise<MaestroAppServerDaemonStatusResult>;\n\tremoteControlStatus(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlStatusResult>;\n\treadLease(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlLeaseResult>;\n\theartbeatLease(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlLeaseResult>;\n\tdrain(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerRemoteControlDrainResult>;\n}\n\nexport interface MaestroAppServerDaemonLifecycleOptions {\n\thostedRunner?: HostedRunnerContext;\n\tdrainRunner?: DrainRunner;\n\tnow?: () => Date;\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(-32602, `Invalid ${field}`);\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed || undefined;\n}\n\nfunction paramsRecord(params: unknown): UnknownRecord {\n\tif (params === undefined) {\n\t\treturn {};\n\t}\n\tif (isRecord(params)) {\n\t\treturn params;\n\t}\n\tthrow new MaestroAppServerDaemonLifecycleError(-32602, \"Invalid params\");\n}\n\nfunction optionalStringArray(\n\tvalue: unknown,\n\tfield: string,\n): string[] | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(-32602, `Invalid ${field}`);\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (typeof entry !== \"string\" || !entry.trim()) {\n\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t-32602,\n\t\t\t\t`Invalid ${field}[${index}]`,\n\t\t\t);\n\t\t}\n\t\tif (entry.includes(\"\\0\")) {\n\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t-32602,\n\t\t\t\t`Invalid ${field}[${index}]`,\n\t\t\t);\n\t\t}\n\t\treturn entry.trim();\n\t});\n}\n\nfunction toLease(\n\thostedRunner: HostedRunnerContext,\n\tnow: Date,\n): MaestroAppServerRemoteControlLease {\n\tconst lease = hostedRunnerLeaseSnapshot(hostedRunner, now);\n\treturn {\n\t\tprotocolVersion: lease.protocolVersion,\n\t\trunnerSessionId: lease.runnerSessionId,\n\t\townerInstanceId: lease.ownerInstanceId,\n\t\tworkspaceId: lease.workspaceId,\n\t\tagentId: lease.agentId,\n\t\tagentRunId: lease.agentRunId,\n\t\tmaestroSessionId: lease.maestroSessionId,\n\t\tconfiguredMaestroSessionId: lease.configuredMaestroSessionId,\n\t\tstate: lease.state,\n\t\tgeneration: lease.generation,\n\t\theartbeatAt: lease.heartbeatAt,\n\t\tupdatedAt: lease.updatedAt,\n\t\tleaseTokenPresent: Boolean(lease.leaseToken),\n\t};\n}\n\nfunction nowFromOptions(options: MaestroAppServerDaemonLifecycleOptions): Date {\n\treturn options.now?.() ?? new Date();\n}\n\nasync function remoteControlStatus(\n\toptions: MaestroAppServerDaemonLifecycleOptions,\n): Promise<MaestroAppServerRemoteControlStatusResult> {\n\tconst hostedRunner = options.hostedRunner;\n\tif (!hostedRunner?.enabled) {\n\t\treturn {\n\t\t\tavailable: false,\n\t\t\tstatus: \"unavailable\",\n\t\t\tlease: null,\n\t\t};\n\t}\n\n\tconst now = nowFromOptions(options);\n\tconst maestroSessionId =\n\t\thostedRunner.activeMaestroSessionId ??\n\t\thostedRunner.configuredMaestroSessionId;\n\tconst base = {\n\t\tavailable: true,\n\t\trunnerSessionId: hostedRunner.runnerSessionId,\n\t\townerInstanceId: hostedRunner.ownerInstanceId,\n\t\tworkspaceRoot: hostedRunner.workspaceRoot,\n\t\tsnapshotRoot: hostedRunner.snapshotRoot,\n\t\tworkspaceId: hostedRunner.workspaceId,\n\t\tagentId: hostedRunner.agentId,\n\t\tagentRunId: hostedRunner.agentRunId,\n\t\ta2aMessageId: hostedRunner.a2aMessageId,\n\t\ta2aTaskId: hostedRunner.a2aTaskId,\n\t\tagentRuntimeWorkerQueue: hostedRunner.agentRuntimeWorkerQueue,\n\t\tagentRuntimeCorrelationPath: hostedRunner.agentRuntimeCorrelationPath,\n\t\tmaestroSessionId,\n\t\tlastDrain: hostedRunner.lastDrain\n\t\t\t? { ...hostedRunner.lastDrain }\n\t\t\t: undefined,\n\t\tlease: toLease(hostedRunner, now),\n\t};\n\n\tif (hostedRunner.draining) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"draining\",\n\t\t};\n\t}\n\n\ttry {\n\t\tconst stats = await stat(hostedRunner.workspaceRoot);\n\t\tif (!stats.isDirectory()) {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\terror: \"workspace root is not a directory\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"ready\",\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"unavailable\",\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t};\n\t}\n}\n\nfunction requireHostedRunner(\n\toptions: MaestroAppServerDaemonLifecycleOptions,\n): HostedRunnerContext {\n\tif (!options.hostedRunner?.enabled) {\n\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t-32601,\n\t\t\t\"Remote control lifecycle is not available\",\n\t\t);\n\t}\n\treturn options.hostedRunner;\n}\n\nfunction drainInputFromParams(params: UnknownRecord): HostedRunnerDrainInput {\n\treturn {\n\t\treason:\n\t\t\toptionalString(params.reason, \"reason\") ??\n\t\t\toptionalString(params.stop_reason, \"stop_reason\"),\n\t\trequestedBy:\n\t\t\toptionalString(params.requestedBy, \"requestedBy\") ??\n\t\t\toptionalString(params.requested_by, \"requested_by\"),\n\t\texportPaths:\n\t\t\toptionalStringArray(params.exportPaths, \"exportPaths\") ??\n\t\t\toptionalStringArray(params.export_paths, \"export_paths\"),\n\t};\n}\n\nfunction daemonLifecycleErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction apiStatusToJsonRpcCode(statusCode: number): number {\n\tswitch (statusCode) {\n\t\tcase 400:\n\t\t\treturn -32602;\n\t\tcase 404:\n\t\t\treturn -32004;\n\t\tcase 503:\n\t\t\treturn -32005;\n\t\tdefault:\n\t\t\treturn -32000;\n\t}\n}\n\nfunction toDaemonLifecycleError(\n\terror: unknown,\n): MaestroAppServerDaemonLifecycleError {\n\tif (error instanceof MaestroAppServerDaemonLifecycleError) {\n\t\treturn error;\n\t}\n\tif (error instanceof ApiError) {\n\t\treturn new MaestroAppServerDaemonLifecycleError(\n\t\t\tapiStatusToJsonRpcCode(error.statusCode),\n\t\t\terror.message,\n\t\t);\n\t}\n\treturn new MaestroAppServerDaemonLifecycleError(\n\t\t-32000,\n\t\tdaemonLifecycleErrorMessage(error),\n\t);\n}\n\nexport function createMaestroAppServerDaemonLifecycle(\n\toptions: MaestroAppServerDaemonLifecycleOptions = {},\n): MaestroAppServerDaemonLifecycle {\n\tconst drainRunner = options.drainRunner ?? drainHostedRunner;\n\treturn {\n\t\tcapabilities() {\n\t\t\tconst remoteControlAvailable = Boolean(options.hostedRunner?.enabled);\n\t\t\treturn {\n\t\t\t\tdaemonStatus: true,\n\t\t\t\tremoteControlStatus: remoteControlAvailable,\n\t\t\t\tremoteControlLease: remoteControlAvailable,\n\t\t\t\tremoteControlDrain: remoteControlAvailable,\n\t\t\t};\n\t\t},\n\n\t\tasync status() {\n\t\t\treturn {\n\t\t\t\tdaemon: {\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t\tppid: process.ppid,\n\t\t\t\t\tplatform: process.platform,\n\t\t\t\t\tarch: process.arch,\n\t\t\t\t\tnodeVersion: process.version,\n\t\t\t\t\tcwd: resolve(process.cwd()),\n\t\t\t\t\tuptimeMs: Math.round(process.uptime() * 1000),\n\t\t\t\t},\n\t\t\t\tremoteControl: await remoteControlStatus(options),\n\t\t\t};\n\t\t},\n\n\t\tasync remoteControlStatus() {\n\t\t\trequireHostedRunner(options);\n\t\t\treturn remoteControlStatus(options);\n\t\t},\n\n\t\tasync readLease() {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\treturn {\n\t\t\t\tavailable: true,\n\t\t\t\tlease: toLease(hostedRunner, nowFromOptions(options)),\n\t\t\t};\n\t\t},\n\n\t\tasync heartbeatLease() {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\tconst lease = refreshHostedRunnerLease(\n\t\t\t\thostedRunner,\n\t\t\t\tnowFromOptions(options),\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tavailable: true,\n\t\t\t\tlease: {\n\t\t\t\t\tprotocolVersion: lease.protocolVersion,\n\t\t\t\t\trunnerSessionId: lease.runnerSessionId,\n\t\t\t\t\townerInstanceId: lease.ownerInstanceId,\n\t\t\t\t\tworkspaceId: lease.workspaceId,\n\t\t\t\t\tagentId: lease.agentId,\n\t\t\t\t\tagentRunId: lease.agentRunId,\n\t\t\t\t\tmaestroSessionId: lease.maestroSessionId,\n\t\t\t\t\tconfiguredMaestroSessionId: lease.configuredMaestroSessionId,\n\t\t\t\t\tstate: lease.state,\n\t\t\t\t\tgeneration: lease.generation,\n\t\t\t\t\theartbeatAt: lease.heartbeatAt,\n\t\t\t\t\tupdatedAt: lease.updatedAt,\n\t\t\t\t\tleaseTokenPresent: Boolean(lease.leaseToken),\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tasync drain(params = {}) {\n\t\t\tconst hostedRunner = requireHostedRunner(options);\n\t\t\tlet result: Awaited<ReturnType<DrainRunner>>;\n\t\t\ttry {\n\t\t\t\tresult = await drainRunner(drainInputFromParams(paramsRecord(params)), {\n\t\t\t\t\thostedRunner,\n\t\t\t\t\tnow: options.now,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthrow toDaemonLifecycleError(error);\n\t\t\t}\n\t\t\tif (!result) {\n\t\t\t\tthrow new MaestroAppServerDaemonLifecycleError(\n\t\t\t\t\t-32601,\n\t\t\t\t\t\"Remote control drain is not available\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdrained: result.status === HostedRunnerDrainStatusValue.Drained,\n\t\t\t\tstatus: result.status,\n\t\t\t\trunnerSessionId: result.runner_session_id,\n\t\t\t\treason: result.reason,\n\t\t\t\trequestedBy: result.requested_by,\n\t\t\t\tmanifestPath: result.manifest_path,\n\t\t\t\tmanifest: result.manifest,\n\t\t\t\tremoteControl: await remoteControlStatus(options),\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"external-agent-import-api.d.ts","sourceRoot":"","sources":["../../src/app-server/external-agent-import-api.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACX,yCAAyC,EAGzC,MAAM,oBAAoB,CAAC;AAgB5B,OAAO,EACN,KAAK,YAAY,EAGjB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAG7C,qBAAa,wCAAyC,SAAQ,KAAK;IAEjE,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,4CAA4C;IAC5D,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK;QACnD,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QACzC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;CACF;AAED,MAAM,WAAW,mCAAmC;IACnD,YAAY,CACX,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,yCAAyC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,0CAA0C;IAC1D,KAAK,CAAC,EAAE,4CAA4C,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAgB,kCAAkC,CACjD,KAAK,EAAE,OAAO,GACZ,aAAa,CAWf;AAqqBD,wBAAgB,yCAAyC,CACxD,OAAO,GAAE,0CAA+C,GACtD,mCAAmC,CAwBrC"}
1
+ {"version":3,"file":"external-agent-import-api.d.ts","sourceRoot":"","sources":["../../src/app-server/external-agent-import-api.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACX,yCAAyC,EAGzC,MAAM,oBAAoB,CAAC;AAgB5B,OAAO,EACN,KAAK,YAAY,EAGjB,MAAM,qBAAqB,CAAC;AAI7B,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAG7C,qBAAa,wCAAyC,SAAQ,KAAK;IAEjE,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,4CAA4C;IAC5D,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK;QACnD,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QACzC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;CACF;AAED,MAAM,WAAW,mCAAmC;IACnD,YAAY,CACX,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,yCAAyC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,0CAA0C;IAC1D,KAAK,CAAC,EAAE,4CAA4C,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAgB,kCAAkC,CACjD,KAAK,EAAE,OAAO,GACZ,aAAa,CAWf;AAqqBD,wBAAgB,yCAAyC,CACxD,OAAO,GAAE,0CAA+C,GACtD,mCAAmC,CAwBrC"}
@@ -10,6 +10,7 @@ import { addMcpServersToConfig, inferRemoteMcpTransport, validateMcpServersForCo
10
10
  import { mcpServerSchema } from "../mcp/schema.js";
11
11
  import { normalizeSessionEntry, tryParseSessionEntry, } from "../session/types.js";
12
12
  import { writeTextFileAtomic } from "../utils/fs.js";
13
+ import { isRecord } from "../utils/json.js";
13
14
  const PORTABLE_SESSION_EXPORT_FORMAT = "maestro-session-export.v1";
14
15
  export class MaestroAppServerExternalAgentImportError extends Error {
15
16
  constructor(code, message) {
@@ -18,9 +19,6 @@ export class MaestroAppServerExternalAgentImportError extends Error {
18
19
  this.name = "MaestroAppServerExternalAgentImportError";
19
20
  }
20
21
  }
21
- function isRecord(value) {
22
- return typeof value === "object" && value !== null && !Array.isArray(value);
23
- }
24
22
  function stringValue(value) {
25
23
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
26
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"external-agent-import-api.js","sourceRoot":"","sources":["../../src/app-server/external-agent-import-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n\texistsSync,\n\tmkdirSync,\n\tmkdtempSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { dirname, extname, join, posix, resolve, win32 } from \"node:path\";\nimport type {\n\tMaestroAppServerExternalAgentImportResult,\n\tMaestroAppServerExternalAgentImportScope,\n\tMaestroAppServerExternalAgentImportedArtifact,\n} from \"@evalops/contracts\";\nimport { parse as parseTOML, stringify as stringifyTOML } from \"smol-toml\";\nimport { PATHS } from \"../config/constants.js\";\nimport { getWritablePackageConfigPath } from \"../config/toml-config.js\";\nimport { clearConfigCache } from \"../config/toml-config.js\";\nimport {\n\tgetProjectHooksConfigPath,\n\tgetUserHooksConfigPath,\n} from \"../hooks/config.js\";\nimport {\n\ttype WritableMcpScope,\n\taddMcpServersToConfig,\n\tinferRemoteMcpTransport,\n\tvalidateMcpServersForConfig,\n} from \"../mcp/config.js\";\nimport { type McpServerInput, mcpServerSchema } from \"../mcp/schema.js\";\nimport {\n\ttype SessionEntry,\n\tnormalizeSessionEntry,\n\ttryParseSessionEntry,\n} from \"../session/types.js\";\nimport { writeTextFileAtomic } from \"../utils/fs.js\";\n\ntype UnknownRecord = Record<string, unknown>;\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\nexport class MaestroAppServerExternalAgentImportError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MaestroAppServerExternalAgentImportError\";\n\t}\n}\n\nexport interface MaestroAppServerExternalAgentSessionImporter {\n\timportSessionEntries?: (entries: SessionEntry[]) => {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t};\n\timportPortableSession?: (path: string) => {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t};\n}\n\nexport interface MaestroAppServerExternalAgentImport {\n\timportBundle(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerExternalAgentImportResult>;\n}\n\nexport interface MaestroAppServerExternalAgentImportOptions {\n\tstore?: MaestroAppServerExternalAgentSessionImporter;\n\tprojectRoot?: string;\n}\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction booleanValue(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\n\nexport function normalizeExternalAgentImportParams(\n\tvalue: unknown,\n): UnknownRecord {\n\tif (value === undefined || value === null) {\n\t\treturn {};\n\t}\n\tif (!isRecord(value)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Invalid params\",\n\t\t);\n\t}\n\treturn value;\n}\n\nfunction artifactScope(\n\tartifact: UnknownRecord,\n\tfallback: MaestroAppServerExternalAgentImportScope,\n): MaestroAppServerExternalAgentImportScope {\n\tconst scope = stringValue(artifact.scope);\n\tif (scope === \"project\" || scope === \"local\" || scope === \"user\") {\n\t\treturn scope;\n\t}\n\treturn fallback;\n}\n\nfunction requireArtifacts(params: UnknownRecord): UnknownRecord[] {\n\tconst artifacts = params.artifacts;\n\tif (!Array.isArray(artifacts)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"External agent import requires artifacts\",\n\t\t);\n\t}\n\tif (artifacts.some((artifact) => !isRecord(artifact))) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"External agent import artifacts must be objects\",\n\t\t);\n\t}\n\treturn artifacts;\n}\n\nfunction importSource(params: UnknownRecord): { name: string; type?: string } {\n\tconst source = isRecord(params.source) ? params.source : {};\n\treturn {\n\t\tname: stringValue(source.name) ?? \"external-agent\",\n\t\ttype: stringValue(source.type),\n\t};\n}\n\nfunction safeSkillName(value: unknown): string {\n\tconst name = stringValue(value);\n\tif (!name || !/^[a-z0-9][a-z0-9_-]{0,63}$/.test(name)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires a safe skill name\",\n\t\t);\n\t}\n\treturn name;\n}\n\nfunction safeRelativePath(value: unknown): string {\n\tconst relativePath = stringValue(value);\n\tif (!relativePath) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported file requires a relative path\",\n\t\t);\n\t}\n\tconst slashPath = relativePath.replaceAll(\"\\\\\", \"/\");\n\tconst normalized = posix.normalize(slashPath);\n\tconst winNormalized = win32.normalize(relativePath);\n\tif (\n\t\tposix.isAbsolute(normalized) ||\n\t\twin32.isAbsolute(relativePath) ||\n\t\t/^[A-Za-z]:/.test(relativePath) ||\n\t\tnormalized === \"..\" ||\n\t\tnormalized.startsWith(\"../\") ||\n\t\tnormalized.includes(\"/../\") ||\n\t\twinNormalized === \"..\" ||\n\t\twinNormalized.startsWith(\"..\\\\\") ||\n\t\twinNormalized.includes(\"\\\\..\\\\\")\n\t) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported file path must stay inside its target directory\",\n\t\t);\n\t}\n\treturn normalized;\n}\n\nfunction artifactMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction hasOwn(record: UnknownRecord, key: string): boolean {\n\treturn Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction readJsonObject(path: string): UnknownRecord {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\tconst parsed = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n\treturn isRecord(parsed) ? parsed : {};\n}\n\nfunction writeJsonObject(path: string, value: UnknownRecord): void {\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteTextFileAtomic(path, `${JSON.stringify(value, null, 2)}\\n`, {\n\t\tencoding: \"utf-8\",\n\t});\n}\n\nfunction mergeRecords(\n\tbase: UnknownRecord,\n\tincoming: UnknownRecord,\n): UnknownRecord {\n\tconst merged: UnknownRecord = { ...base };\n\tfor (const [key, value] of Object.entries(incoming)) {\n\t\t// Skip prototype-polluting keys (fixes #2542 defense-in-depth).\n\t\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = merged[key];\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tmerged[key] = mergeRecords(current, value);\n\t\t} else {\n\t\t\tmerged[key] = value;\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction configContent(artifact: UnknownRecord): UnknownRecord {\n\tif (isRecord(artifact.values)) {\n\t\treturn artifact.values;\n\t}\n\tconst content = stringValue(artifact.content);\n\tif (!content) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Config artifact requires values or TOML content\",\n\t\t);\n\t}\n\tconst parsed = parseTOML(content) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Config TOML must parse to an object\",\n\t\t);\n\t}\n\treturn parsed;\n}\n\nfunction writeConfigImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"local\");\n\tconst path = getWritablePackageConfigPath(scope, projectRoot);\n\tconst incoming = configContent(artifact);\n\tconst existing = existsSync(path)\n\t\t? (parseTOML(readFileSync(path, \"utf8\")) as unknown)\n\t\t: {};\n\tconst merged = mergeRecords(isRecord(existing) ? existing : {}, incoming);\n\tif (!dryRun) {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\tconst rendered = stringifyTOML(merged).trim();\n\t\twriteTextFileAtomic(path, rendered ? `${rendered}\\n` : \"\", {\n\t\t\tencoding: \"utf-8\",\n\t\t});\n\t\tclearConfigCache();\n\t}\n\treturn {\n\t\tkind: \"config\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tpath,\n\t\tmessage: dryRun ? \"Config TOML merge planned\" : \"Config TOML merged\",\n\t};\n}\n\nfunction hooksContent(artifact: UnknownRecord): UnknownRecord {\n\tif (isRecord(artifact.config)) {\n\t\treturn artifact.config;\n\t}\n\tif (isRecord(artifact.hooks)) {\n\t\treturn { hooks: artifact.hooks };\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Hooks artifact requires config or hooks\",\n\t);\n}\n\nfunction mergeHooksConfig(\n\texisting: UnknownRecord,\n\tincoming: UnknownRecord,\n): UnknownRecord {\n\tconst existingHooks = isRecord(existing.hooks) ? existing.hooks : {};\n\tconst incomingHooks = isRecord(incoming.hooks) ? incoming.hooks : {};\n\tconst hooks: UnknownRecord = { ...existingHooks };\n\tfor (const [eventType, matchers] of Object.entries(incomingHooks)) {\n\t\thooks[eventType] = [\n\t\t\t...(Array.isArray(existingHooks[eventType])\n\t\t\t\t? existingHooks[eventType]\n\t\t\t\t: []),\n\t\t\t...(Array.isArray(matchers) ? matchers : []),\n\t\t];\n\t}\n\treturn mergeRecords(mergeRecords(existing, incoming), { hooks });\n}\n\nfunction hooksConfigPath(\n\tscope: MaestroAppServerExternalAgentImportScope,\n\tprojectRoot: string,\n): string {\n\tif (scope === \"user\") {\n\t\treturn getUserHooksConfigPath();\n\t}\n\tif (scope === \"local\") {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Hooks artifact does not support local scope\",\n\t\t);\n\t}\n\treturn getProjectHooksConfigPath(projectRoot);\n}\n\nfunction writeHooksImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"project\");\n\tconst path = hooksConfigPath(scope, projectRoot);\n\tconst incoming = hooksContent(artifact);\n\tconst existing = readJsonObject(path);\n\tif (!dryRun) {\n\t\twriteJsonObject(path, mergeHooksConfig(existing, incoming));\n\t}\n\treturn {\n\t\tkind: \"hooks\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tpath,\n\t\tmessage: dryRun ? \"Hooks config merge planned\" : \"Hooks config merged\",\n\t};\n}\n\nfunction mcpServers(artifact: UnknownRecord): UnknownRecord[] {\n\tif (Array.isArray(artifact.servers)) {\n\t\tif (!artifact.servers.every(isRecord)) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"MCP artifact servers must be objects\",\n\t\t\t);\n\t\t}\n\t\treturn artifact.servers;\n\t}\n\tif (hasOwn(artifact, \"server\")) {\n\t\tif (!isRecord(artifact.server)) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"MCP artifact server must be an object\",\n\t\t\t);\n\t\t}\n\t\treturn [artifact.server];\n\t}\n\treturn [];\n}\n\nfunction validateMcpServerForImport(\n\tserver: UnknownRecord,\n\tname: string,\n): McpServerInput & { name: string } {\n\treturn mcpServerSchema.parse({\n\t\t...server,\n\t\tname,\n\t\ttransport:\n\t\t\tserver.transport ??\n\t\t\t(typeof server.url === \"string\"\n\t\t\t\t? inferRemoteMcpTransport(server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n}\n\nfunction writeMcpImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact[] {\n\tconst scope = artifactScope(artifact, \"local\") as WritableMcpScope;\n\tconst servers = mcpServers(artifact);\n\tif (servers.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"MCP artifact requires a server or servers\",\n\t\t);\n\t}\n\tconst validatedServers = servers.map((server) => {\n\t\tconst name = stringValue(server.name) ?? \"(unnamed)\";\n\t\treturn validateMcpServerForImport(server, name);\n\t});\n\tconst result = dryRun\n\t\t? validateMcpServersForConfig({\n\t\t\t\tprojectRoot,\n\t\t\t\tscope,\n\t\t\t\tservers: validatedServers,\n\t\t\t})\n\t\t: addMcpServersToConfig({\n\t\t\t\tprojectRoot,\n\t\t\t\tscope,\n\t\t\t\tservers: validatedServers,\n\t\t\t});\n\tconst imported: MaestroAppServerExternalAgentImportedArtifact[] = [];\n\tfor (const validatedServer of validatedServers) {\n\t\tif (dryRun) {\n\t\t\timported.push({\n\t\t\t\tkind: \"mcp\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tscope,\n\t\t\t\tid: validatedServer.name,\n\t\t\t\tpath: result.path,\n\t\t\t\tmessage: \"MCP server import planned\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\timported.push({\n\t\t\tkind: \"mcp\",\n\t\t\tstatus: \"imported\",\n\t\t\tscope,\n\t\t\tid: validatedServer.name,\n\t\t\tpath: result.path,\n\t\t\tmessage: \"MCP server imported\",\n\t\t});\n\t}\n\treturn imported;\n}\n\nfunction skillRootPath(\n\tscope: MaestroAppServerExternalAgentImportScope,\n\tprojectRoot: string,\n): string {\n\treturn scope === \"user\"\n\t\t? join(PATHS.MAESTRO_HOME, \"skills\")\n\t\t: join(projectRoot, \".maestro\", \"skills\");\n}\n\nfunction fileContent(file: UnknownRecord): string | Buffer {\n\tconst content = typeof file.content === \"string\" ? file.content : undefined;\n\tif (content !== undefined) {\n\t\treturn content;\n\t}\n\tconst contentBase64 =\n\t\ttypeof file.contentBase64 === \"string\" ? file.contentBase64 : undefined;\n\tif (contentBase64 !== undefined) {\n\t\tconst compact = contentBase64.replaceAll(/\\s/g, \"\");\n\t\tif (\n\t\t\tcompact.length === 0 ||\n\t\t\tcompact.length % 4 !== 0 ||\n\t\t\t!/^[A-Za-z0-9+/]*={0,2}$/.test(compact)\n\t\t) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"Skill file contentBase64 is not valid base64\",\n\t\t\t);\n\t\t}\n\t\treturn Buffer.from(compact, \"base64\");\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Skill file requires content or contentBase64\",\n\t);\n}\n\nfunction writeSkillImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"project\");\n\tconst name = safeSkillName(artifact.name);\n\tconst files = Array.isArray(artifact.files) ? artifact.files : [];\n\tif (!files.every(isRecord)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact files must be objects\",\n\t\t);\n\t}\n\tif (files.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires files\",\n\t\t);\n\t}\n\tif (!files.some((file) => safeRelativePath(file.path) === \"SKILL.md\")) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires SKILL.md\",\n\t\t);\n\t}\n\tconst targetDir = join(skillRootPath(scope, projectRoot), name);\n\tconst plannedFiles = files.map((file) => ({\n\t\trelativePath: safeRelativePath(file.path),\n\t\tcontent: fileContent(file),\n\t}));\n\tif (!dryRun) {\n\t\tconst skillRoot = dirname(targetDir);\n\t\tmkdirSync(skillRoot, { recursive: true });\n\t\tlet stagingDir: string | undefined = mkdtempSync(\n\t\t\tjoin(skillRoot, `.${name}-import-`),\n\t\t);\n\t\tlet backupDir: string | undefined;\n\t\tlet promoted = false;\n\t\ttry {\n\t\t\tfor (const file of plannedFiles) {\n\t\t\t\tconst stagedPath = join(stagingDir, file.relativePath);\n\t\t\t\tmkdirSync(dirname(stagedPath), { recursive: true });\n\t\t\t\tif (typeof file.content === \"string\") {\n\t\t\t\t\twriteFileSync(stagedPath, file.content, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\twriteFileSync(stagedPath, file.content);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (existsSync(targetDir)) {\n\t\t\t\tbackupDir = mkdtempSync(join(skillRoot, `.${name}-backup-`));\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t\trenameSync(targetDir, backupDir);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\trenameSync(stagingDir, targetDir);\n\t\t\t\tpromoted = true;\n\t\t\t} catch (error) {\n\t\t\t\tif (backupDir && !existsSync(targetDir)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trenameSync(backupDir, targetDir);\n\t\t\t\t\t\tbackupDir = undefined;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Leave the backup in place rather than deleting the previous skill.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tstagingDir = undefined;\n\t\t\tif (backupDir) {\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t\tbackupDir = undefined;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stagingDir) {\n\t\t\t\trmSync(stagingDir, { recursive: true, force: true });\n\t\t\t}\n\t\t\tif (backupDir && promoted) {\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tkind: \"skill\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tid: name,\n\t\tpath: targetDir,\n\t\tmessage: dryRun ? \"Skill file import planned\" : \"Skill files imported\",\n\t};\n}\n\nfunction validatedSessionEntries(value: unknown): SessionEntry[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Session artifact entries must be an array\",\n\t\t);\n\t}\n\tconst entries = value.map((entry) =>\n\t\tnormalizeSessionEntry(structuredClone(entry)),\n\t);\n\tif (entries.some((entry) => entry === null)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Session artifact entries must contain valid session entries\",\n\t\t);\n\t}\n\tif (entries.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported session file is empty or unreadable.\",\n\t\t);\n\t}\n\tif (!entries.some((entry) => entry?.type === \"session\")) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported session file is missing a session header.\",\n\t\t);\n\t}\n\treturn entries as SessionEntry[];\n}\n\nfunction validatePortableSessionPath(sourcePath: string): string {\n\tconst resolvedSource = resolve(sourcePath);\n\tif (!existsSync(resolvedSource)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Session file not found: ${resolvedSource}`,\n\t\t);\n\t}\n\tif (!statSync(resolvedSource).isFile()) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Session path is not a file: ${resolvedSource}`,\n\t\t);\n\t}\n\treturn resolvedSource;\n}\n\nfunction validatePortableSessionJsonExport(sourcePath: string): void {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t} catch (error) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Portable session export is not valid JSON: ${artifactMessage(error)}`,\n\t\t);\n\t}\n\tif (!isRecord(parsed)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Portable session export must be a JSON object.\",\n\t\t);\n\t}\n\tif (parsed.format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t);\n\t}\n\tif (Array.isArray(parsed.entries)) {\n\t\tvalidatedSessionEntries(parsed.entries);\n\t\treturn;\n\t}\n\tif (Array.isArray(parsed.sessions) && parsed.sessions.length > 0) {\n\t\tfor (const [index, session] of parsed.sessions.entries()) {\n\t\t\tif (!isRecord(session)) {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (typeof session.sessionId !== \"string\") {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Array.isArray(session.entries)) {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export is missing entries for bundled session ${session.sessionId}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tvalidatedSessionEntries(session.entries);\n\t\t}\n\t\treturn;\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t);\n}\n\nfunction validatePortableSessionJsonl(sourcePath: string): void {\n\tconst contents = readFileSync(sourcePath, \"utf8\").trim();\n\tconst entries = contents\n\t\t? contents\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((line) => tryParseSessionEntry(line))\n\t\t\t\t.filter((entry): entry is SessionEntry => Boolean(entry))\n\t\t: [];\n\tvalidatedSessionEntries(entries);\n}\n\nfunction validatePortableSessionContents(sourcePath: string): void {\n\tif (extname(sourcePath).toLowerCase() === \".json\") {\n\t\tvalidatePortableSessionJsonExport(sourcePath);\n\t\treturn;\n\t}\n\tvalidatePortableSessionJsonl(sourcePath);\n}\n\nfunction importSessionArtifact(\n\tstore: MaestroAppServerExternalAgentSessionImporter | undefined,\n\tartifact: UnknownRecord,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tif (!store?.importSessionEntries && !store?.importPortableSession) {\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"skipped\",\n\t\t\tmessage: \"Session import is not available\",\n\t\t};\n\t}\n\tif (hasOwn(artifact, \"entries\") && store.importSessionEntries) {\n\t\tconst entries = validatedSessionEntries(artifact.entries);\n\t\tif (dryRun) {\n\t\t\treturn {\n\t\t\t\tkind: \"session\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tmessage: \"Session import planned\",\n\t\t\t};\n\t\t}\n\t\tconst result = store.importSessionEntries(entries);\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"imported\",\n\t\t\tid: result.sessionId,\n\t\t\tpath: result.sessionFile,\n\t\t\tmessage: `Imported ${result.importedCount} session(s)`,\n\t\t};\n\t}\n\tconst sourcePath = stringValue(artifact.path);\n\tif (sourcePath && store.importPortableSession) {\n\t\tconst resolvedSource = validatePortableSessionPath(sourcePath);\n\t\tvalidatePortableSessionContents(resolvedSource);\n\t\tif (dryRun) {\n\t\t\treturn {\n\t\t\t\tkind: \"session\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tmessage: \"Session import planned\",\n\t\t\t};\n\t\t}\n\t\tconst result = store.importPortableSession(resolvedSource);\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"imported\",\n\t\t\tid: result.sessionId,\n\t\t\tpath: result.sessionFile,\n\t\t\tmessage: `Imported ${result.importedCount} session(s)`,\n\t\t};\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Session artifact requires entries or path\",\n\t);\n}\n\nfunction importArtifact(\n\tstore: MaestroAppServerExternalAgentSessionImporter | undefined,\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact[] {\n\tconst kind = stringValue(artifact.kind);\n\ttry {\n\t\tswitch (kind) {\n\t\t\tcase \"session\":\n\t\t\t\treturn [importSessionArtifact(store, artifact, dryRun)];\n\t\t\tcase \"config\":\n\t\t\t\treturn [writeConfigImport(artifact, projectRoot, dryRun)];\n\t\t\tcase \"hooks\":\n\t\t\t\treturn [writeHooksImport(artifact, projectRoot, dryRun)];\n\t\t\tcase \"mcp\":\n\t\t\t\treturn writeMcpImport(artifact, projectRoot, dryRun);\n\t\t\tcase \"skill\":\n\t\t\t\treturn [writeSkillImport(artifact, projectRoot, dryRun)];\n\t\t\tdefault:\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t\"Unsupported external agent artifact kind\",\n\t\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: [\"session\", \"config\", \"hooks\", \"mcp\", \"skill\"].includes(\n\t\t\t\t\tkind ?? \"\",\n\t\t\t\t)\n\t\t\t\t\t? (kind as MaestroAppServerExternalAgentImportedArtifact[\"kind\"])\n\t\t\t\t\t: \"config\",\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\tmessage: artifactMessage(error),\n\t\t\t},\n\t\t];\n\t}\n}\n\nexport function createMaestroAppServerExternalAgentImport(\n\toptions: MaestroAppServerExternalAgentImportOptions = {},\n): MaestroAppServerExternalAgentImport {\n\treturn {\n\t\tasync importBundle(params = {}) {\n\t\t\tconst normalizedParams = normalizeExternalAgentImportParams(params);\n\t\t\tconst artifacts = requireArtifacts(normalizedParams);\n\t\t\tconst dryRun = booleanValue(normalizedParams.dryRun, true);\n\t\t\tconst projectRoot = resolve(\n\t\t\t\tstringValue(normalizedParams.projectRoot) ??\n\t\t\t\t\toptions.projectRoot ??\n\t\t\t\t\tprocess.cwd(),\n\t\t\t);\n\t\t\tconst imported = artifacts.flatMap((artifact) =>\n\t\t\t\timportArtifact(options.store, artifact, projectRoot, dryRun),\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tsource: importSource(normalizedParams),\n\t\t\t\tdryRun,\n\t\t\t\timported,\n\t\t\t\twarnings: imported\n\t\t\t\t\t.filter((artifact) => artifact.status === \"skipped\")\n\t\t\t\t\t.map((artifact) => artifact.message ?? \"Artifact skipped\"),\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"external-agent-import-api.js","sourceRoot":"","sources":["../../src/app-server/external-agent-import-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n\texistsSync,\n\tmkdirSync,\n\tmkdtempSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { dirname, extname, join, posix, resolve, win32 } from \"node:path\";\nimport type {\n\tMaestroAppServerExternalAgentImportResult,\n\tMaestroAppServerExternalAgentImportScope,\n\tMaestroAppServerExternalAgentImportedArtifact,\n} from \"@evalops/contracts\";\nimport { parse as parseTOML, stringify as stringifyTOML } from \"smol-toml\";\nimport { PATHS } from \"../config/constants.js\";\nimport { getWritablePackageConfigPath } from \"../config/toml-config.js\";\nimport { clearConfigCache } from \"../config/toml-config.js\";\nimport {\n\tgetProjectHooksConfigPath,\n\tgetUserHooksConfigPath,\n} from \"../hooks/config.js\";\nimport {\n\ttype WritableMcpScope,\n\taddMcpServersToConfig,\n\tinferRemoteMcpTransport,\n\tvalidateMcpServersForConfig,\n} from \"../mcp/config.js\";\nimport { type McpServerInput, mcpServerSchema } from \"../mcp/schema.js\";\nimport {\n\ttype SessionEntry,\n\tnormalizeSessionEntry,\n\ttryParseSessionEntry,\n} from \"../session/types.js\";\nimport { writeTextFileAtomic } from \"../utils/fs.js\";\nimport { isRecord } from \"../utils/json.js\";\n\ntype UnknownRecord = Record<string, unknown>;\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\nexport class MaestroAppServerExternalAgentImportError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MaestroAppServerExternalAgentImportError\";\n\t}\n}\n\nexport interface MaestroAppServerExternalAgentSessionImporter {\n\timportSessionEntries?: (entries: SessionEntry[]) => {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t};\n\timportPortableSession?: (path: string) => {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t};\n}\n\nexport interface MaestroAppServerExternalAgentImport {\n\timportBundle(\n\t\tparams?: UnknownRecord,\n\t): Promise<MaestroAppServerExternalAgentImportResult>;\n}\n\nexport interface MaestroAppServerExternalAgentImportOptions {\n\tstore?: MaestroAppServerExternalAgentSessionImporter;\n\tprojectRoot?: string;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction booleanValue(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\n\nexport function normalizeExternalAgentImportParams(\n\tvalue: unknown,\n): UnknownRecord {\n\tif (value === undefined || value === null) {\n\t\treturn {};\n\t}\n\tif (!isRecord(value)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Invalid params\",\n\t\t);\n\t}\n\treturn value;\n}\n\nfunction artifactScope(\n\tartifact: UnknownRecord,\n\tfallback: MaestroAppServerExternalAgentImportScope,\n): MaestroAppServerExternalAgentImportScope {\n\tconst scope = stringValue(artifact.scope);\n\tif (scope === \"project\" || scope === \"local\" || scope === \"user\") {\n\t\treturn scope;\n\t}\n\treturn fallback;\n}\n\nfunction requireArtifacts(params: UnknownRecord): UnknownRecord[] {\n\tconst artifacts = params.artifacts;\n\tif (!Array.isArray(artifacts)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"External agent import requires artifacts\",\n\t\t);\n\t}\n\tif (artifacts.some((artifact) => !isRecord(artifact))) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"External agent import artifacts must be objects\",\n\t\t);\n\t}\n\treturn artifacts;\n}\n\nfunction importSource(params: UnknownRecord): { name: string; type?: string } {\n\tconst source = isRecord(params.source) ? params.source : {};\n\treturn {\n\t\tname: stringValue(source.name) ?? \"external-agent\",\n\t\ttype: stringValue(source.type),\n\t};\n}\n\nfunction safeSkillName(value: unknown): string {\n\tconst name = stringValue(value);\n\tif (!name || !/^[a-z0-9][a-z0-9_-]{0,63}$/.test(name)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires a safe skill name\",\n\t\t);\n\t}\n\treturn name;\n}\n\nfunction safeRelativePath(value: unknown): string {\n\tconst relativePath = stringValue(value);\n\tif (!relativePath) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported file requires a relative path\",\n\t\t);\n\t}\n\tconst slashPath = relativePath.replaceAll(\"\\\\\", \"/\");\n\tconst normalized = posix.normalize(slashPath);\n\tconst winNormalized = win32.normalize(relativePath);\n\tif (\n\t\tposix.isAbsolute(normalized) ||\n\t\twin32.isAbsolute(relativePath) ||\n\t\t/^[A-Za-z]:/.test(relativePath) ||\n\t\tnormalized === \"..\" ||\n\t\tnormalized.startsWith(\"../\") ||\n\t\tnormalized.includes(\"/../\") ||\n\t\twinNormalized === \"..\" ||\n\t\twinNormalized.startsWith(\"..\\\\\") ||\n\t\twinNormalized.includes(\"\\\\..\\\\\")\n\t) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported file path must stay inside its target directory\",\n\t\t);\n\t}\n\treturn normalized;\n}\n\nfunction artifactMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction hasOwn(record: UnknownRecord, key: string): boolean {\n\treturn Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction readJsonObject(path: string): UnknownRecord {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\tconst parsed = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n\treturn isRecord(parsed) ? parsed : {};\n}\n\nfunction writeJsonObject(path: string, value: UnknownRecord): void {\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteTextFileAtomic(path, `${JSON.stringify(value, null, 2)}\\n`, {\n\t\tencoding: \"utf-8\",\n\t});\n}\n\nfunction mergeRecords(\n\tbase: UnknownRecord,\n\tincoming: UnknownRecord,\n): UnknownRecord {\n\tconst merged: UnknownRecord = { ...base };\n\tfor (const [key, value] of Object.entries(incoming)) {\n\t\t// Skip prototype-polluting keys (fixes #2542 defense-in-depth).\n\t\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = merged[key];\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tmerged[key] = mergeRecords(current, value);\n\t\t} else {\n\t\t\tmerged[key] = value;\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction configContent(artifact: UnknownRecord): UnknownRecord {\n\tif (isRecord(artifact.values)) {\n\t\treturn artifact.values;\n\t}\n\tconst content = stringValue(artifact.content);\n\tif (!content) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Config artifact requires values or TOML content\",\n\t\t);\n\t}\n\tconst parsed = parseTOML(content) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Config TOML must parse to an object\",\n\t\t);\n\t}\n\treturn parsed;\n}\n\nfunction writeConfigImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"local\");\n\tconst path = getWritablePackageConfigPath(scope, projectRoot);\n\tconst incoming = configContent(artifact);\n\tconst existing = existsSync(path)\n\t\t? (parseTOML(readFileSync(path, \"utf8\")) as unknown)\n\t\t: {};\n\tconst merged = mergeRecords(isRecord(existing) ? existing : {}, incoming);\n\tif (!dryRun) {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\tconst rendered = stringifyTOML(merged).trim();\n\t\twriteTextFileAtomic(path, rendered ? `${rendered}\\n` : \"\", {\n\t\t\tencoding: \"utf-8\",\n\t\t});\n\t\tclearConfigCache();\n\t}\n\treturn {\n\t\tkind: \"config\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tpath,\n\t\tmessage: dryRun ? \"Config TOML merge planned\" : \"Config TOML merged\",\n\t};\n}\n\nfunction hooksContent(artifact: UnknownRecord): UnknownRecord {\n\tif (isRecord(artifact.config)) {\n\t\treturn artifact.config;\n\t}\n\tif (isRecord(artifact.hooks)) {\n\t\treturn { hooks: artifact.hooks };\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Hooks artifact requires config or hooks\",\n\t);\n}\n\nfunction mergeHooksConfig(\n\texisting: UnknownRecord,\n\tincoming: UnknownRecord,\n): UnknownRecord {\n\tconst existingHooks = isRecord(existing.hooks) ? existing.hooks : {};\n\tconst incomingHooks = isRecord(incoming.hooks) ? incoming.hooks : {};\n\tconst hooks: UnknownRecord = { ...existingHooks };\n\tfor (const [eventType, matchers] of Object.entries(incomingHooks)) {\n\t\thooks[eventType] = [\n\t\t\t...(Array.isArray(existingHooks[eventType])\n\t\t\t\t? existingHooks[eventType]\n\t\t\t\t: []),\n\t\t\t...(Array.isArray(matchers) ? matchers : []),\n\t\t];\n\t}\n\treturn mergeRecords(mergeRecords(existing, incoming), { hooks });\n}\n\nfunction hooksConfigPath(\n\tscope: MaestroAppServerExternalAgentImportScope,\n\tprojectRoot: string,\n): string {\n\tif (scope === \"user\") {\n\t\treturn getUserHooksConfigPath();\n\t}\n\tif (scope === \"local\") {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Hooks artifact does not support local scope\",\n\t\t);\n\t}\n\treturn getProjectHooksConfigPath(projectRoot);\n}\n\nfunction writeHooksImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"project\");\n\tconst path = hooksConfigPath(scope, projectRoot);\n\tconst incoming = hooksContent(artifact);\n\tconst existing = readJsonObject(path);\n\tif (!dryRun) {\n\t\twriteJsonObject(path, mergeHooksConfig(existing, incoming));\n\t}\n\treturn {\n\t\tkind: \"hooks\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tpath,\n\t\tmessage: dryRun ? \"Hooks config merge planned\" : \"Hooks config merged\",\n\t};\n}\n\nfunction mcpServers(artifact: UnknownRecord): UnknownRecord[] {\n\tif (Array.isArray(artifact.servers)) {\n\t\tif (!artifact.servers.every(isRecord)) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"MCP artifact servers must be objects\",\n\t\t\t);\n\t\t}\n\t\treturn artifact.servers;\n\t}\n\tif (hasOwn(artifact, \"server\")) {\n\t\tif (!isRecord(artifact.server)) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"MCP artifact server must be an object\",\n\t\t\t);\n\t\t}\n\t\treturn [artifact.server];\n\t}\n\treturn [];\n}\n\nfunction validateMcpServerForImport(\n\tserver: UnknownRecord,\n\tname: string,\n): McpServerInput & { name: string } {\n\treturn mcpServerSchema.parse({\n\t\t...server,\n\t\tname,\n\t\ttransport:\n\t\t\tserver.transport ??\n\t\t\t(typeof server.url === \"string\"\n\t\t\t\t? inferRemoteMcpTransport(server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n}\n\nfunction writeMcpImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact[] {\n\tconst scope = artifactScope(artifact, \"local\") as WritableMcpScope;\n\tconst servers = mcpServers(artifact);\n\tif (servers.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"MCP artifact requires a server or servers\",\n\t\t);\n\t}\n\tconst validatedServers = servers.map((server) => {\n\t\tconst name = stringValue(server.name) ?? \"(unnamed)\";\n\t\treturn validateMcpServerForImport(server, name);\n\t});\n\tconst result = dryRun\n\t\t? validateMcpServersForConfig({\n\t\t\t\tprojectRoot,\n\t\t\t\tscope,\n\t\t\t\tservers: validatedServers,\n\t\t\t})\n\t\t: addMcpServersToConfig({\n\t\t\t\tprojectRoot,\n\t\t\t\tscope,\n\t\t\t\tservers: validatedServers,\n\t\t\t});\n\tconst imported: MaestroAppServerExternalAgentImportedArtifact[] = [];\n\tfor (const validatedServer of validatedServers) {\n\t\tif (dryRun) {\n\t\t\timported.push({\n\t\t\t\tkind: \"mcp\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tscope,\n\t\t\t\tid: validatedServer.name,\n\t\t\t\tpath: result.path,\n\t\t\t\tmessage: \"MCP server import planned\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\timported.push({\n\t\t\tkind: \"mcp\",\n\t\t\tstatus: \"imported\",\n\t\t\tscope,\n\t\t\tid: validatedServer.name,\n\t\t\tpath: result.path,\n\t\t\tmessage: \"MCP server imported\",\n\t\t});\n\t}\n\treturn imported;\n}\n\nfunction skillRootPath(\n\tscope: MaestroAppServerExternalAgentImportScope,\n\tprojectRoot: string,\n): string {\n\treturn scope === \"user\"\n\t\t? join(PATHS.MAESTRO_HOME, \"skills\")\n\t\t: join(projectRoot, \".maestro\", \"skills\");\n}\n\nfunction fileContent(file: UnknownRecord): string | Buffer {\n\tconst content = typeof file.content === \"string\" ? file.content : undefined;\n\tif (content !== undefined) {\n\t\treturn content;\n\t}\n\tconst contentBase64 =\n\t\ttypeof file.contentBase64 === \"string\" ? file.contentBase64 : undefined;\n\tif (contentBase64 !== undefined) {\n\t\tconst compact = contentBase64.replaceAll(/\\s/g, \"\");\n\t\tif (\n\t\t\tcompact.length === 0 ||\n\t\t\tcompact.length % 4 !== 0 ||\n\t\t\t!/^[A-Za-z0-9+/]*={0,2}$/.test(compact)\n\t\t) {\n\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t-32602,\n\t\t\t\t\"Skill file contentBase64 is not valid base64\",\n\t\t\t);\n\t\t}\n\t\treturn Buffer.from(compact, \"base64\");\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Skill file requires content or contentBase64\",\n\t);\n}\n\nfunction writeSkillImport(\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tconst scope = artifactScope(artifact, \"project\");\n\tconst name = safeSkillName(artifact.name);\n\tconst files = Array.isArray(artifact.files) ? artifact.files : [];\n\tif (!files.every(isRecord)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact files must be objects\",\n\t\t);\n\t}\n\tif (files.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires files\",\n\t\t);\n\t}\n\tif (!files.some((file) => safeRelativePath(file.path) === \"SKILL.md\")) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Skill artifact requires SKILL.md\",\n\t\t);\n\t}\n\tconst targetDir = join(skillRootPath(scope, projectRoot), name);\n\tconst plannedFiles = files.map((file) => ({\n\t\trelativePath: safeRelativePath(file.path),\n\t\tcontent: fileContent(file),\n\t}));\n\tif (!dryRun) {\n\t\tconst skillRoot = dirname(targetDir);\n\t\tmkdirSync(skillRoot, { recursive: true });\n\t\tlet stagingDir: string | undefined = mkdtempSync(\n\t\t\tjoin(skillRoot, `.${name}-import-`),\n\t\t);\n\t\tlet backupDir: string | undefined;\n\t\tlet promoted = false;\n\t\ttry {\n\t\t\tfor (const file of plannedFiles) {\n\t\t\t\tconst stagedPath = join(stagingDir, file.relativePath);\n\t\t\t\tmkdirSync(dirname(stagedPath), { recursive: true });\n\t\t\t\tif (typeof file.content === \"string\") {\n\t\t\t\t\twriteFileSync(stagedPath, file.content, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\twriteFileSync(stagedPath, file.content);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (existsSync(targetDir)) {\n\t\t\t\tbackupDir = mkdtempSync(join(skillRoot, `.${name}-backup-`));\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t\trenameSync(targetDir, backupDir);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\trenameSync(stagingDir, targetDir);\n\t\t\t\tpromoted = true;\n\t\t\t} catch (error) {\n\t\t\t\tif (backupDir && !existsSync(targetDir)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trenameSync(backupDir, targetDir);\n\t\t\t\t\t\tbackupDir = undefined;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Leave the backup in place rather than deleting the previous skill.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tstagingDir = undefined;\n\t\t\tif (backupDir) {\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t\tbackupDir = undefined;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stagingDir) {\n\t\t\t\trmSync(stagingDir, { recursive: true, force: true });\n\t\t\t}\n\t\t\tif (backupDir && promoted) {\n\t\t\t\trmSync(backupDir, { recursive: true, force: true });\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tkind: \"skill\",\n\t\tstatus: dryRun ? \"planned\" : \"imported\",\n\t\tscope,\n\t\tid: name,\n\t\tpath: targetDir,\n\t\tmessage: dryRun ? \"Skill file import planned\" : \"Skill files imported\",\n\t};\n}\n\nfunction validatedSessionEntries(value: unknown): SessionEntry[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Session artifact entries must be an array\",\n\t\t);\n\t}\n\tconst entries = value.map((entry) =>\n\t\tnormalizeSessionEntry(structuredClone(entry)),\n\t);\n\tif (entries.some((entry) => entry === null)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Session artifact entries must contain valid session entries\",\n\t\t);\n\t}\n\tif (entries.length === 0) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported session file is empty or unreadable.\",\n\t\t);\n\t}\n\tif (!entries.some((entry) => entry?.type === \"session\")) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Imported session file is missing a session header.\",\n\t\t);\n\t}\n\treturn entries as SessionEntry[];\n}\n\nfunction validatePortableSessionPath(sourcePath: string): string {\n\tconst resolvedSource = resolve(sourcePath);\n\tif (!existsSync(resolvedSource)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Session file not found: ${resolvedSource}`,\n\t\t);\n\t}\n\tif (!statSync(resolvedSource).isFile()) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Session path is not a file: ${resolvedSource}`,\n\t\t);\n\t}\n\treturn resolvedSource;\n}\n\nfunction validatePortableSessionJsonExport(sourcePath: string): void {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t} catch (error) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Portable session export is not valid JSON: ${artifactMessage(error)}`,\n\t\t);\n\t}\n\tif (!isRecord(parsed)) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t\"Portable session export must be a JSON object.\",\n\t\t);\n\t}\n\tif (parsed.format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t-32602,\n\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t);\n\t}\n\tif (Array.isArray(parsed.entries)) {\n\t\tvalidatedSessionEntries(parsed.entries);\n\t\treturn;\n\t}\n\tif (Array.isArray(parsed.sessions) && parsed.sessions.length > 0) {\n\t\tfor (const [index, session] of parsed.sessions.entries()) {\n\t\t\tif (!isRecord(session)) {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (typeof session.sessionId !== \"string\") {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Array.isArray(session.entries)) {\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t`Portable session export is missing entries for bundled session ${session.sessionId}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tvalidatedSessionEntries(session.entries);\n\t\t}\n\t\treturn;\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t);\n}\n\nfunction validatePortableSessionJsonl(sourcePath: string): void {\n\tconst contents = readFileSync(sourcePath, \"utf8\").trim();\n\tconst entries = contents\n\t\t? contents\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((line) => tryParseSessionEntry(line))\n\t\t\t\t.filter((entry): entry is SessionEntry => Boolean(entry))\n\t\t: [];\n\tvalidatedSessionEntries(entries);\n}\n\nfunction validatePortableSessionContents(sourcePath: string): void {\n\tif (extname(sourcePath).toLowerCase() === \".json\") {\n\t\tvalidatePortableSessionJsonExport(sourcePath);\n\t\treturn;\n\t}\n\tvalidatePortableSessionJsonl(sourcePath);\n}\n\nfunction importSessionArtifact(\n\tstore: MaestroAppServerExternalAgentSessionImporter | undefined,\n\tartifact: UnknownRecord,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact {\n\tif (!store?.importSessionEntries && !store?.importPortableSession) {\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"skipped\",\n\t\t\tmessage: \"Session import is not available\",\n\t\t};\n\t}\n\tif (hasOwn(artifact, \"entries\") && store.importSessionEntries) {\n\t\tconst entries = validatedSessionEntries(artifact.entries);\n\t\tif (dryRun) {\n\t\t\treturn {\n\t\t\t\tkind: \"session\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tmessage: \"Session import planned\",\n\t\t\t};\n\t\t}\n\t\tconst result = store.importSessionEntries(entries);\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"imported\",\n\t\t\tid: result.sessionId,\n\t\t\tpath: result.sessionFile,\n\t\t\tmessage: `Imported ${result.importedCount} session(s)`,\n\t\t};\n\t}\n\tconst sourcePath = stringValue(artifact.path);\n\tif (sourcePath && store.importPortableSession) {\n\t\tconst resolvedSource = validatePortableSessionPath(sourcePath);\n\t\tvalidatePortableSessionContents(resolvedSource);\n\t\tif (dryRun) {\n\t\t\treturn {\n\t\t\t\tkind: \"session\",\n\t\t\t\tstatus: \"planned\",\n\t\t\t\tmessage: \"Session import planned\",\n\t\t\t};\n\t\t}\n\t\tconst result = store.importPortableSession(resolvedSource);\n\t\treturn {\n\t\t\tkind: \"session\",\n\t\t\tstatus: \"imported\",\n\t\t\tid: result.sessionId,\n\t\t\tpath: result.sessionFile,\n\t\t\tmessage: `Imported ${result.importedCount} session(s)`,\n\t\t};\n\t}\n\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t-32602,\n\t\t\"Session artifact requires entries or path\",\n\t);\n}\n\nfunction importArtifact(\n\tstore: MaestroAppServerExternalAgentSessionImporter | undefined,\n\tartifact: UnknownRecord,\n\tprojectRoot: string,\n\tdryRun: boolean,\n): MaestroAppServerExternalAgentImportedArtifact[] {\n\tconst kind = stringValue(artifact.kind);\n\ttry {\n\t\tswitch (kind) {\n\t\t\tcase \"session\":\n\t\t\t\treturn [importSessionArtifact(store, artifact, dryRun)];\n\t\t\tcase \"config\":\n\t\t\t\treturn [writeConfigImport(artifact, projectRoot, dryRun)];\n\t\t\tcase \"hooks\":\n\t\t\t\treturn [writeHooksImport(artifact, projectRoot, dryRun)];\n\t\t\tcase \"mcp\":\n\t\t\t\treturn writeMcpImport(artifact, projectRoot, dryRun);\n\t\t\tcase \"skill\":\n\t\t\t\treturn [writeSkillImport(artifact, projectRoot, dryRun)];\n\t\t\tdefault:\n\t\t\t\tthrow new MaestroAppServerExternalAgentImportError(\n\t\t\t\t\t-32602,\n\t\t\t\t\t\"Unsupported external agent artifact kind\",\n\t\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: [\"session\", \"config\", \"hooks\", \"mcp\", \"skill\"].includes(\n\t\t\t\t\tkind ?? \"\",\n\t\t\t\t)\n\t\t\t\t\t? (kind as MaestroAppServerExternalAgentImportedArtifact[\"kind\"])\n\t\t\t\t\t: \"config\",\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\tmessage: artifactMessage(error),\n\t\t\t},\n\t\t];\n\t}\n}\n\nexport function createMaestroAppServerExternalAgentImport(\n\toptions: MaestroAppServerExternalAgentImportOptions = {},\n): MaestroAppServerExternalAgentImport {\n\treturn {\n\t\tasync importBundle(params = {}) {\n\t\t\tconst normalizedParams = normalizeExternalAgentImportParams(params);\n\t\t\tconst artifacts = requireArtifacts(normalizedParams);\n\t\t\tconst dryRun = booleanValue(normalizedParams.dryRun, true);\n\t\t\tconst projectRoot = resolve(\n\t\t\t\tstringValue(normalizedParams.projectRoot) ??\n\t\t\t\t\toptions.projectRoot ??\n\t\t\t\t\tprocess.cwd(),\n\t\t\t);\n\t\t\tconst imported = artifacts.flatMap((artifact) =>\n\t\t\t\timportArtifact(options.store, artifact, projectRoot, dryRun),\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tsource: importSource(normalizedParams),\n\t\t\t\tdryRun,\n\t\t\t\timported,\n\t\t\t\twarnings: imported\n\t\t\t\t\t.filter((artifact) => artifact.status === \"skipped\")\n\t\t\t\t\t.map((artifact) => artifact.message ?? \"Artifact skipped\"),\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"network-governance-api.d.ts","sourceRoot":"","sources":["../../src/app-server/network-governance-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,sCAAsC,EAEtC,kCAAkC,EAElC,MAAM,oBAAoB,CAAC;AAI5B,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,UAAU,mBAAmB;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AACD,KAAK,SAAS,GAAG,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,mBAAmB,KACzB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAgBvB,qBAAa,sCAAuC,SAAQ,KAAK;IAE/D,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,wCAAwC;IACxD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iCAAiC;IACjD,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC3E,SAAS,CACR,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,sCAAsC,CAAC,CAAC;CACnD;AA2ND,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,OAAO,GAAE,mBAAwB,EACjC,sBAAsB,SAAoC,GACxD,OAAO,CAAC,QAAQ,CAAC,CAyCnB;AAmLD,wBAAgB,uCAAuC,CACtD,OAAO,GAAE,wCAA6C,GACpD,iCAAiC,CA+HnC"}
1
+ {"version":3,"file":"network-governance-api.d.ts","sourceRoot":"","sources":["../../src/app-server/network-governance-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,sCAAsC,EAEtC,kCAAkC,EAElC,MAAM,oBAAoB,CAAC;AAK5B,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,UAAU,mBAAmB;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AACD,KAAK,SAAS,GAAG,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,mBAAmB,KACzB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAgBvB,qBAAa,sCAAuC,SAAQ,KAAK;IAE/D,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKhB;AAED,MAAM,WAAW,wCAAwC;IACxD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iCAAiC;IACjD,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC3E,SAAS,CACR,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,sCAAsC,CAAC,CAAC;CACnD;AAuND,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,OAAO,GAAE,mBAAwB,EACjC,sBAAsB,SAAoC,GACxD,OAAO,CAAC,QAAQ,CAAC,CAyCnB;AAmLD,wBAAgB,uCAAuC,CACtD,OAAO,GAAE,wCAA6C,GACpD,iCAAiC,CA+HnC"}
@@ -4,6 +4,7 @@ import { request as requestHttps } from "node:https";
4
4
  import { Readable } from "node:stream";
5
5
  import { loadPolicy } from "../safety/policy.js";
6
6
  import { checkNetworkRestrictionsDetailed } from "../safety/validators/network-policy-validator.js";
7
+ import { isRecord } from "../utils/json.js";
7
8
  const DEFAULT_MAX_RESPONSE_BYTES = 1024 * 1024;
8
9
  const DEFAULT_MAX_AUDIT_RECORDS = 100;
9
10
  const DEFAULT_PINNED_ADDRESS_TIMEOUT_MS = 30_000;
@@ -24,9 +25,6 @@ export class MaestroAppServerNetworkGovernanceError extends Error {
24
25
  this.name = "MaestroAppServerNetworkGovernanceError";
25
26
  }
26
27
  }
27
- function isRecord(value) {
28
- return typeof value === "object" && value !== null && !Array.isArray(value);
29
- }
30
28
  function normalizeLimit(value) {
31
29
  if (typeof value !== "number" || !Number.isFinite(value)) {
32
30
  return DEFAULT_PAGE_LIMIT;