@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.
- package/CONSTITUTION.md +144 -0
- package/README.md +33 -2
- package/agent-skills/discovery/SKILL.md +48 -0
- package/agent-skills/discovery/topics.json +139 -0
- package/agent-skills/generation-capabilities.json +760 -0
- package/agent-skills/service-lifecycle.json +21 -0
- package/agent-skills/specialists/architecture/SKILL.md +15 -0
- package/agent-skills/specialists/aws/SKILL.md +17 -0
- package/agent-skills/specialists/azure/SKILL.md +7 -0
- package/agent-skills/specialists/composition/SKILL.md +17 -0
- package/agent-skills/specialists/devops/SKILL.md +10 -0
- package/agent-skills/specialists/finops/SKILL.md +7 -0
- package/agent-skills/specialists/gcp/SKILL.md +7 -0
- package/agent-skills/specialists/ibm/SKILL.md +7 -0
- package/agent-skills/specialists/manifest.json +13 -0
- package/agent-skills/specialists/pulumi/SKILL.md +7 -0
- package/agent-skills/specialists/security/SKILL.md +7 -0
- package/agent-skills/specialists/terraform/SKILL.md +14 -0
- package/agent-skills/upstream/aws/LICENSE +175 -0
- package/agent-skills/upstream/aws/SKILL.md +125 -0
- package/agent-skills/upstream/azure/LICENSE +21 -0
- package/agent-skills/upstream/azure/SKILL.md +387 -0
- package/agent-skills/upstream/gcp/LICENSE +202 -0
- package/agent-skills/upstream/gcp/SKILL.md +159 -0
- package/agent-skills/upstream/manifest.json +57 -0
- package/agent-skills/upstream/pulumi/LICENSE +201 -0
- package/agent-skills/upstream/pulumi/SKILL.md +501 -0
- package/agent-skills/upstream/terraform/LICENSE +373 -0
- package/agent-skills/upstream/terraform/SKILL.md +316 -0
- package/agent-skills/workflows/workflows.json +601 -0
- package/cli/architect.mjs +3 -0
- package/cli/runtime.mjs +115 -0
- package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
- package/dist/assets/index-B97MkVMs.css +1 -0
- package/dist/assets/index-qtCM2D7O.js +21271 -0
- package/dist/assets/index.es-C6C0sneB.js +18 -0
- package/dist/assets/purify.es-CAi2OJFm.js +3 -0
- package/dist/assets/visual-export-DjbjgQbA.js +173 -0
- package/dist/favicon.svg +2 -0
- package/dist/fonts/DM-Sans-OFL.txt +93 -0
- package/dist/fonts/Manrope-OFL.txt +93 -0
- package/dist/fonts/NotoSans-Regular.ttf +0 -0
- package/dist/fonts/OFL.txt +94 -0
- package/dist/fonts/dm-sans-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/manrope-latin-wght-normal.woff2 +0 -0
- package/dist/index.html +4 -0
- package/dist/licenses/aws-architect-LICENSE.txt +17 -0
- package/dist/licenses/aws-mcp-LICENSE.txt +175 -0
- package/dist/licenses/aws-mcp-NOTICE.txt +1 -0
- package/dist/licenses/cloud-emulation-notices.txt +36619 -0
- package/dist/licenses/dependency-notices.txt +6379 -0
- package/dist/licenses/emulation-notices.txt +717 -0
- package/dist/licenses/github-copilot-sdk-LICENSE.txt +21 -0
- package/dist/licenses/memory-dependency-notices.txt +3319 -0
- package/dist/licenses/openarchflow-LICENSE.txt +21 -0
- package/dist/licenses/python-dependency-notices.txt +11951 -0
- package/docs/upstream-lock.json +26 -0
- package/knowledge/engineering-practices.json +536 -0
- package/package.json +30 -4
- package/packaging/uv-release-lock.json +54 -0
- package/public/licenses/aws-architect-LICENSE.txt +17 -0
- package/public/licenses/aws-mcp-LICENSE.txt +175 -0
- package/public/licenses/aws-mcp-NOTICE.txt +1 -0
- package/public/licenses/cloud-emulation-notices.txt +36619 -0
- package/public/licenses/dependency-notices.txt +6379 -0
- package/public/licenses/emulation-notices.txt +717 -0
- package/public/licenses/github-copilot-sdk-LICENSE.txt +21 -0
- package/public/licenses/memory-dependency-notices.txt +3319 -0
- package/public/licenses/openarchflow-LICENSE.txt +21 -0
- package/public/licenses/python-dependency-notices.txt +11951 -0
- package/scripts/terraform-render.mjs +8 -0
- package/server/__init__.py +0 -0
- package/server/abstraction.py +28 -0
- package/server/agent_runtime.py +153 -0
- package/server/app.py +257 -0
- package/server/architect.py +112 -0
- package/server/architecture_activity.py +67 -0
- package/server/attachments.py +101 -0
- package/server/cloud-emulation-requirements.txt +29 -0
- package/server/codex_app_server.py +219 -0
- package/server/codex_engineering_backend.py +266 -0
- package/server/codex_worker_policy.py +170 -0
- package/server/contracts.py +315 -0
- package/server/copilot_worker.py +16 -0
- package/server/dependency_mirror.py +54 -0
- package/server/design_patch.py +43 -0
- package/server/emulation-requirements.txt +8 -0
- package/server/emulation_adapters.py +20 -0
- package/server/emulation_routes.py +98 -0
- package/server/emulation_worker.py +351 -0
- package/server/engineering_artifacts.py +215 -0
- package/server/engineering_assets/application-runtime.json +4372 -0
- package/server/engineering_assets/architecture_work.schema.json +79 -0
- package/server/engineering_assets/materialize_runtime.py +62 -0
- package/server/engineering_assets/prepare_tools.py +96 -0
- package/server/engineering_assets/sql_validation.py +59 -0
- package/server/engineering_contexts.py +120 -0
- package/server/engineering_delivery.py +210 -0
- package/server/engineering_finalization.py +210 -0
- package/server/engineering_handoff.py +163 -0
- package/server/engineering_jobs.py +206 -0
- package/server/engineering_knowledge.py +75 -0
- package/server/engineering_reconciliation.py +159 -0
- package/server/engineering_routes.py +469 -0
- package/server/engineering_sessions.py +273 -0
- package/server/engineering_tools.py +166 -0
- package/server/generation_lint.py +18 -0
- package/server/local_providers.py +181 -0
- package/server/local_validation.py +236 -0
- package/server/memory-requirements.lock +181 -0
- package/server/memory-requirements.txt +6 -0
- package/server/memory_routes.py +82 -0
- package/server/memory_service.py +273 -0
- package/server/memory_worker.py +66 -0
- package/server/openai_voice.py +80 -0
- package/server/packaged_app.py +9 -0
- package/server/pricing.py +84 -0
- package/server/process_control_observation.py +31 -0
- package/server/prompts.py +123 -0
- package/server/public_faq_emulation_worker.py +44 -0
- package/server/requirements.lock +1618 -0
- package/server/requirements.txt +68 -0
- package/server/runtime_dependency_locks.py +27 -0
- package/server/runtime_evidence.py +93 -0
- package/server/settings.py +14 -0
- package/server/skills.py +103 -0
- package/server/storage_emulation_worker.py +160 -0
- package/server/structured_emulation_worker.py +48 -0
- package/server/terraform_routes.py +118 -0
- package/server/upstream/__init__.py +0 -0
- package/server/upstream/agent/__init__.py +1 -0
- package/server/upstream/agent/aws_architect.py +600 -0
- package/server/upstream/agent/config/__init__.py +1 -0
- package/server/upstream/agent/config/agent_config.py +82 -0
- package/server/upstream/agent/config/prompts.py +138 -0
- package/server/upstream/agent/rate_limiter.py +62 -0
- package/server/upstream/utils/__init__.py +1 -0
- package/server/upstream/utils/file_writer.py +43 -0
- package/server/validation_applicability.py +85 -0
- package/server/validation_jobs.py +252 -0
- package/server/validation_workers.py +48 -0
- package/server/voice_routes.py +91 -0
- package/server/voice_worker.py +26 -0
- package/specs/028-convergence-evaluation/evidence/20261110-ibm-invoice-native/registry-structured/qualification.json +72 -0
- package/specs/028-convergence-evaluation/evidence/20261110-invoice-runtime/durable-current/receipt.json +61 -0
- package/specs/029-general-purpose-engine/evidence/20261111-runtime-dependencies/sdk/receipt.json +22 -0
- package/src/ArchitectureActivity.jsx +54 -0
- package/src/ArchitectureWorkPanel.jsx +46 -0
- package/src/ArtifactChecks.jsx +49 -0
- package/src/BlockRequirements.jsx +13 -0
- package/src/BrainActivity.jsx +11 -0
- package/src/ChatMessage.jsx +19 -0
- package/src/ChatResizeHandle.jsx +6 -0
- package/src/CodePreview.jsx +8 -0
- package/src/ComponentReview.jsx +31 -0
- package/src/DeliveryViews.jsx +59 -0
- package/src/EmulationPanel.jsx +44 -0
- package/src/EngagementViews.jsx +385 -0
- package/src/EngineeringPanel.jsx +151 -0
- package/src/ImplementationDelivery.jsx +55 -0
- package/src/JourneyViews.jsx +400 -0
- package/src/MemoryPanel.jsx +46 -0
- package/src/OpenAIVoicePanel.jsx +65 -0
- package/src/OutputsView.jsx +65 -0
- package/src/TerraformView.jsx +57 -0
- package/src/WorkbenchDialogs.jsx +532 -0
- package/src/activity-presentation.mjs +28 -0
- package/src/ai-qualification-scenarios.mjs +31 -0
- package/src/approval-application-files.mjs +32 -0
- package/src/approval-applications.mjs +82 -0
- package/src/approval-spec-kit.mjs +30 -0
- package/src/architecture-activity.css +28 -0
- package/src/architecture-activity.mjs +63 -0
- package/src/architecture-work.mjs +176 -0
- package/src/artifact-work.mjs +103 -0
- package/src/async-documents.mjs +191 -0
- package/src/atflow.css +1140 -0
- package/src/atforma.css +748 -0
- package/src/atmem-tokens.css +79 -0
- package/src/aws-preflight.mjs +60 -0
- package/src/aws-public-faq.mjs +102 -0
- package/src/aws-validation-scenarios.mjs +10 -0
- package/src/aws-validation.mjs +48 -0
- package/src/azure-plan-mocks.mjs +25 -0
- package/src/azure-structured.mjs +133 -0
- package/src/bedrock-summary.mjs +152 -0
- package/src/bounded-rag.mjs +60 -0
- package/src/brand.css +9 -0
- package/src/canvas-view.mjs +28 -0
- package/src/capability-composition.mjs +44 -0
- package/src/chat-attachments.mjs +13 -0
- package/src/cloud-provider-locks.mjs +9 -0
- package/src/cloud-storage-scenarios.mjs +2 -0
- package/src/component-review.mjs +55 -0
- package/src/composition-spec-kit.mjs +30 -0
- package/src/consultation-context.mjs +15 -0
- package/src/consultation.mjs +52 -0
- package/src/container-contracts.mjs +5 -0
- package/src/container-inspection.mjs +75 -0
- package/src/container-runtime.mjs +30 -0
- package/src/container-security-inspection.mjs +49 -0
- package/src/container-terraform.mjs +109 -0
- package/src/conversation.mjs +17 -0
- package/src/core.mjs +863 -0
- package/src/cross-cloud-storage.mjs +100 -0
- package/src/delivery-capabilities.mjs +25 -0
- package/src/delivery.mjs +58 -0
- package/src/deployment-ownership.mjs +10 -0
- package/src/deployment-region.mjs +11 -0
- package/src/derive.mjs +31 -0
- package/src/design-build-flow.mjs +10 -0
- package/src/diagram-attention.mjs +24 -0
- package/src/discovery.mjs +359 -0
- package/src/document.mjs +170 -0
- package/src/emulation-feedback.mjs +61 -0
- package/src/emulation-guidance.mjs +37 -0
- package/src/engagement.mjs +274 -0
- package/src/engineering-client.mjs +73 -0
- package/src/engineering-defaults.mjs +17 -0
- package/src/engineering.css +31 -0
- package/src/enterprise-application.mjs +76 -0
- package/src/enterprise-aws-host-infrastructure.mjs +62 -0
- package/src/enterprise-aws-host-tests.mjs +15 -0
- package/src/enterprise-aws-infrastructure-tests.mjs +38 -0
- package/src/enterprise-aws-infrastructure.mjs +138 -0
- package/src/enterprise-google-infrastructure.mjs +84 -0
- package/src/enterprise-google-tests.mjs +25 -0
- package/src/estimate.mjs +188 -0
- package/src/existing-references.mjs +18 -0
- package/src/external-identities.mjs +17 -0
- package/src/faq-lambda-build.mjs +28 -0
- package/src/gcp-structured.mjs +104 -0
- package/src/generation-provider.mjs +7 -0
- package/src/generation-quality.mjs +69 -0
- package/src/handoff.mjs +141 -0
- package/src/ibm-registry.mjs +12 -0
- package/src/ibm-structured.mjs +103 -0
- package/src/identifiers.mjs +15 -0
- package/src/implementation-map.mjs +14 -0
- package/src/implementation-outcome.mjs +8 -0
- package/src/incomplete-terraform.mjs +9 -0
- package/src/integrations.ts +137 -0
- package/src/interface-contracts.mjs +30 -0
- package/src/invoice-application.mjs +66 -0
- package/src/invoice-aws-operations.mjs +136 -0
- package/src/invoice-aws.mjs +143 -0
- package/src/invoice-azure-operations.mjs +147 -0
- package/src/invoice-azure.mjs +134 -0
- package/src/invoice-builder.mjs +35 -0
- package/src/invoice-dependencies.mjs +43 -0
- package/src/invoice-gcp-operations.mjs +178 -0
- package/src/invoice-gcp.mjs +104 -0
- package/src/invoice-ibm-operations.mjs +278 -0
- package/src/invoice-ibm.mjs +142 -0
- package/src/invoice-operations.mjs +143 -0
- package/src/invoice-plan.mjs +45 -0
- package/src/invoice-region.mjs +6 -0
- package/src/invoice-spec-kit.mjs +61 -0
- package/src/invoice-state.mjs +7 -0
- package/src/invoice-terraform.mjs +29 -0
- package/src/invoice-tests.mjs +122 -0
- package/src/journey-workspace.css +72 -0
- package/src/journey.mjs +87 -0
- package/src/levels.mjs +145 -0
- package/src/local-agent.mjs +184 -0
- package/src/main.jsx +2458 -0
- package/src/model-policy-preflight.mjs +34 -0
- package/src/openai-voice.mjs +102 -0
- package/src/output-bundle.mjs +11 -0
- package/src/ownership-inspection.mjs +28 -0
- package/src/pack.mjs +201 -0
- package/src/pricing.mjs +31 -0
- package/src/production-state.mjs +8 -0
- package/src/project-copy.mjs +10 -0
- package/src/project-file.mjs +160 -0
- package/src/project-links.mjs +3 -0
- package/src/protected-state.mjs +43 -0
- package/src/public-faq-builder.mjs +19 -0
- package/src/public-faq-clouds.mjs +251 -0
- package/src/public-faq.mjs +122 -0
- package/src/pulumi.mjs +123 -0
- package/src/python-container.mjs +25 -0
- package/src/python-runtime.mjs +50 -0
- package/src/rag-handler.mjs +43 -0
- package/src/rag-web-assets.mjs +52 -0
- package/src/rag-web.mjs +68 -0
- package/src/records.mjs +177 -0
- package/src/resources.mjs +163 -0
- package/src/review.mjs +252 -0
- package/src/runtime/EnterpriseDocument.java +89 -0
- package/src/runtime/approved_http_destination.py +72 -0
- package/src/runtime/aws-lambda-qualification-lock.json +7 -0
- package/src/runtime/aws-python-lock.json +82 -0
- package/src/runtime/aws-web-python-lock.json +887 -0
- package/src/runtime/aws_json_model.py +42 -0
- package/src/runtime/azure-python-lock.json +863 -0
- package/src/runtime/azure-sources.json +8 -0
- package/src/runtime/azure-test-lock.json +23 -0
- package/src/runtime/azure_acceptance.py +192 -0
- package/src/runtime/azure_structured.py +153 -0
- package/src/runtime/bounded_rag.py +126 -0
- package/src/runtime/catalog_admin.py +70 -0
- package/src/runtime/cloud-sql-proxy-lock.json +8 -0
- package/src/runtime/cloud-sql-proxy-security-review.json +30 -0
- package/src/runtime/connector_cli.py +50 -0
- package/src/runtime/connector_sync.py +70 -0
- package/src/runtime/durable-python-lock.json +247 -0
- package/src/runtime/durable_workflow.py +325 -0
- package/src/runtime/enterprise-application-manifest.json +110 -0
- package/src/runtime/enterprise-application-sources.json +266 -0
- package/src/runtime/enterprise-auth-python-lock.json +592 -0
- package/src/runtime/enterprise-aws-host-bootstrap-source.json +1 -0
- package/src/runtime/enterprise-aws-host-probe-source.json +1 -0
- package/src/runtime/enterprise-aws-task-template.json +235 -0
- package/src/runtime/enterprise-document-lock.json +18 -0
- package/src/runtime/enterprise-document.Dockerfile +15 -0
- package/src/runtime/enterprise-runtime-aws-python-lock.json +1115 -0
- package/src/runtime/enterprise-runtime-azure-python-lock.json +1106 -0
- package/src/runtime/enterprise-runtime-gcp-python-lock.json +1060 -0
- package/src/runtime/enterprise-runtime-ibm-python-lock.json +1096 -0
- package/src/runtime/enterprise-runtime-python-lock.json +1058 -0
- package/src/runtime/enterprise-runtime.Dockerfile +15 -0
- package/src/runtime/enterprise-web-app.js +1 -0
- package/src/runtime/enterprise-web-entry.js +105 -0
- package/src/runtime/enterprise-web-lock.json +29 -0
- package/src/runtime/enterprise-web-notices.txt +229 -0
- package/src/runtime/enterprise-web.css +4 -0
- package/src/runtime/enterprise-web.html +8 -0
- package/src/runtime/enterprise_audit.py +91 -0
- package/src/runtime/enterprise_audit_schema.sql +25 -0
- package/src/runtime/enterprise_auth_schema.sql +67 -0
- package/src/runtime/enterprise_auth_store.py +241 -0
- package/src/runtime/enterprise_aws_host_bootstrap.py +120 -0
- package/src/runtime/enterprise_aws_host_probe.py +105 -0
- package/src/runtime/enterprise_aws_hosts.py +136 -0
- package/src/runtime/enterprise_aws_jobs.py +300 -0
- package/src/runtime/enterprise_aws_objects.py +93 -0
- package/src/runtime/enterprise_aws_transfer.py +83 -0
- package/src/runtime/enterprise_azure_batch_api.py +128 -0
- package/src/runtime/enterprise_azure_host.py +599 -0
- package/src/runtime/enterprise_azure_jobs.py +294 -0
- package/src/runtime/enterprise_azure_objects.py +234 -0
- package/src/runtime/enterprise_azure_pool.py +161 -0
- package/src/runtime/enterprise_azure_transfer.py +122 -0
- package/src/runtime/enterprise_configuration.py +136 -0
- package/src/runtime/enterprise_document.py +116 -0
- package/src/runtime/enterprise_document_cli.py +32 -0
- package/src/runtime/enterprise_document_contract.py +54 -0
- package/src/runtime/enterprise_document_job.py +109 -0
- package/src/runtime/enterprise_document_jobs.py +122 -0
- package/src/runtime/enterprise_document_jobs_schema.sql +23 -0
- package/src/runtime/enterprise_extraction_cache.py +186 -0
- package/src/runtime/enterprise_extraction_schema.sql +17 -0
- package/src/runtime/enterprise_google_jobs.py +275 -0
- package/src/runtime/enterprise_google_transfer.py +85 -0
- package/src/runtime/enterprise_http.py +212 -0
- package/src/runtime/enterprise_identity.py +52 -0
- package/src/runtime/enterprise_knowledge.py +152 -0
- package/src/runtime/enterprise_models.py +94 -0
- package/src/runtime/enterprise_native.py +181 -0
- package/src/runtime/enterprise_oauth.py +132 -0
- package/src/runtime/enterprise_operator.py +160 -0
- package/src/runtime/enterprise_parser_service.py +136 -0
- package/src/runtime/enterprise_parser_transport.py +68 -0
- package/src/runtime/enterprise_queries.py +255 -0
- package/src/runtime/enterprise_queries_schema.sql +27 -0
- package/src/runtime/enterprise_query_service.py +111 -0
- package/src/runtime/enterprise_secrets.py +110 -0
- package/src/runtime/enterprise_sessions.py +95 -0
- package/src/runtime/enterprise_sources.py +260 -0
- package/src/runtime/enterprise_web.py +39 -0
- package/src/runtime/enterprise_worker.py +68 -0
- package/src/runtime/export_contract_acceptance.py +18 -0
- package/src/runtime/faq-output-contract.json +40 -0
- package/src/runtime/faq-web-app.js +41 -0
- package/src/runtime/faq-web.css +1 -0
- package/src/runtime/faq-web.html +6 -0
- package/src/runtime/gcp-sources.json +9 -0
- package/src/runtime/gcp_acceptance.py +110 -0
- package/src/runtime/gcp_structured.py +150 -0
- package/src/runtime/http_acceptance.py +39 -0
- package/src/runtime/iap-web-app.js +36 -0
- package/src/runtime/iap-web-source.json +1 -0
- package/src/runtime/ibm-python-lock.json +856 -0
- package/src/runtime/ibm-sources.json +9 -0
- package/src/runtime/ibm_acceptance.py +133 -0
- package/src/runtime/ibm_structured.py +113 -0
- package/src/runtime/invoice-azapi-provider-lock.json +7 -0
- package/src/runtime/invoice-ibm-provider-lock.json +7 -0
- package/src/runtime/invoice-parser-lock.json +1199 -0
- package/src/runtime/invoice-parser-python-lock.json +56 -0
- package/src/runtime/invoice-parser.Dockerfile +190 -0
- package/src/runtime/invoice-sources.json +58 -0
- package/src/runtime/invoice-test-sources.json +24 -0
- package/src/runtime/invoice-web.css +2 -0
- package/src/runtime/invoice-web.html +12 -0
- package/src/runtime/invoice-web.js +112 -0
- package/src/runtime/invoice_configuration.py +17 -0
- package/src/runtime/invoice_document.py +95 -0
- package/src/runtime/invoice_extraction.py +96 -0
- package/src/runtime/invoice_http.py +129 -0
- package/src/runtime/invoice_identity.py +5 -0
- package/src/runtime/invoice_maintenance.py +40 -0
- package/src/runtime/invoice_native.py +77 -0
- package/src/runtime/invoice_object_store.py +153 -0
- package/src/runtime/invoice_operations.py +108 -0
- package/src/runtime/invoice_operator.py +79 -0
- package/src/runtime/invoice_operator_core.py +39 -0
- package/src/runtime/invoice_operator_job.py +147 -0
- package/src/runtime/invoice_parser_cli.py +17 -0
- package/src/runtime/invoice_parser_identity.py +39 -0
- package/src/runtime/invoice_parser_service.py +89 -0
- package/src/runtime/invoice_parser_transport.py +89 -0
- package/src/runtime/invoice_processing.py +24 -0
- package/src/runtime/invoice_retention.py +16 -0
- package/src/runtime/invoice_runtime_secrets.py +43 -0
- package/src/runtime/invoice_stage.py +80 -0
- package/src/runtime/invoice_web.py +39 -0
- package/src/runtime/invoice_worker.py +50 -0
- package/src/runtime/lambda_faq.py +5 -0
- package/src/runtime/parser-requirements.lock +4 -0
- package/src/runtime/policy_review.py +18 -0
- package/src/runtime/postgres-qualification-lock.json +21 -0
- package/src/runtime/public-faq-sources.json +22 -0
- package/src/runtime/public_catalog_admin.py +122 -0
- package/src/runtime/public_catalog_store.py +125 -0
- package/src/runtime/public_faq.py +144 -0
- package/src/runtime/public_faq_app.py +49 -0
- package/src/runtime/python-container-lock.json +18 -0
- package/src/runtime/rag-sources.json +10 -0
- package/src/runtime/rag_acceptance.py +60 -0
- package/src/runtime/rag_aws_adapter.py +95 -0
- package/src/runtime/rds-ca-source.json +9 -0
- package/src/runtime/rds-global-ca.pem +2888 -0
- package/src/runtime/state-contract-check-source.json +4 -0
- package/src/runtime/state_contract_check.py +338 -0
- package/src/runtime/structured-source.json +1 -0
- package/src/runtime/structured-web-app.js +71 -0
- package/src/runtime/structured-web-source.json +1 -0
- package/src/runtime/structured_http.py +105 -0
- package/src/runtime/structured_output.py +48 -0
- package/src/runtime/web-python-lock.json +802 -0
- package/src/runtime/web_user_admin.py +44 -0
- package/src/runtime/workflow_application.py +62 -0
- package/src/runtime/workflow_bindings.py +128 -0
- package/src/runtime/workflow_configuration.py +40 -0
- package/src/runtime/workflow_connection.py +105 -0
- package/src/runtime/workflow_contract.py +54 -0
- package/src/runtime/workflow_database.py +94 -0
- package/src/runtime/workflow_errors.py +6 -0
- package/src/runtime/workflow_http.py +178 -0
- package/src/runtime/workflow_identity.py +69 -0
- package/src/runtime/workflow_payload.py +118 -0
- package/src/runtime/workflow_process_stage.py +88 -0
- package/src/runtime/workflow_profile.py +91 -0
- package/src/runtime/workflow_review.py +106 -0
- package/src/runtime/workflow_role_bootstrap.py +104 -0
- package/src/runtime/workflow_schema.sql +72 -0
- package/src/runtime/workflow_worker.py +142 -0
- package/src/runtime-settings.mjs +15 -0
- package/src/s3-access.mjs +14 -0
- package/src/source-contracts.mjs +17 -0
- package/src/spec-kit.mjs +186 -0
- package/src/state-custody.mjs +32 -0
- package/src/state-inspection.mjs +45 -0
- package/src/state-spec-kit.mjs +13 -0
- package/src/storage-tests.mjs +25 -0
- package/src/structured-api.mjs +133 -0
- package/src/structured-contract.mjs +19 -0
- package/src/structured-operation-policy.mjs +2 -0
- package/src/structured-web.mjs +17 -0
- package/src/style.css +1 -0
- package/src/system-description.mjs +26 -0
- package/src/terraform-admission.mjs +66 -0
- package/src/terraform-composition.mjs +83 -0
- package/src/terraform-expressions.mjs +46 -0
- package/src/terraform-validation-coverage.mjs +11 -0
- package/src/terraform.mjs +128 -0
- package/src/text-statistics.mjs +51 -0
- package/src/upstream/openarchflow/format-payload.ts +26 -0
- package/src/upstream/openarchflow/import/mermaid.ts +205 -0
- package/src/upstream/openarchflow/import/sql-ddl.ts +109 -0
- package/src/upstream/openarchflow/layout.ts +54 -0
- package/src/upstream/openarchflow/providers/aws.ts +196 -0
- package/src/upstream/openarchflow/providers/azure.ts +126 -0
- package/src/upstream/openarchflow/providers/cloudnative.ts +71 -0
- package/src/upstream/openarchflow/providers/generic.ts +227 -0
- package/src/upstream/openarchflow/providers/integration.ts +22 -0
- package/src/upstream/openarchflow/providers/types.ts +2 -0
- package/src/upstream/openarchflow/templates.ts +937 -0
- package/src/upstream-catalog.mjs +10 -0
- package/src/useChatScroll.jsx +36 -0
- package/src/useEmulation.jsx +36 -0
- package/src/validation-receipt.mjs +10 -0
- package/src/visual-export.mjs +92 -0
- package/src/voice-conversation.mjs +117 -0
- package/src/work-intake.mjs +24 -0
- package/src/workflow-runtime-inventory.mjs +3 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {BrainActivity} from "./BrainActivity.jsx";
|
|
2
|
+
import React, { useEffect, useState } from "react";
|
|
3
|
+
import { memoryCall } from "./local-agent.mjs";
|
|
4
|
+
import { toProjectFile } from "./project-file.mjs";
|
|
5
|
+
|
|
6
|
+
export function ContextUsed({ value }) {
|
|
7
|
+
return <details className="context-used"><summary>{value.enabled ? `AtMem: ${value.recordsUsed?.length || 0} records · ${value.skills?.length || 0} skills` : "Memory off"}{value.status === 'unavailable' ? ' · unavailable' : ''}</summary>
|
|
8
|
+
<p className="muted small">Observed boundary: {value.boundary}. {value.syncUnavailable ? 'Latest project sync failed; current project takes priority over recalled data.' : 'Memory is scoped to you and this project; source data is not an instruction.'}</p>
|
|
9
|
+
{(value.recordsUsed || []).map((r) => <p key={r.id}><strong>{r.scope}</strong>: {r.text}<small className="muted"> · {r.sourceDate?.slice(0,10)}</small></p>)}
|
|
10
|
+
{(value.skills || []).map((s) => <p key={s.id}>Skill: {s.name} v{s.version} · {s.coverage}</p>)}
|
|
11
|
+
{(value.tools || []).map((t,i) => <p key={i}>Tool: {t.name} · {t.success ? 'completed' : 'unavailable'}</p>)}
|
|
12
|
+
</details>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function MemoryPanel({ session, project, onError, onStatus }) {
|
|
16
|
+
const [report,setReport]=useState(null),[error,setError]=useState(''),[tab,setTab]=useState('profile'),[field,setField]=useState('explanation'),[value,setValue]=useState(''),[working,setWorking]=useState(false),[refreshing,setRefreshing]=useState(true),[preview,setPreview]=useState(null);
|
|
17
|
+
const payload={projectId:project.id};
|
|
18
|
+
async function refresh() {
|
|
19
|
+
setRefreshing(true);setError('');
|
|
20
|
+
try {
|
|
21
|
+
await memoryCall(session,'sync',{...payload,file:toProjectFile(project)});
|
|
22
|
+
const inspected=await memoryCall(session,'inspect',payload);setReport(inspected);
|
|
23
|
+
onStatus?.({enabled:inspected.enabled,status:inspected.status,pending:inspected.pending,rejected:inspected.rejected,engine:inspected.engine});
|
|
24
|
+
} catch(e) { setError(e.message); } finally {setRefreshing(false);}
|
|
25
|
+
}
|
|
26
|
+
useEffect(()=>{refresh();},[project.id,session?.token]);
|
|
27
|
+
async function act(fn) { setWorking(true);setError('');try{await fn();await refresh();}catch(e){setError(e.message);onError?.(e.message);}finally{setWorking(false);} }
|
|
28
|
+
const records=report?.[tab] || [];
|
|
29
|
+
return <div className="memory-panel">
|
|
30
|
+
<h2>AtMem dashboard</h2>
|
|
31
|
+
<p className="muted small">Durable preferences and confirmed decisions only. Drafts, canvas comments and routine edits stay in your project; they do not become long-term memory.</p>
|
|
32
|
+
{(working||refreshing)&&<p role="status"><BrainActivity/> Updating memory…</p>}
|
|
33
|
+
{error && <p className="error-box" role="alert">{error}</p>}
|
|
34
|
+
{!report ? <button className="btn" onClick={refresh}>Retry memory connection</button> : <>
|
|
35
|
+
<div className="row"><span className={report.status==='unavailable'?'warn-text':'muted'}>{report.enabled ? report.status==='unavailable'?'Memory unavailable — project only':`${report.engine} · connected` : 'Memory off for this project'}</span><span className="small">{report.pending} pending · {report.rejected} rejected</span><button className="btn ghost" disabled={working} onClick={()=>act(async()=>{await memoryCall(session,'settings',{...payload,enabled:!report.enabled});})}>{report.enabled?'Turn memory off':'Turn memory on'}</button></div>
|
|
36
|
+
<p className="muted small">Policy: {report.policy}. Corrections supersede earlier values. Forget explicitly removes the selected memory and its history; project files remain separate.</p>
|
|
37
|
+
<div className="seg" role="tablist" aria-label="Memory views">{[['profile','About you'],['project','This project'],['skills','Skills'],['activity','Activity']].map(([id,label])=><button key={id} role="tab" aria-selected={tab===id} className={tab===id?'on':''} onClick={()=>{setTab(id);setPreview(null);}}>{label}</button>)}</div>
|
|
38
|
+
{tab==='profile' && <form className="memory-profile" onSubmit={e=>{e.preventDefault();act(async()=>{await memoryCall(session,'profile',{...payload,field,value});setValue('');});}}><label className="field">Preference<select aria-label="Preference type" value={field} onChange={e=>setField(e.target.value)}><option value="explanation">How to explain things</option><option value="experience">Experience and role</option><option value="iac">Infrastructure tool preference</option><option value="preferences">Other confirmed preferences</option></select></label><label className="field">What should AtMem AI Architect remember?<textarea aria-label="Remember about me" value={value} maxLength={1000} onChange={e=>setValue(e.target.value)} placeholder="For example: explain things concisely; I prefer Pulumi." /></label><button className="btn primary" disabled={working||!report.enabled||!value.trim()}>Remember preference</button></form>}
|
|
39
|
+
{(tab==='profile'||tab==='project') && <><div className="resource-schedule">{records.map(r=><article key={r.id}><strong>{r.status==='active'?'Current':'Earlier value'} · {r.fact_key}</strong><span>{r.content}</span><small>{r.created_at?.slice(0,10)} · {r.id}</small>{r.status==='active' && <button className="btn ghost" disabled={working} onClick={()=>act(async()=>setPreview({...(await memoryCall(session,'forget-preview',{...payload,scope:tab==='profile'?'user':'project',recordId:r.id})),scope:tab==='profile'?'user':'project',recordId:r.id}))}>Preview forget</button>}</article>)}</div>{!records.length&&<p className="muted">No memories recorded in this view yet.</p>}</>}
|
|
40
|
+
{preview && <section className="memory-preview"><h3>Review removal</h3><p>{preview.notice}</p><p>{preview.records.length} current/historical records will be removed.</p><button className="btn danger" disabled={working} onClick={()=>act(async()=>{await memoryCall(session,'forget',{...payload,scope:preview.scope,recordId:preview.recordId});setPreview(null);})}>Confirm forget</button><button className="btn ghost" onClick={()=>setPreview(null)}>Keep memory</button></section>}
|
|
41
|
+
{tab==='skills' && <div className="resource-schedule">{report.skills.map(s=><article key={s.id}><strong>{s.name} v{s.version}</strong><small>{s.coverage} · integrity {s.integrity?'verified':'failed'}</small><span>{s.source.startsWith('https:')?<a href={s.source} target="_blank" rel="noreferrer">Pinned source</a>:s.source}</span><small>SHA256: {s.digest.slice(0,16)}… · tools: {s.tools.join(', ')}</small><button className="btn ghost" disabled={working||!s.integrity} onClick={()=>act(async()=>memoryCall(session,'skill',{...payload,skillId:s.id,enabled:!s.enabled}))}>{s.enabled?'Disable':'Enable'} {s.id}</button></article>)}<p className="muted small">Upstream files are pinned references with their licences. Missing companion files and cloud tool packages are not activated. AtMem AI Architect loads its reviewed specialist guidance; no bundled scripts run.</p></div>}
|
|
42
|
+
{tab==='activity' && <div className="resource-schedule">{report.activity.map(a=><article key={a.id}><strong>{a.success?'Architect turn completed':'Turn did not complete'} · {a.createdAt.slice(0,19)}</strong><span>{a.recordIds.length} memory records · skills: {a.skillIds.join(', ')}</span><small>{a.boundary} · context digest {a.contextDigest.slice(0,16)}…</small>{a.tools.map((t,i)=><small key={i}>{t.name}: {t.success?'completed':'unavailable'}</small>)}</article>)}{!report.activity.length&&<p className="muted">No recorded architect turns for this project yet.</p>}</div>}
|
|
43
|
+
<button className="btn ghost" disabled={working} onClick={()=>act(refresh)}>Refresh / retry pending sync</button>
|
|
44
|
+
</>}
|
|
45
|
+
</div>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React,{useEffect,useRef,useState} from 'react';
|
|
2
|
+
import {OpenAIVoice} from './openai-voice.mjs';
|
|
3
|
+
|
|
4
|
+
export function OpenAIVoicePanel({session,connection,transportRef,onTranscript,onStart,onConnections}){
|
|
5
|
+
const [status,setStatus]=useState(null),[phase,setPhase]=useState('off'),[error,setError]=useState(''),[key,setKey]=useState(''),[saving,setSaving]=useState(false),[automatic,setAutomatic]=useState(false),[readReplies,setReadReplies]=useState(true),[open,setOpen]=useState(false);
|
|
6
|
+
const props=useRef({onTranscript,onStart,automatic});props.current={onTranscript,onStart,automatic};
|
|
7
|
+
const engine=useRef(null),live=useRef(true);
|
|
8
|
+
const active=!['off','error'].includes(phase);
|
|
9
|
+
async function refresh(){
|
|
10
|
+
const response=await fetch('/api/voice/openai/status');
|
|
11
|
+
if(!response.ok)throw Error('The voice service is unavailable. Check the Architect server.');
|
|
12
|
+
const body=await response.json();if(live.current)setStatus(body);
|
|
13
|
+
}
|
|
14
|
+
useEffect(()=>{
|
|
15
|
+
live.current=true;setPhase('off');void refresh().catch(e=>{if(live.current)setError(e.message)});
|
|
16
|
+
return()=>{live.current=false;engine.current?.stop();if(transportRef.current===engine.current)transportRef.current=null;};
|
|
17
|
+
},[session.token]);
|
|
18
|
+
async function configure(){
|
|
19
|
+
setSaving(true);setError('');
|
|
20
|
+
try{
|
|
21
|
+
const response=await fetch('/api/voice/openai/credentials',{method:'POST',headers:{Authorization:`Bearer ${session.token}`,'Content-Type':'application/json'},body:JSON.stringify({key})});
|
|
22
|
+
if(!response.ok)throw Error('The voice key could not be configured. Check the server connection.');
|
|
23
|
+
setKey('');await refresh();
|
|
24
|
+
}catch(e){setError(e.message)}finally{setSaving(false)}
|
|
25
|
+
}
|
|
26
|
+
function start(){
|
|
27
|
+
if(active||!status?.available||!connection)return;
|
|
28
|
+
props.current.onStart?.();setError('');engine.current?.stop();
|
|
29
|
+
const current=new OpenAIVoice({session,
|
|
30
|
+
onState:value=>{if(live.current)setPhase(value)},onError:value=>{if(live.current)setError(value)},
|
|
31
|
+
onTranscript:(text,meta)=>{
|
|
32
|
+
if(props.current.automatic&&!meta.ordered){setAutomatic(false);setError('Automatic sending paused. Review the retained transcript in chat.');}
|
|
33
|
+
props.current.onTranscript(text,props.current.automatic&&meta.ordered);
|
|
34
|
+
}});
|
|
35
|
+
current.readReplies=readReplies;engine.current=current;transportRef.current=current;void current.start().then(()=>{if(live.current&¤t.channel?.readyState==='open')setOpen(false)});
|
|
36
|
+
}
|
|
37
|
+
const caption={off:'Voice is off. Local dictation remains available from the microphone button.',connecting:'Connecting OpenAI audio…',listening:automatic?'Listening — completed turns go to your selected Architect. Existing drafts remain for review.':'Listening — review the transcript in chat, then Send.',speaking:'Speaking the written Architect reply.',error:'Voice stopped; continue in text or retry.'}[phase];
|
|
38
|
+
return <>
|
|
39
|
+
<div className="voice-status"><button type="button" onClick={()=>setOpen(true)}>OpenAI voice</button>{active&&<button type="button" onClick={()=>engine.current?.stop({preservePending:true})}>Stop OpenAI voice</button>}{active&&error.includes('playback')&&<button type="button" onClick={()=>void engine.current?.resumeAudio()}>Enable voice playback</button>}{(active||error)&&<span role="status">{error||caption}</span>}</div>
|
|
40
|
+
{open&&<div className="backdrop" onMouseDown={event=>{if(event.target===event.currentTarget)setOpen(false)}}><section className="modal" role="dialog" aria-modal="true" aria-label="OpenAI voice" onKeyDown={event=>{if(event.key==='Escape'){event.stopPropagation();setOpen(false)}}}>
|
|
41
|
+
<h2>OpenAI voice</h2><button type="button" className="btn ghost" onClick={()=>setOpen(false)}>Close voice settings</button>
|
|
42
|
+
<section aria-label="OpenAI voice settings">
|
|
43
|
+
<p>Voice preview — live OpenAI audio verification is pending.</p>
|
|
44
|
+
<p>AI-generated audio from OpenAI. Microphone audio and spoken reply text are sent to OpenAI. Architect does not save the audio. Written chat remains the source for design decisions.</p>
|
|
45
|
+
<p>Architecture answers still use {connection?`${connection.model}${connection.effort?' · '+connection.effort:''}`:'your selected Architect'}. The audio model is {status?.model||'loading'}.</p>
|
|
46
|
+
{!connection&&<button type="button" className="btn" onClick={()=>{setOpen(false);onConnections()}}>Choose Architect connection</button>}
|
|
47
|
+
{status&&<details open={!status.available}><summary>Voice API setup</summary>
|
|
48
|
+
<p>Configure a dedicated OpenAI API key for voice. Your Architect connection stays unchanged. The server keeps this key in memory for its current session. An existing server OpenAI key can also be used.</p>
|
|
49
|
+
<label className="dialog-field">OpenAI voice API key<input aria-label="OpenAI voice API key" type="password" autoComplete="off" value={key} onChange={event=>setKey(event.target.value)}/></label>
|
|
50
|
+
<button type="button" className="btn" disabled={saving||active||!key.trim()} onClick={configure}>Configure voice key</button>
|
|
51
|
+
</details>}
|
|
52
|
+
<button type="button" className="link" disabled={saving} onClick={()=>void refresh().catch(e=>setError(e.message))}>Check voice connection</button>
|
|
53
|
+
<div className="record-row">
|
|
54
|
+
<button type="button" className="btn" disabled={!status?.available||!connection} onClick={active?()=>engine.current?.stop({preservePending:true}):start}>{active?'Stop OpenAI voice':'Start OpenAI voice'}</button>
|
|
55
|
+
{active&&<button type="button" className="btn" onClick={()=>engine.current?.interrupt()}>Stop speaking</button>}
|
|
56
|
+
{active&&error.includes('playback')&&<button type="button" className="btn" onClick={()=>void engine.current?.resumeAudio()}>Enable voice playback</button>}
|
|
57
|
+
</div>
|
|
58
|
+
<p><label><input type="checkbox" checked={automatic} onChange={event=>setAutomatic(event.target.checked)}/> Send spoken turns automatically</label></p>
|
|
59
|
+
<p><label><input type="checkbox" checked={readReplies} onChange={event=>{setReadReplies(event.target.checked);if(engine.current){engine.current.readReplies=event.target.checked;if(!event.target.checked)engine.current.interrupt();}}}/> Speak Architect replies</label></p>
|
|
60
|
+
<p role="status">{caption}</p>
|
|
61
|
+
{error&&<p role="alert">{error}</p>}
|
|
62
|
+
</section>
|
|
63
|
+
</section></div>}
|
|
64
|
+
</>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {CodePreview} from './CodePreview.jsx';
|
|
2
|
+
import {BrainActivity} from "./BrainActivity.jsx";
|
|
3
|
+
import React,{useEffect,useState} from 'react';
|
|
4
|
+
import {EmulationPanel} from './EmulationPanel.jsx';
|
|
5
|
+
import {outputBundle} from './output-bundle.mjs';
|
|
6
|
+
import {ImplementationDelivery} from './ImplementationDelivery.jsx';
|
|
7
|
+
|
|
8
|
+
// Render generated Markdown as text elements, never executable HTML.
|
|
9
|
+
function Document({text}){
|
|
10
|
+
const lines=text.split('\n'),blocks=[];let paragraph=[],list=[],ordered=false,code=null;
|
|
11
|
+
const clean=s=>s.replace(/\*\*|`/g,'');
|
|
12
|
+
function flush(){if(paragraph.length){blocks.push(<p key={blocks.length}>{clean(paragraph.join(' '))}</p>);paragraph=[];}if(list.length){const List=ordered?'ol':'ul';blocks.push(<List key={blocks.length}>{list.map((line,i)=><li key={i}>{clean(line)}</li>)}</List>);list=[];}}
|
|
13
|
+
for(const line of lines){
|
|
14
|
+
if(line.startsWith('```')){flush();if(code!==null){blocks.push(<pre key={blocks.length}>{code.join('\n')}</pre>);code=null;}else code=[];continue;}
|
|
15
|
+
if(code!==null){code.push(line);continue;}
|
|
16
|
+
const heading=line.match(/^(#{1,6})\s+(.+)/);
|
|
17
|
+
if(heading){flush();const Tag=`h${Math.min(heading[1].length+1,6)}`;blocks.push(<Tag key={blocks.length}>{heading[2]}</Tag>);}
|
|
18
|
+
else if(/^\s*([-*]|\d+\.)\s/.test(line)){const nextOrdered=/^\s*\d+\./.test(line);if(paragraph.length||(list.length&&ordered!==nextOrdered))flush();ordered=nextOrdered;list.push(line.replace(/^\s*([-*]|\d+\.)\s/,''));}
|
|
19
|
+
else if(line.startsWith('|')){flush();if(!/^\|[- :|]+\|$/.test(line))blocks.push(<p className="output-table-row" key={blocks.length}>{clean(line)}</p>);}
|
|
20
|
+
else if(!line.trim())flush();else paragraph.push(line.replace(/^> /,''));
|
|
21
|
+
}
|
|
22
|
+
flush();return <article className="output-document">{blocks}</article>;
|
|
23
|
+
}
|
|
24
|
+
function Preview({name,content}){
|
|
25
|
+
const [url,setUrl]=useState(null);
|
|
26
|
+
const visual=/\.(pdf|png|svg)$/.test(name);
|
|
27
|
+
useEffect(()=>{
|
|
28
|
+
if(!visual){setUrl(null);return;}
|
|
29
|
+
const type=name.endsWith('.pdf')?'application/pdf':name.endsWith('.svg')?'image/svg+xml':'image/png';
|
|
30
|
+
const next=URL.createObjectURL(new Blob([content],{type}));setUrl(next);return ()=>URL.revokeObjectURL(next);
|
|
31
|
+
},[name,content,visual]);
|
|
32
|
+
if(visual)return !url?<p role="status"><BrainActivity/> Preparing preview…</p>:name.endsWith('.pdf')?<iframe className="output-pdf" src={url} title={`Preview ${name}`}/>:<img className="output-image" src={url} alt={`Preview ${name}`}/>;
|
|
33
|
+
if(name.endsWith('.md'))return <Document text={content}/>;
|
|
34
|
+
return <CodePreview className="output-code" content={content} name={name}/>;
|
|
35
|
+
}
|
|
36
|
+
export function OutputsView({project,run,environment,session,onDownload,onBack,emulation,onDiscuss,discussionBusy,onBuild,onSave}){
|
|
37
|
+
const [bundle,setBundle]=useState(null),[error,setError]=useState(''),[loading,setLoading]=useState(true),[retry,setRetry]=useState(0),[selected,setSelected]=useState('spec-kit/implementation-spec.md');
|
|
38
|
+
useEffect(()=>{
|
|
39
|
+
let active=true;setLoading(true);setError('');
|
|
40
|
+
outputBundle(project,run,environment).then(value=>{if(active){setBundle(value);setLoading(false);}}).catch(e=>{if(active){setError(e.message);setLoading(false);}});
|
|
41
|
+
return ()=>{active=false;};
|
|
42
|
+
},[project,run,environment,retry]);
|
|
43
|
+
const readiness=bundle?.files['spec-kit/readiness.json']?JSON.parse(bundle.files['spec-kit/readiness.json']):null;
|
|
44
|
+
const groups=bundle?[['Spec Kit',Object.keys(bundle.files).filter(n=>n.startsWith('spec-kit/')).sort((a,b)=>Number(b.includes('implementation-spec'))-Number(a.includes('implementation-spec')))],['Specification & handoff',Object.keys(bundle.files).filter(n=>!n.includes('/')&&!/^diagram\./.test(n))],['Design',Object.keys(bundle.files).filter(n=>/^diagram\./.test(n))],['Terraform',Object.keys(bundle.files).filter(n=>n.startsWith('terraform/'))]]:[];
|
|
45
|
+
return <section className="doc outputs-view" aria-label="Outputs">
|
|
46
|
+
<header className="doc-head"><h2>Delivery</h2><p className="muted">Browse the requirements, design, infrastructure and recorded checks. After generation in Review, download one complete project package here.</p></header>
|
|
47
|
+
<button className="link" onClick={onBack}>Back to architecture</button>
|
|
48
|
+
{session?.engineeringEnabled&&<ImplementationDelivery key={project.id} project={project} session={session} onBuild={onBuild} onSave={onSave} contextBusy={discussionBusy}/>}
|
|
49
|
+
<details open={!session?.engineeringEnabled}><summary>Design draft: requirements, Spec Kit and infrastructure</summary>
|
|
50
|
+
<p>Reference documents from the current design. The final package above retains both the submitted design and the latest saved design, with any differences identified.</p>
|
|
51
|
+
{!session?.engineeringEnabled&&<><p>Implementation generation is unavailable in this session. This package contains the design and engineering tasks; it does not contain a verified application.</p><button className="btn" disabled={!bundle||loading||!!error} onClick={()=>onDownload(bundle)}>Download design package (ZIP)</button></>}
|
|
52
|
+
|
|
53
|
+
{loading&&<p role="status"><BrainActivity/> Preparing the current outputs…</p>}
|
|
54
|
+
{error&&<div role="alert"><p>{error}</p><button className="btn" onClick={()=>setRetry(n=>n+1)}>Retry preparing outputs</button></div>}
|
|
55
|
+
{bundle&&!loading&&!error&&<>
|
|
56
|
+
<p className="muted small">Design r{bundle.manifest.designRevision} · {Object.keys(bundle.files).length} files · Generated {new Date(bundle.manifest.generatedAt).toLocaleString()}. Changes to the project refresh this directory. Download contains these exact files.</p>
|
|
57
|
+
{readiness&&<aside aria-label="Handoff readiness"><strong>Engineering handoff — decisions and implementation remain</strong><p>{readiness.counts.priorityDecisions} priority decisions · {readiness.counts.generatedFoundations} generated foundations / {readiness.counts.components} logical components</p><p>Next: {readiness.nextAction}</p><button className="link" onClick={()=>setSelected('spec-kit/readiness.md')}>Review handoff gaps</button></aside>}
|
|
58
|
+
<div className="outputs-browser" data-snapshot-id={bundle.manifest.snapshotId}>
|
|
59
|
+
<nav className="outputs-directory" aria-label="Output files">{groups.map(([title,names])=><details key={title} open><summary>{title}</summary>{names.map(name=><button type="button" key={name} aria-current={selected===name?'page':undefined} onClick={()=>setSelected(name)} title={name}>{name.includes('/')?name.split('/').at(-1):name}</button>)}</details>)}</nav>
|
|
60
|
+
<div className="output-preview" aria-label="Output preview"><h3>{selected}</h3>{bundle.files[selected]!==undefined&&<Preview key={selected} name={selected} content={bundle.files[selected]}/>}</div>
|
|
61
|
+
</div>
|
|
62
|
+
</>}
|
|
63
|
+
</details>
|
|
64
|
+
</section>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {CodePreview} from './CodePreview.jsx';
|
|
2
|
+
import {moduleValidationCoverage} from './terraform-validation-coverage.mjs';
|
|
3
|
+
import {generationQuality} from './generation-quality.mjs';
|
|
4
|
+
import {BrainActivity} from "./BrainActivity.jsx";
|
|
5
|
+
import React, {useEffect, useMemo, useRef, useState} from 'react';
|
|
6
|
+
import {EmulationPanel} from './EmulationPanel.jsx';
|
|
7
|
+
import {terraformSketch} from './terraform.mjs';
|
|
8
|
+
import {resourcePlan} from './resources.mjs';
|
|
9
|
+
import {toProjectFile} from './project-file.mjs';
|
|
10
|
+
|
|
11
|
+
export function TerraformView({project,environment,session,onDelivery,onBack,emulation,onDiscuss,discussionBusy,onBuild}){
|
|
12
|
+
const files=useMemo(()=>terraformSketch(project,environment),[project,environment]);
|
|
13
|
+
const plan=useMemo(()=>resourcePlan(project),[project]);
|
|
14
|
+
const [file,setFile]=useState('main.tf.json'),[step,setStep]=useState('code'),[result,setResult]=useState(null),[running,setRunning]=useState(false);
|
|
15
|
+
const controller=useRef(null);
|
|
16
|
+
const key=JSON.stringify(files);
|
|
17
|
+
useEffect(()=>{setResult(null);setRunning(false);controller.current?.abort();controller.current=null;return ()=>{controller.current?.abort();controller.current=null;};},[key]);
|
|
18
|
+
async function test(){
|
|
19
|
+
if(running)return;
|
|
20
|
+
const request=new AbortController();controller.current=request;setRunning(true);setResult(null);
|
|
21
|
+
const timer=setTimeout(()=>request.abort(),500000);
|
|
22
|
+
try{
|
|
23
|
+
toProjectFile(project);
|
|
24
|
+
if(!session?.token)throw Error('Connect the local service before running Terraform validation.');
|
|
25
|
+
const response=await fetch('/api/terraform/validate',{method:'POST',headers:{'Content-Type':'application/json',Authorization:`Bearer ${session.token}`},body:JSON.stringify({project,environment}),signal:request.signal});
|
|
26
|
+
const body=await response.json();if(!response.ok)throw Error(typeof body.detail==='string'?body.detail:'Terraform validation failed.');
|
|
27
|
+
if(!request.signal.aborted)setResult({...moduleValidationCoverage(body,quality.modules),filesKey:key});
|
|
28
|
+
}catch(e){if(!request.signal.aborted)setResult({status:'failed',message:e.message,checks:[]});else if(controller.current===request)setResult({status:'failed',message:'Validation stopped or timed out; no success was recorded.',checks:[]});}
|
|
29
|
+
finally{clearTimeout(timer);if(controller.current===request)setRunning(false);}
|
|
30
|
+
}
|
|
31
|
+
const quality=useMemo(()=>generationQuality(project,plan,files),[project,plan,files]);
|
|
32
|
+
const gaps=JSON.parse(files['main.tf.json']).locals.unfinished_work;
|
|
33
|
+
return <section className="doc terraform-view" aria-label="Terraform">
|
|
34
|
+
<header className="doc-head"><h2>Generated infrastructure</h2><p className="muted">Review generated resources, required integrations and the evidence for this configuration. Provider-specific capabilities and their limits are recorded in the export.</p></header>
|
|
35
|
+
<div className="row"><button className="link" onClick={onBack}>Back to architecture</button><button className="btn" onClick={onDelivery}>Continue to Delivery</button></div>
|
|
36
|
+
<aside aria-label="Export quality"><strong>{quality.infrastructureComplete?'Infrastructure generated — validation required':'Implementation work remains'}</strong><p>{quality.providers.join(', ')||'No deployment provider selected'} · {quality.components.length} components · {quality.findings.length} coverage findings</p><p className="small">{result?.status==='passed'&&result.filesKey===key?'Current configuration checks passed. These checks apply to this configuration.':'No current validation receipt is attached. Run Terraform checks to generate evidence for these files.'} Application behavior and account deployment require their own tests.</p></aside>
|
|
37
|
+
|
|
38
|
+
<div className="seg" role="tablist" aria-label="Terraform steps"><button role="tab" aria-selected={step==='code'} onClick={()=>setStep('code')}>1. Resources & code</button><button role="tab" aria-selected={step==='test'} onClick={()=>setStep('test')}>2. Test Terraform</button></div>
|
|
39
|
+
{step==='code'?<>
|
|
40
|
+
<h3>Resource coverage</h3>
|
|
41
|
+
{plan.rows.map(r=><p key={r.id||r.address}><strong>{r.label||r.service}</strong> — {r.terraform}<br/><small>{r.provider} · {r.region}</small></p>)}
|
|
42
|
+
{!!plan.gaps.length&&<details><summary>{plan.gaps.length} implementation gaps</summary><ul>{plan.gaps.map((g,i)=><li key={i}>{g}</li>)}</ul></details>}
|
|
43
|
+
<div className="row" aria-label="Terraform files">{Object.keys(files).map(name=><button className="btn" key={name} aria-pressed={file===name} onClick={()=>setFile(name)}>{name}</button>)}</div>
|
|
44
|
+
<CodePreview className="terraform-code" name={file} content={files[file]}/>
|
|
45
|
+
<button className="btn primary" onClick={()=>setStep('test')}>Continue to Test Terraform →</button>
|
|
46
|
+
</>:<>
|
|
47
|
+
<h3>Test this Terraform draft</h3>
|
|
48
|
+
<p>Checks the generated configuration against Terraform and the provider schema, then runs available generated application tests and mock-provider plans. Provider initialization downloads the official provider if needed; it uses a temporary directory with no cloud credentials or backend.</p>
|
|
49
|
+
<p><strong>Resource and integration coverage: {gaps.length?'Incomplete':'No recorded gaps'}</strong>{gaps.length?` — ${gaps.length} unfinished tasks block a deployment plan.`:''}</p>
|
|
50
|
+
<button className="btn primary" disabled={running} onClick={test}>{running?'Testing Terraform…':'Run Terraform checks'}</button>
|
|
51
|
+
{running&&<p role="status"><BrainActivity/> Initializing providers, validating configuration and running generated local tests. This may take a few minutes.</p>}
|
|
52
|
+
{result&&<div role="status"><h3>{result.status==='passed'?'Configuration validated':result.status==='unavailable'?'Terraform validation not run':result.status==='incomplete'?'Validation incomplete':'Validation failed'}</h3><p>{result.message}</p>{result.checks?.map((c,i)=><details key={i}><summary>{c.passed?'Passed':'Failed'}: {c.name}</summary><pre className="terraform-code">{c.output}</pre></details>)}</div>}
|
|
53
|
+
<h3>Cloud deployment plan — not run</h3><p>A real plan must verify the selected account, region, permissions and proposed changes. Cloud access is not connected. Passing these checks does not prove a real deployment or live application behavior.</p>
|
|
54
|
+
<button className="btn" disabled>Run cloud plan (under development)</button>
|
|
55
|
+
</>}
|
|
56
|
+
</section>;
|
|
57
|
+
}
|