@noodleseed/one 0.120.0 → 0.121.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/auth-ops.d.ts.map +1 -1
- package/dist/commands/auth-ops.js +1 -0
- package/dist/commands/auth-ops.js.map +1 -1
- package/dist/commands/catalog-data-bootstrap-authoring.d.ts.map +1 -1
- package/dist/commands/catalog-data-bootstrap-authoring.js +98 -189
- package/dist/commands/catalog-data-bootstrap-authoring.js.map +1 -1
- package/dist/commands/mcp-apps.d.ts.map +1 -1
- package/dist/commands/mcp-apps.js +1 -0
- package/dist/commands/mcp-apps.js.map +1 -1
- package/dist/commands/project-setup.d.ts.map +1 -1
- package/dist/commands/project-setup.js +25 -5
- package/dist/commands/project-setup.js.map +1 -1
- package/dist/delegated-token-exchange-preflight.d.ts.map +1 -1
- package/dist/delegated-token-exchange-preflight.js +1 -0
- package/dist/delegated-token-exchange-preflight.js.map +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +8 -131
- package/dist/deploy.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/local-compile.d.ts.map +1 -1
- package/dist/local-compile.js +1 -0
- package/dist/local-compile.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +7 -5
- 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 +5 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.js +5 -3
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.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 +20 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +5 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.d.ts +2 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.js +11 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.js.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-types.d.ts +16 -3
- package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-types.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.js +13 -4
- package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.js.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/agent-packaging/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/index.js +1 -0
- package/node_modules/@noodle-borg/agent-packaging/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.js +4 -3
- package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.js.map +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
- package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +4 -3
- package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/assistant.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/distribution.d.ts +17 -3
- package/node_modules/@noodle-borg/authoring/dist/distribution.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/distribution.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts +70 -0
- package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/knowledge.js +50 -0
- package/node_modules/@noodle-borg/authoring/dist/knowledge.js.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/load-authored.d.ts +24 -0
- package/node_modules/@noodle-borg/authoring/dist/load-authored.d.ts.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/load-authored.js +141 -0
- package/node_modules/@noodle-borg/authoring/dist/load-authored.js.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/react/components.d.ts +3 -3
- package/node_modules/@noodle-borg/authoring/dist/react/native-components.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/server.js +4 -0
- package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/package.json +5 -0
- package/node_modules/@noodle-borg/brand-kit/dist/index.d.ts +8 -0
- package/node_modules/@noodle-borg/brand-kit/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/brand-kit/dist/index.js +8 -0
- package/node_modules/@noodle-borg/brand-kit/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/{compiler/dist/widget-palette.d.ts → brand-kit/dist/palette.d.ts} +1 -1
- package/node_modules/@noodle-borg/brand-kit/dist/palette.d.ts.map +1 -0
- package/node_modules/@noodle-borg/{compiler/dist/widget-palette.js → brand-kit/dist/palette.js} +1 -1
- package/node_modules/@noodle-borg/brand-kit/dist/palette.js.map +1 -0
- package/node_modules/@noodle-borg/{compiler/dist/widget-ui-style.d.ts → brand-kit/dist/ui-style.d.ts} +1 -1
- package/node_modules/@noodle-borg/brand-kit/dist/ui-style.d.ts.map +1 -0
- package/node_modules/@noodle-borg/{compiler/dist/widget-ui-style.js → brand-kit/dist/ui-style.js} +1 -1
- package/node_modules/@noodle-borg/brand-kit/dist/ui-style.js.map +1 -0
- package/node_modules/@noodle-borg/brand-kit/package.json +28 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.d.ts +2 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +3 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/branding.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/branding.js +1 -1
- package/node_modules/@noodle-borg/compiler/dist/branding.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.d.ts +8 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.js +8 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.js +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +36 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +7 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts +4 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.js +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/package.json +3 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts +14 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js +133 -0
- package/node_modules/@noodle-borg/knowledge/dist/bm25.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts +37 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.js +52 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts +52 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.js +250 -0
- package/node_modules/@noodle-borg/knowledge/dist/compile.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/conformance.d.ts +21 -0
- package/node_modules/@noodle-borg/knowledge/dist/conformance.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/conformance.js +225 -0
- package/node_modules/@noodle-borg/knowledge/dist/conformance.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/fakes.d.ts +23 -0
- package/node_modules/@noodle-borg/knowledge/dist/fakes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/fakes.js +141 -0
- package/node_modules/@noodle-borg/knowledge/dist/fakes.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts +27 -0
- package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/fusion.js +119 -0
- package/node_modules/@noodle-borg/knowledge/dist/fusion.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts +49 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js +235 -0
- package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/hits.d.ts +31 -0
- package/node_modules/@noodle-borg/knowledge/dist/hits.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/hits.js +75 -0
- package/node_modules/@noodle-borg/knowledge/dist/hits.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts +25 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.js +25 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/ir.d.ts +53 -0
- package/node_modules/@noodle-borg/knowledge/dist/ir.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/ir.js +87 -0
- package/node_modules/@noodle-borg/knowledge/dist/ir.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts +19 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.js +19 -0
- package/node_modules/@noodle-borg/knowledge/dist/limits.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts +42 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js +45 -0
- package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/ports.d.ts +56 -0
- package/node_modules/@noodle-borg/knowledge/dist/ports.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/ports.js +13 -0
- package/node_modules/@noodle-borg/knowledge/dist/ports.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +33 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js +200 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +59 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +128 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/package.json +36 -0
- package/node_modules/@noodle-borg/module/dist/contract.d.ts +2 -0
- package/node_modules/@noodle-borg/module/dist/contract.d.ts.map +1 -1
- package/node_modules/@noodle-borg/module/dist/contract.js.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.d.ts +4 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.js +147 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.d.ts +14 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.js +2 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.d.ts +10 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.js +152 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.d.ts +7 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.js +24 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.d.ts +6 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.js +260 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.d.ts +3 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.js +89 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.d.ts +3 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.js +16 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.d.ts +5 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.js +15 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/command.d.ts +3 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/command.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/command.js +3 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/command.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.d.ts +37 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.js +60 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/index.js +2 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.d.ts +3 -28
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.d.ts.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.js +23 -64
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.js.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.d.ts.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.js +3 -97
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.js.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.js +19 -8
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.js.map +1 -1
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.d.ts +5 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.js +147 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.d.ts +3 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.d.ts.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.js +22 -0
- package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.js.map +1 -0
- package/node_modules/@noodle-borg/plugin-distribution/package.json +2 -2
- package/node_modules/@noodle-borg/protocol/dist/handlers/resources.d.ts +1 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/resources.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/resources.js +1 -1
- package/node_modules/@noodle-borg/protocol/dist/handlers/resources.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.d.ts +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.js +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.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 +1 -1
- package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/package.json +1 -0
- package/node_modules/@noodle-borg/service/dist/index.d.ts +0 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +0 -1
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/main.js +0 -52
- package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/modules/host.d.ts +2 -6
- package/node_modules/@noodle-borg/service/dist/modules/host.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/modules/host.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/options.d.ts +1 -21
- package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +7 -1
- package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.d.ts +0 -1
- package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.js +22 -26
- package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service-config.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/service-config.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service-config.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 +1 -24
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +1 -0
- package/node_modules/@noodle-borg/service-modules/dist/index.d.ts +9 -0
- package/node_modules/@noodle-borg/service-modules/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service-modules/dist/index.js +9 -0
- package/node_modules/@noodle-borg/service-modules/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/service-modules/dist/loaded-module.d.ts +8 -0
- package/node_modules/@noodle-borg/service-modules/dist/loaded-module.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service-modules/dist/loaded-module.js +2 -0
- package/node_modules/@noodle-borg/service-modules/dist/loaded-module.js.map +1 -0
- package/node_modules/@noodle-borg/{service/dist/modules → service-modules/dist}/loader.d.ts +1 -1
- package/node_modules/@noodle-borg/service-modules/dist/loader.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service-modules/dist/loader.js.map +1 -0
- package/node_modules/@noodle-borg/service-modules/package.json +32 -0
- package/node_modules/@noodle-borg/uri-template/dist/index.d.ts +7 -0
- package/node_modules/@noodle-borg/uri-template/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/uri-template/dist/index.js +7 -0
- package/node_modules/@noodle-borg/uri-template/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/uri-template/package.json +28 -0
- package/node_modules/@noodleseed/assistant/dist/{chunk-7L52WJ2E.js → chunk-MZNENVFY.js} +11 -3
- package/node_modules/@noodleseed/assistant/dist/{chunk-7L52WJ2E.js.map → chunk-MZNENVFY.js.map} +1 -1
- package/node_modules/@noodleseed/assistant/dist/{chunk-NPV64PUX.js → chunk-RIKRQFKS.js} +5 -1
- package/node_modules/@noodleseed/assistant/dist/{chunk-NPV64PUX.js.map → chunk-RIKRQFKS.js.map} +1 -1
- package/node_modules/@noodleseed/assistant/dist/{client-Ii_xTV09.d.ts → client-B6pnBmF8.d.ts} +1 -0
- package/node_modules/@noodleseed/assistant/dist/{client-401BAJqk.d.cts → client-BQ30Fq-c.d.cts} +1 -0
- package/node_modules/@noodleseed/assistant/dist/client.cjs +4 -0
- package/node_modules/@noodleseed/assistant/dist/client.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/client.d.cts +1 -1
- package/node_modules/@noodleseed/assistant/dist/client.d.ts +1 -1
- package/node_modules/@noodleseed/assistant/dist/client.js +1 -1
- package/node_modules/@noodleseed/assistant/dist/embed.global.js +2 -2
- package/node_modules/@noodleseed/assistant/dist/index.cjs +13 -1
- package/node_modules/@noodleseed/assistant/dist/index.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/index.d.cts +2 -2
- package/node_modules/@noodleseed/assistant/dist/index.d.ts +2 -2
- package/node_modules/@noodleseed/assistant/dist/index.js +2 -2
- package/node_modules/@noodleseed/assistant/dist/react/client.cjs +4 -0
- package/node_modules/@noodleseed/assistant/dist/react/client.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/react/client.d.cts +1 -1
- package/node_modules/@noodleseed/assistant/dist/react/client.d.ts +1 -1
- package/node_modules/@noodleseed/assistant/dist/react/client.js +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.cjs +13 -1
- package/node_modules/@noodleseed/assistant/dist/react.cjs.map +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.d.cts +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.d.ts +1 -1
- package/node_modules/@noodleseed/assistant/dist/react.js +2 -2
- package/node_modules/@noodleseed/assistant/package.json +2 -1
- package/package.json +5 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-palette.d.ts.map +0 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-palette.js.map +0 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts.map +0 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.d.ts +0 -7
- package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.js +0 -23
- package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/config.d.ts +0 -12
- package/node_modules/@noodle-borg/service/dist/feedback-operations/config.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/config.js +0 -47
- package/node_modules/@noodle-borg/service/dist/feedback-operations/config.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.d.ts +0 -24
- package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.js +0 -2
- package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.d.ts +0 -29
- package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.js +0 -263
- package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.d.ts +0 -39
- package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.js +0 -142
- package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.d.ts +0 -33
- package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.js +0 -142
- package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.d.ts +0 -138
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.js +0 -199
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.d.ts +0 -52
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.js +0 -103
- package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/github/feedback-issues.d.ts +0 -44
- package/node_modules/@noodle-borg/service/dist/github/feedback-issues.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/github/feedback-issues.js +0 -117
- package/node_modules/@noodle-borg/service/dist/github/feedback-issues.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/modules/loader.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/modules/loader.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.d.ts +0 -10
- package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.js +0 -54
- package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback.d.ts +0 -30
- package/node_modules/@noodle-borg/service/dist/routes/feedback.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback.js +0 -233
- package/node_modules/@noodle-borg/service/dist/routes/feedback.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.d.ts +0 -17
- package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.js +0 -141
- package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.d.ts +0 -15
- package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.js +0 -135
- package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/store/feedback-operations.d.ts +0 -188
- package/node_modules/@noodle-borg/service/dist/store/feedback-operations.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/store/feedback-operations.js +0 -489
- package/node_modules/@noodle-borg/service/dist/store/feedback-operations.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.d.ts +0 -35
- package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.js +0 -172
- package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.js.map +0 -1
- /package/node_modules/@noodle-borg/{service/dist/modules → service-modules/dist}/loader.js +0 -0
- /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.d.ts +0 -0
- /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.d.ts.map +0 -0
- /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.js +0 -0
- /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.js.map +0 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared port conformance suites (ADR 0202): every `KnowledgeIndex` implementation — the
|
|
3
|
+
* fake, the bundled BM25 adapter, and the managed Google adapter — passes the identical
|
|
4
|
+
* suite, and likewise every `SiteSearch` implementation. A behaviour asserted only against
|
|
5
|
+
* one implementation is one the others are free to violate in production.
|
|
6
|
+
*
|
|
7
|
+
* This module is shipped source, so it imports no test framework: assertions use the
|
|
8
|
+
* `node:assert` builtin and the caller injects its runner's `describe`/`it`. Declaring a
|
|
9
|
+
* framework here — even as an optional peer — would put it in the dependency graph of
|
|
10
|
+
* everything that depends on this package, including the published CLI.
|
|
11
|
+
*/
|
|
12
|
+
import assert from 'node:assert/strict';
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { fuseHits } from './fusion.js';
|
|
15
|
+
import { searchRequestSchema } from './hits.js';
|
|
16
|
+
import { KnowledgeError, } from './ports.js';
|
|
17
|
+
export const testScope = { org: 'acme', app: 'acme-app', env: 'prod' };
|
|
18
|
+
export const testComponent = 'product';
|
|
19
|
+
export function stagedDocument(path, title, text, sourceUrl) {
|
|
20
|
+
const bytes = Buffer.byteLength(text, 'utf8');
|
|
21
|
+
const hash = createHash('sha256').update(text, 'utf8').digest('hex');
|
|
22
|
+
return {
|
|
23
|
+
descriptor: {
|
|
24
|
+
path,
|
|
25
|
+
title,
|
|
26
|
+
...(sourceUrl !== undefined ? { sourceUrl } : {}),
|
|
27
|
+
sha256: hash,
|
|
28
|
+
bytes,
|
|
29
|
+
},
|
|
30
|
+
text,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export const publicPredicate = (revision) => ({
|
|
34
|
+
audience: 'public',
|
|
35
|
+
revision,
|
|
36
|
+
});
|
|
37
|
+
export function describeKnowledgeIndex(runner, makeIndex, label) {
|
|
38
|
+
const { describe, it } = runner;
|
|
39
|
+
describe(`KnowledgeIndex conformance — ${label}`, () => {
|
|
40
|
+
it('stages a complete revision and reports its descriptors', async () => {
|
|
41
|
+
const index = makeIndex();
|
|
42
|
+
const revision = await index.stage(testScope, testComponent, [
|
|
43
|
+
stagedDocument('knowledge/a.md', 'A', 'alpha beta'),
|
|
44
|
+
stagedDocument('knowledge/b.txt', 'B', 'gamma delta'),
|
|
45
|
+
]);
|
|
46
|
+
assert.equal(revision.documents.length, 2);
|
|
47
|
+
assert.deepEqual(revision.documents.map((document) => document.path), ['knowledge/a.md', 'knowledge/b.txt']);
|
|
48
|
+
assert.deepEqual(revision.scope, testScope);
|
|
49
|
+
});
|
|
50
|
+
it('verifies a positive predicate for the staged revision and rejects a mismatched one', async () => {
|
|
51
|
+
const index = makeIndex();
|
|
52
|
+
const revision = await index.stage(testScope, testComponent, [
|
|
53
|
+
stagedDocument('knowledge/a.md', 'A', 'alpha beta'),
|
|
54
|
+
]);
|
|
55
|
+
assert.equal(await index.verify(revision.revisionId, publicPredicate(revision.revisionId)), true);
|
|
56
|
+
assert.equal(await index.verify(revision.revisionId, publicPredicate('other-revision')), false);
|
|
57
|
+
});
|
|
58
|
+
it('activates atomically: search reads only the active revision', async () => {
|
|
59
|
+
const index = makeIndex();
|
|
60
|
+
const first = await index.stage(testScope, testComponent, [
|
|
61
|
+
stagedDocument('knowledge/a.md', 'A', 'ancient content'),
|
|
62
|
+
]);
|
|
63
|
+
await index.activate(first.revisionId);
|
|
64
|
+
const second = await index.stage(testScope, testComponent, [
|
|
65
|
+
stagedDocument('knowledge/a.md', 'A', 'fresh content'),
|
|
66
|
+
stagedDocument('knowledge/b.md', 'B', 'fresh content too'),
|
|
67
|
+
]);
|
|
68
|
+
await index.activate(second.revisionId);
|
|
69
|
+
const hits = await index.search(testScope, testComponent, searchRequestSchema.parse({ query: 'content' }));
|
|
70
|
+
assert.ok(hits.length > 0, 'expected the active revision to return hits');
|
|
71
|
+
assert.equal(hits.some((hit) => hit.title === 'B'), true);
|
|
72
|
+
const active = await index.activeRevision(testScope, testComponent);
|
|
73
|
+
assert.equal(active?.revisionId, second.revisionId);
|
|
74
|
+
});
|
|
75
|
+
it('search before activation fails with an attributable not-found error', async () => {
|
|
76
|
+
const index = makeIndex();
|
|
77
|
+
await index.stage(testScope, testComponent, [stagedDocument('knowledge/a.md', 'A', 'alpha')]);
|
|
78
|
+
await assert.rejects(index.search(testScope, testComponent, { query: 'alpha', limit: 8 }), KnowledgeError);
|
|
79
|
+
});
|
|
80
|
+
it('returns bounded hits with stable ids, titles, excerpts, and source kind', async () => {
|
|
81
|
+
const index = makeIndex();
|
|
82
|
+
const revision = await index.stage(testScope, testComponent, [
|
|
83
|
+
stagedDocument('knowledge/a.md', 'Alpha doc', 'alpha beta gamma', 'https://acme.example/docs/a'),
|
|
84
|
+
stagedDocument('knowledge/b.md', 'Beta doc', 'beta gamma delta'),
|
|
85
|
+
]);
|
|
86
|
+
await index.activate(revision.revisionId);
|
|
87
|
+
const hits = await index.search(testScope, testComponent, { query: 'gamma', limit: 1 });
|
|
88
|
+
assert.equal(hits.length, 1);
|
|
89
|
+
const hit = hits[0];
|
|
90
|
+
if (hit === undefined)
|
|
91
|
+
throw new Error('expected one bounded hit');
|
|
92
|
+
assert.ok(hit.id.length > 0, 'hit id must be stable and non-empty');
|
|
93
|
+
assert.ok(hit.title.length > 0, 'hit title must be non-empty');
|
|
94
|
+
assert.ok(hit.excerpt.length <= 2000, 'excerpt must stay within MAX_EXCERPT_CHARS');
|
|
95
|
+
assert.equal(hit.sourceKind, 'document');
|
|
96
|
+
if (hit.uri !== undefined)
|
|
97
|
+
assert.equal(hit.uri.startsWith('https://'), true);
|
|
98
|
+
});
|
|
99
|
+
it('deletes only unreferenced revisions', async () => {
|
|
100
|
+
const index = makeIndex();
|
|
101
|
+
const revision = await index.stage(testScope, testComponent, [
|
|
102
|
+
stagedDocument('knowledge/a.md', 'A', 'alpha'),
|
|
103
|
+
]);
|
|
104
|
+
await index.activate(revision.revisionId);
|
|
105
|
+
await assert.rejects(index.delete(revision.revisionId), KnowledgeError);
|
|
106
|
+
const retired = await index.stage(testScope, testComponent, [
|
|
107
|
+
stagedDocument('knowledge/b.md', 'B', 'beta'),
|
|
108
|
+
]);
|
|
109
|
+
await index.activate(retired.revisionId);
|
|
110
|
+
assert.equal(await index.delete(revision.revisionId), undefined);
|
|
111
|
+
});
|
|
112
|
+
it('rejects a non-public audience predicate at verification', async () => {
|
|
113
|
+
const index = makeIndex();
|
|
114
|
+
const revision = await index.stage(testScope, testComponent, [
|
|
115
|
+
stagedDocument('knowledge/a.md', 'A', 'alpha'),
|
|
116
|
+
]);
|
|
117
|
+
assert.equal(await index.verify(revision.revisionId, {
|
|
118
|
+
audience: 'public',
|
|
119
|
+
revision: revision.revisionId,
|
|
120
|
+
}), true);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const policy = { origin: 'https://www.acme.test', include: ['/docs/**', '/pricing'] };
|
|
125
|
+
export function describeSiteSearch(runner, makeSearch, label) {
|
|
126
|
+
const { describe, it } = runner;
|
|
127
|
+
describe(`SiteSearch conformance — ${label}`, () => {
|
|
128
|
+
it('requires a public audience predicate', async () => {
|
|
129
|
+
const search = makeSearch();
|
|
130
|
+
await assert.rejects(search.search(policy, { audience: 'private', revision: 'r' }, { query: 'anything', limit: 8 }), KnowledgeError);
|
|
131
|
+
});
|
|
132
|
+
it('returns only exact-origin, path-approved hits', async () => {
|
|
133
|
+
const search = makeSearch();
|
|
134
|
+
search.addPage?.('https://www.acme.test/docs/guide', 'Guide', 'install instructions here');
|
|
135
|
+
search.addPage?.('https://www.acme.test/blog/post', 'Blog', 'install instructions here');
|
|
136
|
+
search.addPage?.('https://evil.test/docs/guide', 'Evil', 'install instructions here');
|
|
137
|
+
const hits = await search.search(policy, publicPredicate('live'), {
|
|
138
|
+
query: 'install',
|
|
139
|
+
limit: 8,
|
|
140
|
+
});
|
|
141
|
+
assert.equal(hits.length, 1);
|
|
142
|
+
assert.equal(hits[0]?.uri, 'https://www.acme.test/docs/guide');
|
|
143
|
+
});
|
|
144
|
+
it('bounds results to the requested limit', async () => {
|
|
145
|
+
const search = makeSearch();
|
|
146
|
+
search.addPage?.('https://www.acme.test/docs/one', 'One', 'pricing details');
|
|
147
|
+
search.addPage?.('https://www.acme.test/docs/two', 'Two', 'pricing details');
|
|
148
|
+
search.addPage?.('https://www.acme.test/pricing', 'Pricing', 'pricing details');
|
|
149
|
+
const hits = await search.search(policy, publicPredicate('live'), {
|
|
150
|
+
query: 'pricing',
|
|
151
|
+
limit: 2,
|
|
152
|
+
});
|
|
153
|
+
assert.equal(hits.length, 2);
|
|
154
|
+
});
|
|
155
|
+
it('attributes failures through KnowledgeError, never raw provider text', async () => {
|
|
156
|
+
const search = makeSearch();
|
|
157
|
+
await assert.rejects(search.search(policy, publicPredicate('live'), { query: '', limit: 8 }), KnowledgeError);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** Cross-source fusion is part of the contract: policy filters run before the limit. */
|
|
162
|
+
export function fusionContractCases(runner) {
|
|
163
|
+
const { describe, it } = runner;
|
|
164
|
+
describe('fusion contract', () => {
|
|
165
|
+
const sitePolicies = [policy];
|
|
166
|
+
it('applies policy before the limit, never after', () => {
|
|
167
|
+
const documents = [];
|
|
168
|
+
const sites = [
|
|
169
|
+
{
|
|
170
|
+
id: 'https://www.acme.test/docs/a',
|
|
171
|
+
title: 'A',
|
|
172
|
+
excerpt: 'x',
|
|
173
|
+
sourceKind: 'site',
|
|
174
|
+
uri: 'https://www.acme.test/docs/a',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'https://evil.test/docs/b',
|
|
178
|
+
title: 'Evil',
|
|
179
|
+
excerpt: 'x',
|
|
180
|
+
sourceKind: 'site',
|
|
181
|
+
uri: 'https://evil.test/docs/b',
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: 'https://www.acme.test/blog/c',
|
|
185
|
+
title: 'Blog',
|
|
186
|
+
excerpt: 'x',
|
|
187
|
+
sourceKind: 'site',
|
|
188
|
+
uri: 'https://www.acme.test/blog/c',
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
const fused = fuseHits(documents, sites, { limit: 2, sitePolicies });
|
|
192
|
+
assert.equal(fused.length, 1);
|
|
193
|
+
assert.equal(fused[0]?.id, 'https://www.acme.test/docs/a');
|
|
194
|
+
});
|
|
195
|
+
it('deduplicates by canonical URL then stable id, preferring document evidence', () => {
|
|
196
|
+
const sharedUri = 'https://www.acme.test/docs/a';
|
|
197
|
+
const documents = [
|
|
198
|
+
{ id: 'doc:1', title: 'Doc', excerpt: 'x', sourceKind: 'document', uri: sharedUri },
|
|
199
|
+
];
|
|
200
|
+
const sites = [
|
|
201
|
+
{ id: sharedUri, title: 'Site', excerpt: 'x', sourceKind: 'site', uri: sharedUri },
|
|
202
|
+
];
|
|
203
|
+
const fused = fuseHits(documents, sites, { limit: 8, sitePolicies });
|
|
204
|
+
assert.equal(fused.length, 1);
|
|
205
|
+
assert.equal(fused[0]?.sourceKind, 'document');
|
|
206
|
+
});
|
|
207
|
+
it('breaks equal scores deterministically: document evidence outranks site evidence', () => {
|
|
208
|
+
const documents = [
|
|
209
|
+
{ id: 'doc:b', title: 'B', excerpt: 'x', sourceKind: 'document' },
|
|
210
|
+
];
|
|
211
|
+
const sites = [
|
|
212
|
+
{
|
|
213
|
+
id: 'https://www.acme.test/docs/a',
|
|
214
|
+
title: 'A',
|
|
215
|
+
excerpt: 'x',
|
|
216
|
+
sourceKind: 'site',
|
|
217
|
+
uri: 'https://www.acme.test/docs/a',
|
|
218
|
+
},
|
|
219
|
+
];
|
|
220
|
+
const fused = fuseHits(documents, sites, { limit: 2, sitePolicies });
|
|
221
|
+
assert.deepEqual(fused.map((hit) => hit.id), ['doc:b', 'https://www.acme.test/docs/a']);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type SearchHit, type SearchRequest } from './hits.js';
|
|
2
|
+
import type { AudiencePredicate, KnowledgeScope, SitePolicy } from './ir.js';
|
|
3
|
+
import { type KnowledgeIndex, type KnowledgeRevision, type SiteSearch, type StagedDocument } from './ports.js';
|
|
4
|
+
export declare class FakeKnowledgeIndex implements KnowledgeIndex {
|
|
5
|
+
private readonly entries;
|
|
6
|
+
stage(scope: KnowledgeScope, componentName: string, documents: readonly StagedDocument[]): Promise<KnowledgeRevision>;
|
|
7
|
+
verify(revisionId: string, predicate: AudiencePredicate): Promise<boolean>;
|
|
8
|
+
activate(revisionId: string): Promise<void>;
|
|
9
|
+
search(scope: KnowledgeScope, componentName: string, request: SearchRequest): Promise<readonly SearchHit[]>;
|
|
10
|
+
delete(revisionId: string): Promise<void>;
|
|
11
|
+
activeRevision(scope: KnowledgeScope, componentName: string): Promise<KnowledgeRevision | undefined>;
|
|
12
|
+
/** Test hook: pin a revision like a deployment record would. */
|
|
13
|
+
pin(revisionId: string, deploymentId: string): void;
|
|
14
|
+
private require;
|
|
15
|
+
}
|
|
16
|
+
export declare function fakeDocumentHit(document: StagedDocument): SearchHit;
|
|
17
|
+
/** Seeded live-site result set; applies the exact origin/path policy as its postfilter. */
|
|
18
|
+
export declare class FakeSiteSearch implements SiteSearch {
|
|
19
|
+
private readonly pages;
|
|
20
|
+
addPage(uri: string, title: string, text: string): this;
|
|
21
|
+
search(policy: SitePolicy, predicate: AudiencePredicate, request: SearchRequest): Promise<readonly SearchHit[]>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=fakes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fakes.d.ts","sourceRoot":"","sources":["../src/fakes.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAY,MAAM,WAAW,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AASpB,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAElD,KAAK,CACT,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAwBvB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3C,MAAM,CACV,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;IA2B1B,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,cAAc,CAClB,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IASzC,gEAAgE;IAChE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAInD,OAAO,CAAC,OAAO;CAMhB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAQnE;AAED,2FAA2F;AAC3F,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;IAE5E,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKjD,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;CA2BjC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory reference implementations of the knowledge ports. They exist to make the shared
|
|
3
|
+
* conformance suites executable without a provider; the bundled BM25 adapter and the managed
|
|
4
|
+
* Google adapter must pass the exact same suites.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { siteHitAllowed } from './fusion.js';
|
|
8
|
+
import { buildExcerpt, tokenize } from './hits.js';
|
|
9
|
+
import { knowledgeScopeKey } from './ir.js';
|
|
10
|
+
import { KnowledgeError, } from './ports.js';
|
|
11
|
+
export class FakeKnowledgeIndex {
|
|
12
|
+
entries = new Map();
|
|
13
|
+
async stage(scope, componentName, documents) {
|
|
14
|
+
const hash = createHash('sha256')
|
|
15
|
+
.update(documents.map((document) => document.descriptor.sha256).join('\n'))
|
|
16
|
+
.digest('hex');
|
|
17
|
+
const revisionId = `fake-rev-${hash.slice(0, 16)}`;
|
|
18
|
+
this.entries.set(revisionId, {
|
|
19
|
+
revision: {
|
|
20
|
+
revisionId,
|
|
21
|
+
scope,
|
|
22
|
+
componentName,
|
|
23
|
+
documents: documents.map((document) => document.descriptor),
|
|
24
|
+
},
|
|
25
|
+
documents,
|
|
26
|
+
state: 'staged',
|
|
27
|
+
pins: new Set(),
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
revisionId,
|
|
31
|
+
scope,
|
|
32
|
+
componentName,
|
|
33
|
+
documents: documents.map((document) => document.descriptor),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async verify(revisionId, predicate) {
|
|
37
|
+
const entry = this.require(revisionId);
|
|
38
|
+
if (predicate.audience !== 'public') {
|
|
39
|
+
throw new KnowledgeError('predicate', 'fake index only accepts a public audience');
|
|
40
|
+
}
|
|
41
|
+
return entry.revision.revisionId === predicate.revision && entry.documents.length > 0;
|
|
42
|
+
}
|
|
43
|
+
async activate(revisionId) {
|
|
44
|
+
const entry = this.require(revisionId);
|
|
45
|
+
for (const other of this.entries.values()) {
|
|
46
|
+
if (other !== entry &&
|
|
47
|
+
other.state === 'active' &&
|
|
48
|
+
knowledgeScopeKey(other.revision.scope, other.revision.componentName) ===
|
|
49
|
+
knowledgeScopeKey(entry.revision.scope, entry.revision.componentName)) {
|
|
50
|
+
other.state = 'retired';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
entry.state = 'active';
|
|
54
|
+
}
|
|
55
|
+
async search(scope, componentName, request) {
|
|
56
|
+
const scopeKey = knowledgeScopeKey(scope, componentName);
|
|
57
|
+
const entry = [...this.entries.values()].find((candidate) => candidate.state === 'active' &&
|
|
58
|
+
knowledgeScopeKey(candidate.revision.scope, candidate.revision.componentName) === scopeKey);
|
|
59
|
+
if (entry === undefined)
|
|
60
|
+
throw new KnowledgeError('not-found', 'no active revision for this component');
|
|
61
|
+
const terms = new Set(tokenize(request.query));
|
|
62
|
+
return entry.documents
|
|
63
|
+
.map((document) => {
|
|
64
|
+
const documentTerms = tokenize(document.text);
|
|
65
|
+
const matches = documentTerms.filter((term) => terms.has(term)).length;
|
|
66
|
+
return { document, matches };
|
|
67
|
+
})
|
|
68
|
+
.filter((candidate) => candidate.matches > 0)
|
|
69
|
+
.sort((a, b) => b.matches !== a.matches
|
|
70
|
+
? b.matches - a.matches
|
|
71
|
+
: a.document.descriptor.path.localeCompare(b.document.descriptor.path))
|
|
72
|
+
.slice(0, request.limit)
|
|
73
|
+
.map(({ document }) => fakeDocumentHit(document));
|
|
74
|
+
}
|
|
75
|
+
async delete(revisionId) {
|
|
76
|
+
const entry = this.require(revisionId);
|
|
77
|
+
if (entry.state === 'active')
|
|
78
|
+
throw new KnowledgeError('store', 'cannot delete the active revision');
|
|
79
|
+
if (entry.pins.size > 0)
|
|
80
|
+
throw new KnowledgeError('store', 'cannot delete a pinned revision');
|
|
81
|
+
this.entries.delete(revisionId);
|
|
82
|
+
}
|
|
83
|
+
async activeRevision(scope, componentName) {
|
|
84
|
+
const scopeKey = knowledgeScopeKey(scope, componentName);
|
|
85
|
+
return [...this.entries.values()].find((candidate) => candidate.state === 'active' &&
|
|
86
|
+
knowledgeScopeKey(candidate.revision.scope, candidate.revision.componentName) === scopeKey)?.revision;
|
|
87
|
+
}
|
|
88
|
+
/** Test hook: pin a revision like a deployment record would. */
|
|
89
|
+
pin(revisionId, deploymentId) {
|
|
90
|
+
this.require(revisionId).pins.add(deploymentId);
|
|
91
|
+
}
|
|
92
|
+
require(revisionId) {
|
|
93
|
+
const entry = this.entries.get(revisionId);
|
|
94
|
+
if (entry === undefined)
|
|
95
|
+
throw new KnowledgeError('not-found', `unknown revision ${revisionId}`);
|
|
96
|
+
return entry;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function fakeDocumentHit(document) {
|
|
100
|
+
return {
|
|
101
|
+
id: `doc:${document.descriptor.sha256.slice(0, 16)}`,
|
|
102
|
+
title: document.descriptor.title,
|
|
103
|
+
excerpt: buildExcerpt(document.text, ''),
|
|
104
|
+
sourceKind: 'document',
|
|
105
|
+
...(document.descriptor.sourceUrl !== undefined ? { uri: document.descriptor.sourceUrl } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Seeded live-site result set; applies the exact origin/path policy as its postfilter. */
|
|
109
|
+
export class FakeSiteSearch {
|
|
110
|
+
pages = new Map();
|
|
111
|
+
addPage(uri, title, text) {
|
|
112
|
+
this.pages.set(uri, { title, text });
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
async search(policy, predicate, request) {
|
|
116
|
+
if (predicate.audience !== 'public') {
|
|
117
|
+
throw new KnowledgeError('predicate', 'site search rejects non-public audiences');
|
|
118
|
+
}
|
|
119
|
+
if (request.query.trim().length === 0) {
|
|
120
|
+
throw new KnowledgeError('request', 'query must not be empty');
|
|
121
|
+
}
|
|
122
|
+
const terms = new Set(tokenize(request.query));
|
|
123
|
+
return [...this.pages.entries()]
|
|
124
|
+
.map(([uri, page]) => {
|
|
125
|
+
const hit = {
|
|
126
|
+
id: uri,
|
|
127
|
+
title: page.title,
|
|
128
|
+
excerpt: buildExcerpt(page.text, request.query),
|
|
129
|
+
sourceKind: 'site',
|
|
130
|
+
uri,
|
|
131
|
+
};
|
|
132
|
+
const matches = tokenize(`${page.title} ${page.text}`).filter((term) => terms.has(term)).length;
|
|
133
|
+
return { hit, matches };
|
|
134
|
+
})
|
|
135
|
+
.filter(({ hit, matches }) => matches > 0 && siteHitAllowed(policy, hit))
|
|
136
|
+
.sort((a, b) => b.matches - a.matches || a.hit.id.localeCompare(b.hit.id))
|
|
137
|
+
.slice(0, request.limit)
|
|
138
|
+
.map(({ hit }) => hit);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=fakes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fakes.js","sourceRoot":"","sources":["../src/fakes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic result fusion (ADR 0202): equal-weight reciprocal rank fusion with k = 60,
|
|
3
|
+
* canonical-URL then stable-ID dedupe, deterministic source-kind/stable-ID tie-break, and
|
|
4
|
+
* policy filtering applied before the requested limit.
|
|
5
|
+
*/
|
|
6
|
+
import type { SearchHit } from './hits.js';
|
|
7
|
+
import type { SitePolicy } from './ir.js';
|
|
8
|
+
/** Exact origin/path admission for site hits — everything else is dropped, not returned. */
|
|
9
|
+
export declare function siteHitAllowed(policy: SitePolicy, hit: SearchHit): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Glob matching over URL paths. Supports `**` (any segments) and `*` (within one segment),
|
|
12
|
+
* with an exact literal as the degenerate case. A pattern with a trailing `/**` admits
|
|
13
|
+
* everything beneath the prefix but not the bare prefix itself unless listed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function pathMatches(pathname: string, glob: string): boolean;
|
|
16
|
+
export interface FuseOptions {
|
|
17
|
+
readonly limit: number;
|
|
18
|
+
/** Every site policy of the knowledge component; a site hit must satisfy at least one. */
|
|
19
|
+
readonly sitePolicies: readonly SitePolicy[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fuse document and site result lists. Both inputs are ranked best-first and may be longer
|
|
23
|
+
* than `limit`; providers' own scores are ignored — rank position is the only signal that
|
|
24
|
+
* crosses a provider boundary.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fuseHits(documents: readonly SearchHit[], sites: readonly SearchHit[], options: FuseOptions): SearchHit[];
|
|
27
|
+
//# sourceMappingURL=fusion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fusion.d.ts","sourceRoot":"","sources":["../src/fusion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAU1E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAyBnE;AAqBD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,SAAS,SAAS,EAAE,EAC/B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,OAAO,EAAE,WAAW,GACnB,SAAS,EAAE,CA0Cb"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { RRF_K } from './limits.js';
|
|
2
|
+
/** Exact origin/path admission for site hits — everything else is dropped, not returned. */
|
|
3
|
+
export function siteHitAllowed(policy, hit) {
|
|
4
|
+
if (hit.sourceKind !== 'site' || hit.uri === undefined)
|
|
5
|
+
return false;
|
|
6
|
+
let parsed;
|
|
7
|
+
try {
|
|
8
|
+
parsed = new URL(hit.uri);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (parsed.origin !== policy.origin)
|
|
14
|
+
return false;
|
|
15
|
+
return policy.include.some((glob) => pathMatches(parsed.pathname, glob));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Glob matching over URL paths. Supports `**` (any segments) and `*` (within one segment),
|
|
19
|
+
* with an exact literal as the degenerate case. A pattern with a trailing `/**` admits
|
|
20
|
+
* everything beneath the prefix but not the bare prefix itself unless listed.
|
|
21
|
+
*/
|
|
22
|
+
export function pathMatches(pathname, glob) {
|
|
23
|
+
const pathSegments = pathname.split('/').filter((segment) => segment !== '');
|
|
24
|
+
const globSegments = glob.split('/').filter((segment) => segment !== '');
|
|
25
|
+
if (globSegments.length === 0)
|
|
26
|
+
return false;
|
|
27
|
+
function match(pathIndex, globIndex) {
|
|
28
|
+
if (globIndex === globSegments.length)
|
|
29
|
+
return pathIndex === pathSegments.length;
|
|
30
|
+
const pattern = globSegments[globIndex];
|
|
31
|
+
if (pattern === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
if (pattern === '**') {
|
|
34
|
+
// `**` consumes zero or more segments; a *trailing* `**` must consume at least one,
|
|
35
|
+
// so `/docs/**` admits everything beneath `/docs` but not the bare prefix.
|
|
36
|
+
const minimum = globIndex === globSegments.length - 1 ? 1 : 0;
|
|
37
|
+
for (let skip = pathSegments.length - pathIndex; skip >= minimum; skip -= 1) {
|
|
38
|
+
if (match(pathIndex + skip, globIndex + 1))
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (pathIndex === pathSegments.length)
|
|
44
|
+
return false;
|
|
45
|
+
const segment = pathSegments[pathIndex];
|
|
46
|
+
if (segment === undefined || !segmentMatches(segment, pattern))
|
|
47
|
+
return false;
|
|
48
|
+
return match(pathIndex + 1, globIndex + 1);
|
|
49
|
+
}
|
|
50
|
+
return match(0, 0);
|
|
51
|
+
}
|
|
52
|
+
function segmentMatches(segment, pattern) {
|
|
53
|
+
const firstStar = pattern.indexOf('*');
|
|
54
|
+
if (firstStar === -1)
|
|
55
|
+
return segment === pattern;
|
|
56
|
+
const lastStar = pattern.lastIndexOf('*');
|
|
57
|
+
const prefix = pattern.slice(0, firstStar);
|
|
58
|
+
const suffix = pattern.slice(lastStar + 1);
|
|
59
|
+
if (!segment.startsWith(prefix) || !segment.endsWith(suffix))
|
|
60
|
+
return false;
|
|
61
|
+
if (segment.length < prefix.length + suffix.length)
|
|
62
|
+
return false;
|
|
63
|
+
const available = segment.length - suffix.length;
|
|
64
|
+
let cursor = prefix.length;
|
|
65
|
+
for (const middle of pattern.slice(firstStar + 1, lastStar).split('*')) {
|
|
66
|
+
if (middle === '')
|
|
67
|
+
continue;
|
|
68
|
+
const found = segment.indexOf(middle, cursor);
|
|
69
|
+
if (found === -1 || found + middle.length > available)
|
|
70
|
+
return false;
|
|
71
|
+
cursor = found + middle.length;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fuse document and site result lists. Both inputs are ranked best-first and may be longer
|
|
77
|
+
* than `limit`; providers' own scores are ignored — rank position is the only signal that
|
|
78
|
+
* crosses a provider boundary.
|
|
79
|
+
*/
|
|
80
|
+
export function fuseHits(documents, sites, options) {
|
|
81
|
+
const scores = new Map();
|
|
82
|
+
const admit = (hit, rank, weight) => {
|
|
83
|
+
if (hit.sourceKind === 'site' &&
|
|
84
|
+
!options.sitePolicies.some((policy) => siteHitAllowed(policy, hit))) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const key = hit.uri ?? hit.id;
|
|
88
|
+
const contribution = weight / (RRF_K + rank + 1);
|
|
89
|
+
const existing = scores.get(key);
|
|
90
|
+
if (existing === undefined) {
|
|
91
|
+
scores.set(key, { hit, score: contribution });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
existing.score += contribution;
|
|
95
|
+
// Canonical-URL then stable-ID dedupe keeps the earliest-seen hit; document evidence
|
|
96
|
+
// outranks site evidence on collision because it is the versioned source.
|
|
97
|
+
if (existing.hit.sourceKind === 'site' && hit.sourceKind === 'document') {
|
|
98
|
+
existing.hit = hit;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
documents.forEach((hit, rank) => {
|
|
102
|
+
admit(hit, rank, 1);
|
|
103
|
+
});
|
|
104
|
+
sites.forEach((hit, rank) => {
|
|
105
|
+
admit(hit, rank, 1);
|
|
106
|
+
});
|
|
107
|
+
return [...scores.values()]
|
|
108
|
+
.sort((a, b) => {
|
|
109
|
+
if (b.score !== a.score)
|
|
110
|
+
return b.score - a.score;
|
|
111
|
+
if (a.hit.sourceKind !== b.hit.sourceKind) {
|
|
112
|
+
return a.hit.sourceKind === 'document' ? -1 : 1;
|
|
113
|
+
}
|
|
114
|
+
return a.hit.id.localeCompare(b.hit.id);
|
|
115
|
+
})
|
|
116
|
+
.slice(0, options.limit)
|
|
117
|
+
.map((entry) => entry.hit);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=fusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fusion.js","sourceRoot":"","sources":["../src/fusion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SearchHit, type SearchRequest } from './hits.js';
|
|
2
|
+
import type { AudiencePredicate, KnowledgeScope, SitePolicy } from './ir.js';
|
|
3
|
+
import { type KnowledgeIndex, type KnowledgeRevision, type SiteSearch, type StagedDocument } from './ports.js';
|
|
4
|
+
/** Supplies short-lived bearer tokens. The broker implements this; tests inject a fixed token. */
|
|
5
|
+
export type GoogleAccessTokenProvider = () => Promise<string>;
|
|
6
|
+
/** Minimal fetch-shaped transport so unit tests run against scripted responses, never network. */
|
|
7
|
+
export type GoogleTransport = (url: string, init: {
|
|
8
|
+
readonly method: 'POST' | 'GET' | 'DELETE';
|
|
9
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
10
|
+
readonly body?: string;
|
|
11
|
+
}) => Promise<{
|
|
12
|
+
status: number;
|
|
13
|
+
json(): Promise<unknown>;
|
|
14
|
+
}>;
|
|
15
|
+
export interface GoogleAgentSearchOptions {
|
|
16
|
+
/** Noodle-owned GCP project id (managed v0; BYO project arrives with the deferred tier). */
|
|
17
|
+
readonly project: string;
|
|
18
|
+
readonly location: string;
|
|
19
|
+
readonly tokenProvider: GoogleAccessTokenProvider;
|
|
20
|
+
readonly transport?: GoogleTransport;
|
|
21
|
+
/** Escape hatch for tests/ops to point at a stub endpoint. */
|
|
22
|
+
readonly apiRoot?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Tenant scope this instance serves. One adapter instance per tenant: the service binds it at
|
|
25
|
+
* request time from the deployment's identity, and site search needs it to target the tenant's
|
|
26
|
+
* website data store.
|
|
27
|
+
*/
|
|
28
|
+
readonly scope: KnowledgeScope;
|
|
29
|
+
}
|
|
30
|
+
export declare class GoogleAgentSearchAdapter implements KnowledgeIndex {
|
|
31
|
+
#private;
|
|
32
|
+
constructor(options: GoogleAgentSearchOptions);
|
|
33
|
+
private dataStoreName;
|
|
34
|
+
private call;
|
|
35
|
+
stage(scope: KnowledgeScope, componentName: string, documents: readonly StagedDocument[]): Promise<KnowledgeRevision>;
|
|
36
|
+
verify(revisionId: string, predicate: AudiencePredicate): Promise<boolean>;
|
|
37
|
+
activate(revisionId: string): Promise<void>;
|
|
38
|
+
search(scope: KnowledgeScope, componentName: string, request: SearchRequest): Promise<readonly SearchHit[]>;
|
|
39
|
+
private toDocumentHit;
|
|
40
|
+
delete(revisionId: string): Promise<void>;
|
|
41
|
+
activeRevision(scope: KnowledgeScope, componentName: string): Promise<KnowledgeRevision | undefined>;
|
|
42
|
+
}
|
|
43
|
+
/** Site half of the managed adapter: live public-website search over the tenant's WEBSITE store. */
|
|
44
|
+
export declare class GoogleAgentSearchSites implements SiteSearch {
|
|
45
|
+
#private;
|
|
46
|
+
constructor(options: GoogleAgentSearchOptions);
|
|
47
|
+
search(policy: SitePolicy, predicate: AudiencePredicate, request: SearchRequest): Promise<readonly SearchHit[]>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=google-agent-search.d.ts.map
|