@noodleseed/one 0.161.2 → 0.163.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/billing-catalog-ops.d.ts +4 -0
- package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
- package/dist/commands/billing-catalog-ops.js +58 -0
- package/dist/commands/billing-catalog-ops.js.map +1 -0
- package/dist/commands/billing-ops.d.ts.map +1 -1
- package/dist/commands/billing-ops.js +3 -0
- package/dist/commands/billing-ops.js.map +1 -1
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +3 -0
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/config-values.d.ts.map +1 -1
- package/dist/commands/config-values.js +16 -0
- package/dist/commands/config-values.js.map +1 -1
- package/dist/commands/installation-variables.d.ts +26 -0
- package/dist/commands/installation-variables.d.ts.map +1 -0
- package/dist/commands/installation-variables.js +171 -0
- package/dist/commands/installation-variables.js.map +1 -0
- package/dist/commands/solutions-activity.d.ts +5 -0
- package/dist/commands/solutions-activity.d.ts.map +1 -0
- package/dist/commands/solutions-activity.js +116 -0
- package/dist/commands/solutions-activity.js.map +1 -0
- package/dist/commands/solutions-connections.d.ts +7 -0
- package/dist/commands/solutions-connections.d.ts.map +1 -0
- package/dist/commands/solutions-connections.js +88 -0
- package/dist/commands/solutions-connections.js.map +1 -0
- package/dist/commands/solutions-installation-options.d.ts +5 -0
- package/dist/commands/solutions-installation-options.d.ts.map +1 -0
- package/dist/commands/solutions-installation-options.js +52 -0
- package/dist/commands/solutions-installation-options.js.map +1 -0
- package/dist/commands/solutions-onboarding.d.ts +5 -0
- package/dist/commands/solutions-onboarding.d.ts.map +1 -0
- package/dist/commands/solutions-onboarding.js +113 -0
- package/dist/commands/solutions-onboarding.js.map +1 -0
- package/dist/commands/solutions-ops.d.ts +7 -0
- package/dist/commands/solutions-ops.d.ts.map +1 -0
- package/dist/commands/solutions-ops.js +544 -0
- package/dist/commands/solutions-ops.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
- package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
- package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
- package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
- package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
- package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
- package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
- package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
- package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
- package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
- package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
- package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +4 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +6 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +21 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
- package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
- package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
- package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
- package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
- package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
- package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
- package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
- package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
- package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +40 -0
- package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +39 -0
- package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
- package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
- package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts +6 -1
- package/node_modules/@noodle-borg/authoring/dist/server.js +5 -43
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +5 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +26 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +9 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +9 -1
- package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
- package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.js +9 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts +5 -1
- package/node_modules/@noodle-borg/compiler/dist/index.js +4 -0
- package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
- package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
- package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +50 -0
- package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +373 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +114 -36
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +5 -0
- package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
- package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
- package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
- package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
- package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
- package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
- package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
- package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +2 -1
- package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
- package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
- package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
- package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
- package/node_modules/@noodle-borg/module/dist/contract.d.ts +20 -0
- package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
- package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
- package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
- package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
- package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
- package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
- package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
- package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
- package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
- package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
- package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
- package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
- package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
- package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
- package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
- package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
- package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
- package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
- package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
- package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
- package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
- package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
- package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
- package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
- package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
- package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
- package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
- package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
- package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
- package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
- package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
- package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
- package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
- package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
- package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
- package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
- package/node_modules/@noodle-borg/service/dist/business-information/contracts.js +5 -0
- package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
- package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
- package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
- package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
- package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +557 -0
- package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
- package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
- package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
- package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
- package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
- package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
- package/node_modules/@noodle-borg/service/dist/business-information/model.js +393 -0
- package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
- package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
- package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +78 -0
- package/node_modules/@noodle-borg/service/dist/business-information/portable.js +15 -0
- package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
- package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
- package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +252 -0
- package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
- package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
- package/node_modules/@noodle-borg/service/dist/business-information/validation.js +200 -0
- package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
- package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
- package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
- package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
- package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
- package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
- package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
- package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
- package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
- package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +5 -2
- package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
- package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
- package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
- package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
- package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
- package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
- package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
- package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
- package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
- package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
- package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
- package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +131 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +168 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +317 -0
- package/node_modules/@noodle-borg/service/dist/routes/business-information.js +592 -0
- package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -233
- package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
- package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +6 -0
- package/node_modules/@noodle-borg/service/dist/service.js +77 -6
- package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
- package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
- package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
- package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
- package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
- package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
- package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
- package/node_modules/@noodle-borg/service/package.json +2 -2
- package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
- package/node_modules/@noodle-borg/transport-http/package.json +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
- package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
- package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
- package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +2241 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +580 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
- package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +12 -3
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +9 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +6 -6
- package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +15 -15
- package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
- package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
- package/node_modules/@noodleseed/assistant/README.md +5 -0
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AssistantInteractionCapacityError, assistantConfirmationReview, assistantConfirmationTransition, assistantInputTransition, assistantInteractionTool, assistantPreparedArgumentReview, assistantPreparedToolContinuation, assistantSafeOutput, assistantToolContinuation, assistantViewAvailableData, auditAssistantInteraction, recoverableAssistantView, withAssistantSessionExecutionAuthority, } from '@noodle-borg/assistant-gateway/portable';
|
|
1
|
+
import { AssistantInteractionCapacityError, assistantConfirmationReview, assistantConfirmationTransition, assistantInputTransition, assistantInteractionTool, assistantPreparedArgumentReview, assistantPreparedToolContinuation, assistantSafeOutput, assistantToolContinuation, assistantViewAvailableData, auditAssistantInteraction, boundedAssistantExecution, recoverableAssistantView, withAssistantSessionExecutionAuthority, } from '@noodle-borg/assistant-gateway/portable';
|
|
2
2
|
import { executePreparedTool, executeToolInteractive, resumeTool, resumeToolPreparation, } from '@noodle-borg/runtime';
|
|
3
3
|
import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
|
|
4
4
|
import { applyBrowserCors, authenticateSession, now, } from './assistant.js';
|
|
@@ -49,7 +49,7 @@ async function handleResolution(req, res, deps, legacyAcceptOnly) {
|
|
|
49
49
|
return sendJson(res, 409, { error: 'interaction is invalid or expired' });
|
|
50
50
|
}
|
|
51
51
|
if (response.value.action !== 'accept') {
|
|
52
|
-
return resolveStop(res, deps, session, interaction, response.value.action, suggestions);
|
|
52
|
+
return resolveStop(req, res, deps, session, interaction, response.value.action, suggestions);
|
|
53
53
|
}
|
|
54
54
|
if (interaction.kind === 'confirmation' && response.value.content !== undefined) {
|
|
55
55
|
return sendJson(res, 400, { error: 'confirmation content cannot replace reviewed arguments' });
|
|
@@ -76,13 +76,13 @@ async function handleResolution(req, res, deps, legacyAcceptOnly) {
|
|
|
76
76
|
}
|
|
77
77
|
acceptedContent = validated.value;
|
|
78
78
|
}
|
|
79
|
-
return resolveAccept(res, deps, session, interaction, acceptedContent, suggestions);
|
|
79
|
+
return resolveAccept(req, res, deps, session, interaction, acceptedContent, suggestions);
|
|
80
80
|
}
|
|
81
|
-
async function resolveAccept(res, deps, session, interaction, content, suggestions) {
|
|
81
|
+
async function resolveAccept(req, res, deps, session, interaction, content, suggestions) {
|
|
82
82
|
if (interaction.status !== 'pending') {
|
|
83
83
|
return replayOrConflict(res, deps, session, interaction, 'accept');
|
|
84
84
|
}
|
|
85
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
85
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
86
86
|
if (!target) {
|
|
87
87
|
await auditAssistantInteraction({
|
|
88
88
|
audit: deps.audit,
|
|
@@ -126,38 +126,50 @@ async function resolveAccept(res, deps, session, interaction, content, suggestio
|
|
|
126
126
|
action: 'accept',
|
|
127
127
|
status: 'accepted',
|
|
128
128
|
});
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
tool.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
129
|
+
const result = await boundedAssistantExecution(async (signal) => {
|
|
130
|
+
const executeDeps = {
|
|
131
|
+
...withAssistantSessionExecutionAuthority(target.served.deps, target.served.artifact, session),
|
|
132
|
+
caller: session.caller,
|
|
133
|
+
context,
|
|
134
|
+
invocationId: claimed.interaction.id,
|
|
135
|
+
signal,
|
|
136
|
+
};
|
|
137
|
+
let result;
|
|
138
|
+
if (claimed.interaction.kind === 'confirmation') {
|
|
139
|
+
const prepared = assistantPreparedToolContinuation(claimed.interaction);
|
|
140
|
+
const tool = target.served.artifact.tools.find((candidate) => candidate.name === claimed.interaction.tool);
|
|
141
|
+
if (!prepared &&
|
|
142
|
+
tool?.fulfilment.kind === 'flow' &&
|
|
143
|
+
tool.fulfilment.steps.some((step) => step.kind === 'elicit')) {
|
|
144
|
+
result = {
|
|
145
|
+
status: 'failed',
|
|
146
|
+
error: {
|
|
147
|
+
code: 'invalid_continuation',
|
|
148
|
+
message: 'legacy confirmation did not capture elicited input',
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
result = prepared
|
|
154
|
+
? await executePreparedTool(target.served.artifact, prepared, executeDeps)
|
|
155
|
+
: await executeToolInteractive(target.served.artifact, claimed.interaction.tool, claimed.interaction.arguments, executeDeps);
|
|
156
|
+
}
|
|
148
157
|
}
|
|
149
158
|
else {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
159
|
+
const continuation = assistantToolContinuation(claimed.interaction);
|
|
160
|
+
result = isToolPreparationContinuation(continuation)
|
|
161
|
+
? await resumeToolPreparation(target.served.artifact, continuation, { action: 'accept', content }, executeDeps)
|
|
162
|
+
: await resumeTool(target.served.artifact, continuation, { action: 'accept', content }, executeDeps);
|
|
153
163
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
:
|
|
160
|
-
|
|
164
|
+
return result;
|
|
165
|
+
}, () => ({
|
|
166
|
+
status: 'failed',
|
|
167
|
+
error: {
|
|
168
|
+
code: 'connector_error',
|
|
169
|
+
reason: 'operation_outcome_unknown',
|
|
170
|
+
message: 'Execution stopped. Verify the original outcome before requesting another write.',
|
|
171
|
+
},
|
|
172
|
+
}));
|
|
161
173
|
return finishExecution(res, deps, session, claimed.interaction, context, result, target, suggestions);
|
|
162
174
|
}
|
|
163
175
|
async function finishExecution(res, deps, session, interaction, context, result, target, suggestions) {
|
|
@@ -371,11 +383,11 @@ async function finishExecution(res, deps, session, interaction, context, result,
|
|
|
371
383
|
await narrateResolvedInteraction(res, deps, target, session, toolName, 'accept', safeOutput, context, suggestions);
|
|
372
384
|
return endInteractionSse(res);
|
|
373
385
|
}
|
|
374
|
-
async function resolveStop(res, deps, session, interaction, action, suggestions) {
|
|
386
|
+
async function resolveStop(req, res, deps, session, interaction, action, suggestions) {
|
|
375
387
|
if (interaction.status !== 'pending') {
|
|
376
388
|
return replayOrConflict(res, deps, session, interaction, action);
|
|
377
389
|
}
|
|
378
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
390
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
379
391
|
const context = target
|
|
380
392
|
? await resolveAssistantInteractionContext(interaction, session, target, deps)
|
|
381
393
|
: undefined;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { authorizePublicConfiguration, effectiveAssistantBrowserConfiguration, publicEmbedTenant, publicSurfaceOf, } from '@noodle-borg/assistant-gateway/portable';
|
|
2
2
|
import { sendJson } from '@noodle-borg/transport-http';
|
|
3
3
|
import { applyBrowserCors } from './assistant-route-http.js';
|
|
4
|
+
import { activeAssistantTarget } from './assistant-session-target.js';
|
|
4
5
|
/** Browser-safe first paint for a public launcher; never mints a session or spends admission. */
|
|
5
6
|
export async function handlePublicAssistantConfiguration(req, res, embedId, deps) {
|
|
6
7
|
if (req.method !== 'GET')
|
|
@@ -13,7 +14,7 @@ export async function handlePublicAssistantConfiguration(req, res, embedId, deps
|
|
|
13
14
|
const authorized = await authorizePublicConfiguration({ embedId, origin }, {
|
|
14
15
|
embeds: deps.publicEmbeds,
|
|
15
16
|
resolveActiveSurface: async (embed) => {
|
|
16
|
-
state.target = await deps
|
|
17
|
+
state.target = await activeAssistantTarget(deps, publicEmbedTenant(embed));
|
|
17
18
|
return state.target
|
|
18
19
|
? publicSurfaceOf(state.target.served.artifact.server.assistant)
|
|
19
20
|
: undefined;
|
|
@@ -29,7 +30,7 @@ export async function handlePublicAssistantConfiguration(req, res, embedId, deps
|
|
|
29
30
|
if (target === undefined) {
|
|
30
31
|
return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
|
|
31
32
|
}
|
|
32
|
-
const resolved = await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(authorized.embed), deps.appearance, 'public');
|
|
33
|
+
const resolved = await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(authorized.embed), deps.appearance, 'public', target.businessNotice);
|
|
33
34
|
applyBrowserCors(req, res, origin);
|
|
34
35
|
res.setHeader('cache-control', 'private, no-cache');
|
|
35
36
|
return sendJson(res, 200, {
|
|
@@ -5,6 +5,7 @@ import { assistantSessionUsageRequestEvent, captureAssistantUsage, captureRefuse
|
|
|
5
5
|
import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
|
|
6
6
|
import { assistantSessionResponseSchema } from '@noodle-borg/wire-contracts';
|
|
7
7
|
import { applyBrowserCors, assistantSessionEndpoints, now } from './assistant-route-http.js';
|
|
8
|
+
import { activeAssistantTarget } from './assistant-session-target.js';
|
|
8
9
|
/**
|
|
9
10
|
* The transport half of anonymous session minting. Every decision — which refusal, in which order, and
|
|
10
11
|
* whether the surface may serve at all — lives in `@noodle-borg/assistant-gateway`; this file parses a
|
|
@@ -28,11 +29,9 @@ export async function handlePublicAssistantSession(req, res, deps) {
|
|
|
28
29
|
const { embedId, visitorId } = body.value;
|
|
29
30
|
// The browser's Origin header is the claim under test. The body never asserts its own origin.
|
|
30
31
|
const origin = typeof req.headers.origin === 'string' ? req.headers.origin : undefined;
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
// applies — losing fairness, never solvency.
|
|
35
|
-
const addressBucket = clientAddressBucket(typeof req.headers['x-forwarded-for'] === 'string' ? req.headers['x-forwarded-for'] : undefined);
|
|
32
|
+
// Without deployment-verified ingress attribution only the immediate peer is authoritative.
|
|
33
|
+
// A shared proxy bucket can reduce fairness, but forged forwarding headers cannot rotate it.
|
|
34
|
+
const addressBucket = clientAddressBucket(req.socket.remoteAddress);
|
|
36
35
|
let configuration;
|
|
37
36
|
let sponsoredBudget;
|
|
38
37
|
let usageSession;
|
|
@@ -40,7 +39,7 @@ export async function handlePublicAssistantSession(req, res, deps) {
|
|
|
40
39
|
embeds,
|
|
41
40
|
counters,
|
|
42
41
|
resolveActiveSurface: async (embed) => {
|
|
43
|
-
const target = await deps
|
|
42
|
+
const target = await activeAssistantTarget(deps, publicEmbedTenant(embed));
|
|
44
43
|
if (!target?.deploymentId)
|
|
45
44
|
return undefined;
|
|
46
45
|
if (target.served.artifact.server.assistant?.model.kind === 'noodle-managed') {
|
|
@@ -55,11 +54,12 @@ export async function handlePublicAssistantSession(req, res, deps) {
|
|
|
55
54
|
},
|
|
56
55
|
resolveBudgetBounds: async () => sponsoredBudget,
|
|
57
56
|
createSession: async (input) => {
|
|
58
|
-
const target = await deps
|
|
59
|
-
if (!target?.deploymentId
|
|
60
|
-
|
|
57
|
+
const target = await activeAssistantTarget(deps, publicEmbedTenant(input.embed));
|
|
58
|
+
if (!target?.deploymentId ||
|
|
59
|
+
!publicSurfaceOf(target.served.artifact.server.assistant)?.origins.includes(input.origin))
|
|
60
|
+
throw new Error('assistant surface changed mid-mint');
|
|
61
61
|
const current = now(deps);
|
|
62
|
-
configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(input.embed), deps.appearance, 'public')).effective;
|
|
62
|
+
configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(input.embed), deps.appearance, 'public', target.businessNotice)).effective;
|
|
63
63
|
const created = await deps.store.createSession({
|
|
64
64
|
// A public surface has no client credential, so the embed id stands in as the minting
|
|
65
65
|
// authority. It is not a secret and nothing downstream may begin treating it as one.
|
|
@@ -1,6 +1,35 @@
|
|
|
1
|
-
import { resolveAssistantSessionTarget, } from '@noodle-borg/assistant-gateway/portable';
|
|
1
|
+
import { assistantConfigurationHasBusinessNotice, resolveAssistantSessionTarget, } from '@noodle-borg/assistant-gateway/portable';
|
|
2
|
+
import { resolveTargetOrigins } from '../application-runtime-target.js';
|
|
2
3
|
/** Adapt the registry to the gateway-owned, surface-projected session target decision. */
|
|
3
|
-
export function sessionScopedTarget(registry, session) {
|
|
4
|
-
|
|
4
|
+
export async function sessionScopedTarget(registry, session, resolve = resolveTargetOrigins, req) {
|
|
5
|
+
const target = await resolveAssistantSessionTarget(async (deploymentId) => {
|
|
6
|
+
const target = await registry.get(deploymentId);
|
|
7
|
+
return target && resolve(target);
|
|
8
|
+
}, session);
|
|
9
|
+
if (target === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (target.businessNotice &&
|
|
12
|
+
!assistantConfigurationHasBusinessNotice(session.configuration, target.businessNotice))
|
|
13
|
+
return undefined;
|
|
14
|
+
const publicAdmission = trustedPublicAdmission({
|
|
15
|
+
scope: `${session.tenant.org}/${session.tenant.app}/${session.tenant.env}`,
|
|
16
|
+
sourceAddress: req?.socket?.remoteAddress,
|
|
17
|
+
subject: session.caller.subject,
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
...target,
|
|
21
|
+
served: {
|
|
22
|
+
...target.served,
|
|
23
|
+
deps: {
|
|
24
|
+
...target.served.deps,
|
|
25
|
+
...(publicAdmission === undefined ? {} : { publicAdmission }),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
5
29
|
}
|
|
30
|
+
export async function activeAssistantTarget(deps, tenant) {
|
|
31
|
+
const target = await deps.registry.getActiveByTenant(tenant);
|
|
32
|
+
return target && (deps.resolveRuntimeTarget ?? resolveTargetOrigins)(target);
|
|
33
|
+
}
|
|
34
|
+
import { trustedPublicAdmission } from '@noodle-borg/admission-limits/portable';
|
|
6
35
|
//# sourceMappingURL=assistant-session-target.js.map
|
|
@@ -36,7 +36,7 @@ export async function handleAssistantSuggestions(req, res, deps) {
|
|
|
36
36
|
}
|
|
37
37
|
if (claim.disposition !== 'generate')
|
|
38
38
|
return writeEmptySuggestions(res, session.origin);
|
|
39
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
39
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
40
40
|
if (!target) {
|
|
41
41
|
await deps.store.failInitialSuggestions(session.id);
|
|
42
42
|
return writeEmptySuggestions(res, session.origin);
|
|
@@ -18,7 +18,7 @@ export async function handleAssistantTranscript(req, res, deps) {
|
|
|
18
18
|
if (!session)
|
|
19
19
|
return;
|
|
20
20
|
applyBrowserCors(req, res, session.origin);
|
|
21
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
21
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
22
22
|
const latestView = target && session.latestView
|
|
23
23
|
? assistantViewAvailableData(target.served.artifact, { ...session.latestView, replayed: true }, (failure) => deps.logger?.warn('assistant.view.unresolved', { ...failure }))
|
|
24
24
|
: undefined;
|
|
@@ -13,7 +13,7 @@ import { createAssistantTurnStats, runAgentTurn } from './assistant-agent.js';
|
|
|
13
13
|
import { elevateAssistantSession } from './assistant-elevation.js';
|
|
14
14
|
import { executeAssistantKnowledgeSearch, findAssistantKnowledgeComponent, resolveAssistantKnowledge, } from './assistant-knowledge.js';
|
|
15
15
|
import { applyBrowserCors, assistantSessionEndpoints, authenticateSession, handleAssistantPreflight, now, } from './assistant-route-http.js';
|
|
16
|
-
import { sessionScopedTarget } from './assistant-session-target.js';
|
|
16
|
+
import { activeAssistantTarget, sessionScopedTarget } from './assistant-session-target.js';
|
|
17
17
|
import { authorizeControlPlane } from './control-plane.js';
|
|
18
18
|
export { applyBrowserCors, authenticateSession, handleAssistantPreflight, now };
|
|
19
19
|
const SESSION_ABSOLUTE_MS = 2 * 60 * 60 * 1000;
|
|
@@ -62,7 +62,7 @@ export async function handleAssistantSession(req, res, deps) {
|
|
|
62
62
|
// Clients are tenant-bound: sessions follow the tenant's ACTIVE deployment, and the origin
|
|
63
63
|
// allowlist is read from the live artifact, so `noodle deploy` alone updates a live embed.
|
|
64
64
|
// client.deploymentId/allowedOrigins remain as created-against audit data.
|
|
65
|
-
const target = await deps
|
|
65
|
+
const target = await activeAssistantTarget(deps, client.tenant);
|
|
66
66
|
const assistant = target?.served.artifact.server.assistant;
|
|
67
67
|
if (!target?.deploymentId || !assistant)
|
|
68
68
|
return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
|
|
@@ -98,7 +98,7 @@ export async function handleAssistantSession(req, res, deps) {
|
|
|
98
98
|
const declaredClaims = assistant.sessionClaims ?? {};
|
|
99
99
|
const claims = Object.fromEntries(Object.entries(isAssistantVerifiedClaims(parsed.claims) ? parsed.claims : {}).filter(([key]) => key in declaredClaims));
|
|
100
100
|
const current = now(deps);
|
|
101
|
-
const configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, client.tenant, deps.appearance, surfaceBinding.kind === 'pre-surfaces' ? undefined : surfaceBinding.kind)).effective;
|
|
101
|
+
const configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, client.tenant, deps.appearance, surfaceBinding.kind === 'pre-surfaces' ? undefined : surfaceBinding.kind, target.businessNotice)).effective;
|
|
102
102
|
const roles = canonicalizeAuthorizationClaimValues(parsed.user.roles, 'role');
|
|
103
103
|
const scopes = canonicalizeAuthorizationClaimValues(parsed.user.scopes, 'scope');
|
|
104
104
|
// Hoisted so an elevation and a fresh exchange bind the *same* principal. Two constructions would be
|
|
@@ -195,7 +195,10 @@ export async function handleAssistantTurn(req, res, deps) {
|
|
|
195
195
|
return sendJson(res, body.status, { error: body.error });
|
|
196
196
|
// Admission tier 3, hashed here for the same reason the mint hashes it: no raw address may reach the
|
|
197
197
|
// decision, a counter key, or an audit payload.
|
|
198
|
-
const
|
|
198
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
199
|
+
if (!target)
|
|
200
|
+
return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
|
|
201
|
+
const addressBucket = clientAddressBucket(req.socket.remoteAddress);
|
|
199
202
|
let turn;
|
|
200
203
|
let message;
|
|
201
204
|
let resumedTool;
|
|
@@ -256,8 +259,8 @@ export async function handleAssistantTurn(req, res, deps) {
|
|
|
256
259
|
if (message.trim().length === 0) {
|
|
257
260
|
return sendJson(res, 400, { error: '"message" must be a non-empty string' });
|
|
258
261
|
}
|
|
259
|
-
//
|
|
260
|
-
//
|
|
262
|
+
// Resolve live authority first: a paused application or removed origin spends no turn allowance.
|
|
263
|
+
// Admission still precedes every model request and business operation.
|
|
261
264
|
const refusal = await refusePublicTurn(deps, session, message, addressBucket);
|
|
262
265
|
if (refusal)
|
|
263
266
|
return refuseTurn(deps, res, session, refusal, usageStartedAt);
|
|
@@ -265,9 +268,6 @@ export async function handleAssistantTurn(req, res, deps) {
|
|
|
265
268
|
if (session.pendingResume)
|
|
266
269
|
await deps.store.consumePendingResume(session.id);
|
|
267
270
|
}
|
|
268
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
269
|
-
if (!target)
|
|
270
|
-
return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
|
|
271
271
|
if (resumedTool !== undefined &&
|
|
272
272
|
!target.served.artifact.tools.some((tool) => tool.name === resumedTool)) {
|
|
273
273
|
// The elevation landed on a surface whose projection does not offer the intercepted tool: fail
|
|
@@ -378,7 +378,7 @@ export async function handleAssistantAppRequest(req, res, deps) {
|
|
|
378
378
|
!isRecord(body.value.params)) {
|
|
379
379
|
return sendJson(res, 400, { error: 'invalid MCP App request' });
|
|
380
380
|
}
|
|
381
|
-
const target = await sessionScopedTarget(deps.registry, session);
|
|
381
|
+
const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
|
|
382
382
|
if (!target)
|
|
383
383
|
return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
|
|
384
384
|
const method = body.value.method;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
|
|
2
|
+
import { ApplicationActivityListResponseSchema, ApplicationActivityPreviewResponseSchema, ApplicationActivitySettingsResponseSchema, ApplicationActivitySettingsSaveRequestSchema, } from '@noodle-borg/wire-contracts';
|
|
3
|
+
import { ActivityPolicyError } from '../application-activity.js';
|
|
4
|
+
import { businessGrantAllows } from '../business-information/model.js';
|
|
5
|
+
import { requireIdentity, requireInstallationPermission, } from './business-information.js';
|
|
6
|
+
import { parseBusinessPaging } from './business-information-request.js';
|
|
7
|
+
export async function handleApplicationActivity(req, res, url, ref, deps) {
|
|
8
|
+
const settings = url.pathname.endsWith('/activity/settings');
|
|
9
|
+
const exporting = url.pathname.endsWith('/activity/export');
|
|
10
|
+
const preview = url.pathname.endsWith('/activity/preview');
|
|
11
|
+
if (req.method !== 'GET' && !(settings && req.method === 'PATCH')) {
|
|
12
|
+
res.setHeader('allow', settings ? 'GET, PATCH' : 'GET');
|
|
13
|
+
return sendJson(res, 405, { error: 'method not allowed' });
|
|
14
|
+
}
|
|
15
|
+
const identity = await requireIdentity(req, res, deps);
|
|
16
|
+
if (identity === false)
|
|
17
|
+
return;
|
|
18
|
+
const permission = req.method === 'PATCH'
|
|
19
|
+
? 'installation:administer'
|
|
20
|
+
: exporting
|
|
21
|
+
? 'records:export'
|
|
22
|
+
: 'records:read';
|
|
23
|
+
const authorized = await requireInstallationPermission(res, ref, identity, permission, deps);
|
|
24
|
+
if (!authorized)
|
|
25
|
+
return;
|
|
26
|
+
const reply = async (body) => {
|
|
27
|
+
if (await requireInstallationPermission(res, ref, identity, permission, deps))
|
|
28
|
+
sendJson(res, 200, body);
|
|
29
|
+
};
|
|
30
|
+
res.setHeader('cache-control', 'private, no-store');
|
|
31
|
+
try {
|
|
32
|
+
const allowedQuery = settings || preview ? [] : ['limit', 'cursor'];
|
|
33
|
+
for (const key of url.searchParams.keys())
|
|
34
|
+
if (!allowedQuery.includes(key) || url.searchParams.getAll(key).length !== 1)
|
|
35
|
+
throw new ActivityPolicyError('activity_invalid');
|
|
36
|
+
if (!deps.activity)
|
|
37
|
+
throw new ActivityPolicyError('activity_unavailable');
|
|
38
|
+
const canEdit = businessGrantAllows(authorized.grant, 'installation:administer');
|
|
39
|
+
if (settings && req.method === 'PATCH') {
|
|
40
|
+
const body = await readJsonBody(req, deps.maxBody);
|
|
41
|
+
if (!body.ok)
|
|
42
|
+
return sendJson(res, body.status, { error: body.error });
|
|
43
|
+
const parsed = ApplicationActivitySettingsSaveRequestSchema.safeParse(body.value);
|
|
44
|
+
if (!parsed.success)
|
|
45
|
+
throw new ActivityPolicyError('activity_invalid');
|
|
46
|
+
const data = await deps.activity.save(authorized.scope, parsed.data);
|
|
47
|
+
await deps.audit?.emit({
|
|
48
|
+
eventType: 'config.activity.retention_changed',
|
|
49
|
+
org: ref.org,
|
|
50
|
+
app: authorized.scope.app,
|
|
51
|
+
env: authorized.scope.env,
|
|
52
|
+
actorSubject: identity.subject,
|
|
53
|
+
details: { retentionDays: data.retentionDays },
|
|
54
|
+
});
|
|
55
|
+
return reply(ApplicationActivitySettingsResponseSchema.parse({ ok: true, data }));
|
|
56
|
+
}
|
|
57
|
+
if (preview)
|
|
58
|
+
return reply(ApplicationActivityPreviewResponseSchema.parse({
|
|
59
|
+
ok: true,
|
|
60
|
+
data: await deps.activity.preview(authorized.scope),
|
|
61
|
+
}));
|
|
62
|
+
if (settings)
|
|
63
|
+
return reply(ApplicationActivitySettingsResponseSchema.parse({
|
|
64
|
+
ok: true,
|
|
65
|
+
data: (await deps.activity.settings(authorized.scope, canEdit)).projection,
|
|
66
|
+
}));
|
|
67
|
+
const paging = parseBusinessPaging(url, 100);
|
|
68
|
+
if (!paging.ok)
|
|
69
|
+
return sendJson(res, 400, { error: paging.error });
|
|
70
|
+
const data = await deps.activity.page(authorized.scope, {
|
|
71
|
+
purpose: exporting ? 'export' : 'list',
|
|
72
|
+
limit: paging.value.limit ?? 50,
|
|
73
|
+
...(paging.value.cursor === undefined ? {} : { cursor: paging.value.cursor }),
|
|
74
|
+
});
|
|
75
|
+
return reply(ApplicationActivityListResponseSchema.parse({ ok: true, data }));
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (!(error instanceof ActivityPolicyError))
|
|
79
|
+
throw error;
|
|
80
|
+
sendJson(res, error.code === 'activity_unavailable' ? 503 : error.code === 'activity_conflict' ? 409 : 400, { code: error.code, error: error.message });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=business-information-activity.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { admitPublicRecord, clientAddressBucket, PUBLIC_ADMISSION_ASSERTION_HEADER, verifyPublicAdmissionAssertion, } from '@noodle-borg/admission-limits/portable';
|
|
2
|
+
/** Atomically apply every unavoidable public-intake ceiling to one new logical record. */
|
|
3
|
+
export async function consumePublicIntakeQuota(req, publicId, attempt, deps, binding) {
|
|
4
|
+
const timestamp = deps.now?.() ?? new Date();
|
|
5
|
+
// TLS proxy trust does not authenticate browser attribution. Until the Portal/service hop has its
|
|
6
|
+
// own verified assertion, use only the immediate peer and keep the installation ceiling as the
|
|
7
|
+
// unavoidable abuse bound. This deliberately collapses a Portal BFF to one fairness bucket instead
|
|
8
|
+
// of letting callers forge X-Forwarded-For into unlimited buckets.
|
|
9
|
+
const assertion = req.headers[PUBLIC_ADMISSION_ASSERTION_HEADER];
|
|
10
|
+
const attributed = typeof assertion === 'string' && binding && deps.publicAdmissionKeys
|
|
11
|
+
? verifyPublicAdmissionAssertion(assertion, binding, deps.publicAdmissionKeys, timestamp)
|
|
12
|
+
: undefined;
|
|
13
|
+
if (assertion !== undefined && attributed === undefined)
|
|
14
|
+
return { allowed: false, reason: 'invalid_attribution' };
|
|
15
|
+
const peer = clientAddressBucket(req.socket.remoteAddress);
|
|
16
|
+
const buckets = attributed ?? (peer ? { network: peer } : {});
|
|
17
|
+
return admitPublicRecord({
|
|
18
|
+
counters: deps.publicCounters,
|
|
19
|
+
surfaceId: publicId,
|
|
20
|
+
attempt,
|
|
21
|
+
buckets,
|
|
22
|
+
now: timestamp,
|
|
23
|
+
...(deps.publicAdmissionLimits ? { limits: deps.publicAdmissionLimits } : {}),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=business-information-admission.js.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { ADMISSION_DEFAULTS, clamp } from '@noodle-borg/admission-limits/portable';
|
|
2
|
+
import { assistantEmbedOperatorView, publicSurfaceOf, surfaceEnvelope, } from '@noodle-borg/assistant-gateway/portable';
|
|
3
|
+
import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
|
|
4
|
+
import { ApplicationChannelsResponseSchema, ApplicationChannelsSaveRequestSchema, } from '@noodle-borg/wire-contracts';
|
|
5
|
+
import { resolveTargetOrigins } from '../application-runtime-target.js';
|
|
6
|
+
import { businessGrantAllows, } from '../business-information/portable.js';
|
|
7
|
+
import { mutationFailure, requireIdentity, requireInstallationPermission, } from './business-information.js';
|
|
8
|
+
import { tenantMcpUrl } from './endpoint-enrichment.js';
|
|
9
|
+
/** Business grants project the existing MCP/assistant channel authority without developer permissions. */
|
|
10
|
+
export async function handleBusinessChannels(req, res, ref, deps) {
|
|
11
|
+
if (req.method !== 'GET' && req.method !== 'PATCH') {
|
|
12
|
+
res.setHeader('Allow', 'GET, PATCH');
|
|
13
|
+
return sendJson(res, 405, { error: 'method not allowed' });
|
|
14
|
+
}
|
|
15
|
+
const identity = await requireIdentity(req, res, deps);
|
|
16
|
+
if (identity === false)
|
|
17
|
+
return;
|
|
18
|
+
const authorized = await requireInstallationPermission(res, ref, identity, req.method === 'PATCH' ? 'installation:administer' : 'records:read', deps);
|
|
19
|
+
if (!authorized)
|
|
20
|
+
return;
|
|
21
|
+
let installation = authorized.installation;
|
|
22
|
+
const setupReady = !deps.businessOnboarding || (await deps.businessOnboarding.ready(installation));
|
|
23
|
+
if (req.method === 'GET' && !setupReady)
|
|
24
|
+
return sendJson(res, 409, {
|
|
25
|
+
code: 'business_setup_required',
|
|
26
|
+
error: 'Complete the organization agreement and business notice before publishing agent channels.',
|
|
27
|
+
});
|
|
28
|
+
if (req.method === 'PATCH') {
|
|
29
|
+
const body = await readJsonBody(req, deps.maxBody);
|
|
30
|
+
if (!body.ok)
|
|
31
|
+
return sendJson(res, body.status, { error: body.error });
|
|
32
|
+
const parsed = ApplicationChannelsSaveRequestSchema.safeParse(body.value);
|
|
33
|
+
if (!parsed.success)
|
|
34
|
+
return sendJson(res, 400, { code: 'channels_invalid', error: 'invalid channel settings' });
|
|
35
|
+
if (parsed.data.active && !setupReady)
|
|
36
|
+
return sendJson(res, 409, {
|
|
37
|
+
code: 'business_setup_required',
|
|
38
|
+
error: 'Complete business setup before publishing agent channels.',
|
|
39
|
+
});
|
|
40
|
+
const result = await deps.store.setIntakeState({
|
|
41
|
+
scope: authorized.scope,
|
|
42
|
+
expectedRevision: parsed.data.expectedRevision,
|
|
43
|
+
active: parsed.data.active,
|
|
44
|
+
actorSubject: identity.subject,
|
|
45
|
+
});
|
|
46
|
+
if (!result.ok)
|
|
47
|
+
return mutationFailure(res, result);
|
|
48
|
+
installation = result.installation;
|
|
49
|
+
}
|
|
50
|
+
const projection = await projectBusinessChannels(installation, businessGrantAllows(authorized.grant, 'installation:administer'), deps.resolveEndpointBase(req), deps);
|
|
51
|
+
res.setHeader('cache-control', 'private, no-store');
|
|
52
|
+
sendJson(res, 200, ApplicationChannelsResponseSchema.parse({ ok: true, data: projection }));
|
|
53
|
+
}
|
|
54
|
+
export async function projectBusinessChannels(installation, canEdit, base, deps) {
|
|
55
|
+
const tenant = {
|
|
56
|
+
org: installation.scope.org,
|
|
57
|
+
app: installation.scope.app,
|
|
58
|
+
env: installation.scope.env,
|
|
59
|
+
};
|
|
60
|
+
const registered = await deps.registry.getActiveByTenant(tenant);
|
|
61
|
+
const target = registered && (await resolveTargetOrigins(registered));
|
|
62
|
+
const shared = { revision: installation.revision, active: installation.intakeActive, canEdit };
|
|
63
|
+
if (!target?.deploymentId)
|
|
64
|
+
return {
|
|
65
|
+
...shared,
|
|
66
|
+
mcp: { status: 'unavailable' },
|
|
67
|
+
assistant: {
|
|
68
|
+
status: 'unavailable',
|
|
69
|
+
reason: 'The application has no active deployment.',
|
|
70
|
+
origins: [],
|
|
71
|
+
capabilities: [],
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
const endpointOptions = await deps.resolveEndpointUrlOptions?.(tenant.org);
|
|
75
|
+
const mcp = {
|
|
76
|
+
status: installation.intakeActive ? 'ready' : 'paused',
|
|
77
|
+
url: tenantMcpUrl(base, tenant, undefined, endpointOptions),
|
|
78
|
+
accessMode: target.accessMode,
|
|
79
|
+
};
|
|
80
|
+
const surface = publicSurfaceOf(target.served.artifact.server.assistant);
|
|
81
|
+
const emptyAssistant = {
|
|
82
|
+
status: 'unavailable',
|
|
83
|
+
origins: [...(surface?.origins ?? [])],
|
|
84
|
+
capabilities: surface?.capabilities.map((entry) => entry.name) ?? [],
|
|
85
|
+
};
|
|
86
|
+
const records = await deps.publicEmbeds?.list(tenant);
|
|
87
|
+
const record = records?.find((entry) => entry.revokedAt === undefined &&
|
|
88
|
+
entry.org === tenant.org &&
|
|
89
|
+
entry.app === tenant.app &&
|
|
90
|
+
entry.env === tenant.env);
|
|
91
|
+
const counters = deps.admissionCounters;
|
|
92
|
+
if (!surface || !record || !counters) {
|
|
93
|
+
return {
|
|
94
|
+
...shared,
|
|
95
|
+
deploymentId: target.deploymentId,
|
|
96
|
+
mcp,
|
|
97
|
+
assistant: {
|
|
98
|
+
...emptyAssistant,
|
|
99
|
+
reason: 'The public assistant is not configured for this deployment.',
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const at = deps.now?.() ?? new Date();
|
|
104
|
+
const managed = target.served.artifact.server.assistant?.model?.kind === 'noodle-managed';
|
|
105
|
+
const binding = managed
|
|
106
|
+
? await deps.managedModelResolver?.resolve({
|
|
107
|
+
tenant,
|
|
108
|
+
deploymentId: target.deploymentId,
|
|
109
|
+
})
|
|
110
|
+
: undefined;
|
|
111
|
+
const bounds = binding?.publicAdmission;
|
|
112
|
+
const modelUnavailable = managed && binding === undefined;
|
|
113
|
+
const view = await assistantEmbedOperatorView({
|
|
114
|
+
record,
|
|
115
|
+
surface,
|
|
116
|
+
envelope: surfaceEnvelope(clamp(deps.admissionEnvelope ?? ADMISSION_DEFAULTS), record, bounds),
|
|
117
|
+
peek: (key) => counters.peek(key, at),
|
|
118
|
+
...(bounds?.spend ? { spend: bounds.spend } : {}),
|
|
119
|
+
});
|
|
120
|
+
const ready = surface.origins.length > 0 && surface.capabilities.length > 0 && !modelUnavailable;
|
|
121
|
+
return {
|
|
122
|
+
...shared,
|
|
123
|
+
deploymentId: target.deploymentId,
|
|
124
|
+
mcp,
|
|
125
|
+
assistant: {
|
|
126
|
+
status: !ready
|
|
127
|
+
? 'unavailable'
|
|
128
|
+
: !installation.intakeActive || view.turnsPerDay === 0 || view.mintsPerDay === 0
|
|
129
|
+
? 'paused'
|
|
130
|
+
: 'ready',
|
|
131
|
+
...(!ready
|
|
132
|
+
? {
|
|
133
|
+
reason: modelUnavailable
|
|
134
|
+
? 'Managed assistant availability is not configured for this application.'
|
|
135
|
+
: 'The application needs an allowed website origin and declared assistant capabilities.',
|
|
136
|
+
}
|
|
137
|
+
: {}),
|
|
138
|
+
embedId: record.embedId,
|
|
139
|
+
serviceUrl: base.replace(/\/+$/, ''),
|
|
140
|
+
scriptUrl: `${base.replace(/\/+$/, '')}/v1/assistant/embed.js`,
|
|
141
|
+
origins: [...view.origins],
|
|
142
|
+
capabilities: [...view.capabilities],
|
|
143
|
+
usage: {
|
|
144
|
+
turnsPerDay: view.turnsPerDay,
|
|
145
|
+
turnsToday: view.turnsToday,
|
|
146
|
+
mintsPerDay: view.mintsPerDay,
|
|
147
|
+
mintsToday: view.mintsToday,
|
|
148
|
+
...(view.managedSpend ? { managedSpend: view.managedSpend } : {}),
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=business-information-channels.js.map
|