@atmem/architect 0.0.0-stage → 0.2.0-alpha.4.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 (498) hide show
  1. package/CONSTITUTION.md +144 -0
  2. package/README.md +33 -2
  3. package/agent-skills/discovery/SKILL.md +48 -0
  4. package/agent-skills/discovery/topics.json +139 -0
  5. package/agent-skills/generation-capabilities.json +760 -0
  6. package/agent-skills/service-lifecycle.json +21 -0
  7. package/agent-skills/specialists/architecture/SKILL.md +15 -0
  8. package/agent-skills/specialists/aws/SKILL.md +17 -0
  9. package/agent-skills/specialists/azure/SKILL.md +7 -0
  10. package/agent-skills/specialists/composition/SKILL.md +17 -0
  11. package/agent-skills/specialists/devops/SKILL.md +10 -0
  12. package/agent-skills/specialists/finops/SKILL.md +7 -0
  13. package/agent-skills/specialists/gcp/SKILL.md +7 -0
  14. package/agent-skills/specialists/ibm/SKILL.md +7 -0
  15. package/agent-skills/specialists/manifest.json +13 -0
  16. package/agent-skills/specialists/pulumi/SKILL.md +7 -0
  17. package/agent-skills/specialists/security/SKILL.md +7 -0
  18. package/agent-skills/specialists/terraform/SKILL.md +14 -0
  19. package/agent-skills/upstream/aws/LICENSE +175 -0
  20. package/agent-skills/upstream/aws/SKILL.md +125 -0
  21. package/agent-skills/upstream/azure/LICENSE +21 -0
  22. package/agent-skills/upstream/azure/SKILL.md +387 -0
  23. package/agent-skills/upstream/gcp/LICENSE +202 -0
  24. package/agent-skills/upstream/gcp/SKILL.md +159 -0
  25. package/agent-skills/upstream/manifest.json +57 -0
  26. package/agent-skills/upstream/pulumi/LICENSE +201 -0
  27. package/agent-skills/upstream/pulumi/SKILL.md +501 -0
  28. package/agent-skills/upstream/terraform/LICENSE +373 -0
  29. package/agent-skills/upstream/terraform/SKILL.md +316 -0
  30. package/agent-skills/workflows/workflows.json +601 -0
  31. package/cli/architect.mjs +3 -0
  32. package/cli/runtime.mjs +115 -0
  33. package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
  34. package/dist/assets/index-B97MkVMs.css +1 -0
  35. package/dist/assets/index-qtCM2D7O.js +21271 -0
  36. package/dist/assets/index.es-C6C0sneB.js +18 -0
  37. package/dist/assets/purify.es-CAi2OJFm.js +3 -0
  38. package/dist/assets/visual-export-DjbjgQbA.js +173 -0
  39. package/dist/favicon.svg +2 -0
  40. package/dist/fonts/DM-Sans-OFL.txt +93 -0
  41. package/dist/fonts/Manrope-OFL.txt +93 -0
  42. package/dist/fonts/NotoSans-Regular.ttf +0 -0
  43. package/dist/fonts/OFL.txt +94 -0
  44. package/dist/fonts/dm-sans-latin-wght-normal.woff2 +0 -0
  45. package/dist/fonts/manrope-latin-wght-normal.woff2 +0 -0
  46. package/dist/index.html +4 -0
  47. package/dist/licenses/aws-architect-LICENSE.txt +17 -0
  48. package/dist/licenses/aws-mcp-LICENSE.txt +175 -0
  49. package/dist/licenses/aws-mcp-NOTICE.txt +1 -0
  50. package/dist/licenses/cloud-emulation-notices.txt +36619 -0
  51. package/dist/licenses/dependency-notices.txt +6379 -0
  52. package/dist/licenses/emulation-notices.txt +717 -0
  53. package/dist/licenses/github-copilot-sdk-LICENSE.txt +21 -0
  54. package/dist/licenses/memory-dependency-notices.txt +3319 -0
  55. package/dist/licenses/openarchflow-LICENSE.txt +21 -0
  56. package/dist/licenses/python-dependency-notices.txt +11951 -0
  57. package/docs/upstream-lock.json +26 -0
  58. package/knowledge/engineering-practices.json +536 -0
  59. package/package.json +30 -4
  60. package/packaging/uv-release-lock.json +54 -0
  61. package/public/licenses/aws-architect-LICENSE.txt +17 -0
  62. package/public/licenses/aws-mcp-LICENSE.txt +175 -0
  63. package/public/licenses/aws-mcp-NOTICE.txt +1 -0
  64. package/public/licenses/cloud-emulation-notices.txt +36619 -0
  65. package/public/licenses/dependency-notices.txt +6379 -0
  66. package/public/licenses/emulation-notices.txt +717 -0
  67. package/public/licenses/github-copilot-sdk-LICENSE.txt +21 -0
  68. package/public/licenses/memory-dependency-notices.txt +3319 -0
  69. package/public/licenses/openarchflow-LICENSE.txt +21 -0
  70. package/public/licenses/python-dependency-notices.txt +11951 -0
  71. package/scripts/terraform-render.mjs +8 -0
  72. package/server/__init__.py +0 -0
  73. package/server/abstraction.py +28 -0
  74. package/server/agent_runtime.py +153 -0
  75. package/server/app.py +257 -0
  76. package/server/architect.py +112 -0
  77. package/server/architecture_activity.py +67 -0
  78. package/server/attachments.py +101 -0
  79. package/server/cloud-emulation-requirements.txt +29 -0
  80. package/server/codex_app_server.py +219 -0
  81. package/server/codex_engineering_backend.py +266 -0
  82. package/server/codex_worker_policy.py +170 -0
  83. package/server/contracts.py +315 -0
  84. package/server/copilot_worker.py +16 -0
  85. package/server/dependency_mirror.py +54 -0
  86. package/server/design_patch.py +43 -0
  87. package/server/emulation-requirements.txt +8 -0
  88. package/server/emulation_adapters.py +20 -0
  89. package/server/emulation_routes.py +98 -0
  90. package/server/emulation_worker.py +351 -0
  91. package/server/engineering_artifacts.py +215 -0
  92. package/server/engineering_assets/application-runtime.json +4372 -0
  93. package/server/engineering_assets/architecture_work.schema.json +79 -0
  94. package/server/engineering_assets/materialize_runtime.py +62 -0
  95. package/server/engineering_assets/prepare_tools.py +96 -0
  96. package/server/engineering_assets/sql_validation.py +59 -0
  97. package/server/engineering_contexts.py +120 -0
  98. package/server/engineering_delivery.py +210 -0
  99. package/server/engineering_finalization.py +210 -0
  100. package/server/engineering_handoff.py +163 -0
  101. package/server/engineering_jobs.py +206 -0
  102. package/server/engineering_knowledge.py +75 -0
  103. package/server/engineering_reconciliation.py +159 -0
  104. package/server/engineering_routes.py +469 -0
  105. package/server/engineering_sessions.py +273 -0
  106. package/server/engineering_tools.py +166 -0
  107. package/server/generation_lint.py +18 -0
  108. package/server/local_providers.py +181 -0
  109. package/server/local_validation.py +236 -0
  110. package/server/memory-requirements.lock +181 -0
  111. package/server/memory-requirements.txt +6 -0
  112. package/server/memory_routes.py +82 -0
  113. package/server/memory_service.py +273 -0
  114. package/server/memory_worker.py +66 -0
  115. package/server/openai_voice.py +80 -0
  116. package/server/packaged_app.py +9 -0
  117. package/server/pricing.py +84 -0
  118. package/server/process_control_observation.py +31 -0
  119. package/server/prompts.py +123 -0
  120. package/server/public_faq_emulation_worker.py +44 -0
  121. package/server/requirements.lock +1618 -0
  122. package/server/requirements.txt +68 -0
  123. package/server/runtime_dependency_locks.py +27 -0
  124. package/server/runtime_evidence.py +93 -0
  125. package/server/settings.py +14 -0
  126. package/server/skills.py +103 -0
  127. package/server/storage_emulation_worker.py +160 -0
  128. package/server/structured_emulation_worker.py +48 -0
  129. package/server/terraform_routes.py +118 -0
  130. package/server/upstream/__init__.py +0 -0
  131. package/server/upstream/agent/__init__.py +1 -0
  132. package/server/upstream/agent/aws_architect.py +600 -0
  133. package/server/upstream/agent/config/__init__.py +1 -0
  134. package/server/upstream/agent/config/agent_config.py +82 -0
  135. package/server/upstream/agent/config/prompts.py +138 -0
  136. package/server/upstream/agent/rate_limiter.py +62 -0
  137. package/server/upstream/utils/__init__.py +1 -0
  138. package/server/upstream/utils/file_writer.py +43 -0
  139. package/server/validation_applicability.py +85 -0
  140. package/server/validation_jobs.py +252 -0
  141. package/server/validation_workers.py +48 -0
  142. package/server/voice_routes.py +91 -0
  143. package/server/voice_worker.py +26 -0
  144. package/specs/028-convergence-evaluation/evidence/20261110-ibm-invoice-native/registry-structured/qualification.json +72 -0
  145. package/specs/028-convergence-evaluation/evidence/20261110-invoice-runtime/durable-current/receipt.json +61 -0
  146. package/specs/029-general-purpose-engine/evidence/20261111-runtime-dependencies/sdk/receipt.json +22 -0
  147. package/src/ArchitectureActivity.jsx +54 -0
  148. package/src/ArchitectureWorkPanel.jsx +46 -0
  149. package/src/ArtifactChecks.jsx +49 -0
  150. package/src/BlockRequirements.jsx +13 -0
  151. package/src/BrainActivity.jsx +11 -0
  152. package/src/ChatMessage.jsx +19 -0
  153. package/src/ChatResizeHandle.jsx +6 -0
  154. package/src/CodePreview.jsx +8 -0
  155. package/src/ComponentReview.jsx +31 -0
  156. package/src/DeliveryViews.jsx +59 -0
  157. package/src/EmulationPanel.jsx +44 -0
  158. package/src/EngagementViews.jsx +385 -0
  159. package/src/EngineeringPanel.jsx +151 -0
  160. package/src/ImplementationDelivery.jsx +55 -0
  161. package/src/JourneyViews.jsx +400 -0
  162. package/src/MemoryPanel.jsx +46 -0
  163. package/src/OpenAIVoicePanel.jsx +65 -0
  164. package/src/OutputsView.jsx +65 -0
  165. package/src/TerraformView.jsx +57 -0
  166. package/src/WorkbenchDialogs.jsx +532 -0
  167. package/src/activity-presentation.mjs +28 -0
  168. package/src/ai-qualification-scenarios.mjs +31 -0
  169. package/src/approval-application-files.mjs +32 -0
  170. package/src/approval-applications.mjs +82 -0
  171. package/src/approval-spec-kit.mjs +30 -0
  172. package/src/architecture-activity.css +28 -0
  173. package/src/architecture-activity.mjs +63 -0
  174. package/src/architecture-work.mjs +176 -0
  175. package/src/artifact-work.mjs +103 -0
  176. package/src/async-documents.mjs +191 -0
  177. package/src/atflow.css +1140 -0
  178. package/src/atforma.css +748 -0
  179. package/src/atmem-tokens.css +79 -0
  180. package/src/aws-preflight.mjs +60 -0
  181. package/src/aws-public-faq.mjs +102 -0
  182. package/src/aws-validation-scenarios.mjs +10 -0
  183. package/src/aws-validation.mjs +48 -0
  184. package/src/azure-plan-mocks.mjs +25 -0
  185. package/src/azure-structured.mjs +133 -0
  186. package/src/bedrock-summary.mjs +152 -0
  187. package/src/bounded-rag.mjs +60 -0
  188. package/src/brand.css +9 -0
  189. package/src/canvas-view.mjs +28 -0
  190. package/src/capability-composition.mjs +44 -0
  191. package/src/chat-attachments.mjs +13 -0
  192. package/src/cloud-provider-locks.mjs +9 -0
  193. package/src/cloud-storage-scenarios.mjs +2 -0
  194. package/src/component-review.mjs +55 -0
  195. package/src/composition-spec-kit.mjs +30 -0
  196. package/src/consultation-context.mjs +15 -0
  197. package/src/consultation.mjs +52 -0
  198. package/src/container-contracts.mjs +5 -0
  199. package/src/container-inspection.mjs +75 -0
  200. package/src/container-runtime.mjs +30 -0
  201. package/src/container-security-inspection.mjs +49 -0
  202. package/src/container-terraform.mjs +109 -0
  203. package/src/conversation.mjs +17 -0
  204. package/src/core.mjs +863 -0
  205. package/src/cross-cloud-storage.mjs +100 -0
  206. package/src/delivery-capabilities.mjs +25 -0
  207. package/src/delivery.mjs +58 -0
  208. package/src/deployment-ownership.mjs +10 -0
  209. package/src/deployment-region.mjs +11 -0
  210. package/src/derive.mjs +31 -0
  211. package/src/design-build-flow.mjs +10 -0
  212. package/src/diagram-attention.mjs +24 -0
  213. package/src/discovery.mjs +359 -0
  214. package/src/document.mjs +170 -0
  215. package/src/emulation-feedback.mjs +61 -0
  216. package/src/emulation-guidance.mjs +37 -0
  217. package/src/engagement.mjs +274 -0
  218. package/src/engineering-client.mjs +73 -0
  219. package/src/engineering-defaults.mjs +17 -0
  220. package/src/engineering.css +31 -0
  221. package/src/enterprise-application.mjs +76 -0
  222. package/src/enterprise-aws-host-infrastructure.mjs +62 -0
  223. package/src/enterprise-aws-host-tests.mjs +15 -0
  224. package/src/enterprise-aws-infrastructure-tests.mjs +38 -0
  225. package/src/enterprise-aws-infrastructure.mjs +138 -0
  226. package/src/enterprise-google-infrastructure.mjs +84 -0
  227. package/src/enterprise-google-tests.mjs +25 -0
  228. package/src/estimate.mjs +188 -0
  229. package/src/existing-references.mjs +18 -0
  230. package/src/external-identities.mjs +17 -0
  231. package/src/faq-lambda-build.mjs +28 -0
  232. package/src/gcp-structured.mjs +104 -0
  233. package/src/generation-provider.mjs +7 -0
  234. package/src/generation-quality.mjs +69 -0
  235. package/src/handoff.mjs +141 -0
  236. package/src/ibm-registry.mjs +12 -0
  237. package/src/ibm-structured.mjs +103 -0
  238. package/src/identifiers.mjs +15 -0
  239. package/src/implementation-map.mjs +14 -0
  240. package/src/implementation-outcome.mjs +8 -0
  241. package/src/incomplete-terraform.mjs +9 -0
  242. package/src/integrations.ts +137 -0
  243. package/src/interface-contracts.mjs +30 -0
  244. package/src/invoice-application.mjs +66 -0
  245. package/src/invoice-aws-operations.mjs +136 -0
  246. package/src/invoice-aws.mjs +143 -0
  247. package/src/invoice-azure-operations.mjs +147 -0
  248. package/src/invoice-azure.mjs +134 -0
  249. package/src/invoice-builder.mjs +35 -0
  250. package/src/invoice-dependencies.mjs +43 -0
  251. package/src/invoice-gcp-operations.mjs +178 -0
  252. package/src/invoice-gcp.mjs +104 -0
  253. package/src/invoice-ibm-operations.mjs +278 -0
  254. package/src/invoice-ibm.mjs +142 -0
  255. package/src/invoice-operations.mjs +143 -0
  256. package/src/invoice-plan.mjs +45 -0
  257. package/src/invoice-region.mjs +6 -0
  258. package/src/invoice-spec-kit.mjs +61 -0
  259. package/src/invoice-state.mjs +7 -0
  260. package/src/invoice-terraform.mjs +29 -0
  261. package/src/invoice-tests.mjs +122 -0
  262. package/src/journey-workspace.css +72 -0
  263. package/src/journey.mjs +87 -0
  264. package/src/levels.mjs +145 -0
  265. package/src/local-agent.mjs +184 -0
  266. package/src/main.jsx +2458 -0
  267. package/src/model-policy-preflight.mjs +34 -0
  268. package/src/openai-voice.mjs +102 -0
  269. package/src/output-bundle.mjs +11 -0
  270. package/src/ownership-inspection.mjs +28 -0
  271. package/src/pack.mjs +201 -0
  272. package/src/pricing.mjs +31 -0
  273. package/src/production-state.mjs +8 -0
  274. package/src/project-copy.mjs +10 -0
  275. package/src/project-file.mjs +160 -0
  276. package/src/project-links.mjs +3 -0
  277. package/src/protected-state.mjs +43 -0
  278. package/src/public-faq-builder.mjs +19 -0
  279. package/src/public-faq-clouds.mjs +251 -0
  280. package/src/public-faq.mjs +122 -0
  281. package/src/pulumi.mjs +123 -0
  282. package/src/python-container.mjs +25 -0
  283. package/src/python-runtime.mjs +50 -0
  284. package/src/rag-handler.mjs +43 -0
  285. package/src/rag-web-assets.mjs +52 -0
  286. package/src/rag-web.mjs +68 -0
  287. package/src/records.mjs +177 -0
  288. package/src/resources.mjs +163 -0
  289. package/src/review.mjs +252 -0
  290. package/src/runtime/EnterpriseDocument.java +89 -0
  291. package/src/runtime/approved_http_destination.py +72 -0
  292. package/src/runtime/aws-lambda-qualification-lock.json +7 -0
  293. package/src/runtime/aws-python-lock.json +82 -0
  294. package/src/runtime/aws-web-python-lock.json +887 -0
  295. package/src/runtime/aws_json_model.py +42 -0
  296. package/src/runtime/azure-python-lock.json +863 -0
  297. package/src/runtime/azure-sources.json +8 -0
  298. package/src/runtime/azure-test-lock.json +23 -0
  299. package/src/runtime/azure_acceptance.py +192 -0
  300. package/src/runtime/azure_structured.py +153 -0
  301. package/src/runtime/bounded_rag.py +126 -0
  302. package/src/runtime/catalog_admin.py +70 -0
  303. package/src/runtime/cloud-sql-proxy-lock.json +8 -0
  304. package/src/runtime/cloud-sql-proxy-security-review.json +30 -0
  305. package/src/runtime/connector_cli.py +50 -0
  306. package/src/runtime/connector_sync.py +70 -0
  307. package/src/runtime/durable-python-lock.json +247 -0
  308. package/src/runtime/durable_workflow.py +325 -0
  309. package/src/runtime/enterprise-application-manifest.json +110 -0
  310. package/src/runtime/enterprise-application-sources.json +266 -0
  311. package/src/runtime/enterprise-auth-python-lock.json +592 -0
  312. package/src/runtime/enterprise-aws-host-bootstrap-source.json +1 -0
  313. package/src/runtime/enterprise-aws-host-probe-source.json +1 -0
  314. package/src/runtime/enterprise-aws-task-template.json +235 -0
  315. package/src/runtime/enterprise-document-lock.json +18 -0
  316. package/src/runtime/enterprise-document.Dockerfile +15 -0
  317. package/src/runtime/enterprise-runtime-aws-python-lock.json +1115 -0
  318. package/src/runtime/enterprise-runtime-azure-python-lock.json +1106 -0
  319. package/src/runtime/enterprise-runtime-gcp-python-lock.json +1060 -0
  320. package/src/runtime/enterprise-runtime-ibm-python-lock.json +1096 -0
  321. package/src/runtime/enterprise-runtime-python-lock.json +1058 -0
  322. package/src/runtime/enterprise-runtime.Dockerfile +15 -0
  323. package/src/runtime/enterprise-web-app.js +1 -0
  324. package/src/runtime/enterprise-web-entry.js +105 -0
  325. package/src/runtime/enterprise-web-lock.json +29 -0
  326. package/src/runtime/enterprise-web-notices.txt +229 -0
  327. package/src/runtime/enterprise-web.css +4 -0
  328. package/src/runtime/enterprise-web.html +8 -0
  329. package/src/runtime/enterprise_audit.py +91 -0
  330. package/src/runtime/enterprise_audit_schema.sql +25 -0
  331. package/src/runtime/enterprise_auth_schema.sql +67 -0
  332. package/src/runtime/enterprise_auth_store.py +241 -0
  333. package/src/runtime/enterprise_aws_host_bootstrap.py +120 -0
  334. package/src/runtime/enterprise_aws_host_probe.py +105 -0
  335. package/src/runtime/enterprise_aws_hosts.py +136 -0
  336. package/src/runtime/enterprise_aws_jobs.py +300 -0
  337. package/src/runtime/enterprise_aws_objects.py +93 -0
  338. package/src/runtime/enterprise_aws_transfer.py +83 -0
  339. package/src/runtime/enterprise_azure_batch_api.py +128 -0
  340. package/src/runtime/enterprise_azure_host.py +599 -0
  341. package/src/runtime/enterprise_azure_jobs.py +294 -0
  342. package/src/runtime/enterprise_azure_objects.py +234 -0
  343. package/src/runtime/enterprise_azure_pool.py +161 -0
  344. package/src/runtime/enterprise_azure_transfer.py +122 -0
  345. package/src/runtime/enterprise_configuration.py +136 -0
  346. package/src/runtime/enterprise_document.py +116 -0
  347. package/src/runtime/enterprise_document_cli.py +32 -0
  348. package/src/runtime/enterprise_document_contract.py +54 -0
  349. package/src/runtime/enterprise_document_job.py +109 -0
  350. package/src/runtime/enterprise_document_jobs.py +122 -0
  351. package/src/runtime/enterprise_document_jobs_schema.sql +23 -0
  352. package/src/runtime/enterprise_extraction_cache.py +186 -0
  353. package/src/runtime/enterprise_extraction_schema.sql +17 -0
  354. package/src/runtime/enterprise_google_jobs.py +275 -0
  355. package/src/runtime/enterprise_google_transfer.py +85 -0
  356. package/src/runtime/enterprise_http.py +212 -0
  357. package/src/runtime/enterprise_identity.py +52 -0
  358. package/src/runtime/enterprise_knowledge.py +152 -0
  359. package/src/runtime/enterprise_models.py +94 -0
  360. package/src/runtime/enterprise_native.py +181 -0
  361. package/src/runtime/enterprise_oauth.py +132 -0
  362. package/src/runtime/enterprise_operator.py +160 -0
  363. package/src/runtime/enterprise_parser_service.py +136 -0
  364. package/src/runtime/enterprise_parser_transport.py +68 -0
  365. package/src/runtime/enterprise_queries.py +255 -0
  366. package/src/runtime/enterprise_queries_schema.sql +27 -0
  367. package/src/runtime/enterprise_query_service.py +111 -0
  368. package/src/runtime/enterprise_secrets.py +110 -0
  369. package/src/runtime/enterprise_sessions.py +95 -0
  370. package/src/runtime/enterprise_sources.py +260 -0
  371. package/src/runtime/enterprise_web.py +39 -0
  372. package/src/runtime/enterprise_worker.py +68 -0
  373. package/src/runtime/export_contract_acceptance.py +18 -0
  374. package/src/runtime/faq-output-contract.json +40 -0
  375. package/src/runtime/faq-web-app.js +41 -0
  376. package/src/runtime/faq-web.css +1 -0
  377. package/src/runtime/faq-web.html +6 -0
  378. package/src/runtime/gcp-sources.json +9 -0
  379. package/src/runtime/gcp_acceptance.py +110 -0
  380. package/src/runtime/gcp_structured.py +150 -0
  381. package/src/runtime/http_acceptance.py +39 -0
  382. package/src/runtime/iap-web-app.js +36 -0
  383. package/src/runtime/iap-web-source.json +1 -0
  384. package/src/runtime/ibm-python-lock.json +856 -0
  385. package/src/runtime/ibm-sources.json +9 -0
  386. package/src/runtime/ibm_acceptance.py +133 -0
  387. package/src/runtime/ibm_structured.py +113 -0
  388. package/src/runtime/invoice-azapi-provider-lock.json +7 -0
  389. package/src/runtime/invoice-ibm-provider-lock.json +7 -0
  390. package/src/runtime/invoice-parser-lock.json +1199 -0
  391. package/src/runtime/invoice-parser-python-lock.json +56 -0
  392. package/src/runtime/invoice-parser.Dockerfile +190 -0
  393. package/src/runtime/invoice-sources.json +58 -0
  394. package/src/runtime/invoice-test-sources.json +24 -0
  395. package/src/runtime/invoice-web.css +2 -0
  396. package/src/runtime/invoice-web.html +12 -0
  397. package/src/runtime/invoice-web.js +112 -0
  398. package/src/runtime/invoice_configuration.py +17 -0
  399. package/src/runtime/invoice_document.py +95 -0
  400. package/src/runtime/invoice_extraction.py +96 -0
  401. package/src/runtime/invoice_http.py +129 -0
  402. package/src/runtime/invoice_identity.py +5 -0
  403. package/src/runtime/invoice_maintenance.py +40 -0
  404. package/src/runtime/invoice_native.py +77 -0
  405. package/src/runtime/invoice_object_store.py +153 -0
  406. package/src/runtime/invoice_operations.py +108 -0
  407. package/src/runtime/invoice_operator.py +79 -0
  408. package/src/runtime/invoice_operator_core.py +39 -0
  409. package/src/runtime/invoice_operator_job.py +147 -0
  410. package/src/runtime/invoice_parser_cli.py +17 -0
  411. package/src/runtime/invoice_parser_identity.py +39 -0
  412. package/src/runtime/invoice_parser_service.py +89 -0
  413. package/src/runtime/invoice_parser_transport.py +89 -0
  414. package/src/runtime/invoice_processing.py +24 -0
  415. package/src/runtime/invoice_retention.py +16 -0
  416. package/src/runtime/invoice_runtime_secrets.py +43 -0
  417. package/src/runtime/invoice_stage.py +80 -0
  418. package/src/runtime/invoice_web.py +39 -0
  419. package/src/runtime/invoice_worker.py +50 -0
  420. package/src/runtime/lambda_faq.py +5 -0
  421. package/src/runtime/parser-requirements.lock +4 -0
  422. package/src/runtime/policy_review.py +18 -0
  423. package/src/runtime/postgres-qualification-lock.json +21 -0
  424. package/src/runtime/public-faq-sources.json +22 -0
  425. package/src/runtime/public_catalog_admin.py +122 -0
  426. package/src/runtime/public_catalog_store.py +125 -0
  427. package/src/runtime/public_faq.py +144 -0
  428. package/src/runtime/public_faq_app.py +49 -0
  429. package/src/runtime/python-container-lock.json +18 -0
  430. package/src/runtime/rag-sources.json +10 -0
  431. package/src/runtime/rag_acceptance.py +60 -0
  432. package/src/runtime/rag_aws_adapter.py +95 -0
  433. package/src/runtime/rds-ca-source.json +9 -0
  434. package/src/runtime/rds-global-ca.pem +2888 -0
  435. package/src/runtime/state-contract-check-source.json +4 -0
  436. package/src/runtime/state_contract_check.py +338 -0
  437. package/src/runtime/structured-source.json +1 -0
  438. package/src/runtime/structured-web-app.js +71 -0
  439. package/src/runtime/structured-web-source.json +1 -0
  440. package/src/runtime/structured_http.py +105 -0
  441. package/src/runtime/structured_output.py +48 -0
  442. package/src/runtime/web-python-lock.json +802 -0
  443. package/src/runtime/web_user_admin.py +44 -0
  444. package/src/runtime/workflow_application.py +62 -0
  445. package/src/runtime/workflow_bindings.py +128 -0
  446. package/src/runtime/workflow_configuration.py +40 -0
  447. package/src/runtime/workflow_connection.py +105 -0
  448. package/src/runtime/workflow_contract.py +54 -0
  449. package/src/runtime/workflow_database.py +94 -0
  450. package/src/runtime/workflow_errors.py +6 -0
  451. package/src/runtime/workflow_http.py +178 -0
  452. package/src/runtime/workflow_identity.py +69 -0
  453. package/src/runtime/workflow_payload.py +118 -0
  454. package/src/runtime/workflow_process_stage.py +88 -0
  455. package/src/runtime/workflow_profile.py +91 -0
  456. package/src/runtime/workflow_review.py +106 -0
  457. package/src/runtime/workflow_role_bootstrap.py +104 -0
  458. package/src/runtime/workflow_schema.sql +72 -0
  459. package/src/runtime/workflow_worker.py +142 -0
  460. package/src/runtime-settings.mjs +15 -0
  461. package/src/s3-access.mjs +14 -0
  462. package/src/source-contracts.mjs +17 -0
  463. package/src/spec-kit.mjs +186 -0
  464. package/src/state-custody.mjs +32 -0
  465. package/src/state-inspection.mjs +45 -0
  466. package/src/state-spec-kit.mjs +13 -0
  467. package/src/storage-tests.mjs +25 -0
  468. package/src/structured-api.mjs +133 -0
  469. package/src/structured-contract.mjs +19 -0
  470. package/src/structured-operation-policy.mjs +2 -0
  471. package/src/structured-web.mjs +17 -0
  472. package/src/style.css +1 -0
  473. package/src/system-description.mjs +26 -0
  474. package/src/terraform-admission.mjs +66 -0
  475. package/src/terraform-composition.mjs +83 -0
  476. package/src/terraform-expressions.mjs +46 -0
  477. package/src/terraform-validation-coverage.mjs +11 -0
  478. package/src/terraform.mjs +128 -0
  479. package/src/text-statistics.mjs +51 -0
  480. package/src/upstream/openarchflow/format-payload.ts +26 -0
  481. package/src/upstream/openarchflow/import/mermaid.ts +205 -0
  482. package/src/upstream/openarchflow/import/sql-ddl.ts +109 -0
  483. package/src/upstream/openarchflow/layout.ts +54 -0
  484. package/src/upstream/openarchflow/providers/aws.ts +196 -0
  485. package/src/upstream/openarchflow/providers/azure.ts +126 -0
  486. package/src/upstream/openarchflow/providers/cloudnative.ts +71 -0
  487. package/src/upstream/openarchflow/providers/generic.ts +227 -0
  488. package/src/upstream/openarchflow/providers/integration.ts +22 -0
  489. package/src/upstream/openarchflow/providers/types.ts +2 -0
  490. package/src/upstream/openarchflow/templates.ts +937 -0
  491. package/src/upstream-catalog.mjs +10 -0
  492. package/src/useChatScroll.jsx +36 -0
  493. package/src/useEmulation.jsx +36 -0
  494. package/src/validation-receipt.mjs +10 -0
  495. package/src/visual-export.mjs +92 -0
  496. package/src/voice-conversation.mjs +117 -0
  497. package/src/work-intake.mjs +24 -0
  498. package/src/workflow-runtime-inventory.mjs +3 -0
@@ -0,0 +1,10 @@
1
+ // Adapted catalogue descriptions from OpenArchFlow.
2
+ // Copyright (c) 2026 Rafael Sales. MIT; see public/licenses/openarchflow-LICENSE.txt.
3
+ export const UPSTREAM_DESCRIPTIONS = {
4
+ "AWS Lambda": "Run code without thinking about servers. Pay only for the compute time you consume.",
5
+ "Amazon S3": "Object storage built to retrieve any amount of data from anywhere.",
6
+ "Amazon Bedrock": "The easiest way to build and scale generative AI applications with foundation models.",
7
+ "SageMaker AI": "Build, train, and deploy machine learning models for any use case.",
8
+ "Azure Functions": "Process events with serverless code.",
9
+ "Azure SQL": "Managed, intelligent SQL in the cloud."
10
+ };
@@ -0,0 +1,36 @@
1
+ import {useLayoutEffect,useRef} from 'react';
2
+
3
+ // Keep new messages inside their own viewport; never scroll the surrounding page.
4
+ export function useChatScroll(projectId,open){
5
+ const viewport=useRef(null),content=useRef(null),resume=useRef(()=>{});
6
+ useLayoutEffect(()=>{
7
+ const pane=viewport.current,list=content.current;if(!pane||!list)return;
8
+ let following=true,programmatic=false,frame=0;
9
+ const atBottom=()=>pane.scrollHeight-pane.clientHeight-pane.scrollTop<=48;
10
+ const move=(smooth=true)=>{
11
+ if(!following)return;
12
+ programmatic=true;
13
+ pane.scrollTo({top:pane.scrollHeight,behavior:smooth&&!matchMedia('(prefers-reduced-motion: reduce)').matches?'smooth':'instant'});
14
+ };
15
+ // Layout/animation scroll events cannot opt out of following; user input can.
16
+ const scroll=()=>{if(!programmatic)following=atBottom();};
17
+ const interrupt=()=>{programmatic=false;};
18
+ const wheel=e=>{interrupt();if(e.deltaY<0)following=false;};
19
+ pane.addEventListener('scroll',scroll);
20
+ pane.addEventListener('wheel',wheel,{passive:true});
21
+ pane.addEventListener('touchstart',interrupt,{passive:true});
22
+ pane.addEventListener('pointerdown',interrupt);
23
+ pane.addEventListener('keydown',interrupt);
24
+ move(false);
25
+ const observer=new ResizeObserver(()=>{cancelAnimationFrame(frame);frame=requestAnimationFrame(()=>move());});
26
+ observer.observe(list);observer.observe(pane);
27
+ resume.current=()=>{following=true;move();};
28
+ return ()=>{
29
+ observer.disconnect();cancelAnimationFrame(frame);resume.current=()=>{};
30
+ pane.removeEventListener('scroll',scroll);
31
+ pane.removeEventListener('wheel',wheel);pane.removeEventListener('touchstart',interrupt);
32
+ pane.removeEventListener('pointerdown',interrupt);pane.removeEventListener('keydown',interrupt);
33
+ };
34
+ },[projectId,open]);
35
+ return {viewport,content,followLatest:()=>resume.current()};
36
+ }
@@ -0,0 +1,36 @@
1
+ import {useEffect,useMemo,useRef,useState} from 'react';
2
+ import {emulationPreflight} from './emulation-guidance.mjs';
3
+ import {terraformSketch} from './terraform.mjs';
4
+ import {toProjectFile} from './project-file.mjs';
5
+
6
+ export function useEmulation(project,environment,session){
7
+ const [last,setLast]=useState(null),[running,setRunning]=useState(false),[autoRetest,setAutoRetest]=useState(false),[coach,setCoach]=useState(false),[retestLimitReached,setRetestLimitReached]=useState(false);
8
+ const preflight=useMemo(()=>emulationPreflight(project),[project]);
9
+ const controller=useRef(null),retest=useRef(null),runRef=useRef(null),automaticRounds=useRef(0);
10
+ const key=useMemo(()=>JSON.stringify([project.id,environment,terraformSketch(project,environment)]),[project,environment]);
11
+ useEffect(()=>{
12
+ controller.current?.abort();controller.current=null;setRunning(false);
13
+ if(retest.current===project.id){retest.current=null;const timer=setTimeout(()=>runRef.current?.({automatic:true}),100);return ()=>clearTimeout(timer);}
14
+ retest.current=null;
15
+ },[key,project.id]);
16
+ useEffect(()=>()=>controller.current?.abort(),[]);
17
+ useEffect(()=>{automaticRounds.current=0;setRetestLimitReached(false);},[project.id]);
18
+ async function run(options={}){
19
+ if(preflight)return;
20
+ if(!options.automatic){automaticRounds.current=0;setRetestLimitReached(false);}
21
+ if(controller.current)return;
22
+ const request=new AbortController();controller.current=request;setRunning(true);
23
+ const timer=setTimeout(()=>request.abort(),115000);
24
+ const save=report=>{if(controller.current===request)setLast({key,projectId:project.id,report});};
25
+ try{
26
+ toProjectFile(project);if(!session?.token)throw Error('Connect to the architect service before emulating.');
27
+ const response=await fetch('/api/emulation/run',{method:'POST',headers:{'Content-Type':'application/json',Authorization:`Bearer ${session.token}`},body:JSON.stringify({project,environment}),signal:request.signal});
28
+ const body=await response.json();if(!response.ok)throw Error(typeof body.detail==='string'?body.detail:'Emulation failed.');
29
+ if(!request.signal.aborted)save(body);
30
+ }catch(error){save({status:'failed',checks:[],message:request.signal.aborted?'Stopped waiting; no pass was recorded. The worker retains its server time limit.':error.message});}
31
+ finally{clearTimeout(timer);if(controller.current===request){controller.current=null;setRunning(false);}}
32
+ }
33
+ runRef.current=run;
34
+ const result=last?.key===key?last.report:null,previous=last?.projectId===project.id&&last.key!==key?last.report:null;
35
+ return {result,previous,running,preflight,retestLimitReached,coach,setCoach,run,stop:()=>controller.current?.abort(),autoRetest,setAutoRetest,scheduleRetest:()=>{if(autoRetest&&automaticRounds.current<2){automaticRounds.current++;retest.current=project.id;}else if(autoRetest)setRetestLimitReached(true);}};
36
+ }
@@ -0,0 +1,10 @@
1
+ import {moduleValidationCoverage} from './terraform-validation-coverage.mjs';
2
+ export async function verifiedReceipt(files,result){
3
+ if(!result?.fileDigests)return null;
4
+ const names=Object.keys(files).sort(),recorded=Object.keys(result.fileDigests).sort();
5
+ if(JSON.stringify(names)!==JSON.stringify(recorded))return null;
6
+ for(const name of names){const bytes=new TextEncoder().encode(files[name]);const hash=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',bytes)),b=>b.toString(16).padStart(2,'0')).join('');if(hash!==result.fileDigests[name])return null;}
7
+ let modules=[];if(files['generation-quality.json']){try{modules=JSON.parse(files['generation-quality.json']).modules||[];}catch{return null;}}
8
+ result=moduleValidationCoverage(result,modules);
9
+ return {version:1,status:result.status,scope:'configuration_and_available_generated_local_tests',cloudPlan:'not_run',deployment:'not_run',fileDigests:result.fileDigests,checks:result.checks||[],message:result.message||'',generatedAt:new Date().toISOString()};
10
+ }
@@ -0,0 +1,92 @@
1
+ // Offline exports from the saved project snapshot, independent of viewport and active tab.
2
+ import { jsPDF } from 'jspdf';
3
+ const esc=value=>String(value??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&apos;'}[c]));
4
+ const plain=value=>String(value??'').replace(/\*\*|`/g,'').replace(/\[([^\]]+)\]\([^)]+\)/g,'$1');
5
+ let fontPromise;
6
+ async function font(){
7
+ fontPromise ||= fetch('/fonts/NotoSans-Regular.ttf').then(async r=>{if(!r.ok)throw Error('PDF font could not be loaded. Please retry the download.');const bytes=new Uint8Array(await r.arrayBuffer());let binary='';for(let i=0;i<bytes.length;i+=8192)binary+=String.fromCharCode(...bytes.subarray(i,i+8192));return btoa(binary);}).catch(e=>{fontPromise=null;throw e;});
8
+ return fontPromise;
9
+ }
10
+ function pdf(fontData,options={}){const doc=new jsPDF({compress:true,...options});doc.addFileToVFS('NotoSans.ttf',fontData);doc.addFont('NotoSans.ttf','NotoSans','normal');doc.setFont('NotoSans');return doc;}
11
+ export function specificationPdf(markdown,fontData,diagramImage=null){
12
+ const doc=pdf(fontData),width=170;let y=24;
13
+ function line(text,size=10,color='#263345'){
14
+ doc.setFontSize(size);doc.setTextColor(color);
15
+ const lines=doc.splitTextToSize(plain(text),width);
16
+ const height=size*0.48;
17
+ for(const part of lines){if(y+height>276){doc.addPage();y=24;}doc.text(part,20,y);y+=height;}
18
+ }
19
+ let headers=[],codeBlock=false;
20
+ for(const raw of markdown.split('\n')){
21
+ const text=raw.trim();
22
+ if(text.startsWith('```')){
23
+ codeBlock=!codeBlock;
24
+ if(codeBlock&&diagramImage){
25
+ const h=Math.min(105,170*diagramImage.height/diagramImage.width),w=h*diagramImage.width/diagramImage.height;
26
+ if(y+h>270){doc.addPage();y=24;}
27
+ doc.addImage(diagramImage.png,'PNG',20,y,w,h);y+=h+8;
28
+ }
29
+ continue;
30
+ }
31
+ if(codeBlock)continue;
32
+ if(!text){y+=3;continue;}
33
+ if(/^\|[- :|]+\|$/.test(text))continue;
34
+ if(text.startsWith('|')){
35
+ const cells=text.slice(1,-1).split(/(?<!\\)\|/).map(c=>c.trim().replace(/\\\|/g,'|'));
36
+ if(!headers.length){headers=cells;continue;}
37
+ cells.forEach((cell,i)=>{if(cell&&cell!=='—')line(`${headers[i]||'Detail'}: ${cell}`,9);});y+=4;continue;
38
+ }
39
+ headers=[];
40
+ const heading=text.match(/^(#{1,6})\s+(.+)/);
41
+ if(heading){if(y>250){doc.addPage();y=24;}y+=5;line(heading[2],heading[1].length===1?20:heading[1].length===2?14:11,'#173e65');y+=3;}
42
+ else line(text.replace(/^[-*] /,'• ').replace(/^_([\s\S]+)_$/,'$1'));
43
+ }
44
+ const count=doc.getNumberOfPages();
45
+ for(let i=1;i<=count;i++){doc.setPage(i);doc.setFontSize(8);doc.setTextColor('#627080');doc.text('AtMem AI Architect · Working specification',20,287);doc.text(`${i} / ${count}`,190,287,{align:'right'});}
46
+ return new Uint8Array(doc.output('arraybuffer'));
47
+ }
48
+ function wrap(ctx,text,width){
49
+ const lines=[];
50
+ for(const paragraph of String(text??'').split('\n')){
51
+ let line='';
52
+ for(const char of paragraph){if(line&&ctx.measureText(line+char).width>width){lines.push(line);line='';}line+=char;}lines.push(line);
53
+ }
54
+ return lines;
55
+ }
56
+ export function diagramSvg(project){
57
+ const ctx=document.createElement('canvas').getContext('2d');ctx.font='14px sans-serif';
58
+ const byId=new Map(project.nodes.map(n=>[n.id,n]));
59
+ function position(n,seen=new Set()){
60
+ if(seen.has(n.id))return {x:0,y:0};seen.add(n.id);
61
+ const parent=byId.get(n.parentId),offset=parent?position(parent,seen):{x:0,y:0};
62
+ return {x:offset.x+(Number(n.position?.x)||0),y:offset.y+(Number(n.position?.y)||0)};
63
+ }
64
+ const nodes=project.nodes.map(n=>{const w=Math.max(240,n.measured?.width||n.width||0),lines=wrap(ctx,[...new Set([n.data.label,n.data.service,n.data.description,n.data.config?.region].filter(Boolean))].join('\n'),w-32);return {...n,...position(n),w,h:Math.max(n.measured?.height||n.height||0,lines.length*20+32),lines};});
65
+ let minX=Math.min(0,...nodes.map(n=>n.x))-50,minY=Math.min(0,...nodes.map(n=>n.y))-90;
66
+ let width=Math.max(640,...nodes.map(n=>n.x+n.w-minX+50)),height=Math.max(360,...nodes.map(n=>n.y+n.h-minY+50));
67
+ ctx.font='18px sans-serif';const titleLines=wrap(ctx,`${project.name} · r${project.revision}`,width-60);
68
+ const extraTitleHeight=(titleLines.length-1)*24;minY-=extraTitleHeight;height+=extraTitleHeight;
69
+ const map=new Map(nodes.map(n=>[n.id,n]));
70
+ const edges=project.edges.map(e=>{const a=map.get(e.source),b=map.get(e.target);if(!a||!b)return '';
71
+ const forward=b.x>=a.x, x1=a.x+(forward?a.w:0),x2=b.x+(forward?0:b.w),y1=a.y+a.h/2,y2=b.y+b.h/2;
72
+ const labelLines=wrap(ctx,e.label||'',200),x=(x1+x2)/2,y=Math.min(a.y,b.y)-24-labelLines.length*18;
73
+ return `<path d="M${x1},${y1} C${(x1+x2)/2},${y1} ${(x1+x2)/2},${y2} ${x2},${y2}" fill="none" stroke="#63758b" stroke-width="2" marker-end="url(#arrow)"/>${e.label?`<rect x="${x-105}" y="${y-18}" width="210" height="${labelLines.length*18+8}" fill="white"/><text x="${x}" y="${y}" text-anchor="middle" font-size="12">${labelLines.map((l,i)=>`<tspan x="${x}" dy="${i?18:0}">${esc(l)}</tspan>`).join('')}</text>`:''}`;
74
+ }).join('');
75
+ const boxes=nodes.map(n=>`<g><rect x="${n.x}" y="${n.y}" width="${n.w}" height="${n.h}" rx="10" fill="${n.data.kind==='note'?'#fff5bd':'#edf4fb'}" stroke="#7290ad"/><text x="${n.x+16}" y="${n.y+26}" font-size="14">${n.lines.map((l,i)=>`<tspan x="${n.x+16}" dy="${i?20:0}">${esc(l)}</tspan>`).join('')}</text></g>`).join('');
76
+ return {width,height,svg:`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="${minX} ${minY} ${width} ${height}"><rect x="${minX}" y="${minY}" width="${width}" height="${height}" fill="white"/><defs><marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#63758b"/></marker></defs><g font-family="sans-serif" fill="#1c3045"><text x="${minX+30}" y="${minY+35}" font-size="18">${titleLines.map((l,i)=>`<tspan x="${minX+30}" dy="${i?24:0}">${esc(l)}</tspan>`).join('')}</text>${edges}${boxes}${nodes.length?'':`<text x="0" y="80">No components drawn yet.</text>`}</g></svg>`};
77
+ }
78
+ async function pngOf({svg,width,height}){
79
+ const url=URL.createObjectURL(new Blob([svg],{type:'image/svg+xml'}));
80
+ try{const img=new Image();img.src=url;await img.decode();const canvas=document.createElement('canvas');
81
+ const scale=Math.min(2,8192/width,8192/height,Math.sqrt(24_000_000/(width*height)));
82
+ canvas.width=Math.ceil(width*scale);canvas.height=Math.ceil(height*scale);canvas.getContext('2d').drawImage(img,0,0,canvas.width,canvas.height);
83
+ const blob=await new Promise(resolve=>canvas.toBlob(resolve,'image/png'));if(!blob)throw Error('Diagram PNG could not be generated.');return new Uint8Array(await blob.arrayBuffer());
84
+ }finally{URL.revokeObjectURL(url);}
85
+ }
86
+ export async function visualFiles(project,markdown,implementationMarkdown){
87
+ const data=await font(),diagram=diagramSvg(project),png=await pngOf(diagram);
88
+ const doc=pdf(data,{orientation:diagram.width>=diagram.height?'landscape':'portrait',unit:'mm',format:'a3'});
89
+ const width=doc.internal.pageSize.getWidth()-20,height=doc.internal.pageSize.getHeight()-20,scale=Math.min(width/diagram.width,height/diagram.height);
90
+ doc.addImage(png,'PNG',10+(width-diagram.width*scale)/2,10,diagram.width*scale,diagram.height*scale);
91
+ return {...(implementationMarkdown?{'spec-kit/implementation-spec.pdf':specificationPdf(implementationMarkdown,data)}:{}),'specification.pdf':specificationPdf(markdown,data,{png,width:diagram.width,height:diagram.height}),'diagram.svg':diagram.svg,'diagram.png':png,'diagram.pdf':new Uint8Array(doc.output('arraybuffer'))};
92
+ }
@@ -0,0 +1,117 @@
1
+ // Local dictation only. Transcripts stay in the composer until the user presses Send.
2
+ export function resample(samples, rate) {
3
+ if (rate === 16000) return new Float32Array(samples);
4
+ const ratio = rate / 16000, out = new Float32Array(Math.floor(samples.length / ratio));
5
+ for (let n=0;n<out.length;n++) {
6
+ const at=n*ratio, left=Math.floor(at), fraction=at-left;
7
+ out[n]=samples[left]*(1-fraction)+(samples[Math.min(left+1,samples.length-1)]||0)*fraction;
8
+ }
9
+ return out;
10
+ }
11
+ export function wav(parts, length) {
12
+ const data=new ArrayBuffer(44+length*2), view=new DataView(data);
13
+ const text=(at,s)=>{for(let n=0;n<s.length;n++)view.setUint8(at+n,s.charCodeAt(n));};
14
+ text(0,'RIFF');view.setUint32(4,36+length*2,true);text(8,'WAVE');text(12,'fmt ');
15
+ view.setUint32(16,16,true);view.setUint16(20,1,true);view.setUint16(22,1,true);
16
+ view.setUint32(24,16000,true);view.setUint32(28,32000,true);view.setUint16(32,2,true);
17
+ view.setUint16(34,16,true);text(36,'data');view.setUint32(40,length*2,true);
18
+ let at=44;
19
+ for(const part of parts)for(const sample of part){
20
+ if(at>=data.byteLength)break;
21
+ const value=Math.max(-1,Math.min(1,sample));view.setInt16(at,value<0?value*32768:value*32767,true);at+=2;
22
+ }
23
+ return new Blob([data],{type:'audio/wav'});
24
+ }
25
+ export async function microphoneCapture({onSamples}) {
26
+ let stream, context, processor, source, mute;
27
+ const stop=()=>{
28
+ if(processor){processor.onaudioprocess=null;processor.disconnect();}
29
+ source?.disconnect();mute?.disconnect();stream?.getTracks().forEach(t=>t.stop());
30
+ if(context && context.state!=='closed')void context.close().catch(()=>{});
31
+ };
32
+ try {
33
+ if(!navigator.mediaDevices?.getUserMedia)throw Error('Microphone capture is not supported in this browser.');
34
+ stream=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:true,noiseSuppression:true}});
35
+ const Audio=window.AudioContext||window.webkitAudioContext;
36
+ if(!Audio)throw Error('Audio capture is not supported in this browser.');
37
+ context=new Audio({sampleRate:16000});await context.resume();
38
+ source=context.createMediaStreamSource(stream);
39
+ // Kept for broad Safari/Chromium support. It never sends audio to browser speech services.
40
+ processor=context.createScriptProcessor(4096,1,1);mute=context.createGain();mute.gain.value=0;
41
+ processor.onaudioprocess=e=>onSamples(resample(e.inputBuffer.getChannelData(0),context.sampleRate));
42
+ source.connect(processor);processor.connect(mute);mute.connect(context.destination);
43
+ return {stop};
44
+ } catch(error) {stop();throw error;}
45
+ }
46
+ export class VoiceDictation {
47
+ constructor({capture=microphoneCapture,transcribe,onDraft=()=>{},onState=()=>{},onError=()=>{},base='',
48
+ intervalMs=1000,schedule=(fn,ms)=>setTimeout(fn,ms),clear=id=>clearTimeout(id)}) {
49
+ Object.assign(this,{capture,transcribe,onDraft,onState,onError,base,intervalMs,schedule,clear});
50
+ this.base=base.trim()?base.trim()+' ':'';this.draft=base;this.epoch=0;this.phase='off';
51
+ }
52
+ state(phase){this.phase=phase;this.onState(phase);}
53
+ async start(){
54
+ const token=++this.epoch;this.parts=[];this.length=0;this.processed=0;this.heard=false;this.running=true;
55
+ this.controller=new AbortController();this.state('starting');
56
+ try {
57
+ const mic=await this.capture({onSamples:part=>{
58
+ if(!this.running||token!==this.epoch)return;
59
+ const remaining=960000-this.length;
60
+ if(remaining<=0)return;
61
+ const bounded=part.slice(0,remaining);
62
+ this.parts.push(bounded);this.length+=bounded.length;
63
+ if(bounded.some(x=>Math.abs(x)>.02))this.heard=true;
64
+ if(this.length>=960000)void this.finish();
65
+ }});
66
+ if(token!==this.epoch||!this.running){mic.stop();return;}
67
+ this.mic=mic;this.state('listening');this.tick();
68
+ } catch(error){if(token===this.epoch)this.fail(error?.name==='NotAllowedError'
69
+ ?'Microphone access is blocked. Allow it for this site in your browser settings.'
70
+ :'Could not open the microphone. Check your browser and system microphone settings.');}
71
+ }
72
+ tick(){
73
+ this.timer=this.schedule(()=>{
74
+ if(!this.running)return;
75
+ void this.update().catch(()=>{});
76
+ this.tick();
77
+ },this.intervalMs);
78
+ }
79
+ async update(final=false){
80
+ if(this.pending){await this.pending;if(!final)return;}
81
+ const token=this.epoch, length=this.length;
82
+ if(!this.running&&!final)return;
83
+ if(length<1600||length===this.processed||!this.heard)return;
84
+ const work=(async()=>{
85
+ try {
86
+ const text=await this.transcribe(wav(this.parts,length),this.controller.signal);
87
+ if(token!==this.epoch)return;
88
+ this.processed=length;
89
+ if(typeof text!=='string')throw Error('invalid transcript');
90
+ this.draft=this.base+text.trim();this.onDraft(this.draft);
91
+ } catch(error){
92
+ if(token===this.epoch){this.fail(error.message||'Local transcription failed. Nothing has been sent.');throw error;}
93
+ }
94
+ })();
95
+ this.pending=work;
96
+ try{await work;}finally{if(this.pending===work)this.pending=null;}
97
+ }
98
+ async finish(){
99
+ if(this.finishing)return this.finishing;
100
+ if(!this.running)return this.phase==='error'?null:this.draft;
101
+ this.running=false;this.clear(this.timer);this.mic?.stop();this.state('transcribing');
102
+ const token=this.epoch;
103
+ this.finishing=(async()=>{
104
+ try {
105
+ await this.update(true);
106
+ if(token!==this.epoch)return null;
107
+ this.parts=[];this.state('off');return this.draft;
108
+ } catch {return null;}finally{this.finishing=null;}
109
+ })();
110
+ return this.finishing;
111
+ }
112
+ cancel(){
113
+ this.epoch++;this.running=false;this.clear(this.timer);this.controller?.abort();this.mic?.stop();
114
+ this.parts=[];this.state('off');
115
+ }
116
+ fail(message){this.cancel();this.state('error');this.onError(message);}
117
+ }
@@ -0,0 +1,24 @@
1
+ // User intent is logged immediately; one coherent writer applies the combined design.
2
+ export function restoreQueuedMessages(messages,projectId){
3
+ return messages.filter(m=>m.role==='user'&&m.requestId&&['queued','processing'].includes(m.workState)).map(m=>({id:m.requestId,projectId,text:m.text,attachments:m.attachments||[]}));
4
+ }
5
+ export function nextIntakeBatch(queue,projectId,maxChars=8000){
6
+ const items=[];let files=0;
7
+ for(const item of queue.filter(q=>q.projectId===projectId)){
8
+ const invalid=item.text.length>maxChars?'This saved update exceeds the message limit. Edit it before sending; its full text is still saved.':item.attachments.length>4?'This saved update has more than four files. Edit it before sending; its text and file references are still saved.':null;
9
+ if(invalid)return items.length?batch(items):{blocked:item.id,reason:invalid};
10
+ if(item.attachments.some(a=>!a.data))return items.length?batch(items):{blocked:item.id,reason:'Attach the files again or continue with the text.'};
11
+ const candidate=[...items,item],message=combine(candidate);
12
+ if(items.length&&(message.length>maxChars||files+item.attachments.length>4))break;
13
+ items.push(item);files+=item.attachments.length;
14
+ if(items.length>=8)break;
15
+ }
16
+ return items.length?batch(items):null;
17
+ }
18
+ function combine(items){return items.length===1?items[0].text:'Apply these user updates together, in order. Later explicit corrections take precedence. Preserve the rest of the agreed scope.\n\n'+items.map((x,i)=>`${i+1}. ${x.text}`).join('\n\n');}
19
+ function batch(items){return {items,message:combine(items),attachments:items.flatMap(x=>x.attachments),ids:items.map(x=>x.id)};}
20
+
21
+ export function restoreIntakePaused(messages){
22
+ const terminal=messages.filter(m=>m.role==='user'&&['failed','complete','superseded'].includes(m.workState)).at(-1);
23
+ return terminal?.workState==='failed';
24
+ }
@@ -0,0 +1,3 @@
1
+ // Shared production files only. Tests and domain processors are separate artifacts.
2
+ export const WORKFLOW_API_FILES=Object.freeze(['workflow_bindings.py','workflow_profile.py','workflow_application.py','workflow_configuration.py','workflow_identity.py','workflow_http.py','workflow_payload.py','workflow_review.py','workflow_contract.py','workflow_connection.py','workflow_errors.py','workflow_database.py','workflow_role_bootstrap.py','workflow_worker.py','durable_workflow.py','approved_http_destination.py','azure_structured.py','gcp_structured.py','ibm_structured.py','structured_output.py','structured_http.py','policy_review.py']);
3
+ export const WORKFLOW_RUNTIME_FILES=Object.freeze([...WORKFLOW_API_FILES,'workflow_process_stage.py','aws_json_model.py']);