@noodleseed/one 0.122.0 → 0.123.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/catalog-data-hosted-observability.d.ts.map +1 -1
- package/dist/commands/catalog-data-hosted-observability.js +33 -0
- package/dist/commands/catalog-data-hosted-observability.js.map +1 -1
- package/dist/commands/deploy-version-resolution.js +1 -1
- package/dist/commands/deploy-version-resolution.js.map +1 -1
- package/dist/commands/knowledge.d.ts +7 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +129 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +19 -2
- package/dist/deploy.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.d.ts +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.d.ts.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.js +7 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/artifact-projection.js.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.d.ts +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.d.ts.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.js.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.js +1 -1
- package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.js.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.js +2 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/package.json +3 -1
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.d.ts +21 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.js +115 -0
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.d.ts +4 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.js +4 -0
- package/node_modules/@noodle-borg/deploy-client/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/deploy-client/package.json +34 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts +4 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js +28 -20
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +2 -1
- 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 +53 -28
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +9 -5
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +38 -21
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/package.json +4 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.d.ts +12 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.js +7 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/codec.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.d.ts +16 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js +41 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/dispatch.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts +40 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js +54 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/executor.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts +15 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js +50 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/google-identity.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.d.ts +16 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.js +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/http.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js +18 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts +29 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js +53 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/managed-google.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts +21 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js +28 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/paths.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts +60 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js +230 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/publication.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.d.ts +38 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.js +100 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/routes.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.d.ts +31 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.js +36 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/search-port.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts +56 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js +129 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/service-wiring.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.d.ts +38 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.js +77 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/staging-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts +28 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js +66 -0
- package/node_modules/@noodle-borg/knowledge-operations/dist/status-routes.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge-operations/package.json +34 -0
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js +22 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.d.ts +28 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.js +26 -0
- package/node_modules/@noodle-borg/protocol/dist/knowledge-tool.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +5 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.js +12 -1
- package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js +23 -2
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +28 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/execute.js.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/runtime/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/options.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +6 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-recover.d.ts +26 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.js +58 -0
- package/node_modules/@noodle-borg/service/dist/registry-recover.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.d.ts +10 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-rollback.js +25 -0
- package/node_modules/@noodle-borg/service/dist/registry-rollback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +5 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.js +36 -78
- package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +38 -14
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-stream.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +1 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.d.ts +32 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.js +42 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/assistant.js +11 -3
- package/node_modules/@noodle-borg/service/dist/routes/assistant.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.js +4 -0
- package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.js +11 -1
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +3 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +134 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js +101 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
- package/node_modules/@noodleseed/assistant/package.json +1 -1
- package/package.json +7 -2
- /package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-interactive.js +0 -0
- /package/node_modules/@noodle-borg/{service → assistant-gateway}/dist/assistant-presentation.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.js +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-payload-size.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.js +0 -0
- /package/{dist → node_modules/@noodle-borg/deploy-client/dist}/deploy-version.js.map +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composition helpers the service calls from its (size-pinned) bootstrap files, so the thin
|
|
3
|
+
* dispatch stays thin: store construction, schema setup, and route-deps assembly live here.
|
|
4
|
+
*/
|
|
5
|
+
import { InMemoryKnowledgeRevisionStore, InMemorySearchBudgetStore, PostgresKnowledgeRevisionStore, PostgresSearchBudgetStore, } from '@noodle-borg/knowledge';
|
|
6
|
+
import { secretBoxDocumentCodec } from './codec.js';
|
|
7
|
+
import { createKnowledgeSearchExecutor } from './executor.js';
|
|
8
|
+
import { managedGoogleFromEnv, managedSiteProvisioned, managedSiteSearchFor, } from './managed-google.js';
|
|
9
|
+
import { createKnowledgeDeployHooks } from './publication.js';
|
|
10
|
+
import { knowledgeSearchPortFactory } from './search-port.js';
|
|
11
|
+
import { InMemoryKnowledgeStagingStore, PostgresKnowledgeStagingStore, } from './staging-store.js';
|
|
12
|
+
/** In-memory stores with the identity codec — the no-persistence service default. */
|
|
13
|
+
export function defaultKnowledgeStores() {
|
|
14
|
+
return {
|
|
15
|
+
staging: new InMemoryKnowledgeStagingStore(),
|
|
16
|
+
revisionStore: new InMemoryKnowledgeRevisionStore(),
|
|
17
|
+
budgetStore: new InMemorySearchBudgetStore(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Durable stores sharing the service's Postgres pool and secret-box custody. */
|
|
21
|
+
export async function createPostgresKnowledgeStores(pool, secretBox, env = process.env) {
|
|
22
|
+
const codec = secretBox === undefined ? undefined : secretBoxDocumentCodec(secretBox);
|
|
23
|
+
const staging = new PostgresKnowledgeStagingStore(pool);
|
|
24
|
+
const revisionStore = new PostgresKnowledgeRevisionStore(pool, codec);
|
|
25
|
+
const budgetStore = new PostgresSearchBudgetStore(pool);
|
|
26
|
+
await staging.ensureSchema();
|
|
27
|
+
await revisionStore.ensureSchema();
|
|
28
|
+
await budgetStore.ensureSchema();
|
|
29
|
+
const google = managedGoogleFromEnv(env);
|
|
30
|
+
return {
|
|
31
|
+
staging,
|
|
32
|
+
revisionStore,
|
|
33
|
+
budgetStore,
|
|
34
|
+
...(codec === undefined ? {} : { codec }),
|
|
35
|
+
...(google === undefined ? {} : { google }),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Budget ceilings from managed config with the ratified v0 defaults (2000 org / 1000 app). */
|
|
39
|
+
export function budgetCeilingsResolver(resolveVariables) {
|
|
40
|
+
return async (tenant) => {
|
|
41
|
+
const variables = await resolveVariables(tenant);
|
|
42
|
+
const org = Number(variables.NOODLE_KNOWLEDGE_SEARCH_BUDGET_ORG_MONTHLY ?? '2000');
|
|
43
|
+
const app = Number(variables.NOODLE_KNOWLEDGE_SEARCH_BUDGET_APP_MONTHLY ?? '1000');
|
|
44
|
+
return {
|
|
45
|
+
org: Number.isFinite(org) ? Math.max(0, Math.floor(org)) : 2000,
|
|
46
|
+
app: Number.isFinite(app) ? Math.max(0, Math.floor(app)) : 1000,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Assemble route deps over the service's managed-config resolver (`NOODLE_KNOWLEDGE_ENABLED`). */
|
|
51
|
+
export function buildKnowledgeRouteDeps(stores, resolveVariables, maxBodyBytes) {
|
|
52
|
+
return {
|
|
53
|
+
staging: stores.staging,
|
|
54
|
+
knowledgeEnabled: async (tenant) => (await resolveVariables(tenant)).NOODLE_KNOWLEDGE_ENABLED === 'true',
|
|
55
|
+
findRevisionByContentHash: (scope, componentName, contentHash) => stores.revisionStore.findByContentHash(scope, componentName, contentHash),
|
|
56
|
+
maxBodyBytes,
|
|
57
|
+
...(stores.codec === undefined ? {} : { codec: stores.codec }),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* One-call composition for the service: resolve stores, build route deps, and register the
|
|
62
|
+
* deploy-coupled publication hooks on the registry (structurally typed; no service import).
|
|
63
|
+
*/
|
|
64
|
+
export function wireKnowledge(registry, stores, resolveVariables, maxBodyBytes) {
|
|
65
|
+
const resolved = stores ?? defaultKnowledgeStores();
|
|
66
|
+
const deps = buildKnowledgeRouteDeps(resolved, resolveVariables, maxBodyBytes);
|
|
67
|
+
const google = resolved.google;
|
|
68
|
+
const ceilings = budgetCeilingsResolver(resolveVariables);
|
|
69
|
+
const hooks = createKnowledgeDeployHooks(resolved, {
|
|
70
|
+
knowledgeEnabled: deps.knowledgeEnabled,
|
|
71
|
+
...(google === undefined
|
|
72
|
+
? {}
|
|
73
|
+
: { siteProvisioned: (tenant) => managedSiteProvisioned(google, tenant) }),
|
|
74
|
+
});
|
|
75
|
+
const executor = createKnowledgeSearchExecutor({
|
|
76
|
+
hooks,
|
|
77
|
+
knowledgeEnabled: deps.knowledgeEnabled,
|
|
78
|
+
...(resolved.budgetStore === undefined
|
|
79
|
+
? {}
|
|
80
|
+
: { budget: { store: resolved.budgetStore, ceilings } }),
|
|
81
|
+
...(google === undefined
|
|
82
|
+
? {}
|
|
83
|
+
: { siteSearchFor: (tenant) => managedSiteSearchFor(google, tenant) }),
|
|
84
|
+
});
|
|
85
|
+
registry.setKnowledgeDeployHooks(hooks, knowledgeSearchPortFactory(executor));
|
|
86
|
+
const status = {
|
|
87
|
+
revisionStore: resolved.revisionStore,
|
|
88
|
+
knowledgeEnabled: deps.knowledgeEnabled,
|
|
89
|
+
...(google === undefined
|
|
90
|
+
? {}
|
|
91
|
+
: {
|
|
92
|
+
siteProvisioningState: async (tenant) => (await managedSiteProvisioned(google, tenant))
|
|
93
|
+
? 'ready'
|
|
94
|
+
: 'missing',
|
|
95
|
+
}),
|
|
96
|
+
...(resolved.budgetStore === undefined
|
|
97
|
+
? {}
|
|
98
|
+
: {
|
|
99
|
+
budget: async (tenant) => {
|
|
100
|
+
const bounds = await ceilings(tenant);
|
|
101
|
+
const state = await resolved.budgetStore?.peek({ org: tenant.org, app: tenant.app }, bounds);
|
|
102
|
+
if (state === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
return {
|
|
105
|
+
year: state.year,
|
|
106
|
+
month: state.month,
|
|
107
|
+
orgConsumed: state.orgConsumed,
|
|
108
|
+
appConsumed: state.appConsumed,
|
|
109
|
+
orgCeiling: state.orgCeiling,
|
|
110
|
+
appCeiling: state.appCeiling,
|
|
111
|
+
blocked: state.orgCeiling <= 0 ||
|
|
112
|
+
state.appCeiling <= 0 ||
|
|
113
|
+
state.orgConsumed >= state.orgCeiling ||
|
|
114
|
+
state.appConsumed >= state.appCeiling,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
}),
|
|
118
|
+
activeKnowledge: async (tenant) => {
|
|
119
|
+
const target = await registry.getActiveByTenant(tenant);
|
|
120
|
+
const server = target?.served.artifact.server;
|
|
121
|
+
const components = server?.knowledge;
|
|
122
|
+
if (components === undefined || components.length === 0)
|
|
123
|
+
return undefined;
|
|
124
|
+
return { components, deploymentId: server?.deploymentId ?? '' };
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
return { ...deps, status, executor };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=service-wiring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-wiring.js","sourceRoot":"","sources":["../src/service-wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypted transient document staging (ADR 0202 D5): deploy uploads land here, sealed and
|
|
3
|
+
* content-addressed by tenant + sha256, until the deploy transaction publishes them into a
|
|
4
|
+
* revision. Entries are TTL-bounded — an upload that never publishes is swept, so plaintext
|
|
5
|
+
* never persists outside the sealed revision store.
|
|
6
|
+
*/
|
|
7
|
+
import type { Pool } from 'pg';
|
|
8
|
+
/** How long staged bytes may wait for their deploy transaction before being swept. */
|
|
9
|
+
export declare const STAGING_TTL_MS: number;
|
|
10
|
+
export interface KnowledgeStagingStore {
|
|
11
|
+
/** Store sealed bytes. Re-uploading the same tenant+hash is idempotent. */
|
|
12
|
+
put(tenantKey: string, sha256: string, sealed: Buffer, bytes: number): Promise<void>;
|
|
13
|
+
has(tenantKey: string, sha256: string): Promise<boolean>;
|
|
14
|
+
/** Sealed bytes for a staged document, if present and unexpired. */
|
|
15
|
+
get(tenantKey: string, sha256: string): Promise<Buffer | undefined>;
|
|
16
|
+
/** Remove entries older than the TTL. Returns the removed count. */
|
|
17
|
+
sweepExpired(): Promise<number>;
|
|
18
|
+
}
|
|
19
|
+
export declare class InMemoryKnowledgeStagingStore implements KnowledgeStagingStore {
|
|
20
|
+
private readonly entries;
|
|
21
|
+
private readonly now;
|
|
22
|
+
constructor(now?: () => Date);
|
|
23
|
+
put(tenantKey: string, sha256: string, sealed: Buffer): Promise<void>;
|
|
24
|
+
has(tenantKey: string, sha256: string): Promise<boolean>;
|
|
25
|
+
get(tenantKey: string, sha256: string): Promise<Buffer | undefined>;
|
|
26
|
+
sweepExpired(): Promise<number>;
|
|
27
|
+
private key;
|
|
28
|
+
}
|
|
29
|
+
export declare class PostgresKnowledgeStagingStore implements KnowledgeStagingStore {
|
|
30
|
+
#private;
|
|
31
|
+
constructor(pool: Pool, now?: () => Date);
|
|
32
|
+
ensureSchema(): Promise<void>;
|
|
33
|
+
put(tenantKey: string, sha256: string, sealed: Buffer, bytes: number): Promise<void>;
|
|
34
|
+
has(tenantKey: string, sha256: string): Promise<boolean>;
|
|
35
|
+
get(tenantKey: string, sha256: string): Promise<Buffer | undefined>;
|
|
36
|
+
sweepExpired(): Promise<number>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=staging-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging-store.d.ts","sourceRoot":"","sources":["../src/staging-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,sFAAsF;AACtF,eAAO,MAAM,cAAc,QAAiB,CAAC;AAE7C,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,oEAAoE;IACpE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpE,oEAAoE;IACpE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,qBAAa,6BAA8B,YAAW,qBAAqB;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,GAAG,GAAE,MAAM,IAAuB;IAIxC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAOnE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAYrC,OAAO,CAAC,GAAG;CAGZ;AAED,qBAAa,6BAA8B,YAAW,qBAAqB;;gBAI7D,IAAI,EAAE,IAAI,EAAE,GAAG,GAAE,MAAM,IAAuB;IAKpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpF,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAUnE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAQtC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** How long staged bytes may wait for their deploy transaction before being swept. */
|
|
2
|
+
export const STAGING_TTL_MS = 60 * 60 * 1000;
|
|
3
|
+
export class InMemoryKnowledgeStagingStore {
|
|
4
|
+
entries = new Map();
|
|
5
|
+
now;
|
|
6
|
+
constructor(now = () => new Date()) {
|
|
7
|
+
this.now = now;
|
|
8
|
+
}
|
|
9
|
+
async put(tenantKey, sha256, sealed) {
|
|
10
|
+
this.entries.set(this.key(tenantKey, sha256), { sealed, stagedAt: this.now().getTime() });
|
|
11
|
+
}
|
|
12
|
+
async has(tenantKey, sha256) {
|
|
13
|
+
return (await this.get(tenantKey, sha256)) !== undefined;
|
|
14
|
+
}
|
|
15
|
+
async get(tenantKey, sha256) {
|
|
16
|
+
const entry = this.entries.get(this.key(tenantKey, sha256));
|
|
17
|
+
if (entry === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (this.now().getTime() - entry.stagedAt > STAGING_TTL_MS)
|
|
20
|
+
return undefined;
|
|
21
|
+
return entry.sealed;
|
|
22
|
+
}
|
|
23
|
+
async sweepExpired() {
|
|
24
|
+
const cutoff = this.now().getTime() - STAGING_TTL_MS;
|
|
25
|
+
let removed = 0;
|
|
26
|
+
for (const [key, entry] of this.entries) {
|
|
27
|
+
if (entry.stagedAt < cutoff) {
|
|
28
|
+
this.entries.delete(key);
|
|
29
|
+
removed += 1;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return removed;
|
|
33
|
+
}
|
|
34
|
+
key(tenantKey, sha256) {
|
|
35
|
+
return `${tenantKey}#${sha256}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class PostgresKnowledgeStagingStore {
|
|
39
|
+
#pool;
|
|
40
|
+
#now;
|
|
41
|
+
constructor(pool, now = () => new Date()) {
|
|
42
|
+
this.#pool = pool;
|
|
43
|
+
this.#now = now;
|
|
44
|
+
}
|
|
45
|
+
async ensureSchema() {
|
|
46
|
+
await this.#pool.query(`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS knowledge_staging_documents (
|
|
48
|
+
tenant_key text NOT NULL,
|
|
49
|
+
sha256 text NOT NULL,
|
|
50
|
+
ciphertext bytea NOT NULL,
|
|
51
|
+
bytes integer NOT NULL,
|
|
52
|
+
staged_at timestamptz NOT NULL,
|
|
53
|
+
PRIMARY KEY (tenant_key, sha256)
|
|
54
|
+
)
|
|
55
|
+
`);
|
|
56
|
+
}
|
|
57
|
+
async put(tenantKey, sha256, sealed, bytes) {
|
|
58
|
+
await this.#pool.query(`INSERT INTO knowledge_staging_documents (tenant_key, sha256, ciphertext, bytes, staged_at)
|
|
59
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
60
|
+
ON CONFLICT (tenant_key, sha256) DO UPDATE SET staged_at = $5`, [tenantKey, sha256, sealed, bytes, this.#now()]);
|
|
61
|
+
}
|
|
62
|
+
async has(tenantKey, sha256) {
|
|
63
|
+
return (await this.get(tenantKey, sha256)) !== undefined;
|
|
64
|
+
}
|
|
65
|
+
async get(tenantKey, sha256) {
|
|
66
|
+
const cutoff = new Date(this.#now().getTime() - STAGING_TTL_MS);
|
|
67
|
+
const result = await this.#pool.query(`SELECT ciphertext FROM knowledge_staging_documents
|
|
68
|
+
WHERE tenant_key = $1 AND sha256 = $2 AND staged_at >= $3`, [tenantKey, sha256, cutoff]);
|
|
69
|
+
return result.rows[0]?.ciphertext;
|
|
70
|
+
}
|
|
71
|
+
async sweepExpired() {
|
|
72
|
+
const cutoff = new Date(this.#now().getTime() - STAGING_TTL_MS);
|
|
73
|
+
const result = await this.#pool.query('DELETE FROM knowledge_staging_documents WHERE staged_at < $1', [cutoff]);
|
|
74
|
+
return result.rowCount ?? 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=staging-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging-store.js","sourceRoot":"","sources":["../src/staging-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator surface (ADR 0202 as amended): `knowledge list` and `knowledge status <name>` are
|
|
3
|
+
* the whole v0 CLI-facing read surface. Responses say "versioned documents" versus "live site"
|
|
4
|
+
* lifecycle truth — active revision, declaring deployment, provisioning state — and never
|
|
5
|
+
* contents, credentials, or raw provider payloads.
|
|
6
|
+
*/
|
|
7
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
8
|
+
import type { CompiledKnowledgeComponent, KnowledgeRevisionStore } from '@noodle-borg/knowledge';
|
|
9
|
+
import type { KnowledgeBudgetState } from '@noodle-borg/wire-contracts';
|
|
10
|
+
import { type KnowledgeTenantRef } from './routes.js';
|
|
11
|
+
export interface KnowledgeStatusDeps {
|
|
12
|
+
readonly revisionStore: KnowledgeRevisionStore;
|
|
13
|
+
readonly knowledgeEnabled: (tenant: KnowledgeTenantRef) => Promise<boolean>;
|
|
14
|
+
/** The active deployment's compiled knowledge components, or undefined when none is active. */
|
|
15
|
+
readonly activeKnowledge: (tenant: KnowledgeTenantRef) => Promise<{
|
|
16
|
+
readonly components: readonly CompiledKnowledgeComponent[];
|
|
17
|
+
readonly deploymentId: string;
|
|
18
|
+
} | undefined>;
|
|
19
|
+
/** Managed site datastore readiness; absent until the Google slice binds a checker. */
|
|
20
|
+
readonly siteProvisioningState?: (tenant: KnowledgeTenantRef) => Promise<'ready' | 'missing'>;
|
|
21
|
+
/** Current month's search-budget state (the amendment's honest operator-visible counters). */
|
|
22
|
+
readonly budget?: (tenant: KnowledgeTenantRef) => Promise<KnowledgeBudgetState | undefined>;
|
|
23
|
+
}
|
|
24
|
+
/** `GET /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge` */
|
|
25
|
+
export declare function handleKnowledgeList(_req: IncomingMessage, res: ServerResponse, tenant: KnowledgeTenantRef, deps: KnowledgeStatusDeps): Promise<void>;
|
|
26
|
+
/** `GET /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/{name}/status` */
|
|
27
|
+
export declare function handleKnowledgeStatus(_req: IncomingMessage, res: ServerResponse, tenant: KnowledgeTenantRef, componentName: string, deps: KnowledgeStatusDeps): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=status-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-routes.d.ts","sourceRoot":"","sources":["../src/status-routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,+FAA+F;IAC/F,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAC7D;QACE,QAAQ,CAAC,UAAU,EAAE,SAAS,0BAA0B,EAAE,CAAC;QAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,GACD,SAAS,CACZ,CAAC;IACF,uFAAuF;IACvF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9F,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;CAC7F;AA8BD,qDAAqD;AACrD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,mEAAmE;AACnE,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { sendJson } from './http.js';
|
|
2
|
+
import { knowledgeEnableCommand } from './routes.js';
|
|
3
|
+
function gateClosed(res, tenant) {
|
|
4
|
+
sendJson(res, 403, {
|
|
5
|
+
code: 'knowledge_not_enabled',
|
|
6
|
+
error: 'knowledge is not enabled for this org/app/env',
|
|
7
|
+
fix: knowledgeEnableCommand(tenant),
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
async function componentSummary(tenant, component, deploymentId, revisionStore) {
|
|
11
|
+
const scope = { org: tenant.org, app: tenant.app, env: tenant.env };
|
|
12
|
+
const active = component.documents.length > 0 ? await revisionStore.active(scope, component.name) : undefined;
|
|
13
|
+
const state = component.documents.length > 0 && active === undefined ? 'pending' : 'active';
|
|
14
|
+
return {
|
|
15
|
+
name: component.name,
|
|
16
|
+
sources: { documents: component.documents.length, sites: component.sites.length },
|
|
17
|
+
declaringScope: 'env',
|
|
18
|
+
...(active !== undefined ? { activeRevisionId: active.revisionId } : {}),
|
|
19
|
+
activeDeploymentId: deploymentId,
|
|
20
|
+
state,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** `GET /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge` */
|
|
24
|
+
export async function handleKnowledgeList(_req, res, tenant, deps) {
|
|
25
|
+
if (!(await deps.knowledgeEnabled(tenant)))
|
|
26
|
+
return gateClosed(res, tenant);
|
|
27
|
+
const active = await deps.activeKnowledge(tenant);
|
|
28
|
+
const components = [];
|
|
29
|
+
for (const component of active?.components ?? []) {
|
|
30
|
+
components.push(await componentSummary(tenant, component, active?.deploymentId ?? '', deps.revisionStore));
|
|
31
|
+
}
|
|
32
|
+
const response = {
|
|
33
|
+
ok: true,
|
|
34
|
+
scope: { org: tenant.org, app: tenant.app, env: tenant.env },
|
|
35
|
+
components,
|
|
36
|
+
};
|
|
37
|
+
return sendJson(res, 200, response);
|
|
38
|
+
}
|
|
39
|
+
/** `GET /v1/orgs/{o}/apps/{a}/envs/{e}/knowledge/{name}/status` */
|
|
40
|
+
export async function handleKnowledgeStatus(_req, res, tenant, componentName, deps) {
|
|
41
|
+
if (!(await deps.knowledgeEnabled(tenant)))
|
|
42
|
+
return gateClosed(res, tenant);
|
|
43
|
+
const active = await deps.activeKnowledge(tenant);
|
|
44
|
+
const component = active?.components.find((candidate) => candidate.name === componentName);
|
|
45
|
+
if (active === undefined || component === undefined) {
|
|
46
|
+
return sendJson(res, 404, {
|
|
47
|
+
code: 'knowledge_component_not_found',
|
|
48
|
+
error: `no active deployment declares knowledge component "${componentName}"`,
|
|
49
|
+
fix: 'noodle knowledge list',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const siteProvisioning = component.sites.length === 0
|
|
53
|
+
? 'not-required'
|
|
54
|
+
: ((await deps.siteProvisioningState?.(tenant)) ?? 'missing');
|
|
55
|
+
const budget = await deps.budget?.(tenant);
|
|
56
|
+
const response = {
|
|
57
|
+
ok: true,
|
|
58
|
+
scope: { org: tenant.org, app: tenant.app, env: tenant.env },
|
|
59
|
+
component: await componentSummary(tenant, component, active.deploymentId, deps.revisionStore),
|
|
60
|
+
siteProvisioning,
|
|
61
|
+
...(budget === undefined ? {} : { budget }),
|
|
62
|
+
errors: [],
|
|
63
|
+
};
|
|
64
|
+
return sendJson(res, 200, response);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=status-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-routes.js","sourceRoot":"","sources":["../src/status-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@noodle-borg/knowledge-operations",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=24"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@noodle-borg/knowledge": "0.0.0",
|
|
27
|
+
"@noodle-borg/wire-contracts": "0.0.0",
|
|
28
|
+
"zod": "^4.4.3"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^24.13.1",
|
|
32
|
+
"@types/pg": "^8.20.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AASxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AASxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,sBAAsB,CAAC;AA4B9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAK/D,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,sBAAsB,GAC9B,IAAI,CAmKN"}
|
|
@@ -2,6 +2,7 @@ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } f
|
|
|
2
2
|
import { artifactDeclaresContext, CONTEXT_TOOL_DESCRIPTOR, CONTEXT_TOOL_NAME, } from '../context-tool.js';
|
|
3
3
|
import { coerceToolArguments } from '../input-validation.js';
|
|
4
4
|
import { extractElicitationResponses, toolUsesPortableInteractionArgument, } from '../interaction-envelope.js';
|
|
5
|
+
import { findKnowledgeComponent, knowledgeToolsEnabled, runKnowledgeSearchTool, } from '../knowledge-tool.js';
|
|
5
6
|
import { mapExecutionError, mapToolOutput, mapToolsList, redactWidgetLinkedOutput, } from '../mapping.js';
|
|
6
7
|
import { estimateTokens, notify, } from '../observation.js';
|
|
7
8
|
import { evaluateToolAuthorization, TOOL_AUTHORIZATION_DENIED } from '../tool-authorization.js';
|
|
@@ -10,7 +11,9 @@ import { interactionUnavailableToolResult, stoppedToolResult } from '../tool-res
|
|
|
10
11
|
export function registerTools(server, artifact, deps, context) {
|
|
11
12
|
// Our mapping helpers return structural subsets of the SDK's result unions; the `as` casts pick the
|
|
12
13
|
// intended union arm (the SDK union also has a Tasks arm that requires a `task` field we never emit).
|
|
13
|
-
server.setRequestHandler(ListToolsRequestSchema, () => mapToolsList(artifact, context.caller
|
|
14
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => mapToolsList(artifact, context.caller, {
|
|
15
|
+
knowledgeTools: await knowledgeToolsEnabled(artifact, deps),
|
|
16
|
+
}));
|
|
14
17
|
server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
|
|
15
18
|
const toolName = request.params.name;
|
|
16
19
|
const observe = (outcome, extra = {}) => notify(context, { method: 'tools/call', toolName, outcome, ...extra });
|
|
@@ -31,6 +34,24 @@ export function registerTools(server, artifact, deps, context) {
|
|
|
31
34
|
observe('ok', { outputTokensEst: estimateTokens(deps.context) });
|
|
32
35
|
return mapped;
|
|
33
36
|
}
|
|
37
|
+
const knowledgeComponent = findKnowledgeComponent(artifact, toolName);
|
|
38
|
+
if (knowledgeComponent !== undefined && (await knowledgeToolsEnabled(artifact, deps))) {
|
|
39
|
+
const outcome = await runKnowledgeSearchTool(knowledgeComponent, deps, request.params.arguments ?? {});
|
|
40
|
+
if (outcome.kind === 'invalid') {
|
|
41
|
+
observe('mcp_error', { errorKind: 'invalid_params' });
|
|
42
|
+
throw new McpError(ErrorCode.InvalidParams, `invalid arguments for tool "${toolName}"`, {
|
|
43
|
+
reason: 'invalid_tool_arguments',
|
|
44
|
+
validation: outcome.issues,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (outcome.kind === 'error') {
|
|
48
|
+
observe('mcp_error', { errorKind: outcome.reason });
|
|
49
|
+
throw new McpError(ErrorCode.InternalError, outcome.message, { reason: outcome.reason });
|
|
50
|
+
}
|
|
51
|
+
const mapped = mapToolOutput(outcome.output);
|
|
52
|
+
observe('ok', { outputTokensEst: estimateTokens(outcome.output) });
|
|
53
|
+
return mapped;
|
|
54
|
+
}
|
|
34
55
|
const tool = artifact.tools.find((item) => item.name === toolName);
|
|
35
56
|
if (tool !== undefined) {
|
|
36
57
|
const authorization = evaluateToolAuthorization(tool.authorization, context.caller);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAErB,SAAS,EACT,sBAAsB,EAEtB,QAAQ,GACT,MAAM,oCAAoC,CAAC;AAQ5C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,MAAM,GAGP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,gCAAgC,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEzF,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,QAAyB,EACzB,IAAiB,EACjB,OAA+B;IAE/B,oGAAoG;IACpG,sGAAsG;IACtG,MAAM,CAAC,iBAAiB,CACtB,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generated `search_<name>` tool (ADR 0202 D4), shared by both era handlers. Like
|
|
3
|
+
* `noodle_context`, it is a reserved non-fulfilment tool: listed from `server.knowledge`,
|
|
4
|
+
* executed through the injected deployment-bound port, never through the fulfilment engine.
|
|
5
|
+
* Gate off (or no port) ⇒ the tool is absent from listing and unknown at call time.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeArtifact } from '@noodle-borg/compiler';
|
|
8
|
+
import type { ExecuteDeps, KnowledgeSearchHit } from '@noodle-borg/runtime';
|
|
9
|
+
type KnowledgeComponent = NonNullable<RuntimeArtifact['server']['knowledge']>[number];
|
|
10
|
+
export declare function findKnowledgeComponent(artifact: RuntimeArtifact, toolName: string): KnowledgeComponent | undefined;
|
|
11
|
+
/** Listing predicate: the artifact declares knowledge AND the deployment's port is live. */
|
|
12
|
+
export declare function knowledgeToolsEnabled(artifact: RuntimeArtifact, deps: ExecuteDeps): Promise<boolean>;
|
|
13
|
+
export type KnowledgeCallOutcome = {
|
|
14
|
+
readonly kind: 'invalid';
|
|
15
|
+
readonly issues: readonly unknown[];
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'error';
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
readonly message: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'ok';
|
|
22
|
+
readonly output: {
|
|
23
|
+
readonly hits: readonly KnowledgeSearchHit[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare function runKnowledgeSearchTool(component: KnowledgeComponent, deps: ExecuteDeps, rawArguments: Record<string, unknown>): Promise<KnowledgeCallOutcome>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=knowledge-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-tool.d.ts","sourceRoot":"","sources":["../src/knowledge-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,KAAK,kBAAkB,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,kBAAkB,GAAG,SAAS,CAEhC;AAED,4FAA4F;AAC5F,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAE/F,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,kBAAkB,EAC7B,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAU/B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { coerceToolArguments } from './input-validation.js';
|
|
2
|
+
export function findKnowledgeComponent(artifact, toolName) {
|
|
3
|
+
return artifact.server.knowledge?.find((component) => component.generatedTool.name === toolName);
|
|
4
|
+
}
|
|
5
|
+
/** Listing predicate: the artifact declares knowledge AND the deployment's port is live. */
|
|
6
|
+
export async function knowledgeToolsEnabled(artifact, deps) {
|
|
7
|
+
if ((artifact.server.knowledge?.length ?? 0) === 0)
|
|
8
|
+
return false;
|
|
9
|
+
if (deps.knowledgeSearch === undefined)
|
|
10
|
+
return false;
|
|
11
|
+
return deps.knowledgeSearch.enabled();
|
|
12
|
+
}
|
|
13
|
+
export async function runKnowledgeSearchTool(component, deps, rawArguments) {
|
|
14
|
+
const coerced = coerceToolArguments(component.generatedTool.inputSchema, rawArguments);
|
|
15
|
+
if (coerced.issues.length > 0)
|
|
16
|
+
return { kind: 'invalid', issues: coerced.issues };
|
|
17
|
+
if (deps.knowledgeSearch === undefined) {
|
|
18
|
+
return { kind: 'error', reason: 'not_enabled', message: 'knowledge search is unavailable' };
|
|
19
|
+
}
|
|
20
|
+
const request = coerced.value;
|
|
21
|
+
const outcome = await deps.knowledgeSearch.search(component.name, request);
|
|
22
|
+
if (!outcome.ok)
|
|
23
|
+
return { kind: 'error', reason: outcome.reason, message: outcome.message };
|
|
24
|
+
return { kind: 'ok', output: { hits: outcome.hits } };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=knowledge-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-tool.js","sourceRoot":"","sources":["../src/knowledge-tool.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,UAAU,sBAAsB,CACpC,QAAyB,EACzB,QAAgB;IAEhB,OAAO,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACnG,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAyB,EACzB,IAAiB;IAEjB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;AACxC,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAA6B,EAC7B,IAAiB,EACjB,YAAqC;IAErC,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAClF,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAA0C,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -48,7 +48,11 @@ export declare function mapTool(tool: ArtifactTool): ToolDescriptor;
|
|
|
48
48
|
* `_meta.ui.visibility: ['app']` so MCP Apps hosts can hide them from the model surface while still brokering
|
|
49
49
|
* iframe-originated `callServerTool` requests. Visibility is not authorization; hosted policy gates the call.
|
|
50
50
|
*/
|
|
51
|
-
export declare function mapToolsList(artifact: RuntimeArtifact, caller?: ToolAuthorizationCaller
|
|
51
|
+
export declare function mapToolsList(artifact: RuntimeArtifact, caller?: ToolAuthorizationCaller, options?: {
|
|
52
|
+
readonly knowledgeTools?: boolean;
|
|
53
|
+
}): ToolsListResult;
|
|
54
|
+
/** Generated `search_<name>` descriptors (ADR 0202 D4); listed only when the port is live. */
|
|
55
|
+
export declare function knowledgeToolDescriptors(artifact: RuntimeArtifact): ToolsListResult['tools'];
|
|
52
56
|
/**
|
|
53
57
|
* Map a successful tool output to a `tools/call` result. Structured (object) output is returned as
|
|
54
58
|
* `structuredContent` and also serialized into a text block (the spec asks for both, for clients
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,YAAY,EACZ,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAGvC;;;;;GAKG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,oGAAoG;AACpG,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACpC;IAAE,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,2GAA2G;AAC3G,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAU1D;AA8CD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EACzB,MAAM,CAAC,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,15 +60,26 @@ function withPortableInteractionInput(tool) {
|
|
|
60
60
|
* `_meta.ui.visibility: ['app']` so MCP Apps hosts can hide them from the model surface while still brokering
|
|
61
61
|
* iframe-originated `callServerTool` requests. Visibility is not authorization; hosted policy gates the call.
|
|
62
62
|
*/
|
|
63
|
-
export function mapToolsList(artifact, caller) {
|
|
63
|
+
export function mapToolsList(artifact, caller, options) {
|
|
64
64
|
assertNoContextToolCollision(artifact);
|
|
65
65
|
return {
|
|
66
66
|
tools: [
|
|
67
67
|
...filterAuthorizedTools(artifact.tools, caller).map(mapTool),
|
|
68
68
|
...(artifactDeclaresContext(artifact) ? [CONTEXT_TOOL_DESCRIPTOR] : []),
|
|
69
|
+
...(options?.knowledgeTools === true ? knowledgeToolDescriptors(artifact) : []),
|
|
69
70
|
],
|
|
70
71
|
};
|
|
71
72
|
}
|
|
73
|
+
/** Generated `search_<name>` descriptors (ADR 0202 D4); listed only when the port is live. */
|
|
74
|
+
export function knowledgeToolDescriptors(artifact) {
|
|
75
|
+
return (artifact.server.knowledge ?? []).map((component) => ({
|
|
76
|
+
name: component.generatedTool.name,
|
|
77
|
+
description: component.generatedTool.description,
|
|
78
|
+
inputSchema: component.generatedTool
|
|
79
|
+
.inputSchema,
|
|
80
|
+
outputSchema: component.generatedTool.outputSchema,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
72
83
|
/**
|
|
73
84
|
* Map a successful tool output to a `tools/call` result. Structured (object) output is returned as
|
|
74
85
|
* `structuredContent` and also serialized into a text block (the spec asks for both, for clients
|