@every-app/sdk 0.3.0-rc.8 → 0.3.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 (146) hide show
  1. package/README.md +75 -74
  2. package/dist/cloudflare/catalogSettings.generated.d.ts +20 -6
  3. package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -1
  4. package/dist/cloudflare/catalogSettings.generated.js +45 -14
  5. package/dist/cloudflare/index.d.ts +1 -1
  6. package/dist/cloudflare/index.d.ts.map +1 -1
  7. package/dist/cloudflare/sentinel.d.ts +3 -0
  8. package/dist/cloudflare/sentinel.d.ts.map +1 -1
  9. package/dist/cloudflare/sentinel.js +10 -0
  10. package/dist/cloudflare/worker.d.ts +67 -23
  11. package/dist/cloudflare/worker.d.ts.map +1 -1
  12. package/dist/cloudflare/worker.js +68 -32
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/internal/aiDefault.d.ts +36 -79
  16. package/dist/internal/aiDefault.d.ts.map +1 -1
  17. package/dist/internal/aiDefault.js +47 -149
  18. package/dist/internal/aiProviders.d.ts +1 -1
  19. package/dist/internal/aiProviders.d.ts.map +1 -1
  20. package/dist/internal/aiProviders.js +2 -2
  21. package/dist/internal/appSettings.d.ts +140 -89
  22. package/dist/internal/appSettings.d.ts.map +1 -1
  23. package/dist/internal/appSettings.js +264 -156
  24. package/dist/internal/capabilities.d.ts +145 -503
  25. package/dist/internal/capabilities.d.ts.map +1 -1
  26. package/dist/internal/capabilities.js +29 -550
  27. package/dist/internal/catalog/commerce.js +1 -1
  28. package/dist/internal/catalog/comms.d.ts +37 -0
  29. package/dist/internal/catalog/comms.d.ts.map +1 -1
  30. package/dist/internal/catalog/comms.js +43 -0
  31. package/dist/internal/catalog/index.d.ts +72 -0
  32. package/dist/internal/catalog/index.d.ts.map +1 -1
  33. package/dist/internal/catalog/infra.d.ts +35 -0
  34. package/dist/internal/catalog/infra.d.ts.map +1 -1
  35. package/dist/internal/catalog/infra.js +65 -0
  36. package/dist/internal/devProviders.d.ts +1 -19
  37. package/dist/internal/devProviders.d.ts.map +1 -1
  38. package/dist/internal/devProviders.js +7 -1
  39. package/dist/internal/events.d.ts +52 -1
  40. package/dist/internal/events.d.ts.map +1 -1
  41. package/dist/internal/events.js +66 -2
  42. package/dist/internal/gatewaySettings.d.ts +6 -16
  43. package/dist/internal/gatewaySettings.d.ts.map +1 -1
  44. package/dist/internal/gatewaySettings.js +6 -24
  45. package/dist/internal/index.d.ts +1 -0
  46. package/dist/internal/index.d.ts.map +1 -1
  47. package/dist/internal/index.js +1 -0
  48. package/dist/internal/mcpOAuth.d.ts +210 -0
  49. package/dist/internal/mcpOAuth.d.ts.map +1 -0
  50. package/dist/internal/mcpOAuth.js +735 -0
  51. package/dist/internal/oauthClient.d.ts +7 -47
  52. package/dist/internal/oauthClient.d.ts.map +1 -1
  53. package/dist/internal/oauthClient.js +1 -115
  54. package/dist/internal/oauthPresets.d.ts +356 -20
  55. package/dist/internal/oauthPresets.d.ts.map +1 -1
  56. package/dist/internal/oauthPresets.js +183 -861
  57. package/dist/internal/oauthScopes.d.ts +43 -155
  58. package/dist/internal/oauthScopes.d.ts.map +1 -1
  59. package/dist/internal/oauthScopes.js +82 -475
  60. package/dist/internal/oauthSpec.d.ts +28 -71
  61. package/dist/internal/oauthSpec.d.ts.map +1 -1
  62. package/dist/internal/oauthSpec.js +172 -448
  63. package/dist/internal/protocol.d.ts +39 -15
  64. package/dist/internal/protocol.d.ts.map +1 -1
  65. package/dist/internal/protocol.js +40 -7
  66. package/dist/internal/providerApps.d.ts +2 -2
  67. package/dist/internal/providerApps.js +2 -2
  68. package/dist/internal/providerRegistry.d.ts +5 -64
  69. package/dist/internal/providerRegistry.d.ts.map +1 -1
  70. package/dist/internal/providerRegistry.js +19 -118
  71. package/dist/internal/providerSpec.d.ts.map +1 -1
  72. package/dist/internal/providerSpec.js +14 -36
  73. package/dist/internal/remoteMcp.d.ts +191 -47
  74. package/dist/internal/remoteMcp.d.ts.map +1 -1
  75. package/dist/internal/remoteMcp.js +338 -133
  76. package/dist/internal/signInProviders.d.ts +1 -1
  77. package/dist/internal/signInProviders.d.ts.map +1 -1
  78. package/dist/internal/tools.d.ts +15 -8
  79. package/dist/internal/tools.d.ts.map +1 -1
  80. package/dist/internal/tools.js +9 -8
  81. package/dist/manifest.d.ts +96 -28
  82. package/dist/manifest.d.ts.map +1 -1
  83. package/dist/manifest.js +1 -1
  84. package/dist/server/ai.d.ts +1 -93
  85. package/dist/server/ai.d.ts.map +1 -1
  86. package/dist/server/ai.js +17 -111
  87. package/dist/server/attribution.d.ts +10 -1
  88. package/dist/server/attribution.d.ts.map +1 -1
  89. package/dist/server/attribution.js +7 -1
  90. package/dist/server/connectUrl.d.ts +4 -9
  91. package/dist/server/connectUrl.d.ts.map +1 -1
  92. package/dist/server/connectUrl.js +17 -14
  93. package/dist/server/context.d.ts +12 -14
  94. package/dist/server/context.d.ts.map +1 -1
  95. package/dist/server/context.js +23 -25
  96. package/dist/server/emit.d.ts.map +1 -1
  97. package/dist/server/emit.js +2 -2
  98. package/dist/server/env.d.ts +3 -0
  99. package/dist/server/env.d.ts.map +1 -1
  100. package/dist/server/eventsEndpoint.d.ts +48 -0
  101. package/dist/server/eventsEndpoint.d.ts.map +1 -0
  102. package/dist/server/eventsEndpoint.js +145 -0
  103. package/dist/server/everyApp.d.ts +16 -26
  104. package/dist/server/everyApp.d.ts.map +1 -1
  105. package/dist/server/everyApp.js +22 -46
  106. package/dist/server/gatewayFetch.d.ts +19 -1
  107. package/dist/server/gatewayFetch.d.ts.map +1 -1
  108. package/dist/server/gatewayFetch.js +45 -3
  109. package/dist/server/index.d.ts +6 -9
  110. package/dist/server/index.d.ts.map +1 -1
  111. package/dist/server/index.js +4 -8
  112. package/dist/server/integrationFetch.d.ts +60 -72
  113. package/dist/server/integrationFetch.d.ts.map +1 -1
  114. package/dist/server/integrationFetch.js +124 -397
  115. package/dist/server/listMembers.d.ts.map +1 -1
  116. package/dist/server/listMembers.js +2 -2
  117. package/dist/server/refusal.d.ts +0 -9
  118. package/dist/server/refusal.d.ts.map +1 -1
  119. package/dist/server/refusal.js +0 -22
  120. package/dist/server/sendEmail.d.ts.map +1 -1
  121. package/dist/server/sendEmail.js +2 -2
  122. package/dist/server/tools.d.ts +17 -6
  123. package/dist/server/tools.d.ts.map +1 -1
  124. package/dist/server/tools.js +14 -4
  125. package/dist/server/toolsEndpoint.d.ts +2 -1
  126. package/dist/server/toolsEndpoint.d.ts.map +1 -1
  127. package/dist/server/toolsEndpoint.js +4 -3
  128. package/dist/server/webhooks.d.ts +56 -0
  129. package/dist/server/webhooks.d.ts.map +1 -0
  130. package/dist/server/webhooks.js +205 -0
  131. package/dist/testing/index.d.ts +2 -3
  132. package/dist/testing/index.d.ts.map +1 -1
  133. package/dist/testing/index.js +2 -6
  134. package/package.json +6 -1
  135. package/dist/server/aiBinding.d.ts +0 -68
  136. package/dist/server/aiBinding.d.ts.map +0 -1
  137. package/dist/server/aiBinding.js +0 -294
  138. package/dist/server/authorizeUrl.d.ts +0 -43
  139. package/dist/server/authorizeUrl.d.ts.map +0 -1
  140. package/dist/server/authorizeUrl.js +0 -106
  141. package/dist/server/emailBinding.d.ts +0 -72
  142. package/dist/server/emailBinding.d.ts.map +0 -1
  143. package/dist/server/emailBinding.js +0 -124
  144. package/dist/server/fromMcpTools.d.ts +0 -89
  145. package/dist/server/fromMcpTools.d.ts.map +0 -1
  146. package/dist/server/fromMcpTools.js +0 -192
@@ -1 +1 @@
1
- {"version":3,"file":"listMembers.d.ts","sourceRoot":"","sources":["../../src/server/listMembers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAK1B,MAAM,WAAW,kBAAkB;IACjC,8FAA8F;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,EAChC,GAAG,EACH,GAAG,EAAE,cAAc,GACpB,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBjD"}
1
+ {"version":3,"file":"listMembers.d.ts","sourceRoot":"","sources":["../../src/server/listMembers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAS1B,MAAM,WAAW,kBAAkB;IACjC,8FAA8F;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,EAChC,GAAG,EACH,GAAG,EAAE,cAAc,GACpB,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkBjD"}
@@ -1,7 +1,7 @@
1
1
  import { ConfigurationError, serviceRoutePath, } from "../internal/index.js";
2
2
  import { applyAttribution, attributionFor, isRequest, } from "./attribution.js";
3
3
  import { getEveryAppUser } from "./everyApp.js";
4
- import { BINDING_ORIGIN } from "./gatewayFetch.js";
4
+ import { BINDING_ORIGIN, gatewayBinding, } from "./gatewayFetch.js";
5
5
  import { GatewayRefusalError, gatewayRefusal } from "./refusal.js";
6
6
  /**
7
7
  * The organization's members who can open the app now, through the
@@ -22,7 +22,7 @@ import { GatewayRefusalError, gatewayRefusal } from "./refusal.js";
22
22
  export async function listMembers({ env, for: explicitTarget, }) {
23
23
  const target = attributionFor(env, explicitTarget, "listMembers");
24
24
  const values = env;
25
- const binding = values["EVERY_APP_GATEWAY"];
25
+ const binding = gatewayBinding(env);
26
26
  if (binding) {
27
27
  if (typeof binding.fetch !== "function") {
28
28
  throw new ConfigurationError("EVERY_APP_GATEWAY is configured but is not a valid service binding.");
@@ -14,8 +14,6 @@ export interface GatewayRefusal extends SetupInfo {
14
14
  code: string;
15
15
  message: string;
16
16
  }
17
- /** The refusal codes that mean no model is set up for the call. */
18
- export declare const AI_NOT_CONFIGURED_CODES: readonly string[];
19
17
  /**
20
18
  * A refusal the AppGateway binding made, thrown: what `sendEmail()` throws
21
19
  * when the gateway won't send (`email_sender_not_allowed`,
@@ -45,11 +43,4 @@ export declare function gatewayRefusal(response: Response): Promise<GatewayRefus
45
43
  * (`ai_provider_not_configured`, status 503, the `.dev.vars` names).
46
44
  */
47
45
  export declare function refusalFromError(error: unknown): GatewayRefusal | null;
48
- /**
49
- * Whether `error` (or a refusal already read) means no model is set up:
50
- * `ai_provider_not_configured` or `ai_default_not_configured`, from the
51
- * Gateway or, in local development, from the SDK with no key in
52
- * `.dev.vars`. Show `refusalFromError(error).setup` to the person.
53
- */
54
- export declare function isAiNotConfigured(error: unknown): boolean;
55
46
  //# sourceMappingURL=refusal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../src/server/refusal.ts"],"names":[],"mappings":"AAgBA,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mEAAmE;AACnE,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAGpD,CAAC;AAEF;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAM,YAAW,cAAc;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEpB,EACV,MAAM,EACN,IAAI,EACJ,OAAO,EACP,QAAa,EACb,KAAY,EACZ,OAAc,GACf,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;CAS5E;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAKhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAWtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzD"}
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../src/server/refusal.ts"],"names":[],"mappings":"AAgBA,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAM,YAAW,cAAc;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEpB,EACV,MAAM,EACN,IAAI,EACJ,OAAO,EACP,QAAa,EACb,KAAY,EACZ,OAAc,GACf,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;CAS5E;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAKhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAWtE"}
@@ -13,11 +13,6 @@
13
13
  * match the message text or hardcode a setting name or a command.
14
14
  */
15
15
  import { ConfigurationError, GATEWAY_ERROR_HEADER } from "../internal/index.js";
16
- /** The refusal codes that mean no model is set up for the call. */
17
- export const AI_NOT_CONFIGURED_CODES = [
18
- "ai_provider_not_configured",
19
- "ai_default_not_configured",
20
- ];
21
16
  /**
22
17
  * A refusal the AppGateway binding made, thrown: what `sendEmail()` throws
23
18
  * when the gateway won't send (`email_sender_not_allowed`,
@@ -73,23 +68,6 @@ export function refusalFromError(error) {
73
68
  }
74
69
  return null;
75
70
  }
76
- /**
77
- * Whether `error` (or a refusal already read) means no model is set up:
78
- * `ai_provider_not_configured` or `ai_default_not_configured`, from the
79
- * Gateway or, in local development, from the SDK with no key in
80
- * `.dev.vars`. Show `refusalFromError(error).setup` to the person.
81
- */
82
- export function isAiNotConfigured(error) {
83
- const refusal = isRefusal(error) ? error : refusalFromError(error);
84
- return refusal !== null && AI_NOT_CONFIGURED_CODES.includes(refusal.code);
85
- }
86
- function isRefusal(value) {
87
- return (!!value &&
88
- typeof value === "object" &&
89
- !(value instanceof Error) &&
90
- typeof value.code === "string" &&
91
- typeof value.status === "number");
92
- }
93
71
  function refusalHere(error) {
94
72
  // A Response is read with gatewayRefusal(), which can read its body.
95
73
  if (error instanceof Response)
@@ -1 +1 @@
1
- {"version":3,"file":"sendEmail.d.ts","sourceRoot":"","sources":["../../src/server/sendEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAeL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAAC,EAC9B,GAAG,EACH,GAAG,EAAE,cAAc,EACnB,OAAO,GACR,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB7C"}
1
+ {"version":3,"file":"sendEmail.d.ts","sourceRoot":"","sources":["../../src/server/sendEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAeL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAQ1B,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAAC,EAC9B,GAAG,EACH,GAAG,EAAE,cAAc,EACnB,OAAO,GACR,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB7C"}
@@ -1,6 +1,6 @@
1
1
  import { ConfigurationError, EMAIL_SENDERS_ENV, emailDomain, emailProviderRefusal, emailRestBody, emailRestUrl, emailSenderRefusal, parseEmailList, parseEmailSender, parseSendEmailMessage, readEmailRestResponse, senderAllowed, serviceRoutePath, } from "../internal/index.js";
2
2
  import { applyAttribution, attributionFor, } from "./attribution.js";
3
- import { BINDING_ORIGIN } from "./gatewayFetch.js";
3
+ import { BINDING_ORIGIN, gatewayBinding, } from "./gatewayFetch.js";
4
4
  import { GatewayRefusalError, gatewayRefusal } from "./refusal.js";
5
5
  /**
6
6
  * Send an email through the gateway's `email` capability: its sender
@@ -22,7 +22,7 @@ import { GatewayRefusalError, gatewayRefusal } from "./refusal.js";
22
22
  export async function sendEmail({ env, for: explicitTarget, message, }) {
23
23
  const target = attributionFor(env, explicitTarget, "sendEmail");
24
24
  const values = env;
25
- const binding = values["EVERY_APP_GATEWAY"];
25
+ const binding = gatewayBinding(env);
26
26
  if (binding) {
27
27
  if (typeof binding.fetch !== "function") {
28
28
  throw new ConfigurationError("EVERY_APP_GATEWAY is configured but is not a valid service binding.");
@@ -17,7 +17,8 @@
17
17
  *
18
18
  * Apps never speak MCP. The gateway snapshots this catalog at deploy, serves
19
19
  * MCP clients from the snapshot, and calls a tool over the internal tools
20
- * contract (../internal/tools.ts) with a verified `chan: "mcp"` identity.
20
+ * contract (../internal/tools.ts) with a verified `chan: "mcp"`
21
+ * identity.
21
22
  *
22
23
  * `input` and `output` accept any validator implementing Standard Schema and
23
24
  * Standard JSON Schema (zod >= 4.2 does both), or a plain
@@ -25,7 +26,10 @@
25
26
  */
26
27
  import { type EveryAppUser, type ToolCallResultV1, type ToolDescriptorV1, type ToolIssueV1, type ToolRisk } from "../internal/index.js";
27
28
  import type { ExecutionContextLike } from "./everyApp.js";
28
- /** Reported with every catalog; must match package.json. */
29
+ /**
30
+ * Reported with every catalog; must match package.json (a test checks).
31
+ * `pnpm release <version>` (scripts/release.mjs) sets both in one commit.
32
+ */
29
33
  export declare const SDK_VERSION = "0.3.0";
30
34
  /**
31
35
  * Throw from a tool handler to return an error the model can read and act on
@@ -81,7 +85,10 @@ export interface PlainToolSchema<Output = unknown> {
81
85
  export type ToolSchema<Output = unknown> = StandardSchemaWithJSON<unknown, Output> | PlainToolSchema<Output>;
82
86
  /** What a tool handler receives besides its validated input. */
83
87
  export interface ToolContext<TEnv = Cloudflare.Env> {
84
- /** The verified caller. `channel` is "mcp"; `toolCall` names this call. */
88
+ /**
89
+ * The verified caller. `channel` is "mcp" (an AI client); `toolCall`
90
+ * names this call.
91
+ */
85
92
  user: EveryAppUser;
86
93
  env: TEnv;
87
94
  ctx: ExecutionContextLike;
@@ -95,11 +102,15 @@ export interface ToolDefinition<TInput = unknown> {
95
102
  /** What the tool does and when to use it. The model reads this. */
96
103
  description: string;
97
104
  /**
98
- * `read` changes nothing. `write` creates or changes data. `destructive`
99
- * deletes or irreversibly changes data; AI clients can't see or call
100
- * destructive tools until approvals exist.
105
+ * `read` changes nothing; read-only connections and tokens may call it.
106
+ * `write` creates, changes or deletes data.
101
107
  */
102
108
  risk: ToolRisk;
109
+ /**
110
+ * A write tool that deletes or can't be undone. Clients see
111
+ * `destructiveHint: true` and ask the person before calling it.
112
+ */
113
+ destructive?: boolean;
103
114
  /** Arguments schema; must describe an object. */
104
115
  input: ToolSchema<TInput>;
105
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
@@ -17,14 +17,18 @@
17
17
  *
18
18
  * Apps never speak MCP. The gateway snapshots this catalog at deploy, serves
19
19
  * MCP clients from the snapshot, and calls a tool over the internal tools
20
- * contract (../internal/tools.ts) with a verified `chan: "mcp"` identity.
20
+ * contract (../internal/tools.ts) with a verified `chan: "mcp"`
21
+ * identity.
21
22
  *
22
23
  * `input` and `output` accept any validator implementing Standard Schema and
23
24
  * Standard JSON Schema (zod >= 4.2 does both), or a plain
24
25
  * `{ jsonSchema, validate }` pair. The SDK itself takes no dependency.
25
26
  */
26
27
  import { TOOL_NAME_PATTERN, catalogHash, isToolRisk, } from "../internal/index.js";
27
- /** Reported with every catalog; must match package.json. */
28
+ /**
29
+ * Reported with every catalog; must match package.json (a test checks).
30
+ * `pnpm release <version>` (scripts/release.mjs) sets both in one commit.
31
+ */
28
32
  export const SDK_VERSION = "0.3.0";
29
33
  const JSON_SCHEMA_TARGET = "draft-2020-12";
30
34
  const DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
@@ -114,7 +118,9 @@ function assertToolDefinition(name, definition) {
114
118
  throw problem("needs a description");
115
119
  }
116
120
  if (!isToolRisk(definition.risk)) {
117
- throw problem('needs a risk: "read", "write" or "destructive"');
121
+ throw problem(definition.risk === "destructive"
122
+ ? 'needs a risk: "read" or "write"; a tool that deletes is risk: "write" with destructive: true'
123
+ : 'needs a risk: "read" or "write"');
118
124
  }
119
125
  if (!isToolSchema(definition.input)) {
120
126
  throw problem("input must be a Standard Schema with JSON Schema support (zod >= 4.2) or { jsonSchema, validate }");
@@ -128,12 +134,15 @@ function assertToolDefinition(name, definition) {
128
134
  if (definition.title !== undefined && typeof definition.title !== "string") {
129
135
  throw problem("title must be a string");
130
136
  }
131
- for (const flag of ["idempotent", "openWorld"]) {
137
+ for (const flag of ["destructive", "idempotent", "openWorld"]) {
132
138
  if (definition[flag] !== undefined &&
133
139
  typeof definition[flag] !== "boolean") {
134
140
  throw problem(`${flag} must be a boolean`);
135
141
  }
136
142
  }
143
+ if (definition.destructive && definition.risk === "read") {
144
+ throw problem('is destructive, so its risk is "write"');
145
+ }
137
146
  }
138
147
  function isRecord(value) {
139
148
  return ((typeof value === "object" || typeof value === "function") && value !== null);
@@ -196,6 +205,7 @@ function describeTool(name, definition) {
196
205
  if (typeof outputSchema === "string")
197
206
  return outputSchema;
198
207
  const annotations = {
208
+ ...(definition.destructive ? { destructiveHint: true } : {}),
199
209
  ...(definition.idempotent !== undefined
200
210
  ? { idempotentHint: definition.idempotent }
201
211
  : {}),
@@ -7,7 +7,8 @@
7
7
  * - `/__everyapp/tools/list` needs the gateway's system token for this app
8
8
  * (purpose "tools.list"). It describes tools; it never runs them.
9
9
  * - `/__everyapp/tools/call` needs an identity token minted for this exact
10
- * call: `chan: "mcp"` plus a `tc` claim naming the tool and call id. The
10
+ * call: `chan: "mcp"` (an AI client's MCP connection) plus a `tc` claim
11
+ * naming the tool and call id. The
11
12
  * token's scopes must include the scope the tool's risk requires; `*` does
12
13
  * not count, because the ToolBus only ever mints explicit scopes.
13
14
  *
@@ -1 +1 @@
1
- {"version":3,"file":"toolsEndpoint.d.ts","sourceRoot":"","sources":["../../src/server/toolsEndpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAcL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAOL,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAoFD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B"}
1
+ {"version":3,"file":"toolsEndpoint.d.ts","sourceRoot":"","sources":["../../src/server/toolsEndpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAcL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAOL,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAoFD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B"}
@@ -7,7 +7,8 @@
7
7
  * - `/__everyapp/tools/list` needs the gateway's system token for this app
8
8
  * (purpose "tools.list"). It describes tools; it never runs them.
9
9
  * - `/__everyapp/tools/call` needs an identity token minted for this exact
10
- * call: `chan: "mcp"` plus a `tc` claim naming the tool and call id. The
10
+ * call: `chan: "mcp"` (an AI client's MCP connection) plus a `tc` claim
11
+ * naming the tool and call id. The
11
12
  * token's scopes must include the scope the tool's risk requires; `*` does
12
13
  * not count, because the ToolBus only ever mints explicit scopes.
13
14
  *
@@ -198,8 +199,8 @@ async function callTool(request, env, ctx, verify, options) {
198
199
  });
199
200
  let result;
200
201
  try {
201
- // The call runs in the request context like a page would: currentUser()
202
- // is the caller, and its Gateway calls are attributed to them.
202
+ // The call runs in the request context like a page would: its Gateway
203
+ // calls are attributed to the caller.
203
204
  const value = await serveRequest({ request, user, expiresAt }, () => tool.handler(input.value, {
204
205
  user,
205
206
  env: env,
@@ -0,0 +1,56 @@
1
+ export type WebhookProvider = "slack" | "github" | "everyapp";
2
+ export interface VerifyWebhookOptions {
3
+ provider: WebhookProvider;
4
+ /** The signing secret, or several while one rotates. Empty ones are ignored. */
5
+ secret: string | readonly string[];
6
+ /** How far a signed timestamp may be from now (Slack, EveryApp). Default 300 s. */
7
+ toleranceSeconds?: number;
8
+ /** The largest body read before giving up. Default 5 MiB. */
9
+ maxBytes?: number;
10
+ /** The clock, for tests. */
11
+ now?: Date;
12
+ }
13
+ export type WebhookRefusalReason =
14
+ /** No usable secret was passed: a configuration fault, never the sender's. */
15
+ "no_secret"
16
+ /** The provider's signature header is absent. */
17
+ | "missing_signature"
18
+ /** A signature or timestamp header that isn't the provider's shape. */
19
+ | "malformed"
20
+ /** The signed timestamp is outside the tolerance. */
21
+ | "expired"
22
+ /** The body is larger than `maxBytes`. */
23
+ | "too_large"
24
+ /** The body was already read, or its stream failed mid-read. */
25
+ | "unreadable"
26
+ /** No secret verifies the signature. */
27
+ | "mismatch";
28
+ export type WebhookVerification = {
29
+ ok: true;
30
+ /** The body exactly as signed. The request's own body is consumed: parse this. */
31
+ body: string;
32
+ /** The provider's id for this delivery, for deduplication; null when it sends none. */
33
+ deliveryId: string | null;
34
+ /** The signed timestamp in seconds; null for GitHub, which signs none. */
35
+ timestamp: number | null;
36
+ } | {
37
+ ok: false;
38
+ reason: WebhookRefusalReason;
39
+ };
40
+ /** The default body limit: well above Slack's payloads and most of GitHub's (whose cap is 25 MB). */
41
+ export declare const WEBHOOK_MAX_BYTES_DEFAULT: number;
42
+ /**
43
+ * Verify `request` as a `provider` webhook signed with `secret`. Reads the
44
+ * body (at most `maxBytes`) and returns it on success; never throws for a
45
+ * bad delivery, so a handler answers `401` on `{ ok: false }`. Throws a
46
+ * `TypeError` only for a programming error: an unknown `provider`, or a
47
+ * `toleranceSeconds` or `maxBytes` that is negative, NaN or infinite.
48
+ *
49
+ * ```ts
50
+ * const check = await verifyWebhook(request, { provider: "slack", secret: env.SLACK_SIGNING_SECRET });
51
+ * if (!check.ok) return new Response(null, { status: 401 });
52
+ * const params = new URLSearchParams(check.body);
53
+ * ```
54
+ */
55
+ export declare function verifyWebhook(request: Request, options: VerifyWebhookOptions): Promise<WebhookVerification>;
56
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/server/webhooks.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,CAAC;IAC1B,gFAAgF;IAChF,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,MAAM,oBAAoB;AAC9B,8EAA8E;AAC5E,WAAW;AACb,iDAAiD;GAC/C,mBAAmB;AACrB,uEAAuE;GACrE,WAAW;AACb,qDAAqD;GACnD,SAAS;AACX,0CAA0C;GACxC,WAAW;AACb,gEAAgE;GAC9D,YAAY;AACd,wCAAwC;GACtC,UAAU,CAAC;AAEf,MAAM,MAAM,mBAAmB,GAC3B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEhD,qGAAqG;AACrG,eAAO,MAAM,yBAAyB,QAAkB,CAAC;AAMzD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA4D9B"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * `verifyWebhook()`: check an inbound provider webhook on a route the
3
+ * manifest declares `public`, the way the provider signs it.
4
+ *
5
+ * The Gateway forwards a public route's body and headers untouched and
6
+ * verifies nothing (landing-page/content/agent/manifest.md, "Why a route is
7
+ * public"): the app checks the provider's signature itself, with the signing
8
+ * secret it declares in `secrets`. Every app that takes a webhook would
9
+ * otherwise write this HMAC code again, and the easy mistakes (a `===`
10
+ * compare, no timestamp window, verifying a re-serialized body, reading an
11
+ * unbounded body first) are the ones that matter. Proposed in
12
+ * docs/design/2026-11-birds-forcing-function.md (limitation 6).
13
+ *
14
+ * Supported signing schemes:
15
+ * - `slack`: `X-Slack-Signature: v0=<hex>` over `v0:<timestamp>:<body>`,
16
+ * with `X-Slack-Request-Timestamp` inside the tolerance;
17
+ * - `github`: `X-Hub-Signature-256: sha256=<hex>` over the body. GitHub
18
+ * signs no timestamp, so a replay is the receiver's to drop: dedupe on
19
+ * `deliveryId` (`X-GitHub-Delivery`);
20
+ * - `everyapp`: a Gateway's own event delivery, `X-EveryApp-Signature:
21
+ * t=<seconds>,v1=<hex>` over `<t>.<body>` (the same check as the
22
+ * Gateway's `verifyEventSignature`), deduped on `X-EveryApp-Event-Id`.
23
+ *
24
+ * WebCrypto only. The compare is `crypto.subtle.verify`, constant time.
25
+ * Several secrets may be given, so a secret rotates without a gap.
26
+ */
27
+ import { EVENT_HEADERS, EVENT_SIGNATURE_TOLERANCE_SECONDS, eventSigningInput, parseEventSignature, } from "../internal/events.js";
28
+ /** The default body limit: well above Slack's payloads and most of GitHub's (whose cap is 25 MB). */
29
+ export const WEBHOOK_MAX_BYTES_DEFAULT = 5 * 1024 * 1024;
30
+ const HEX_SHA256 = /^[0-9a-f]{64}$/i;
31
+ const MAX_EVENT_SIGNATURES = 4;
32
+ const encoder = new TextEncoder();
33
+ /**
34
+ * Verify `request` as a `provider` webhook signed with `secret`. Reads the
35
+ * body (at most `maxBytes`) and returns it on success; never throws for a
36
+ * bad delivery, so a handler answers `401` on `{ ok: false }`. Throws a
37
+ * `TypeError` only for a programming error: an unknown `provider`, or a
38
+ * `toleranceSeconds` or `maxBytes` that is negative, NaN or infinite.
39
+ *
40
+ * ```ts
41
+ * const check = await verifyWebhook(request, { provider: "slack", secret: env.SLACK_SIGNING_SECRET });
42
+ * if (!check.ok) return new Response(null, { status: 401 });
43
+ * const params = new URLSearchParams(check.body);
44
+ * ```
45
+ */
46
+ export async function verifyWebhook(request, options) {
47
+ const secrets = (typeof options.secret === "string" ? [options.secret] : options.secret).filter((secret) => typeof secret === "string" && secret.length > 0);
48
+ if (secrets.length === 0)
49
+ return refused("no_secret");
50
+ // A NaN or infinite tolerance or limit would quietly turn the window or the
51
+ // read bound off (every comparison with NaN is false): refuse the call.
52
+ const tolerance = checkedOption("toleranceSeconds", options.toleranceSeconds, EVENT_SIGNATURE_TOLERANCE_SECONDS);
53
+ const maxBytes = checkedOption("maxBytes", options.maxBytes, WEBHOOK_MAX_BYTES_DEFAULT);
54
+ const signed = readSignature(request.headers, options.provider);
55
+ if (!signed.ok)
56
+ return signed;
57
+ if (signed.timestamp !== null) {
58
+ const nowSeconds = Math.floor((options.now ?? new Date()).getTime() / 1000);
59
+ if (Math.abs(nowSeconds - signed.timestamp) > tolerance) {
60
+ return refused("expired");
61
+ }
62
+ }
63
+ const bytes = await readBody(request, maxBytes);
64
+ if (bytes === "unreadable")
65
+ return refused("unreadable");
66
+ if (bytes === null)
67
+ return refused("too_large");
68
+ // The HMAC runs over the bytes received, never a decoded and re-encoded copy.
69
+ const prefix = encoder.encode(signed.prefix);
70
+ const data = new Uint8Array(new ArrayBuffer(prefix.byteLength + bytes.byteLength));
71
+ data.set(prefix, 0);
72
+ data.set(bytes, prefix.byteLength);
73
+ for (const secret of secrets) {
74
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
75
+ for (const candidate of signed.digests) {
76
+ if (await crypto.subtle.verify("HMAC", key, fromHex(candidate), data)) {
77
+ return {
78
+ ok: true,
79
+ body: new TextDecoder().decode(bytes),
80
+ deliveryId: signed.deliveryId,
81
+ timestamp: signed.timestamp,
82
+ };
83
+ }
84
+ }
85
+ }
86
+ return refused("mismatch");
87
+ }
88
+ function readSignature(headers, provider) {
89
+ switch (provider) {
90
+ case "slack": {
91
+ const header = headers.get("x-slack-signature");
92
+ if (!header)
93
+ return refused("missing_signature");
94
+ const rawTimestamp = headers.get("x-slack-request-timestamp");
95
+ const digest = header.startsWith("v0=") ? header.slice(3) : "";
96
+ if (!HEX_SHA256.test(digest) ||
97
+ !rawTimestamp ||
98
+ !/^\d{1,12}$/.test(rawTimestamp)) {
99
+ return refused("malformed");
100
+ }
101
+ return {
102
+ ok: true,
103
+ digests: [digest.toLowerCase()],
104
+ timestamp: Number(rawTimestamp),
105
+ deliveryId: null,
106
+ prefix: `v0:${rawTimestamp}:`,
107
+ };
108
+ }
109
+ case "github": {
110
+ const header = headers.get("x-hub-signature-256");
111
+ if (!header)
112
+ return refused("missing_signature");
113
+ const digest = header.startsWith("sha256=") ? header.slice(7) : "";
114
+ if (!HEX_SHA256.test(digest))
115
+ return refused("malformed");
116
+ return {
117
+ ok: true,
118
+ digests: [digest.toLowerCase()],
119
+ timestamp: null,
120
+ deliveryId: headers.get("x-github-delivery"),
121
+ prefix: "",
122
+ };
123
+ }
124
+ case "everyapp": {
125
+ const header = headers.get(EVENT_HEADERS.signature);
126
+ if (!header)
127
+ return refused("missing_signature");
128
+ const parsed = parseEventSignature(header);
129
+ // The Gateway sends one v1 (two while a secret rotates): a header with
130
+ // many isn't one it sent, and each would cost an HMAC per secret.
131
+ if (!parsed || parsed.v1.length > MAX_EVENT_SIGNATURES) {
132
+ return refused("malformed");
133
+ }
134
+ return {
135
+ ok: true,
136
+ digests: parsed.v1,
137
+ timestamp: parsed.timestamp,
138
+ deliveryId: headers.get(EVENT_HEADERS.eventId),
139
+ prefix: eventSigningInput(parsed.timestamp, ""),
140
+ };
141
+ }
142
+ default: {
143
+ const unknown = provider;
144
+ throw new TypeError(`verifyWebhook: unknown provider "${String(unknown)}"`);
145
+ }
146
+ }
147
+ }
148
+ /** A finite, non-negative option, or its default when not given. */
149
+ function checkedOption(name, value, fallback) {
150
+ if (value === undefined)
151
+ return fallback;
152
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
153
+ throw new TypeError(`verifyWebhook: ${name} must be a finite number of at least 0`);
154
+ }
155
+ return value;
156
+ }
157
+ /**
158
+ * The body's bytes; null once it passes `maxBytes` (read no further);
159
+ * "unreadable" when it was already consumed or its stream fails.
160
+ */
161
+ async function readBody(request, maxBytes) {
162
+ const declared = Number(request.headers.get("content-length"));
163
+ if (Number.isFinite(declared) && declared > maxBytes)
164
+ return null;
165
+ if (request.bodyUsed)
166
+ return "unreadable";
167
+ if (!request.body)
168
+ return new Uint8Array(new ArrayBuffer(0));
169
+ const chunks = [];
170
+ let total = 0;
171
+ try {
172
+ const reader = request.body.getReader();
173
+ for (;;) {
174
+ const { done, value } = await reader.read();
175
+ if (done)
176
+ break;
177
+ total += value.byteLength;
178
+ if (total > maxBytes) {
179
+ await reader.cancel().catch(() => undefined);
180
+ return null;
181
+ }
182
+ chunks.push(value);
183
+ }
184
+ }
185
+ catch {
186
+ return "unreadable";
187
+ }
188
+ const bytes = new Uint8Array(new ArrayBuffer(total));
189
+ let offset = 0;
190
+ for (const chunk of chunks) {
191
+ bytes.set(chunk, offset);
192
+ offset += chunk.byteLength;
193
+ }
194
+ return bytes;
195
+ }
196
+ function fromHex(hex) {
197
+ const bytes = new Uint8Array(new ArrayBuffer(hex.length / 2));
198
+ for (let index = 0; index < bytes.length; index += 1) {
199
+ bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);
200
+ }
201
+ return bytes;
202
+ }
203
+ function refused(reason) {
204
+ return { ok: false, reason };
205
+ }
@@ -67,9 +67,8 @@ export interface TestWorker {
67
67
  export interface CallToolOptions {
68
68
  user?: TestUser;
69
69
  /**
70
- * The caller's scopes. Default: `mcp:read`, `mcp:write` and
71
- * `mcp:destructive`, so every tool may be called; pass fewer to test a
72
- * refusal.
70
+ * The caller's scopes. Default: `mcp:read` and `mcp:write`, so every
71
+ * tool may be called; pass `["mcp:read"]` to test a refusal.
73
72
  */
74
73
  scopes?: string[];
75
74
  /** Default: {@link testEnv}() for the worker's app. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@
17
17
  * deployed Worker. For tests only; a Worker never imports this module.
18
18
  */
19
19
  import { DEV_ISSUER, DEV_PRIVATE_KEY_PEM, DEV_PUBLIC_KEY_PEM, } from "../dev/keypair.js";
20
- import { APP_ID_ENV, AUDIENCE_ENV, IDENTITY_DEV_KEY_ID, IDENTITY_HEADER, MCP_DESTRUCTIVE_SCOPE, MCP_READ_SCOPE, MCP_WRITE_SCOPE, SYSTEM_HEADER, TOOLS_CALL_PATH, TOOLS_LIST_PATH, mintIdentityJwt, mintSystemJwt, } from "../internal/index.js";
20
+ import { APP_ID_ENV, AUDIENCE_ENV, IDENTITY_DEV_KEY_ID, IDENTITY_HEADER, MCP_READ_SCOPE, MCP_WRITE_SCOPE, SYSTEM_HEADER, TOOLS_CALL_PATH, TOOLS_LIST_PATH, mintIdentityJwt, mintSystemJwt, } from "../internal/index.js";
21
21
  import { everyApp } from "../server/everyApp.js";
22
22
  export { IDENTITY_HEADER };
23
23
  /** The person a test signs in by default: the owner of `org_test`. */
@@ -104,11 +104,7 @@ export async function callTool(app, name, args = {}, options = {}) {
104
104
  user: options.user,
105
105
  appId: audienceOf(env),
106
106
  channel: "mcp",
107
- scopes: options.scopes ?? [
108
- MCP_READ_SCOPE,
109
- MCP_WRITE_SCOPE,
110
- MCP_DESTRUCTIVE_SCOPE,
111
- ],
107
+ scopes: options.scopes ?? [MCP_READ_SCOPE, MCP_WRITE_SCOPE],
112
108
  toolCall: { id: callId, name },
113
109
  });
114
110
  const response = await workerOf(app).fetch(new Request(`https://app.test${TOOLS_CALL_PATH}`, {
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "@every-app/sdk",
3
- "version": "0.3.0-rc.8",
3
+ "version": "0.3.0",
4
4
  "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/every-app/every-app.git",
8
+ "directory": "packages/sdk"
9
+ },
5
10
  "type": "module",
6
11
  "exports": {
7
12
  ".": {