@noodleseed/one 0.121.0 → 0.123.0
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.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/catalog-data-hosted-observability.d.ts.map +1 -1
- package/dist/commands/catalog-data-hosted-observability.js +33 -0
- package/dist/commands/catalog-data-hosted-observability.js.map +1 -1
- package/dist/commands/deploy-version-resolution.js +1 -1
- package/dist/commands/deploy-version-resolution.js.map +1 -1
- package/dist/commands/knowledge.d.ts +7 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +129 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +5 -2
- package/dist/commands/session.js.map +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +19 -2
- package/dist/deploy.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-marketplace-docs.js +4 -4
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js +8 -8
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.d.ts +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.d.ts.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.js +7 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.js.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.d.ts +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.d.ts.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.js.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.js +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.js.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.js +2 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/package.json +3 -1
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.d.ts +21 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.js +115 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.d.ts +4 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.js +4 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/package.json +34 -0
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.d.ts +30 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.js +21 -6
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.d.ts +2 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/prompts.js +3 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/prompts.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.js +10 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/results.d.ts +4 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/results.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/results.js +5 -19
- package/node_modules/@noodle-borg/developer-mcp/dist/results.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/server.js +3 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/server.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.js +6 -25
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.d.ts +16 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.js +22 -19
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.js +3 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.js +15 -16
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.js +9 -17
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.js +7 -10
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts +41 -17
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/budget.js +0 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js +28 -20
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.js +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.d.ts +22 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.js +102 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +7 -4
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js +110 -25
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +35 -4
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +73 -17
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/package.json +4 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.d.ts +12 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.js +7 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.d.ts +16 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js +41 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts +40 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js +54 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts +15 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js +50 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.d.ts +16 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.js +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts +29 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js +53 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts +21 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js +28 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts +60 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js +230 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.d.ts +38 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.js +100 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.d.ts +31 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.js +36 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts +56 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js +129 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.d.ts +38 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.js +77 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts +28 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js +66 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/package.json +34 -0
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js +22 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.d.ts +28 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.js +26 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +5 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.js +12 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js +23 -2
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +28 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/execute.js.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.d.ts +6 -4
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.js +13 -16
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.d.ts +3 -2
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.js +66 -47
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.js +15 -16
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts +0 -2
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.js +0 -16
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.d.ts +3 -28
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.js +8 -67
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.d.ts +0 -4
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.js +1 -14
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.js +45 -36
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js +20 -229
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.d.ts +3 -2
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.js +70 -36
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.d.ts +17 -6
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.js +98 -26
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +0 -2
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/options.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +6 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-recover.d.ts +26 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.js +58 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.d.ts +10 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-rollback.js +25 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +5 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.js +36 -78
- package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/analytics.js +3 -3
- package/node_modules/@noodle-borg/service/dist/routes/analytics.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.js +6 -27
- package/node_modules/@noodle-borg/service/dist/routes/apps.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +38 -14
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +1 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.d.ts +32 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.js +42 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant.js +11 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js +5 -8
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts +7 -6
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +7 -6
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js +2 -7
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js +7 -20
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/diagnostics.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/diagnostics.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.js +4 -8
- package/node_modules/@noodle-borg/service/dist/routes/envs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/logs.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/logs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.js +4 -0
- package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.js +11 -1
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +21 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +3 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +134 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js +101 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
- package/node_modules/@noodleseed/assistant/package.json +41 -16
- package/package.json +7 -2
- /package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.js +0 -0
- /package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.js +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.js +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.js.map +0 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The deploy-coupled knowledge publication transaction (ADR 0202): lease → resolve bytes or
|
|
3
|
+
* reuse → stage (bundled index + revision + durable sealed text) → verify a positive filtered
|
|
4
|
+
* query → activate + pin, paired with the caller's artifact persistence. Any failure retains
|
|
5
|
+
* the previous artifact + revision pair; retry is idempotent by content hash.
|
|
6
|
+
*/
|
|
7
|
+
import { Bm25KnowledgeIndex, documentsContentHash, identityDocumentTextCodec, KnowledgeError, } from '@noodle-borg/knowledge';
|
|
8
|
+
import { knowledgeEnableCommand, knowledgeTenantKey } from './routes.js';
|
|
9
|
+
/** Structured publication failure the registry maps onto its deploy error shape. */
|
|
10
|
+
export class KnowledgePublicationError extends Error {
|
|
11
|
+
errors;
|
|
12
|
+
constructor(errors) {
|
|
13
|
+
super(errors[0]?.message ?? 'knowledge publication failed');
|
|
14
|
+
this.name = 'KnowledgePublicationError';
|
|
15
|
+
this.errors = errors;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** How long a cached active-revision check may serve before re-reading the durable store. */
|
|
19
|
+
const ACTIVE_REVISION_TTL_MS = 5_000;
|
|
20
|
+
/** Deploy-piggybacked GC cadence (the archive-sweeper pattern). */
|
|
21
|
+
const SWEEP_INTERVAL_MS = 10 * 60 * 1000;
|
|
22
|
+
export function createKnowledgeDeployHooks(stores, options) {
|
|
23
|
+
const index = new Bm25KnowledgeIndex();
|
|
24
|
+
const codec = stores.codec ?? identityDocumentTextCodec;
|
|
25
|
+
const now = options.now ?? (() => new Date());
|
|
26
|
+
const activeChecks = new Map();
|
|
27
|
+
let lastSweep = 0;
|
|
28
|
+
/** Staged text for a component, from durable revision text or transient staging. */
|
|
29
|
+
async function resolveDocuments(tenant, component, existingRevisionId) {
|
|
30
|
+
if (existingRevisionId !== undefined) {
|
|
31
|
+
try {
|
|
32
|
+
return [...(await stores.revisionStore.documents(existingRevisionId))];
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Reused revision without durable text (staged pre-migration or interrupted) — fall
|
|
36
|
+
// back to transient staging below.
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const tenantKey = knowledgeTenantKey(tenant);
|
|
40
|
+
const documents = [];
|
|
41
|
+
for (const descriptor of component.documents) {
|
|
42
|
+
const sealed = await stores.staging.get(tenantKey, descriptor.sha256);
|
|
43
|
+
if (sealed === undefined) {
|
|
44
|
+
throw new KnowledgePublicationError([
|
|
45
|
+
{
|
|
46
|
+
code: 'knowledge_documents_missing',
|
|
47
|
+
path: `knowledge.${component.name}.${descriptor.path}`,
|
|
48
|
+
message: `knowledge document ${descriptor.path} has no staged bytes; ` +
|
|
49
|
+
`run noodle deploy again to re-upload (retry is idempotent)`,
|
|
50
|
+
},
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
documents.push({
|
|
54
|
+
descriptor: {
|
|
55
|
+
path: descriptor.path,
|
|
56
|
+
title: descriptor.title,
|
|
57
|
+
...(descriptor.sourceUrl !== undefined ? { sourceUrl: descriptor.sourceUrl } : {}),
|
|
58
|
+
sha256: descriptor.sha256,
|
|
59
|
+
bytes: descriptor.bytes,
|
|
60
|
+
},
|
|
61
|
+
text: (await codec.open(sealed)).toString('utf8'),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return documents;
|
|
65
|
+
}
|
|
66
|
+
/** Make sure the in-process index holds and activates the given revision. */
|
|
67
|
+
async function rebuildIndex(scope, componentName, revisionId) {
|
|
68
|
+
const current = await index.activeRevision(scope, componentName);
|
|
69
|
+
if (current?.revisionId === revisionId)
|
|
70
|
+
return;
|
|
71
|
+
const documents = await stores.revisionStore.documents(revisionId);
|
|
72
|
+
const staged = await index.stage(scope, componentName, documents);
|
|
73
|
+
if (staged.revisionId !== revisionId) {
|
|
74
|
+
throw new KnowledgeError('store', `rebuilt index revision ${staged.revisionId} does not match stored ${revisionId}`);
|
|
75
|
+
}
|
|
76
|
+
await index.activate(revisionId);
|
|
77
|
+
}
|
|
78
|
+
const hooks = {
|
|
79
|
+
async publish(tenant, deploymentId, components) {
|
|
80
|
+
const withDocuments = components.filter((component) => component.documents.length > 0);
|
|
81
|
+
if (components.length > 0 && !(await options.knowledgeEnabled(tenant))) {
|
|
82
|
+
throw new KnowledgePublicationError([
|
|
83
|
+
{
|
|
84
|
+
code: 'knowledge_not_enabled',
|
|
85
|
+
path: 'knowledge',
|
|
86
|
+
message: `knowledge is not enabled for this org/app/env; run: ${knowledgeEnableCommand(tenant)}`,
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
const withSites = components.filter((component) => component.sites.length > 0);
|
|
91
|
+
if (withSites.length > 0 && options.siteProvisioned !== undefined) {
|
|
92
|
+
if (!(await options.siteProvisioned(tenant))) {
|
|
93
|
+
throw new KnowledgePublicationError(withSites.map((component) => ({
|
|
94
|
+
code: 'knowledge_site_not_provisioned',
|
|
95
|
+
path: `knowledge.${component.name}`,
|
|
96
|
+
message: `the managed site datastore for this tenant does not exist yet; an operator must ` +
|
|
97
|
+
`run scripts/knowledge-gcp-provision.mjs --tenant ${tenant.org}/${tenant.app}/${tenant.env}, ` +
|
|
98
|
+
`then check noodle knowledge status ${component.name}`,
|
|
99
|
+
})));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const planned = [];
|
|
103
|
+
try {
|
|
104
|
+
for (const component of withDocuments) {
|
|
105
|
+
const scope = { org: tenant.org, app: tenant.app, env: tenant.env };
|
|
106
|
+
const lease = await stores.revisionStore.acquireLease(scope, component.name, deploymentId);
|
|
107
|
+
const contentHash = documentsContentHash(component.documents.map((document) => document.sha256));
|
|
108
|
+
const previous = await stores.revisionStore.active(scope, component.name);
|
|
109
|
+
const reused = await stores.revisionStore.findByContentHash(scope, component.name, contentHash);
|
|
110
|
+
const documents = await resolveDocuments(tenant, component, reused?.revisionId);
|
|
111
|
+
const staged = await index.stage(scope, component.name, documents);
|
|
112
|
+
const revision = reused ?? staged;
|
|
113
|
+
await stores.revisionStore.stage({
|
|
114
|
+
scope,
|
|
115
|
+
componentName: component.name,
|
|
116
|
+
contentHash,
|
|
117
|
+
revision,
|
|
118
|
+
});
|
|
119
|
+
const verified = await index.verify(staged.revisionId, {
|
|
120
|
+
audience: 'public',
|
|
121
|
+
revision: staged.revisionId,
|
|
122
|
+
});
|
|
123
|
+
if (!verified) {
|
|
124
|
+
throw new KnowledgePublicationError([
|
|
125
|
+
{
|
|
126
|
+
code: 'knowledge_verification_failed',
|
|
127
|
+
path: `knowledge.${component.name}`,
|
|
128
|
+
message: `knowledge component ${component.name} failed its positive filtered verification query`,
|
|
129
|
+
},
|
|
130
|
+
]);
|
|
131
|
+
}
|
|
132
|
+
await stores.revisionStore.stageDocuments(revision.revisionId, documents);
|
|
133
|
+
planned.push({
|
|
134
|
+
component,
|
|
135
|
+
scope,
|
|
136
|
+
revisionId: revision.revisionId,
|
|
137
|
+
...(previous !== undefined ? { previousRevisionId: previous.revisionId } : {}),
|
|
138
|
+
lease,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
await hooks.finish({ components: planned });
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
return { components: planned };
|
|
147
|
+
},
|
|
148
|
+
async activate(plan, deploymentId) {
|
|
149
|
+
for (const planned of plan.components) {
|
|
150
|
+
await stores.revisionStore.activate(planned.scope, planned.component.name, planned.revisionId, deploymentId);
|
|
151
|
+
await rebuildIndex(planned.scope, planned.component.name, planned.revisionId);
|
|
152
|
+
activeChecks.delete(knowledgeScopeCacheKey(planned.scope, planned.component.name));
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
async compensate(plan, deploymentId) {
|
|
156
|
+
for (const planned of plan.components) {
|
|
157
|
+
if (planned.previousRevisionId === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
// Pinning the previous revision to the failed deployment id is harmless: the record
|
|
160
|
+
// never persisted, and the pin only widens GC protection of the retained revision.
|
|
161
|
+
await stores.revisionStore.activate(planned.scope, planned.component.name, planned.previousRevisionId, deploymentId);
|
|
162
|
+
activeChecks.delete(knowledgeScopeCacheKey(planned.scope, planned.component.name));
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
async finish(plan) {
|
|
166
|
+
for (const planned of plan.components) {
|
|
167
|
+
await stores.revisionStore.releaseLease(planned.lease);
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
async rollback(deploymentId) {
|
|
171
|
+
const restored = await stores.revisionStore.rollback(deploymentId);
|
|
172
|
+
for (const revision of restored) {
|
|
173
|
+
activeChecks.delete(knowledgeScopeCacheKey(revision.scope, revision.componentName));
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
async searchDocuments(scope, componentName, request) {
|
|
177
|
+
const cacheKey = knowledgeScopeCacheKey(scope, componentName);
|
|
178
|
+
const cached = activeChecks.get(cacheKey);
|
|
179
|
+
let revisionId;
|
|
180
|
+
if (cached !== undefined && now().getTime() - cached.checkedAt <= ACTIVE_REVISION_TTL_MS) {
|
|
181
|
+
revisionId = cached.revisionId;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
revisionId = (await stores.revisionStore.active(scope, componentName))?.revisionId;
|
|
185
|
+
activeChecks.set(cacheKey, { revisionId, checkedAt: now().getTime() });
|
|
186
|
+
}
|
|
187
|
+
if (revisionId === undefined)
|
|
188
|
+
return [];
|
|
189
|
+
await rebuildIndex(scope, componentName, revisionId);
|
|
190
|
+
return index.search(scope, componentName, request);
|
|
191
|
+
},
|
|
192
|
+
async sweep() {
|
|
193
|
+
const at = now().getTime();
|
|
194
|
+
if (at - lastSweep < SWEEP_INTERVAL_MS)
|
|
195
|
+
return;
|
|
196
|
+
lastSweep = at;
|
|
197
|
+
await stores.staging.sweepExpired();
|
|
198
|
+
await stores.revisionStore.collectGarbage();
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
return hooks;
|
|
202
|
+
}
|
|
203
|
+
function knowledgeScopeCacheKey(scope, componentName) {
|
|
204
|
+
return `${scope.org}/${scope.app}/${scope.env}#${componentName}`;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Wrap the caller's persistence step in the full publication transaction. The order is the
|
|
208
|
+
* ADR 0202 pairing: stage + verify + activate the revision, persist the artifact, and on a
|
|
209
|
+
* persistence failure re-activate the previous revision so the retained pair stays coherent.
|
|
210
|
+
*/
|
|
211
|
+
export async function withKnowledgePublication(hooks, tenant, deploymentId, components, persist) {
|
|
212
|
+
if (hooks === undefined || components === undefined || components.length === 0) {
|
|
213
|
+
return persist();
|
|
214
|
+
}
|
|
215
|
+
const plan = await hooks.publish(tenant, deploymentId, components);
|
|
216
|
+
try {
|
|
217
|
+
await hooks.activate(plan, deploymentId);
|
|
218
|
+
const result = await persist();
|
|
219
|
+
void hooks.sweep().catch(() => undefined);
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
await hooks.compensate(plan, deploymentId).catch(() => undefined);
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
await hooks.finish(plan);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=publication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication.js","sourceRoot":"","sources":["../src/publication.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import { type DocumentTextCodec, type KnowledgeScope } from '@noodle-borg/knowledge';
|
|
3
|
+
import type { KnowledgeStagingStore } from './staging-store.js';
|
|
4
|
+
export interface KnowledgeTenantRef {
|
|
5
|
+
readonly org: string;
|
|
6
|
+
readonly app: string;
|
|
7
|
+
readonly env: string;
|
|
8
|
+
}
|
|
9
|
+
export interface KnowledgeRouteDeps {
|
|
10
|
+
readonly staging: KnowledgeStagingStore;
|
|
11
|
+
/** Managed-config feature gate (`NOODLE_KNOWLEDGE_ENABLED`), resolved org → app → env. */
|
|
12
|
+
readonly knowledgeEnabled: (tenant: KnowledgeTenantRef) => Promise<boolean>;
|
|
13
|
+
/** Whole-set content-hash reuse: an unchanged component needs no uploads at all. */
|
|
14
|
+
readonly findRevisionByContentHash: (scope: KnowledgeScope, componentName: string, contentHash: string) => Promise<{
|
|
15
|
+
readonly revisionId: string;
|
|
16
|
+
} | undefined>;
|
|
17
|
+
readonly maxBodyBytes: number;
|
|
18
|
+
/** Seals staged bytes at rest; the service injects its secret-box codec. */
|
|
19
|
+
readonly codec?: DocumentTextCodec;
|
|
20
|
+
/** Operator read surface (list/status); wired by `wireKnowledge`, absent in bare handlers. */
|
|
21
|
+
readonly status?: import('./status-routes.js').KnowledgeStatusDeps;
|
|
22
|
+
}
|
|
23
|
+
export declare function knowledgeTenantKey(tenant: KnowledgeTenantRef): string;
|
|
24
|
+
/** The one command that turns the feature on for a tenant; every fail-closed error names it. */
|
|
25
|
+
export declare function knowledgeEnableCommand(tenant: KnowledgeTenantRef): string;
|
|
26
|
+
/**
|
|
27
|
+
* `POST /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/preflight` — diff declared document hashes
|
|
28
|
+
* against transient staging and published revisions; respond with exactly the hashes that
|
|
29
|
+
* still need bytes. Descriptors only; no contents cross this route.
|
|
30
|
+
*/
|
|
31
|
+
export declare function handleKnowledgePreflight(req: IncomingMessage, res: ServerResponse, tenant: KnowledgeTenantRef, deps: KnowledgeRouteDeps): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* `PUT /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/documents/{sha256}` — raw UTF-8 bytes,
|
|
34
|
+
* verified against the addressed hash before sealing into transient staging (ADR 0202 D5:
|
|
35
|
+
* the service verifies declared length and hash before publication).
|
|
36
|
+
*/
|
|
37
|
+
export declare function handleKnowledgeDocumentUpload(req: IncomingMessage, res: ServerResponse, tenant: KnowledgeTenantRef, sha256: string, deps: KnowledgeRouteDeps): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,0FAA0F;IAC1F,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,oFAAoF;IACpF,QAAQ,CAAC,yBAAyB,EAAE,CAClC,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,oBAAoB,EAAE,mBAAmB,CAAC;CACpE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED,gGAAgG;AAChG,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAKzE;AAYD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge control-plane route handlers (ADR 0202 as amended). The service dispatch
|
|
3
|
+
* authorizes the request and parses the tenant path, then delegates here; these handlers own
|
|
4
|
+
* validation, the feature gate, staging, and wire shapes — never auth.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { documentsContentHash, identityDocumentTextCodec, } from '@noodle-borg/knowledge';
|
|
8
|
+
import { MAX_DOCUMENT_BYTES } from '@noodle-borg/knowledge/limits';
|
|
9
|
+
import { knowledgePreflightRequestSchema, } from '@noodle-borg/wire-contracts';
|
|
10
|
+
import { readBody, sendJson } from './http.js';
|
|
11
|
+
export function knowledgeTenantKey(tenant) {
|
|
12
|
+
return `${tenant.org}/${tenant.app}/${tenant.env}`;
|
|
13
|
+
}
|
|
14
|
+
/** The one command that turns the feature on for a tenant; every fail-closed error names it. */
|
|
15
|
+
export function knowledgeEnableCommand(tenant) {
|
|
16
|
+
return (`noodle variables set NOODLE_KNOWLEDGE_ENABLED --value true --runtime cloud ` +
|
|
17
|
+
`--scope env --org ${tenant.org} --app ${tenant.app} --env ${tenant.env}`);
|
|
18
|
+
}
|
|
19
|
+
function sendGateClosed(res, tenant) {
|
|
20
|
+
sendJson(res, 403, {
|
|
21
|
+
code: 'knowledge_not_enabled',
|
|
22
|
+
error: 'knowledge is not enabled for this org/app/env',
|
|
23
|
+
fix: knowledgeEnableCommand(tenant),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
27
|
+
/**
|
|
28
|
+
* `POST /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/preflight` — diff declared document hashes
|
|
29
|
+
* against transient staging and published revisions; respond with exactly the hashes that
|
|
30
|
+
* still need bytes. Descriptors only; no contents cross this route.
|
|
31
|
+
*/
|
|
32
|
+
export async function handleKnowledgePreflight(req, res, tenant, deps) {
|
|
33
|
+
if (!(await deps.knowledgeEnabled(tenant)))
|
|
34
|
+
return sendGateClosed(res, tenant);
|
|
35
|
+
const body = await readBody(req, deps.maxBodyBytes);
|
|
36
|
+
if (!body.ok)
|
|
37
|
+
return sendJson(res, body.status, { error: body.error });
|
|
38
|
+
let request;
|
|
39
|
+
try {
|
|
40
|
+
const parsed = knowledgePreflightRequestSchema.safeParse(JSON.parse(body.body.toString('utf8')));
|
|
41
|
+
if (!parsed.success)
|
|
42
|
+
throw new Error(parsed.error.issues[0]?.message ?? 'invalid request');
|
|
43
|
+
request = parsed.data;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return sendJson(res, 400, {
|
|
47
|
+
code: 'invalid_knowledge_request',
|
|
48
|
+
error: `invalid knowledge preflight request: ${error.message}`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const tenantKey = knowledgeTenantKey(tenant);
|
|
52
|
+
const scope = { org: tenant.org, app: tenant.app, env: tenant.env };
|
|
53
|
+
const missing = [];
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
for (const component of request.components) {
|
|
56
|
+
const hashes = component.documents.map((document) => document.sha256);
|
|
57
|
+
const published = await deps.findRevisionByContentHash(scope, component.name, documentsContentHash(hashes));
|
|
58
|
+
if (published !== undefined)
|
|
59
|
+
continue;
|
|
60
|
+
for (const sha256 of hashes) {
|
|
61
|
+
if (seen.has(sha256))
|
|
62
|
+
continue;
|
|
63
|
+
seen.add(sha256);
|
|
64
|
+
if (!(await deps.staging.has(tenantKey, sha256)))
|
|
65
|
+
missing.push(sha256);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const response = { ok: true, missing };
|
|
69
|
+
return sendJson(res, 200, response);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* `PUT /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/documents/{sha256}` — raw UTF-8 bytes,
|
|
73
|
+
* verified against the addressed hash before sealing into transient staging (ADR 0202 D5:
|
|
74
|
+
* the service verifies declared length and hash before publication).
|
|
75
|
+
*/
|
|
76
|
+
export async function handleKnowledgeDocumentUpload(req, res, tenant, sha256, deps) {
|
|
77
|
+
if (!(await deps.knowledgeEnabled(tenant)))
|
|
78
|
+
return sendGateClosed(res, tenant);
|
|
79
|
+
if (!SHA256_HEX.test(sha256)) {
|
|
80
|
+
return sendJson(res, 400, {
|
|
81
|
+
code: 'invalid_knowledge_request',
|
|
82
|
+
error: 'document address must be a lowercase hex sha256',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const body = await readBody(req, Math.min(deps.maxBodyBytes, MAX_DOCUMENT_BYTES));
|
|
86
|
+
if (!body.ok)
|
|
87
|
+
return sendJson(res, body.status, { error: body.error });
|
|
88
|
+
const actual = createHash('sha256').update(body.body).digest('hex');
|
|
89
|
+
if (actual !== sha256) {
|
|
90
|
+
return sendJson(res, 400, {
|
|
91
|
+
code: 'knowledge_document_hash_mismatch',
|
|
92
|
+
error: 'uploaded bytes do not match the addressed content hash',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const codec = deps.codec ?? identityDocumentTextCodec;
|
|
96
|
+
await deps.staging.put(knowledgeTenantKey(tenant), sha256, await codec.seal(body.body), body.body.length);
|
|
97
|
+
const response = { ok: true, sha256 };
|
|
98
|
+
return sendJson(res, 200, response);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts the knowledge search executor to the runtime's deployment-bound port shape
|
|
3
|
+
* (structurally typed against `@noodle-borg/runtime`'s `KnowledgeSearchPort`): tenant and
|
|
4
|
+
* component set are bound once per deployment; failures become typed refusals, never partial
|
|
5
|
+
* answers, and no provider detail crosses the port.
|
|
6
|
+
*/
|
|
7
|
+
import { type SearchHit } from '@noodle-borg/knowledge';
|
|
8
|
+
import type { KnowledgeSearchComponent, KnowledgeSearchExecutor } from './executor.js';
|
|
9
|
+
import type { KnowledgeTenantRef } from './routes.js';
|
|
10
|
+
export interface BoundKnowledgeSearchPort {
|
|
11
|
+
enabled(): Promise<boolean>;
|
|
12
|
+
search(componentName: string, request: {
|
|
13
|
+
readonly query: string;
|
|
14
|
+
readonly limit?: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
readonly ok: true;
|
|
17
|
+
readonly hits: readonly SearchHit[];
|
|
18
|
+
} | {
|
|
19
|
+
readonly ok: false;
|
|
20
|
+
readonly reason: 'budget_exhausted' | 'not_enabled' | 'provider_error';
|
|
21
|
+
readonly message: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export type KnowledgeSearchPortFactory = (tenant: {
|
|
25
|
+
readonly org: string;
|
|
26
|
+
readonly app: string;
|
|
27
|
+
readonly env: string;
|
|
28
|
+
}, components: readonly KnowledgeSearchComponent[]) => BoundKnowledgeSearchPort;
|
|
29
|
+
export declare function knowledgeSearchPortFactory(executor: KnowledgeSearchExecutor): KnowledgeSearchPortFactory;
|
|
30
|
+
export declare function bindKnowledgeSearchPort(executor: KnowledgeSearchExecutor, tenant: KnowledgeTenantRef, components: readonly KnowledgeSearchComponent[]): BoundKnowledgeSearchPort;
|
|
31
|
+
//# sourceMappingURL=search-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-port.d.ts","sourceRoot":"","sources":["../src/search-port.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,wBAAwB;IACvC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,CACJ,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,OAAO,CACN;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE,GAC1D;QACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,aAAa,GAAG,gBAAgB,CAAC;QACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CACJ,CAAC;CACH;AAED,MAAM,MAAM,0BAA0B,GAAG,CACvC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC5E,UAAU,EAAE,SAAS,wBAAwB,EAAE,KAC5C,wBAAwB,CAAC;AAE9B,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,uBAAuB,GAChC,0BAA0B,CAE5B;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,uBAAuB,EACjC,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,SAAS,wBAAwB,EAAE,GAC9C,wBAAwB,CAuB1B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts the knowledge search executor to the runtime's deployment-bound port shape
|
|
3
|
+
* (structurally typed against `@noodle-borg/runtime`'s `KnowledgeSearchPort`): tenant and
|
|
4
|
+
* component set are bound once per deployment; failures become typed refusals, never partial
|
|
5
|
+
* answers, and no provider detail crosses the port.
|
|
6
|
+
*/
|
|
7
|
+
import { KnowledgeError, SearchBudgetExhaustedError } from '@noodle-borg/knowledge';
|
|
8
|
+
export function knowledgeSearchPortFactory(executor) {
|
|
9
|
+
return (tenant, components) => bindKnowledgeSearchPort(executor, tenant, components);
|
|
10
|
+
}
|
|
11
|
+
export function bindKnowledgeSearchPort(executor, tenant, components) {
|
|
12
|
+
return {
|
|
13
|
+
enabled: () => executor.enabled(tenant),
|
|
14
|
+
async search(componentName, request) {
|
|
15
|
+
const component = components.find((candidate) => candidate.name === componentName);
|
|
16
|
+
if (component === undefined) {
|
|
17
|
+
return { ok: false, reason: 'provider_error', message: 'unknown knowledge component' };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const hits = await executor.search(tenant, component, request);
|
|
21
|
+
return { ok: true, hits };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof SearchBudgetExhaustedError) {
|
|
25
|
+
return { ok: false, reason: 'budget_exhausted', message: error.message };
|
|
26
|
+
}
|
|
27
|
+
if (error instanceof KnowledgeError) {
|
|
28
|
+
const reason = error.layer === 'request' ? 'not_enabled' : 'provider_error';
|
|
29
|
+
return { ok: false, reason, message: error.message };
|
|
30
|
+
}
|
|
31
|
+
return { ok: false, reason: 'provider_error', message: 'knowledge search failed' };
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=search-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-port.js","sourceRoot":"","sources":["../src/search-port.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAkB,MAAM,wBAAwB,CAAC;AAwBpG,MAAM,UAAU,0BAA0B,CACxC,QAAiC;IAEjC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAAiC,EACjC,MAA0B,EAC1B,UAA+C;IAE/C,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACvC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YACnF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;YACzF,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;oBAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3E,CAAC;gBACD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;oBACpC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBAC5E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvD,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;YACrF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composition helpers the service calls from its (size-pinned) bootstrap files, so the thin
|
|
3
|
+
* dispatch stays thin: store construction, schema setup, and route-deps assembly live here.
|
|
4
|
+
*/
|
|
5
|
+
import { type CompiledKnowledgeComponent, type DocumentTextCodec, type KnowledgeRevisionStore, type SearchBudgetCeilings, type SearchBudgetStore } from '@noodle-borg/knowledge';
|
|
6
|
+
import type { Pool } from 'pg';
|
|
7
|
+
import { type StringSecretBox } from './codec.js';
|
|
8
|
+
import { type KnowledgeSearchExecutor } from './executor.js';
|
|
9
|
+
import { type ManagedGoogleKnowledge } from './managed-google.js';
|
|
10
|
+
import { type KnowledgeDeployHooks } from './publication.js';
|
|
11
|
+
import type { KnowledgeRouteDeps, KnowledgeTenantRef } from './routes.js';
|
|
12
|
+
import { type KnowledgeSearchPortFactory } from './search-port.js';
|
|
13
|
+
import { type KnowledgeStagingStore } from './staging-store.js';
|
|
14
|
+
export interface KnowledgeServiceStores {
|
|
15
|
+
readonly staging: KnowledgeStagingStore;
|
|
16
|
+
readonly revisionStore: KnowledgeRevisionStore;
|
|
17
|
+
readonly codec?: DocumentTextCodec;
|
|
18
|
+
/** Org-pooled monthly site-search spend control (per-app sub-caps). */
|
|
19
|
+
readonly budgetStore?: SearchBudgetStore;
|
|
20
|
+
/** Managed Noodle-owned Google project; absent means the sites tier is dark. */
|
|
21
|
+
readonly google?: ManagedGoogleKnowledge;
|
|
22
|
+
}
|
|
23
|
+
/** In-memory stores with the identity codec — the no-persistence service default. */
|
|
24
|
+
export declare function defaultKnowledgeStores(): KnowledgeServiceStores;
|
|
25
|
+
/** Durable stores sharing the service's Postgres pool and secret-box custody. */
|
|
26
|
+
export declare function createPostgresKnowledgeStores(pool: Pool, secretBox?: StringSecretBox, env?: NodeJS.ProcessEnv): Promise<KnowledgeServiceStores>;
|
|
27
|
+
/** Budget ceilings from managed config with the ratified v0 defaults (2000 org / 1000 app). */
|
|
28
|
+
export declare function budgetCeilingsResolver(resolveVariables: (tenant: KnowledgeTenantRef) => Promise<Record<string, string>>): (tenant: KnowledgeTenantRef) => Promise<SearchBudgetCeilings>;
|
|
29
|
+
/** Assemble route deps over the service's managed-config resolver (`NOODLE_KNOWLEDGE_ENABLED`). */
|
|
30
|
+
export declare function buildKnowledgeRouteDeps(stores: KnowledgeServiceStores, resolveVariables: (tenant: KnowledgeTenantRef) => Promise<Record<string, string>>, maxBodyBytes: number): KnowledgeRouteDeps;
|
|
31
|
+
/**
|
|
32
|
+
* One-call composition for the service: resolve stores, build route deps, and register the
|
|
33
|
+
* deploy-coupled publication hooks on the registry (structurally typed; no service import).
|
|
34
|
+
*/
|
|
35
|
+
export declare function wireKnowledge(registry: {
|
|
36
|
+
setKnowledgeDeployHooks(hooks: KnowledgeDeployHooks, search?: KnowledgeSearchPortFactory): void;
|
|
37
|
+
getActiveByTenant(ref: {
|
|
38
|
+
org: string;
|
|
39
|
+
app: string;
|
|
40
|
+
env: string;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
readonly served: {
|
|
43
|
+
readonly artifact: {
|
|
44
|
+
readonly server: ActiveServerKnowledge;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
} | undefined>;
|
|
48
|
+
}, stores: KnowledgeServiceStores | undefined, resolveVariables: (tenant: KnowledgeTenantRef) => Promise<Record<string, string>>, maxBodyBytes: number): KnowledgeRouteDeps & {
|
|
49
|
+
readonly executor: KnowledgeSearchExecutor;
|
|
50
|
+
};
|
|
51
|
+
interface ActiveServerKnowledge {
|
|
52
|
+
readonly knowledge?: readonly CompiledKnowledgeComponent[] | undefined;
|
|
53
|
+
readonly deploymentId?: string | undefined;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=service-wiring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-wiring.d.ts","sourceRoot":"","sources":["../src/service-wiring.ts"],"names":[],"mappings":"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"}
|