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,34 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- from collections.abc import Awaitable, Callable
5
-
6
- from .run_capacity import RunCapacityReservation
7
- from .store import RunStore
8
-
9
-
10
- async def renew_lease(store: RunStore, run_id: str) -> None:
11
- while True:
12
- await asyncio.sleep(10)
13
- await store.renew_lease(run_id)
14
-
15
-
16
- def complete_task(
17
- tasks: set[asyncio.Task[None]],
18
- active_run_ids: set[str],
19
- run_id: str,
20
- task: asyncio.Task[None],
21
- ) -> None:
22
- tasks.discard(task)
23
- active_run_ids.discard(run_id)
24
-
25
-
26
- async def run_admitted(
27
- reservation: RunCapacityReservation,
28
- execute: Callable[[], Awaitable[None]],
29
- ) -> None:
30
- try:
31
- await reservation.enter()
32
- await execute()
33
- finally:
34
- await reservation.release()
@@ -1,53 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import uuid
4
-
5
- from .contracts import AgentError
6
- from .engine import (
7
- ApprovalRequired,
8
- ApprovalResolved,
9
- OutputDelta,
10
- SafeEngineError,
11
- ToolCompleted,
12
- ToolRequested,
13
- UsageReported,
14
- )
15
-
16
-
17
- def canonical_signal_event(signal: object) -> tuple[str, dict[str, object]]:
18
- if isinstance(signal, OutputDelta):
19
- return "output.delta", {"text": signal.text}
20
- if isinstance(signal, ToolRequested):
21
- return "tool.requested", {
22
- "toolCallId": signal.tool_call_id,
23
- "toolKey": signal.tool_key,
24
- }
25
- if isinstance(signal, ApprovalRequired):
26
- return "approval.required", {
27
- "workItemId": signal.work_item_id,
28
- "toolCallId": signal.tool_call_id,
29
- }
30
- if isinstance(signal, ApprovalResolved):
31
- return "approval.resolved", {
32
- "workItemId": signal.work_item_id,
33
- "toolCallId": signal.tool_call_id,
34
- "outcome": signal.outcome,
35
- }
36
- if isinstance(signal, ToolCompleted):
37
- return "tool.completed", {"toolCallId": signal.tool_call_id}
38
- if isinstance(signal, UsageReported):
39
- return "usage.reported", {
40
- "attemptSequence": signal.attempt_sequence,
41
- "usage": signal.usage.event_value(),
42
- }
43
- raise TypeError("unsupported engine signal")
44
-
45
-
46
- def canonical_failure_fields(failure: SafeEngineError) -> dict[str, object]:
47
- error = AgentError(
48
- code=failure.code,
49
- message=failure.safe_message,
50
- request_id=f"request_{uuid.uuid4().hex}",
51
- retryable=failure.retryable,
52
- )
53
- return {"error": error.model_dump(by_alias=True)}
@@ -1,118 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import sqlite3
5
- import time
6
- import uuid
7
-
8
- from .contracts import JsonValue
9
- from .sqlite_serialization import encode
10
- from .store import IdempotencyConflictError, ReleaseNotFoundError, RunRecord
11
- from .store_cipher import RunStoreCipher
12
-
13
-
14
- class SqliteCatalogMixin:
15
- _database: sqlite3.Connection
16
- _condition: asyncio.Condition
17
- _cipher: RunStoreCipher
18
-
19
- async def get_by_idempotency(self, idempotency_key: str) -> RunRecord | None:
20
- async with self._condition:
21
- row = self._database.execute(
22
- "select run_id from agent_runs where idempotency_key = ?",
23
- (idempotency_key,),
24
- ).fetchone()
25
- return self._read(str(row["run_id"])) if row else None
26
-
27
- async def save_invocation(self, run_id: str, value: JsonValue) -> None:
28
- async with self._condition:
29
- updated = self._database.execute(
30
- """
31
- update agent_runs set invocation_cipher = ?, updated_at = ?
32
- where run_id = ? and status not in ('completed', 'failed', 'cancelled')
33
- """,
34
- (self._cipher.seal(value), time.time(), run_id),
35
- )
36
- if updated.rowcount != 1:
37
- raise KeyError(run_id)
38
- self._database.commit()
39
-
40
- async def record_evaluation(
41
- self,
42
- release_id: str,
43
- evaluation_set_key: str,
44
- evaluation_set_version: str,
45
- metrics: dict[str, float],
46
- ) -> str:
47
- async with self._condition:
48
- release = self._database.execute(
49
- "select release_id from agent_releases where release_id = ?",
50
- (release_id,),
51
- ).fetchone()
52
- if not release:
53
- raise ReleaseNotFoundError
54
- existing = self._database.execute(
55
- """
56
- select evaluation_id, metrics_json
57
- from agent_evaluation_results
58
- where release_id = ? and evaluation_set_key = ?
59
- and evaluation_set_version = ?
60
- """,
61
- (release_id, evaluation_set_key, evaluation_set_version),
62
- ).fetchone()
63
- encoded = encode(metrics)
64
- if existing:
65
- if str(existing["metrics_json"]) != encoded:
66
- raise IdempotencyConflictError
67
- return str(existing["evaluation_id"])
68
- evaluation_id = f"eval_{uuid.uuid4().hex}"
69
- try:
70
- self._database.execute(
71
- """
72
- insert into agent_evaluation_results values (?, ?, ?, ?, ?, ?)
73
- """,
74
- (
75
- evaluation_id,
76
- release_id,
77
- evaluation_set_key,
78
- evaluation_set_version,
79
- encoded,
80
- time.time(),
81
- ),
82
- )
83
- self._database.commit()
84
- except sqlite3.IntegrityError:
85
- self._database.rollback()
86
- raise IdempotencyConflictError from None
87
- return evaluation_id
88
-
89
- def _ensure_release(self, record: RunRecord) -> None:
90
- if not isinstance(record.release, dict):
91
- raise IdempotencyConflictError
92
- release_id = record.release.get("releaseId")
93
- if not isinstance(release_id, str):
94
- raise IdempotencyConflictError
95
- encoded = encode(record.release)
96
- existing = self._database.execute(
97
- """
98
- select operation_key, snapshot_json from agent_releases
99
- where release_id = ?
100
- """,
101
- (release_id,),
102
- ).fetchone()
103
- if existing and (
104
- str(existing["operation_key"]) != record.operation_key
105
- or str(existing["snapshot_json"]) != encoded
106
- ):
107
- raise IdempotencyConflictError
108
- self._database.execute(
109
- """
110
- insert or ignore into agent_releases (
111
- release_id, operation_key, snapshot_json, created_at
112
- ) values (?, ?, ?, ?)
113
- """,
114
- (release_id, record.operation_key, encoded, time.time()),
115
- )
116
-
117
- def _read(self, run_id: str) -> RunRecord | None:
118
- raise NotImplementedError
@@ -1,2 +0,0 @@
1
- class RunStoreCapacityError(Exception):
2
- """Raised when the bounded local run store cannot accept more data."""
@@ -1,73 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import sqlite3
4
-
5
- from .engine_identity import DIRECT_ENGINE_ID, HISTORICAL_ADK_ENGINE_ID
6
-
7
-
8
- def initialize_database(database: sqlite3.Connection) -> None:
9
- database.execute("pragma foreign_keys = on")
10
- database.executescript(
11
- f"""
12
- create table if not exists agent_runs (
13
- run_id text primary key,
14
- engine_id text not null default '{DIRECT_ENGINE_ID}',
15
- operation_key text not null,
16
- input_json text not null,
17
- idempotency_key text not null unique,
18
- fingerprint text not null,
19
- status text not null,
20
- output_json text not null,
21
- created_at real not null,
22
- updated_at real not null,
23
- invocation_cipher text,
24
- release_json text not null default 'null',
25
- trace_id text not null default ''
26
- );
27
- create table if not exists agent_events (
28
- run_id text not null references agent_runs(run_id) on delete cascade,
29
- sequence integer not null,
30
- event_json text not null,
31
- primary key (run_id, sequence)
32
- );
33
- """
34
- )
35
- columns = {
36
- str(row["name"]) for row in database.execute("pragma table_info(agent_runs)")
37
- }
38
- if "invocation_cipher" not in columns:
39
- database.execute("alter table agent_runs add column invocation_cipher text")
40
- if "release_json" not in columns:
41
- database.execute(
42
- "alter table agent_runs add column release_json "
43
- "text not null default 'null'"
44
- )
45
- if "trace_id" not in columns:
46
- database.execute(
47
- "alter table agent_runs add column trace_id text not null default ''"
48
- )
49
- if "engine_id" not in columns:
50
- database.execute(
51
- "alter table agent_runs add column engine_id "
52
- f"text not null default '{HISTORICAL_ADK_ENGINE_ID}'"
53
- )
54
- database.executescript(
55
- """
56
- create table if not exists agent_releases (
57
- release_id text primary key,
58
- operation_key text not null,
59
- snapshot_json text not null,
60
- created_at real not null
61
- );
62
- create table if not exists agent_evaluation_results (
63
- evaluation_id text primary key,
64
- release_id text not null references agent_releases(release_id),
65
- evaluation_set_key text not null,
66
- evaluation_set_version text not null,
67
- metrics_json text not null,
68
- created_at real not null,
69
- unique(release_id, evaluation_set_key, evaluation_set_version)
70
- );
71
- """
72
- )
73
- database.commit()
@@ -1,16 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
-
5
- from .store import CanonicalEvent
6
-
7
-
8
- def encode(value: object) -> str:
9
- return json.dumps(value, ensure_ascii=False, separators=(",", ":"))
10
-
11
-
12
- def sequence_of(event: CanonicalEvent) -> int:
13
- value = event.get("sequence")
14
- if not isinstance(value, int):
15
- raise RuntimeError("Agent Event sequence 无效")
16
- return value
@@ -1,350 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import json
5
- import sqlite3
6
- import time
7
- from pathlib import Path
8
- from typing import cast
9
-
10
- from .contracts import AgentError, AgentErrorCode, JsonValue, RunStatus
11
- from .sqlite_catalog import SqliteCatalogMixin
12
- from .sqlite_errors import RunStoreCapacityError as RunStoreCapacityError
13
- from .sqlite_schema import initialize_database
14
- from .sqlite_serialization import encode, sequence_of
15
- from .store import (
16
- CanonicalEvent,
17
- IdempotencyConflictError,
18
- RunRecord,
19
- status_for,
20
- )
21
- from .store_cipher import RunStoreCipher
22
-
23
- __all__ = ["RunStoreCapacityError", "SqliteRunStore"]
24
-
25
-
26
- class SqliteRunStore(SqliteCatalogMixin):
27
- """Single-replica durable Run store with bounded rows, events and output."""
28
-
29
- def __init__(
30
- self,
31
- path: str,
32
- cipher: RunStoreCipher,
33
- *,
34
- max_runs: int = 10_000,
35
- max_events_per_run: int = 2_000,
36
- max_output_bytes: int = 16 * 1024 * 1024,
37
- terminal_ttl_seconds: int = 7 * 24 * 60 * 60,
38
- ) -> None:
39
- Path(path).parent.mkdir(parents=True, exist_ok=True)
40
- self._database = sqlite3.connect(path, check_same_thread=False)
41
- self._database.row_factory = sqlite3.Row
42
- self._max_runs = max_runs
43
- self._max_events = max_events_per_run
44
- self._max_output_bytes = max_output_bytes
45
- self._terminal_ttl = terminal_ttl_seconds
46
- self._condition = asyncio.Condition()
47
- self._cipher = cipher
48
- initialize_database(self._database)
49
- self._recover_incomplete()
50
-
51
- async def create_or_get(
52
- self,
53
- record: RunRecord,
54
- invocation: JsonValue = None,
55
- ) -> tuple[RunRecord, bool]:
56
- async with self._condition:
57
- existing = self._database.execute(
58
- "select run_id from agent_runs where idempotency_key = ?",
59
- (record.idempotency_key,),
60
- ).fetchone()
61
- if existing:
62
- current = self._read(str(existing["run_id"]))
63
- if current is None or current.fingerprint != record.fingerprint:
64
- raise IdempotencyConflictError
65
- return current, False
66
- self._prune()
67
- count = int(
68
- self._database.execute("select count(*) from agent_runs").fetchone()[0]
69
- )
70
- if count >= self._max_runs:
71
- raise RunStoreCapacityError("Agent Run Store 容量已满")
72
- now = time.time()
73
- try:
74
- self._database.execute(
75
- """
76
- insert into agent_runs (
77
- run_id, engine_id, operation_key, input_json, idempotency_key,
78
- fingerprint, status, output_json, created_at, updated_at,
79
- release_json, trace_id, invocation_cipher
80
- ) values (?, ?, ?, ?, ?, ?, 'accepted', 'null', ?, ?, ?, ?, ?)
81
- """,
82
- (
83
- record.run_id,
84
- record.engine_id,
85
- record.operation_key,
86
- "null",
87
- record.idempotency_key,
88
- record.fingerprint,
89
- now,
90
- now,
91
- encode(record.release),
92
- record.trace_id,
93
- self._cipher.seal(invocation)
94
- if invocation is not None
95
- else None,
96
- ),
97
- )
98
- self._ensure_release(record)
99
- self._database.commit()
100
- except Exception:
101
- self._database.rollback()
102
- raise
103
- self._condition.notify_all()
104
- return record, True
105
-
106
- async def get(self, run_id: str) -> RunRecord | None:
107
- async with self._condition:
108
- return self._read(run_id)
109
-
110
- async def append(
111
- self,
112
- run_id: str,
113
- event_type: str,
114
- fields: dict[str, object] | None = None,
115
- ) -> CanonicalEvent | None:
116
- async with self._condition:
117
- record = self._read(run_id)
118
- if record is None:
119
- raise KeyError(run_id)
120
- if record.terminal:
121
- return None
122
- sequence = len(record.events) + 1
123
- if sequence >= self._max_events and not event_type.startswith("run."):
124
- self._append_failure(run_id, sequence, "Agent 事件超过安全上限")
125
- self._condition.notify_all()
126
- raise RunStoreCapacityError("Agent 事件超过安全上限")
127
- event: CanonicalEvent = {
128
- "type": event_type,
129
- "runId": run_id,
130
- "sequence": sequence,
131
- **(fields or {}),
132
- }
133
- self._insert_event(run_id, event, status_for(event_type, record.status))
134
- self._condition.notify_all()
135
- return event
136
-
137
- async def complete(self, run_id: str, output: JsonValue) -> None:
138
- async with self._condition:
139
- record = self._read(run_id)
140
- if record is None:
141
- raise KeyError(run_id)
142
- if record.terminal:
143
- return
144
- encoded = encode(output)
145
- sequence = len(record.events) + 1
146
- if len(encoded.encode()) > self._max_output_bytes:
147
- self._append_failure(run_id, sequence, "Agent 输出超过安全上限")
148
- self._condition.notify_all()
149
- return
150
- event: CanonicalEvent = {
151
- "type": "run.completed",
152
- "runId": run_id,
153
- "sequence": sequence,
154
- }
155
- self._insert_event(run_id, event, "completed", encoded)
156
- self._condition.notify_all()
157
-
158
- async def events_after(
159
- self,
160
- run_id: str,
161
- after: int,
162
- wait_seconds: float,
163
- ) -> tuple[list[CanonicalEvent], bool]:
164
- async with self._condition:
165
-
166
- def ready() -> bool:
167
- record = self._read(run_id)
168
- return bool(
169
- record
170
- and (
171
- any(sequence_of(event) > after for event in record.events)
172
- or record.terminal
173
- )
174
- )
175
-
176
- if not ready():
177
- try:
178
- await asyncio.wait_for(
179
- self._condition.wait_for(ready),
180
- wait_seconds,
181
- )
182
- except TimeoutError:
183
- return [], False
184
- record = self._read(run_id)
185
- if record is None:
186
- raise KeyError(run_id)
187
- return (
188
- [event for event in record.events if sequence_of(event) > after],
189
- record.terminal,
190
- )
191
-
192
- async def recoverable(self) -> list[tuple[RunRecord, JsonValue]]:
193
- async with self._condition:
194
- rows = self._database.execute(
195
- """
196
- select run_id, invocation_cipher from agent_runs
197
- where status not in ('completed', 'failed', 'cancelled')
198
- and invocation_cipher is not null
199
- order by created_at
200
- """
201
- ).fetchall()
202
- result: list[tuple[RunRecord, JsonValue]] = []
203
- for row in rows:
204
- record = self._read(str(row["run_id"]))
205
- if record is not None:
206
- result.append(
207
- (
208
- record,
209
- self._cipher.open(str(row["invocation_cipher"])),
210
- )
211
- )
212
- return result
213
-
214
- async def clear_invocation(self, run_id: str) -> None:
215
- async with self._condition:
216
- self._database.execute(
217
- "update agent_runs set invocation_cipher = null where run_id = ?",
218
- (run_id,),
219
- )
220
- self._database.commit()
221
-
222
- async def renew_lease(self, run_id: str) -> None:
223
- record = await self.get(run_id)
224
- if record is None or record.terminal:
225
- raise KeyError(run_id)
226
-
227
- async def release_lease(self, run_id: str) -> None:
228
- if await self.get(run_id) is None:
229
- raise KeyError(run_id)
230
-
231
- async def probe(self) -> None:
232
- async with self._condition:
233
- self._database.execute("select 1").fetchone()
234
-
235
- async def close(self) -> None:
236
- self._database.close()
237
-
238
- def _recover_incomplete(self) -> None:
239
- rows = self._database.execute(
240
- """
241
- select run_id from agent_runs
242
- where status not in ('completed', 'failed', 'cancelled')
243
- and invocation_cipher is null
244
- """
245
- ).fetchall()
246
- for row in rows:
247
- run_id = str(row["run_id"])
248
- sequence = (
249
- int(
250
- self._database.execute(
251
- "select count(*) from agent_events where run_id = ?",
252
- (run_id,),
253
- ).fetchone()[0]
254
- )
255
- + 1
256
- )
257
- self._append_failure(
258
- run_id,
259
- sequence,
260
- "Agent Runtime 重启中断了 Run",
261
- code="RUNTIME_UNAVAILABLE",
262
- retryable=True,
263
- )
264
- self._database.commit()
265
-
266
- def _read(self, run_id: str) -> RunRecord | None:
267
- row = self._database.execute(
268
- "select * from agent_runs where run_id = ?",
269
- (run_id,),
270
- ).fetchone()
271
- if not row:
272
- return None
273
- events = [
274
- json.loads(str(event["event_json"]))
275
- for event in self._database.execute(
276
- """
277
- select event_json from agent_events
278
- where run_id = ? order by sequence
279
- """,
280
- (run_id,),
281
- )
282
- ]
283
- return RunRecord(
284
- run_id=str(row["run_id"]),
285
- engine_id=str(row["engine_id"]),
286
- operation_key=str(row["operation_key"]),
287
- input=json.loads(str(row["input_json"])),
288
- idempotency_key=str(row["idempotency_key"]),
289
- fingerprint=str(row["fingerprint"]),
290
- status=cast(RunStatus, str(row["status"])),
291
- events=events,
292
- output=json.loads(str(row["output_json"])),
293
- release=json.loads(str(row["release_json"])),
294
- trace_id=str(row["trace_id"]),
295
- )
296
-
297
- def _insert_event(
298
- self,
299
- run_id: str,
300
- event: CanonicalEvent,
301
- status: RunStatus,
302
- output_json: str | None = None,
303
- ) -> None:
304
- self._database.execute(
305
- "insert into agent_events values (?, ?, ?)",
306
- (run_id, event["sequence"], encode(event)),
307
- )
308
- self._database.execute(
309
- """
310
- update agent_runs
311
- set status = ?, output_json = coalesce(?, output_json), updated_at = ?
312
- where run_id = ?
313
- """,
314
- (status, output_json, time.time(), run_id),
315
- )
316
- self._database.commit()
317
-
318
- def _append_failure(
319
- self,
320
- run_id: str,
321
- sequence: int,
322
- message: str,
323
- *,
324
- code: AgentErrorCode = "BUDGET_EXCEEDED",
325
- retryable: bool = False,
326
- ) -> None:
327
- event: CanonicalEvent = {
328
- "type": "run.failed",
329
- "runId": run_id,
330
- "sequence": sequence,
331
- "error": AgentError(
332
- code=code,
333
- message=message,
334
- request_id=f"request_store_{sequence}",
335
- retryable=retryable,
336
- ).model_dump(by_alias=True),
337
- }
338
- self._insert_event(run_id, event, "failed")
339
-
340
- def _prune(self) -> None:
341
- cutoff = time.time() - self._terminal_ttl
342
- self._database.execute(
343
- """
344
- delete from agent_runs
345
- where status in ('completed', 'failed', 'cancelled')
346
- and updated_at < ?
347
- """,
348
- (cutoff,),
349
- )
350
- self._database.commit()
@@ -1,41 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- from collections.abc import AsyncIterator
5
-
6
- from .service import AgentRunService
7
-
8
-
9
- def encode_event(event: dict[str, object]) -> str:
10
- sequence = event["sequence"]
11
- event_type = event["type"]
12
- data = json.dumps(event, ensure_ascii=False, separators=(",", ":"))
13
- return f"id: {sequence}\nevent: {event_type}\ndata: {data}\n\n"
14
-
15
-
16
- async def event_stream(
17
- service: AgentRunService,
18
- run_id: str,
19
- after: int,
20
- heartbeat_seconds: float,
21
- ) -> AsyncIterator[str]:
22
- cursor = after
23
- while True:
24
- events, terminal = await service.store.events_after(
25
- run_id,
26
- cursor,
27
- heartbeat_seconds,
28
- )
29
- if not events:
30
- if terminal:
31
- return
32
- yield ": heartbeat\n\n"
33
- continue
34
- for event in events:
35
- sequence = event["sequence"]
36
- if not isinstance(sequence, int):
37
- raise RuntimeError("invalid stored sequence")
38
- cursor = sequence
39
- yield encode_event(event)
40
- if terminal:
41
- return