@noodleseed/one 0.126.0 → 0.127.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/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +27 -9
- package/dist/commands/knowledge.js.map +1 -1
- 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/agent-kit/dist/curated/command-groups.js +1 -1
- 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 +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +4 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts +66 -2
- package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/knowledge.js +54 -2
- package/node_modules/@noodle-borg/authoring/dist/knowledge.js.map +1 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.d.ts.map +1 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +17 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +58 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/algolia-index.d.ts +30 -0
- package/node_modules/@noodle-borg/knowledge/dist/algolia-index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/algolia-index.js +141 -0
- package/node_modules/@noodle-borg/knowledge/dist/algolia-index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/compile.js +3 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts +2 -15
- 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 +0 -59
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.js +2 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts +6 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/limits.js +6 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts +58 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js +28 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/meilisearch-index.d.ts +33 -0
- package/node_modules/@noodle-borg/knowledge/dist/meilisearch-index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/meilisearch-index.js +153 -0
- package/node_modules/@noodle-borg/knowledge/dist/meilisearch-index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +1 -0
- 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 +3 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/provider-index-shared.d.ts +19 -0
- package/node_modules/@noodle-borg/knowledge/dist/provider-index-shared.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/provider-index-shared.js +47 -0
- package/node_modules/@noodle-borg/knowledge/dist/provider-index-shared.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +7 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounds.d.ts +3 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounds.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounds.js +30 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounds.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/firecrawl.d.ts +13 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/firecrawl.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/firecrawl.js +90 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/firecrawl.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.d.ts +11 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js +108 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.d.ts +19 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js +62 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts +5 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js +4 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/origin.d.ts +3 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/origin.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/origin.js +30 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/origin.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/ports.d.ts +28 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/ports.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/ports.js +8 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/ports.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.d.ts +12 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js +64 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/sitemap.d.ts +3 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/sitemap.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/sitemap.js +11 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/sitemap.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/tavily.d.ts +11 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/tavily.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/tavily.js +53 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/tavily.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/package.json +32 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.d.ts +71 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.js +138 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js +11 -3
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts +7 -13
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js +16 -27
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts +2 -2
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js +2 -2
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts +4 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js +6 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/postgres-crawl-state.d.ts +12 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/postgres-crawl-state.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/postgres-crawl-state.js +58 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/postgres-crawl-state.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts +14 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js +84 -42
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts +18 -11
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js +149 -26
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts +13 -4
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js +28 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge-operations/package.json +1 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +3 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts +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 +26 -4
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/skills.d.ts +30 -0
- package/node_modules/@noodle-borg/protocol/dist/v2/skills.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/v2/skills.js +126 -0
- package/node_modules/@noodle-borg/protocol/dist/v2/skills.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/package.json +3 -1
- package/node_modules/@noodle-borg/service/dist/assistant-bindings.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/assistant-bindings.js +29 -1
- package/node_modules/@noodle-borg/service/dist/assistant-bindings.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/knowledge-wiring.d.ts +8 -0
- package/node_modules/@noodle-borg/service/dist/knowledge-wiring.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/knowledge-wiring.js +10 -0
- package/node_modules/@noodle-borg/service/dist/knowledge-wiring.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-targets.js +10 -2
- package/node_modules/@noodle-borg/service/dist/registry-targets.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 +3 -3
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/admission-context.js +5 -1
- package/node_modules/@noodle-borg/transport-http/dist/admission-context.js.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/request-capture.d.ts.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/request-capture.js +4 -1
- package/node_modules/@noodle-borg/transport-http/dist/request-capture.js.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +41 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js +14 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/{chunk-MZNENVFY.js → chunk-RFETV5KQ.js} +158 -6
- package/node_modules/@noodleseed/assistant/dist/chunk-RFETV5KQ.js.map +1 -0
- package/node_modules/@noodleseed/assistant/dist/{chunk-RIKRQFKS.js → chunk-S373FCAI.js} +2 -1
- package/node_modules/@noodleseed/assistant/dist/client.js +1 -1
- package/node_modules/@noodleseed/assistant/dist/embed.global.js +57 -57
- package/node_modules/@noodleseed/assistant/dist/index.cjs +268 -117
- package/node_modules/@noodleseed/assistant/dist/index.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/index.js +2 -2
- package/node_modules/@noodleseed/assistant/dist/react/client.js +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.cjs +268 -117
- package/node_modules/@noodleseed/assistant/dist/react.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.js +2 -2
- package/package.json +3 -2
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts +0 -15
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts.map +0 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js +0 -50
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js.map +0 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts +0 -34
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts.map +0 -1
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js +0 -79
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js.map +0 -1
- package/node_modules/@noodleseed/assistant/dist/chunk-MZNENVFY.js.map +0 -1
- /package/node_modules/@noodleseed/assistant/dist/{chunk-RIKRQFKS.js.map → chunk-S373FCAI.js.map} +0 -0
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
registerNoodleAssistant,
|
|
4
4
|
unmountAssistantApp,
|
|
5
5
|
updateAssistantAppTheme
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-RFETV5KQ.js";
|
|
7
|
+
import "./chunk-S373FCAI.js";
|
|
8
8
|
import "./chunk-3YYTUJPJ.js";
|
|
9
9
|
import "./chunk-5FUTL2UF.js";
|
|
10
10
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/one",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.127.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Noodle CLI by Noodle Seed — author, run, and deploy declarative MCP servers. Embedding the assistant in your own web app is @noodleseed/assistant.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -99,6 +99,7 @@
|
|
|
99
99
|
"@noodle-borg/devtools-ui",
|
|
100
100
|
"@noodle-borg/external-credential-provider",
|
|
101
101
|
"@noodle-borg/knowledge",
|
|
102
|
+
"@noodle-borg/knowledge-crawl",
|
|
102
103
|
"@noodle-borg/knowledge-operations",
|
|
103
104
|
"@noodle-borg/module",
|
|
104
105
|
"@noodle-borg/module-audit",
|
|
@@ -234,7 +235,7 @@
|
|
|
234
235
|
"@jitl/quickjs-wasmfile-release-sync": "0.32.0",
|
|
235
236
|
"@modelcontextprotocol/client": "2.0.0",
|
|
236
237
|
"@modelcontextprotocol/server": "2.0.0",
|
|
237
|
-
"@noodle-borg/agent-kit": "0.
|
|
238
|
+
"@noodle-borg/agent-kit": "0.74.0",
|
|
238
239
|
"@noodle-borg/app-audit": "0.0.0",
|
|
239
240
|
"@noodle-borg/app-package": "0.0.0",
|
|
240
241
|
"@noodle-borg/auth": "0.0.0",
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Noodle-side Google identities for the managed knowledge tier (ADR 0202 as amended): the
|
|
3
|
-
* Cloud Run runtime's ADC token impersonates the three least-privilege service accounts
|
|
4
|
-
* (provisioning is operator-only and never wired here; publication and search are). REST only —
|
|
5
|
-
* Apache packages never depend on `@google-cloud/*` — and tokens are cached until near expiry.
|
|
6
|
-
*/
|
|
7
|
-
import type { GoogleAccessTokenProvider } from '@noodle-borg/knowledge';
|
|
8
|
-
/** The Cloud Run / GCE runtime identity via the metadata server (ADC). */
|
|
9
|
-
export declare function metadataServiceTokenProvider(fetchImpl?: typeof fetch): GoogleAccessTokenProvider;
|
|
10
|
-
/**
|
|
11
|
-
* Impersonate one least-privilege service account from a base identity that holds
|
|
12
|
-
* `roles/iam.serviceAccountTokenCreator` on it.
|
|
13
|
-
*/
|
|
14
|
-
export declare function impersonatedTokenProvider(base: GoogleAccessTokenProvider, serviceAccountEmail: string, fetchImpl?: typeof fetch): GoogleAccessTokenProvider;
|
|
15
|
-
//# sourceMappingURL=google-identity.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-identity.d.ts","sourceRoot":"","sources":["../src/google-identity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAYxE,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAC1C,SAAS,GAAE,OAAO,KAAa,GAC9B,yBAAyB,CAgB3B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,EAC/B,mBAAmB,EAAE,MAAM,EAC3B,SAAS,GAAE,OAAO,KAAa,GAC9B,yBAAyB,CA0B3B"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
const METADATA_TOKEN_URL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token';
|
|
2
|
-
const IAM_CREDENTIALS_ROOT = 'https://iamcredentials.googleapis.com/v1';
|
|
3
|
-
const EXPIRY_SKEW_MS = 5 * 60 * 1000;
|
|
4
|
-
/** The Cloud Run / GCE runtime identity via the metadata server (ADC). */
|
|
5
|
-
export function metadataServiceTokenProvider(fetchImpl = fetch) {
|
|
6
|
-
let cached;
|
|
7
|
-
return async () => {
|
|
8
|
-
if (cached !== undefined && Date.now() < cached.expiresAt - EXPIRY_SKEW_MS) {
|
|
9
|
-
return cached.token;
|
|
10
|
-
}
|
|
11
|
-
const response = await fetchImpl(METADATA_TOKEN_URL, {
|
|
12
|
-
headers: { 'Metadata-Flavor': 'Google' },
|
|
13
|
-
});
|
|
14
|
-
if (!response.ok) {
|
|
15
|
-
throw new Error(`metadata token request returned HTTP ${response.status}`);
|
|
16
|
-
}
|
|
17
|
-
const body = (await response.json());
|
|
18
|
-
cached = { token: body.access_token, expiresAt: Date.now() + body.expires_in * 1000 };
|
|
19
|
-
return cached.token;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Impersonate one least-privilege service account from a base identity that holds
|
|
24
|
-
* `roles/iam.serviceAccountTokenCreator` on it.
|
|
25
|
-
*/
|
|
26
|
-
export function impersonatedTokenProvider(base, serviceAccountEmail, fetchImpl = fetch) {
|
|
27
|
-
let cached;
|
|
28
|
-
return async () => {
|
|
29
|
-
if (cached !== undefined && Date.now() < cached.expiresAt - EXPIRY_SKEW_MS) {
|
|
30
|
-
return cached.token;
|
|
31
|
-
}
|
|
32
|
-
const baseToken = await base();
|
|
33
|
-
const response = await fetchImpl(`${IAM_CREDENTIALS_ROOT}/projects/-/serviceAccounts/${encodeURIComponent(serviceAccountEmail)}:generateAccessToken`, {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: {
|
|
36
|
-
authorization: `Bearer ${baseToken}`,
|
|
37
|
-
'content-type': 'application/json',
|
|
38
|
-
},
|
|
39
|
-
body: JSON.stringify({ scope: ['https://www.googleapis.com/auth/cloud-platform'] }),
|
|
40
|
-
});
|
|
41
|
-
if (!response.ok) {
|
|
42
|
-
// Attributable without detail: the account and status only, never a response body.
|
|
43
|
-
throw new Error(`impersonation of ${serviceAccountEmail} returned HTTP ${response.status}`);
|
|
44
|
-
}
|
|
45
|
-
const body = (await response.json());
|
|
46
|
-
cached = { token: body.accessToken, expiresAt: Date.parse(body.expireTime) };
|
|
47
|
-
return cached.token;
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=google-identity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-identity.js","sourceRoot":"","sources":["../src/google-identity.ts"],"names":[],"mappings":"AAQA,MAAM,kBAAkB,GACtB,4FAA4F,CAAC;AAC/F,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AACxE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAOrC,0EAA0E;AAC1E,MAAM,UAAU,4BAA4B,CAC1C,YAA0B,KAAK;IAE/B,IAAI,MAA+B,CAAC;IACpC,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,kBAAkB,EAAE;YACnD,OAAO,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiD,CAAC;QACrF,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;QACtF,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAA+B,EAC/B,mBAA2B,EAC3B,YAA0B,KAAK;IAE/B,IAAI,MAA+B,CAAC;IACpC,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,GAAG,oBAAoB,+BAA+B,kBAAkB,CAAC,mBAAmB,CAAC,sBAAsB,EACnH;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,SAAS,EAAE;gBACpC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,gDAAgD,CAAC,EAAE,CAAC;SACpF,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,mFAAmF;YACnF,MAAM,IAAI,KAAK,CAAC,oBAAoB,mBAAmB,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgD,CAAC;QACpF,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7E,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Managed-bundled Google wiring (ADR 0202 as amended): resolve the Noodle-owned project and the
|
|
3
|
-
* two runtime-reachable identities (publication, search) from service environment, bind the
|
|
4
|
-
* sites-half adapter per tenant scope, and answer the honest site-provisioning question. The
|
|
5
|
-
* provisioning identity is deliberately unreachable from here — it exists only for the
|
|
6
|
-
* operator-run `scripts/knowledge-gcp-provision.mjs`.
|
|
7
|
-
*/
|
|
8
|
-
import { type GoogleAccessTokenProvider, type SiteSearch } from '@noodle-borg/knowledge';
|
|
9
|
-
import type { KnowledgeTenantRef } from './routes.js';
|
|
10
|
-
export interface ManagedGoogleKnowledge {
|
|
11
|
-
readonly project: string;
|
|
12
|
-
readonly location: string;
|
|
13
|
-
/** Reaches the deploy path only. */
|
|
14
|
-
readonly publicationTokens: GoogleAccessTokenProvider;
|
|
15
|
-
/** The only identity runtime execution may reach (ADR 0202 D9). */
|
|
16
|
-
readonly searchTokens: GoogleAccessTokenProvider;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Environment contract (set on the hosted service):
|
|
20
|
-
* `NOODLE_KNOWLEDGE_GCP_PROJECT` (required to enable the managed sites tier),
|
|
21
|
-
* `NOODLE_KNOWLEDGE_GCP_LOCATION` (default `global`),
|
|
22
|
-
* `NOODLE_KNOWLEDGE_PUBLICATION_SA` / `NOODLE_KNOWLEDGE_SEARCH_SA` (default the
|
|
23
|
-
* `knowledge-publication@` / `knowledge-search@` accounts in the project).
|
|
24
|
-
*/
|
|
25
|
-
export declare function managedGoogleFromEnv(env: NodeJS.ProcessEnv, fetchImpl?: typeof fetch): ManagedGoogleKnowledge | undefined;
|
|
26
|
-
export declare function managedSiteSearchFor(google: ManagedGoogleKnowledge, tenant: KnowledgeTenantRef): SiteSearch;
|
|
27
|
-
/**
|
|
28
|
-
* Is the tenant's site datastore ready to serve — a WEBSITE-type store with at least one
|
|
29
|
-
* registered target site? Read with the search identity (viewer). Mere existence is not enough:
|
|
30
|
-
* a mistyped or half-provisioned store would pass the deploy gate and then answer nothing (or
|
|
31
|
-
* error) at the first customer query.
|
|
32
|
-
*/
|
|
33
|
-
export declare function managedSiteProvisioned(google: ManagedGoogleKnowledge, tenant: KnowledgeTenantRef, fetchImpl?: typeof fetch): Promise<boolean>;
|
|
34
|
-
//# sourceMappingURL=managed-google.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-google.d.ts","sourceRoot":"","sources":["../src/managed-google.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,yBAAyB,EAI9B,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;IACtD,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,GAAE,OAAO,KAAa,GAC9B,sBAAsB,GAAG,SAAS,CAgBpC;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,kBAAkB,GACzB,UAAU,CAOZ;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,kBAAkB,EAC1B,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,OAAO,CAAC,CAiClB"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Managed-bundled Google wiring (ADR 0202 as amended): resolve the Noodle-owned project and the
|
|
3
|
-
* two runtime-reachable identities (publication, search) from service environment, bind the
|
|
4
|
-
* sites-half adapter per tenant scope, and answer the honest site-provisioning question. The
|
|
5
|
-
* provisioning identity is deliberately unreachable from here — it exists only for the
|
|
6
|
-
* operator-run `scripts/knowledge-gcp-provision.mjs`.
|
|
7
|
-
*/
|
|
8
|
-
import { GOOGLE_SITE_COMPONENT, GoogleAgentSearchSites, googleDataStoreId, googleSiteEngineId, } from '@noodle-borg/knowledge';
|
|
9
|
-
import { impersonatedTokenProvider, metadataServiceTokenProvider } from './google-identity.js';
|
|
10
|
-
/**
|
|
11
|
-
* Environment contract (set on the hosted service):
|
|
12
|
-
* `NOODLE_KNOWLEDGE_GCP_PROJECT` (required to enable the managed sites tier),
|
|
13
|
-
* `NOODLE_KNOWLEDGE_GCP_LOCATION` (default `global`),
|
|
14
|
-
* `NOODLE_KNOWLEDGE_PUBLICATION_SA` / `NOODLE_KNOWLEDGE_SEARCH_SA` (default the
|
|
15
|
-
* `knowledge-publication@` / `knowledge-search@` accounts in the project).
|
|
16
|
-
*/
|
|
17
|
-
export function managedGoogleFromEnv(env, fetchImpl = fetch) {
|
|
18
|
-
const project = env.NOODLE_KNOWLEDGE_GCP_PROJECT;
|
|
19
|
-
if (project === undefined || project === '')
|
|
20
|
-
return undefined;
|
|
21
|
-
const location = env.NOODLE_KNOWLEDGE_GCP_LOCATION ?? 'global';
|
|
22
|
-
const base = metadataServiceTokenProvider(fetchImpl);
|
|
23
|
-
const publication = env.NOODLE_KNOWLEDGE_PUBLICATION_SA ??
|
|
24
|
-
`knowledge-publication@${project}.iam.gserviceaccount.com`;
|
|
25
|
-
const search = env.NOODLE_KNOWLEDGE_SEARCH_SA ?? `knowledge-search@${project}.iam.gserviceaccount.com`;
|
|
26
|
-
return {
|
|
27
|
-
project,
|
|
28
|
-
location,
|
|
29
|
-
publicationTokens: impersonatedTokenProvider(base, publication, fetchImpl),
|
|
30
|
-
searchTokens: impersonatedTokenProvider(base, search, fetchImpl),
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
export function managedSiteSearchFor(google, tenant) {
|
|
34
|
-
return new GoogleAgentSearchSites({
|
|
35
|
-
project: google.project,
|
|
36
|
-
location: google.location,
|
|
37
|
-
tokenProvider: google.searchTokens,
|
|
38
|
-
scope: { org: tenant.org, app: tenant.app, env: tenant.env },
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Is the tenant's site datastore ready to serve — a WEBSITE-type store with at least one
|
|
43
|
-
* registered target site? Read with the search identity (viewer). Mere existence is not enough:
|
|
44
|
-
* a mistyped or half-provisioned store would pass the deploy gate and then answer nothing (or
|
|
45
|
-
* error) at the first customer query.
|
|
46
|
-
*/
|
|
47
|
-
export async function managedSiteProvisioned(google, tenant, fetchImpl = fetch) {
|
|
48
|
-
const id = googleDataStoreId({ org: tenant.org, app: tenant.app, env: tenant.env }, GOOGLE_SITE_COMPONENT);
|
|
49
|
-
const store = `https://discoveryengine.googleapis.com/v1/projects/${google.project}/locations/${google.location}/collections/default_collection/dataStores/${id}`;
|
|
50
|
-
const token = await google.searchTokens();
|
|
51
|
-
const headers = { authorization: `Bearer ${token}` };
|
|
52
|
-
const response = await fetchImpl(store, { headers });
|
|
53
|
-
if (response.status === 404)
|
|
54
|
-
return false;
|
|
55
|
-
if (!response.ok) {
|
|
56
|
-
throw new Error(`site datastore check for ${id} returned HTTP ${response.status}`);
|
|
57
|
-
}
|
|
58
|
-
const body = (await response.json().catch(() => ({})));
|
|
59
|
-
if (body.contentConfig !== 'PUBLIC_WEBSITE')
|
|
60
|
-
return false;
|
|
61
|
-
const targets = await fetchImpl(`${store}/siteSearchEngine/targetSites`, { headers });
|
|
62
|
-
if (!targets.ok) {
|
|
63
|
-
throw new Error(`target-site check for ${id} returned HTTP ${targets.status}`);
|
|
64
|
-
}
|
|
65
|
-
const targetBody = (await targets.json().catch(() => ({})));
|
|
66
|
-
if (!Array.isArray(targetBody.targetSites) || targetBody.targetSites.length === 0)
|
|
67
|
-
return false;
|
|
68
|
-
// Website search serves through an Enterprise ENGINE, not the datastore serving config (live
|
|
69
|
-
// 400 verified 2026-08-18) — a datastore without its engine still cannot answer.
|
|
70
|
-
const engineId = googleSiteEngineId({ org: tenant.org, app: tenant.app, env: tenant.env });
|
|
71
|
-
const engine = await fetchImpl(`https://discoveryengine.googleapis.com/v1/projects/${google.project}/locations/${google.location}/collections/default_collection/engines/${engineId}`, { headers });
|
|
72
|
-
if (engine.status === 404)
|
|
73
|
-
return false;
|
|
74
|
-
if (!engine.ok) {
|
|
75
|
-
throw new Error(`site engine check for ${engineId} returned HTTP ${engine.status}`);
|
|
76
|
-
}
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=managed-google.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-google.js","sourceRoot":"","sources":["../src/managed-google.ts"],"names":[],"mappings":"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"}
|