create-windy 0.8.3 → 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 (505) hide show
  1. package/dist/cli.js +838 -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/dsh-runtime-wire.test.ts +33 -0
  245. package/template/apps/server/src/agent/governance-runtime.ts +41 -0
  246. package/template/apps/server/src/agent/remote-runtime-response.ts +1 -1
  247. package/template/apps/server/src/agent/run-contracts.ts +1 -0
  248. package/template/apps/server/src/agent/run-definition-support.ts +9 -0
  249. package/template/apps/server/src/agent/runtime-tool-composition.ts +2 -0
  250. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +9 -0
  251. package/template/apps/server/src/agent-skills/access.ts +88 -0
  252. package/template/apps/server/src/agent-skills/bootstrap.ts +49 -0
  253. package/template/apps/server/src/agent-skills/builtin-registration.ts +83 -0
  254. package/template/apps/server/src/agent-skills/builtins.ts +19 -0
  255. package/template/apps/server/src/agent-skills/bundle-zip.ts +163 -0
  256. package/template/apps/server/src/agent-skills/bundle.test.ts +79 -0
  257. package/template/apps/server/src/agent-skills/bundle.ts +133 -0
  258. package/template/apps/server/src/agent-skills/contracts.ts +46 -0
  259. package/template/apps/server/src/agent-skills/drizzle-repository.ts +125 -0
  260. package/template/apps/server/src/agent-skills/input.ts +29 -0
  261. package/template/apps/server/src/agent-skills/postgres.integration.test.ts +348 -0
  262. package/template/apps/server/src/agent-skills/read-routes.test.ts +116 -0
  263. package/template/apps/server/src/agent-skills/reader.ts +108 -0
  264. package/template/apps/server/src/agent-skills/repository.ts +105 -0
  265. package/template/apps/server/src/agent-skills/routes.ts +176 -0
  266. package/template/apps/server/src/agent-skills/service.test.ts +295 -0
  267. package/template/apps/server/src/agent-skills/service.ts +301 -0
  268. package/template/apps/server/src/agent-workflow/preset-registry.test.ts +137 -0
  269. package/template/apps/server/src/agent-workflow/preset-registry.ts +191 -0
  270. package/template/apps/server/src/agent-workflow/preset-routes.test.ts +94 -0
  271. package/template/apps/server/src/agent-workflow/preset-routes.ts +45 -0
  272. package/template/apps/server/src/ai-runtime-report/service.test.ts +10 -7
  273. package/template/apps/server/src/ai-runtime-report/service.ts +1 -1
  274. package/template/apps/server/src/app/agent-workflow-presets.ts +4 -0
  275. package/template/apps/server/src/app/dsh-skill-draft-audit.test.ts +195 -0
  276. package/template/apps/server/src/app/dsh-skill-draft-audit.ts +115 -0
  277. package/template/apps/server/src/app/dsh-workbench-audit.test.ts +71 -0
  278. package/template/apps/server/src/app/dsh-workbench-audit.ts +34 -0
  279. package/template/apps/server/src/app/dsh-workbench-handshake.test.ts +63 -0
  280. package/template/apps/server/src/app/dsh-workbench-handshake.ts +48 -0
  281. package/template/apps/server/src/app/dsh-workbench-http.test.ts +96 -0
  282. package/template/apps/server/src/app/dsh-workbench-lan-origin.test.ts +114 -0
  283. package/template/apps/server/src/app/dsh-workbench-launch.test.ts +70 -0
  284. package/template/apps/server/src/app/dsh-workbench-origin.test.ts +54 -0
  285. package/template/apps/server/src/app/dsh-workbench-proxy.ts +205 -0
  286. package/template/apps/server/src/app/dsh-workbench-session-conflict.test.ts +61 -0
  287. package/template/apps/server/src/app/dsh-workbench-session.ts +59 -0
  288. package/template/apps/server/src/app/dsh-workbench-socket-audit.test.ts +115 -0
  289. package/template/apps/server/src/app/dsh-workbench-socket.test.ts +246 -0
  290. package/template/apps/server/src/app/dsh-workbench-socket.ts +272 -0
  291. package/template/apps/server/src/app/dsh-workbench-test-support.ts +158 -0
  292. package/template/apps/server/src/app/dsh-workbench.test.ts +213 -0
  293. package/template/apps/server/src/app/dsh-workbench.ts +279 -0
  294. package/template/apps/server/src/app/workbench-public-origin.ts +16 -0
  295. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +3 -0
  296. package/template/apps/server/src/http-app.ts +31 -0
  297. package/template/apps/server/src/mcp/adapter.ts +1 -0
  298. package/template/apps/server/src/module-composition.test.ts +23 -0
  299. package/template/apps/server/src/module-composition.ts +9 -2
  300. package/template/apps/server/src/observability/bootstrap.ts +12 -0
  301. package/template/apps/server/src/observability/diagnostic-failure-recorder.ts +94 -0
  302. package/template/apps/server/src/observability/diagnostic-http-contract.test.ts +42 -0
  303. package/template/apps/server/src/observability/diagnostic-index.test.ts +89 -0
  304. package/template/apps/server/src/observability/diagnostic-index.ts +88 -0
  305. package/template/apps/server/src/observability/diagnostic-repository.ts +67 -0
  306. package/template/apps/server/src/platform-app-bootstrap.ts +42 -0
  307. package/template/apps/server/src/platform-http-runtime.ts +6 -0
  308. package/template/apps/server/src/runtime-development.test.ts +25 -0
  309. package/template/apps/server/src/runtime-development.ts +6 -44
  310. package/template/apps/server/src/system/diagnostic-routes.test.ts +78 -0
  311. package/template/apps/server/src/system/diagnostic-routes.ts +66 -0
  312. package/template/apps/web/Dockerfile +9 -1
  313. package/template/apps/web/dev/start.ts +21 -10
  314. package/template/apps/web/dsh-workbench-location.ts +21 -0
  315. package/template/apps/web/dsh-workbench-proxy.test.ts +121 -0
  316. package/template/apps/web/dsh-workbench-proxy.ts +194 -0
  317. package/template/apps/web/package.json +3 -1
  318. package/template/apps/web/server.ts +27 -6
  319. package/template/apps/web/src/composables/useLoginFlow.ts +13 -1
  320. package/template/apps/web/src/pages/errors/PlatformErrorPage.vue +6 -0
  321. package/template/apps/web/src/pages/errors/PlatformErrorPage.webtest.ts +14 -1
  322. package/template/apps/web/src/pages/errors/error-page-extension.ts +1 -0
  323. package/template/apps/web/src/pages/system/AgentNativePage.vue +44 -0
  324. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +20 -7
  325. package/template/apps/web/src/pages/system/DiagnosticLookupPage.vue +56 -0
  326. package/template/apps/web/src/pages/system/DiagnosticLookupPage.webtest.ts +99 -0
  327. package/template/apps/web/src/pages/system/SystemAgentSkillsPage.vue +88 -0
  328. package/template/apps/web/src/pages/system/components/DiagnosticRecordDetails.vue +52 -0
  329. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillDetailDialog.vue +166 -0
  330. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillGovernanceActionDialog.vue +51 -0
  331. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.vue +320 -0
  332. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.webtest.ts +96 -0
  333. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillsTable.vue +69 -0
  334. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.vue +82 -0
  335. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.webtest.ts +57 -0
  336. package/template/apps/web/src/pages/system/composables/useAgentSkillsGovernance.ts +105 -0
  337. package/template/apps/web/src/pages/system/composables/useAgentWorkflowPresets.ts +44 -0
  338. package/template/apps/web/src/pages/system/composables/useDiagnosticLookup.ts +64 -0
  339. package/template/apps/web/src/router/error-navigation.ts +3 -1
  340. package/template/apps/web/src/router/error-navigation.webtest.ts +14 -2
  341. package/template/apps/web/src/router/index.ts +8 -49
  342. package/template/apps/web/src/router/platform-admin-pages.ts +79 -0
  343. package/template/apps/web/src/router/platform-admin-route-bindings.ts +8 -0
  344. package/template/apps/web/src/services/agent-skills-api.ts +55 -0
  345. package/template/apps/web/src/services/agent-workflow-api.ts +12 -0
  346. package/template/apps/web/src/services/diagnostics-api.ts +12 -0
  347. package/template/apps/web/src/services/http.ts +18 -0
  348. package/template/apps/web/src/services/http.webtest.ts +51 -0
  349. package/template/apps/web/vite.config.ts +39 -0
  350. package/template/deploy/dsh/README.md +5 -0
  351. package/template/deploy/dsh/documents/README.md +9 -0
  352. package/template/deploy/dsh/documents/requirements.in +6 -0
  353. package/template/deploy/dsh/documents/requirements.lock +72 -0
  354. package/template/docker-compose.yml +24 -10
  355. package/template/docs/adr/0004-embedded-dsh-runtime.md +9 -0
  356. package/template/docs/architecture/agent-admin-workbench-implementation.md +73 -0
  357. package/template/docs/architecture/agent-admin-workbench-plan.md +41 -0
  358. package/template/docs/architecture/agent-harness.md +2 -0
  359. package/template/docs/architecture/agent-runtime-compatibility.md +2 -0
  360. package/template/docs/architecture/embedded-dsh-integration.md +44 -0
  361. package/template/docs/development/dsh-plugins.md +55 -0
  362. package/template/docs/operations/dsh-agent-migration.md +98 -0
  363. package/template/docs/platform/agent-production-store.md +5 -78
  364. package/template/docs/platform/agent-runtime-observability.md +2 -0
  365. package/template/docs/platform/agent-runtime.md +2 -0
  366. package/template/docs/platform/agent-skills.md +25 -0
  367. package/template/package.json +4 -3
  368. package/template/packages/database/drizzle/0064_dsh_skills_diagnostics.sql +42 -0
  369. package/template/packages/database/drizzle/meta/0064_snapshot.json +15349 -0
  370. package/template/packages/database/drizzle/meta/_journal.json +7 -0
  371. package/template/packages/database/package.json +2 -2
  372. package/template/packages/database/src/schema/agent-skills.ts +65 -0
  373. package/template/packages/database/src/schema/diagnostics.ts +27 -0
  374. package/template/packages/database/src/schema/index.ts +8 -0
  375. package/template/packages/modules/package.json +1 -1
  376. package/template/packages/modules/src/system-admin-routes.ts +24 -0
  377. package/template/packages/modules/src/system-admin-ui-catalog.ts +17 -10
  378. package/template/packages/modules/src/system-agent-admin-bindings.ts +2 -0
  379. package/template/packages/modules/src/system-agent-admin-menus.ts +20 -0
  380. package/template/packages/modules/src/system-agent-audit-actions.ts +3 -0
  381. package/template/packages/modules/src/system-agent-dsh.ts +119 -0
  382. package/template/packages/modules/src/system-api-permissions.ts +9 -0
  383. package/template/packages/modules/src/system-audit-actions.ts +11 -0
  384. package/template/packages/modules/src/system-features.ts +5 -0
  385. package/template/packages/modules/src/system-module-audit-selection.ts +25 -0
  386. package/template/packages/modules/src/system-module-catalog.ts +12 -32
  387. package/template/packages/modules/src/system-modules.ts +14 -3
  388. package/template/packages/modules/src/system-permissions.ts +10 -0
  389. package/template/packages/server-sdk/package.json +2 -2
  390. package/template/packages/shared/index.ts +12 -0
  391. package/template/packages/shared/package.json +1 -1
  392. package/template/packages/shared/src/agent-skills.ts +68 -0
  393. package/template/packages/shared/src/agent-workflow-presets.ts +26 -0
  394. package/template/packages/shared/src/diagnostics.ts +13 -0
  395. package/template/packages/shared/src/rbac.ts +1 -0
  396. package/template/apps/agent-server/install-python-dependencies.sh +0 -92
  397. package/template/apps/agent-server/pyproject.toml +0 -51
  398. package/template/apps/agent-server/src/southwind_agent_server/__init__.py +0 -5
  399. package/template/apps/agent-server/src/southwind_agent_server/app.py +0 -344
  400. package/template/apps/agent-server/src/southwind_agent_server/approval_resolution.py +0 -30
  401. package/template/apps/agent-server/src/southwind_agent_server/artifact_input.py +0 -153
  402. package/template/apps/agent-server/src/southwind_agent_server/asgi.py +0 -8
  403. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +0 -199
  404. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +0 -203
  405. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +0 -61
  406. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +0 -82
  407. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +0 -121
  408. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +0 -158
  409. package/template/apps/agent-server/src/southwind_agent_server/config.py +0 -267
  410. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +0 -24
  411. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +0 -71
  412. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +0 -307
  413. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +0 -297
  414. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +0 -63
  415. package/template/apps/agent-server/src/southwind_agent_server/engine.py +0 -134
  416. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +0 -31
  417. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +0 -2
  418. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +0 -61
  419. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +0 -93
  420. package/template/apps/agent-server/src/southwind_agent_server/http_helpers.py +0 -62
  421. package/template/apps/agent-server/src/southwind_agent_server/lease.py +0 -15
  422. package/template/apps/agent-server/src/southwind_agent_server/multimodal.py +0 -76
  423. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +0 -329
  424. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +0 -165
  425. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +0 -345
  426. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +0 -37
  427. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +0 -235
  428. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_replay.py +0 -44
  429. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_status.py +0 -83
  430. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +0 -336
  431. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_summary.py +0 -304
  432. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +0 -335
  433. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +0 -333
  434. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +0 -144
  435. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +0 -309
  436. package/template/apps/agent-server/src/southwind_agent_server/provider_output_guidance.py +0 -34
  437. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +0 -37
  438. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +0 -218
  439. package/template/apps/agent-server/src/southwind_agent_server/report_metrics.py +0 -149
  440. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +0 -300
  441. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +0 -132
  442. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +0 -298
  443. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +0 -75
  444. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +0 -118
  445. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +0 -64
  446. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +0 -59
  447. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +0 -74
  448. package/template/apps/agent-server/src/southwind_agent_server/runtime_compatibility.py +0 -89
  449. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +0 -105
  450. package/template/apps/agent-server/src/southwind_agent_server/runtime_logging.py +0 -57
  451. package/template/apps/agent-server/src/southwind_agent_server/service.py +0 -325
  452. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +0 -64
  453. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +0 -4
  454. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +0 -34
  455. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +0 -34
  456. package/template/apps/agent-server/src/southwind_agent_server/signal_events.py +0 -53
  457. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +0 -118
  458. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +0 -2
  459. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +0 -73
  460. package/template/apps/agent-server/src/southwind_agent_server/sqlite_serialization.py +0 -16
  461. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +0 -350
  462. package/template/apps/agent-server/src/southwind_agent_server/sse.py +0 -41
  463. package/template/apps/agent-server/src/southwind_agent_server/store.py +0 -255
  464. package/template/apps/agent-server/src/southwind_agent_server/store_cipher.py +0 -40
  465. package/template/apps/agent-server/src/southwind_agent_server/structured_logging.py +0 -145
  466. package/template/apps/agent-server/src/southwind_agent_server/telemetry.py +0 -93
  467. package/template/apps/agent-server/src/southwind_agent_server/tool_host.py +0 -152
  468. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +0 -137
  469. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +0 -58
  470. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +0 -87
  471. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +0 -28
  472. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +0 -247
  473. package/template/apps/agent-server/tests/__init__.py +0 -1
  474. package/template/apps/agent-server/tests/openai_provider_test_support.py +0 -131
  475. package/template/apps/agent-server/tests/test_api.py +0 -305
  476. package/template/apps/agent-server/tests/test_artifact_input.py +0 -110
  477. package/template/apps/agent-server/tests/test_client_completion.py +0 -230
  478. package/template/apps/agent-server/tests/test_config.py +0 -106
  479. package/template/apps/agent-server/tests/test_fingerprint.py +0 -10
  480. package/template/apps/agent-server/tests/test_multimodal.py +0 -81
  481. package/template/apps/agent-server/tests/test_openai_provider.py +0 -320
  482. package/template/apps/agent-server/tests/test_postgres_report_status.py +0 -59
  483. package/template/apps/agent-server/tests/test_postgres_report_summary.py +0 -298
  484. package/template/apps/agent-server/tests/test_postgres_store.py +0 -135
  485. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +0 -140
  486. package/template/apps/agent-server/tests/test_provider_governance.py +0 -276
  487. package/template/apps/agent-server/tests/test_report_attempt_lifecycle.py +0 -126
  488. package/template/apps/agent-server/tests/test_report_resilience.py +0 -183
  489. package/template/apps/agent-server/tests/test_report_routes.py +0 -143
  490. package/template/apps/agent-server/tests/test_report_store.py +0 -347
  491. package/template/apps/agent-server/tests/test_report_summary_parity.py +0 -116
  492. package/template/apps/agent-server/tests/test_report_terminal_sync.py +0 -177
  493. package/template/apps/agent-server/tests/test_run_capacity.py +0 -112
  494. package/template/apps/agent-server/tests/test_run_operational_logging.py +0 -114
  495. package/template/apps/agent-server/tests/test_runtime_compatibility.py +0 -119
  496. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +0 -52
  497. package/template/apps/agent-server/tests/test_sqlite_store.py +0 -182
  498. package/template/apps/agent-server/tests/test_structured_logging.py +0 -142
  499. package/template/apps/agent-server/tests/test_telemetry.py +0 -25
  500. package/template/apps/agent-server/tests/test_tool_approval.py +0 -28
  501. package/template/apps/agent-server/tests/test_tool_structured_output.py +0 -347
  502. package/template/apps/agent-server/tests/test_trajectory.py +0 -91
  503. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +0 -72
  504. package/template/apps/agent-server/tests/test_vlm_readiness.py +0 -106
  505. 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)