@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.
Files changed (416) hide show
  1. package/dist/commands/auth-ops.d.ts.map +1 -1
  2. package/dist/commands/auth-ops.js +1 -0
  3. package/dist/commands/auth-ops.js.map +1 -1
  4. package/dist/commands/catalog-data-bootstrap-authoring.d.ts.map +1 -1
  5. package/dist/commands/catalog-data-bootstrap-authoring.js +98 -189
  6. package/dist/commands/catalog-data-bootstrap-authoring.js.map +1 -1
  7. package/dist/commands/mcp-apps.d.ts.map +1 -1
  8. package/dist/commands/mcp-apps.js +1 -0
  9. package/dist/commands/mcp-apps.js.map +1 -1
  10. package/dist/commands/project-setup.d.ts.map +1 -1
  11. package/dist/commands/project-setup.js +25 -5
  12. package/dist/commands/project-setup.js.map +1 -1
  13. package/dist/delegated-token-exchange-preflight.d.ts.map +1 -1
  14. package/dist/delegated-token-exchange-preflight.js +1 -0
  15. package/dist/delegated-token-exchange-preflight.js.map +1 -1
  16. package/dist/deploy.d.ts.map +1 -1
  17. package/dist/deploy.js +8 -131
  18. package/dist/deploy.js.map +1 -1
  19. package/dist/index.d.ts +1 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/local-compile.d.ts.map +1 -1
  24. package/dist/local-compile.js +1 -0
  25. package/dist/local-compile.js.map +1 -1
  26. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts.map +1 -1
  27. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
  28. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -1
  29. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.d.ts.map +1 -1
  30. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +7 -5
  31. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  32. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  33. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +5 -0
  34. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  35. package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js +1 -1
  36. package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js.map +1 -1
  37. package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.d.ts.map +1 -1
  38. package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.js +5 -3
  39. package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.js.map +1 -1
  40. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.d.ts.map +1 -1
  41. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +20 -0
  42. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  43. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -1
  44. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +5 -1
  45. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
  46. package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.d.ts +2 -1
  47. package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.d.ts.map +1 -1
  48. package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.js +11 -1
  49. package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.js.map +1 -1
  50. package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-types.d.ts +16 -3
  51. package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-types.d.ts.map +1 -1
  52. package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.d.ts.map +1 -1
  53. package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.js +13 -4
  54. package/node_modules/@noodle-borg/agent-packaging/dist/host-packaging-validation.js.map +1 -1
  55. package/node_modules/@noodle-borg/agent-packaging/dist/index.d.ts +1 -0
  56. package/node_modules/@noodle-borg/agent-packaging/dist/index.d.ts.map +1 -1
  57. package/node_modules/@noodle-borg/agent-packaging/dist/index.js +1 -0
  58. package/node_modules/@noodle-borg/agent-packaging/dist/index.js.map +1 -1
  59. package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.d.ts.map +1 -1
  60. package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.js +4 -3
  61. package/node_modules/@noodle-borg/agent-packaging/dist/product-skill-validation.js.map +1 -1
  62. package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
  63. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +4 -3
  64. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts.map +1 -1
  65. package/node_modules/@noodle-borg/authoring/dist/assistant.js.map +1 -1
  66. package/node_modules/@noodle-borg/authoring/dist/distribution.d.ts +17 -3
  67. package/node_modules/@noodle-borg/authoring/dist/distribution.d.ts.map +1 -1
  68. package/node_modules/@noodle-borg/authoring/dist/distribution.js.map +1 -1
  69. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
  70. package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -1
  71. package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
  72. package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -1
  73. package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts +70 -0
  74. package/node_modules/@noodle-borg/authoring/dist/knowledge.d.ts.map +1 -0
  75. package/node_modules/@noodle-borg/authoring/dist/knowledge.js +50 -0
  76. package/node_modules/@noodle-borg/authoring/dist/knowledge.js.map +1 -0
  77. package/node_modules/@noodle-borg/authoring/dist/load-authored.d.ts +24 -0
  78. package/node_modules/@noodle-borg/authoring/dist/load-authored.d.ts.map +1 -0
  79. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +141 -0
  80. package/node_modules/@noodle-borg/authoring/dist/load-authored.js.map +1 -0
  81. package/node_modules/@noodle-borg/authoring/dist/react/components.d.ts +3 -3
  82. package/node_modules/@noodle-borg/authoring/dist/react/native-components.d.ts +2 -2
  83. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
  84. package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
  85. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -0
  86. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  87. package/node_modules/@noodle-borg/authoring/package.json +5 -0
  88. package/node_modules/@noodle-borg/brand-kit/dist/index.d.ts +8 -0
  89. package/node_modules/@noodle-borg/brand-kit/dist/index.d.ts.map +1 -0
  90. package/node_modules/@noodle-borg/brand-kit/dist/index.js +8 -0
  91. package/node_modules/@noodle-borg/brand-kit/dist/index.js.map +1 -0
  92. package/node_modules/@noodle-borg/{compiler/dist/widget-palette.d.ts → brand-kit/dist/palette.d.ts} +1 -1
  93. package/node_modules/@noodle-borg/brand-kit/dist/palette.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/{compiler/dist/widget-palette.js → brand-kit/dist/palette.js} +1 -1
  95. package/node_modules/@noodle-borg/brand-kit/dist/palette.js.map +1 -0
  96. package/node_modules/@noodle-borg/{compiler/dist/widget-ui-style.d.ts → brand-kit/dist/ui-style.d.ts} +1 -1
  97. package/node_modules/@noodle-borg/brand-kit/dist/ui-style.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/{compiler/dist/widget-ui-style.js → brand-kit/dist/ui-style.js} +1 -1
  99. package/node_modules/@noodle-borg/brand-kit/dist/ui-style.js.map +1 -0
  100. package/node_modules/@noodle-borg/brand-kit/package.json +28 -0
  101. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.d.ts +2 -1
  102. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.d.ts.map +1 -1
  103. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
  104. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js.map +1 -1
  105. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +3 -0
  106. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -1
  107. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -1
  108. package/node_modules/@noodle-borg/compiler/dist/branding.d.ts.map +1 -1
  109. package/node_modules/@noodle-borg/compiler/dist/branding.js +1 -1
  110. package/node_modules/@noodle-borg/compiler/dist/branding.js.map +1 -1
  111. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts +8 -0
  112. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
  113. package/node_modules/@noodle-borg/compiler/dist/compile.js +8 -1
  114. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
  115. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  116. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -1
  117. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +1 -1
  118. package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -1
  119. package/node_modules/@noodle-borg/compiler/dist/index.js +1 -1
  120. package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -1
  121. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +36 -0
  122. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
  123. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +7 -1
  124. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
  125. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts +4 -0
  126. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts.map +1 -1
  127. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js +1 -0
  128. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js.map +1 -1
  129. package/node_modules/@noodle-borg/compiler/dist/widget-emit.d.ts +1 -1
  130. package/node_modules/@noodle-borg/compiler/dist/widget-emit.d.ts.map +1 -1
  131. package/node_modules/@noodle-borg/compiler/dist/widget-emit.js +1 -1
  132. package/node_modules/@noodle-borg/compiler/dist/widget-emit.js.map +1 -1
  133. package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.d.ts +1 -1
  134. package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.d.ts.map +1 -1
  135. package/node_modules/@noodle-borg/compiler/dist/widget-size-validation.js.map +1 -1
  136. package/node_modules/@noodle-borg/compiler/package.json +3 -0
  137. package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts +14 -0
  138. package/node_modules/@noodle-borg/knowledge/dist/bm25.d.ts.map +1 -0
  139. package/node_modules/@noodle-borg/knowledge/dist/bm25.js +133 -0
  140. package/node_modules/@noodle-borg/knowledge/dist/bm25.js.map +1 -0
  141. package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts +37 -0
  142. package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts.map +1 -0
  143. package/node_modules/@noodle-borg/knowledge/dist/budget.js +52 -0
  144. package/node_modules/@noodle-borg/knowledge/dist/budget.js.map +1 -0
  145. package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts +52 -0
  146. package/node_modules/@noodle-borg/knowledge/dist/compile.d.ts.map +1 -0
  147. package/node_modules/@noodle-borg/knowledge/dist/compile.js +250 -0
  148. package/node_modules/@noodle-borg/knowledge/dist/compile.js.map +1 -0
  149. package/node_modules/@noodle-borg/knowledge/dist/conformance.d.ts +21 -0
  150. package/node_modules/@noodle-borg/knowledge/dist/conformance.d.ts.map +1 -0
  151. package/node_modules/@noodle-borg/knowledge/dist/conformance.js +225 -0
  152. package/node_modules/@noodle-borg/knowledge/dist/conformance.js.map +1 -0
  153. package/node_modules/@noodle-borg/knowledge/dist/fakes.d.ts +23 -0
  154. package/node_modules/@noodle-borg/knowledge/dist/fakes.d.ts.map +1 -0
  155. package/node_modules/@noodle-borg/knowledge/dist/fakes.js +141 -0
  156. package/node_modules/@noodle-borg/knowledge/dist/fakes.js.map +1 -0
  157. package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts +27 -0
  158. package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts.map +1 -0
  159. package/node_modules/@noodle-borg/knowledge/dist/fusion.js +119 -0
  160. package/node_modules/@noodle-borg/knowledge/dist/fusion.js.map +1 -0
  161. package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts +49 -0
  162. package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.d.ts.map +1 -0
  163. package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js +235 -0
  164. package/node_modules/@noodle-borg/knowledge/dist/google-agent-search.js.map +1 -0
  165. package/node_modules/@noodle-borg/knowledge/dist/hits.d.ts +31 -0
  166. package/node_modules/@noodle-borg/knowledge/dist/hits.d.ts.map +1 -0
  167. package/node_modules/@noodle-borg/knowledge/dist/hits.js +75 -0
  168. package/node_modules/@noodle-borg/knowledge/dist/hits.js.map +1 -0
  169. package/node_modules/@noodle-borg/knowledge/dist/index.d.ts +25 -0
  170. package/node_modules/@noodle-borg/knowledge/dist/index.d.ts.map +1 -0
  171. package/node_modules/@noodle-borg/knowledge/dist/index.js +25 -0
  172. package/node_modules/@noodle-borg/knowledge/dist/index.js.map +1 -0
  173. package/node_modules/@noodle-borg/knowledge/dist/ir.d.ts +53 -0
  174. package/node_modules/@noodle-borg/knowledge/dist/ir.d.ts.map +1 -0
  175. package/node_modules/@noodle-borg/knowledge/dist/ir.js +87 -0
  176. package/node_modules/@noodle-borg/knowledge/dist/ir.js.map +1 -0
  177. package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts +19 -0
  178. package/node_modules/@noodle-borg/knowledge/dist/limits.d.ts.map +1 -0
  179. package/node_modules/@noodle-borg/knowledge/dist/limits.js +19 -0
  180. package/node_modules/@noodle-borg/knowledge/dist/limits.js.map +1 -0
  181. package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts +42 -0
  182. package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.d.ts.map +1 -0
  183. package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js +45 -0
  184. package/node_modules/@noodle-borg/knowledge/dist/manifest-schema.js.map +1 -0
  185. package/node_modules/@noodle-borg/knowledge/dist/ports.d.ts +56 -0
  186. package/node_modules/@noodle-borg/knowledge/dist/ports.d.ts.map +1 -0
  187. package/node_modules/@noodle-borg/knowledge/dist/ports.js +13 -0
  188. package/node_modules/@noodle-borg/knowledge/dist/ports.js.map +1 -0
  189. package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +33 -0
  190. package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts.map +1 -0
  191. package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js +200 -0
  192. package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -0
  193. package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +59 -0
  194. package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -0
  195. package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +128 -0
  196. package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -0
  197. package/node_modules/@noodle-borg/knowledge/package.json +36 -0
  198. package/node_modules/@noodle-borg/module/dist/contract.d.ts +2 -0
  199. package/node_modules/@noodle-borg/module/dist/contract.d.ts.map +1 -1
  200. package/node_modules/@noodle-borg/module/dist/contract.js.map +1 -1
  201. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.d.ts +4 -0
  202. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.d.ts.map +1 -0
  203. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.js +147 -0
  204. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-render.js.map +1 -0
  205. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.d.ts +14 -0
  206. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.d.ts.map +1 -0
  207. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.js +2 -0
  208. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-types.js.map +1 -0
  209. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.d.ts +10 -0
  210. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.d.ts.map +1 -0
  211. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.js +152 -0
  212. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector-validation.js.map +1 -0
  213. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.d.ts +7 -0
  214. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.d.ts.map +1 -0
  215. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.js +24 -0
  216. package/node_modules/@noodle-borg/plugin-distribution/dist/anthropic-connector.js.map +1 -0
  217. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.d.ts +6 -0
  218. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.d.ts.map +1 -0
  219. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.js +260 -0
  220. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-distribution-command.js.map +1 -0
  221. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.d.ts +3 -0
  222. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.d.ts.map +1 -0
  223. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.js +89 -0
  224. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-render.js.map +1 -0
  225. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.d.ts +3 -0
  226. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.d.ts.map +1 -0
  227. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.js +16 -0
  228. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin-validation.js.map +1 -0
  229. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.d.ts +5 -0
  230. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.d.ts.map +1 -0
  231. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.js +15 -0
  232. package/node_modules/@noodle-borg/plugin-distribution/dist/claude-plugin.js.map +1 -0
  233. package/node_modules/@noodle-borg/plugin-distribution/dist/command.d.ts +3 -0
  234. package/node_modules/@noodle-borg/plugin-distribution/dist/command.d.ts.map +1 -0
  235. package/node_modules/@noodle-borg/plugin-distribution/dist/command.js +3 -0
  236. package/node_modules/@noodle-borg/plugin-distribution/dist/command.js.map +1 -0
  237. package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.d.ts +37 -0
  238. package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.d.ts.map +1 -0
  239. package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.js +60 -0
  240. package/node_modules/@noodle-borg/plugin-distribution/dist/distribution-command-support.js.map +1 -0
  241. package/node_modules/@noodle-borg/plugin-distribution/dist/index.d.ts +2 -0
  242. package/node_modules/@noodle-borg/plugin-distribution/dist/index.d.ts.map +1 -1
  243. package/node_modules/@noodle-borg/plugin-distribution/dist/index.js +2 -0
  244. package/node_modules/@noodle-borg/plugin-distribution/dist/index.js.map +1 -1
  245. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.d.ts +3 -28
  246. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.d.ts.map +1 -1
  247. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.js +23 -64
  248. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-command.js.map +1 -1
  249. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.d.ts.map +1 -1
  250. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.js +3 -97
  251. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-render.js.map +1 -1
  252. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.d.ts.map +1 -1
  253. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.js +19 -8
  254. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-plugin-validation.js.map +1 -1
  255. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.d.ts +5 -0
  256. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.d.ts.map +1 -0
  257. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.js +147 -0
  258. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.js.map +1 -0
  259. package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.d.ts +3 -0
  260. package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.d.ts.map +1 -0
  261. package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.js +22 -0
  262. package/node_modules/@noodle-borg/plugin-distribution/dist/public-url.js.map +1 -0
  263. package/node_modules/@noodle-borg/plugin-distribution/package.json +2 -2
  264. package/node_modules/@noodle-borg/protocol/dist/handlers/resources.d.ts +1 -1
  265. package/node_modules/@noodle-borg/protocol/dist/handlers/resources.d.ts.map +1 -1
  266. package/node_modules/@noodle-borg/protocol/dist/handlers/resources.js +1 -1
  267. package/node_modules/@noodle-borg/protocol/dist/handlers/resources.js.map +1 -1
  268. package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.d.ts +1 -1
  269. package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.d.ts.map +1 -1
  270. package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.js +1 -1
  271. package/node_modules/@noodle-borg/protocol/dist/v2/response-observation.js.map +1 -1
  272. package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts.map +1 -1
  273. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +1 -1
  274. package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
  275. package/node_modules/@noodle-borg/protocol/package.json +1 -0
  276. package/node_modules/@noodle-borg/service/dist/index.d.ts +0 -1
  277. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  278. package/node_modules/@noodle-borg/service/dist/index.js +0 -1
  279. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  280. package/node_modules/@noodle-borg/service/dist/main.js +0 -52
  281. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  282. package/node_modules/@noodle-borg/service/dist/modules/host.d.ts +2 -6
  283. package/node_modules/@noodle-borg/service/dist/modules/host.d.ts.map +1 -1
  284. package/node_modules/@noodle-borg/service/dist/modules/host.js.map +1 -1
  285. package/node_modules/@noodle-borg/service/dist/options.d.ts +1 -21
  286. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  287. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +7 -1
  288. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  289. package/node_modules/@noodle-borg/service/dist/serve.d.ts +0 -1
  290. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  291. package/node_modules/@noodle-borg/service/dist/serve.js +22 -26
  292. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  293. package/node_modules/@noodle-borg/service/dist/service-config.d.ts +1 -1
  294. package/node_modules/@noodle-borg/service/dist/service-config.d.ts.map +1 -1
  295. package/node_modules/@noodle-borg/service/dist/service-config.js.map +1 -1
  296. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  297. package/node_modules/@noodle-borg/service/dist/service.js +1 -24
  298. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  299. package/node_modules/@noodle-borg/service/package.json +1 -0
  300. package/node_modules/@noodle-borg/service-modules/dist/index.d.ts +9 -0
  301. package/node_modules/@noodle-borg/service-modules/dist/index.d.ts.map +1 -0
  302. package/node_modules/@noodle-borg/service-modules/dist/index.js +9 -0
  303. package/node_modules/@noodle-borg/service-modules/dist/index.js.map +1 -0
  304. package/node_modules/@noodle-borg/service-modules/dist/loaded-module.d.ts +8 -0
  305. package/node_modules/@noodle-borg/service-modules/dist/loaded-module.d.ts.map +1 -0
  306. package/node_modules/@noodle-borg/service-modules/dist/loaded-module.js +2 -0
  307. package/node_modules/@noodle-borg/service-modules/dist/loaded-module.js.map +1 -0
  308. package/node_modules/@noodle-borg/{service/dist/modules → service-modules/dist}/loader.d.ts +1 -1
  309. package/node_modules/@noodle-borg/service-modules/dist/loader.d.ts.map +1 -0
  310. package/node_modules/@noodle-borg/service-modules/dist/loader.js.map +1 -0
  311. package/node_modules/@noodle-borg/service-modules/package.json +32 -0
  312. package/node_modules/@noodle-borg/uri-template/dist/index.d.ts +7 -0
  313. package/node_modules/@noodle-borg/uri-template/dist/index.d.ts.map +1 -0
  314. package/node_modules/@noodle-borg/uri-template/dist/index.js +7 -0
  315. package/node_modules/@noodle-borg/uri-template/dist/index.js.map +1 -0
  316. package/node_modules/@noodle-borg/uri-template/package.json +28 -0
  317. package/node_modules/@noodleseed/assistant/dist/{chunk-7L52WJ2E.js → chunk-MZNENVFY.js} +11 -3
  318. package/node_modules/@noodleseed/assistant/dist/{chunk-7L52WJ2E.js.map → chunk-MZNENVFY.js.map} +1 -1
  319. package/node_modules/@noodleseed/assistant/dist/{chunk-NPV64PUX.js → chunk-RIKRQFKS.js} +5 -1
  320. package/node_modules/@noodleseed/assistant/dist/{chunk-NPV64PUX.js.map → chunk-RIKRQFKS.js.map} +1 -1
  321. package/node_modules/@noodleseed/assistant/dist/{client-Ii_xTV09.d.ts → client-B6pnBmF8.d.ts} +1 -0
  322. package/node_modules/@noodleseed/assistant/dist/{client-401BAJqk.d.cts → client-BQ30Fq-c.d.cts} +1 -0
  323. package/node_modules/@noodleseed/assistant/dist/client.cjs +4 -0
  324. package/node_modules/@noodleseed/assistant/dist/client.cjs.map +1 -1
  325. package/node_modules/@noodleseed/assistant/dist/client.d.cts +1 -1
  326. package/node_modules/@noodleseed/assistant/dist/client.d.ts +1 -1
  327. package/node_modules/@noodleseed/assistant/dist/client.js +1 -1
  328. package/node_modules/@noodleseed/assistant/dist/embed.global.js +2 -2
  329. package/node_modules/@noodleseed/assistant/dist/index.cjs +13 -1
  330. package/node_modules/@noodleseed/assistant/dist/index.cjs.map +1 -1
  331. package/node_modules/@noodleseed/assistant/dist/index.d.cts +2 -2
  332. package/node_modules/@noodleseed/assistant/dist/index.d.ts +2 -2
  333. package/node_modules/@noodleseed/assistant/dist/index.js +2 -2
  334. package/node_modules/@noodleseed/assistant/dist/react/client.cjs +4 -0
  335. package/node_modules/@noodleseed/assistant/dist/react/client.cjs.map +1 -1
  336. package/node_modules/@noodleseed/assistant/dist/react/client.d.cts +1 -1
  337. package/node_modules/@noodleseed/assistant/dist/react/client.d.ts +1 -1
  338. package/node_modules/@noodleseed/assistant/dist/react/client.js +1 -1
  339. package/node_modules/@noodleseed/assistant/dist/react.cjs +13 -1
  340. package/node_modules/@noodleseed/assistant/dist/react.cjs.map +1 -1
  341. package/node_modules/@noodleseed/assistant/dist/react.d.cts +1 -1
  342. package/node_modules/@noodleseed/assistant/dist/react.d.ts +1 -1
  343. package/node_modules/@noodleseed/assistant/dist/react.js +2 -2
  344. package/node_modules/@noodleseed/assistant/package.json +2 -1
  345. package/package.json +5 -1
  346. package/node_modules/@noodle-borg/compiler/dist/widget-palette.d.ts.map +0 -1
  347. package/node_modules/@noodle-borg/compiler/dist/widget-palette.js.map +0 -1
  348. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts.map +0 -1
  349. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js.map +0 -1
  350. package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.d.ts +0 -7
  351. package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.d.ts.map +0 -1
  352. package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.js +0 -23
  353. package/node_modules/@noodle-borg/service/dist/feedback-operations/bootstrap.js.map +0 -1
  354. package/node_modules/@noodle-borg/service/dist/feedback-operations/config.d.ts +0 -12
  355. package/node_modules/@noodle-borg/service/dist/feedback-operations/config.d.ts.map +0 -1
  356. package/node_modules/@noodle-borg/service/dist/feedback-operations/config.js +0 -47
  357. package/node_modules/@noodle-borg/service/dist/feedback-operations/config.js.map +0 -1
  358. package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.d.ts +0 -24
  359. package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.d.ts.map +0 -1
  360. package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.js +0 -2
  361. package/node_modules/@noodle-borg/service/dist/feedback-operations/contracts.js.map +0 -1
  362. package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.d.ts +0 -29
  363. package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.d.ts.map +0 -1
  364. package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.js +0 -263
  365. package/node_modules/@noodle-borg/service/dist/feedback-operations/delivery-worker.js.map +0 -1
  366. package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.d.ts +0 -39
  367. package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.d.ts.map +0 -1
  368. package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.js +0 -142
  369. package/node_modules/@noodle-borg/service/dist/feedback-operations/linear-client.js.map +0 -1
  370. package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.d.ts +0 -33
  371. package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.d.ts.map +0 -1
  372. package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.js +0 -142
  373. package/node_modules/@noodle-borg/service/dist/feedback-operations/reporter-email.js.map +0 -1
  374. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.d.ts +0 -138
  375. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.d.ts.map +0 -1
  376. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.js +0 -199
  377. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-card.js.map +0 -1
  378. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.d.ts +0 -52
  379. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.d.ts.map +0 -1
  380. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.js +0 -103
  381. package/node_modules/@noodle-borg/service/dist/feedback-operations/slack-client.js.map +0 -1
  382. package/node_modules/@noodle-borg/service/dist/github/feedback-issues.d.ts +0 -44
  383. package/node_modules/@noodle-borg/service/dist/github/feedback-issues.d.ts.map +0 -1
  384. package/node_modules/@noodle-borg/service/dist/github/feedback-issues.js +0 -117
  385. package/node_modules/@noodle-borg/service/dist/github/feedback-issues.js.map +0 -1
  386. package/node_modules/@noodle-borg/service/dist/modules/loader.d.ts.map +0 -1
  387. package/node_modules/@noodle-borg/service/dist/modules/loader.js.map +0 -1
  388. package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.d.ts +0 -10
  389. package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.d.ts.map +0 -1
  390. package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.js +0 -54
  391. package/node_modules/@noodle-borg/service/dist/routes/feedback-operations-dispatch.js.map +0 -1
  392. package/node_modules/@noodle-borg/service/dist/routes/feedback.d.ts +0 -30
  393. package/node_modules/@noodle-borg/service/dist/routes/feedback.d.ts.map +0 -1
  394. package/node_modules/@noodle-borg/service/dist/routes/feedback.js +0 -233
  395. package/node_modules/@noodle-borg/service/dist/routes/feedback.js.map +0 -1
  396. package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.d.ts +0 -17
  397. package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.d.ts.map +0 -1
  398. package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.js +0 -141
  399. package/node_modules/@noodle-borg/service/dist/routes/linear-feedback-webhook.js.map +0 -1
  400. package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.d.ts +0 -15
  401. package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.d.ts.map +0 -1
  402. package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.js +0 -135
  403. package/node_modules/@noodle-borg/service/dist/routes/slack-feedback-actions.js.map +0 -1
  404. package/node_modules/@noodle-borg/service/dist/store/feedback-operations.d.ts +0 -188
  405. package/node_modules/@noodle-borg/service/dist/store/feedback-operations.d.ts.map +0 -1
  406. package/node_modules/@noodle-borg/service/dist/store/feedback-operations.js +0 -489
  407. package/node_modules/@noodle-borg/service/dist/store/feedback-operations.js.map +0 -1
  408. package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.d.ts +0 -35
  409. package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.d.ts.map +0 -1
  410. package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.js +0 -172
  411. package/node_modules/@noodle-borg/service/dist/store/postgres-feedback-operations.js.map +0 -1
  412. /package/node_modules/@noodle-borg/{service/dist/modules → service-modules/dist}/loader.js +0 -0
  413. /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.d.ts +0 -0
  414. /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.d.ts.map +0 -0
  415. /package/node_modules/@noodle-borg/{compiler → uri-template}/dist/uri-template.js +0 -0
  416. /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