create-windy 0.8.2 → 0.9.1

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 (574) hide show
  1. package/dist/cli.js +855 -560
  2. package/package.json +1 -1
  3. package/template/.windy-template.json +2 -2
  4. package/template/apps/agent-server/Dockerfile +92 -22
  5. package/template/apps/agent-server/README.md +47 -85
  6. package/template/apps/agent-server/documents/office.py +216 -0
  7. package/template/apps/agent-server/documents/query_report.py +136 -0
  8. package/template/apps/agent-server/documents/smoke.py +177 -0
  9. package/template/apps/agent-server/documents/test_boundaries.py +185 -0
  10. package/template/apps/agent-server/host-contracts.ts +56 -0
  11. package/template/apps/agent-server/install-native.ts +167 -0
  12. package/template/apps/agent-server/main.ts +179 -0
  13. package/template/apps/agent-server/native/EXTENSIONS.md +46 -0
  14. package/template/apps/agent-server/native/admission.ts +73 -0
  15. package/template/apps/agent-server/native/authorization.test.ts +176 -0
  16. package/template/apps/agent-server/native/authorization.ts +118 -0
  17. package/template/apps/agent-server/native/boundary-io.ts +93 -0
  18. package/template/apps/agent-server/native/boundary-product.ts +107 -0
  19. package/template/apps/agent-server/native/boundary-project.test.ts +247 -0
  20. package/template/apps/agent-server/native/boundary-project.ts +188 -0
  21. package/template/apps/agent-server/native/boundary.ts +188 -0
  22. package/template/apps/agent-server/native/compaction-policy.test.ts +175 -0
  23. package/template/apps/agent-server/native/config.ts +95 -0
  24. package/template/apps/agent-server/native/conversation-instructions.ts +9 -0
  25. package/template/apps/agent-server/native/extensions.test.ts +190 -0
  26. package/template/apps/agent-server/native/extensions.ts +31 -0
  27. package/template/apps/agent-server/native/host-profile.test.ts +91 -0
  28. package/template/apps/agent-server/native/host-profile.ts +33 -0
  29. package/template/apps/agent-server/native/host-test-fixture.ts +13 -0
  30. package/template/apps/agent-server/native/http.ts +129 -0
  31. package/template/apps/agent-server/native/lifecycle.test.ts +285 -0
  32. package/template/apps/agent-server/native/lifecycle.ts +136 -0
  33. package/template/apps/agent-server/native/manager.ts +292 -0
  34. package/template/apps/agent-server/native/native.test.ts +207 -0
  35. package/template/apps/agent-server/native/office-preview.test.ts +50 -0
  36. package/template/apps/agent-server/native/office-preview.ts +25 -0
  37. package/template/apps/agent-server/native/parallel-harness.ts +242 -0
  38. package/template/apps/agent-server/native/parallel-mcp-fixture.ts +97 -0
  39. package/template/apps/agent-server/native/parallel.test.ts +256 -0
  40. package/template/apps/agent-server/native/profile-composition.test.ts +147 -0
  41. package/template/apps/agent-server/native/profile.ts +307 -0
  42. package/template/apps/agent-server/native/request.ts +61 -0
  43. package/template/apps/agent-server/native/session-conflict.test.ts +235 -0
  44. package/template/apps/agent-server/native/session-conflict.ts +21 -0
  45. package/template/apps/agent-server/native/shared-skills.test.ts +128 -0
  46. package/template/apps/agent-server/native/shared-skills.ts +240 -0
  47. package/template/apps/agent-server/native/socket-lifecycle.test.ts +48 -0
  48. package/template/apps/agent-server/native/socket.ts +130 -0
  49. package/template/apps/agent-server/native/storage-lifecycle.test.ts +217 -0
  50. package/template/apps/agent-server/native/storage.ts +188 -0
  51. package/template/apps/agent-server/native/stream-authorization.test.ts +89 -0
  52. package/template/apps/agent-server/native/worker.ts +77 -0
  53. package/template/apps/agent-server/native-download.test.ts +119 -0
  54. package/template/apps/agent-server/native-download.ts +145 -0
  55. package/template/apps/agent-server/package.json +63 -0
  56. package/template/apps/agent-server/plugins/access.mjs +126 -0
  57. package/template/apps/agent-server/plugins/branding/README.md +9 -0
  58. package/template/apps/agent-server/plugins/branding/brand.css +85 -0
  59. package/template/apps/agent-server/plugins/branding/client.js +338 -0
  60. package/template/apps/agent-server/plugins/branding/index.mjs +35 -0
  61. package/template/apps/agent-server/plugins/branding/loading.d.mts +2 -0
  62. package/template/apps/agent-server/plugins/branding/loading.mjs +66 -0
  63. package/template/apps/agent-server/plugins/branding/loading.test.ts +89 -0
  64. package/template/apps/agent-server/plugins/branding/package.json +21 -0
  65. package/template/apps/agent-server/plugins/branding.test.ts +294 -0
  66. package/template/apps/agent-server/plugins/compaction.mjs +83 -0
  67. package/template/apps/agent-server/plugins/compaction.test.ts +91 -0
  68. package/template/apps/agent-server/plugins/confine-network.py +57 -0
  69. package/template/apps/agent-server/plugins/default-skills.test.ts +62 -0
  70. package/template/apps/agent-server/plugins/downloads/README.md +28 -0
  71. package/template/apps/agent-server/plugins/downloads/client.js +126 -0
  72. package/template/apps/agent-server/plugins/downloads/downloads.test.ts +222 -0
  73. package/template/apps/agent-server/plugins/downloads/index.d.mts +19 -0
  74. package/template/apps/agent-server/plugins/downloads/index.mjs +180 -0
  75. package/template/apps/agent-server/plugins/downloads/package.json +20 -0
  76. package/template/apps/agent-server/plugins/drop-overlay/README.md +24 -0
  77. package/template/apps/agent-server/plugins/drop-overlay/drop-overlay.test.ts +199 -0
  78. package/template/apps/agent-server/plugins/drop-overlay/index.d.mts +8 -0
  79. package/template/apps/agent-server/plugins/drop-overlay/index.mjs +12 -0
  80. package/template/apps/agent-server/plugins/drop-overlay/style.css +102 -0
  81. package/template/apps/agent-server/plugins/locale/client.js +61 -0
  82. package/template/apps/agent-server/plugins/locale/index.d.mts +9 -0
  83. package/template/apps/agent-server/plugins/locale/index.mjs +16 -0
  84. package/template/apps/agent-server/plugins/locale/locale.test.ts +217 -0
  85. package/template/apps/agent-server/plugins/locale/package.json +19 -0
  86. package/template/apps/agent-server/plugins/parallel.mjs +146 -0
  87. package/template/apps/agent-server/plugins/preset-registry.d.mts +2 -0
  88. package/template/apps/agent-server/plugins/preset-registry.mjs +41 -0
  89. package/template/apps/agent-server/plugins/preset-registry.test.ts +46 -0
  90. package/template/apps/agent-server/plugins/questions.d.mts +25 -0
  91. package/template/apps/agent-server/plugins/questions.mjs +142 -0
  92. package/template/apps/agent-server/plugins/questions.test.ts +105 -0
  93. package/template/apps/agent-server/plugins/settings/README.md +17 -0
  94. package/template/apps/agent-server/plugins/settings/client.js +102 -0
  95. package/template/apps/agent-server/plugins/settings/index.mjs +17 -0
  96. package/template/apps/agent-server/plugins/settings/package.json +19 -0
  97. package/template/apps/agent-server/plugins/settings/settings.test.ts +129 -0
  98. package/template/apps/agent-server/plugins/settings-controller.d.mts +4 -0
  99. package/template/apps/agent-server/plugins/settings-controller.mjs +31 -0
  100. package/template/apps/agent-server/plugins/settings-controller.test.ts +17 -0
  101. package/template/apps/agent-server/plugins/settings-dispatch.test.ts +34 -0
  102. package/template/apps/agent-server/plugins/shared-skills.d.mts +15 -0
  103. package/template/apps/agent-server/plugins/shared-skills.mjs +82 -0
  104. package/template/apps/agent-server/plugins/shared-skills.test.ts +51 -0
  105. package/template/apps/agent-server/plugins/skill-library/README.md +11 -0
  106. package/template/apps/agent-server/plugins/skill-library/archive.test.ts +43 -0
  107. package/template/apps/agent-server/plugins/skill-library/bundle.mjs +234 -0
  108. package/template/apps/agent-server/plugins/skill-library/client-chunks.test.ts +107 -0
  109. package/template/apps/agent-server/plugins/skill-library/client-form-mount.test.ts +139 -0
  110. package/template/apps/agent-server/plugins/skill-library/client-form.test.ts +261 -0
  111. package/template/apps/agent-server/plugins/skill-library/client-ui.test.ts +268 -0
  112. package/template/apps/agent-server/plugins/skill-library/client-use.test.ts +158 -0
  113. package/template/apps/agent-server/plugins/skill-library/client.editor.js +93 -0
  114. package/template/apps/agent-server/plugins/skill-library/client.form.js +316 -0
  115. package/template/apps/agent-server/plugins/skill-library/client.js +348 -0
  116. package/template/apps/agent-server/plugins/skill-library/client.request.js +52 -0
  117. package/template/apps/agent-server/plugins/skill-library/client.transfer.js +48 -0
  118. package/template/apps/agent-server/plugins/skill-library/client.use.js +46 -0
  119. package/template/apps/agent-server/plugins/skill-library/default-roots.test.ts +84 -0
  120. package/template/apps/agent-server/plugins/skill-library/draft.d.mts +17 -0
  121. package/template/apps/agent-server/plugins/skill-library/draft.mjs +152 -0
  122. package/template/apps/agent-server/plugins/skill-library/draft.test.ts +287 -0
  123. package/template/apps/agent-server/plugins/skill-library/index.d.mts +49 -0
  124. package/template/apps/agent-server/plugins/skill-library/index.mjs +226 -0
  125. package/template/apps/agent-server/plugins/skill-library/package.json +24 -0
  126. package/template/apps/agent-server/plugins/skill-library/presentation/README.md +27 -0
  127. package/template/apps/agent-server/plugins/skill-library/presentation/UPSTREAM.md +54 -0
  128. package/template/apps/agent-server/plugins/skill-library/presentation/boot.test.ts +150 -0
  129. package/template/apps/agent-server/plugins/skill-library/presentation/client.js +146 -0
  130. package/template/apps/agent-server/plugins/skill-library/presentation/client.test.ts +195 -0
  131. package/template/apps/agent-server/plugins/skill-library/presentation/index.d.mts +9 -0
  132. package/template/apps/agent-server/plugins/skill-library/presentation/index.mjs +30 -0
  133. package/template/apps/agent-server/plugins/skill-library/presentation/metadata.test.ts +82 -0
  134. package/template/apps/agent-server/plugins/skill-library/presentation/package.json +21 -0
  135. package/template/apps/agent-server/plugins/skill-library/presentation/react-boot.test.ts +162 -0
  136. package/template/apps/agent-server/plugins/skill-library/skills.test.ts +342 -0
  137. package/template/apps/agent-server/plugins/skill-library/storage.mjs +293 -0
  138. package/template/apps/agent-server/plugins/skill-library/style.css +229 -0
  139. package/template/apps/agent-server/plugins/skill-library/test-fixture.ts +77 -0
  140. package/template/apps/agent-server/plugins/skill-library/workflow.d.mts +18 -0
  141. package/template/apps/agent-server/plugins/skill-library/workflow.mjs +189 -0
  142. package/template/apps/agent-server/plugins/skill-library/workflow.test.ts +164 -0
  143. package/template/apps/agent-server/plugins/skills/README.md +5 -0
  144. package/template/apps/agent-server/plugins/skills/windy-data-summary/SKILL.md +14 -0
  145. package/template/apps/agent-server/plugins/skills/windy-extension-guide/SKILL.md +14 -0
  146. package/template/apps/agent-server/plugins/skills/windy-office/SKILL.md +14 -0
  147. package/template/apps/agent-server/plugins/skills/windy-skill-capture/SKILL.md +14 -0
  148. package/template/apps/agent-server/plugins/skills/windy-source-compare/SKILL.md +14 -0
  149. package/template/apps/agent-server/plugins/subprocess.mjs +40 -0
  150. package/template/apps/agent-server/plugins/theme/README.md +18 -0
  151. package/template/apps/agent-server/plugins/theme/client.js +18 -0
  152. package/template/apps/agent-server/plugins/theme/index.d.mts +9 -0
  153. package/template/apps/agent-server/plugins/theme/index.mjs +18 -0
  154. package/template/apps/agent-server/plugins/theme/package.json +19 -0
  155. package/template/apps/agent-server/plugins/theme/source-tokens.ts +82 -0
  156. package/template/apps/agent-server/plugins/theme/sync-tokens.ts +12 -0
  157. package/template/apps/agent-server/plugins/theme/theme.test.ts +193 -0
  158. package/template/apps/agent-server/plugins/theme/tokens.json +166 -0
  159. package/template/apps/agent-server/plugins/tool-catalog/README.md +79 -0
  160. package/template/apps/agent-server/plugins/tool-catalog/categories.mjs +111 -0
  161. package/template/apps/agent-server/plugins/tool-catalog/categories.test.ts +118 -0
  162. package/template/apps/agent-server/plugins/tool-catalog/client-cache.test.ts +264 -0
  163. package/template/apps/agent-server/plugins/tool-catalog/client.js +333 -0
  164. package/template/apps/agent-server/plugins/tool-catalog/client.test.ts +136 -0
  165. package/template/apps/agent-server/plugins/tool-catalog/discovery.d.mts +42 -0
  166. package/template/apps/agent-server/plugins/tool-catalog/discovery.mjs +242 -0
  167. package/template/apps/agent-server/plugins/tool-catalog/discovery.test.ts +229 -0
  168. package/template/apps/agent-server/plugins/tool-catalog/index.d.mts +5 -0
  169. package/template/apps/agent-server/plugins/tool-catalog/index.mjs +91 -0
  170. package/template/apps/agent-server/plugins/tool-catalog/package.json +23 -0
  171. package/template/apps/agent-server/plugins/tool-catalog/presentation.d.mts +21 -0
  172. package/template/apps/agent-server/plugins/tool-catalog/presentation.mjs +153 -0
  173. package/template/apps/agent-server/plugins/tool-catalog/presentation.test.ts +166 -0
  174. package/template/apps/agent-server/plugins/tool-catalog/routes.test.ts +209 -0
  175. package/template/apps/agent-server/plugins/tool-catalog/style.css +155 -0
  176. package/template/apps/agent-server/plugins/tool-catalog/use-tool.test.ts +160 -0
  177. package/template/apps/agent-server/plugins/tool-presentation/README.md +7 -0
  178. package/template/apps/agent-server/plugins/tool-presentation/build-client.ts +29 -0
  179. package/template/apps/agent-server/plugins/tool-presentation/client.js +312 -0
  180. package/template/apps/agent-server/plugins/tool-presentation/client.results.js +9 -0
  181. package/template/apps/agent-server/plugins/tool-presentation/client.test.ts +178 -0
  182. package/template/apps/agent-server/plugins/tool-presentation/index.mjs +10 -0
  183. package/template/apps/agent-server/plugins/tool-presentation/package.json +24 -0
  184. package/template/apps/agent-server/plugins/tool-presentation/result-discovery.mjs +43 -0
  185. package/template/apps/agent-server/plugins/tool-presentation/result-model.d.mts +51 -0
  186. package/template/apps/agent-server/plugins/tool-presentation/result-model.mjs +96 -0
  187. package/template/apps/agent-server/plugins/workspace/README.md +5 -0
  188. package/template/apps/agent-server/plugins/workspace/index.mjs +8 -0
  189. package/template/apps/agent-server/plugins/workspace/package.json +10 -0
  190. package/template/apps/agent-server/plugins/workspace/style.css +124 -0
  191. package/template/apps/agent-server/project/host.ts +13 -0
  192. package/template/apps/agent-server/runtime/artifacts.ts +115 -0
  193. package/template/apps/agent-server/runtime/audit.nodecheck.ts +60 -0
  194. package/template/apps/agent-server/runtime/capacity.ts +61 -0
  195. package/template/apps/agent-server/runtime/client-completion-budget.nodecheck.ts +92 -0
  196. package/template/apps/agent-server/runtime/compatibility.ts +33 -0
  197. package/template/apps/agent-server/runtime/completions.ts +320 -0
  198. package/template/apps/agent-server/runtime/config.ts +246 -0
  199. package/template/apps/agent-server/runtime/context-budget.ts +70 -0
  200. package/template/apps/agent-server/runtime/context-plugin.ts +306 -0
  201. package/template/apps/agent-server/runtime/context.nodecheck.ts +241 -0
  202. package/template/apps/agent-server/runtime/contracts.ts +201 -0
  203. package/template/apps/agent-server/runtime/dsh-engine.ts +196 -0
  204. package/template/apps/agent-server/runtime/evaluation-plugin.ts +115 -0
  205. package/template/apps/agent-server/runtime/evaluation.nodecheck.ts +194 -0
  206. package/template/apps/agent-server/runtime/events.ts +71 -0
  207. package/template/apps/agent-server/runtime/governance.ts +194 -0
  208. package/template/apps/agent-server/runtime/index.ts +339 -0
  209. package/template/apps/agent-server/runtime/internal-output.ts +37 -0
  210. package/template/apps/agent-server/runtime/isolation.nodecheck.ts +287 -0
  211. package/template/apps/agent-server/runtime/model-payload.ts +97 -0
  212. package/template/apps/agent-server/runtime/model-plugin.ts +308 -0
  213. package/template/apps/agent-server/runtime/model-route.ts +34 -0
  214. package/template/apps/agent-server/runtime/model-usage.ts +51 -0
  215. package/template/apps/agent-server/runtime/model-wire.ts +45 -0
  216. package/template/apps/agent-server/runtime/native-authorization.nodecheck.ts +126 -0
  217. package/template/apps/agent-server/runtime/native-completion.nodecheck.ts +81 -0
  218. package/template/apps/agent-server/runtime/output-validation.ts +66 -0
  219. package/template/apps/agent-server/runtime/production-capacity.nodecheck.ts +121 -0
  220. package/template/apps/agent-server/runtime/questions-workflow.nodecheck.ts +249 -0
  221. package/template/apps/agent-server/runtime/report-breakdown.ts +79 -0
  222. package/template/apps/agent-server/runtime/reporting.ts +219 -0
  223. package/template/apps/agent-server/runtime/run-completion.ts +39 -0
  224. package/template/apps/agent-server/runtime/run-request-digest.ts +18 -0
  225. package/template/apps/agent-server/runtime/runtime-test-fixtures.ts +264 -0
  226. package/template/apps/agent-server/runtime/runtime.nodecheck.ts +150 -0
  227. package/template/apps/agent-server/runtime/store-idempotency.nodecheck.ts +74 -0
  228. package/template/apps/agent-server/runtime/store.ts +324 -0
  229. package/template/apps/agent-server/runtime/structured-output-mode.nodecheck.ts +51 -0
  230. package/template/apps/agent-server/runtime/tool-name.ts +6 -0
  231. package/template/apps/agent-server/runtime/tool-plugin.ts +201 -0
  232. package/template/apps/agent-server/runtime/vision-readiness.ts +200 -0
  233. package/template/apps/agent-server/scripts/confinement-check.mjs +103 -0
  234. package/template/apps/agent-server/scripts/coordinator-check.mjs +344 -0
  235. package/template/apps/agent-server/scripts/documents-delivery-check.mjs +309 -0
  236. package/template/apps/agent-server/scripts/office-preview-check.mjs +92 -0
  237. package/template/apps/agent-server/scripts/test-confinement.ts +58 -0
  238. package/template/apps/agent-server/scripts/test-coordinator.ts +36 -0
  239. package/template/apps/agent-server/scripts/test-runtime.ts +46 -0
  240. package/template/apps/agent-server/tsconfig.json +21 -0
  241. package/template/apps/server/Dockerfile +3 -0
  242. package/template/apps/server/package.json +5 -1
  243. package/template/apps/server/scripts/check-dsh-platform-example.ts +251 -0
  244. package/template/apps/server/src/agent/admin-catalog-bootstrap.ts +25 -0
  245. package/template/apps/server/src/agent/agent-session-bootstrap.ts +7 -8
  246. package/template/apps/server/src/agent/agent-session-facade.ts +12 -0
  247. package/template/apps/server/src/agent/agent-session-validation.ts +43 -0
  248. package/template/apps/server/src/agent/dsh-runtime-wire.test.ts +33 -0
  249. package/template/apps/server/src/agent/governance-runtime.ts +41 -0
  250. package/template/apps/server/src/agent/operation-catalog.test.ts +202 -0
  251. package/template/apps/server/src/agent/operation-catalog.ts +135 -0
  252. package/template/apps/server/src/agent/remote-runtime-response.ts +1 -1
  253. package/template/apps/server/src/agent/run-browser-visibility.test.ts +59 -0
  254. package/template/apps/server/src/agent/run-browser-visibility.ts +11 -0
  255. package/template/apps/server/src/agent/run-contracts.ts +1 -0
  256. package/template/apps/server/src/agent/run-definition-support.ts +9 -0
  257. package/template/apps/server/src/agent/run-operation-policy.ts +1 -0
  258. package/template/apps/server/src/agent/run-route-response.ts +35 -0
  259. package/template/apps/server/src/agent/run-routes.ts +46 -43
  260. package/template/apps/server/src/agent/runtime-bootstrap.ts +21 -20
  261. package/template/apps/server/src/agent/runtime-disabled-composition.ts +28 -0
  262. package/template/apps/server/src/agent/runtime-tool-composition.ts +2 -0
  263. package/template/apps/server/src/agent/session-projection-facade.ts +8 -9
  264. package/template/apps/server/src/agent/session-projection-governance.ts +10 -0
  265. package/template/apps/server/src/agent/session-projection-view.ts +19 -16
  266. package/template/apps/server/src/agent/session-recording-reader.contract.test.ts +131 -0
  267. package/template/apps/server/src/agent/session-recording-reader.ts +62 -0
  268. package/template/apps/server/src/agent/tool-catalog-audit.ts +22 -0
  269. package/template/apps/server/src/agent/tool-catalog-availability.ts +21 -0
  270. package/template/apps/server/src/agent/tool-catalog-routes.test.ts +103 -0
  271. package/template/apps/server/src/agent/tool-catalog-routes.ts +62 -0
  272. package/template/apps/server/src/agent/tool-catalog.test.ts +122 -0
  273. package/template/apps/server/src/agent/tool-catalog.ts +44 -0
  274. package/template/apps/server/src/agent/tool-registry.ts +45 -14
  275. package/template/apps/server/src/agent/workbench-bootstrap.ts +39 -0
  276. package/template/apps/server/src/agent/workbench-event-projection.ts +115 -0
  277. package/template/apps/server/src/agent/workbench-facade.contract.test.ts +189 -0
  278. package/template/apps/server/src/agent/workbench-facade.ts +339 -0
  279. package/template/apps/server/src/agent/workbench-recording.contract.test.ts +328 -0
  280. package/template/apps/server/src/agent/workbench-routes.ts +97 -0
  281. package/template/apps/server/src/agent/workbench-run-integration.test.ts +231 -0
  282. package/template/apps/server/src/agent/workbench-run-reader.ts +187 -0
  283. package/template/apps/server/src/agent/workbench-safe-result.ts +61 -0
  284. package/template/apps/server/src/agent/workbench-sse.ts +50 -0
  285. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +9 -0
  286. package/template/apps/server/src/agent-skills/access.ts +88 -0
  287. package/template/apps/server/src/agent-skills/bootstrap.ts +49 -0
  288. package/template/apps/server/src/agent-skills/builtin-registration.ts +83 -0
  289. package/template/apps/server/src/agent-skills/builtins.ts +19 -0
  290. package/template/apps/server/src/agent-skills/bundle-zip.ts +163 -0
  291. package/template/apps/server/src/agent-skills/bundle.test.ts +79 -0
  292. package/template/apps/server/src/agent-skills/bundle.ts +133 -0
  293. package/template/apps/server/src/agent-skills/contracts.ts +46 -0
  294. package/template/apps/server/src/agent-skills/drizzle-repository.ts +125 -0
  295. package/template/apps/server/src/agent-skills/input.ts +29 -0
  296. package/template/apps/server/src/agent-skills/postgres.integration.test.ts +348 -0
  297. package/template/apps/server/src/agent-skills/read-routes.test.ts +116 -0
  298. package/template/apps/server/src/agent-skills/reader.ts +108 -0
  299. package/template/apps/server/src/agent-skills/repository.ts +105 -0
  300. package/template/apps/server/src/agent-skills/routes.ts +176 -0
  301. package/template/apps/server/src/agent-skills/service.test.ts +295 -0
  302. package/template/apps/server/src/agent-skills/service.ts +301 -0
  303. package/template/apps/server/src/agent-workflow/preset-registry.test.ts +137 -0
  304. package/template/apps/server/src/agent-workflow/preset-registry.ts +191 -0
  305. package/template/apps/server/src/agent-workflow/preset-routes.test.ts +94 -0
  306. package/template/apps/server/src/agent-workflow/preset-routes.ts +45 -0
  307. package/template/apps/server/src/agent-workflow/query-service.ts +36 -0
  308. package/template/apps/server/src/agent-workflow/recording-projection.contract.test.ts +196 -0
  309. package/template/apps/server/src/agent-workflow/recording-projection.ts +86 -0
  310. package/template/apps/server/src/ai-runtime-report/service.test.ts +10 -7
  311. package/template/apps/server/src/ai-runtime-report/service.ts +1 -1
  312. package/template/apps/server/src/app/agent-workflow-presets.ts +4 -0
  313. package/template/apps/server/src/app/dsh-skill-draft-audit.test.ts +195 -0
  314. package/template/apps/server/src/app/dsh-skill-draft-audit.ts +115 -0
  315. package/template/apps/server/src/app/dsh-workbench-audit.test.ts +71 -0
  316. package/template/apps/server/src/app/dsh-workbench-audit.ts +34 -0
  317. package/template/apps/server/src/app/dsh-workbench-handshake.test.ts +63 -0
  318. package/template/apps/server/src/app/dsh-workbench-handshake.ts +48 -0
  319. package/template/apps/server/src/app/dsh-workbench-http.test.ts +96 -0
  320. package/template/apps/server/src/app/dsh-workbench-lan-origin.test.ts +114 -0
  321. package/template/apps/server/src/app/dsh-workbench-launch.test.ts +70 -0
  322. package/template/apps/server/src/app/dsh-workbench-origin.test.ts +54 -0
  323. package/template/apps/server/src/app/dsh-workbench-proxy.ts +205 -0
  324. package/template/apps/server/src/app/dsh-workbench-session-conflict.test.ts +61 -0
  325. package/template/apps/server/src/app/dsh-workbench-session.ts +59 -0
  326. package/template/apps/server/src/app/dsh-workbench-socket-audit.test.ts +115 -0
  327. package/template/apps/server/src/app/dsh-workbench-socket.test.ts +246 -0
  328. package/template/apps/server/src/app/dsh-workbench-socket.ts +272 -0
  329. package/template/apps/server/src/app/dsh-workbench-test-support.ts +158 -0
  330. package/template/apps/server/src/app/dsh-workbench.test.ts +213 -0
  331. package/template/apps/server/src/app/dsh-workbench.ts +279 -0
  332. package/template/apps/server/src/app/workbench-public-origin.ts +16 -0
  333. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +3 -0
  334. package/template/apps/server/src/http-app.ts +31 -0
  335. package/template/apps/server/src/mcp/adapter.ts +1 -0
  336. package/template/apps/server/src/module-composition.test.ts +23 -0
  337. package/template/apps/server/src/module-composition.ts +9 -2
  338. package/template/apps/server/src/observability/bootstrap.ts +12 -0
  339. package/template/apps/server/src/observability/diagnostic-failure-recorder.ts +94 -0
  340. package/template/apps/server/src/observability/diagnostic-http-contract.test.ts +42 -0
  341. package/template/apps/server/src/observability/diagnostic-index.test.ts +89 -0
  342. package/template/apps/server/src/observability/diagnostic-index.ts +88 -0
  343. package/template/apps/server/src/observability/diagnostic-repository.ts +67 -0
  344. package/template/apps/server/src/platform-app-bootstrap.ts +42 -0
  345. package/template/apps/server/src/platform-http-runtime.ts +6 -0
  346. package/template/apps/server/src/runtime-development.test.ts +25 -0
  347. package/template/apps/server/src/runtime-development.ts +6 -44
  348. package/template/apps/server/src/system/diagnostic-routes.test.ts +78 -0
  349. package/template/apps/server/src/system/diagnostic-routes.ts +66 -0
  350. package/template/apps/web/Dockerfile +9 -1
  351. package/template/apps/web/dev/start.ts +21 -10
  352. package/template/apps/web/dsh-workbench-location.ts +21 -0
  353. package/template/apps/web/dsh-workbench-proxy.test.ts +121 -0
  354. package/template/apps/web/dsh-workbench-proxy.ts +194 -0
  355. package/template/apps/web/package.json +3 -1
  356. package/template/apps/web/server.ts +27 -6
  357. package/template/apps/web/src/composables/useLoginFlow.ts +13 -1
  358. package/template/apps/web/src/pages/errors/PlatformErrorPage.vue +6 -0
  359. package/template/apps/web/src/pages/errors/PlatformErrorPage.webtest.ts +14 -1
  360. package/template/apps/web/src/pages/errors/error-page-extension.ts +1 -0
  361. package/template/apps/web/src/pages/system/AgentDebugPage.vue +14 -0
  362. package/template/apps/web/src/pages/system/AgentNativePage.vue +44 -0
  363. package/template/apps/web/src/pages/system/AgentSessionPage.vue +29 -8
  364. package/template/apps/web/src/pages/system/AgentToolsPage.vue +76 -0
  365. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +20 -7
  366. package/template/apps/web/src/pages/system/DiagnosticLookupPage.vue +56 -0
  367. package/template/apps/web/src/pages/system/DiagnosticLookupPage.webtest.ts +99 -0
  368. package/template/apps/web/src/pages/system/SystemAgentSkillsPage.vue +88 -0
  369. package/template/apps/web/src/pages/system/components/DiagnosticRecordDetails.vue +52 -0
  370. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillDetailDialog.vue +166 -0
  371. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillGovernanceActionDialog.vue +51 -0
  372. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.vue +320 -0
  373. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.webtest.ts +96 -0
  374. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillsTable.vue +69 -0
  375. package/template/apps/web/src/pages/system/components/agent-workbench/AgentWorkbench.vue +236 -0
  376. package/template/apps/web/src/pages/system/components/agent-workbench/DraftLeaveDialog.vue +34 -0
  377. package/template/apps/web/src/pages/system/components/agent-workbench/ReplayEventDetail.vue +175 -0
  378. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.vue +142 -0
  379. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.webtest.ts +242 -0
  380. package/template/apps/web/src/pages/system/components/agent-workbench/TestRunComposer.vue +97 -0
  381. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.vue +100 -0
  382. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.webtest.ts +55 -0
  383. package/template/apps/web/src/pages/system/components/agent-workbench/ToolRuleDetail.vue +81 -0
  384. package/template/apps/web/src/pages/system/components/agent-workbench/WorkbenchSessionList.vue +57 -0
  385. package/template/apps/web/src/pages/system/components/agent-workbench/catalog-presenter.ts +20 -0
  386. package/template/apps/web/src/pages/system/components/agent-workbench/replay-presenter.ts +94 -0
  387. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.vue +82 -0
  388. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.webtest.ts +57 -0
  389. package/template/apps/web/src/pages/system/composables/useAgentSkillsGovernance.ts +105 -0
  390. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.ts +298 -0
  391. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.webtest.ts +164 -0
  392. package/template/apps/web/src/pages/system/composables/useAgentWorkflowPresets.ts +44 -0
  393. package/template/apps/web/src/pages/system/composables/useDiagnosticLookup.ts +64 -0
  394. package/template/apps/web/src/pages/system/composables/useSessionReplay.ts +48 -0
  395. package/template/apps/web/src/router/error-navigation.ts +3 -1
  396. package/template/apps/web/src/router/error-navigation.webtest.ts +14 -2
  397. package/template/apps/web/src/router/index.ts +8 -45
  398. package/template/apps/web/src/router/platform-admin-pages.ts +79 -0
  399. package/template/apps/web/src/router/platform-admin-route-bindings.ts +12 -0
  400. package/template/apps/web/src/services/agent-admin-api.ts +155 -0
  401. package/template/apps/web/src/services/agent-admin-api.webtest.ts +120 -0
  402. package/template/apps/web/src/services/agent-skills-api.ts +55 -0
  403. package/template/apps/web/src/services/agent-workbench-event.ts +60 -0
  404. package/template/apps/web/src/services/agent-workflow-api.ts +12 -0
  405. package/template/apps/web/src/services/diagnostics-api.ts +12 -0
  406. package/template/apps/web/src/services/http.ts +18 -0
  407. package/template/apps/web/src/services/http.webtest.ts +51 -0
  408. package/template/apps/web/vite.config.ts +39 -0
  409. package/template/deploy/dsh/README.md +5 -0
  410. package/template/deploy/dsh/documents/README.md +9 -0
  411. package/template/deploy/dsh/documents/requirements.in +6 -0
  412. package/template/deploy/dsh/documents/requirements.lock +72 -0
  413. package/template/docker-compose.yml +24 -10
  414. package/template/docs/adr/0004-embedded-dsh-runtime.md +9 -0
  415. package/template/docs/architecture/agent-admin-workbench-implementation.md +73 -0
  416. package/template/docs/architecture/agent-admin-workbench-plan.md +41 -0
  417. package/template/docs/architecture/agent-harness.md +6 -0
  418. package/template/docs/architecture/agent-runtime-compatibility.md +2 -0
  419. package/template/docs/architecture/embedded-dsh-integration.md +44 -0
  420. package/template/docs/development/dsh-plugins.md +55 -0
  421. package/template/docs/operations/dsh-agent-migration.md +98 -0
  422. package/template/docs/platform/agent-production-store.md +5 -78
  423. package/template/docs/platform/agent-runtime-observability.md +2 -0
  424. package/template/docs/platform/agent-runtime.md +2 -0
  425. package/template/docs/platform/agent-skills.md +25 -0
  426. package/template/package.json +4 -3
  427. package/template/packages/database/drizzle/0064_dsh_skills_diagnostics.sql +42 -0
  428. package/template/packages/database/drizzle/meta/0064_snapshot.json +15349 -0
  429. package/template/packages/database/drizzle/meta/_journal.json +7 -0
  430. package/template/packages/database/package.json +2 -2
  431. package/template/packages/database/src/schema/agent-skills.ts +65 -0
  432. package/template/packages/database/src/schema/diagnostics.ts +27 -0
  433. package/template/packages/database/src/schema/index.ts +8 -0
  434. package/template/packages/modules/package.json +1 -1
  435. package/template/packages/modules/src/ai-operation-composition.ts +9 -0
  436. package/template/packages/modules/src/ai-operation-visibility.test.ts +33 -0
  437. package/template/packages/modules/src/manifest.ts +2 -0
  438. package/template/packages/modules/src/system-admin-routes.ts +40 -0
  439. package/template/packages/modules/src/system-admin-ui-catalog.ts +24 -11
  440. package/template/packages/modules/src/system-agent-admin-bindings.ts +44 -0
  441. package/template/packages/modules/src/system-agent-admin-menus.ts +46 -0
  442. package/template/packages/modules/src/system-agent-admin-registration.test.ts +52 -0
  443. package/template/packages/modules/src/system-agent-audit-actions.ts +8 -0
  444. package/template/packages/modules/src/system-agent-dsh.ts +119 -0
  445. package/template/packages/modules/src/system-ai-api-bindings.ts +2 -0
  446. package/template/packages/modules/src/system-api-permissions.ts +9 -0
  447. package/template/packages/modules/src/system-audit-actions.ts +36 -0
  448. package/template/packages/modules/src/system-features.ts +24 -0
  449. package/template/packages/modules/src/system-module-audit-selection.ts +25 -0
  450. package/template/packages/modules/src/system-module-catalog.ts +22 -40
  451. package/template/packages/modules/src/system-module-ownership.ts +12 -0
  452. package/template/packages/modules/src/system-modules.ts +16 -3
  453. package/template/packages/modules/src/system-permissions.ts +15 -0
  454. package/template/packages/server-sdk/index.ts +2 -0
  455. package/template/packages/server-sdk/package.json +2 -2
  456. package/template/packages/server-sdk/src/agent-session-provider.ts +19 -0
  457. package/template/packages/shared/index.ts +14 -0
  458. package/template/packages/shared/package.json +1 -1
  459. package/template/packages/shared/src/agent-admin-catalog.ts +73 -0
  460. package/template/packages/shared/src/agent-skills.ts +68 -0
  461. package/template/packages/shared/src/agent-workbench.ts +100 -0
  462. package/template/packages/shared/src/agent-workflow-presets.ts +26 -0
  463. package/template/packages/shared/src/diagnostics.ts +13 -0
  464. package/template/packages/shared/src/rbac.ts +1 -0
  465. package/template/apps/agent-server/install-python-dependencies.sh +0 -92
  466. package/template/apps/agent-server/pyproject.toml +0 -51
  467. package/template/apps/agent-server/src/southwind_agent_server/__init__.py +0 -5
  468. package/template/apps/agent-server/src/southwind_agent_server/app.py +0 -344
  469. package/template/apps/agent-server/src/southwind_agent_server/approval_resolution.py +0 -30
  470. package/template/apps/agent-server/src/southwind_agent_server/artifact_input.py +0 -153
  471. package/template/apps/agent-server/src/southwind_agent_server/asgi.py +0 -8
  472. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +0 -199
  473. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +0 -203
  474. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +0 -61
  475. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +0 -82
  476. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +0 -121
  477. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +0 -158
  478. package/template/apps/agent-server/src/southwind_agent_server/config.py +0 -267
  479. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +0 -24
  480. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +0 -71
  481. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +0 -307
  482. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +0 -297
  483. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +0 -63
  484. package/template/apps/agent-server/src/southwind_agent_server/engine.py +0 -134
  485. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +0 -31
  486. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +0 -2
  487. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +0 -61
  488. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +0 -93
  489. package/template/apps/agent-server/src/southwind_agent_server/http_helpers.py +0 -62
  490. package/template/apps/agent-server/src/southwind_agent_server/lease.py +0 -15
  491. package/template/apps/agent-server/src/southwind_agent_server/multimodal.py +0 -76
  492. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +0 -329
  493. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +0 -165
  494. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +0 -345
  495. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +0 -37
  496. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +0 -235
  497. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_replay.py +0 -44
  498. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_status.py +0 -83
  499. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +0 -336
  500. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_summary.py +0 -304
  501. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +0 -335
  502. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +0 -333
  503. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +0 -144
  504. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +0 -309
  505. package/template/apps/agent-server/src/southwind_agent_server/provider_output_guidance.py +0 -34
  506. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +0 -37
  507. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +0 -218
  508. package/template/apps/agent-server/src/southwind_agent_server/report_metrics.py +0 -149
  509. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +0 -300
  510. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +0 -132
  511. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +0 -298
  512. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +0 -75
  513. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +0 -118
  514. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +0 -64
  515. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +0 -59
  516. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +0 -74
  517. package/template/apps/agent-server/src/southwind_agent_server/runtime_compatibility.py +0 -89
  518. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +0 -105
  519. package/template/apps/agent-server/src/southwind_agent_server/runtime_logging.py +0 -57
  520. package/template/apps/agent-server/src/southwind_agent_server/service.py +0 -325
  521. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +0 -64
  522. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +0 -4
  523. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +0 -34
  524. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +0 -34
  525. package/template/apps/agent-server/src/southwind_agent_server/signal_events.py +0 -53
  526. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +0 -118
  527. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +0 -2
  528. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +0 -73
  529. package/template/apps/agent-server/src/southwind_agent_server/sqlite_serialization.py +0 -16
  530. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +0 -350
  531. package/template/apps/agent-server/src/southwind_agent_server/sse.py +0 -41
  532. package/template/apps/agent-server/src/southwind_agent_server/store.py +0 -255
  533. package/template/apps/agent-server/src/southwind_agent_server/store_cipher.py +0 -40
  534. package/template/apps/agent-server/src/southwind_agent_server/structured_logging.py +0 -145
  535. package/template/apps/agent-server/src/southwind_agent_server/telemetry.py +0 -93
  536. package/template/apps/agent-server/src/southwind_agent_server/tool_host.py +0 -152
  537. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +0 -137
  538. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +0 -58
  539. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +0 -87
  540. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +0 -28
  541. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +0 -247
  542. package/template/apps/agent-server/tests/__init__.py +0 -1
  543. package/template/apps/agent-server/tests/openai_provider_test_support.py +0 -131
  544. package/template/apps/agent-server/tests/test_api.py +0 -305
  545. package/template/apps/agent-server/tests/test_artifact_input.py +0 -110
  546. package/template/apps/agent-server/tests/test_client_completion.py +0 -230
  547. package/template/apps/agent-server/tests/test_config.py +0 -106
  548. package/template/apps/agent-server/tests/test_fingerprint.py +0 -10
  549. package/template/apps/agent-server/tests/test_multimodal.py +0 -81
  550. package/template/apps/agent-server/tests/test_openai_provider.py +0 -320
  551. package/template/apps/agent-server/tests/test_postgres_report_status.py +0 -59
  552. package/template/apps/agent-server/tests/test_postgres_report_summary.py +0 -298
  553. package/template/apps/agent-server/tests/test_postgres_store.py +0 -135
  554. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +0 -140
  555. package/template/apps/agent-server/tests/test_provider_governance.py +0 -276
  556. package/template/apps/agent-server/tests/test_report_attempt_lifecycle.py +0 -126
  557. package/template/apps/agent-server/tests/test_report_resilience.py +0 -183
  558. package/template/apps/agent-server/tests/test_report_routes.py +0 -143
  559. package/template/apps/agent-server/tests/test_report_store.py +0 -347
  560. package/template/apps/agent-server/tests/test_report_summary_parity.py +0 -116
  561. package/template/apps/agent-server/tests/test_report_terminal_sync.py +0 -177
  562. package/template/apps/agent-server/tests/test_run_capacity.py +0 -112
  563. package/template/apps/agent-server/tests/test_run_operational_logging.py +0 -114
  564. package/template/apps/agent-server/tests/test_runtime_compatibility.py +0 -119
  565. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +0 -52
  566. package/template/apps/agent-server/tests/test_sqlite_store.py +0 -182
  567. package/template/apps/agent-server/tests/test_structured_logging.py +0 -142
  568. package/template/apps/agent-server/tests/test_telemetry.py +0 -25
  569. package/template/apps/agent-server/tests/test_tool_approval.py +0 -28
  570. package/template/apps/agent-server/tests/test_tool_structured_output.py +0 -347
  571. package/template/apps/agent-server/tests/test_trajectory.py +0 -91
  572. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +0 -72
  573. package/template/apps/agent-server/tests/test_vlm_readiness.py +0 -106
  574. package/template/apps/agent-server/uv.lock +0 -831
@@ -1,298 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import time
5
- import uuid
6
- from collections.abc import Callable
7
- from dataclasses import replace
8
- from typing import Literal
9
-
10
- from .contracts import StartRunRequest
11
- from .engine_identity import DIRECT_ENGINE_ID
12
- from .report_metrics import AgentRuntimeMetrics
13
- from .report_presenter import (
14
- aggregate_summary,
15
- attempt_value,
16
- attempts_for,
17
- filtered_attempts,
18
- filtered_runs,
19
- run_value,
20
- scoped_runs,
21
- )
22
- from .report_store_protocol import AgentRuntimeReportStore
23
- from .report_types import (
24
- AttemptReport,
25
- AttemptTerminalOutcome,
26
- NonTerminalRunStatus,
27
- ReportFilter,
28
- RunReport,
29
- UsageFacts,
30
- identity,
31
- retention_seconds,
32
- validate_retention,
33
- )
34
-
35
- __all__ = ["AgentRuntimeReportStore", "InMemoryAgentRuntimeReportStore"]
36
-
37
-
38
- class InMemoryAgentRuntimeReportStore:
39
- def __init__(
40
- self,
41
- retention_days: int = 90,
42
- *,
43
- now: Callable[[], float] = time.time,
44
- metrics: AgentRuntimeMetrics | None = None,
45
- ) -> None:
46
- validate_retention(retention_days)
47
- self.retention_days = retention_days
48
- self._now = now
49
- self.metrics = metrics or AgentRuntimeMetrics()
50
- self._runs: dict[str, RunReport] = {}
51
- self._attempts: dict[str, AttemptReport] = {}
52
- self._lock = asyncio.Lock()
53
-
54
- async def ensure_run(
55
- self,
56
- run_id: str,
57
- request: StartRunRequest,
58
- created_at: float,
59
- engine_id: str = DIRECT_ENGINE_ID,
60
- ) -> None:
61
- async with self._lock:
62
- self._prune()
63
- context = request.reporting
64
- candidate = RunReport(
65
- run_id=run_id,
66
- engine_id=engine_id,
67
- operation_key=request.operation_key,
68
- release_id=request.release.release_id,
69
- trace_id=request.trace_id,
70
- actor_id=context.actor_id if context else None,
71
- actor_type=context.actor_type if context else None,
72
- department_id=context.department_id if context else None,
73
- status="accepted",
74
- safe_error_code=None,
75
- started_at=None,
76
- finished_at=None,
77
- duration_ms=None,
78
- created_at=created_at,
79
- updated_at=created_at,
80
- expires_at=created_at + retention_seconds(self.retention_days),
81
- )
82
- existing = self._runs.get(run_id)
83
- if existing and identity(existing) != identity(candidate):
84
- raise ValueError("Agent Runtime 报表 Run 身份冲突")
85
- if existing is None:
86
- self._runs[run_id] = candidate
87
-
88
- async def start_run(self, run_id: str, started_at: float) -> None:
89
- async with self._lock:
90
- run = self._runs[run_id]
91
- if run.status in {"completed", "failed", "cancelled"}:
92
- return
93
- for attempt_id, attempt in self._attempts.items():
94
- if attempt.run_id != run_id or attempt.outcome != "running":
95
- continue
96
- usage = UsageFacts()
97
- self._attempts[attempt_id] = replace(
98
- attempt,
99
- outcome="abandoned",
100
- usage=usage,
101
- duration_ms=max(
102
- 0,
103
- round((started_at - attempt.started_at) * 1_000),
104
- ),
105
- finished_at=started_at,
106
- )
107
- self.metrics.observe_attempt("abandoned", usage)
108
- self._runs[run_id] = replace(
109
- run,
110
- status="running",
111
- started_at=run.started_at or started_at,
112
- updated_at=started_at,
113
- )
114
-
115
- async def set_run_status(
116
- self,
117
- run_id: str,
118
- status: NonTerminalRunStatus,
119
- updated_at: float,
120
- ) -> None:
121
- async with self._lock:
122
- run = self._runs[run_id]
123
- if run.status in {"completed", "failed", "cancelled"}:
124
- return
125
- if updated_at < run.updated_at:
126
- return
127
- self._runs[run_id] = replace(
128
- run,
129
- status=status,
130
- updated_at=updated_at,
131
- )
132
-
133
- async def finish_run(
134
- self,
135
- run_id: str,
136
- status: Literal["completed", "failed", "cancelled"],
137
- finished_at: float,
138
- safe_error_code: str | None = None,
139
- ) -> None:
140
- async with self._lock:
141
- run = self._runs[run_id]
142
- if run.status in {"completed", "failed", "cancelled"}:
143
- if run.status != status:
144
- raise ValueError("Agent Runtime 报表终态冲突")
145
- return
146
- started = run.started_at or run.created_at
147
- self._runs[run_id] = replace(
148
- run,
149
- status=status,
150
- safe_error_code=safe_error_code,
151
- finished_at=finished_at,
152
- duration_ms=max(0, round((finished_at - started) * 1_000)),
153
- updated_at=finished_at,
154
- expires_at=finished_at + retention_seconds(self.retention_days),
155
- )
156
- self.metrics.observe_run(status)
157
-
158
- async def start_attempt(
159
- self,
160
- run_id: str,
161
- tool_round: int,
162
- deployment_key: str,
163
- requested_model: str,
164
- started_at: float,
165
- ) -> AttemptReport:
166
- async with self._lock:
167
- sequence = 1 + max(
168
- (
169
- attempt.sequence
170
- for attempt in self._attempts.values()
171
- if attempt.run_id == run_id
172
- ),
173
- default=0,
174
- )
175
- attempt = AttemptReport(
176
- attempt_id=f"attempt_{uuid.uuid4().hex}",
177
- run_id=run_id,
178
- sequence=sequence,
179
- tool_round=tool_round,
180
- deployment_key=deployment_key,
181
- requested_model=requested_model,
182
- reported_model=None,
183
- outcome="running",
184
- usage=UsageFacts(),
185
- duration_ms=None,
186
- safe_error_code=None,
187
- started_at=started_at,
188
- finished_at=None,
189
- )
190
- self._attempts[attempt.attempt_id] = attempt
191
- return attempt
192
-
193
- async def finish_attempt(
194
- self,
195
- attempt_id: str,
196
- outcome: AttemptTerminalOutcome,
197
- usage: UsageFacts,
198
- finished_at: float,
199
- reported_model: str | None = None,
200
- safe_error_code: str | None = None,
201
- ) -> None:
202
- async with self._lock:
203
- attempt = self._attempts[attempt_id]
204
- if attempt.finished_at is not None:
205
- if (
206
- attempt.outcome != outcome
207
- or attempt.usage != usage
208
- or attempt.reported_model != reported_model
209
- or attempt.safe_error_code != safe_error_code
210
- ):
211
- raise ValueError("Agent Runtime 报表 Attempt 终态冲突")
212
- return
213
- self._attempts[attempt_id] = replace(
214
- attempt,
215
- outcome=outcome,
216
- usage=usage,
217
- reported_model=reported_model,
218
- safe_error_code=safe_error_code,
219
- duration_ms=max(0, round((finished_at - attempt.started_at) * 1_000)),
220
- finished_at=finished_at,
221
- )
222
- self.metrics.observe_attempt(outcome, usage)
223
-
224
- async def summary(self, query: ReportFilter) -> dict[str, object]:
225
- async with self._lock:
226
- self._prune()
227
- visible_runs = scoped_runs(self._runs.values(), query)
228
- runs = filtered_runs(visible_runs, query)
229
- attempts = filtered_attempts(
230
- self._attempts.values(),
231
- visible_runs,
232
- query,
233
- )
234
- return aggregate_summary(
235
- runs,
236
- attempts,
237
- self.retention_days,
238
- min(
239
- [run.created_at for run in runs]
240
- + [attempt.started_at for attempt in attempts],
241
- default=None,
242
- ),
243
- self._now(),
244
- )
245
-
246
- async def list_runs(
247
- self, query: ReportFilter, page: int, page_size: int
248
- ) -> dict[str, object]:
249
- async with self._lock:
250
- self._prune()
251
- runs = sorted(
252
- filtered_runs(self._runs.values(), query),
253
- key=lambda run: run.created_at,
254
- reverse=True,
255
- )
256
- start = (page - 1) * page_size
257
- items = [
258
- run_value(run, attempts_for(self._attempts.values(), [run]))
259
- for run in runs[start : start + page_size]
260
- ]
261
- return {
262
- "items": items,
263
- "total": len(runs),
264
- "page": page,
265
- "pageSize": page_size,
266
- }
267
-
268
- async def get_run(self, run_id: str) -> dict[str, object] | None:
269
- async with self._lock:
270
- self._prune()
271
- run = self._runs.get(run_id)
272
- if run is None:
273
- return None
274
- attempts = attempts_for(self._attempts.values(), [run])
275
- return {
276
- **run_value(run, attempts),
277
- "releaseId": run.release_id,
278
- "traceId": run.trace_id,
279
- "safeErrorCode": run.safe_error_code,
280
- "attempts": [attempt_value(item) for item in attempts],
281
- }
282
-
283
- async def close(self) -> None:
284
- return None
285
-
286
- def _prune(self) -> None:
287
- expired = {
288
- run_id
289
- for run_id, run in self._runs.items()
290
- if run.expires_at <= self._now()
291
- }
292
- for run_id in expired:
293
- self._runs.pop(run_id, None)
294
- self._attempts = {
295
- key: value
296
- for key, value in self._attempts.items()
297
- if value.run_id not in expired
298
- }
@@ -1,75 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Literal, Protocol
4
-
5
- from .contracts import StartRunRequest
6
- from .engine_identity import DIRECT_ENGINE_ID
7
- from .report_metrics import AgentRuntimeMetrics
8
- from .report_types import (
9
- AttemptReport,
10
- AttemptTerminalOutcome,
11
- NonTerminalRunStatus,
12
- ReportFilter,
13
- UsageFacts,
14
- )
15
-
16
-
17
- class AgentRuntimeReportStore(Protocol):
18
- """Persistence boundary for operational reports and model attempts."""
19
-
20
- retention_days: int
21
- metrics: AgentRuntimeMetrics
22
-
23
- async def ensure_run(
24
- self,
25
- run_id: str,
26
- request: StartRunRequest,
27
- created_at: float,
28
- engine_id: str = DIRECT_ENGINE_ID,
29
- ) -> None: ...
30
-
31
- async def start_run(self, run_id: str, started_at: float) -> None: ...
32
-
33
- async def set_run_status(
34
- self,
35
- run_id: str,
36
- status: NonTerminalRunStatus,
37
- updated_at: float,
38
- ) -> None: ...
39
-
40
- async def finish_run(
41
- self,
42
- run_id: str,
43
- status: Literal["completed", "failed", "cancelled"],
44
- finished_at: float,
45
- safe_error_code: str | None = None,
46
- ) -> None: ...
47
-
48
- async def start_attempt(
49
- self,
50
- run_id: str,
51
- tool_round: int,
52
- deployment_key: str,
53
- requested_model: str,
54
- started_at: float,
55
- ) -> AttemptReport: ...
56
-
57
- async def finish_attempt(
58
- self,
59
- attempt_id: str,
60
- outcome: AttemptTerminalOutcome,
61
- usage: UsageFacts,
62
- finished_at: float,
63
- reported_model: str | None = None,
64
- safe_error_code: str | None = None,
65
- ) -> None: ...
66
-
67
- async def summary(self, query: ReportFilter) -> dict[str, object]: ...
68
-
69
- async def list_runs(
70
- self, query: ReportFilter, page: int, page_size: int
71
- ) -> dict[str, object]: ...
72
-
73
- async def get_run(self, run_id: str) -> dict[str, object] | None: ...
74
-
75
- async def close(self) -> None: ...
@@ -1,118 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
- from datetime import UTC, datetime
5
- from typing import Literal
6
-
7
- from .contracts import RunStatus
8
-
9
- type AttemptTerminalOutcome = Literal[
10
- "completed", "failed", "cancelled", "blocked", "abandoned"
11
- ]
12
- type AttemptOutcome = Literal["running"] | AttemptTerminalOutcome
13
- type NonTerminalRunStatus = Literal["running", "awaiting-approval"]
14
- type CacheStatus = Literal["hit", "miss", "unknown"]
15
- type UsageSource = Literal["provider-reported", "estimated", "unknown"]
16
-
17
-
18
- @dataclass(frozen=True)
19
- class UsageFacts:
20
- source: UsageSource = "unknown"
21
- input_tokens: int | None = None
22
- output_tokens: int | None = None
23
- cached_input_tokens: int | None = None
24
- reasoning_tokens: int | None = None
25
- total_tokens: int | None = None
26
- first_token_latency_ms: int | None = None
27
- cache_status: CacheStatus = "unknown"
28
-
29
- def event_value(self) -> dict[str, str | int]:
30
- result: dict[str, str | int] = {
31
- "source": self.source,
32
- "cacheStatus": self.cache_status,
33
- }
34
- for key, value in (
35
- ("inputTokens", self.input_tokens),
36
- ("outputTokens", self.output_tokens),
37
- ("cachedInputTokens", self.cached_input_tokens),
38
- ("reasoningTokens", self.reasoning_tokens),
39
- ("totalTokens", self.total_tokens),
40
- ("firstTokenLatencyMs", self.first_token_latency_ms),
41
- ):
42
- if value is not None:
43
- result[key] = value
44
- return result
45
-
46
-
47
- @dataclass(frozen=True)
48
- class RunReport:
49
- run_id: str
50
- engine_id: str
51
- operation_key: str
52
- release_id: str
53
- trace_id: str
54
- actor_id: str | None
55
- actor_type: str | None
56
- department_id: str | None
57
- status: RunStatus
58
- safe_error_code: str | None
59
- started_at: float | None
60
- finished_at: float | None
61
- duration_ms: int | None
62
- created_at: float
63
- updated_at: float
64
- expires_at: float
65
-
66
-
67
- @dataclass(frozen=True)
68
- class AttemptReport:
69
- attempt_id: str
70
- run_id: str
71
- sequence: int
72
- tool_round: int
73
- deployment_key: str
74
- requested_model: str
75
- reported_model: str | None
76
- outcome: AttemptOutcome
77
- usage: UsageFacts
78
- duration_ms: int | None
79
- safe_error_code: str | None
80
- started_at: float
81
- finished_at: float | None
82
-
83
-
84
- @dataclass(frozen=True)
85
- class ReportFilter:
86
- from_timestamp: float
87
- to_timestamp: float
88
- selected_actor_id: str | None = None
89
- scope_restricted: bool = False
90
- actor_ids: tuple[str, ...] = ()
91
- department_ids: tuple[str, ...] = ()
92
-
93
-
94
- def validate_retention(value: int) -> None:
95
- if not 1 <= value <= 3650:
96
- raise ValueError("AI Runtime 报表留存天数超出范围")
97
-
98
-
99
- def retention_seconds(days: int) -> int:
100
- return days * 24 * 60 * 60
101
-
102
-
103
- def iso(value: float | None) -> str | None:
104
- return (
105
- datetime.fromtimestamp(value, tz=UTC).isoformat().replace("+00:00", "Z")
106
- if value is not None
107
- else None
108
- )
109
-
110
-
111
- def identity(run: RunReport) -> tuple[str, str, str, str, str | None]:
112
- return (
113
- run.engine_id,
114
- run.operation_key,
115
- run.release_id,
116
- run.trace_id,
117
- run.actor_id,
118
- )
@@ -1,64 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- from dataclasses import dataclass
5
-
6
- from .contracts import JsonValue
7
- from .engine import SafeEngineError
8
- from .run_capacity import (
9
- RunCapacity,
10
- RunCapacityReservation,
11
- RunCapacityUnavailable,
12
- )
13
- from .store import IdempotencyConflictError, RunRecord, RunStore
14
-
15
-
16
- @dataclass(frozen=True)
17
- class RunAdmissionResult:
18
- record: RunRecord
19
- reservation: RunCapacityReservation | None
20
-
21
-
22
- class RunAdmission:
23
- def __init__(self, store: RunStore, capacity: RunCapacity) -> None:
24
- self._store = store
25
- self._capacity = capacity
26
- self._lock = asyncio.Lock()
27
-
28
- async def admit(
29
- self,
30
- candidate: RunRecord,
31
- invocation: JsonValue,
32
- ) -> RunAdmissionResult:
33
- async with self._lock:
34
- current = await self._store.get_by_idempotency(candidate.idempotency_key)
35
- if current:
36
- if current.fingerprint != candidate.fingerprint:
37
- raise IdempotencyConflictError
38
- return RunAdmissionResult(current, None)
39
- try:
40
- reservation = await self._capacity.reserve()
41
- except RunCapacityUnavailable:
42
- raise SafeEngineError(
43
- "RUNTIME_UNAVAILABLE",
44
- "VLM Runtime 容量已满",
45
- retryable=True,
46
- ) from None
47
- try:
48
- record, created = await self._store.create_or_get(
49
- candidate,
50
- invocation,
51
- )
52
- except Exception:
53
- await reservation.release()
54
- raise
55
- if not created:
56
- await reservation.release()
57
- return RunAdmissionResult(record, None)
58
- return RunAdmissionResult(record, reservation)
59
-
60
- async def reserve_recovery(self) -> RunCapacityReservation | None:
61
- try:
62
- return await self._capacity.reserve()
63
- except RunCapacityUnavailable:
64
- return None
@@ -1,59 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
-
5
-
6
- class RunCapacityUnavailable(Exception):
7
- pass
8
-
9
-
10
- class RunCapacity:
11
- def __init__(self, max_concurrent_runs: int, max_queue_depth: int) -> None:
12
- if max_concurrent_runs < 1 or max_queue_depth < 0:
13
- raise ValueError("Agent Run 容量配置无效")
14
- self._maximum = max_concurrent_runs
15
- self._queue_maximum = max_queue_depth
16
- self._active = 0
17
- self._queued = 0
18
- self._condition = asyncio.Condition()
19
-
20
- async def reserve(self) -> RunCapacityReservation:
21
- async with self._condition:
22
- if self._active + self._queued >= self._maximum + self._queue_maximum:
23
- raise RunCapacityUnavailable
24
- self._queued += 1
25
- return RunCapacityReservation(self)
26
-
27
- async def enter(self, reservation: RunCapacityReservation) -> None:
28
- async with self._condition:
29
- while self._active >= self._maximum:
30
- await self._condition.wait()
31
- if reservation.released or reservation.entered:
32
- raise RuntimeError("Agent Run 容量票据状态无效")
33
- self._queued -= 1
34
- self._active += 1
35
- reservation.entered = True
36
-
37
- async def release(self, reservation: RunCapacityReservation) -> None:
38
- async with self._condition:
39
- if reservation.released:
40
- return
41
- if reservation.entered:
42
- self._active -= 1
43
- else:
44
- self._queued -= 1
45
- reservation.released = True
46
- self._condition.notify_all()
47
-
48
-
49
- class RunCapacityReservation:
50
- def __init__(self, capacity: RunCapacity) -> None:
51
- self._capacity = capacity
52
- self.entered = False
53
- self.released = False
54
-
55
- async def enter(self) -> None:
56
- await self._capacity.enter(self)
57
-
58
- async def release(self) -> None:
59
- await self._capacity.release(self)
@@ -1,74 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
-
5
- from .contracts import RuntimeLimits
6
- from .engine import SafeEngineError
7
- from .report_types import UsageFacts
8
-
9
-
10
- @dataclass
11
- class RuntimeBudgetAdmission:
12
- limits: RuntimeLimits
13
- input_tokens: int = 0
14
- output_tokens: int = 0
15
- tool_calls: int = 0
16
-
17
- def before_attempt(self, attempt: int) -> int | None:
18
- if (
19
- self.limits.max_model_attempts is not None
20
- and attempt > self.limits.max_model_attempts
21
- ):
22
- self._denied("Agent 模型调用次数超过 Workflow 上限")
23
- if self.limits.max_input_tokens is not None:
24
- if self.input_tokens >= self.limits.max_input_tokens:
25
- self._denied("Agent 输入 Token 已耗尽")
26
- if self.limits.max_output_tokens is None:
27
- return None
28
- remaining = self.limits.max_output_tokens - self.output_tokens
29
- if remaining <= 0:
30
- self._denied("Agent 输出 Token 已耗尽")
31
- return remaining
32
-
33
- def record_usage(self, usage: UsageFacts) -> None:
34
- if usage.input_tokens is None or usage.output_tokens is None:
35
- if (
36
- self.limits.max_input_tokens is not None
37
- or self.limits.max_output_tokens is not None
38
- ):
39
- self._denied("Provider 未返回 Workflow Token 计量")
40
- return
41
- self.input_tokens += usage.input_tokens
42
- self.output_tokens += usage.output_tokens
43
- if (
44
- self.limits.max_input_tokens is not None
45
- and self.input_tokens > self.limits.max_input_tokens
46
- ):
47
- self._denied("Agent 输入 Token 超过 Workflow 上限")
48
- if (
49
- self.limits.max_output_tokens is not None
50
- and self.output_tokens > self.limits.max_output_tokens
51
- ):
52
- self._denied("Agent 输出 Token 超过 Workflow 上限")
53
-
54
- def before_provider(self, conservative_input_tokens: int) -> None:
55
- if conservative_input_tokens < 0:
56
- self._denied("Agent 输入 Token 上界无效")
57
- if (
58
- self.limits.max_input_tokens is not None
59
- and self.input_tokens + conservative_input_tokens
60
- > self.limits.max_input_tokens
61
- ):
62
- self._denied("Agent 本次输入可能超过 Workflow Token 上限")
63
-
64
- def reserve_tools(self, count: int) -> None:
65
- self.tool_calls += count
66
- if (
67
- self.limits.max_tool_calls is not None
68
- and self.tool_calls > self.limits.max_tool_calls
69
- ):
70
- self._denied("Agent Tool 调用次数超过 Workflow 上限")
71
-
72
- @staticmethod
73
- def _denied(message: str) -> None:
74
- raise SafeEngineError("BUDGET_EXCEEDED", message, retryable=False)