create-windy 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/dist/cli.js +855 -560
  2. package/package.json +1 -1
  3. package/template/.windy-template.json +2 -2
  4. package/template/apps/agent-server/Dockerfile +92 -22
  5. package/template/apps/agent-server/README.md +47 -85
  6. package/template/apps/agent-server/documents/office.py +216 -0
  7. package/template/apps/agent-server/documents/query_report.py +136 -0
  8. package/template/apps/agent-server/documents/smoke.py +177 -0
  9. package/template/apps/agent-server/documents/test_boundaries.py +185 -0
  10. package/template/apps/agent-server/host-contracts.ts +56 -0
  11. package/template/apps/agent-server/install-native.ts +167 -0
  12. package/template/apps/agent-server/main.ts +179 -0
  13. package/template/apps/agent-server/native/EXTENSIONS.md +46 -0
  14. package/template/apps/agent-server/native/admission.ts +73 -0
  15. package/template/apps/agent-server/native/authorization.test.ts +176 -0
  16. package/template/apps/agent-server/native/authorization.ts +118 -0
  17. package/template/apps/agent-server/native/boundary-io.ts +93 -0
  18. package/template/apps/agent-server/native/boundary-product.ts +107 -0
  19. package/template/apps/agent-server/native/boundary-project.test.ts +247 -0
  20. package/template/apps/agent-server/native/boundary-project.ts +188 -0
  21. package/template/apps/agent-server/native/boundary.ts +188 -0
  22. package/template/apps/agent-server/native/compaction-policy.test.ts +175 -0
  23. package/template/apps/agent-server/native/config.ts +95 -0
  24. package/template/apps/agent-server/native/conversation-instructions.ts +9 -0
  25. package/template/apps/agent-server/native/extensions.test.ts +190 -0
  26. package/template/apps/agent-server/native/extensions.ts +31 -0
  27. package/template/apps/agent-server/native/host-profile.test.ts +91 -0
  28. package/template/apps/agent-server/native/host-profile.ts +33 -0
  29. package/template/apps/agent-server/native/host-test-fixture.ts +13 -0
  30. package/template/apps/agent-server/native/http.ts +129 -0
  31. package/template/apps/agent-server/native/lifecycle.test.ts +285 -0
  32. package/template/apps/agent-server/native/lifecycle.ts +136 -0
  33. package/template/apps/agent-server/native/manager.ts +292 -0
  34. package/template/apps/agent-server/native/native.test.ts +207 -0
  35. package/template/apps/agent-server/native/office-preview.test.ts +50 -0
  36. package/template/apps/agent-server/native/office-preview.ts +25 -0
  37. package/template/apps/agent-server/native/parallel-harness.ts +242 -0
  38. package/template/apps/agent-server/native/parallel-mcp-fixture.ts +97 -0
  39. package/template/apps/agent-server/native/parallel.test.ts +256 -0
  40. package/template/apps/agent-server/native/profile-composition.test.ts +147 -0
  41. package/template/apps/agent-server/native/profile.ts +307 -0
  42. package/template/apps/agent-server/native/request.ts +61 -0
  43. package/template/apps/agent-server/native/session-conflict.test.ts +235 -0
  44. package/template/apps/agent-server/native/session-conflict.ts +21 -0
  45. package/template/apps/agent-server/native/shared-skills.test.ts +128 -0
  46. package/template/apps/agent-server/native/shared-skills.ts +240 -0
  47. package/template/apps/agent-server/native/socket-lifecycle.test.ts +48 -0
  48. package/template/apps/agent-server/native/socket.ts +130 -0
  49. package/template/apps/agent-server/native/storage-lifecycle.test.ts +217 -0
  50. package/template/apps/agent-server/native/storage.ts +188 -0
  51. package/template/apps/agent-server/native/stream-authorization.test.ts +89 -0
  52. package/template/apps/agent-server/native/worker.ts +77 -0
  53. package/template/apps/agent-server/native-download.test.ts +119 -0
  54. package/template/apps/agent-server/native-download.ts +145 -0
  55. package/template/apps/agent-server/package.json +63 -0
  56. package/template/apps/agent-server/plugins/access.mjs +126 -0
  57. package/template/apps/agent-server/plugins/branding/README.md +9 -0
  58. package/template/apps/agent-server/plugins/branding/brand.css +85 -0
  59. package/template/apps/agent-server/plugins/branding/client.js +338 -0
  60. package/template/apps/agent-server/plugins/branding/index.mjs +35 -0
  61. package/template/apps/agent-server/plugins/branding/loading.d.mts +2 -0
  62. package/template/apps/agent-server/plugins/branding/loading.mjs +66 -0
  63. package/template/apps/agent-server/plugins/branding/loading.test.ts +89 -0
  64. package/template/apps/agent-server/plugins/branding/package.json +21 -0
  65. package/template/apps/agent-server/plugins/branding.test.ts +294 -0
  66. package/template/apps/agent-server/plugins/compaction.mjs +83 -0
  67. package/template/apps/agent-server/plugins/compaction.test.ts +91 -0
  68. package/template/apps/agent-server/plugins/confine-network.py +57 -0
  69. package/template/apps/agent-server/plugins/default-skills.test.ts +62 -0
  70. package/template/apps/agent-server/plugins/downloads/README.md +28 -0
  71. package/template/apps/agent-server/plugins/downloads/client.js +126 -0
  72. package/template/apps/agent-server/plugins/downloads/downloads.test.ts +222 -0
  73. package/template/apps/agent-server/plugins/downloads/index.d.mts +19 -0
  74. package/template/apps/agent-server/plugins/downloads/index.mjs +180 -0
  75. package/template/apps/agent-server/plugins/downloads/package.json +20 -0
  76. package/template/apps/agent-server/plugins/drop-overlay/README.md +24 -0
  77. package/template/apps/agent-server/plugins/drop-overlay/drop-overlay.test.ts +199 -0
  78. package/template/apps/agent-server/plugins/drop-overlay/index.d.mts +8 -0
  79. package/template/apps/agent-server/plugins/drop-overlay/index.mjs +12 -0
  80. package/template/apps/agent-server/plugins/drop-overlay/style.css +102 -0
  81. package/template/apps/agent-server/plugins/locale/client.js +61 -0
  82. package/template/apps/agent-server/plugins/locale/index.d.mts +9 -0
  83. package/template/apps/agent-server/plugins/locale/index.mjs +16 -0
  84. package/template/apps/agent-server/plugins/locale/locale.test.ts +217 -0
  85. package/template/apps/agent-server/plugins/locale/package.json +19 -0
  86. package/template/apps/agent-server/plugins/parallel.mjs +146 -0
  87. package/template/apps/agent-server/plugins/preset-registry.d.mts +2 -0
  88. package/template/apps/agent-server/plugins/preset-registry.mjs +41 -0
  89. package/template/apps/agent-server/plugins/preset-registry.test.ts +46 -0
  90. package/template/apps/agent-server/plugins/questions.d.mts +25 -0
  91. package/template/apps/agent-server/plugins/questions.mjs +142 -0
  92. package/template/apps/agent-server/plugins/questions.test.ts +105 -0
  93. package/template/apps/agent-server/plugins/settings/README.md +17 -0
  94. package/template/apps/agent-server/plugins/settings/client.js +102 -0
  95. package/template/apps/agent-server/plugins/settings/index.mjs +17 -0
  96. package/template/apps/agent-server/plugins/settings/package.json +19 -0
  97. package/template/apps/agent-server/plugins/settings/settings.test.ts +129 -0
  98. package/template/apps/agent-server/plugins/settings-controller.d.mts +4 -0
  99. package/template/apps/agent-server/plugins/settings-controller.mjs +31 -0
  100. package/template/apps/agent-server/plugins/settings-controller.test.ts +17 -0
  101. package/template/apps/agent-server/plugins/settings-dispatch.test.ts +34 -0
  102. package/template/apps/agent-server/plugins/shared-skills.d.mts +15 -0
  103. package/template/apps/agent-server/plugins/shared-skills.mjs +82 -0
  104. package/template/apps/agent-server/plugins/shared-skills.test.ts +51 -0
  105. package/template/apps/agent-server/plugins/skill-library/README.md +11 -0
  106. package/template/apps/agent-server/plugins/skill-library/archive.test.ts +43 -0
  107. package/template/apps/agent-server/plugins/skill-library/bundle.mjs +234 -0
  108. package/template/apps/agent-server/plugins/skill-library/client-chunks.test.ts +107 -0
  109. package/template/apps/agent-server/plugins/skill-library/client-form-mount.test.ts +139 -0
  110. package/template/apps/agent-server/plugins/skill-library/client-form.test.ts +261 -0
  111. package/template/apps/agent-server/plugins/skill-library/client-ui.test.ts +268 -0
  112. package/template/apps/agent-server/plugins/skill-library/client-use.test.ts +158 -0
  113. package/template/apps/agent-server/plugins/skill-library/client.editor.js +93 -0
  114. package/template/apps/agent-server/plugins/skill-library/client.form.js +316 -0
  115. package/template/apps/agent-server/plugins/skill-library/client.js +348 -0
  116. package/template/apps/agent-server/plugins/skill-library/client.request.js +52 -0
  117. package/template/apps/agent-server/plugins/skill-library/client.transfer.js +48 -0
  118. package/template/apps/agent-server/plugins/skill-library/client.use.js +46 -0
  119. package/template/apps/agent-server/plugins/skill-library/default-roots.test.ts +84 -0
  120. package/template/apps/agent-server/plugins/skill-library/draft.d.mts +17 -0
  121. package/template/apps/agent-server/plugins/skill-library/draft.mjs +152 -0
  122. package/template/apps/agent-server/plugins/skill-library/draft.test.ts +287 -0
  123. package/template/apps/agent-server/plugins/skill-library/index.d.mts +49 -0
  124. package/template/apps/agent-server/plugins/skill-library/index.mjs +226 -0
  125. package/template/apps/agent-server/plugins/skill-library/package.json +24 -0
  126. package/template/apps/agent-server/plugins/skill-library/presentation/README.md +27 -0
  127. package/template/apps/agent-server/plugins/skill-library/presentation/UPSTREAM.md +54 -0
  128. package/template/apps/agent-server/plugins/skill-library/presentation/boot.test.ts +150 -0
  129. package/template/apps/agent-server/plugins/skill-library/presentation/client.js +146 -0
  130. package/template/apps/agent-server/plugins/skill-library/presentation/client.test.ts +195 -0
  131. package/template/apps/agent-server/plugins/skill-library/presentation/index.d.mts +9 -0
  132. package/template/apps/agent-server/plugins/skill-library/presentation/index.mjs +30 -0
  133. package/template/apps/agent-server/plugins/skill-library/presentation/metadata.test.ts +82 -0
  134. package/template/apps/agent-server/plugins/skill-library/presentation/package.json +21 -0
  135. package/template/apps/agent-server/plugins/skill-library/presentation/react-boot.test.ts +162 -0
  136. package/template/apps/agent-server/plugins/skill-library/skills.test.ts +342 -0
  137. package/template/apps/agent-server/plugins/skill-library/storage.mjs +293 -0
  138. package/template/apps/agent-server/plugins/skill-library/style.css +229 -0
  139. package/template/apps/agent-server/plugins/skill-library/test-fixture.ts +77 -0
  140. package/template/apps/agent-server/plugins/skill-library/workflow.d.mts +18 -0
  141. package/template/apps/agent-server/plugins/skill-library/workflow.mjs +189 -0
  142. package/template/apps/agent-server/plugins/skill-library/workflow.test.ts +164 -0
  143. package/template/apps/agent-server/plugins/skills/README.md +5 -0
  144. package/template/apps/agent-server/plugins/skills/windy-data-summary/SKILL.md +14 -0
  145. package/template/apps/agent-server/plugins/skills/windy-extension-guide/SKILL.md +14 -0
  146. package/template/apps/agent-server/plugins/skills/windy-office/SKILL.md +14 -0
  147. package/template/apps/agent-server/plugins/skills/windy-skill-capture/SKILL.md +14 -0
  148. package/template/apps/agent-server/plugins/skills/windy-source-compare/SKILL.md +14 -0
  149. package/template/apps/agent-server/plugins/subprocess.mjs +40 -0
  150. package/template/apps/agent-server/plugins/theme/README.md +18 -0
  151. package/template/apps/agent-server/plugins/theme/client.js +18 -0
  152. package/template/apps/agent-server/plugins/theme/index.d.mts +9 -0
  153. package/template/apps/agent-server/plugins/theme/index.mjs +18 -0
  154. package/template/apps/agent-server/plugins/theme/package.json +19 -0
  155. package/template/apps/agent-server/plugins/theme/source-tokens.ts +82 -0
  156. package/template/apps/agent-server/plugins/theme/sync-tokens.ts +12 -0
  157. package/template/apps/agent-server/plugins/theme/theme.test.ts +193 -0
  158. package/template/apps/agent-server/plugins/theme/tokens.json +166 -0
  159. package/template/apps/agent-server/plugins/tool-catalog/README.md +79 -0
  160. package/template/apps/agent-server/plugins/tool-catalog/categories.mjs +111 -0
  161. package/template/apps/agent-server/plugins/tool-catalog/categories.test.ts +118 -0
  162. package/template/apps/agent-server/plugins/tool-catalog/client-cache.test.ts +264 -0
  163. package/template/apps/agent-server/plugins/tool-catalog/client.js +333 -0
  164. package/template/apps/agent-server/plugins/tool-catalog/client.test.ts +136 -0
  165. package/template/apps/agent-server/plugins/tool-catalog/discovery.d.mts +42 -0
  166. package/template/apps/agent-server/plugins/tool-catalog/discovery.mjs +242 -0
  167. package/template/apps/agent-server/plugins/tool-catalog/discovery.test.ts +229 -0
  168. package/template/apps/agent-server/plugins/tool-catalog/index.d.mts +5 -0
  169. package/template/apps/agent-server/plugins/tool-catalog/index.mjs +91 -0
  170. package/template/apps/agent-server/plugins/tool-catalog/package.json +23 -0
  171. package/template/apps/agent-server/plugins/tool-catalog/presentation.d.mts +21 -0
  172. package/template/apps/agent-server/plugins/tool-catalog/presentation.mjs +153 -0
  173. package/template/apps/agent-server/plugins/tool-catalog/presentation.test.ts +166 -0
  174. package/template/apps/agent-server/plugins/tool-catalog/routes.test.ts +209 -0
  175. package/template/apps/agent-server/plugins/tool-catalog/style.css +155 -0
  176. package/template/apps/agent-server/plugins/tool-catalog/use-tool.test.ts +160 -0
  177. package/template/apps/agent-server/plugins/tool-presentation/README.md +7 -0
  178. package/template/apps/agent-server/plugins/tool-presentation/build-client.ts +29 -0
  179. package/template/apps/agent-server/plugins/tool-presentation/client.js +312 -0
  180. package/template/apps/agent-server/plugins/tool-presentation/client.results.js +9 -0
  181. package/template/apps/agent-server/plugins/tool-presentation/client.test.ts +178 -0
  182. package/template/apps/agent-server/plugins/tool-presentation/index.mjs +10 -0
  183. package/template/apps/agent-server/plugins/tool-presentation/package.json +24 -0
  184. package/template/apps/agent-server/plugins/tool-presentation/result-discovery.mjs +43 -0
  185. package/template/apps/agent-server/plugins/tool-presentation/result-model.d.mts +51 -0
  186. package/template/apps/agent-server/plugins/tool-presentation/result-model.mjs +96 -0
  187. package/template/apps/agent-server/plugins/workspace/README.md +5 -0
  188. package/template/apps/agent-server/plugins/workspace/index.mjs +8 -0
  189. package/template/apps/agent-server/plugins/workspace/package.json +10 -0
  190. package/template/apps/agent-server/plugins/workspace/style.css +124 -0
  191. package/template/apps/agent-server/project/host.ts +13 -0
  192. package/template/apps/agent-server/runtime/artifacts.ts +115 -0
  193. package/template/apps/agent-server/runtime/audit.nodecheck.ts +60 -0
  194. package/template/apps/agent-server/runtime/capacity.ts +61 -0
  195. package/template/apps/agent-server/runtime/client-completion-budget.nodecheck.ts +92 -0
  196. package/template/apps/agent-server/runtime/compatibility.ts +33 -0
  197. package/template/apps/agent-server/runtime/completions.ts +320 -0
  198. package/template/apps/agent-server/runtime/config.ts +246 -0
  199. package/template/apps/agent-server/runtime/context-budget.ts +70 -0
  200. package/template/apps/agent-server/runtime/context-plugin.ts +306 -0
  201. package/template/apps/agent-server/runtime/context.nodecheck.ts +241 -0
  202. package/template/apps/agent-server/runtime/contracts.ts +201 -0
  203. package/template/apps/agent-server/runtime/dsh-engine.ts +196 -0
  204. package/template/apps/agent-server/runtime/evaluation-plugin.ts +115 -0
  205. package/template/apps/agent-server/runtime/evaluation.nodecheck.ts +194 -0
  206. package/template/apps/agent-server/runtime/events.ts +71 -0
  207. package/template/apps/agent-server/runtime/governance.ts +194 -0
  208. package/template/apps/agent-server/runtime/index.ts +339 -0
  209. package/template/apps/agent-server/runtime/internal-output.ts +37 -0
  210. package/template/apps/agent-server/runtime/isolation.nodecheck.ts +287 -0
  211. package/template/apps/agent-server/runtime/model-payload.ts +97 -0
  212. package/template/apps/agent-server/runtime/model-plugin.ts +308 -0
  213. package/template/apps/agent-server/runtime/model-route.ts +34 -0
  214. package/template/apps/agent-server/runtime/model-usage.ts +51 -0
  215. package/template/apps/agent-server/runtime/model-wire.ts +45 -0
  216. package/template/apps/agent-server/runtime/native-authorization.nodecheck.ts +126 -0
  217. package/template/apps/agent-server/runtime/native-completion.nodecheck.ts +81 -0
  218. package/template/apps/agent-server/runtime/output-validation.ts +66 -0
  219. package/template/apps/agent-server/runtime/production-capacity.nodecheck.ts +121 -0
  220. package/template/apps/agent-server/runtime/questions-workflow.nodecheck.ts +249 -0
  221. package/template/apps/agent-server/runtime/report-breakdown.ts +79 -0
  222. package/template/apps/agent-server/runtime/reporting.ts +219 -0
  223. package/template/apps/agent-server/runtime/run-completion.ts +39 -0
  224. package/template/apps/agent-server/runtime/run-request-digest.ts +18 -0
  225. package/template/apps/agent-server/runtime/runtime-test-fixtures.ts +264 -0
  226. package/template/apps/agent-server/runtime/runtime.nodecheck.ts +150 -0
  227. package/template/apps/agent-server/runtime/store-idempotency.nodecheck.ts +74 -0
  228. package/template/apps/agent-server/runtime/store.ts +324 -0
  229. package/template/apps/agent-server/runtime/structured-output-mode.nodecheck.ts +51 -0
  230. package/template/apps/agent-server/runtime/tool-name.ts +6 -0
  231. package/template/apps/agent-server/runtime/tool-plugin.ts +201 -0
  232. package/template/apps/agent-server/runtime/vision-readiness.ts +200 -0
  233. package/template/apps/agent-server/scripts/confinement-check.mjs +103 -0
  234. package/template/apps/agent-server/scripts/coordinator-check.mjs +344 -0
  235. package/template/apps/agent-server/scripts/documents-delivery-check.mjs +309 -0
  236. package/template/apps/agent-server/scripts/office-preview-check.mjs +92 -0
  237. package/template/apps/agent-server/scripts/test-confinement.ts +58 -0
  238. package/template/apps/agent-server/scripts/test-coordinator.ts +36 -0
  239. package/template/apps/agent-server/scripts/test-runtime.ts +46 -0
  240. package/template/apps/agent-server/tsconfig.json +21 -0
  241. package/template/apps/server/Dockerfile +3 -0
  242. package/template/apps/server/package.json +5 -1
  243. package/template/apps/server/scripts/check-dsh-platform-example.ts +251 -0
  244. package/template/apps/server/src/agent/admin-catalog-bootstrap.ts +25 -0
  245. package/template/apps/server/src/agent/agent-session-bootstrap.ts +7 -8
  246. package/template/apps/server/src/agent/agent-session-facade.ts +12 -0
  247. package/template/apps/server/src/agent/agent-session-validation.ts +43 -0
  248. package/template/apps/server/src/agent/dsh-runtime-wire.test.ts +33 -0
  249. package/template/apps/server/src/agent/governance-runtime.ts +41 -0
  250. package/template/apps/server/src/agent/operation-catalog.test.ts +202 -0
  251. package/template/apps/server/src/agent/operation-catalog.ts +135 -0
  252. package/template/apps/server/src/agent/remote-runtime-response.ts +1 -1
  253. package/template/apps/server/src/agent/run-browser-visibility.test.ts +59 -0
  254. package/template/apps/server/src/agent/run-browser-visibility.ts +11 -0
  255. package/template/apps/server/src/agent/run-contracts.ts +1 -0
  256. package/template/apps/server/src/agent/run-definition-support.ts +9 -0
  257. package/template/apps/server/src/agent/run-operation-policy.ts +1 -0
  258. package/template/apps/server/src/agent/run-route-response.ts +35 -0
  259. package/template/apps/server/src/agent/run-routes.ts +46 -43
  260. package/template/apps/server/src/agent/runtime-bootstrap.ts +21 -20
  261. package/template/apps/server/src/agent/runtime-disabled-composition.ts +28 -0
  262. package/template/apps/server/src/agent/runtime-tool-composition.ts +2 -0
  263. package/template/apps/server/src/agent/session-projection-facade.ts +8 -9
  264. package/template/apps/server/src/agent/session-projection-governance.ts +10 -0
  265. package/template/apps/server/src/agent/session-projection-view.ts +19 -16
  266. package/template/apps/server/src/agent/session-recording-reader.contract.test.ts +131 -0
  267. package/template/apps/server/src/agent/session-recording-reader.ts +62 -0
  268. package/template/apps/server/src/agent/tool-catalog-audit.ts +22 -0
  269. package/template/apps/server/src/agent/tool-catalog-availability.ts +21 -0
  270. package/template/apps/server/src/agent/tool-catalog-routes.test.ts +103 -0
  271. package/template/apps/server/src/agent/tool-catalog-routes.ts +62 -0
  272. package/template/apps/server/src/agent/tool-catalog.test.ts +122 -0
  273. package/template/apps/server/src/agent/tool-catalog.ts +44 -0
  274. package/template/apps/server/src/agent/tool-registry.ts +45 -14
  275. package/template/apps/server/src/agent/workbench-bootstrap.ts +39 -0
  276. package/template/apps/server/src/agent/workbench-event-projection.ts +115 -0
  277. package/template/apps/server/src/agent/workbench-facade.contract.test.ts +189 -0
  278. package/template/apps/server/src/agent/workbench-facade.ts +339 -0
  279. package/template/apps/server/src/agent/workbench-recording.contract.test.ts +328 -0
  280. package/template/apps/server/src/agent/workbench-routes.ts +97 -0
  281. package/template/apps/server/src/agent/workbench-run-integration.test.ts +231 -0
  282. package/template/apps/server/src/agent/workbench-run-reader.ts +187 -0
  283. package/template/apps/server/src/agent/workbench-safe-result.ts +61 -0
  284. package/template/apps/server/src/agent/workbench-sse.ts +50 -0
  285. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +9 -0
  286. package/template/apps/server/src/agent-skills/access.ts +88 -0
  287. package/template/apps/server/src/agent-skills/bootstrap.ts +49 -0
  288. package/template/apps/server/src/agent-skills/builtin-registration.ts +83 -0
  289. package/template/apps/server/src/agent-skills/builtins.ts +19 -0
  290. package/template/apps/server/src/agent-skills/bundle-zip.ts +163 -0
  291. package/template/apps/server/src/agent-skills/bundle.test.ts +79 -0
  292. package/template/apps/server/src/agent-skills/bundle.ts +133 -0
  293. package/template/apps/server/src/agent-skills/contracts.ts +46 -0
  294. package/template/apps/server/src/agent-skills/drizzle-repository.ts +125 -0
  295. package/template/apps/server/src/agent-skills/input.ts +29 -0
  296. package/template/apps/server/src/agent-skills/postgres.integration.test.ts +348 -0
  297. package/template/apps/server/src/agent-skills/read-routes.test.ts +116 -0
  298. package/template/apps/server/src/agent-skills/reader.ts +108 -0
  299. package/template/apps/server/src/agent-skills/repository.ts +105 -0
  300. package/template/apps/server/src/agent-skills/routes.ts +176 -0
  301. package/template/apps/server/src/agent-skills/service.test.ts +295 -0
  302. package/template/apps/server/src/agent-skills/service.ts +301 -0
  303. package/template/apps/server/src/agent-workflow/preset-registry.test.ts +137 -0
  304. package/template/apps/server/src/agent-workflow/preset-registry.ts +191 -0
  305. package/template/apps/server/src/agent-workflow/preset-routes.test.ts +94 -0
  306. package/template/apps/server/src/agent-workflow/preset-routes.ts +45 -0
  307. package/template/apps/server/src/agent-workflow/query-service.ts +36 -0
  308. package/template/apps/server/src/agent-workflow/recording-projection.contract.test.ts +196 -0
  309. package/template/apps/server/src/agent-workflow/recording-projection.ts +86 -0
  310. package/template/apps/server/src/ai-runtime-report/service.test.ts +10 -7
  311. package/template/apps/server/src/ai-runtime-report/service.ts +1 -1
  312. package/template/apps/server/src/app/agent-workflow-presets.ts +4 -0
  313. package/template/apps/server/src/app/dsh-skill-draft-audit.test.ts +195 -0
  314. package/template/apps/server/src/app/dsh-skill-draft-audit.ts +115 -0
  315. package/template/apps/server/src/app/dsh-workbench-audit.test.ts +71 -0
  316. package/template/apps/server/src/app/dsh-workbench-audit.ts +34 -0
  317. package/template/apps/server/src/app/dsh-workbench-handshake.test.ts +63 -0
  318. package/template/apps/server/src/app/dsh-workbench-handshake.ts +48 -0
  319. package/template/apps/server/src/app/dsh-workbench-http.test.ts +96 -0
  320. package/template/apps/server/src/app/dsh-workbench-lan-origin.test.ts +114 -0
  321. package/template/apps/server/src/app/dsh-workbench-launch.test.ts +70 -0
  322. package/template/apps/server/src/app/dsh-workbench-origin.test.ts +54 -0
  323. package/template/apps/server/src/app/dsh-workbench-proxy.ts +205 -0
  324. package/template/apps/server/src/app/dsh-workbench-session-conflict.test.ts +61 -0
  325. package/template/apps/server/src/app/dsh-workbench-session.ts +59 -0
  326. package/template/apps/server/src/app/dsh-workbench-socket-audit.test.ts +115 -0
  327. package/template/apps/server/src/app/dsh-workbench-socket.test.ts +246 -0
  328. package/template/apps/server/src/app/dsh-workbench-socket.ts +272 -0
  329. package/template/apps/server/src/app/dsh-workbench-test-support.ts +158 -0
  330. package/template/apps/server/src/app/dsh-workbench.test.ts +213 -0
  331. package/template/apps/server/src/app/dsh-workbench.ts +279 -0
  332. package/template/apps/server/src/app/workbench-public-origin.ts +16 -0
  333. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +3 -0
  334. package/template/apps/server/src/http-app.ts +31 -0
  335. package/template/apps/server/src/mcp/adapter.ts +1 -0
  336. package/template/apps/server/src/module-composition.test.ts +23 -0
  337. package/template/apps/server/src/module-composition.ts +9 -2
  338. package/template/apps/server/src/observability/bootstrap.ts +12 -0
  339. package/template/apps/server/src/observability/diagnostic-failure-recorder.ts +94 -0
  340. package/template/apps/server/src/observability/diagnostic-http-contract.test.ts +42 -0
  341. package/template/apps/server/src/observability/diagnostic-index.test.ts +89 -0
  342. package/template/apps/server/src/observability/diagnostic-index.ts +88 -0
  343. package/template/apps/server/src/observability/diagnostic-repository.ts +67 -0
  344. package/template/apps/server/src/platform-app-bootstrap.ts +42 -0
  345. package/template/apps/server/src/platform-http-runtime.ts +6 -0
  346. package/template/apps/server/src/runtime-development.test.ts +25 -0
  347. package/template/apps/server/src/runtime-development.ts +6 -44
  348. package/template/apps/server/src/system/diagnostic-routes.test.ts +78 -0
  349. package/template/apps/server/src/system/diagnostic-routes.ts +66 -0
  350. package/template/apps/web/Dockerfile +9 -1
  351. package/template/apps/web/dev/start.ts +21 -10
  352. package/template/apps/web/dsh-workbench-location.ts +21 -0
  353. package/template/apps/web/dsh-workbench-proxy.test.ts +121 -0
  354. package/template/apps/web/dsh-workbench-proxy.ts +194 -0
  355. package/template/apps/web/package.json +3 -1
  356. package/template/apps/web/server.ts +27 -6
  357. package/template/apps/web/src/composables/useLoginFlow.ts +13 -1
  358. package/template/apps/web/src/pages/errors/PlatformErrorPage.vue +6 -0
  359. package/template/apps/web/src/pages/errors/PlatformErrorPage.webtest.ts +14 -1
  360. package/template/apps/web/src/pages/errors/error-page-extension.ts +1 -0
  361. package/template/apps/web/src/pages/system/AgentDebugPage.vue +14 -0
  362. package/template/apps/web/src/pages/system/AgentNativePage.vue +44 -0
  363. package/template/apps/web/src/pages/system/AgentSessionPage.vue +29 -8
  364. package/template/apps/web/src/pages/system/AgentToolsPage.vue +76 -0
  365. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +20 -7
  366. package/template/apps/web/src/pages/system/DiagnosticLookupPage.vue +56 -0
  367. package/template/apps/web/src/pages/system/DiagnosticLookupPage.webtest.ts +99 -0
  368. package/template/apps/web/src/pages/system/SystemAgentSkillsPage.vue +88 -0
  369. package/template/apps/web/src/pages/system/components/DiagnosticRecordDetails.vue +52 -0
  370. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillDetailDialog.vue +166 -0
  371. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillGovernanceActionDialog.vue +51 -0
  372. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.vue +320 -0
  373. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.webtest.ts +96 -0
  374. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillsTable.vue +69 -0
  375. package/template/apps/web/src/pages/system/components/agent-workbench/AgentWorkbench.vue +236 -0
  376. package/template/apps/web/src/pages/system/components/agent-workbench/DraftLeaveDialog.vue +34 -0
  377. package/template/apps/web/src/pages/system/components/agent-workbench/ReplayEventDetail.vue +175 -0
  378. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.vue +142 -0
  379. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.webtest.ts +242 -0
  380. package/template/apps/web/src/pages/system/components/agent-workbench/TestRunComposer.vue +97 -0
  381. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.vue +100 -0
  382. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.webtest.ts +55 -0
  383. package/template/apps/web/src/pages/system/components/agent-workbench/ToolRuleDetail.vue +81 -0
  384. package/template/apps/web/src/pages/system/components/agent-workbench/WorkbenchSessionList.vue +57 -0
  385. package/template/apps/web/src/pages/system/components/agent-workbench/catalog-presenter.ts +20 -0
  386. package/template/apps/web/src/pages/system/components/agent-workbench/replay-presenter.ts +94 -0
  387. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.vue +82 -0
  388. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.webtest.ts +57 -0
  389. package/template/apps/web/src/pages/system/composables/useAgentSkillsGovernance.ts +105 -0
  390. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.ts +298 -0
  391. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.webtest.ts +164 -0
  392. package/template/apps/web/src/pages/system/composables/useAgentWorkflowPresets.ts +44 -0
  393. package/template/apps/web/src/pages/system/composables/useDiagnosticLookup.ts +64 -0
  394. package/template/apps/web/src/pages/system/composables/useSessionReplay.ts +48 -0
  395. package/template/apps/web/src/router/error-navigation.ts +3 -1
  396. package/template/apps/web/src/router/error-navigation.webtest.ts +14 -2
  397. package/template/apps/web/src/router/index.ts +8 -45
  398. package/template/apps/web/src/router/platform-admin-pages.ts +79 -0
  399. package/template/apps/web/src/router/platform-admin-route-bindings.ts +12 -0
  400. package/template/apps/web/src/services/agent-admin-api.ts +155 -0
  401. package/template/apps/web/src/services/agent-admin-api.webtest.ts +120 -0
  402. package/template/apps/web/src/services/agent-skills-api.ts +55 -0
  403. package/template/apps/web/src/services/agent-workbench-event.ts +60 -0
  404. package/template/apps/web/src/services/agent-workflow-api.ts +12 -0
  405. package/template/apps/web/src/services/diagnostics-api.ts +12 -0
  406. package/template/apps/web/src/services/http.ts +18 -0
  407. package/template/apps/web/src/services/http.webtest.ts +51 -0
  408. package/template/apps/web/vite.config.ts +39 -0
  409. package/template/deploy/dsh/README.md +5 -0
  410. package/template/deploy/dsh/documents/README.md +9 -0
  411. package/template/deploy/dsh/documents/requirements.in +6 -0
  412. package/template/deploy/dsh/documents/requirements.lock +72 -0
  413. package/template/docker-compose.yml +24 -10
  414. package/template/docs/adr/0004-embedded-dsh-runtime.md +9 -0
  415. package/template/docs/architecture/agent-admin-workbench-implementation.md +73 -0
  416. package/template/docs/architecture/agent-admin-workbench-plan.md +41 -0
  417. package/template/docs/architecture/agent-harness.md +6 -0
  418. package/template/docs/architecture/agent-runtime-compatibility.md +2 -0
  419. package/template/docs/architecture/embedded-dsh-integration.md +44 -0
  420. package/template/docs/development/dsh-plugins.md +55 -0
  421. package/template/docs/operations/dsh-agent-migration.md +98 -0
  422. package/template/docs/platform/agent-production-store.md +5 -78
  423. package/template/docs/platform/agent-runtime-observability.md +2 -0
  424. package/template/docs/platform/agent-runtime.md +2 -0
  425. package/template/docs/platform/agent-skills.md +25 -0
  426. package/template/package.json +4 -3
  427. package/template/packages/database/drizzle/0064_dsh_skills_diagnostics.sql +42 -0
  428. package/template/packages/database/drizzle/meta/0064_snapshot.json +15349 -0
  429. package/template/packages/database/drizzle/meta/_journal.json +7 -0
  430. package/template/packages/database/package.json +2 -2
  431. package/template/packages/database/src/schema/agent-skills.ts +65 -0
  432. package/template/packages/database/src/schema/diagnostics.ts +27 -0
  433. package/template/packages/database/src/schema/index.ts +8 -0
  434. package/template/packages/modules/package.json +1 -1
  435. package/template/packages/modules/src/ai-operation-composition.ts +9 -0
  436. package/template/packages/modules/src/ai-operation-visibility.test.ts +33 -0
  437. package/template/packages/modules/src/manifest.ts +2 -0
  438. package/template/packages/modules/src/system-admin-routes.ts +40 -0
  439. package/template/packages/modules/src/system-admin-ui-catalog.ts +24 -11
  440. package/template/packages/modules/src/system-agent-admin-bindings.ts +44 -0
  441. package/template/packages/modules/src/system-agent-admin-menus.ts +46 -0
  442. package/template/packages/modules/src/system-agent-admin-registration.test.ts +52 -0
  443. package/template/packages/modules/src/system-agent-audit-actions.ts +8 -0
  444. package/template/packages/modules/src/system-agent-dsh.ts +119 -0
  445. package/template/packages/modules/src/system-ai-api-bindings.ts +2 -0
  446. package/template/packages/modules/src/system-api-permissions.ts +9 -0
  447. package/template/packages/modules/src/system-audit-actions.ts +36 -0
  448. package/template/packages/modules/src/system-features.ts +24 -0
  449. package/template/packages/modules/src/system-module-audit-selection.ts +25 -0
  450. package/template/packages/modules/src/system-module-catalog.ts +22 -40
  451. package/template/packages/modules/src/system-module-ownership.ts +12 -0
  452. package/template/packages/modules/src/system-modules.ts +16 -3
  453. package/template/packages/modules/src/system-permissions.ts +15 -0
  454. package/template/packages/server-sdk/index.ts +2 -0
  455. package/template/packages/server-sdk/package.json +2 -2
  456. package/template/packages/server-sdk/src/agent-session-provider.ts +19 -0
  457. package/template/packages/shared/index.ts +14 -0
  458. package/template/packages/shared/package.json +1 -1
  459. package/template/packages/shared/src/agent-admin-catalog.ts +73 -0
  460. package/template/packages/shared/src/agent-skills.ts +68 -0
  461. package/template/packages/shared/src/agent-workbench.ts +100 -0
  462. package/template/packages/shared/src/agent-workflow-presets.ts +26 -0
  463. package/template/packages/shared/src/diagnostics.ts +13 -0
  464. package/template/packages/shared/src/rbac.ts +1 -0
  465. package/template/apps/agent-server/install-python-dependencies.sh +0 -92
  466. package/template/apps/agent-server/pyproject.toml +0 -51
  467. package/template/apps/agent-server/src/southwind_agent_server/__init__.py +0 -5
  468. package/template/apps/agent-server/src/southwind_agent_server/app.py +0 -344
  469. package/template/apps/agent-server/src/southwind_agent_server/approval_resolution.py +0 -30
  470. package/template/apps/agent-server/src/southwind_agent_server/artifact_input.py +0 -153
  471. package/template/apps/agent-server/src/southwind_agent_server/asgi.py +0 -8
  472. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +0 -199
  473. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +0 -203
  474. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +0 -61
  475. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +0 -82
  476. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +0 -121
  477. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +0 -158
  478. package/template/apps/agent-server/src/southwind_agent_server/config.py +0 -267
  479. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +0 -24
  480. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +0 -71
  481. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +0 -307
  482. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +0 -297
  483. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +0 -63
  484. package/template/apps/agent-server/src/southwind_agent_server/engine.py +0 -134
  485. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +0 -31
  486. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +0 -2
  487. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +0 -61
  488. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +0 -93
  489. package/template/apps/agent-server/src/southwind_agent_server/http_helpers.py +0 -62
  490. package/template/apps/agent-server/src/southwind_agent_server/lease.py +0 -15
  491. package/template/apps/agent-server/src/southwind_agent_server/multimodal.py +0 -76
  492. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +0 -329
  493. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +0 -165
  494. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +0 -345
  495. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +0 -37
  496. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +0 -235
  497. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_replay.py +0 -44
  498. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_status.py +0 -83
  499. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +0 -336
  500. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_summary.py +0 -304
  501. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +0 -335
  502. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +0 -333
  503. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +0 -144
  504. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +0 -309
  505. package/template/apps/agent-server/src/southwind_agent_server/provider_output_guidance.py +0 -34
  506. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +0 -37
  507. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +0 -218
  508. package/template/apps/agent-server/src/southwind_agent_server/report_metrics.py +0 -149
  509. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +0 -300
  510. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +0 -132
  511. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +0 -298
  512. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +0 -75
  513. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +0 -118
  514. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +0 -64
  515. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +0 -59
  516. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +0 -74
  517. package/template/apps/agent-server/src/southwind_agent_server/runtime_compatibility.py +0 -89
  518. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +0 -105
  519. package/template/apps/agent-server/src/southwind_agent_server/runtime_logging.py +0 -57
  520. package/template/apps/agent-server/src/southwind_agent_server/service.py +0 -325
  521. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +0 -64
  522. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +0 -4
  523. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +0 -34
  524. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +0 -34
  525. package/template/apps/agent-server/src/southwind_agent_server/signal_events.py +0 -53
  526. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +0 -118
  527. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +0 -2
  528. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +0 -73
  529. package/template/apps/agent-server/src/southwind_agent_server/sqlite_serialization.py +0 -16
  530. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +0 -350
  531. package/template/apps/agent-server/src/southwind_agent_server/sse.py +0 -41
  532. package/template/apps/agent-server/src/southwind_agent_server/store.py +0 -255
  533. package/template/apps/agent-server/src/southwind_agent_server/store_cipher.py +0 -40
  534. package/template/apps/agent-server/src/southwind_agent_server/structured_logging.py +0 -145
  535. package/template/apps/agent-server/src/southwind_agent_server/telemetry.py +0 -93
  536. package/template/apps/agent-server/src/southwind_agent_server/tool_host.py +0 -152
  537. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +0 -137
  538. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +0 -58
  539. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +0 -87
  540. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +0 -28
  541. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +0 -247
  542. package/template/apps/agent-server/tests/__init__.py +0 -1
  543. package/template/apps/agent-server/tests/openai_provider_test_support.py +0 -131
  544. package/template/apps/agent-server/tests/test_api.py +0 -305
  545. package/template/apps/agent-server/tests/test_artifact_input.py +0 -110
  546. package/template/apps/agent-server/tests/test_client_completion.py +0 -230
  547. package/template/apps/agent-server/tests/test_config.py +0 -106
  548. package/template/apps/agent-server/tests/test_fingerprint.py +0 -10
  549. package/template/apps/agent-server/tests/test_multimodal.py +0 -81
  550. package/template/apps/agent-server/tests/test_openai_provider.py +0 -320
  551. package/template/apps/agent-server/tests/test_postgres_report_status.py +0 -59
  552. package/template/apps/agent-server/tests/test_postgres_report_summary.py +0 -298
  553. package/template/apps/agent-server/tests/test_postgres_store.py +0 -135
  554. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +0 -140
  555. package/template/apps/agent-server/tests/test_provider_governance.py +0 -276
  556. package/template/apps/agent-server/tests/test_report_attempt_lifecycle.py +0 -126
  557. package/template/apps/agent-server/tests/test_report_resilience.py +0 -183
  558. package/template/apps/agent-server/tests/test_report_routes.py +0 -143
  559. package/template/apps/agent-server/tests/test_report_store.py +0 -347
  560. package/template/apps/agent-server/tests/test_report_summary_parity.py +0 -116
  561. package/template/apps/agent-server/tests/test_report_terminal_sync.py +0 -177
  562. package/template/apps/agent-server/tests/test_run_capacity.py +0 -112
  563. package/template/apps/agent-server/tests/test_run_operational_logging.py +0 -114
  564. package/template/apps/agent-server/tests/test_runtime_compatibility.py +0 -119
  565. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +0 -52
  566. package/template/apps/agent-server/tests/test_sqlite_store.py +0 -182
  567. package/template/apps/agent-server/tests/test_structured_logging.py +0 -142
  568. package/template/apps/agent-server/tests/test_telemetry.py +0 -25
  569. package/template/apps/agent-server/tests/test_tool_approval.py +0 -28
  570. package/template/apps/agent-server/tests/test_tool_structured_output.py +0 -347
  571. package/template/apps/agent-server/tests/test_trajectory.py +0 -91
  572. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +0 -72
  573. package/template/apps/agent-server/tests/test_vlm_readiness.py +0 -106
  574. package/template/apps/agent-server/uv.lock +0 -831
@@ -1,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