@noodleseed/one 0.169.0 → 0.171.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 (189) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/capabilities.d.ts +19 -0
  5. package/dist/commands/capabilities.d.ts.map +1 -0
  6. package/dist/commands/capabilities.js +128 -0
  7. package/dist/commands/capabilities.js.map +1 -0
  8. package/dist/commands/catalog.d.ts.map +1 -1
  9. package/dist/commands/catalog.js +2 -1
  10. package/dist/commands/catalog.js.map +1 -1
  11. package/dist/commands/whatsapp-ops.d.ts +13 -0
  12. package/dist/commands/whatsapp-ops.d.ts.map +1 -0
  13. package/dist/commands/whatsapp-ops.js +244 -0
  14. package/dist/commands/whatsapp-ops.js.map +1 -0
  15. package/dist/commands/whatsapp-output.d.ts +3 -0
  16. package/dist/commands/whatsapp-output.d.ts.map +1 -0
  17. package/dist/commands/whatsapp-output.js +70 -0
  18. package/dist/commands/whatsapp-output.js.map +1 -0
  19. package/dist/dev.js +2 -0
  20. package/dist/dev.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/plugin-mode/plugin-operation-contract.d.ts +3 -3
  26. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +8 -0
  27. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +1 -0
  28. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +2 -2
  29. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +5 -0
  30. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
  31. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +6 -0
  32. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  33. package/node_modules/@noodle-borg/app-audit/dist/audit-embedded-assistant.js +2 -0
  34. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +2 -1
  35. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.d.ts +1 -0
  36. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.js +4 -1
  37. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-model-context.js +9 -4
  38. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-turn-context.d.ts +16 -0
  39. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-turn-context.js +19 -0
  40. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-coordinator.d.ts +145 -0
  41. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-coordinator.js +378 -0
  42. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-inbox.js +160 -0
  43. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-provider-blocks.d.ts +18 -0
  44. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-provider-blocks.js +69 -0
  45. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-spend.js +82 -0
  46. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-store.d.ts +42 -0
  47. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-store.js +76 -0
  48. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-types.d.ts +134 -0
  49. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-types.js +72 -0
  50. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-work.d.ts +20 -0
  51. package/node_modules/@noodle-borg/assistant-gateway/dist/channel-work.js +221 -0
  52. package/node_modules/@noodle-borg/assistant-gateway/dist/messaging-tool-dispatch.d.ts +15 -0
  53. package/node_modules/@noodle-borg/assistant-gateway/dist/messaging-tool-dispatch.js +34 -0
  54. package/node_modules/@noodle-borg/assistant-gateway/dist/model-request.d.ts +19 -1
  55. package/node_modules/@noodle-borg/assistant-gateway/dist/model-request.js +22 -6
  56. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +7 -0
  57. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +7 -0
  58. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-appearance-store.js +83 -0
  59. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-elevation.js +151 -0
  60. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-interaction-writes.js +45 -0
  61. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-interactions.js +340 -0
  62. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.js +439 -0
  63. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-channel-store.js +102 -0
  64. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-continuity-store.js +159 -0
  65. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-elevation-store.js +110 -0
  66. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-embed-store.js +134 -0
  67. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres.js +11 -0
  68. package/node_modules/@noodle-borg/assistant-gateway/dist/public-surface.d.ts +8 -0
  69. package/node_modules/@noodle-borg/assistant-gateway/dist/public-surface.js +23 -0
  70. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +19 -4
  71. package/node_modules/@noodle-borg/authoring/dist/assistant.js +51 -20
  72. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
  73. package/node_modules/@noodle-borg/authoring/dist/index.js +2 -1
  74. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  75. package/node_modules/@noodle-borg/authoring/dist/recording.d.ts +2 -1
  76. package/node_modules/@noodle-borg/authoring/dist/recording.js +29 -1
  77. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
  78. package/node_modules/@noodle-borg/authoring/dist/server.js +5 -1
  79. package/node_modules/@noodle-borg/authoring/dist/web-capabilities.d.ts +17 -0
  80. package/node_modules/@noodle-borg/authoring/dist/web-capabilities.js +15 -0
  81. package/node_modules/@noodle-borg/authoring/package.json +1 -0
  82. package/node_modules/@noodle-borg/capabilities/dist/index.js +7 -0
  83. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-channels.js +121 -0
  84. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +102 -0
  85. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +1 -0
  86. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +3 -0
  87. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +1 -1
  88. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +2 -0
  89. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +2 -1
  90. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +2 -1
  91. package/node_modules/@noodle-borg/compiler/dist/compile.js +2 -0
  92. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  93. package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js +18 -3
  94. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +106 -12
  95. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +60 -29
  96. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts +1 -0
  97. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js +19 -0
  98. package/node_modules/@noodle-borg/compiler/dist/web-capabilities.js +55 -0
  99. package/node_modules/@noodle-borg/compiler/package.json +1 -0
  100. package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +5 -0
  101. package/node_modules/@noodle-borg/knowledge-crawl/dist/bounded-body.js +38 -0
  102. package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js +2 -3
  103. package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js +10 -2
  104. package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts +1 -0
  105. package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js +1 -0
  106. package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.d.ts +26 -0
  107. package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.js +127 -0
  108. package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js +48 -23
  109. package/node_modules/@noodle-borg/knowledge-crawl/package.json +1 -0
  110. package/node_modules/@noodle-borg/managed-capabilities/dist/budget.d.ts +29 -0
  111. package/node_modules/@noodle-borg/managed-capabilities/dist/budget.js +124 -0
  112. package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.d.ts +212 -0
  113. package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.js +113 -0
  114. package/node_modules/@noodle-borg/managed-capabilities/dist/errors.d.ts +8 -0
  115. package/node_modules/@noodle-borg/managed-capabilities/dist/errors.js +21 -0
  116. package/node_modules/@noodle-borg/managed-capabilities/dist/executor.d.ts +26 -0
  117. package/node_modules/@noodle-borg/managed-capabilities/dist/executor.js +156 -0
  118. package/node_modules/@noodle-borg/managed-capabilities/dist/limits.d.ts +15 -0
  119. package/node_modules/@noodle-borg/managed-capabilities/dist/limits.js +15 -0
  120. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.d.ts +159 -0
  121. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.js +69 -0
  122. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.d.ts +5 -0
  123. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.js +160 -0
  124. package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.d.ts +34 -0
  125. package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.js +61 -0
  126. package/node_modules/@noodle-borg/managed-capabilities/dist/portable.d.ts +10 -0
  127. package/node_modules/@noodle-borg/managed-capabilities/dist/portable.js +10 -0
  128. package/node_modules/@noodle-borg/managed-capabilities/dist/service.d.ts +83 -0
  129. package/node_modules/@noodle-borg/managed-capabilities/dist/service.js +139 -0
  130. package/node_modules/@noodle-borg/managed-capabilities/dist/urls.d.ts +3 -0
  131. package/node_modules/@noodle-borg/managed-capabilities/dist/urls.js +30 -0
  132. package/node_modules/@noodle-borg/managed-capabilities/package.json +49 -0
  133. package/node_modules/@noodle-borg/module/dist/contract.d.ts +11 -0
  134. package/node_modules/@noodle-borg/module-audit/dist/index.js +37 -0
  135. package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.js +126 -0
  136. package/node_modules/@noodle-borg/module-audit/dist/route.js +66 -0
  137. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +29 -0
  138. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +2 -0
  139. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +3 -0
  140. package/node_modules/@noodle-borg/runtime/dist/execute.js +6 -1
  141. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -1
  142. package/node_modules/@noodle-borg/runtime/dist/index.js +2 -1
  143. package/node_modules/@noodle-borg/runtime/dist/interactive.js +10 -1
  144. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +8 -4
  145. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +3 -0
  146. package/node_modules/@noodle-borg/runtime/dist/postgres-state-handles.js +311 -0
  147. package/node_modules/@noodle-borg/runtime/dist/postgres.js +4 -0
  148. package/node_modules/@noodle-borg/runtime/dist/result-meta.d.ts +2 -0
  149. package/node_modules/@noodle-borg/runtime/dist/result-meta.js +6 -0
  150. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +4 -0
  151. package/node_modules/@noodle-borg/runtime/dist/web-capabilities.d.ts +71 -0
  152. package/node_modules/@noodle-borg/runtime/dist/web-capabilities.js +41 -0
  153. package/node_modules/@noodle-borg/runtime/package.json +1 -0
  154. package/node_modules/@noodle-borg/service/dist/assistant-composition.js +18 -0
  155. package/node_modules/@noodle-borg/service/dist/build-info.js +5 -2
  156. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +7 -0
  157. package/node_modules/@noodle-borg/service/dist/channels/360dialog.js +233 -0
  158. package/node_modules/@noodle-borg/service/dist/channels/cipher.js +37 -0
  159. package/node_modules/@noodle-borg/service/dist/channels/composition.js +37 -0
  160. package/node_modules/@noodle-borg/service/dist/channels/inference-guard.js +53 -0
  161. package/node_modules/@noodle-borg/service/dist/channels/runtime.js +337 -0
  162. package/node_modules/@noodle-borg/service/dist/channels/worker-loop.js +50 -0
  163. package/node_modules/@noodle-borg/service/dist/local-options.d.ts +1 -0
  164. package/node_modules/@noodle-borg/service/dist/local-web-capabilities.js +13 -0
  165. package/node_modules/@noodle-borg/service/dist/mcp-protocol-runtime.js +21 -0
  166. package/node_modules/@noodle-borg/service/dist/modules/route-dispatch.js +13 -0
  167. package/node_modules/@noodle-borg/service/dist/registry-compile.js +3 -0
  168. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +1 -0
  169. package/node_modules/@noodle-borg/service/dist/registry.js +3 -0
  170. package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +66 -35
  171. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +7 -4
  172. package/node_modules/@noodle-borg/service/dist/routes/assistant-model-binding.js +6 -2
  173. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +14 -1
  174. package/node_modules/@noodle-borg/service/dist/routes/whatsapp.js +238 -0
  175. package/node_modules/@noodle-borg/service/dist/serve-local.js +14 -0
  176. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js +10 -0
  177. package/node_modules/@noodle-borg/service/dist/service.js +37 -33
  178. package/node_modules/@noodle-borg/service/dist/web-capabilities.js +39 -0
  179. package/node_modules/@noodle-borg/service/package.json +3 -1
  180. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +33 -0
  181. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +9 -0
  182. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +2 -0
  183. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +2 -0
  184. package/node_modules/@noodle-borg/wire-contracts/dist/service-info.d.ts +2 -0
  185. package/node_modules/@noodle-borg/wire-contracts/dist/service-info.js +10 -2
  186. package/node_modules/@noodle-borg/wire-contracts/dist/whatsapp.d.ts +426 -0
  187. package/node_modules/@noodle-borg/wire-contracts/dist/whatsapp.js +213 -0
  188. package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
  189. package/package.json +3 -2
@@ -358,10 +358,25 @@ export declare const manifestV1Schema: z.ZodObject<{
358
358
  kind: z.ZodLiteral<"noodle-managed">;
359
359
  }, z.core.$strict>]>;
360
360
  allowedOrigins: z.ZodArray<z.ZodString>;
361
- surfaces: z.ZodOptional<z.ZodArray<z.ZodObject<{
361
+ surfaces: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
362
+ kind: z.ZodLiteral<"messaging">;
363
+ channel: z.ZodLiteral<"whatsapp">;
364
+ mode: z.ZodLiteral<"public">;
365
+ capabilities: z.ZodArray<z.ZodObject<{
366
+ kind: z.ZodEnum<{
367
+ tool: "tool";
368
+ resource: "resource";
369
+ prompt: "prompt";
370
+ knowledge: "knowledge";
371
+ }>;
372
+ name: z.ZodString;
373
+ }, z.core.$strict>>;
374
+ instructions: z.ZodOptional<z.ZodString>;
375
+ }, z.core.$strict>, z.ZodObject<{
376
+ kind: z.ZodOptional<z.ZodLiteral<"website">>;
362
377
  mode: z.ZodEnum<{
363
- authenticated: "authenticated";
364
378
  public: "public";
379
+ authenticated: "authenticated";
365
380
  mixed: "mixed";
366
381
  }>;
367
382
  origins: z.ZodArray<z.ZodString>;
@@ -386,7 +401,7 @@ export declare const manifestV1Schema: z.ZodObject<{
386
401
  windowSeconds: z.ZodOptional<z.ZodNumber>;
387
402
  maxRestores: z.ZodOptional<z.ZodNumber>;
388
403
  }, z.core.$strict>>;
389
- }, z.core.$strict>>>;
404
+ }, z.core.$strict>]>>>;
390
405
  sessionClaims: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
391
406
  exposeToModel: z.ZodOptional<z.ZodBoolean>;
392
407
  }, z.core.$strict>>>;
@@ -847,10 +862,25 @@ export declare const manifestV2Schema: z.ZodObject<{
847
862
  kind: z.ZodLiteral<"noodle-managed">;
848
863
  }, z.core.$strict>]>;
849
864
  allowedOrigins: z.ZodArray<z.ZodString>;
850
- surfaces: z.ZodOptional<z.ZodArray<z.ZodObject<{
865
+ surfaces: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
866
+ kind: z.ZodLiteral<"messaging">;
867
+ channel: z.ZodLiteral<"whatsapp">;
868
+ mode: z.ZodLiteral<"public">;
869
+ capabilities: z.ZodArray<z.ZodObject<{
870
+ kind: z.ZodEnum<{
871
+ tool: "tool";
872
+ resource: "resource";
873
+ prompt: "prompt";
874
+ knowledge: "knowledge";
875
+ }>;
876
+ name: z.ZodString;
877
+ }, z.core.$strict>>;
878
+ instructions: z.ZodOptional<z.ZodString>;
879
+ }, z.core.$strict>, z.ZodObject<{
880
+ kind: z.ZodOptional<z.ZodLiteral<"website">>;
851
881
  mode: z.ZodEnum<{
852
- authenticated: "authenticated";
853
882
  public: "public";
883
+ authenticated: "authenticated";
854
884
  mixed: "mixed";
855
885
  }>;
856
886
  origins: z.ZodArray<z.ZodString>;
@@ -875,7 +905,7 @@ export declare const manifestV2Schema: z.ZodObject<{
875
905
  windowSeconds: z.ZodOptional<z.ZodNumber>;
876
906
  maxRestores: z.ZodOptional<z.ZodNumber>;
877
907
  }, z.core.$strict>>;
878
- }, z.core.$strict>>>;
908
+ }, z.core.$strict>]>>>;
879
909
  sessionClaims: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
880
910
  exposeToModel: z.ZodOptional<z.ZodBoolean>;
881
911
  }, z.core.$strict>>>;
@@ -1133,6 +1163,23 @@ export declare const manifestV2Schema: z.ZodObject<{
1133
1163
  }, z.core.$strict>>;
1134
1164
  }, z.core.$strict>>;
1135
1165
  }, z.core.$strict>>>;
1166
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodObject<{
1167
+ name: z.ZodString;
1168
+ class: z.ZodLiteral<"web.extract.v1">;
1169
+ title: z.ZodString;
1170
+ description: z.ZodString;
1171
+ provider: z.ZodObject<{
1172
+ kind: z.ZodLiteral<"noodle-managed">;
1173
+ }, z.core.$strict>;
1174
+ policy: z.ZodOptional<z.ZodObject<{
1175
+ maxUrls: z.ZodOptional<z.ZodNumber>;
1176
+ maxCalls: z.ZodOptional<z.ZodNumber>;
1177
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
1178
+ maxTextBytes: z.ZodOptional<z.ZodNumber>;
1179
+ domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
1180
+ }, z.core.$strict>>;
1181
+ authorization: z.ZodOptional<z.ZodType<ToolAuthorizationManifest, unknown, z.core.$ZodTypeInternals<ToolAuthorizationManifest, unknown>>>;
1182
+ }, z.core.$strict>>>;
1136
1183
  collections: z.ZodOptional<z.ZodArray<z.ZodObject<{
1137
1184
  management: z.ZodOptional<z.ZodObject<{
1138
1185
  assignment: z.ZodOptional<z.ZodLiteral<true>>;
@@ -1585,10 +1632,25 @@ export declare const manifestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1585
1632
  kind: z.ZodLiteral<"noodle-managed">;
1586
1633
  }, z.core.$strict>]>;
1587
1634
  allowedOrigins: z.ZodArray<z.ZodString>;
1588
- surfaces: z.ZodOptional<z.ZodArray<z.ZodObject<{
1635
+ surfaces: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
1636
+ kind: z.ZodLiteral<"messaging">;
1637
+ channel: z.ZodLiteral<"whatsapp">;
1638
+ mode: z.ZodLiteral<"public">;
1639
+ capabilities: z.ZodArray<z.ZodObject<{
1640
+ kind: z.ZodEnum<{
1641
+ tool: "tool";
1642
+ resource: "resource";
1643
+ prompt: "prompt";
1644
+ knowledge: "knowledge";
1645
+ }>;
1646
+ name: z.ZodString;
1647
+ }, z.core.$strict>>;
1648
+ instructions: z.ZodOptional<z.ZodString>;
1649
+ }, z.core.$strict>, z.ZodObject<{
1650
+ kind: z.ZodOptional<z.ZodLiteral<"website">>;
1589
1651
  mode: z.ZodEnum<{
1590
- authenticated: "authenticated";
1591
1652
  public: "public";
1653
+ authenticated: "authenticated";
1592
1654
  mixed: "mixed";
1593
1655
  }>;
1594
1656
  origins: z.ZodArray<z.ZodString>;
@@ -1613,7 +1675,7 @@ export declare const manifestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1613
1675
  windowSeconds: z.ZodOptional<z.ZodNumber>;
1614
1676
  maxRestores: z.ZodOptional<z.ZodNumber>;
1615
1677
  }, z.core.$strict>>;
1616
- }, z.core.$strict>>>;
1678
+ }, z.core.$strict>]>>>;
1617
1679
  sessionClaims: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1618
1680
  exposeToModel: z.ZodOptional<z.ZodBoolean>;
1619
1681
  }, z.core.$strict>>>;
@@ -2073,10 +2135,25 @@ export declare const manifestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
2073
2135
  kind: z.ZodLiteral<"noodle-managed">;
2074
2136
  }, z.core.$strict>]>;
2075
2137
  allowedOrigins: z.ZodArray<z.ZodString>;
2076
- surfaces: z.ZodOptional<z.ZodArray<z.ZodObject<{
2138
+ surfaces: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
2139
+ kind: z.ZodLiteral<"messaging">;
2140
+ channel: z.ZodLiteral<"whatsapp">;
2141
+ mode: z.ZodLiteral<"public">;
2142
+ capabilities: z.ZodArray<z.ZodObject<{
2143
+ kind: z.ZodEnum<{
2144
+ tool: "tool";
2145
+ resource: "resource";
2146
+ prompt: "prompt";
2147
+ knowledge: "knowledge";
2148
+ }>;
2149
+ name: z.ZodString;
2150
+ }, z.core.$strict>>;
2151
+ instructions: z.ZodOptional<z.ZodString>;
2152
+ }, z.core.$strict>, z.ZodObject<{
2153
+ kind: z.ZodOptional<z.ZodLiteral<"website">>;
2077
2154
  mode: z.ZodEnum<{
2078
- authenticated: "authenticated";
2079
2155
  public: "public";
2156
+ authenticated: "authenticated";
2080
2157
  mixed: "mixed";
2081
2158
  }>;
2082
2159
  origins: z.ZodArray<z.ZodString>;
@@ -2101,7 +2178,7 @@ export declare const manifestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
2101
2178
  windowSeconds: z.ZodOptional<z.ZodNumber>;
2102
2179
  maxRestores: z.ZodOptional<z.ZodNumber>;
2103
2180
  }, z.core.$strict>>;
2104
- }, z.core.$strict>>>;
2181
+ }, z.core.$strict>]>>>;
2105
2182
  sessionClaims: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
2106
2183
  exposeToModel: z.ZodOptional<z.ZodBoolean>;
2107
2184
  }, z.core.$strict>>>;
@@ -2359,6 +2436,23 @@ export declare const manifestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
2359
2436
  }, z.core.$strict>>;
2360
2437
  }, z.core.$strict>>;
2361
2438
  }, z.core.$strict>>>;
2439
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodObject<{
2440
+ name: z.ZodString;
2441
+ class: z.ZodLiteral<"web.extract.v1">;
2442
+ title: z.ZodString;
2443
+ description: z.ZodString;
2444
+ provider: z.ZodObject<{
2445
+ kind: z.ZodLiteral<"noodle-managed">;
2446
+ }, z.core.$strict>;
2447
+ policy: z.ZodOptional<z.ZodObject<{
2448
+ maxUrls: z.ZodOptional<z.ZodNumber>;
2449
+ maxCalls: z.ZodOptional<z.ZodNumber>;
2450
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
2451
+ maxTextBytes: z.ZodOptional<z.ZodNumber>;
2452
+ domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
2453
+ }, z.core.$strict>>;
2454
+ authorization: z.ZodOptional<z.ZodType<ToolAuthorizationManifest, unknown, z.core.$ZodTypeInternals<ToolAuthorizationManifest, unknown>>>;
2455
+ }, z.core.$strict>>>;
2362
2456
  collections: z.ZodOptional<z.ZodArray<z.ZodObject<{
2363
2457
  management: z.ZodOptional<z.ZodObject<{
2364
2458
  assignment: z.ZodOptional<z.ZodLiteral<true>>;
@@ -1,4 +1,5 @@
1
1
  import { knowledgeComponentManifestSchema } from '@noodle-borg/knowledge/portable';
2
+ import { webCapabilityBaseSchema } from '@noodle-borg/managed-capabilities';
2
3
  import { z } from 'zod';
3
4
  import { MAX_VARIABLE_DECLARATIONS, variableDeclarationManifestSchema, } from '../business-variables.js';
4
5
  import { MAX_MANAGED_COLLECTIONS, managedCollectionManifestSchema, } from '../managed-collections.js';
@@ -276,38 +277,50 @@ const embeddedAssistantSchema = z
276
277
  .strict(),
277
278
  z.object({ kind: z.literal('noodle-managed') }).strict(),
278
279
  ]),
279
- allowedOrigins: z.array(assistantOriginOrVariableSchema).min(1),
280
+ allowedOrigins: z.array(assistantOriginOrVariableSchema),
280
281
  // The front doors this assistant serves (ADR 0201, amended 2026-08-12). Absent means the pre-0201
281
282
  // authenticated shape, so released artifacts keep their meaning; `allowedOrigins` stays the union
282
283
  // and `sessionClaims` stays mirrored, so the service reads both unchanged. `capabilities` is the
283
284
  // exact reachable surface: optional when authenticated, required when public or mixed.
284
285
  surfaces: z
285
- .array(z
286
- .object({
287
- mode: z.enum(['authenticated', 'public', 'mixed']),
288
- origins: z.array(assistantOriginOrVariableSchema).min(1),
289
- instructions: z.string().trim().min(1).max(MAX_SERVER_INSTRUCTIONS).optional(),
290
- capabilities: z.array(assistantCapabilitySchema).optional(),
291
- sessionClaims: sessionClaimsSchema.optional(),
292
- // Overrides the assistant's own opt-in for sessions minted on this surface, in either
293
- // direction (ADR 0220, amended). Declared explicitly rather than inherited from
294
- // `assistantUiSchema.shape` — this is not renderer presentation, and a surface that
295
- // acquired it by a spread would be an accident rather than a decision.
296
- webmcp: optionalStrictObject({ enabled: z.boolean().optional() }),
297
- // Anonymous cross-page display continuity (ADR 0223, clauses 11-16), declared per public
298
- // or mixed surface. These bounds mirror the structural ceilings the gateway clamps to at
299
- // runtime; the ADR is the single source, and this package cannot import the gateway
300
- // because the dependency runs the other way. Refusing rather than clamping is deliberate:
301
- // the gateway narrows an operator's value silently by design, but a developer who asks
302
- // for more than the ceiling has made a mistake, and silence would hide it until someone
303
- // measured the live behaviour.
304
- continuity: optionalStrictObject({
305
- enabled: z.boolean().optional(),
306
- windowSeconds: z.number().int().min(0).max(600).optional(),
307
- maxRestores: z.number().int().min(0).max(10).optional(),
308
- }),
309
- })
310
- .strict())
286
+ .array(z.union([
287
+ z
288
+ .object({
289
+ kind: z.literal('messaging'),
290
+ channel: z.literal('whatsapp'),
291
+ mode: z.literal('public'),
292
+ capabilities: z.array(assistantCapabilitySchema),
293
+ instructions: z.string().trim().min(1).max(MAX_SERVER_INSTRUCTIONS).optional(),
294
+ })
295
+ .strict(),
296
+ z
297
+ .object({
298
+ kind: z.literal('website').optional(),
299
+ mode: z.enum(['authenticated', 'public', 'mixed']),
300
+ origins: z.array(assistantOriginOrVariableSchema).min(1),
301
+ instructions: z.string().trim().min(1).max(MAX_SERVER_INSTRUCTIONS).optional(),
302
+ capabilities: z.array(assistantCapabilitySchema).optional(),
303
+ sessionClaims: sessionClaimsSchema.optional(),
304
+ // Overrides the assistant's own opt-in for sessions minted on this surface, in either
305
+ // direction (ADR 0220, amended). Declared explicitly rather than inherited from
306
+ // `assistantUiSchema.shape` — this is not renderer presentation, and a surface that
307
+ // acquired it by a spread would be an accident rather than a decision.
308
+ webmcp: optionalStrictObject({ enabled: z.boolean().optional() }),
309
+ // Anonymous cross-page display continuity (ADR 0223, clauses 11-16), declared per public
310
+ // or mixed surface. These bounds mirror the structural ceilings the gateway clamps to at
311
+ // runtime; the ADR is the single source, and this package cannot import the gateway
312
+ // because the dependency runs the other way. Refusing rather than clamping is deliberate:
313
+ // the gateway narrows an operator's value silently by design, but a developer who asks
314
+ // for more than the ceiling has made a mistake, and silence would hide it until someone
315
+ // measured the live behaviour.
316
+ continuity: optionalStrictObject({
317
+ enabled: z.boolean().optional(),
318
+ windowSeconds: z.number().int().min(0).max(600).optional(),
319
+ maxRestores: z.number().int().min(0).max(10).optional(),
320
+ }),
321
+ })
322
+ .strict(),
323
+ ]))
311
324
  .min(1)
312
325
  .optional(),
313
326
  // Mirrored from the authenticated surface; the session exchange reads it here (ADR 0141,
@@ -322,7 +335,19 @@ const embeddedAssistantSchema = z
322
335
  })
323
336
  .strict()
324
337
  .superRefine((assistant, ctx) => {
338
+ const messaging = assistant.surfaces?.filter((surface) => surface.kind === 'messaging') ?? [];
339
+ if (messaging.length > 1)
340
+ ctx.addIssue({ code: 'custom', path: ['surfaces'], message: 'duplicate whatsapp surface' });
341
+ if (assistant.allowedOrigins.length === 0 && messaging.length === 0) {
342
+ ctx.addIssue({
343
+ code: 'custom',
344
+ path: ['allowedOrigins'],
345
+ message: 'a website assistant requires allowedOrigins',
346
+ });
347
+ }
325
348
  assistant.surfaces?.forEach((surface, index) => {
349
+ if (surface.kind === 'messaging')
350
+ return;
326
351
  // The authenticated direction already reattaches through ADR 0223 clause 7, authorized by a
327
352
  // backend-verified subject rather than by possession of a handle. A `continuity` block here
328
353
  // would be a developer believing they configured something nothing reads, so refuse it rather
@@ -433,6 +458,10 @@ const serverV2Schema = serverSchema.extend({
433
458
  agentGuide: agentGuideSchema.optional(),
434
459
  /** Customer-owned knowledge components (ADR 0202): Core v2 only. */
435
460
  knowledge: z.array(knowledgeComponentManifestSchema).optional(),
461
+ capabilities: z
462
+ .array(webCapabilityBaseSchema.extend({ authorization: toolAuthorizationSchema.optional() }))
463
+ .max(8)
464
+ .optional(),
436
465
  /** Managed business records: reusable schema intent only, never operator lifecycle state. */
437
466
  collections: z.array(managedCollectionManifestSchema).max(MAX_MANAGED_COLLECTIONS).optional(),
438
467
  });
@@ -657,11 +686,13 @@ export const manifestV2Schema = z
657
686
  // (ADR 0217): a knowledge-only server is valid, an empty server is not. v1 keeps its
658
687
  // authored-tool minimum — it has no server.knowledge to count.
659
688
  .superRefine((manifest, ctx) => {
660
- if (manifest.tools.length === 0 && (manifest.server.knowledge?.length ?? 0) === 0) {
689
+ if (manifest.tools.length === 0 &&
690
+ (manifest.server.knowledge?.length ?? 0) === 0 &&
691
+ (manifest.server.capabilities?.length ?? 0) === 0) {
661
692
  ctx.addIssue({
662
693
  code: 'custom',
663
694
  path: ['tools'],
664
- message: 'declare at least one tool or one server.knowledge component',
695
+ message: 'declare at least one tool, server.knowledge component or server.capabilities declaration',
665
696
  });
666
697
  }
667
698
  });
@@ -18,6 +18,7 @@ import type { CompileError } from '../errors.js';
18
18
  * ADR 0055's third class — a declared anonymous fallback — stays reserved, not produced.
19
19
  */
20
20
  interface AssistantSurfaceInput {
21
+ readonly kind?: 'website' | 'messaging' | undefined;
21
22
  readonly mode: 'authenticated' | 'public' | 'mixed';
22
23
  readonly capabilities?: readonly {
23
24
  readonly kind: string;
@@ -26,12 +26,31 @@ export function validateWebsiteProjection(assistant, surfaces) {
26
26
  });
27
27
  return;
28
28
  }
29
+ if (surface.kind === 'messaging' && !['tool', 'knowledge'].includes(capability.kind)) {
30
+ errors.push({
31
+ code: 'assistant_messaging_unsupported',
32
+ path: `server.assistant.surfaces[${surfaceIndex}].capabilities[${index}]`,
33
+ message: 'Messaging currently supports pure read tools and knowledge only',
34
+ });
35
+ return;
36
+ }
29
37
  if (surface.mode === 'authenticated' || capability.kind !== 'tool')
30
38
  return;
31
39
  const tool = toolsByName.get(capability.name);
32
40
  if (tool === undefined)
33
41
  return;
34
42
  const path = `tools.${tool.name}`;
43
+ if (surface.kind === 'messaging' &&
44
+ (tool.annotations?.readOnlyHint !== true ||
45
+ tool._meta?.ui !== undefined ||
46
+ tool.fulfilment.kind === 'operation' ||
47
+ tool.fulfilment.steps.some((step) => step.kind === 'operation'))) {
48
+ errors.push({
49
+ code: 'assistant_messaging_unsupported',
50
+ path,
51
+ message: `"${tool.name}" requires a write, connector, or UI renderer not enabled for this messaging slice`,
52
+ });
53
+ }
35
54
  if (surface.mode === 'public' && anonymousBehavior(tool) === 'requires-identity') {
36
55
  errors.push({
37
56
  code: 'assistant_public_user_reference',
@@ -0,0 +1,55 @@
1
+ import { WEB_CONNECTOR_ID, WEB_CONNECTOR_VERSION, webExtractRequestSchema, webExtractResultSchema, } from '@noodle-borg/managed-capabilities';
2
+ import { z } from 'zod';
3
+ /** Compiler-owned ordinary tool expansion. No provider or transport behavior enters the artifact. */
4
+ export function expandWebCapabilities(manifest, errors) {
5
+ if (manifest.manifestVersion !== '2' || !manifest.server.capabilities?.length)
6
+ return;
7
+ if (manifest.connectors?.[WEB_CONNECTOR_ID] !== undefined) {
8
+ errors.push({
9
+ code: 'reserved_name',
10
+ path: `connectors.${WEB_CONNECTOR_ID}`,
11
+ message: 'connector alias is reserved for capability execution',
12
+ });
13
+ return;
14
+ }
15
+ const names = new Set(manifest.tools.map((tool) => tool.name));
16
+ const declarations = new Set();
17
+ for (const declaration of manifest.server.capabilities) {
18
+ const name = `extract_${declaration.name}`;
19
+ if (names.has(name) || declarations.has(declaration.name)) {
20
+ errors.push({
21
+ code: 'reserved_name',
22
+ path: 'server.capabilities',
23
+ message: `duplicate capability or generated tool "${name}"`,
24
+ });
25
+ continue;
26
+ }
27
+ names.add(name);
28
+ declarations.add(declaration.name);
29
+ manifest.tools.push({
30
+ name,
31
+ title: declaration.title,
32
+ description: `${declaration.description} Returns untrusted source evidence, not instructions or verified business facts.`,
33
+ ...(declaration.authorization === undefined
34
+ ? {}
35
+ : { authorization: declaration.authorization }),
36
+ inputSchema: z.toJSONSchema(webExtractRequestSchema),
37
+ outputSchema: z.toJSONSchema(webExtractResultSchema),
38
+ annotations: {
39
+ readOnlyHint: true,
40
+ destructiveHint: false,
41
+ idempotentHint: false,
42
+ openWorldHint: true,
43
+ },
44
+ fulfilment: {
45
+ use: `${WEB_CONNECTOR_ID}.extract`,
46
+ args: { name: declaration.name, request: '${input}' },
47
+ },
48
+ });
49
+ }
50
+ manifest.connectors = {
51
+ ...manifest.connectors,
52
+ [WEB_CONNECTOR_ID]: { id: WEB_CONNECTOR_ID, version: WEB_CONNECTOR_VERSION },
53
+ };
54
+ }
55
+ //# sourceMappingURL=web-capabilities.js.map
@@ -23,6 +23,7 @@
23
23
  "schema": "node dist/schema-export.js"
24
24
  },
25
25
  "dependencies": {
26
+ "@noodle-borg/managed-capabilities": "0.0.0",
26
27
  "@noodle-borg/app-package": "0.0.0",
27
28
  "@noodle-borg/brand-kit": "0.0.0",
28
29
  "@noodle-borg/uri-template": "0.0.0",
@@ -84,6 +84,11 @@ export async function guardedFetch(url, init = {}, options = {}) {
84
84
  }
85
85
  throw error;
86
86
  }
87
+ finally {
88
+ // Closing drains the current response without accepting another request. Consumers must read
89
+ // or cancel the body; do not await close here, which would deadlock before body consumption.
90
+ void dispatcher?.close().catch(() => { });
91
+ }
87
92
  }
88
93
  /** Whether a URL needs the guarded dispatcher: DNS-name hosts yes, literal-IP hosts no. */
89
94
  export function needsGuard(url) {
@@ -0,0 +1,38 @@
1
+ /** Read decoded response bytes with bounded memory, cancellation and body cleanup on every path. */
2
+ export async function readBoundedBody(response, maxBytes, signal) {
3
+ const reader = response.body?.getReader();
4
+ if (reader === undefined)
5
+ return new ArrayBuffer(0);
6
+ const chunks = [];
7
+ let size = 0;
8
+ const cancel = () => {
9
+ void reader.cancel().catch(() => { });
10
+ };
11
+ signal?.addEventListener('abort', cancel, { once: true });
12
+ try {
13
+ for (;;) {
14
+ signal?.throwIfAborted();
15
+ const next = await reader.read();
16
+ signal?.throwIfAborted();
17
+ if (next.done)
18
+ break;
19
+ size += next.value.byteLength;
20
+ if (size > maxBytes)
21
+ throw new Error('response_size_exceeded');
22
+ chunks.push(next.value);
23
+ }
24
+ const result = new Uint8Array(size);
25
+ let offset = 0;
26
+ for (const chunk of chunks) {
27
+ result.set(chunk, offset);
28
+ offset += chunk.byteLength;
29
+ }
30
+ return result.buffer;
31
+ }
32
+ finally {
33
+ signal?.removeEventListener('abort', cancel);
34
+ await reader.cancel().catch(() => { });
35
+ reader.releaseLock();
36
+ }
37
+ }
38
+ //# sourceMappingURL=bounded-body.js.map
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { guardedFetch } from '@noodle-borg/connector-http';
12
12
  import { pathMatches } from '@noodle-borg/knowledge/portable';
13
+ import { readBoundedBody } from './bounded-body.js';
13
14
  import { extractPageContent } from './html-text.js';
14
15
  import { parseOrigin, safeUrl } from './origin.js';
15
16
  import { parseRobots } from './robots.js';
@@ -95,9 +96,7 @@ export class FirstPartySiteFetcher {
95
96
  const response = await this.#fetch(url, { redirect: 'manual' });
96
97
  if (response.status !== 200)
97
98
  return undefined;
98
- const bytes = await response.arrayBuffer();
99
- if (bytes.byteLength > maxPageBytes)
100
- return undefined;
99
+ const bytes = await readBoundedBody(response, maxPageBytes);
101
100
  return extractPageContent(response.headers.get('content-type') ?? '', bytes);
102
101
  }
103
102
  catch {
@@ -23,10 +23,18 @@ const NAMED_ENTITIES = {
23
23
  };
24
24
  function decodeEntities(text) {
25
25
  return text
26
- .replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCodePoint(Number.parseInt(hex, 16)))
27
- .replace(/&#(\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))
26
+ .replace(/&#x([0-9a-f]+);/gi, (_, hex) => safeCodePoint(Number.parseInt(hex, 16)))
27
+ .replace(/&#(\d+);/g, (_, dec) => safeCodePoint(Number.parseInt(dec, 10)))
28
28
  .replace(/&([a-z]+);/gi, (match, name) => NAMED_ENTITIES[name.toLowerCase()] ?? match);
29
29
  }
30
+ function safeCodePoint(value) {
31
+ return Number.isSafeInteger(value) &&
32
+ value > 0 &&
33
+ value <= 0x10ffff &&
34
+ !(value >= 0xd800 && value <= 0xdfff)
35
+ ? String.fromCodePoint(value)
36
+ : '\uFFFD';
37
+ }
30
38
  export function extractHtmlText(html) {
31
39
  const withoutBlocks = html.replace(NON_CONTENT_BLOCKS, ' ');
32
40
  const withBreaks = withoutBlocks.replace(BLOCK_BREAK, ' ');
@@ -1,5 +1,6 @@
1
1
  export { FirecrawlSiteFetcher, type FirecrawlSiteFetcherOptions } from './firecrawl.js';
2
2
  export { FirstPartySiteFetcher, type FirstPartySiteFetcherOptions } from './first-party.js';
3
+ export { type PageReadRequest, PublicPageReader, type ReadPublicPage } from './page-reader.js';
3
4
  export type { CrawlPage, SiteCrawlRequest, SiteFetcher } from './ports.js';
4
5
  export { TavilySiteFetcher, type TavilySiteFetcherOptions } from './tavily.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,5 @@
1
1
  export { FirecrawlSiteFetcher } from './firecrawl.js';
2
2
  export { FirstPartySiteFetcher } from './first-party.js';
3
+ export { PublicPageReader } from './page-reader.js';
3
4
  export { TavilySiteFetcher } from './tavily.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,26 @@
1
+ export interface PageReadRequest {
2
+ readonly url: string;
3
+ readonly domains?: readonly string[];
4
+ readonly signal: AbortSignal;
5
+ readonly beforeRequest: () => void;
6
+ readonly maxBytes: number;
7
+ }
8
+ export interface ReadPublicPage {
9
+ readonly url: string;
10
+ readonly title: string;
11
+ readonly text: string;
12
+ readonly links: readonly {
13
+ readonly url: string;
14
+ readonly label?: string;
15
+ }[];
16
+ readonly retrievedAt: string;
17
+ }
18
+ /** Single-page acquisition, not a crawler. All transport collaborators are deployment-owned. */
19
+ export declare class PublicPageReader {
20
+ #private;
21
+ constructor(options?: {
22
+ readonly fetchImpl?: typeof fetch;
23
+ });
24
+ read(request: PageReadRequest): Promise<ReadPublicPage>;
25
+ }
26
+ //# sourceMappingURL=page-reader.d.ts.map