create-windy 0.5.2 → 0.6.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/dist/cli.js +370 -156
- package/package.json +2 -1
- package/template/.windy-template.json +2 -2
- package/template/apps/agent-server/README.md +25 -6
- package/template/apps/agent-server/src/southwind_agent_server/adk_adapter.py +15 -2
- package/template/apps/agent-server/src/southwind_agent_server/app.py +13 -34
- package/template/apps/agent-server/src/southwind_agent_server/config.py +49 -0
- package/template/apps/agent-server/src/southwind_agent_server/contracts.py +13 -0
- package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +31 -0
- package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +5 -0
- package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +50 -0
- package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +11 -2
- package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +3 -9
- package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +5 -0
- package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +37 -0
- package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +64 -0
- package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +59 -0
- package/template/apps/agent-server/src/southwind_agent_server/service.py +42 -43
- package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +4 -0
- package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +31 -0
- package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +34 -0
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +11 -0
- package/template/apps/agent-server/src/southwind_agent_server/store.py +6 -0
- package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +87 -0
- package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +28 -0
- package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +247 -0
- package/template/apps/agent-server/tests/test_api.py +16 -3
- package/template/apps/agent-server/tests/test_openai_provider.py +21 -4
- package/template/apps/agent-server/tests/test_postgres_store.py +3 -0
- package/template/apps/agent-server/tests/test_run_capacity.py +110 -0
- package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +37 -0
- package/template/apps/agent-server/tests/test_sqlite_store.py +3 -0
- package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +72 -0
- package/template/apps/agent-server/tests/test_vlm_readiness.py +106 -0
- package/template/apps/document-server/src/southwind_document_server/adapter.py +117 -205
- package/template/apps/document-server/src/southwind_document_server/adapter_errors.py +13 -0
- package/template/apps/document-server/src/southwind_document_server/app.py +62 -14
- package/template/apps/document-server/src/southwind_document_server/artifacts.py +27 -0
- package/template/apps/document-server/src/southwind_document_server/config.py +96 -2
- package/template/apps/document-server/src/southwind_document_server/contracts.py +168 -13
- package/template/apps/document-server/src/southwind_document_server/fingerprint.py +128 -0
- package/template/apps/document-server/src/southwind_document_server/grants.py +81 -0
- package/template/apps/document-server/src/southwind_document_server/multipart_output.py +265 -0
- package/template/apps/document-server/src/southwind_document_server/output_validation.py +202 -0
- package/template/apps/document-server/src/southwind_document_server/progress.py +27 -0
- package/template/apps/document-server/src/southwind_document_server/readiness.py +280 -0
- package/template/apps/document-server/src/southwind_document_server/readiness_contracts.py +280 -0
- package/template/apps/document-server/src/southwind_document_server/readiness_http.py +87 -0
- package/template/apps/document-server/src/southwind_document_server/readiness_support.py +120 -0
- package/template/apps/document-server/src/southwind_document_server/request_validation.py +48 -0
- package/template/apps/document-server/src/southwind_document_server/service.py +297 -96
- package/template/apps/document-server/src/southwind_document_server/service_recovery.py +183 -0
- package/template/apps/document-server/src/southwind_document_server/sink.py +316 -0
- package/template/apps/document-server/src/southwind_document_server/store.py +301 -141
- package/template/apps/document-server/src/southwind_document_server/store_events.py +40 -0
- package/template/apps/document-server/src/southwind_document_server/store_models.py +62 -0
- package/template/apps/document-server/src/southwind_document_server/store_recovery.py +247 -0
- package/template/apps/document-server/src/southwind_document_server/store_schema.py +50 -0
- package/template/apps/document-server/tests/recovery_support.py +230 -0
- package/template/apps/document-server/tests/support.py +210 -0
- package/template/apps/document-server/tests/test_adapter.py +251 -0
- package/template/apps/document-server/tests/test_config.py +43 -0
- package/template/apps/document-server/tests/test_contracts.py +80 -0
- package/template/apps/document-server/tests/test_fingerprint.py +125 -0
- package/template/apps/document-server/tests/test_grants.py +46 -0
- package/template/apps/document-server/tests/test_handshake.py +154 -0
- package/template/apps/document-server/tests/test_integration.py +192 -0
- package/template/apps/document-server/tests/test_multipart_security.py +259 -0
- package/template/apps/document-server/tests/test_readiness.py +311 -0
- package/template/apps/document-server/tests/test_readiness_contracts.py +131 -0
- package/template/apps/document-server/tests/test_recovery.py +222 -0
- package/template/apps/document-server/tests/test_recovery_faults.py +101 -0
- package/template/apps/document-server/tests/test_recovery_races.py +283 -0
- package/template/apps/document-server/tests/test_service.py +16 -13
- package/template/apps/document-server/tests/test_service_artifacts.py +296 -0
- package/template/apps/document-server/tests/test_sink.py +253 -0
- package/template/apps/document-server/tests/test_store.py +199 -0
- package/template/apps/embedding-server/pyproject.toml +5 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/adapter.py +38 -2
- package/template/apps/embedding-server/src/southwind_embedding_server/app.py +135 -20
- package/template/apps/embedding-server/src/southwind_embedding_server/config.py +138 -4
- package/template/apps/embedding-server/src/southwind_embedding_server/contracts.py +13 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/image_input.py +16 -5
- package/template/apps/embedding-server/src/southwind_embedding_server/pin_cli.py +62 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/readiness.py +259 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/readiness_contracts.py +221 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/readiness_http.py +91 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/run_cipher.py +31 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/run_service.py +150 -0
- package/template/apps/embedding-server/src/southwind_embedding_server/run_store.py +250 -0
- package/template/apps/embedding-server/tests/test_adapter.py +25 -0
- package/template/apps/embedding-server/tests/test_config.py +13 -0
- package/template/apps/embedding-server/tests/test_readiness.py +202 -0
- package/template/apps/embedding-server/tests/test_run_http.py +257 -0
- package/template/apps/embedding-server/tests/test_run_service.py +202 -0
- package/template/apps/embedding-server/uv.lock +71 -0
- package/template/apps/server/Dockerfile +13 -0
- package/template/apps/server/package.json +1 -0
- package/template/apps/server/src/agent/drizzle-screenshot-intake-repository.integration.test.ts +286 -0
- package/template/apps/server/src/agent/drizzle-screenshot-intake-repository.ts +175 -0
- package/template/apps/server/src/agent/persistent-screenshot-intake-producer.ts +320 -0
- package/template/apps/server/src/agent/remote-runtime.ts +8 -1
- package/template/apps/server/src/agent/required-environment.ts +5 -0
- package/template/apps/server/src/agent/run-attach.ts +41 -0
- package/template/apps/server/src/agent/run-audit.ts +49 -0
- package/template/apps/server/src/agent/run-contracts.ts +6 -1
- package/template/apps/server/src/agent/run-facade.ts +67 -68
- package/template/apps/server/src/agent/run-route-input.ts +26 -1
- package/template/apps/server/src/agent/run-route-screenshot-context.test.ts +13 -0
- package/template/apps/server/src/agent/run-routes.ts +1 -0
- package/template/apps/server/src/agent/runtime-bootstrap-report.test.ts +1 -1
- package/template/apps/server/src/agent/runtime-bootstrap.ts +112 -60
- package/template/apps/server/src/agent/runtime-readiness-sources.test.ts +27 -0
- package/template/apps/server/src/agent/runtime-readiness-sources.ts +31 -0
- package/template/apps/server/src/agent/runtime-reporting-bootstrap.ts +40 -0
- package/template/apps/server/src/agent/screenshot-context-admission.test.ts +249 -0
- package/template/apps/server/src/agent/screenshot-context-attestation.ts +60 -0
- package/template/apps/server/src/agent/screenshot-intake-authorization.ts +29 -0
- package/template/apps/server/src/agent/screenshot-intake-bootstrap.ts +59 -0
- package/template/apps/server/src/agent/screenshot-intake-durable.ts +53 -0
- package/template/apps/server/src/agent/screenshot-intake-errors.ts +9 -0
- package/template/apps/server/src/agent/screenshot-intake-producer.ts +41 -0
- package/template/apps/server/src/agent/screenshot-intake-record.ts +44 -0
- package/template/apps/server/src/agent/screenshot-intake-recovery.ts +106 -0
- package/template/apps/server/src/agent/screenshot-intake-repository.ts +64 -0
- package/template/apps/server/src/agent/screenshot-intake-reservation.ts +24 -0
- package/template/apps/server/src/agent/screenshot-intake-routes.ts +171 -0
- package/template/apps/server/src/agent/screenshot-intake-runtime-types.ts +6 -0
- package/template/apps/server/src/agent/screenshot-intake-sweep.ts +26 -0
- package/template/apps/server/src/agent/screenshot-intake-test-support.ts +91 -0
- package/template/apps/server/src/agent/screenshot-intake-v2-validation.ts +176 -0
- package/template/apps/server/src/agent/screenshot-intake-v2.test.ts +345 -0
- package/template/apps/server/src/agent/screenshot-intake-v2.ts +348 -0
- package/template/apps/server/src/agent/screenshot-png.ts +15 -0
- package/template/apps/server/src/agent/screenshot-run-binding.ts +49 -0
- package/template/apps/server/src/agent/unavailable-routes.ts +9 -0
- package/template/apps/server/src/agent/vision-facade.test.ts +98 -8
- package/template/apps/server/src/agent/vision-input.ts +5 -2
- package/template/apps/server/src/agent/vision-readiness-pin.ts +32 -0
- package/template/apps/server/src/agent/vision-readiness.ts +58 -0
- package/template/apps/server/src/ai-artifact/runtime-reference.test.ts +135 -0
- package/template/apps/server/src/ai-artifact/runtime.ts +134 -5
- package/template/apps/server/src/ai-output-artifact/cleanup.ts +214 -0
- package/template/apps/server/src/ai-output-artifact/contracts.ts +152 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-cleanup.ts +37 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-complete.ts +71 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-grant-cleanup.ts +45 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-grants.ts +109 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-mapping.ts +77 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-readiness.ts +46 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-repository.ts +350 -0
- package/template/apps/server/src/ai-output-artifact/drizzle-seal.ts +64 -0
- package/template/apps/server/src/ai-output-artifact/grant.ts +30 -0
- package/template/apps/server/src/ai-output-artifact/host-registry.ts +53 -0
- package/template/apps/server/src/ai-output-artifact/memory-cleanup.ts +47 -0
- package/template/apps/server/src/ai-output-artifact/memory-grants.ts +98 -0
- package/template/apps/server/src/ai-output-artifact/memory-readiness.ts +26 -0
- package/template/apps/server/src/ai-output-artifact/memory-repository.ts +348 -0
- package/template/apps/server/src/ai-output-artifact/policy.test.ts +67 -0
- package/template/apps/server/src/ai-output-artifact/policy.ts +125 -0
- package/template/apps/server/src/ai-output-artifact/postgres-test-support.ts +147 -0
- package/template/apps/server/src/ai-output-artifact/postgres.integration.test.ts +349 -0
- package/template/apps/server/src/ai-output-artifact/reference-codec.ts +128 -0
- package/template/apps/server/src/ai-output-artifact/repository-grant-invariants.test-support.ts +165 -0
- package/template/apps/server/src/ai-output-artifact/repository-invariants.test-support.ts +239 -0
- package/template/apps/server/src/ai-output-artifact/repository-invariants.test.ts +18 -0
- package/template/apps/server/src/ai-output-artifact/repository.ts +107 -0
- package/template/apps/server/src/ai-output-artifact/route-input.ts +173 -0
- package/template/apps/server/src/ai-output-artifact/routes-delete.test.ts +287 -0
- package/template/apps/server/src/ai-output-artifact/routes-grant.test.ts +116 -0
- package/template/apps/server/src/ai-output-artifact/routes-nonblocking-body.test.ts +136 -0
- package/template/apps/server/src/ai-output-artifact/routes-security.test.ts +176 -0
- package/template/apps/server/src/ai-output-artifact/routes-storage-error.test.ts +105 -0
- package/template/apps/server/src/ai-output-artifact/routes.test-support.ts +84 -0
- package/template/apps/server/src/ai-output-artifact/routes.test.ts +198 -0
- package/template/apps/server/src/ai-output-artifact/routes.ts +280 -0
- package/template/apps/server/src/ai-output-artifact/service-completion.ts +60 -0
- package/template/apps/server/src/ai-output-artifact/service-grants.test.ts +169 -0
- package/template/apps/server/src/ai-output-artifact/service-grants.ts +217 -0
- package/template/apps/server/src/ai-output-artifact/service-input.ts +175 -0
- package/template/apps/server/src/ai-output-artifact/service-read.ts +89 -0
- package/template/apps/server/src/ai-output-artifact/service-recovery.test.ts +238 -0
- package/template/apps/server/src/ai-output-artifact/service-support.ts +240 -0
- package/template/apps/server/src/ai-output-artifact/service.test.ts +283 -0
- package/template/apps/server/src/ai-output-artifact/service.ts +334 -0
- package/template/apps/server/src/ai-output-artifact/storage-recovery.ts +33 -0
- package/template/apps/server/src/ai-output-artifact/storage-writer.ts +103 -0
- package/template/apps/server/src/ai-output-artifact/test-support.ts +161 -0
- package/template/apps/server/src/ai-runtime-readiness/deployment-pin.ts +69 -0
- package/template/apps/server/src/ai-runtime-readiness/health-response.ts +92 -0
- package/template/apps/server/src/ai-runtime-readiness/operation-port-trust.test.ts +66 -0
- package/template/apps/server/src/ai-runtime-readiness/operation-port.test-support.ts +143 -0
- package/template/apps/server/src/ai-runtime-readiness/operation-port.test.ts +193 -0
- package/template/apps/server/src/ai-runtime-readiness/operation-port.ts +172 -0
- package/template/apps/server/src/ai-runtime-readiness/trust-store.ts +61 -0
- package/template/apps/server/src/app/ai-screenshot-intake-binding.ts +22 -0
- package/template/apps/server/src/app/document-output-artifact-bindings.ts +5 -0
- package/template/apps/server/src/app/speech-output-artifact-bindings.ts +5 -0
- package/template/apps/server/src/application-services.ts +9 -3
- package/template/apps/server/src/audit/redaction.ts +1 -0
- package/template/apps/server/src/audit/reliable-writer.test.ts +8 -0
- package/template/apps/server/src/auth/password-change-license-restriction.test.ts +156 -0
- package/template/apps/server/src/document/cancel-response.ts +33 -0
- package/template/apps/server/src/document/contracts.ts +6 -0
- package/template/apps/server/src/document/errors.ts +11 -0
- package/template/apps/server/src/document/facade-cancel.test.ts +226 -0
- package/template/apps/server/src/document/facade-cancel.ts +110 -0
- package/template/apps/server/src/document/facade-grant-handoff.test.ts +113 -0
- package/template/apps/server/src/document/facade-idempotency.test.ts +195 -0
- package/template/apps/server/src/document/facade-invocation.ts +46 -0
- package/template/apps/server/src/document/facade-output-artifact.test.ts +310 -0
- package/template/apps/server/src/document/facade-read-response.ts +116 -0
- package/template/apps/server/src/document/facade-readiness.test.ts +95 -0
- package/template/apps/server/src/document/facade-support.ts +297 -0
- package/template/apps/server/src/document/facade.ts +164 -173
- package/template/apps/server/src/document/output-artifact-composition.test.ts +64 -0
- package/template/apps/server/src/document/output-artifact-composition.ts +78 -0
- package/template/apps/server/src/document/output-artifact-fingerprint.contract.test.ts +110 -0
- package/template/apps/server/src/document/output-artifact-fingerprint.ts +150 -0
- package/template/apps/server/src/document/output-artifact-host-registry.ts +44 -0
- package/template/apps/server/src/document/output-artifact-host.test.ts +332 -0
- package/template/apps/server/src/document/output-artifact-host.ts +331 -0
- package/template/apps/server/src/document/output-artifact-manifest.test-support.ts +71 -0
- package/template/apps/server/src/document/output-artifact-publish.test-support.ts +48 -0
- package/template/apps/server/src/document/output-artifact-readiness-probe.ts +347 -0
- package/template/apps/server/src/document/output-artifact-readiness-timeout.ts +30 -0
- package/template/apps/server/src/document/output-artifact-readiness.test.ts +264 -0
- package/template/apps/server/src/document/output-artifact-readiness.ts +87 -0
- package/template/apps/server/src/document/output-artifact-route-composition.test.ts +27 -0
- package/template/apps/server/src/document/output-artifact-route-composition.ts +14 -0
- package/template/apps/server/src/document/output-artifact-runtime.test-support.ts +8 -0
- package/template/apps/server/src/document/output-artifact-runtime.test.ts +124 -0
- package/template/apps/server/src/document/output-artifact-runtime.ts +275 -0
- package/template/apps/server/src/document/output-artifact.test-support.ts +350 -0
- package/template/apps/server/src/document/remote-response.ts +162 -0
- package/template/apps/server/src/document/remote-runtime.test.ts +100 -4
- package/template/apps/server/src/document/remote-runtime.ts +37 -85
- package/template/apps/server/src/document/routes-read-response.test.ts +267 -0
- package/template/apps/server/src/document/routes.test.ts +109 -0
- package/template/apps/server/src/document/routes.ts +23 -14
- package/template/apps/server/src/embedding/audit.ts +46 -0
- package/template/apps/server/src/embedding/contracts.ts +19 -1
- package/template/apps/server/src/embedding/drizzle-run-binding-repository.integration.test.ts +100 -0
- package/template/apps/server/src/embedding/drizzle-run-binding-repository.ts +102 -0
- package/template/apps/server/src/embedding/facade-readiness.test.ts +307 -0
- package/template/apps/server/src/embedding/facade-types.ts +18 -0
- package/template/apps/server/src/embedding/facade.ts +248 -115
- package/template/apps/server/src/embedding/operation-authorization.ts +23 -0
- package/template/apps/server/src/embedding/readiness-admission.ts +26 -0
- package/template/apps/server/src/embedding/remote-runtime.test.ts +103 -0
- package/template/apps/server/src/embedding/remote-runtime.ts +98 -0
- package/template/apps/server/src/embedding/routes.test.ts +118 -0
- package/template/apps/server/src/embedding/routes.ts +98 -0
- package/template/apps/server/src/embedding/run-artifact.ts +18 -0
- package/template/apps/server/src/embedding/run-authorization.test.ts +133 -0
- package/template/apps/server/src/embedding/run-authorization.ts +91 -0
- package/template/apps/server/src/embedding/run-binding-repository.ts +75 -0
- package/template/apps/server/src/embedding/run-fingerprint.test.ts +78 -0
- package/template/apps/server/src/embedding/run-fingerprint.ts +48 -0
- package/template/apps/server/src/embedding/terminal-observer.test.ts +26 -0
- package/template/apps/server/src/embedding/terminal-observer.ts +44 -0
- package/template/apps/server/src/index.ts +38 -31
- package/template/apps/server/src/module-host/ai-operation-port.test.ts +72 -0
- package/template/apps/server/src/module-host/ai-operation-port.ts +46 -3
- package/template/apps/server/src/module-host/ai-operation-speech-normalize.test.ts +186 -0
- package/template/apps/server/src/module-host/durable-context.ts +194 -16
- package/template/apps/server/src/module-host/durable-handler-registration.ts +1 -0
- package/template/apps/server/src/module-host/durable-storage-filesystem-restart.test.ts +265 -0
- package/template/apps/server/src/module-host/durable-storage-write.test.ts +345 -0
- package/template/apps/server/src/module-host/http-runtime.ts +25 -0
- package/template/apps/server/src/module-host/initialize-contracts.ts +18 -1
- package/template/apps/server/src/module-host/initialize.test.ts +18 -0
- package/template/apps/server/src/module-host/initialize.ts +42 -2
- package/template/apps/server/src/module-host/module-secret-audit-version.test.ts +73 -0
- package/template/apps/server/src/module-host/module-secret-binding-resolution.ts +60 -0
- package/template/apps/server/src/module-host/module-secret-durable.test.ts +206 -0
- package/template/apps/server/src/module-host/module-secret-port.test-support.ts +125 -0
- package/template/apps/server/src/module-host/module-secret-port.test.ts +161 -0
- package/template/apps/server/src/module-host/module-secret-port.ts +249 -0
- package/template/apps/server/src/module-host/module-secret-result.test.ts +324 -0
- package/template/apps/server/src/module-host/module-secret-result.ts +274 -0
- package/template/apps/server/src/module-host/module-secret-tool-boundary.test.ts +143 -0
- package/template/apps/server/src/module-host/project-composition.ts +1 -0
- package/template/apps/server/src/module-host/report-staging-port.ts +55 -0
- package/template/apps/server/src/module-host/report-staging-registration.test.ts +104 -0
- package/template/apps/server/src/module-host/request-context.ts +58 -1
- package/template/apps/server/src/module-host/route-declaration.ts +11 -4
- package/template/apps/server/src/module-host/route-installer.test-fixture.ts +246 -0
- package/template/apps/server/src/module-host/route-installer.test.ts +47 -211
- package/template/apps/server/src/module-host/route-installer.ts +192 -21
- package/template/apps/server/src/module-host/route-registration.test.ts +44 -4
- package/template/apps/server/src/module-host/runtime-composition.ts +2 -0
- package/template/apps/server/src/module-host/scoped-host.ts +84 -0
- package/template/apps/server/src/module-host/screenshot-artifact-ref.ts +91 -0
- package/template/apps/server/src/module-host/screenshot-intake-composition.test.ts +292 -0
- package/template/apps/server/src/module-host/screenshot-intake-deadline.ts +38 -0
- package/template/apps/server/src/module-host/screenshot-intake-plan.ts +75 -0
- package/template/apps/server/src/module-host/screenshot-intake-port.ts +297 -0
- package/template/apps/server/src/module-host/screenshot-intake-security.test.ts +311 -0
- package/template/apps/server/src/module-host/screenshot-intake-store.ts +76 -0
- package/template/apps/server/src/module-host/screenshot-intake-test-support.ts +68 -0
- package/template/apps/server/src/module-host/secret-bindings.test.ts +167 -0
- package/template/apps/server/src/module-host/secret-bindings.ts +184 -0
- package/template/apps/server/src/module-host/storage-authorization-binding.test.ts +242 -0
- package/template/apps/server/src/module-host/storage-port.test.ts +8 -1
- package/template/apps/server/src/module-host/storage-port.ts +84 -8
- package/template/apps/server/src/module-host/storage-restart-fixture.test-support.ts +242 -0
- package/template/apps/server/src/module-host/storage-restart-postgres.integration.test.ts +280 -0
- package/template/apps/server/src/module-host/storage-scope-drift-http.test.ts +68 -0
- package/template/apps/server/src/module-host/storage-scope.ts +52 -1
- package/template/apps/server/src/module-host/storage-stream-route.test.ts +282 -0
- package/template/apps/server/src/module-host/storage-write-error.test.ts +174 -0
- package/template/apps/server/src/module-host/storage-write-error.ts +62 -0
- package/template/apps/server/src/module-host/storage-write-port.test.ts +323 -0
- package/template/apps/server/src/module-host/storage-write-port.ts +320 -0
- package/template/apps/server/src/module-host/storage-write-unavailable.ts +21 -0
- package/template/apps/server/src/module-host/storage-writer-retention.test.ts +109 -0
- package/template/apps/server/src/module-host/user-directory-composition.test.ts +1 -0
- package/template/apps/server/src/module-preflight-secret.test.ts +79 -0
- package/template/apps/server/src/module-preflight.ts +5 -0
- package/template/apps/server/src/platform-http-runtime.ts +16 -4
- package/template/apps/server/src/report-staging/archive-frame-stream.test.ts +209 -0
- package/template/apps/server/src/report-staging/archive-frame-stream.ts +341 -0
- package/template/apps/server/src/report-staging/archive-process.test.ts +302 -0
- package/template/apps/server/src/report-staging/archive-process.ts +257 -0
- package/template/apps/server/src/report-staging/archive-volumes.ts +30 -0
- package/template/apps/server/src/report-staging/cancellation.ts +13 -0
- package/template/apps/server/src/report-staging/contracts.ts +94 -0
- package/template/apps/server/src/report-staging/drizzle-lifecycle.ts +278 -0
- package/template/apps/server/src/report-staging/drizzle-mapping.ts +140 -0
- package/template/apps/server/src/report-staging/drizzle-repository.integration.test.ts +346 -0
- package/template/apps/server/src/report-staging/drizzle-repository.ts +255 -0
- package/template/apps/server/src/report-staging/drizzle-seal.integration.test.ts +267 -0
- package/template/apps/server/src/report-staging/drizzle-seal.ts +177 -0
- package/template/apps/server/src/report-staging/filesystem-cleanup.test.ts +68 -0
- package/template/apps/server/src/report-staging/filesystem-cleanup.ts +102 -0
- package/template/apps/server/src/report-staging/filesystem-errors.ts +15 -0
- package/template/apps/server/src/report-staging/filesystem-identifiers.ts +19 -0
- package/template/apps/server/src/report-staging/filesystem-io.test.ts +85 -0
- package/template/apps/server/src/report-staging/filesystem-io.ts +206 -0
- package/template/apps/server/src/report-staging/filesystem-scan.ts +85 -0
- package/template/apps/server/src/report-staging/filesystem-store.ts +346 -0
- package/template/apps/server/src/report-staging/heartbeat.test.ts +47 -0
- package/template/apps/server/src/report-staging/heartbeat.ts +53 -0
- package/template/apps/server/src/report-staging/manifest-stream.ts +46 -0
- package/template/apps/server/src/report-staging/memory-repository.ts +256 -0
- package/template/apps/server/src/report-staging/metadata-catalog.ts +89 -0
- package/template/apps/server/src/report-staging/metadata-spool-paths.ts +195 -0
- package/template/apps/server/src/report-staging/metadata-spool-schema.ts +54 -0
- package/template/apps/server/src/report-staging/metadata-spool.test.ts +214 -0
- package/template/apps/server/src/report-staging/metadata-spool.ts +305 -0
- package/template/apps/server/src/report-staging/native/archive-frame-helper.c +309 -0
- package/template/apps/server/src/report-staging/path-policy.test.ts +127 -0
- package/template/apps/server/src/report-staging/path-policy.ts +263 -0
- package/template/apps/server/src/report-staging/repository-fence.test.ts +114 -0
- package/template/apps/server/src/report-staging/repository.ts +75 -0
- package/template/apps/server/src/report-staging/runtime.ts +31 -0
- package/template/apps/server/src/report-staging/sealed-file.test.ts +34 -0
- package/template/apps/server/src/report-staging/sealed-file.ts +137 -0
- package/template/apps/server/src/report-staging/service-input-limits.test.ts +62 -0
- package/template/apps/server/src/report-staging/service-input.ts +204 -0
- package/template/apps/server/src/report-staging/service-lifecycle.test.ts +132 -0
- package/template/apps/server/src/report-staging/service-read-fence.test.ts +37 -0
- package/template/apps/server/src/report-staging/service-read.ts +172 -0
- package/template/apps/server/src/report-staging/service-support.ts +149 -0
- package/template/apps/server/src/report-staging/service.test-fixture.ts +226 -0
- package/template/apps/server/src/report-staging/service.test.ts +314 -0
- package/template/apps/server/src/report-staging/service.ts +255 -0
- package/template/apps/server/src/report-staging/supervised-process.ts +194 -0
- package/template/apps/server/src/speech/contracts.ts +8 -0
- package/template/apps/server/src/speech/errors.ts +10 -0
- package/template/apps/server/src/speech/facade-contract.ts +49 -0
- package/template/apps/server/src/speech/facade-output.test.ts +299 -0
- package/template/apps/server/src/speech/facade-output.ts +298 -0
- package/template/apps/server/src/speech/facade-validation.ts +127 -0
- package/template/apps/server/src/speech/facade.ts +185 -151
- package/template/apps/server/src/speech/fingerprint.test.ts +42 -0
- package/template/apps/server/src/speech/fingerprint.ts +28 -0
- package/template/apps/server/src/speech/output-artifact-binding.test.ts +11 -0
- package/template/apps/server/src/speech/output-artifact-binding.ts +30 -0
- package/template/apps/server/src/speech/output-artifact-error.ts +9 -0
- package/template/apps/server/src/speech/output-artifact-host.test-support.ts +73 -0
- package/template/apps/server/src/speech/output-artifact-host.test.ts +302 -0
- package/template/apps/server/src/speech/output-artifact-host.ts +279 -0
- package/template/apps/server/src/speech/output-artifact-policy.ts +114 -0
- package/template/apps/server/src/speech/output-artifact-replay.ts +91 -0
- package/template/apps/server/src/speech/remote-response.ts +158 -0
- package/template/apps/server/src/speech/remote-runtime.test.ts +90 -0
- package/template/apps/server/src/speech/remote-runtime.ts +36 -78
- package/template/apps/server/src/speech/routes.ts +60 -16
- package/template/apps/server/src/startup-finalization.ts +52 -0
- package/template/apps/server/src/startup-preflight.ts +2 -0
- package/template/apps/server/src/startup-shutdown.test.ts +69 -0
- package/template/apps/server/src/startup-shutdown.ts +61 -0
- package/template/apps/server/src/storage/drizzle-upload-purge.ts +61 -0
- package/template/apps/server/src/storage/drizzle-upload-references.ts +23 -0
- package/template/apps/server/src/storage/drizzle-upload-repository.integration.test.ts +103 -0
- package/template/apps/server/src/storage/drizzle-upload-repository.ts +109 -14
- package/template/apps/server/src/storage/host-runtime.ts +15 -0
- package/template/apps/server/src/storage/routes-stream-cancellation.test.ts +154 -0
- package/template/apps/server/src/storage/routes.test.ts +13 -2
- package/template/apps/server/src/storage/routes.ts +57 -18
- package/template/apps/server/src/storage/runtime.ts +17 -4
- package/template/apps/server/src/system/route-types.ts +5 -1
- package/template/apps/server/src/system/system-resource-monitoring.test.ts +47 -0
- package/template/apps/server/src/system/system-resource-monitoring.ts +60 -10
- package/template/apps/server/src/work-order/routes.test.ts +1 -0
- package/template/apps/speech-server/src/southwind_speech_server/adapter.py +58 -17
- package/template/apps/speech-server/src/southwind_speech_server/app.py +24 -17
- package/template/apps/speech-server/src/southwind_speech_server/bounded_json.py +60 -0
- package/template/apps/speech-server/src/southwind_speech_server/config.py +122 -2
- package/template/apps/speech-server/src/southwind_speech_server/contracts.py +58 -0
- package/template/apps/speech-server/src/southwind_speech_server/errors.py +8 -0
- package/template/apps/speech-server/src/southwind_speech_server/normalizer.py +14 -0
- package/template/apps/speech-server/src/southwind_speech_server/output_artifact.py +190 -0
- package/template/apps/speech-server/src/southwind_speech_server/output_validation.py +54 -0
- package/template/apps/speech-server/src/southwind_speech_server/pin_cli.py +83 -0
- package/template/apps/speech-server/src/southwind_speech_server/readiness.py +266 -0
- package/template/apps/speech-server/src/southwind_speech_server/readiness_contracts.py +268 -0
- package/template/apps/speech-server/src/southwind_speech_server/readiness_http.py +91 -0
- package/template/apps/speech-server/src/southwind_speech_server/readiness_local.py +161 -0
- package/template/apps/speech-server/src/southwind_speech_server/readiness_support.py +106 -0
- package/template/apps/speech-server/src/southwind_speech_server/service.py +118 -13
- package/template/apps/speech-server/src/southwind_speech_server/store.py +7 -0
- package/template/apps/speech-server/tests/test_bounded_json.py +55 -0
- package/template/apps/speech-server/tests/test_config.py +22 -0
- package/template/apps/speech-server/tests/test_output_artifact.py +60 -0
- package/template/apps/speech-server/tests/test_output_validation.py +44 -0
- package/template/apps/speech-server/tests/test_readiness.py +315 -0
- package/template/apps/speech-server/tests/test_readiness_http.py +48 -0
- package/template/apps/speech-server/tests/test_readiness_local.py +43 -0
- package/template/apps/speech-server/tests/test_service.py +211 -36
- package/template/apps/web/src/pages/system/components/OperationGpuMonitor.vue +2 -1
- package/template/apps/web/src/pages/system/components/OperationGpuMonitor.webtest.ts +29 -0
- package/template/apps/web/src/pages/system/components/OperationServiceMonitor.vue +2 -1
- package/template/apps/web/src/pages/system/components/OperationServiceMonitor.webtest.ts +4 -1
- package/template/docker-compose.yml +49 -1
- package/template/docs/architecture/ai-runtime-readiness.md +504 -0
- package/template/docs/architecture/ai-runtime.md +20 -4
- package/template/docs/architecture/durable-jobs.md +54 -5
- package/template/docs/architecture/module-host.md +72 -9
- package/template/docs/architecture/module-manifest-composition.md +5 -2
- package/template/docs/architecture/module-secret-resolution.md +250 -0
- package/template/docs/architecture/object-storage.md +144 -3
- package/template/docs/architecture/report-staging.md +158 -0
- package/template/docs/architecture/server-module-interface.md +29 -0
- package/template/docs/architecture/speech-variants.md +45 -0
- package/template/docs/platform/agent-tools.md +16 -0
- package/template/docs/platform/document-ai-runtime.md +199 -17
- package/template/docs/platform/module-configuration.md +5 -0
- package/template/docs/platform/speech-ai-runtime.md +34 -5
- package/template/docs/platform/vision-ai-runtime.md +46 -1
- package/template/package.json +4 -1
- package/template/packages/ai-client/package.json +1 -1
- package/template/packages/ai-client/src/agent/client/client.ts +3 -0
- package/template/packages/ai-client/src/agent/client/index.ts +1 -0
- package/template/packages/ai-client/src/agent/client/screenshot.test.ts +40 -0
- package/template/packages/ai-client/src/agent/client/screenshot.ts +146 -0
- package/template/packages/ai-client/src/agent/client/types.ts +2 -0
- package/template/packages/ai-client/src/agent/contracts/runs.ts +1 -0
- package/template/packages/ai-client/src/embedding/client.test.ts +52 -0
- package/template/packages/ai-client/src/embedding/client.ts +69 -0
- package/template/packages/ai-client/src/embedding/contracts.ts +47 -0
- package/template/packages/ai-client/src/embedding/index.ts +1 -0
- package/template/packages/ai-client/src/embedding/run.ts +130 -0
- package/template/packages/ai-client/src/speech/client.test.ts +26 -0
- package/template/packages/ai-client/src/speech/client.ts +25 -1
- package/template/packages/ai-client/src/speech/contracts.ts +19 -0
- package/template/packages/config/package.json +2 -2
- package/template/packages/database/drizzle/0048_illegal_magneto.sql +11 -0
- package/template/packages/database/drizzle/0049_right_lenny_balinger.sql +79 -0
- package/template/packages/database/drizzle/0050_greedy_sister_grimm.sql +92 -0
- package/template/packages/database/drizzle/0051_lame_shockwave.sql +19 -0
- package/template/packages/database/drizzle/0052_tiresome_komodo.sql +1 -0
- package/template/packages/database/drizzle/0053_calm_victor_mancha.sql +1 -0
- package/template/packages/database/drizzle/0054_tough_thanos.sql +29 -0
- package/template/packages/database/drizzle/meta/0048_snapshot.json +8852 -0
- package/template/packages/database/drizzle/meta/0049_snapshot.json +9410 -0
- package/template/packages/database/drizzle/meta/0050_snapshot.json +10115 -0
- package/template/packages/database/drizzle/meta/0051_snapshot.json +10257 -0
- package/template/packages/database/drizzle/meta/0052_snapshot.json +10263 -0
- package/template/packages/database/drizzle/meta/0053_snapshot.json +10270 -0
- package/template/packages/database/drizzle/meta/0054_snapshot.json +10468 -0
- package/template/packages/database/drizzle/meta/_journal.json +49 -0
- package/template/packages/database/package.json +2 -2
- package/template/packages/database/src/agent-runtime-schema.test.ts +15 -0
- package/template/packages/database/src/ai-output-artifacts.test.ts +57 -0
- package/template/packages/database/src/schema/agent-runtime.ts +43 -0
- package/template/packages/database/src/schema/ai-output-artifacts.ts +182 -0
- package/template/packages/database/src/schema/embedding-runtime.ts +62 -0
- package/template/packages/database/src/schema/file-storage.ts +18 -0
- package/template/packages/database/src/schema/index.ts +3 -0
- package/template/packages/database/src/schema/report-staging.ts +212 -0
- package/template/packages/database/src/schema.test.ts +19 -0
- package/template/packages/jobs/package.json +2 -2
- package/template/packages/modules/index.ts +2 -0
- package/template/packages/modules/package.json +1 -1
- package/template/packages/modules/src/ai-operation-composition.test.ts +37 -0
- package/template/packages/modules/src/ai-operation-composition.ts +4 -0
- package/template/packages/modules/src/ai-operation-readiness-contract.test.ts +38 -0
- package/template/packages/modules/src/ai-operation-readiness-contract.ts +34 -0
- package/template/packages/modules/src/ai-screenshot-context.test.ts +72 -0
- package/template/packages/modules/src/ai-screenshot-context.ts +50 -0
- package/template/packages/modules/src/capability-audit-validation.ts +20 -0
- package/template/packages/modules/src/capability-guard-validation.ts +41 -0
- package/template/packages/modules/src/composition.ts +11 -0
- package/template/packages/modules/src/manifest.ts +48 -0
- package/template/packages/modules/src/secret-composition.test.ts +308 -0
- package/template/packages/modules/src/secret-composition.ts +176 -0
- package/template/packages/modules/src/system-api-control-plane.ts +17 -1
- package/template/packages/modules/src/system-module-catalog.test.ts +52 -0
- package/template/packages/modules/src/system-module-catalog.ts +1 -1
- package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/document-python-parity.json +12 -0
- package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/document.json +70 -0
- package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/embedding.json +68 -0
- package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/speech.json +80 -0
- package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/vlm.json +70 -0
- package/template/packages/server-sdk/contracts/document-runtime/v1/fingerprint-fixture.json +101 -0
- package/template/packages/server-sdk/index.ts +109 -0
- package/template/packages/server-sdk/package.json +23 -4
- package/template/packages/server-sdk/src/ai-runtime-readiness-capture.ts +168 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-digest.ts +49 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-identity.ts +16 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-keys.ts +23 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-limits.ts +141 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-projection.ts +326 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-requirement.ts +31 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-time.ts +16 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-trust.ts +84 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-validation-values.ts +147 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-validation.ts +299 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness-values.ts +42 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.adversarial-input.contract.test.ts +146 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.contract-support.ts +139 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.contract.test.ts +314 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.digest-safety.contract.test.ts +131 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.fail-closed.contract.test.ts +215 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.identity.contract.test.ts +138 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.input-safety.contract.test.ts +314 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.public-api.test.ts +18 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.python-parity.contract.test.ts +160 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.trust.contract.test.ts +135 -0
- package/template/packages/server-sdk/src/ai-runtime-readiness.ts +198 -0
- package/template/packages/server-sdk/src/ai-screenshot-intake-port.ts +58 -0
- package/template/packages/server-sdk/src/data-governance-registration.ts +1 -3
- package/template/packages/server-sdk/src/durable-handler.ts +12 -0
- package/template/packages/server-sdk/src/module-adapter.test.ts +10 -0
- package/template/packages/server-sdk/src/module-adapter.ts +3 -0
- package/template/packages/server-sdk/src/module-host.ts +8 -0
- package/template/packages/server-sdk/src/report-staging-context-compatibility.test.ts +25 -0
- package/template/packages/server-sdk/src/report-staging-port.ts +190 -0
- package/template/packages/server-sdk/src/request-context.ts +27 -1
- package/template/packages/server-sdk/src/route-definition.ts +6 -0
- package/template/packages/server-sdk/src/secret-binding.test.ts +66 -0
- package/template/packages/server-sdk/src/secret-binding.ts +54 -0
- package/template/packages/server-sdk/src/secret-context-compatibility.test.ts +77 -0
- package/template/packages/server-sdk/src/secret-port.ts +80 -0
- package/template/packages/server-sdk/src/storage-port.ts +129 -9
- package/template/packages/server-sdk/src/storage-v052-source-compatibility.test.ts +61 -0
- package/template/packages/shared/index.ts +5 -0
- package/template/packages/shared/package.json +4 -1
- package/template/packages/shared/src/ai-operation-readiness.test.ts +75 -0
- package/template/packages/shared/src/ai-operation-readiness.ts +170 -0
- package/template/packages/shared/src/license-catalog.ts +14 -9
- package/template/packages/shared/src/screenshot-context-digest.test.ts +46 -0
- package/template/packages/shared/src/screenshot-context-digest.ts +72 -0
- package/template/packages/shared/src/stable-key.ts +26 -0
- package/template/packages/shared/tsconfig.json +16 -0
- package/template/packages/storage/index.ts +2 -0
- package/template/packages/storage/package.json +1 -1
- package/template/packages/storage/src/in-memory-upload-repository.ts +105 -2
- package/template/packages/storage/src/local-file-blob-store.test.ts +58 -0
- package/template/packages/storage/src/local-file-blob-store.ts +5 -71
- package/template/packages/storage/src/local-file-blob-writer.ts +96 -0
- package/template/packages/storage/src/upload-abort-recovery.test.ts +234 -0
- package/template/packages/storage/src/upload-abort.ts +130 -0
- package/template/packages/storage/src/upload-cleanup-race.test.ts +207 -0
- package/template/packages/storage/src/upload-cleanup.ts +85 -0
- package/template/packages/storage/src/upload-completion.ts +52 -0
- package/template/packages/storage/src/upload-purge.test.ts +163 -0
- package/template/packages/storage/src/upload-purge.ts +261 -0
- package/template/packages/storage/src/upload-repository-v052-compatibility.test.ts +31 -0
- package/template/packages/storage/src/upload-repository.ts +61 -0
- package/template/packages/storage/src/upload-service-recovery.test.ts +296 -0
- package/template/packages/storage/src/upload-service.ts +138 -150
- package/template/packages/storage/src/upload-streams.ts +126 -30
- package/template/packages/storage/src/upload-types.ts +13 -0
- package/template/packages/storage/src/upload-validation.ts +127 -0
- package/template/scripts/provision-speech-readiness.ts +147 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ModuleOpenedResourceFile,
|
|
3
|
+
ModuleResourceFileRequest,
|
|
4
|
+
} from "./storage-port.js";
|
|
5
|
+
|
|
6
|
+
/** UTF-8 byte ceiling shared by Host validation and PostgreSQL V1 columns. */
|
|
7
|
+
export const MODULE_REPORT_STAGING_PATH_MAX_BYTES = 4_096;
|
|
8
|
+
|
|
9
|
+
/** V1 claim-owned metadata catalog has a fixed explicit-plus-implicit node cap. */
|
|
10
|
+
export const MODULE_REPORT_STAGING_MAX_ENTRIES = 200_000;
|
|
11
|
+
|
|
12
|
+
/** Expanded inputs may enumerate files, while archive volume sets stay small. */
|
|
13
|
+
export const MODULE_REPORT_STAGING_MAX_SOURCES = 10_000;
|
|
14
|
+
export const MODULE_REPORT_STAGING_MAX_ARCHIVE_VOLUMES = 256;
|
|
15
|
+
|
|
16
|
+
export type ModuleReportStagingStatus =
|
|
17
|
+
| "indexing"
|
|
18
|
+
| "ready"
|
|
19
|
+
| "failed"
|
|
20
|
+
| "discarding"
|
|
21
|
+
| "discarded"
|
|
22
|
+
| "expired";
|
|
23
|
+
|
|
24
|
+
export type ModuleReportStagingSourceMode = "archive" | "expanded";
|
|
25
|
+
|
|
26
|
+
export type ModuleReportStagingErrorCode =
|
|
27
|
+
| "REPORT_STAGING_UNAVAILABLE"
|
|
28
|
+
| "REPORT_STAGING_FORBIDDEN"
|
|
29
|
+
| "REPORT_STAGING_INVALID_INPUT"
|
|
30
|
+
| "REPORT_STAGING_CONFLICT"
|
|
31
|
+
| "REPORT_STAGING_NOT_READY"
|
|
32
|
+
| "REPORT_STAGING_LIMIT"
|
|
33
|
+
| "REPORT_STAGING_UNSUPPORTED_ARCHIVE"
|
|
34
|
+
| "REPORT_STAGING_UNSAFE_ARCHIVE"
|
|
35
|
+
| "REPORT_STAGING_INTEGRITY_MISMATCH"
|
|
36
|
+
| "REPORT_STAGING_PROCESS_FAILED"
|
|
37
|
+
| "REPORT_STAGING_PROCESS_TIMEOUT"
|
|
38
|
+
| "REPORT_STAGING_CANCELLED"
|
|
39
|
+
| "REPORT_STAGING_LEASE_EXPIRED";
|
|
40
|
+
|
|
41
|
+
export class ModuleReportStagingError extends Error {
|
|
42
|
+
constructor(
|
|
43
|
+
readonly code: ModuleReportStagingErrorCode,
|
|
44
|
+
message: string,
|
|
45
|
+
readonly retryable = false,
|
|
46
|
+
) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.name = "ModuleReportStagingError";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ModuleReportStagingPolicyV1 {
|
|
53
|
+
/** 模块命名空间内的 staging 用途,例如 `evidence.report-staging`。 */
|
|
54
|
+
readonly purpose: string;
|
|
55
|
+
/** 可作为报告源的已注册业务文件 purpose。 */
|
|
56
|
+
readonly sourcePurposes: readonly string[];
|
|
57
|
+
readonly retentionMs: number;
|
|
58
|
+
readonly claimTtlMs: number;
|
|
59
|
+
readonly maxReadLeaseMs: number;
|
|
60
|
+
readonly maxProcessMs: number;
|
|
61
|
+
readonly maxSources: number;
|
|
62
|
+
readonly maxArchiveBytes: number;
|
|
63
|
+
readonly maxExpandedBytes: number;
|
|
64
|
+
readonly maxEntryBytes: number;
|
|
65
|
+
readonly maxEntries: number;
|
|
66
|
+
readonly maxCompressionRatio: number;
|
|
67
|
+
readonly maxPathDepth: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ModuleReportStagingSourceInput {
|
|
71
|
+
readonly file: ModuleResourceFileRequest;
|
|
72
|
+
/** 报告内的业务相对路径;不得是主机路径。 */
|
|
73
|
+
readonly relativePath: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ModuleReportStagingCreateInput {
|
|
77
|
+
readonly purpose: string;
|
|
78
|
+
readonly idempotencyKey: string;
|
|
79
|
+
/** 必须显式选择;Host 不通过扩展名或内容猜测归档。 */
|
|
80
|
+
readonly sourceMode: ModuleReportStagingSourceMode;
|
|
81
|
+
/** archive 为首卷;expanded 为主页面或业务清单,且都必须属于 sources。 */
|
|
82
|
+
readonly entrypoint: string;
|
|
83
|
+
readonly sources: readonly ModuleReportStagingSourceInput[];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface ModuleReportStagingGroupView {
|
|
87
|
+
readonly groupId: string;
|
|
88
|
+
readonly purpose: string;
|
|
89
|
+
readonly sourceMode: ModuleReportStagingSourceMode;
|
|
90
|
+
readonly status: ModuleReportStagingStatus;
|
|
91
|
+
readonly sourceCount: number;
|
|
92
|
+
readonly entryCount: number;
|
|
93
|
+
readonly archiveByteSize: number;
|
|
94
|
+
readonly expandedByteSize: number;
|
|
95
|
+
readonly manifestSha256?: string;
|
|
96
|
+
readonly failureCode?: ModuleReportStagingErrorCode;
|
|
97
|
+
readonly expiresAt: string;
|
|
98
|
+
readonly createdAt: string;
|
|
99
|
+
readonly updatedAt: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface ModuleReportStagingSourceView {
|
|
103
|
+
readonly sourceId: string;
|
|
104
|
+
readonly relativePath: string;
|
|
105
|
+
readonly byteSize: number;
|
|
106
|
+
readonly sha256: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface ModuleReportStagingEntryView {
|
|
110
|
+
readonly entryId: string;
|
|
111
|
+
readonly relativePath: string;
|
|
112
|
+
readonly byteSize: number;
|
|
113
|
+
readonly sha256: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface ModuleReportStagingManifestV1 {
|
|
117
|
+
readonly version: "1";
|
|
118
|
+
readonly groupId: string;
|
|
119
|
+
readonly purpose: string;
|
|
120
|
+
readonly sourceMode: ModuleReportStagingSourceMode;
|
|
121
|
+
readonly entrypoint: string;
|
|
122
|
+
/** archive 返回卷摘要;expanded 的 source 与 entry 同形,因此为空。 */
|
|
123
|
+
readonly sources: readonly ModuleReportStagingSourceView[];
|
|
124
|
+
readonly entryCount: number;
|
|
125
|
+
readonly archiveByteSize: number;
|
|
126
|
+
readonly expandedByteSize: number;
|
|
127
|
+
readonly sha256: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface ModuleReportStagingReadLeaseView {
|
|
131
|
+
readonly leaseId: string;
|
|
132
|
+
readonly groupId: string;
|
|
133
|
+
readonly expiresAt: string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface ModuleReportStagingEntryPage {
|
|
137
|
+
readonly items: readonly ModuleReportStagingEntryView[];
|
|
138
|
+
readonly nextCursor?: string;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface ModuleOpenedReportStagingEntry extends ModuleReportStagingEntryView {
|
|
142
|
+
readonly body: ReadableStream<Uint8Array>;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 受治理的大报告暂存 Port。Actor、Scope、物理目录、进程与保留策略均由 Host 固定。
|
|
147
|
+
*/
|
|
148
|
+
export interface ModuleReportStagingPortV1 {
|
|
149
|
+
createOrResume(
|
|
150
|
+
input: ModuleReportStagingCreateInput,
|
|
151
|
+
): Promise<ModuleReportStagingGroupView>;
|
|
152
|
+
inspect(groupId: string): Promise<ModuleReportStagingGroupView>;
|
|
153
|
+
acquireReadLease(
|
|
154
|
+
groupId: string,
|
|
155
|
+
requestedTtlMs?: number,
|
|
156
|
+
): Promise<ModuleReportStagingReadLeaseView>;
|
|
157
|
+
getManifest(
|
|
158
|
+
groupId: string,
|
|
159
|
+
leaseId: string,
|
|
160
|
+
): Promise<ModuleReportStagingManifestV1>;
|
|
161
|
+
listEntries(
|
|
162
|
+
groupId: string,
|
|
163
|
+
leaseId: string,
|
|
164
|
+
input?: { readonly cursor?: string; readonly limit?: number },
|
|
165
|
+
): Promise<ModuleReportStagingEntryPage>;
|
|
166
|
+
openEntry(
|
|
167
|
+
groupId: string,
|
|
168
|
+
leaseId: string,
|
|
169
|
+
entryId: string,
|
|
170
|
+
): Promise<ModuleOpenedReportStagingEntry>;
|
|
171
|
+
closeReadLease(groupId: string, leaseId: string): Promise<void>;
|
|
172
|
+
discard(groupId: string): Promise<ModuleReportStagingGroupView>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface ModuleReportStagingSourceReader {
|
|
176
|
+
open(input: ModuleResourceFileRequest): Promise<ModuleOpenedResourceFile>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function requireModuleReportStagingPortV1(context: {
|
|
180
|
+
readonly reportStaging?: ModuleReportStagingPortV1;
|
|
181
|
+
}): ModuleReportStagingPortV1 {
|
|
182
|
+
if (!context.reportStaging) {
|
|
183
|
+
throw new ModuleReportStagingError(
|
|
184
|
+
"REPORT_STAGING_UNAVAILABLE",
|
|
185
|
+
"模块 Report Staging V1 未挂载",
|
|
186
|
+
true,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
return context.reportStaging;
|
|
190
|
+
}
|
|
@@ -2,8 +2,15 @@ import type { ModuleActor } from "./actor.js";
|
|
|
2
2
|
import type { ModuleAuditEmitter } from "./audit-port.js";
|
|
3
3
|
import type { ModuleAiArtifactPort } from "./ai-artifact-port.js";
|
|
4
4
|
import type { ModuleAiOperationPort } from "./ai-operation-port.js";
|
|
5
|
+
import type { ModuleAiOperationReadinessPortV1 } from "./ai-runtime-readiness.js";
|
|
6
|
+
import type { ModuleAiScreenshotIntakePortV1 } from "./ai-screenshot-intake-port.js";
|
|
5
7
|
import type { ModuleJobPort } from "./jobs-port.js";
|
|
6
|
-
import type {
|
|
8
|
+
import type { ModuleReportStagingPortV1 } from "./report-staging-port.js";
|
|
9
|
+
import type { ModuleSecretPort } from "./secret-port.js";
|
|
10
|
+
import type {
|
|
11
|
+
ModuleStoragePort,
|
|
12
|
+
ModuleStorageWritePortV1,
|
|
13
|
+
} from "./storage-port.js";
|
|
7
14
|
import type { ModuleUserDirectoryPort } from "./user-directory-port.js";
|
|
8
15
|
|
|
9
16
|
/**
|
|
@@ -14,14 +21,33 @@ import type { ModuleUserDirectoryPort } from "./user-directory-port.js";
|
|
|
14
21
|
*/
|
|
15
22
|
export interface ModuleRequestContext {
|
|
16
23
|
readonly requestId: string;
|
|
24
|
+
/** 与当前 HTTP 请求绑定;断连或 Host 取消时触发。 */
|
|
25
|
+
readonly signal?: AbortSignal;
|
|
17
26
|
readonly actor: ModuleActor;
|
|
18
27
|
readonly params: Record<string, string | undefined>;
|
|
19
28
|
readonly query: Record<string, string | undefined>;
|
|
29
|
+
/** 默认解析模式下的请求体;流模式下不应使用。 */
|
|
20
30
|
readonly body?: unknown;
|
|
31
|
+
/** 仅 `bodyMode: "stream"` 路由可用,不暴露完整 Request 或框架对象。 */
|
|
32
|
+
readonly bodyStream?: ReadableStream<Uint8Array>;
|
|
21
33
|
readonly audit: ModuleAuditEmitter;
|
|
22
34
|
readonly aiArtifacts: ModuleAiArtifactPort;
|
|
23
35
|
readonly aiOperations: ModuleAiOperationPort;
|
|
36
|
+
/** additive V1;旧 Context 构造器无需提供,Host 运行时注入 fail-closed Port。 */
|
|
37
|
+
readonly aiReadiness?: ModuleAiOperationReadinessPortV1;
|
|
38
|
+
/** VLM 截图输入的独立版本化接缝,不改变既有 aiArtifacts 必填表面。 */
|
|
39
|
+
readonly screenshots?: ModuleAiScreenshotIntakePortV1;
|
|
24
40
|
readonly jobs: ModuleJobPort;
|
|
41
|
+
/** 大报告受治理暂存是版本化、可选的 additive seam。 */
|
|
42
|
+
readonly reportStaging?: ModuleReportStagingPortV1;
|
|
43
|
+
/**
|
|
44
|
+
* 兼容旧 Context 构造器而保持 optional;Windy Host 运行时始终注入。
|
|
45
|
+
* 显式依赖 Secret 的模块使用 requireModuleSecretPort() fail closed。
|
|
46
|
+
*/
|
|
47
|
+
readonly secrets?: ModuleSecretPort;
|
|
48
|
+
/** 0.5.2 兼容的 create/read Port。 */
|
|
25
49
|
readonly storage: ModuleStoragePort;
|
|
50
|
+
/** 受治理写入是版本化、可选的 additive seam。 */
|
|
51
|
+
readonly storageWriter?: ModuleStorageWritePortV1;
|
|
26
52
|
readonly userDirectory: ModuleUserDirectoryPort;
|
|
27
53
|
}
|
|
@@ -21,6 +21,12 @@ export interface ModuleRouteDefinition {
|
|
|
21
21
|
readonly path: string;
|
|
22
22
|
readonly permissionKey: string;
|
|
23
23
|
readonly featureKey?: string;
|
|
24
|
+
/**
|
|
25
|
+
* `stream` 仅允许 POST / PUT。Host 不解析请求体,并通过
|
|
26
|
+
* `ModuleRequestContext.bodyStream` 暴露受取消信号约束的原始字节流。
|
|
27
|
+
* 未声明时保持既有 parsed body 行为。
|
|
28
|
+
*/
|
|
29
|
+
readonly bodyMode?: "stream";
|
|
24
30
|
/** @deprecated Audit Action 以 Manifest API binding 为唯一事实源。 */
|
|
25
31
|
readonly auditAction?: string;
|
|
26
32
|
readonly handler: ModuleRouteHandler;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { createModuleSecretBinding } from "../index.js";
|
|
3
|
+
|
|
4
|
+
describe("createModuleSecretBinding", () => {
|
|
5
|
+
test("通过公开 seam 每次重新调用 opaque resolver", async () => {
|
|
6
|
+
const reference = { provider: "test", key: "archive-password" };
|
|
7
|
+
let current: string | undefined = "password-v1";
|
|
8
|
+
let enabled = true;
|
|
9
|
+
let calls = 0;
|
|
10
|
+
const binding = createModuleSecretBinding({
|
|
11
|
+
moduleName: "archive",
|
|
12
|
+
handle: "archive.smb.password",
|
|
13
|
+
connection: "archive.smb.primary",
|
|
14
|
+
purpose: "archive.smb.read",
|
|
15
|
+
reference,
|
|
16
|
+
resolver: {
|
|
17
|
+
resolve(received) {
|
|
18
|
+
calls += 1;
|
|
19
|
+
expect(received).toBe(reference);
|
|
20
|
+
return current;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
enabled: () => enabled,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
await expect(binding.resolve()).resolves.toEqual({
|
|
27
|
+
status: "active",
|
|
28
|
+
value: "password-v1",
|
|
29
|
+
});
|
|
30
|
+
current = "password-v2";
|
|
31
|
+
await expect(binding.resolve()).resolves.toEqual({
|
|
32
|
+
status: "active",
|
|
33
|
+
value: "password-v2",
|
|
34
|
+
});
|
|
35
|
+
current = undefined;
|
|
36
|
+
await expect(binding.resolve()).resolves.toEqual({
|
|
37
|
+
status: "unavailable",
|
|
38
|
+
});
|
|
39
|
+
enabled = false;
|
|
40
|
+
await expect(binding.resolve()).resolves.toEqual({ status: "disabled" });
|
|
41
|
+
expect(calls).toBe(3);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("捕获逻辑标识,物理 reference 只保留在闭包内", () => {
|
|
45
|
+
const input = {
|
|
46
|
+
moduleName: "archive",
|
|
47
|
+
handle: "archive.smb.password",
|
|
48
|
+
connection: "archive.smb.primary",
|
|
49
|
+
purpose: "archive.smb.read",
|
|
50
|
+
reference: { locator: "file:/run/secrets/archive" },
|
|
51
|
+
resolver: { resolve: () => "secret" },
|
|
52
|
+
};
|
|
53
|
+
const binding = createModuleSecretBinding(input);
|
|
54
|
+
input.handle = "mutated";
|
|
55
|
+
|
|
56
|
+
expect(binding.handle).toBe("archive.smb.password");
|
|
57
|
+
expect(Reflect.ownKeys(binding)).toEqual([
|
|
58
|
+
"moduleName",
|
|
59
|
+
"handle",
|
|
60
|
+
"connection",
|
|
61
|
+
"purpose",
|
|
62
|
+
"resolve",
|
|
63
|
+
]);
|
|
64
|
+
expect(JSON.stringify(binding)).not.toContain("run/secrets");
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ModuleSecretBinding,
|
|
3
|
+
ModuleSecretRequest,
|
|
4
|
+
} from "./secret-port.js";
|
|
5
|
+
|
|
6
|
+
export interface ModuleSecretValueResolver<TReference> {
|
|
7
|
+
resolve(
|
|
8
|
+
reference: TReference,
|
|
9
|
+
): string | undefined | Promise<string | undefined>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ModuleSecretBindingInput<
|
|
13
|
+
TReference,
|
|
14
|
+
> extends ModuleSecretRequest {
|
|
15
|
+
readonly moduleName: string;
|
|
16
|
+
readonly reference: TReference;
|
|
17
|
+
readonly resolver: ModuleSecretValueResolver<TReference>;
|
|
18
|
+
readonly enabled?: () => boolean | Promise<boolean>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Stable Server Composition seam for adapting a host-owned reference resolver.
|
|
23
|
+
*
|
|
24
|
+
* The resolver is invoked on every attempt. The returned binding contains no
|
|
25
|
+
* physical locator metadata beyond the private closure held by this adapter.
|
|
26
|
+
*/
|
|
27
|
+
export function createModuleSecretBinding<TReference>(
|
|
28
|
+
input: ModuleSecretBindingInput<TReference>,
|
|
29
|
+
): ModuleSecretBinding {
|
|
30
|
+
const moduleName = input.moduleName;
|
|
31
|
+
const handle = input.handle;
|
|
32
|
+
const connection = input.connection;
|
|
33
|
+
const purpose = input.purpose;
|
|
34
|
+
const reference = input.reference;
|
|
35
|
+
const resolver = input.resolver;
|
|
36
|
+
const enabled = input.enabled;
|
|
37
|
+
|
|
38
|
+
return Object.freeze({
|
|
39
|
+
moduleName,
|
|
40
|
+
handle,
|
|
41
|
+
connection,
|
|
42
|
+
purpose,
|
|
43
|
+
async resolve() {
|
|
44
|
+
if (enabled && !(await enabled())) {
|
|
45
|
+
return { status: "disabled" } as const;
|
|
46
|
+
}
|
|
47
|
+
const value = await resolver.resolve(reference);
|
|
48
|
+
if (value === undefined || value.length === 0) {
|
|
49
|
+
return { status: "unavailable" } as const;
|
|
50
|
+
}
|
|
51
|
+
return { status: "active", value } as const;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import type { ModuleDurableHandlerContext } from "./durable-handler.js";
|
|
3
|
+
import type { ModuleRequestContext } from "./request-context.js";
|
|
4
|
+
import {
|
|
5
|
+
ModuleSecretError,
|
|
6
|
+
type ModuleSecretPort,
|
|
7
|
+
requireModuleSecretPort,
|
|
8
|
+
} from "./secret-port.js";
|
|
9
|
+
|
|
10
|
+
type IsAssignable<From, To> = [From] extends [To] ? true : false;
|
|
11
|
+
type LegacyRequestContext = Omit<ModuleRequestContext, "secrets">;
|
|
12
|
+
type LegacyDurableContext = Omit<ModuleDurableHandlerContext, "secrets">;
|
|
13
|
+
|
|
14
|
+
const legacyRequestRemainsCompatible: IsAssignable<
|
|
15
|
+
LegacyRequestContext,
|
|
16
|
+
ModuleRequestContext
|
|
17
|
+
> = true;
|
|
18
|
+
const legacyDurableRemainsCompatible: IsAssignable<
|
|
19
|
+
LegacyDurableContext,
|
|
20
|
+
ModuleDurableHandlerContext
|
|
21
|
+
> = true;
|
|
22
|
+
|
|
23
|
+
describe("Module Secret Context 兼容 seam", () => {
|
|
24
|
+
test("旧版 Request 与 Durable Context 类型仍可赋值", () => {
|
|
25
|
+
expect(legacyRequestRemainsCompatible).toBe(true);
|
|
26
|
+
expect(legacyDurableRemainsCompatible).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("缺少 Secret Port 时 helper 以稳定 unavailable fail closed", () => {
|
|
30
|
+
expect(() => requireModuleSecretPort({})).toThrow(
|
|
31
|
+
new ModuleSecretError("MODULE_SECRET_UNAVAILABLE"),
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("Host 注入的受治理 Port 原样返回", () => {
|
|
36
|
+
const port: ModuleSecretPort = {
|
|
37
|
+
async resolve(_request, use) {
|
|
38
|
+
return use("host-governed-secret");
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
expect(requireModuleSecretPort({ secrets: port })).toBe(port);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("Request 与 Durable 示例经 required helper 保持 strict 类型", () => {
|
|
46
|
+
expect(typeof requestSecretExample).toBe("function");
|
|
47
|
+
expect(typeof durableSecretExample).toBe("function");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
interface SecretConsumer {
|
|
52
|
+
use(value: string): Promise<readonly string[]>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const request = {
|
|
56
|
+
handle: "archive.smb.password",
|
|
57
|
+
connection: "archive.smb.primary",
|
|
58
|
+
purpose: "archive.smb.read",
|
|
59
|
+
} as const;
|
|
60
|
+
|
|
61
|
+
async function requestSecretExample(
|
|
62
|
+
context: ModuleRequestContext,
|
|
63
|
+
consumer: SecretConsumer,
|
|
64
|
+
): Promise<readonly string[]> {
|
|
65
|
+
return requireModuleSecretPort(context).resolve(request, (value) =>
|
|
66
|
+
consumer.use(value),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function durableSecretExample(
|
|
71
|
+
context: ModuleDurableHandlerContext,
|
|
72
|
+
consumer: SecretConsumer,
|
|
73
|
+
): Promise<void> {
|
|
74
|
+
await requireModuleSecretPort(context).resolve(request, async (value) => {
|
|
75
|
+
await consumer.use(value);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export interface ModuleSecretRequest {
|
|
2
|
+
readonly handle: string;
|
|
3
|
+
readonly connection: string;
|
|
4
|
+
readonly purpose: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type ModuleSecretSafeValue =
|
|
8
|
+
| null
|
|
9
|
+
| boolean
|
|
10
|
+
| number
|
|
11
|
+
| string
|
|
12
|
+
| readonly ModuleSecretSafeValue[]
|
|
13
|
+
| { readonly [key: string]: ModuleSecretSafeValue };
|
|
14
|
+
|
|
15
|
+
export type ModuleSecretErrorCode =
|
|
16
|
+
| "MODULE_SECRET_NOT_DECLARED"
|
|
17
|
+
| "MODULE_SECRET_GUARD_DENIED"
|
|
18
|
+
| "MODULE_SECRET_DISABLED"
|
|
19
|
+
| "MODULE_SECRET_UNAVAILABLE"
|
|
20
|
+
| "MODULE_SECRET_EXPOSURE_BLOCKED"
|
|
21
|
+
| "MODULE_SECRET_OPERATION_FAILED";
|
|
22
|
+
|
|
23
|
+
export class ModuleSecretError extends Error {
|
|
24
|
+
constructor(
|
|
25
|
+
readonly code: ModuleSecretErrorCode,
|
|
26
|
+
message = "模块 Secret 请求失败",
|
|
27
|
+
readonly reason?: string,
|
|
28
|
+
) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "ModuleSecretError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 原始 Secret 只在一次受控回调内短暂可见。
|
|
36
|
+
*
|
|
37
|
+
* Host 会把有限 JSON 结果复制为不可变 canonical snapshot,拒绝把该值带入
|
|
38
|
+
* key/value,并把底层异常替换为稳定脱敏错误。
|
|
39
|
+
*/
|
|
40
|
+
export interface ModuleSecretPort {
|
|
41
|
+
resolve<TResult extends ModuleSecretSafeValue | void>(
|
|
42
|
+
request: ModuleSecretRequest,
|
|
43
|
+
use: (value: string) => TResult | Promise<TResult>,
|
|
44
|
+
): Promise<TResult>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 兼容旧版 Context object literal,同时让显式依赖 Secret 的模块 fail closed。
|
|
49
|
+
*
|
|
50
|
+
* Windy Host 始终注入 Port;第三方测试桩或旧 Adapter 缺少该字段时,不提供任何
|
|
51
|
+
* env/file fallback,而是抛出稳定 unavailable。
|
|
52
|
+
*/
|
|
53
|
+
export function requireModuleSecretPort(context: {
|
|
54
|
+
readonly secrets?: ModuleSecretPort;
|
|
55
|
+
}): ModuleSecretPort {
|
|
56
|
+
if (!context.secrets) {
|
|
57
|
+
throw new ModuleSecretError("MODULE_SECRET_UNAVAILABLE");
|
|
58
|
+
}
|
|
59
|
+
return context.secrets;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type ModuleSecretBindingResolution =
|
|
63
|
+
| {
|
|
64
|
+
readonly status: "active";
|
|
65
|
+
readonly value: string;
|
|
66
|
+
}
|
|
67
|
+
| { readonly status: "disabled" }
|
|
68
|
+
| { readonly status: "unavailable" };
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* project-owned Server Composition 提供的物理绑定。
|
|
72
|
+
*
|
|
73
|
+
* 该对象只由 Host 消费,不会进入 ModuleRequest/Tool/Durable Context。
|
|
74
|
+
*/
|
|
75
|
+
export interface ModuleSecretBinding extends ModuleSecretRequest {
|
|
76
|
+
readonly moduleName: string;
|
|
77
|
+
resolve():
|
|
78
|
+
| ModuleSecretBindingResolution
|
|
79
|
+
| Promise<ModuleSecretBindingResolution>;
|
|
80
|
+
}
|
|
@@ -10,6 +10,104 @@ export interface ModuleUploadSessionInput {
|
|
|
10
10
|
readonly fileExpiresAt?: Date;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export type ModuleUploadSessionStatus =
|
|
14
|
+
| "uploading"
|
|
15
|
+
| "aborting"
|
|
16
|
+
| "completed"
|
|
17
|
+
| "aborted"
|
|
18
|
+
| "expired";
|
|
19
|
+
|
|
20
|
+
export type ModuleStorageErrorCode =
|
|
21
|
+
| "INVALID_UPLOAD"
|
|
22
|
+
| "UNSUPPORTED_FILE_TYPE"
|
|
23
|
+
| "UPLOAD_TOO_LARGE"
|
|
24
|
+
| "PART_TOO_LARGE"
|
|
25
|
+
| "UPLOAD_FORBIDDEN"
|
|
26
|
+
| "UPLOAD_NOT_ACTIVE"
|
|
27
|
+
| "UPLOAD_EXPIRED"
|
|
28
|
+
| "UPLOAD_OFFSET_CONFLICT"
|
|
29
|
+
| "UPLOAD_INCOMPLETE"
|
|
30
|
+
| "UPLOAD_CANCELLED"
|
|
31
|
+
| "FILE_SIGNATURE_MISMATCH"
|
|
32
|
+
| "CONCURRENT_UPLOAD"
|
|
33
|
+
| "FILE_NOT_FOUND"
|
|
34
|
+
| "FILE_EXPIRED"
|
|
35
|
+
| "FILE_CONTENT_MISSING"
|
|
36
|
+
| "SIZE_MISMATCH"
|
|
37
|
+
| "HASH_MISMATCH"
|
|
38
|
+
| "STORAGE_UNAVAILABLE"
|
|
39
|
+
| "STORAGE_WRITE_FAILED";
|
|
40
|
+
|
|
41
|
+
/** 模块可依赖的稳定错误;不会携带底层路径、locator 或异常正文。 */
|
|
42
|
+
export class ModuleStorageError extends Error {
|
|
43
|
+
constructor(
|
|
44
|
+
readonly code: ModuleStorageErrorCode,
|
|
45
|
+
message: string,
|
|
46
|
+
) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.name = "ModuleStorageError";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Host 投影的上传会话;不暴露 Owner、租户或物理存储定位信息。 */
|
|
53
|
+
export interface ModuleUploadSessionView {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly purpose: string;
|
|
56
|
+
readonly filename: string;
|
|
57
|
+
readonly mimeType: string;
|
|
58
|
+
readonly expectedByteSize: number;
|
|
59
|
+
readonly expectedSha256?: string;
|
|
60
|
+
readonly receivedByteSize: number;
|
|
61
|
+
readonly nextPartNumber: number;
|
|
62
|
+
readonly status: ModuleUploadSessionStatus;
|
|
63
|
+
readonly expiresAt: string;
|
|
64
|
+
readonly fileExpiresAt?: string;
|
|
65
|
+
readonly fileId?: string;
|
|
66
|
+
readonly createdAt: string;
|
|
67
|
+
readonly updatedAt: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ModuleStorageWriterSessionInputV1 {
|
|
71
|
+
readonly purpose: string;
|
|
72
|
+
readonly filename: string;
|
|
73
|
+
readonly mimeType: string;
|
|
74
|
+
readonly expectedByteSize: number;
|
|
75
|
+
readonly expectedSha256?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ModuleUploadPartInputV1 {
|
|
79
|
+
readonly sessionId: string;
|
|
80
|
+
readonly partNumber: number;
|
|
81
|
+
readonly byteOffset: number;
|
|
82
|
+
readonly byteSize: number;
|
|
83
|
+
readonly sha256: string;
|
|
84
|
+
readonly body: ReadableStream<Uint8Array>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Host 投影的已接收分片;不暴露 ArtifactRef 或 Blob locator。 */
|
|
88
|
+
export interface ModuleUploadPartView {
|
|
89
|
+
readonly sessionId: string;
|
|
90
|
+
readonly partNumber: number;
|
|
91
|
+
readonly byteOffset: number;
|
|
92
|
+
readonly byteSize: number;
|
|
93
|
+
readonly sha256: string;
|
|
94
|
+
readonly createdAt: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Host 投影的平台文件元数据;文件 ID 是唯一允许持久化的不透明引用。 */
|
|
98
|
+
export interface ModuleFileView {
|
|
99
|
+
readonly id: string;
|
|
100
|
+
readonly purpose: string;
|
|
101
|
+
readonly filename: string;
|
|
102
|
+
readonly mimeType: string;
|
|
103
|
+
readonly byteSize: number;
|
|
104
|
+
readonly sha256: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface ModuleOpenedFile extends ModuleFileView {
|
|
108
|
+
readonly body: ReadableStream<Uint8Array>;
|
|
109
|
+
}
|
|
110
|
+
|
|
13
111
|
export interface ModuleResourceFileRequest {
|
|
14
112
|
/** 平台文件元数据 ID;不能是 ArtifactRef、对象存储 Key 或主机路径。 */
|
|
15
113
|
readonly fileId: string;
|
|
@@ -25,15 +123,7 @@ export interface ModuleResourceFileRequest {
|
|
|
25
123
|
}
|
|
26
124
|
|
|
27
125
|
/** 资源授权读取仅返回业务所需的最小元数据与受限文件流。 */
|
|
28
|
-
export
|
|
29
|
-
readonly id: string;
|
|
30
|
-
readonly purpose: string;
|
|
31
|
-
readonly filename: string;
|
|
32
|
-
readonly mimeType: string;
|
|
33
|
-
readonly byteSize: number;
|
|
34
|
-
readonly sha256: string;
|
|
35
|
-
readonly body: ReadableStream<Uint8Array>;
|
|
36
|
-
}
|
|
126
|
+
export type ModuleOpenedResourceFile = ModuleOpenedFile;
|
|
37
127
|
|
|
38
128
|
export interface ModuleResourceFileAccessContext {
|
|
39
129
|
readonly actor: ModuleActor;
|
|
@@ -89,3 +179,33 @@ export interface ModuleStoragePort {
|
|
|
89
179
|
input: ModuleResourceFileRequest,
|
|
90
180
|
): Promise<ModuleOpenedResourceFile>;
|
|
91
181
|
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* 模块受治理的流式写入生命周期。
|
|
185
|
+
*
|
|
186
|
+
* Actor、Owner、租户、模块范围、AbortSignal 与物理 locator 均由 Host 从当前上下文
|
|
187
|
+
* 补齐;调用方只能提交 Host 已授权 purpose 下的不透明会话 ID 和流式分片。
|
|
188
|
+
*/
|
|
189
|
+
export interface ModuleStorageWritePortV1 {
|
|
190
|
+
createUploadSession(
|
|
191
|
+
input: ModuleStorageWriterSessionInputV1,
|
|
192
|
+
): Promise<ModuleUploadSessionView>;
|
|
193
|
+
getUploadSession(sessionId: string): Promise<ModuleUploadSessionView>;
|
|
194
|
+
appendUploadPart(
|
|
195
|
+
input: ModuleUploadPartInputV1,
|
|
196
|
+
): Promise<ModuleUploadPartView>;
|
|
197
|
+
completeUpload(sessionId: string): Promise<ModuleFileView>;
|
|
198
|
+
abortUpload(sessionId: string): Promise<ModuleUploadSessionView>;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function requireModuleStorageWritePortV1(context: {
|
|
202
|
+
readonly storageWriter?: ModuleStorageWritePortV1;
|
|
203
|
+
}): ModuleStorageWritePortV1 {
|
|
204
|
+
if (!context.storageWriter) {
|
|
205
|
+
throw new ModuleStorageError(
|
|
206
|
+
"STORAGE_UNAVAILABLE",
|
|
207
|
+
"模块 Storage Writer V1 未挂载",
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
return context.storageWriter;
|
|
211
|
+
}
|