@noodleseed/one 0.168.0 → 0.170.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 (142) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -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/deployment-delete-ops.d.ts +12 -0
  9. package/dist/commands/deployment-delete-ops.d.ts.map +1 -0
  10. package/dist/commands/deployment-delete-ops.js +230 -0
  11. package/dist/commands/deployment-delete-ops.js.map +1 -0
  12. package/dist/commands/deployment-delete-recovery.d.ts +35 -0
  13. package/dist/commands/deployment-delete-recovery.d.ts.map +1 -0
  14. package/dist/commands/deployment-delete-recovery.js +99 -0
  15. package/dist/commands/deployment-delete-recovery.js.map +1 -0
  16. package/dist/commands/deployments-ops.d.ts +2 -1
  17. package/dist/commands/deployments-ops.d.ts.map +1 -1
  18. package/dist/commands/deployments-ops.js +5 -1
  19. package/dist/commands/deployments-ops.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/plugin-mode/plugin-operation-contract.d.ts +2 -2
  25. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  26. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
  27. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +2 -0
  28. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
  29. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  30. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.d.ts +1 -0
  31. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.js +4 -1
  32. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +2 -2
  33. package/node_modules/@noodle-borg/authoring/dist/assistant.js +3 -1
  34. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -0
  35. package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
  36. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  37. package/node_modules/@noodle-borg/authoring/dist/recording.d.ts +2 -1
  38. package/node_modules/@noodle-borg/authoring/dist/recording.js +29 -1
  39. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
  40. package/node_modules/@noodle-borg/authoring/dist/server.js +5 -1
  41. package/node_modules/@noodle-borg/authoring/dist/web-capabilities.d.ts +17 -0
  42. package/node_modules/@noodle-borg/authoring/dist/web-capabilities.js +15 -0
  43. package/node_modules/@noodle-borg/authoring/package.json +1 -0
  44. package/node_modules/@noodle-borg/capabilities/dist/index.js +7 -0
  45. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +102 -0
  46. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +27 -1
  47. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +3 -0
  48. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +2 -0
  49. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +2 -1
  50. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +2 -1
  51. package/node_modules/@noodle-borg/compiler/dist/compile.js +2 -0
  52. package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js +18 -3
  53. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +34 -0
  54. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +9 -2
  55. package/node_modules/@noodle-borg/compiler/dist/web-capabilities.js +55 -0
  56. package/node_modules/@noodle-borg/compiler/package.json +1 -0
  57. package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +5 -0
  58. package/node_modules/@noodle-borg/control-plane/dist/delete-deployment.d.ts +44 -0
  59. package/node_modules/@noodle-borg/control-plane/dist/delete-deployment.js +105 -0
  60. package/node_modules/@noodle-borg/control-plane/dist/deployment-deletion-contracts.d.ts +20 -0
  61. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +2 -0
  62. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  63. package/node_modules/@noodle-borg/knowledge-crawl/dist/bounded-body.js +38 -0
  64. package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js +2 -3
  65. package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js +10 -2
  66. package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts +1 -0
  67. package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js +1 -0
  68. package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.d.ts +26 -0
  69. package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.js +127 -0
  70. package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js +48 -23
  71. package/node_modules/@noodle-borg/knowledge-crawl/package.json +1 -0
  72. package/node_modules/@noodle-borg/managed-capabilities/dist/budget.d.ts +29 -0
  73. package/node_modules/@noodle-borg/managed-capabilities/dist/budget.js +124 -0
  74. package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.d.ts +212 -0
  75. package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.js +113 -0
  76. package/node_modules/@noodle-borg/managed-capabilities/dist/errors.d.ts +8 -0
  77. package/node_modules/@noodle-borg/managed-capabilities/dist/errors.js +21 -0
  78. package/node_modules/@noodle-borg/managed-capabilities/dist/executor.d.ts +26 -0
  79. package/node_modules/@noodle-borg/managed-capabilities/dist/executor.js +156 -0
  80. package/node_modules/@noodle-borg/managed-capabilities/dist/limits.d.ts +15 -0
  81. package/node_modules/@noodle-borg/managed-capabilities/dist/limits.js +15 -0
  82. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.d.ts +159 -0
  83. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.js +69 -0
  84. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.d.ts +5 -0
  85. package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.js +160 -0
  86. package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.d.ts +34 -0
  87. package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.js +61 -0
  88. package/node_modules/@noodle-borg/managed-capabilities/dist/portable.d.ts +10 -0
  89. package/node_modules/@noodle-borg/managed-capabilities/dist/portable.js +10 -0
  90. package/node_modules/@noodle-borg/managed-capabilities/dist/service.d.ts +83 -0
  91. package/node_modules/@noodle-borg/managed-capabilities/dist/service.js +139 -0
  92. package/node_modules/@noodle-borg/managed-capabilities/dist/urls.d.ts +3 -0
  93. package/node_modules/@noodle-borg/managed-capabilities/dist/urls.js +30 -0
  94. package/node_modules/@noodle-borg/managed-capabilities/package.json +49 -0
  95. package/node_modules/@noodle-borg/module/dist/contract.d.ts +11 -0
  96. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +29 -0
  97. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +2 -0
  98. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +3 -0
  99. package/node_modules/@noodle-borg/runtime/dist/execute.js +6 -1
  100. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -1
  101. package/node_modules/@noodle-borg/runtime/dist/index.js +2 -1
  102. package/node_modules/@noodle-borg/runtime/dist/interactive.js +10 -1
  103. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +3 -0
  104. package/node_modules/@noodle-borg/runtime/dist/result-meta.d.ts +2 -0
  105. package/node_modules/@noodle-borg/runtime/dist/result-meta.js +6 -0
  106. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +4 -0
  107. package/node_modules/@noodle-borg/runtime/dist/web-capabilities.d.ts +71 -0
  108. package/node_modules/@noodle-borg/runtime/dist/web-capabilities.js +41 -0
  109. package/node_modules/@noodle-borg/runtime/package.json +1 -0
  110. package/node_modules/@noodle-borg/service/dist/deployment-deletion.js +40 -0
  111. package/node_modules/@noodle-borg/service/dist/local-options.d.ts +1 -0
  112. package/node_modules/@noodle-borg/service/dist/local-web-capabilities.js +13 -0
  113. package/node_modules/@noodle-borg/service/dist/mcp-protocol-runtime.js +21 -0
  114. package/node_modules/@noodle-borg/service/dist/modules/route-dispatch.js +13 -0
  115. package/node_modules/@noodle-borg/service/dist/registry-compile.js +9 -0
  116. package/node_modules/@noodle-borg/service/dist/registry-deletion.js +75 -0
  117. package/node_modules/@noodle-borg/service/dist/registry-state.js +4 -2
  118. package/node_modules/@noodle-borg/service/dist/registry-targets.js +4 -0
  119. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +1 -0
  120. package/node_modules/@noodle-borg/service/dist/registry.d.ts +2 -0
  121. package/node_modules/@noodle-borg/service/dist/registry.js +10 -23
  122. package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +5 -2
  123. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +7 -4
  124. package/node_modules/@noodle-borg/service/dist/routes/deploy-dispatch.js +15 -1
  125. package/node_modules/@noodle-borg/service/dist/routes/deployment-delete.js +53 -0
  126. package/node_modules/@noodle-borg/service/dist/serve-local.js +14 -0
  127. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js +10 -0
  128. package/node_modules/@noodle-borg/service/dist/service.js +7 -1
  129. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +2 -1
  130. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +8 -0
  131. package/node_modules/@noodle-borg/service/dist/store/json-file-deletion.js +64 -0
  132. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +2 -1
  133. package/node_modules/@noodle-borg/service/dist/store/json-file.js +23 -5
  134. package/node_modules/@noodle-borg/service/dist/store.d.ts +5 -1
  135. package/node_modules/@noodle-borg/service/dist/web-capabilities.js +39 -0
  136. package/node_modules/@noodle-borg/service/package.json +3 -1
  137. package/node_modules/@noodle-borg/wire-contracts/dist/deployment-deletion.d.ts +29 -0
  138. package/node_modules/@noodle-borg/wire-contracts/dist/deployment-deletion.js +33 -0
  139. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +2 -0
  140. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +2 -0
  141. package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
  142. package/package.json +3 -2
@@ -0,0 +1,99 @@
1
+ import { ServiceRequestError } from '../control-plane.js';
2
+ import { EXIT } from './output.js';
3
+ import { serviceFailure } from './shared.js';
4
+ export function deleteEvidenceMismatch(response, expected) {
5
+ const matches = expected.kind === 'deployment'
6
+ ? response.target.org === expected.org &&
7
+ response.deletedDeploymentIds.length === 1 &&
8
+ response.deletedDeploymentIds[0] === expected.deploymentId
9
+ : response.target.org === expected.target.org &&
10
+ response.target.app === expected.target.app &&
11
+ response.target.env === expected.target.env &&
12
+ sameIds(response.deletedDeploymentIds, expected.expectedDeploymentIds);
13
+ if (matches)
14
+ return undefined;
15
+ const next = expected.kind === 'deployment'
16
+ ? `noodle deployments list --org ${expected.org}`
17
+ : `noodle deployments list --org ${expected.target.org} --app ${expected.target.app} --env ${expected.target.env}`;
18
+ return {
19
+ code: 'deployment_delete_evidence_mismatch',
20
+ message: 'The service returned deletion evidence for a different target or deployment set.',
21
+ cause: 'The response did not match the exact deletion request. The mutation may already have completed.',
22
+ fix: 'Refresh deployment history and reconcile the current state before attempting any retry.',
23
+ next,
24
+ exitCode: EXIT.FAILURE,
25
+ };
26
+ }
27
+ function sameIds(actual, expected) {
28
+ if (actual.length !== expected.length)
29
+ return false;
30
+ const actualIds = new Set(actual);
31
+ return expected.every((deploymentId) => actualIds.has(deploymentId));
32
+ }
33
+ export function deleteServiceFailure(error, context) {
34
+ if (!(error instanceof ServiceRequestError) || error.code === undefined) {
35
+ return serviceFailure(`deployments ${context.action}`, error, context.action === 'delete'
36
+ ? `noodle deployments list --org ${context.org}`
37
+ : versionDeleteCommand(context, context.version, false));
38
+ }
39
+ const common = {
40
+ code: error.code,
41
+ message: error.message,
42
+ cause: error.message,
43
+ exitCode: error.status === 401 || error.status === 403 ? EXIT.AUTH : EXIT.FAILURE,
44
+ };
45
+ if (error.code === 'active_deployment' && context.action === 'delete') {
46
+ return {
47
+ ...common,
48
+ fix: 'Roll back to another deployment first, or delete the whole version.',
49
+ next: `noodle rollback <inactive-deployment-id> --org ${context.org}`,
50
+ };
51
+ }
52
+ if (error.code === 'deployment_locked' && context.action === 'delete-version') {
53
+ return {
54
+ ...common,
55
+ fix: 'Unlock this exact version before deleting it.',
56
+ next: `noodle deployments unlock --org ${context.org} --app ${context.app}` +
57
+ ` --env ${context.env} --version ${context.version} --yes`,
58
+ };
59
+ }
60
+ if (error.code === 'app_archived' && context.action === 'delete-version') {
61
+ return {
62
+ ...common,
63
+ fix: 'Restore the archived app before deleting its deployments.',
64
+ next: `noodle restore ${context.app} --org ${context.org}`,
65
+ };
66
+ }
67
+ if (error.code === 'deployment_delete_conflict' && context.action === 'delete-version') {
68
+ return {
69
+ ...common,
70
+ fix: 'Refresh the deployment history and confirm the new exact inventory.',
71
+ next: versionDeleteCommand(context, context.version, false),
72
+ };
73
+ }
74
+ if (error.code === 'deployment_not_found' || error.code === 'version_not_found') {
75
+ const list = context.action === 'delete'
76
+ ? `noodle deployments list --org ${context.org}`
77
+ : `noodle deployments list --org ${context.org} --app ${context.app} --env ${context.env}`;
78
+ return {
79
+ ...common,
80
+ fix: 'Check the exact target against the current deployment history.',
81
+ next: list,
82
+ };
83
+ }
84
+ if (error.code === 'organization_owner_required') {
85
+ return {
86
+ ...common,
87
+ fix: 'Ask an organization owner to delete the deployment records or sign in as an owner.',
88
+ next: 'noodle whoami',
89
+ };
90
+ }
91
+ return serviceFailure(`deployments ${context.action}`, error, context.action === 'delete'
92
+ ? `noodle deployments list --org ${context.org}`
93
+ : versionDeleteCommand(context, context.version, false));
94
+ }
95
+ export function versionDeleteCommand(target, version, yes) {
96
+ return (`noodle deployments delete-version ${version} --org ${target.org} --app ${target.app}` +
97
+ ` --env ${target.env}${yes ? ' --yes' : ''}`);
98
+ }
99
+ //# sourceMappingURL=deployment-delete-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-delete-recovery.js","sourceRoot":"","sources":["../../src/commands/deployment-delete-recovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAmB,cAAc,EAAE,MAAM,aAAa,CAAC;AAU9D,MAAM,UAAU,sBAAsB,CACpC,QAAkC,EAClC,QAAgC;IAEhC,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,KAAK,YAAY;QAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YACpC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC;YAC1C,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,YAAY;QAC5D,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG;YAC3C,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG;YAC3C,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG;YAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC7E,IAAI,OAAO;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,IAAI,GACR,QAAQ,CAAC,IAAI,KAAK,YAAY;QAC5B,CAAC,CAAC,iCAAiC,QAAQ,CAAC,GAAG,EAAE;QACjD,CAAC,CAAC,iCAAiC,QAAQ,CAAC,MAAM,CAAC,GAAG,UAAU,QAAQ,CAAC,MAAM,CAAC,GAAG,UAAU,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACvH,OAAO;QACL,IAAI,EAAE,qCAAqC;QAC3C,OAAO,EAAE,kFAAkF;QAC3F,KAAK,EACH,iGAAiG;QACnG,GAAG,EAAE,yFAAyF;QAC9F,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,MAAyB,EAAE,QAA2B;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;AACvE,CAAC;AAYD,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,OAA6B;IAChF,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAmB,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO,cAAc,CACnB,eAAe,OAAO,CAAC,MAAM,EAAE,EAC/B,KAAK,EACL,OAAO,CAAC,MAAM,KAAK,QAAQ;YACzB,CAAC,CAAC,iCAAiC,OAAO,CAAC,GAAG,EAAE;YAChD,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAC1D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;KAClF,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtE,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,qEAAqE;YAC1E,IAAI,EAAE,kDAAkD,OAAO,CAAC,GAAG,EAAE;SACtE,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC9E,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,+CAA+C;YACpD,IAAI,EACF,mCAAmC,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,GAAG,EAAE;gBACrE,UAAU,OAAO,CAAC,GAAG,cAAc,OAAO,CAAC,OAAO,QAAQ;SAC7D,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACzE,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,2DAA2D;YAChE,IAAI,EAAE,kBAAkB,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,GAAG,EAAE;SAC3D,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACvF,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,qEAAqE;YAC1E,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;SAC5D,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAChF,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,QAAQ;YACzB,CAAC,CAAC,iCAAiC,OAAO,CAAC,GAAG,EAAE;YAChD,CAAC,CAAC,iCAAiC,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/F,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,gEAAgE;YACrE,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B,EAAE,CAAC;QACjD,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,oFAAoF;YACzF,IAAI,EAAE,eAAe;SACtB,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CACnB,eAAe,OAAO,CAAC,MAAM,EAAE,EAC/B,KAAK,EACL,OAAO,CAAC,MAAM,KAAK,QAAQ;QACzB,CAAC,CAAC,iCAAiC,OAAO,CAAC,GAAG,EAAE;QAChD,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAA4E,EAC5E,OAAe,EACf,GAAY;IAEZ,OAAO,CACL,qCAAqC,OAAO,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,GAAG,EAAE;QACtF,UAAU,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC;AACJ,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import type { ConfigLocation } from '../config.js';
2
2
  import { type TableOptions } from '../table.js';
3
3
  import { type WatchFrame } from '../watch.js';
4
+ import { runDeploymentDelete } from './deployment-delete-ops.js';
4
5
  import { type DeploymentSummary } from './resource-shared.js';
5
- export declare function runDeployments(rest: readonly string[], env: NodeJS.ProcessEnv, home: ConfigLocation): Promise<number>;
6
+ export declare function runDeployments(rest: readonly string[], env: NodeJS.ProcessEnv, home: ConfigLocation, prompts?: Parameters<typeof runDeploymentDelete>[4]): Promise<number>;
6
7
  interface CommonDeploymentsArgs {
7
8
  readonly org?: string;
8
9
  readonly app?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"deployments-ops.d.ts","sourceRoot":"","sources":["../../src/commands/deployments-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAcnD,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAA6B,KAAK,UAAU,EAA4B,MAAM,aAAa,CAAC;AAInG,OAAO,EAML,KAAK,iBAAiB,EAMvB,MAAM,sBAAsB,CAAC;AAU9B,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAID,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAqBD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CA8BrB;AAwLD,iHAAiH;AACjH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,SAAS,iBAAiB,EAAE,EACzC,IAAI,EAAE,YAAY,GACjB,MAAM,CAER"}
1
+ {"version":3,"file":"deployments-ops.d.ts","sourceRoot":"","sources":["../../src/commands/deployments-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAcnD,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAA6B,KAAK,UAAU,EAA4B,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAML,KAAK,iBAAiB,EAMvB,MAAM,sBAAsB,CAAC;AAU9B,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC,CAajB;AAID,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAqBD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CA8BrB;AAwLD,iHAAiH;AACjH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,SAAS,iBAAiB,EAAE,EACzC,IAAI,EAAE,YAAY,GACjB,MAAM,CAER"}
@@ -13,13 +13,14 @@ import { resolveControlPlaneToken, ServiceRequestError, serviceJson } from '../c
13
13
  import { relativeTime } from '../relative-time.js';
14
14
  import { renderTable } from '../table.js';
15
15
  import { parseWatchFlags, runWatch, watchJsonConflictFailure } from '../watch.js';
16
+ import { runDeploymentDelete } from './deployment-delete-ops.js';
16
17
  import { runDeploymentLockUpdate } from './deployment-lock-ops.js';
17
18
  import { runDeploymentPackage } from './deployment-package.js';
18
19
  import { EXIT, printJsonOk } from './output.js';
19
20
  import { ACCESS_CHIP_COLORS, ACTIVE_GREEN, ARCHIVED_AMBER, authRequired, DIM_GRAY, notFoundDeployment, resolveOrgTarget, stdoutTableOptions, } from './resource-shared.js';
20
21
  import { parseCommandFlags, printCliFailure, printCommandUsageFailure, serviceFailure, usage, } from './shared.js';
21
22
  import { pickOrgInteractively } from './target-picker.js';
22
- export async function runDeployments(rest, env, home) {
23
+ export async function runDeployments(rest, env, home, prompts) {
23
24
  const [subcommand, ...tail] = rest;
24
25
  if (subcommand === 'list')
25
26
  return runDeploymentsList(tail, env, home);
@@ -27,6 +28,9 @@ export async function runDeployments(rest, env, home) {
27
28
  return runDeploymentsInspect(tail, env, home);
28
29
  if (subcommand === 'package')
29
30
  return runDeploymentPackage(tail, env, home);
31
+ if (subcommand === 'delete' || subcommand === 'delete-version') {
32
+ return runDeploymentDelete(subcommand, tail, env, home, prompts);
33
+ }
30
34
  if (subcommand === 'lock' || subcommand === 'unlock') {
31
35
  return runDeploymentLockUpdate(subcommand, tail, env, home);
32
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deployments-ops.js","sourceRoot":"","sources":["../../src/commands/deployments-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deployments-ops.js","sourceRoot":"","sources":["../../src/commands/deployments-ops.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { type AssistantAccess, type AssistantCapability, type AssistantLabels, type AssistantLayoutMode, type AssistantPosition, type AssistantPresentationOptions, type AssistantPresentationTone, type AssistantSurfaceConfig, type AssistantSurfaceMode, type AssistantThemeMode, type AssistantUiOptions, type AuthenticatedWebsiteAccess, algolia, annotations, asset, authenticatedWebsite, type BoundConnectorRef, type BrandThemeTokens, bind, type CapabilityRef, type ConnectionBinding, type ConnectionRef, type ConnectionSource, type CustomerAuthRouting, type CustomerEndpointClaimMapping, type CustomerEndpointPolicy, type CustomerEndpointRef, clientCredentials, connection, connector, customerAuth, customerEndpoint, type EmbeddedAssistantConfig, type EmbeddedAssistantOptions, embeddedAssistant, externalExchange, file, firecrawl, type GoogleWorkloadIdentityAccess, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, type ManagedCollectionDeclaration, type ManagedCollectionInput, managedCollection, managedSecret, meilisearch, type NoodleManagedModel, noodleManaged, noodlePlatform, type OpenAICompatibleModel, type OpenAICompatibleModelInput, openAICompatible, type PublicWebsiteAccess, prompt, publicWebsite, resource, type ServerDefinition, secret, server, site, tavily, tool, variable, when, z, } from '@noodle-borg/authoring';
1
+ export { type AssistantAccess, type AssistantCapability, type AssistantLabels, type AssistantLayoutMode, type AssistantPosition, type AssistantPresentationOptions, type AssistantPresentationTone, type AssistantSurfaceConfig, type AssistantSurfaceMode, type AssistantThemeMode, type AssistantUiOptions, type AuthenticatedWebsiteAccess, algolia, annotations, asset, authenticatedWebsite, type BoundConnectorRef, type BrandThemeTokens, bind, type CapabilityRef, type ConnectionBinding, type ConnectionRef, type ConnectionSource, type CustomerAuthRouting, type CustomerEndpointClaimMapping, type CustomerEndpointPolicy, type CustomerEndpointRef, clientCredentials, connection, connector, customerAuth, customerEndpoint, type EmbeddedAssistantConfig, type EmbeddedAssistantOptions, embeddedAssistant, externalExchange, file, firecrawl, type GoogleWorkloadIdentityAccess, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, type ManagedCollectionDeclaration, type ManagedCollectionInput, managedCollection, managedSecret, meilisearch, type NoodleManagedModel, noodleManaged, noodlePlatform, type OpenAICompatibleModel, type OpenAICompatibleModelInput, openAICompatible, type PublicWebsiteAccess, prompt, publicWebsite, resource, type ServerDefinition, secret, server, site, tavily, tool, variable, type WebExtractDeclaration, type WebExtractOptions, webExtract, when, z, } from '@noodle-borg/authoring';
2
2
  export { run } from './cli.js';
3
3
  export { appendServer, type ConfigLocation, clearConfig, configPath, maskToken, type NoodleConfig, readConfig, readServers, resolveAuthToken, resolveServiceUrl, type SavedServer, serversPath, writeConfig, } from './config.js';
4
4
  export { DEFAULT_SERVICE_URL, type DeployOptions, type DeployOutcome, deploy } from './deploy.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { algolia, annotations, asset, authenticatedWebsite, bind, clientCredentials, connection, connector, customerAuth, customerEndpoint, embeddedAssistant, externalExchange, file, firecrawl, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, managedCollection, managedSecret, meilisearch, noodleManaged, noodlePlatform, openAICompatible, prompt, publicWebsite, resource, secret, server, site, tavily, tool, variable, when, z, } from '@noodle-borg/authoring';
1
+ export { algolia, annotations, asset, authenticatedWebsite, bind, clientCredentials, connection, connector, customerAuth, customerEndpoint, embeddedAssistant, externalExchange, file, firecrawl, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, managedCollection, managedSecret, meilisearch, noodleManaged, noodlePlatform, openAICompatible, prompt, publicWebsite, resource, secret, server, site, tavily, tool, variable, webExtract, when, z, } from '@noodle-borg/authoring';
2
2
  export { run } from './cli.js';
3
3
  export { appendServer, clearConfig, configPath, maskToken, readConfig, readServers, resolveAuthToken, resolveServiceUrl, serversPath, writeConfig, } from './config.js';
4
4
  export { DEFAULT_SERVICE_URL, deploy } from './deploy.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,OAAO,EACP,WAAW,EACX,KAAK,EACL,oBAAoB,EAGpB,IAAI,EASJ,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,gBAAgB,EAGhB,iBAAiB,EACjB,gBAAgB,EAChB,IAAI,EACJ,SAAS,EAET,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,SAAS,EAGT,iBAAiB,EACjB,aAAa,EACb,WAAW,EAEX,aAAa,EACb,cAAc,EAGd,gBAAgB,EAEhB,MAAM,EACN,aAAa,EACb,QAAQ,EAER,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,CAAC,GACF,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EAEZ,WAAW,EACX,UAAU,EACV,SAAS,EAET,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAA0C,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAyD,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EACL,sBAAsB,EAItB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,YAAY,EAOZ,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,yBAAyB,EAEzB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGL,eAAe,EACf,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,wBAAwB,EAGxB,WAAW,EAGX,uBAAuB,EAGvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,QAAQ,GACT,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,OAAO,EACP,WAAW,EACX,KAAK,EACL,oBAAoB,EAGpB,IAAI,EASJ,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,gBAAgB,EAGhB,iBAAiB,EACjB,gBAAgB,EAChB,IAAI,EACJ,SAAS,EAET,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,SAAS,EAGT,iBAAiB,EACjB,aAAa,EACb,WAAW,EAEX,aAAa,EACb,cAAc,EAGd,gBAAgB,EAEhB,MAAM,EACN,aAAa,EACb,QAAQ,EAER,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,QAAQ,EAGR,UAAU,EACV,IAAI,EACJ,CAAC,GACF,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EAEZ,WAAW,EACX,UAAU,EACV,SAAS,EAET,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAA0C,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAyD,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EACL,sBAAsB,EAItB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,YAAY,EAOZ,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,yBAAyB,EAEzB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGL,eAAe,EACf,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,wBAAwB,EAGxB,WAAW,EAGX,uBAAuB,EAGvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,QAAQ,GACT,MAAM,eAAe,CAAC"}
@@ -123,10 +123,10 @@ export declare const feedbackPreviewInputSchema: z.ZodObject<{
123
123
  area: z.ZodEnum<{
124
124
  cli: "cli";
125
125
  connectors: "connectors";
126
+ policy: "policy";
126
127
  plugins: "plugins";
127
128
  distribution: "distribution";
128
129
  ci: "ci";
129
- policy: "policy";
130
130
  docs: "docs";
131
131
  analytics: "analytics";
132
132
  "self-service": "self-service";
@@ -159,10 +159,10 @@ export declare const feedbackSubmitInputSchema: z.ZodObject<{
159
159
  area: z.ZodEnum<{
160
160
  cli: "cli";
161
161
  connectors: "connectors";
162
+ policy: "policy";
162
163
  plugins: "plugins";
163
164
  distribution: "distribution";
164
165
  ci: "ci";
165
- policy: "policy";
166
166
  docs: "docs";
167
167
  analytics: "analytics";
168
168
  "self-service": "self-service";
@@ -183,6 +183,10 @@ export const COMMAND_GROUPS = {
183
183
  group: 'Governance & observability',
184
184
  summary: 'Operator-only knowledge components: list, status, and refresh (ADR 0202).',
185
185
  },
186
+ capabilities: {
187
+ group: 'Governance & observability',
188
+ summary: 'Inspect, revision-configure and explicitly fixture/live-test managed capability policy.',
189
+ },
186
190
  audit: {
187
191
  group: 'Governance & observability',
188
192
  summary: 'Operator governance audit status and event queries.',
@@ -37,7 +37,7 @@ export const BUNDLED_EXAMPLE_FILES = [
37
37
  { relPath: "examples/acme-discovery/src/helpers.ts", content: "import type { ServerDefinition } from '@noodleseed/one';\nimport { generateHelpers } from '@noodleseed/one/react';\n\nexport type AppType = ServerDefinition;\n\nexport const { useCallTool, useLayout, useOpenExternal, useToolInfo, useViewState } =\n generateHelpers<AppType>();\n" },
38
38
  { relPath: "examples/acme-discovery/src/knowledge/faq.txt", content: "ACME GETAWAYS FAQ\n\nQ: Does the assistant book and take payment?\nA: No. The assistant shapes the trip and hands off to Acmes own checkout with a signed link.\n\nQ: How current are prices?\nA: Starting prices come from Acmes live site; the assistant cites the page it used.\n\nQ: Can I compare destinations?\nA: Yes, ask for a shortlist by vibe, month, or budget.\n" },
39
39
  { relPath: "examples/acme-discovery/src/knowledge/product.md", content: "# Acme Getaways product guide\n\nAcme Getaways curates four destination types: beach, mountains, culture, and city escapes. Every listing shows a real starting price and the best months to travel. Bookings, payments, and date selection happen on Acmes own site through a signed handoff link; the assistant never takes payment details.\n\n## Cancellation and support\n\nAll trips can be cancelled free within 48 hours of the handoff. Support runs seven days a week through the chat on book.acme.example.\n" },
40
- { relPath: "examples/acme-discovery/src/server.ts", content: "import {\n annotations,\n authenticatedWebsite,\n connector,\n embeddedAssistant,\n file,\n knowledge,\n noodleManaged,\n publicWebsite,\n secret,\n server,\n site,\n tool,\n variable,\n z,\n} from '@noodleseed/one';\n\n// Acme Getaways is a fictional travel brand. This app is deliberately top-of-funnel: discovery and\n// configuration happen inside ChatGPT; the booking/transaction happens off-app on Acme's own site,\n// reached through a signed, attributable handoff deep link. Destinations are the partner's own\n// catalog (grounding) — the app never invents a place, price, or best-month.\n//\n// Authoring note: a tool `fulfil` is *recorded*, not run as live JS. Inputs flow through as\n// `${input.x}` substitutions when placed directly into an output string; do not transform them\n// (no URL-encoding, arithmetic, or filtering on an input value — those break substitution). The\n// curated catalog below is static data the runtime returns verbatim.\n\nconst catalog = [\n {\n id: 'coral_bay',\n name: 'Coral Bay',\n region: 'Adriatic coast',\n vibe: 'beach',\n priceFrom: 890,\n bestMonths: 'May–Sep',\n why: 'Calm swimming coves and a walkable old town — easy for a relaxed first trip.',\n },\n {\n id: 'monte_alto',\n name: 'Monte Alto',\n region: 'Northern Alps',\n vibe: 'mountains',\n priceFrom: 1120,\n bestMonths: 'Dec–Mar',\n why: 'Ski-in village with beginner slopes and long groomed runs.',\n },\n {\n id: 'old_quarter',\n name: 'Old Quarter',\n region: 'Central Europe',\n vibe: 'culture',\n priceFrom: 640,\n bestMonths: 'Apr–Oct',\n why: 'Dense museum district and food halls, all reachable on foot.',\n },\n {\n id: 'harbor_city',\n name: 'Harbor City',\n region: 'Pacific rim',\n vibe: 'city',\n priceFrom: 980,\n bestMonths: 'Sep–Nov',\n why: 'Waterfront nightlife and day-trip islands a short ferry away.',\n },\n] as const;\n\n// A closed set of URL-safe month values. A `fulfil` cannot url-encode an input (recording would break\n// substitution), so the deep link carries `month` only if it is already safe — the model maps natural\n// phrasing (\"early June\") onto one of these when it fills the tool.\nconst monthEnum = z\n .enum([\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ])\n .default('June');\n\n// The catalog ids are already url-safe slugs. Constrain the handoff `destination` to this closed set so\n// only a real, url-safe id can reach the deep link.\nconst destinationId = z.enum(['coral_bay', 'monte_alto', 'old_quarter', 'harbor_city']);\n\nconst discoverInput = z.object({\n vibe: z.enum(['beach', 'mountains', 'culture', 'city']).default('beach'),\n month: monthEnum,\n travelers: z.number().int().min(1).default(2),\n});\n\n// Tool annotations for host planners: reads are read-only, the handoff opens an external link, and\n// shortlisting is a local non-destructive write.\nconst readOnly = annotations.readOnly();\nconst openLink = annotations.openAction();\nconst localWrite = annotations.localAction({ destructive: false, confirm: false });\n\nconst destinationOutput = z.object({\n id: z.string(),\n name: z.string(),\n region: z.string(),\n vibe: z.string(),\n priceFrom: z.number(),\n bestMonths: z.string(),\n why: z.string(),\n});\n\nconst discoverGetaways = tool('discover_getaways', {\n title: 'Discover getaways',\n description:\n 'Suggest Acme Getaways destinations for a vibe and month and render a discovery carousel.',\n annotations: readOnly,\n input: discoverInput,\n output: z.object({\n status: z.string(),\n vibe: z.string(),\n month: z.string(),\n travelers: z.number(),\n // Bounded list: the curated catalog is fixed and small, and the declared ceiling tells the\n // model and host the payload cannot grow. `noodle check` reports `tool_design_output_bounds`.\n options: z.array(destinationOutput).max(20),\n }),\n // The carousel presents Acme's curated catalog; the model narrates which fit the stated vibe.\n // (A tool cannot filter on an input value — that is connector/flow work — so all are returned.)\n fulfil: ({ input }) => ({\n status: `Acme Getaways for a ${input.vibe} trip in ${input.month}, ${input.travelers} traveler(s).`,\n vibe: input.vibe,\n month: input.month,\n travelers: input.travelers,\n options: catalog,\n }),\n viewTitle: 'Discover getaways',\n // ChatGPT host status copy (openai/toolInvocation/*) — required for widget-opening tools.\n invoking: 'Finding getaways…',\n invoked: 'Getaways ready',\n domain: 'https://getaways.acme.example',\n view: {\n component: 'discovery-carousel',\n entry: './views/discovery-carousel.tsx',\n },\n viewDescription:\n 'A top-of-funnel discovery carousel: pick a destination, then hand off to Acme to book.',\n csp: {\n connectDomains: ['https://acme.example'],\n resourceDomains: ['https://acme.example'],\n frameDomains: ['https://acme.example'],\n },\n});\n\nconst createHandoff = tool('create_handoff', {\n title: 'Create booking handoff',\n description:\n 'Create the Acme booking deep link for a chosen destination, carrying the configured trip. ' +\n 'Pass the destination id (url-safe slug, e.g. \"coral_bay\") and its display name.',\n annotations: openLink,\n input: z.object({\n destination: destinationId,\n destinationName: z.string().min(1),\n month: monthEnum,\n travelers: z.number().int().min(1).default(2),\n }),\n output: z.object({\n status: z.string(),\n destination: z.string(),\n summary: z.string(),\n handoffUrl: z.string(),\n }),\n // Inline the inputs directly so they substitute at runtime; every value is already url-safe\n // (id slug, month enum, integer), and `src=chatgpt` is the attribution the partner measures\n // ChatGPT-sourced conversions on.\n fulfil: ({ input }) => ({\n status: `Ready to continue on Acme for ${input.destinationName}.`,\n destination: input.destination,\n summary: `${input.destinationName} · ${input.month} · ${input.travelers} traveler(s)`,\n handoffUrl: `https://book.acme.example/plan?dest=${input.destination}&month=${input.month}&pax=${input.travelers}&src=chatgpt`,\n }),\n});\n\nconst shortlistGetaway = tool('shortlist_getaway', {\n visibility: ['app'],\n description: 'Record the traveler’s shortlisted destination from the discovery widget.',\n annotations: localWrite,\n input: z.object({\n destination: z.string(),\n note: z.string().default(''),\n }),\n output: z.object({\n status: z.string(),\n destination: z.string(),\n note: z.string(),\n }),\n fulfil: ({ input }) => ({\n status: `Shortlisted ${input.destination}.`,\n destination: input.destination,\n note: input.note,\n }),\n});\n\n// The consultative sales gateway (ADR 0214): when a visitor would rather not sign up, the assistant\n// may — with explicit confirmation — take their details and deliver them to Acme's own sink. The\n// recipe is a composition of existing primitives, not a platform feature: an ordinary confirm-gated\n// action plus a declarative HTTP connector whose endpoint and credential are operator-managed\n// (`noodle variables set LEAD_SINK_URL …`, `noodle secrets set LEAD_SINK_TOKEN …`). The payload\n// rests only in Acme's own system; the platform stores no lead. A vendor sink is the same shape as\n// data: Resend/Postmark take `auth: { kind: 'apiKey', … }`, a HubSpot private app takes\n// `auth: { kind: 'bearer', … }` — never a named vendor package.\nconst leadSink = connector('lead_sink')\n .version('1.0.0')\n .http({\n baseUrl: variable('LEAD_SINK_URL'),\n allowedOrigins: ['https://acme.example'],\n auth: { kind: 'bearer', secret: secret('LEAD_SINK_TOKEN') },\n operations: {\n submit_lead: {\n type: 'action',\n method: 'POST',\n path: '/api/assistant-lead',\n input: z.object({\n name: z.string().trim().min(2).max(120),\n workEmail: z.email().max(240),\n company: z.string().trim().min(2).max(200),\n note: z.string().max(500),\n }),\n output: z.object({ ok: z.boolean() }),\n request: {\n name: '${args.name}',\n workEmail: '${args.workEmail}',\n company: '${args.company}',\n note: '${args.note}',\n // Fixed attribution, set here rather than model-supplied: Acme's sink can trust it.\n source: 'website-assistant',\n },\n response: { ok: '${response.ok}' },\n },\n },\n });\n\nconst captureLead = tool('capture_lead', {\n title: 'Send my details to Acme',\n description:\n 'Send the visitor’s contact details and trip interest to Acme Getaways so the team may follow ' +\n 'up. Call only after the visitor explicitly agrees to be contacted; the confirmation card is ' +\n 'their consent moment. After a confirmed success, say only that the details were sent — never ' +\n 'promise response timing.',\n annotations: annotations.action({ confirm: true }),\n input: z.object({\n name: z.string().trim().min(2).max(120).meta({ title: 'Your name' }),\n workEmail: z.email().max(240).meta({ title: 'Work email' }),\n company: z.string().trim().min(2).max(200).meta({ title: 'Company' }),\n note: z.string().max(500).default('').meta({ title: 'What are you planning?' }),\n }),\n output: z.object({ ok: z.boolean() }),\n fulfil: ({ input, connectors }) => {\n const result = connectors.leads.submitLead({\n name: input.name,\n workEmail: input.workEmail,\n company: input.company,\n note: input.note,\n });\n return { ok: result.ok };\n },\n});\n\n// The mixed surface's sign-in trigger (ADR 0201): reading `${user.id}` classifies this tool\n// requires-identity, so an anonymous visitor who reaches for it sees the sign-in card instead of an\n// error — and after signing in on Acme's account origin, the conversation continues under the\n// authenticated surface below.\nconst myTrips = tool('my_trips', {\n title: 'My saved trips',\n description: 'Read the signed-in traveler’s saved trips and their booking status.',\n annotations: readOnly,\n input: z.object({}),\n output: z.object({\n traveler: z.string(),\n status: z.string(),\n }),\n fulfil: ({ user }) => ({\n traveler: user.id as string,\n status: 'No trips booked yet — shortlist a getaway to start one.',\n }),\n});\n\n// Grounding beyond the catalog: two controlled files answer policy/pricing/support questions with\n// citations, and Acme's live public site is crawled on deploy and re-crawled on the declared\n// refresh cadence — no sync job, no handwritten search tool. One declaration, one generated\n// `search_destinations` capability. The managed crawler and index are the defaults; a component\n// can instead bring its own via `crawler: firecrawl({ apiKey: secret('FIRECRAWL_API_KEY') })`\n// and `index: algolia({ appId: variable('ALGOLIA_APP_ID'), apiKey: secret('ALGOLIA_API_KEY') })`\n// — the code names the config, `noodle secrets|variables set` supplies the values.\nconst destinations = knowledge('destinations', {\n title: 'Acme Getaways destinations',\n description: 'Public destination, pricing, cancellation, and support information.',\n documents: [\n file('./knowledge/product.md', {\n title: 'Product guide',\n sourceUrl: 'https://getaways.acme.example/product',\n }),\n file('./knowledge/faq.txt', { title: 'FAQ' }),\n ],\n sites: [\n site({\n origin: 'https://getaways.acme.example',\n include: ['/destinations/**', '/pricing', '/support'],\n refresh: '12h',\n }),\n ],\n});\n\nexport default server(\n 'acme_discovery',\n {\n title: 'Acme Getaways',\n version: '1.0.0',\n branding: {\n name: 'Acme Getaways',\n accent: '#0EA5A4',\n surface: '#F0FDFA',\n surfaceDark: '#0B1B1B',\n radius: 'lg',\n density: 'comfortable',\n },\n // The only external destinations the app links out to — the compiler derives ChatGPT's\n // redirect_domains from this so the handoff opens without a safe-link warning.\n handoff: {\n allowedDomains: ['https://book.acme.example', 'https://acme.example'],\n },\n use: { leads: leadSink },\n // The same tools also serve Acme's own websites, with no second tool set. The marketing site is\n // a **mixed** surface (`signIn: true`): a visitor with no account gets discovery, the booking\n // handoff, and the confirm-gated lead capture — and reaching for `my_trips` raises the sign-in\n // card instead of an error, with `signUpAction` offering account creation through Acme's own\n // registration. After the login redirect lands on the account origin, the same conversation\n // continues under the authenticated surface's capabilities and instructions (ADR 0201).\n // `capabilities` is the whole externally reachable surface per front door — short enough to\n // review in one glance, and closed by default when a tool is added to the server later.\n assistant: embeddedAssistant({\n model: noodleManaged(),\n access: [\n publicWebsite({\n origins: ['https://getaways.acme.example'],\n // A browser agent on Acme's marketing page (Gemini-in-Chrome, Claude-in-Chrome) discovers\n // exactly the capabilities listed below and reaches them over the same authorization,\n // confirmation, budget, and audit path the panel's own calls take: `capture_lead` still\n // stops for its confirmation card. `site/index.html` is the page this runs on.\n webmcp: { enabled: true },\n // A visitor who asks about Coral Bay on one page and clicks through to another would\n // otherwise arrive at an empty panel and have to start over. This carries the text they\n // have already read onto the next page, on a fresh session — never the old session's\n // authority, budget, or a half-answered confirmation (ADR 0223). Opt-in because anonymous\n // conversation text is Acme's content on Acme's page; the defaults below are deliberately\n // tighter than the platform ceiling.\n continuity: { enabled: true, windowSeconds: 300, maxRestores: 3 },\n capabilities: [\n destinations,\n discoverGetaways,\n createHandoff,\n shortlistGetaway,\n captureLead,\n myTrips,\n ],\n signIn: true,\n instructions:\n 'Be a friendly, consultative travel guide, never pushy. Help visitors narrow a getaway before suggesting the next useful step. Ground recommendations in Acme knowledge, and clearly separate discovery from booking. When a visitor’s plans firm up, invite them to sign in or create an account; if they would rather not, offer — once — to send their details to the Acme team instead.',\n }),\n authenticatedWebsite({\n origins: ['https://account.acme.example'],\n capabilities: [destinations, discoverGetaways, createHandoff, myTrips],\n instructions:\n 'The traveler is signed in. Help them plan from their saved trips, and keep booking on Acme’s own pages through the handoff.',\n }),\n ],\n layout: { mode: 'floating', position: 'bottom-right' },\n labels: {\n welcomeHeading: 'Where would you like to go?',\n signInHeading: 'Continue with your Acme account',\n signInBody: 'Saved trips need an account.',\n signInAction: 'Sign in',\n signUpAction: 'Create free account',\n },\n }),\n knowledge: [destinations],\n },\n [discoverGetaways, createHandoff, shortlistGetaway, captureLead, myTrips],\n);\n" },
40
+ { relPath: "examples/acme-discovery/src/server.ts", content: "import {\n annotations,\n authenticatedWebsite,\n connector,\n embeddedAssistant,\n file,\n knowledge,\n noodleManaged,\n publicWebsite,\n secret,\n server,\n site,\n tool,\n variable,\n webExtract,\n z,\n} from '@noodleseed/one';\n\n// Fictional travel discovery; authoritative bookings happen on Acme's site through signed handoff.\n// Fulfilment is recorded, not live JavaScript. The catalog supplies facts; page evidence is supplementary.\n\nconst catalog = [\n {\n id: 'coral_bay',\n name: 'Coral Bay',\n region: 'Adriatic coast',\n vibe: 'beach',\n priceFrom: 890,\n bestMonths: 'May–Sep',\n why: 'Calm swimming coves and a walkable old town — easy for a relaxed first trip.',\n },\n {\n id: 'monte_alto',\n name: 'Monte Alto',\n region: 'Northern Alps',\n vibe: 'mountains',\n priceFrom: 1120,\n bestMonths: 'Dec–Mar',\n why: 'Ski-in village with beginner slopes and long groomed runs.',\n },\n {\n id: 'old_quarter',\n name: 'Old Quarter',\n region: 'Central Europe',\n vibe: 'culture',\n priceFrom: 640,\n bestMonths: 'Apr–Oct',\n why: 'Dense museum district and food halls, all reachable on foot.',\n },\n {\n id: 'harbor_city',\n name: 'Harbor City',\n region: 'Pacific rim',\n vibe: 'city',\n priceFrom: 980,\n bestMonths: 'Sep–Nov',\n why: 'Waterfront nightlife and day-trip islands a short ferry away.',\n },\n] as const;\n\n// A closed set of URL-safe month values. A `fulfil` cannot url-encode an input (recording would break\n// substitution), so the deep link carries `month` only if it is already safe — the model maps natural\n// phrasing (\"early June\") onto one of these when it fills the tool.\nconst monthEnum = z\n .enum([\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ])\n .default('June');\n\n// The catalog ids are already url-safe slugs. Constrain the handoff `destination` to this closed set so\n// only a real, url-safe id can reach the deep link.\nconst destinationId = z.enum(['coral_bay', 'monte_alto', 'old_quarter', 'harbor_city']);\n\nconst discoverInput = z.object({\n vibe: z.enum(['beach', 'mountains', 'culture', 'city']).default('beach'),\n month: monthEnum,\n travelers: z.number().int().min(1).default(2),\n});\n\n// Tool annotations for host planners: reads are read-only, the handoff opens an external link, and\n// shortlisting is a local non-destructive write.\nconst readOnly = annotations.readOnly();\nconst openLink = annotations.openAction();\nconst localWrite = annotations.localAction({ destructive: false, confirm: false });\n\nconst destinationOutput = z.object({\n id: z.string(),\n name: z.string(),\n region: z.string(),\n vibe: z.string(),\n priceFrom: z.number(),\n bestMonths: z.string(),\n why: z.string(),\n});\n\nconst discoverGetaways = tool('discover_getaways', {\n title: 'Discover getaways',\n description:\n 'Suggest Acme Getaways destinations for a vibe and month and render a discovery carousel.',\n annotations: readOnly,\n input: discoverInput,\n output: z.object({\n status: z.string(),\n vibe: z.string(),\n month: z.string(),\n travelers: z.number(),\n // Bounded list: the curated catalog is fixed and small, and the declared ceiling tells the\n // model and host the payload cannot grow. `noodle check` reports `tool_design_output_bounds`.\n options: z.array(destinationOutput).max(20),\n }),\n // The carousel presents Acme's curated catalog; the model narrates which fit the stated vibe.\n // (A tool cannot filter on an input value — that is connector/flow work — so all are returned.)\n fulfil: ({ input }) => ({\n status: `Acme Getaways for a ${input.vibe} trip in ${input.month}, ${input.travelers} traveler(s).`,\n vibe: input.vibe,\n month: input.month,\n travelers: input.travelers,\n options: catalog,\n }),\n viewTitle: 'Discover getaways',\n // ChatGPT host status copy (openai/toolInvocation/*) — required for widget-opening tools.\n invoking: 'Finding getaways…',\n invoked: 'Getaways ready',\n domain: 'https://getaways.acme.example',\n view: {\n component: 'discovery-carousel',\n entry: './views/discovery-carousel.tsx',\n },\n viewDescription:\n 'A top-of-funnel discovery carousel: pick a destination, then hand off to Acme to book.',\n csp: {\n connectDomains: ['https://acme.example'],\n resourceDomains: ['https://acme.example'],\n frameDomains: ['https://acme.example'],\n },\n});\n\nconst createHandoff = tool('create_handoff', {\n title: 'Create booking handoff',\n description:\n 'Create the Acme booking deep link for a chosen destination, carrying the configured trip. ' +\n 'Pass the destination id (url-safe slug, e.g. \"coral_bay\") and its display name.',\n annotations: openLink,\n input: z.object({\n destination: destinationId,\n destinationName: z.string().min(1),\n month: monthEnum,\n travelers: z.number().int().min(1).default(2),\n }),\n output: z.object({\n status: z.string(),\n destination: z.string(),\n summary: z.string(),\n handoffUrl: z.string(),\n }),\n // Inline the inputs directly so they substitute at runtime; every value is already url-safe\n // (id slug, month enum, integer), and `src=chatgpt` is the attribution the partner measures\n // ChatGPT-sourced conversions on.\n fulfil: ({ input }) => ({\n status: `Ready to continue on Acme for ${input.destinationName}.`,\n destination: input.destination,\n summary: `${input.destinationName} · ${input.month} · ${input.travelers} traveler(s)`,\n handoffUrl: `https://book.acme.example/plan?dest=${input.destination}&month=${input.month}&pax=${input.travelers}&src=chatgpt`,\n }),\n});\n\nconst shortlistGetaway = tool('shortlist_getaway', {\n visibility: ['app'],\n description: 'Record the traveler’s shortlisted destination from the discovery widget.',\n annotations: localWrite,\n input: z.object({\n destination: z.string(),\n note: z.string().default(''),\n }),\n output: z.object({\n status: z.string(),\n destination: z.string(),\n note: z.string(),\n }),\n fulfil: ({ input }) => ({\n status: `Shortlisted ${input.destination}.`,\n destination: input.destination,\n note: input.note,\n }),\n});\n\n// The consultative sales gateway (ADR 0214): when a visitor would rather not sign up, the assistant\n// may — with explicit confirmation — take their details and deliver them to Acme's own sink. The\n// recipe is a composition of existing primitives, not a platform feature: an ordinary confirm-gated\n// action plus a declarative HTTP connector whose endpoint and credential are operator-managed\n// (`noodle variables set LEAD_SINK_URL …`, `noodle secrets set LEAD_SINK_TOKEN …`). The payload\n// rests only in Acme's own system; the platform stores no lead. A vendor sink is the same shape as\n// data: Resend/Postmark take `auth: { kind: 'apiKey', … }`, a HubSpot private app takes\n// `auth: { kind: 'bearer', … }` — never a named vendor package.\nconst leadSink = connector('lead_sink')\n .version('1.0.0')\n .http({\n baseUrl: variable('LEAD_SINK_URL'),\n allowedOrigins: ['https://acme.example'],\n auth: { kind: 'bearer', secret: secret('LEAD_SINK_TOKEN') },\n operations: {\n submit_lead: {\n type: 'action',\n method: 'POST',\n path: '/api/assistant-lead',\n input: z.object({\n name: z.string().trim().min(2).max(120),\n workEmail: z.email().max(240),\n company: z.string().trim().min(2).max(200),\n note: z.string().max(500),\n }),\n output: z.object({ ok: z.boolean() }),\n request: {\n name: '${args.name}',\n workEmail: '${args.workEmail}',\n company: '${args.company}',\n note: '${args.note}',\n // Fixed attribution, set here rather than model-supplied: Acme's sink can trust it.\n source: 'website-assistant',\n },\n response: { ok: '${response.ok}' },\n },\n },\n });\n\nconst captureLead = tool('capture_lead', {\n title: 'Send my details to Acme',\n description:\n 'Send the visitor’s contact details and trip interest to Acme Getaways so the team may follow ' +\n 'up. Call only after the visitor explicitly agrees to be contacted; the confirmation card is ' +\n 'their consent moment. After a confirmed success, say only that the details were sent — never ' +\n 'promise response timing.',\n annotations: annotations.action({ confirm: true }),\n input: z.object({\n name: z.string().trim().min(2).max(120).meta({ title: 'Your name' }),\n workEmail: z.email().max(240).meta({ title: 'Work email' }),\n company: z.string().trim().min(2).max(200).meta({ title: 'Company' }),\n note: z.string().max(500).default('').meta({ title: 'What are you planning?' }),\n }),\n output: z.object({ ok: z.boolean() }),\n fulfil: ({ input, connectors }) => {\n const result = connectors.leads.submitLead({\n name: input.name,\n workEmail: input.workEmail,\n company: input.company,\n note: input.note,\n });\n return { ok: result.ok };\n },\n});\n\n// The mixed surface's sign-in trigger (ADR 0201): reading `${user.id}` classifies this tool\n// requires-identity, so an anonymous visitor who reaches for it sees the sign-in card instead of an\n// error — and after signing in on Acme's account origin, the conversation continues under the\n// authenticated surface below.\nconst myTrips = tool('my_trips', {\n title: 'My saved trips',\n description: 'Read the signed-in traveler’s saved trips and their booking status.',\n annotations: readOnly,\n input: z.object({}),\n output: z.object({\n traveler: z.string(),\n status: z.string(),\n }),\n fulfil: ({ user }) => ({\n traveler: user.id as string,\n status: 'No trips booked yet — shortlist a getaway to start one.',\n }),\n});\n\n// Grounding beyond the catalog: two controlled files answer policy/pricing/support questions with\n// citations, and Acme's live public site is crawled on deploy and re-crawled on the declared\n// refresh cadence — no sync job, no handwritten search tool. One declaration, one generated\n// `search_destinations` capability. The managed crawler and index are the defaults; a component\n// can instead bring its own via `crawler: firecrawl({ apiKey: secret('FIRECRAWL_API_KEY') })`\n// and `index: algolia({ appId: variable('ALGOLIA_APP_ID'), apiKey: secret('ALGOLIA_API_KEY') })`\n// — the code names the config, `noodle secrets|variables set` supplies the values.\nconst publicPages = webExtract('public_pages', {\n title: 'Read a visitor-supplied public page',\n description:\n 'Read an explicit public page for trip context. This evidence does not establish live prices, inventory or bookings.',\n provider: noodleManaged(),\n policy: { maxUrls: 3, maxCalls: 2, timeoutMs: 15_000 },\n});\n\nconst destinations = knowledge('destinations', {\n title: 'Acme Getaways destinations',\n description: 'Public destination, pricing, cancellation, and support information.',\n documents: [\n file('./knowledge/product.md', {\n title: 'Product guide',\n sourceUrl: 'https://getaways.acme.example/product',\n }),\n file('./knowledge/faq.txt', { title: 'FAQ' }),\n ],\n sites: [\n site({\n origin: 'https://getaways.acme.example',\n include: ['/destinations/**', '/pricing', '/support'],\n refresh: '12h',\n }),\n ],\n});\n\nexport default server(\n 'acme_discovery',\n {\n title: 'Acme Getaways',\n version: '1.0.0',\n branding: {\n name: 'Acme Getaways',\n accent: '#0EA5A4',\n surface: '#F0FDFA',\n surfaceDark: '#0B1B1B',\n radius: 'lg',\n density: 'comfortable',\n },\n // The only external destinations the app links out to — the compiler derives ChatGPT's\n // redirect_domains from this so the handoff opens without a safe-link warning.\n handoff: {\n allowedDomains: ['https://book.acme.example', 'https://acme.example'],\n },\n use: { leads: leadSink },\n // The same tools also serve Acme's own websites, with no second tool set. The marketing site is\n // a **mixed** surface (`signIn: true`): a visitor with no account gets discovery, the booking\n // handoff, and the confirm-gated lead capture — and reaching for `my_trips` raises the sign-in\n // card instead of an error, with `signUpAction` offering account creation through Acme's own\n // registration. After the login redirect lands on the account origin, the same conversation\n // continues under the authenticated surface's capabilities and instructions (ADR 0201).\n // `capabilities` is the whole externally reachable surface per front door — short enough to\n // review in one glance, and closed by default when a tool is added to the server later.\n assistant: embeddedAssistant({\n model: noodleManaged(),\n access: [\n publicWebsite({\n origins: ['https://getaways.acme.example'],\n // A browser agent on Acme's marketing page (Gemini-in-Chrome, Claude-in-Chrome) discovers\n // exactly the capabilities listed below and reaches them over the same authorization,\n // confirmation, budget, and audit path the panel's own calls take: `capture_lead` still\n // stops for its confirmation card. `site/index.html` is the page this runs on.\n webmcp: { enabled: true },\n // A visitor who asks about Coral Bay on one page and clicks through to another would\n // otherwise arrive at an empty panel and have to start over. This carries the text they\n // have already read onto the next page, on a fresh session — never the old session's\n // authority, budget, or a half-answered confirmation (ADR 0223). Opt-in because anonymous\n // conversation text is Acme's content on Acme's page; the defaults below are deliberately\n // tighter than the platform ceiling.\n continuity: { enabled: true, windowSeconds: 300, maxRestores: 3 },\n capabilities: [\n destinations,\n publicPages,\n discoverGetaways,\n createHandoff,\n shortlistGetaway,\n captureLead,\n myTrips,\n ],\n signIn: true,\n instructions:\n 'Be a friendly, consultative travel guide, never pushy. Help visitors narrow a getaway before suggesting the next useful step. Ground recommendations in Acme knowledge, and clearly separate discovery from booking. When a visitor’s plans firm up, invite them to sign in or create an account; if they would rather not, offer — once — to send their details to the Acme team instead.',\n }),\n authenticatedWebsite({\n origins: ['https://account.acme.example'],\n capabilities: [destinations, discoverGetaways, createHandoff, myTrips],\n instructions:\n 'The traveler is signed in. Help them plan from their saved trips, and keep booking on Acme’s own pages through the handoff.',\n }),\n ],\n layout: { mode: 'floating', position: 'bottom-right' },\n labels: {\n welcomeHeading: 'Where would you like to go?',\n signInHeading: 'Continue with your Acme account',\n signInBody: 'Saved trips need an account.',\n signInAction: 'Sign in',\n signUpAction: 'Create free account',\n },\n }),\n knowledge: [destinations],\n capabilities: [publicPages],\n },\n [discoverGetaways, createHandoff, shortlistGetaway, captureLead, myTrips],\n);\n" },
41
41
  { relPath: "examples/acme-discovery/src/views/discovery-carousel.tsx", content: "import { useState } from 'react';\nimport { useCallTool, useLayout, useOpenExternal, useToolInfo, useViewState } from '../helpers.js';\nimport './widget-style.css';\n\ntype Destination = {\n readonly id: string;\n readonly name: string;\n readonly region: string;\n readonly vibe: string;\n readonly priceFrom: number;\n readonly bestMonths: string;\n readonly why: string;\n};\n\nfunction asDiscovery(value: unknown) {\n return value as\n | {\n readonly status?: string;\n readonly month?: string;\n readonly travelers?: number;\n readonly options?: readonly Destination[];\n }\n | undefined;\n}\n\nexport default function DiscoveryCarousel() {\n const { displayMode, theme } = useLayout();\n const openExternal = useOpenExternal();\n const discovery = asDiscovery(useToolInfo('discover_getaways').structuredContent);\n const shortlist = useCallTool('shortlist_getaway');\n const handoff = useCallTool('create_handoff');\n\n const options = discovery?.options ?? [];\n const month = discovery?.month ?? 'June';\n const travelers = discovery?.travelers ?? 2;\n const [chosen, setChosen] = useViewState('chosen', options[0]?.id ?? '');\n const [status, setStatus] = useState(discovery?.status ?? 'Pick a getaway to continue.');\n const selected = options.find((entry) => entry.id === chosen) ?? options[0];\n const continueLabel = handoff.isPending\n ? 'Opening Acme…'\n : `Continue on Acme${selected ? ` · ${selected.name}` : ''}`;\n\n async function shortlistDestination(destination: Destination) {\n setChosen(destination.id);\n try {\n const result = await shortlist.callTool({ destination: destination.name });\n const structured = result.structuredContent as { readonly status?: string } | undefined;\n setStatus(structured?.status ?? `Shortlisted ${destination.name}.`);\n } catch {\n setStatus(`Couldn't shortlist ${destination.name} — try again.`);\n }\n }\n\n async function continueOnAcme() {\n if (selected === undefined) return;\n // The handoff is the product: configure here, transact off-app. The deep link carries the trip.\n // Only open the external target on a successful handoff; surface failures instead of failing silently.\n try {\n const result = await handoff.callTool({\n destination: selected.id,\n destinationName: selected.name,\n month,\n travelers,\n });\n const structured = result.structuredContent as { readonly handoffUrl?: string } | undefined;\n if (structured?.handoffUrl) openExternal(structured.handoffUrl);\n else setStatus('Continue on Acme is unavailable right now — try again.');\n } catch {\n setStatus('Continue on Acme failed — try again.');\n }\n }\n\n return (\n <main\n className={`nw-shell${theme === 'dark' ? ' dark' : ''}`}\n data-llm={`Acme Getaways discovery: ${options.length} options for ${month}, ${travelers} traveler(s); shortlisted ${selected?.name ?? 'none'}`}\n >\n <section className=\"nw-card\">\n <header className=\"nw-header\">\n <span className=\"nw-icon\" aria-hidden=\"true\">\n <CompassIcon />\n </span>\n <div className=\"nw-title-block\">\n <h1 className=\"nw-title\">Acme Getaways</h1>\n <p className=\"nw-subtitle\" aria-live=\"polite\">\n {status}\n </p>\n </div>\n <span className=\"nw-chip\">\n {displayMode === 'fullscreen' ? 'Fullscreen' : 'Discover'}\n </span>\n </header>\n\n <div className=\"nw-carousel\">\n {options.map((entry) => (\n <article\n className={`nw-dest${entry.id === chosen ? ' nw-dest-active' : ''}`}\n key={entry.id}\n >\n <div className=\"nw-dest-head\">\n <span className=\"nw-dest-name\">{entry.name}</span>\n <span className=\"nw-price\">from ${entry.priceFrom}</span>\n </div>\n <p className=\"nw-dest-region\">\n {entry.region} · best {entry.bestMonths}\n </p>\n {/* Grounded copy: the \"why\" comes from Acme's catalog, not invented at runtime. */}\n <p className=\"nw-dest-why\">{entry.why}</p>\n <button\n aria-pressed={entry.id === chosen}\n className=\"nw-button nw-button-ghost\"\n type=\"button\"\n onClick={() => shortlistDestination(entry)}\n >\n {entry.id === chosen ? 'Shortlisted' : 'Shortlist'}\n </button>\n </article>\n ))}\n </div>\n\n <div className=\"nw-actions\">\n <button\n className=\"nw-button nw-button-primary\"\n type=\"button\"\n disabled={selected === undefined || handoff.isPending}\n onClick={continueOnAcme}\n >\n <ExternalIcon />\n {continueLabel}\n </button>\n </div>\n <p className=\"nw-note\">Booking and payment happen on acme.example — never inside chat.</p>\n </section>\n </main>\n );\n}\n\nfunction CompassIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m15.5 8.5-2 5-5 2 2-5 5-2Z\" />\n </svg>\n );\n}\n\nfunction ExternalIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M14 4h6v6\" />\n <path d=\"m20 4-9 9\" />\n <path d=\"M20 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5\" />\n </svg>\n );\n}\n" },
42
42
  { relPath: "examples/acme-discovery/src/views/widget-style.css", content: ":root {\n color-scheme: light dark;\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --nw-bg: #ffffff;\n --nw-surface: #f4fbfa;\n --nw-text: #10201f;\n --nw-muted: #5b6b6a;\n --nw-border: #d4e6e4;\n --nw-accent: #0ea5a4;\n --nw-accent-strong: #0f766e;\n --nw-accent-soft: #e6faf8;\n --nw-radius: 10px;\n --nw-shadow: 0 18px 50px rgb(15 40 40 / 12%);\n}\n\n.dark,\n[data-theme=\"dark\"] {\n --nw-bg: #0b1b1b;\n --nw-surface: #102624;\n --nw-text: #eafaf8;\n --nw-muted: #9fb6b3;\n --nw-border: #244341;\n --nw-accent: #2dd4bf;\n --nw-accent-strong: #14b8a6;\n --nw-accent-soft: #0f3835;\n --nw-shadow: 0 18px 50px rgb(0 0 0 / 30%);\n}\n\n* {\n box-sizing: border-box;\n}\n\nbody {\n margin: 0;\n background: var(--nw-bg);\n color: var(--nw-text);\n}\n\nbutton {\n font: inherit;\n}\n\n.nw-shell {\n min-height: 100vh;\n padding: 14px;\n background: var(--nw-bg);\n color: var(--nw-text);\n}\n\n.nw-card {\n max-width: 720px;\n margin: 0 auto;\n background: var(--nw-surface);\n border: 1px solid var(--nw-border);\n border-radius: var(--nw-radius);\n box-shadow: var(--nw-shadow);\n overflow: hidden;\n}\n\n.nw-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--nw-border);\n}\n\n.nw-icon svg {\n width: 26px;\n height: 26px;\n fill: none;\n stroke: var(--nw-accent);\n stroke-width: 1.7;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.nw-title-block {\n flex: 1;\n min-width: 0;\n}\n\n.nw-title {\n margin: 0;\n font-size: 17px;\n font-weight: 700;\n}\n\n.nw-subtitle {\n margin: 2px 0 0;\n font-size: 13px;\n color: var(--nw-muted);\n}\n\n.nw-chip {\n padding: 4px 10px;\n border-radius: 999px;\n background: var(--nw-accent-soft);\n color: var(--nw-accent-strong);\n font-size: 12px;\n font-weight: 600;\n}\n\n.nw-carousel {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.nw-dest {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px;\n border: 1px solid var(--nw-border);\n border-radius: 12px;\n background: var(--nw-bg);\n}\n\n.nw-dest-active {\n border-color: var(--nw-accent);\n box-shadow: 0 0 0 1px var(--nw-accent);\n}\n\n.nw-dest-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n}\n\n.nw-dest-name {\n font-weight: 700;\n}\n\n.nw-price {\n color: var(--nw-accent-strong);\n font-size: 12px;\n font-weight: 600;\n}\n\n.nw-dest-region {\n margin: 0;\n font-size: 12px;\n color: var(--nw-muted);\n}\n\n.nw-dest-why {\n margin: 0;\n font-size: 13px;\n flex: 1;\n}\n\n.nw-actions {\n display: flex;\n gap: 8px;\n padding: 0 16px 12px;\n}\n\n.nw-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 9px 14px;\n border: 1px solid var(--nw-border);\n border-radius: 10px;\n background: var(--nw-bg);\n color: var(--nw-text);\n cursor: pointer;\n}\n\n.nw-button svg {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.7;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.nw-button-ghost {\n align-self: flex-start;\n padding: 6px 12px;\n font-size: 13px;\n}\n\n.nw-button-primary {\n background: var(--nw-accent);\n border-color: var(--nw-accent);\n color: #ffffff;\n font-weight: 600;\n}\n\n.nw-button-primary:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.nw-note {\n margin: 0;\n padding: 0 16px 16px;\n font-size: 12px;\n color: var(--nw-muted);\n}\n" },
43
43
  { relPath: "examples/acme-discovery/test/server.test.ts", content: "import { describe, expect, it } from 'vitest';\nimport app from '../src/server.js';\n\ndescribe('acme-discovery example', () => {\n it('exports a Noodle server definition', () => {\n expect(typeof app.toManifest).toBe('function');\n });\n\n it('declares the off-app handoff domain the deep link lands on', async () => {\n // Top-of-funnel: the only external target is Acme's booking site, declared once at the server.\n const manifest = await app.toManifest();\n expect(JSON.stringify(manifest)).toContain('https://book.acme.example');\n });\n\n it('exposes the discovery tool and the handoff tool', async () => {\n const manifest = await app.toManifest();\n const text = JSON.stringify(manifest);\n // The discovery tool renders the carousel; the handoff tool emits the deep link; the widget-only\n // helper records a shortlist.\n expect(text).toContain('discover_getaways');\n expect(text).toContain('create_handoff');\n expect(text).toContain('shortlist_getaway');\n });\n\n it('gives the public website a consultative surface-specific goal', async () => {\n const manifest = await app.toManifest();\n expect(manifest.server.assistant?.model).toEqual({ kind: 'noodle-managed' });\n expect(manifest.server.assistant?.surfaces?.[0]?.instructions).toContain(\n 'friendly, consultative travel guide',\n );\n });\n\n it('keeps the lead capture behind explicit confirmation and a managed customer sink', async () => {\n const manifest = (await app.toManifest()) as {\n tools: { name: string; annotations?: Record<string, unknown> }[];\n };\n const captureLead = manifest.tools.find((tool) => tool.name === 'capture_lead');\n // The confirmation card is the visitor's consent moment (ADR 0214): a lead may never leave the\n // conversation without it, and the sink endpoint/credential stay operator-managed data.\n expect(captureLead?.annotations?.confirm).toBe(true);\n const catalog = JSON.stringify(\n (app as unknown as { toConnectorCatalog: () => unknown }).toConnectorCatalog(),\n );\n expect(catalog).toContain('${env.LEAD_SINK_URL}');\n expect(catalog).toContain('LEAD_SINK_TOKEN');\n // Fixed attribution set in the request mapping, never model-supplied; no named vendor host.\n expect(catalog).toContain('website-assistant');\n expect(catalog).not.toContain('api.resend.com');\n expect(catalog).not.toContain('api.hubapi.com');\n });\n\n it('serves a mixed marketing surface and an authenticated account surface from one server', async () => {\n const manifest = await app.toManifest();\n const surfaces = manifest.server.assistant?.surfaces ?? [];\n expect(surfaces.map((surface) => surface.mode)).toEqual(['mixed', 'authenticated']);\n // The sign-in trigger is listed on the mixed surface so the assistant can offer it; the\n // authenticated surface carries its own narrowed list and voice.\n const capabilityNames = (surface: (typeof surfaces)[number]) =>\n surface.capabilities?.map((capability) => capability.name) ?? [];\n expect(capabilityNames(surfaces[0]!)).toContain('my_trips');\n expect(capabilityNames(surfaces[0]!)).toContain('capture_lead');\n expect(capabilityNames(surfaces[1]!)).toEqual([\n 'destinations',\n 'discover_getaways',\n 'create_handoff',\n 'my_trips',\n ]);\n // Authoring the sign-up label is the opt-in for the card's create-account button.\n expect(manifest.server.assistant?.labels?.signUpAction).toBe('Create free account');\n });\n\n it('opens the marketing surface to browser agents and leaves the account surface closed', async () => {\n const manifest = await app.toManifest();\n const surfaces = manifest.server.assistant?.surfaces ?? [];\n\n // Both front doors, asserted by count first: without it the per-surface claims below read a\n // missing surface as `undefined` and pass, so deleting a surface would silently satisfy them.\n expect(surfaces).toHaveLength(2);\n // ADR 0220: the opt-in governs *discovery* — whether the embed registers this session's already\n // projected tools with `document.modelContext`. A browser agent on Acme's marketing page reaches\n // exactly the six capabilities above, over the same authorization, confirmation, and budget path\n // the panel's own calls take. `capture_lead` still stops for its confirmation card.\n expect(surfaces[0]?.webmcp).toEqual({ enabled: true });\n // Per-surface opt-in exists so the two front doors can answer differently, and here they do: the\n // signed-in account surface carries a traveler's identity, so its tools are not advertised to\n // whatever agent happens to be running in that browser.\n expect(surfaces[1]?.webmcp).toBeUndefined();\n });\n\n it('declares the grounded knowledge component and its live site scope', async () => {\n const manifest = (await app.toManifest()) as { server: { knowledge?: unknown[] } };\n // One declaration: controlled files plus the live public site, compiled later into the\n // generated `search_destinations` capability with citations.\n expect(manifest.server.knowledge).toHaveLength(1);\n const text = JSON.stringify(manifest);\n expect(text).toContain('knowledge/product.md');\n expect(text).toContain('https://getaways.acme.example');\n });\n});\n" },
@@ -30,6 +30,7 @@ export const CLI_COMMANDS = [
30
30
  'design',
31
31
  'audit',
32
32
  'knowledge',
33
+ 'capabilities',
33
34
  'billing',
34
35
  'logs',
35
36
  'metrics',
@@ -102,6 +103,7 @@ export const SDK_EXPORTS = [
102
103
  'tavily',
103
104
  'tool',
104
105
  'variable',
106
+ 'webExtract',
105
107
  'when',
106
108
  'z',
107
109
  ];
@@ -236,9 +236,10 @@ export function renderAuthoringWorkflowReference() {
236
236
  '',
237
237
  '## Managed capability reuse',
238
238
  '',
239
- 'Before authoring an HTTP connector for public-web search, page extraction, places/local search, routing, weather, translation, or media discovery, inspect the generated SDK surface reference. If the matching Noodle capability is actually exported, use its one documented declaration and generated tools directly—never wrap it, rename it, or build an assistant-only provider call. That single declaration is available to both the embedded assistant and external MCP agents under the same authorization and policy.',
239
+ 'Before authoring an HTTP connector for public-web search, page extraction, places/local search, routing, weather, translation, or media discovery, inspect the generated SDK surface reference. If the matching Noodle capability is actually exported, use its one documented declaration and generated tools; do not invent a parallel provider connector or an assistant-only fetcher. Business tools may compose its documented operation. The same declaration serves both the embedded assistant and external MCP agents under the same authorization and policy.',
240
240
  '',
241
- 'Use `provider: noodleManaged()` in reusable capability intent and let the app/environment operator bind a supported BYO provider through managed configuration. Keep provider names, endpoints, and credentials out of `server.ts`. Live fares, inventory, bookings, pricing, orders, accounts, and payments remain connectors to authoritative systems. Source order is not truth: preserve citations, freshness, and rights evidence returned by the capability.',
241
+ 'Explicit page reading is `webExtract("public_pages", { title: "Read public pages", description: "Read selected public pages as untrusted evidence.", provider: noodleManaged(), policy: { maxUrls: 3 } })`. Register it in `server(..., { capabilities: [pages], ... }, tools)`; the generated ordinary tool is `extract_public_pages` with `{ urls: [...] }`. Include the declaration in an assistant surface allowlist to expose it there. Composed business tools may use `ctx.capabilities.public_pages.extract({ urls: ctx.input.urls })` and return a normal object mapping. No model or business brief is hidden inside extraction.',
242
+ 'This extraction-only learning cohort is managed-only and off until the operator enables the exact app/environment with `noodle capabilities configure`. Use `inspect` for effective limits and `test --mode fixture|live` for explicit diagnostics. It reads bounded public HTTPS HTML, respects robots, and never browses authenticated pages, runs JavaScript, crawls recursively or adds visitor pages to knowledge. General search and BYO capability binding are not shipped by this cohort. Keep provider names, endpoints and credentials out of declarations. Live fares, inventory, bookings, prices, orders, accounts and payments remain connectors to authoritative systems.',
242
243
  '',
243
244
  'A roadmap is not an SDK. If the capability is absent from the generated export list, do not invent an import or generic platform helper. With explicit developer agreement, a bounded application connector may prove the immediate use case; keep it application-specific and do not claim it as the canonical Noodle primitive.',
244
245
  '',
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodle-borg/agent-kit",
3
- "version": "0.104.0",
3
+ "version": "0.105.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "engines": {
@@ -21,6 +21,7 @@ export type AssistantToolDispatch = {
21
21
  } | {
22
22
  readonly kind: 'tool_result';
23
23
  readonly output: unknown;
24
+ readonly ephemeral?: boolean;
24
25
  };
25
26
  /** Apply the same confirmation and suspend/resume policy to one model-proposed tool call. */
26
27
  export declare function dispatchAssistantTool(input: {
@@ -1,7 +1,7 @@
1
1
  import { ADMISSION_DEFAULTS } from '@noodle-borg/admission-limits/portable';
2
2
  import { requiresToolConfirmation } from '@noodle-borg/compiler';
3
3
  import { evaluateToolAuthorization } from '@noodle-borg/protocol';
4
- import { executeToolInteractive, prepareToolForConfirmation } from '@noodle-borg/runtime';
4
+ import { executeToolInteractive, hasEphemeralEvidence, prepareToolForConfirmation, } from '@noodle-borg/runtime';
5
5
  import { withAssistantSessionExecutionAuthority } from './assistant-customer-routing.js';
6
6
  import { assistantModelToolOncePerSession } from './assistant-guide.js';
7
7
  import { AssistantInteractionCapacityError, } from './assistant-interaction-state.js';
@@ -139,6 +139,9 @@ async function dispatchClaimedAssistantTool(input) {
139
139
  }
140
140
  return {
141
141
  kind: 'tool_result',
142
+ ...(result.status === 'completed' && hasEphemeralEvidence(result.output)
143
+ ? { ephemeral: true }
144
+ : {}),
142
145
  output: result.status === 'completed'
143
146
  ? assistantSafeOutput(input.tool.outputSchema, result.output)
144
147
  : result.status === 'failed'
@@ -143,12 +143,12 @@ interface SessionClaimDeclaration {
143
143
  * module it is used from.
144
144
  */
145
145
  export interface CapabilityRef {
146
- readonly kind: 'tool' | 'resource' | 'prompt' | 'knowledge';
146
+ readonly kind: 'tool' | 'resource' | 'prompt' | 'knowledge' | 'web-extract';
147
147
  readonly name: string;
148
148
  }
149
149
  /** One projected capability as it appears in compiled data. */
150
150
  export interface AssistantCapability {
151
- readonly kind: CapabilityRef['kind'];
151
+ readonly kind: Exclude<CapabilityRef['kind'], 'web-extract'>;
152
152
  readonly name: string;
153
153
  }
154
154
  /**
@@ -135,7 +135,9 @@ function normalizeCapabilities(capabilities) {
135
135
  if (seen.has(key))
136
136
  continue;
137
137
  seen.add(key);
138
- normalized.push({ kind: capability.kind, name: capability.name });
138
+ normalized.push(capability.kind === 'web-extract'
139
+ ? { kind: 'tool', name: `extract_${capability.name}` }
140
+ : { kind: capability.kind, name: capability.name });
139
141
  }
140
142
  return normalized;
141
143
  }
@@ -17,6 +17,7 @@ export { type ManagedCollectionDeclaration, type ManagedCollectionInput, type Ma
17
17
  export { noodlePlatform, noodlePlatformCatalog } from './platform.js';
18
18
  export { type Cond, type ConnectorClient, type Ref, type SymbolicScope, when, } from './recording.js';
19
19
  export { annotations, asset, type BrandThemeTokens, type ElicitationOptions, isServerDefinition, type PromptArgument, type PromptOptions, prompt, type ResourceContext, type ResourceFulfilResult, type ResourceOptions, resource, type ServerComponent, type ServerDefinition, type ServerOptions, server, type ToolAuthorizationOptions, type ToolContext, type ToolOptions, type ToolViewOptions, tool, type WidgetCsp, type WidgetPermissionGrant, type WidgetPermissions, widgetResult, } from './server.js';
20
+ export { type WebExtractDeclaration, type WebExtractOptions, webExtract, } from './web-capabilities.js';
20
21
  export type { ConnectorFile, HttpConnectorDef };
21
22
  export { z };
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -12,5 +12,6 @@ export { managedCollection, } from './managed-collection.js';
12
12
  export { noodlePlatform, noodlePlatformCatalog } from './platform.js';
13
13
  export { when, } from './recording.js';
14
14
  export { annotations, asset, isServerDefinition, prompt, resource, server, tool, widgetResult, } from './server.js';
15
+ export { webExtract, } from './web-capabilities.js';
15
16
  export { z };
16
17
  //# sourceMappingURL=index.js.map
@@ -33,7 +33,7 @@ export function prepareAuthoringRuntimeDir(dir, options) {
33
33
  './react': './react.mjs',
34
34
  },
35
35
  }));
36
- writeFileSync(join(self, 'index.mjs'), "export { algolia, annotations, asset, authenticatedWebsite, bind, clientCredentials, connector, connection, customerAuth, customerEndpoint, embeddedAssistant, externalExchange, file, firecrawl, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, managedCollection, managedSecret, meilisearch, noodleManaged, noodlePlatform, openAICompatible, prompt, publicWebsite, resource, secret, server, site, tavily, tool, variable, when, z } from '@noodle-borg/authoring';\n");
36
+ writeFileSync(join(self, 'index.mjs'), "export { algolia, annotations, asset, authenticatedWebsite, bind, clientCredentials, connector, connection, customerAuth, customerEndpoint, embeddedAssistant, externalExchange, file, firecrawl, gmailConnector, googleWorkloadIdentity, handoffSession, knowledge, managedCollection, managedSecret, meilisearch, noodleManaged, noodlePlatform, openAICompatible, prompt, publicWebsite, resource, secret, server, site, tavily, tool, variable, webExtract, when, z } from '@noodle-borg/authoring';\n");
37
37
  writeFileSync(join(self, 'platform.mjs'), "export { noodlePlatform, noodlePlatformCatalog } from '@noodle-borg/authoring';\n");
38
38
  writeFileSync(join(self, 'react.mjs'), "export * from '@noodle-borg/authoring/react';\n");
39
39
  }
@@ -1,6 +1,7 @@
1
1
  import type { ConnectorRef } from './connectors.js';
2
2
  import type { AmbientContextOptions } from './context.js';
3
3
  import type { ResourceContext, ToolOptions } from './server.js';
4
+ import type { WebExtractDeclaration } from './web-capabilities.js';
4
5
  export type SymbolicScope = Ref & Record<string, Ref>;
5
6
  export type ConnectorClient = Record<string, (args?: Readonly<Record<string, unknown>>) => SymbolicScope>;
6
7
  type RecordedStep = {
@@ -17,7 +18,7 @@ type RecordedStep = {
17
18
  readonly if?: string;
18
19
  };
19
20
  export declare function when<T>(condition: Cond, record: () => T): T;
20
- export declare function recordTool(fulfil: ToolOptions['fulfil'], connectors: Readonly<Record<string, ConnectorRef>>): Promise<{
21
+ export declare function recordTool(fulfil: ToolOptions['fulfil'], connectors: Readonly<Record<string, ConnectorRef>>, capabilities?: readonly WebExtractDeclaration[]): Promise<{
21
22
  steps: RecordedStep[];
22
23
  output: Record<string, unknown>;
23
24
  }>;