alchemy 0.85.0 → 0.85.1

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 (66) hide show
  1. package/bin/alchemy.js +32 -23
  2. package/lib/cloudflare/account-api-token.d.ts +5 -0
  3. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  4. package/lib/cloudflare/account-api-token.js +13 -2
  5. package/lib/cloudflare/account-api-token.js.map +1 -1
  6. package/lib/cloudflare/ai-crawler.d.ts +27 -0
  7. package/lib/cloudflare/ai-crawler.d.ts.map +1 -0
  8. package/lib/cloudflare/ai-crawler.js +75 -0
  9. package/lib/cloudflare/ai-crawler.js.map +1 -0
  10. package/lib/cloudflare/ai-search-token.d.ts +150 -0
  11. package/lib/cloudflare/ai-search-token.d.ts.map +1 -0
  12. package/lib/cloudflare/ai-search-token.js +171 -0
  13. package/lib/cloudflare/ai-search-token.js.map +1 -0
  14. package/lib/cloudflare/ai-search.d.ts +397 -0
  15. package/lib/cloudflare/ai-search.d.ts.map +1 -0
  16. package/lib/cloudflare/ai-search.js +307 -0
  17. package/lib/cloudflare/ai-search.js.map +1 -0
  18. package/lib/cloudflare/auth.d.ts +3 -2
  19. package/lib/cloudflare/auth.d.ts.map +1 -1
  20. package/lib/cloudflare/auth.js +17 -14
  21. package/lib/cloudflare/auth.js.map +1 -1
  22. package/lib/cloudflare/bucket-custom-domain.d.ts.map +1 -1
  23. package/lib/cloudflare/bucket-custom-domain.js +4 -2
  24. package/lib/cloudflare/bucket-custom-domain.js.map +1 -1
  25. package/lib/cloudflare/bucket.d.ts.map +1 -1
  26. package/lib/cloudflare/bucket.js +8 -2
  27. package/lib/cloudflare/bucket.js.map +1 -1
  28. package/lib/cloudflare/index.d.ts +3 -0
  29. package/lib/cloudflare/index.d.ts.map +1 -1
  30. package/lib/cloudflare/index.js +3 -0
  31. package/lib/cloudflare/index.js.map +1 -1
  32. package/lib/cloudflare/permission-groups.d.ts +5 -0
  33. package/lib/cloudflare/permission-groups.d.ts.map +1 -1
  34. package/lib/cloudflare/permission-groups.js +6 -0
  35. package/lib/cloudflare/permission-groups.js.map +1 -1
  36. package/lib/scope.d.ts +1 -1
  37. package/lib/scope.d.ts.map +1 -1
  38. package/lib/scope.js +10 -5
  39. package/lib/scope.js.map +1 -1
  40. package/lib/test/bun.d.ts +17 -0
  41. package/lib/test/bun.d.ts.map +1 -1
  42. package/lib/test/bun.js +1 -0
  43. package/lib/test/bun.js.map +1 -1
  44. package/lib/test/vitest.d.ts +17 -0
  45. package/lib/test/vitest.d.ts.map +1 -1
  46. package/lib/test/vitest.js +3 -0
  47. package/lib/test/vitest.js.map +1 -1
  48. package/lib/util/snake-to-camel.d.ts +21 -0
  49. package/lib/util/snake-to-camel.d.ts.map +1 -0
  50. package/lib/util/snake-to-camel.js +34 -0
  51. package/lib/util/snake-to-camel.js.map +1 -0
  52. package/package.json +1 -1
  53. package/src/cloudflare/account-api-token.ts +23 -6
  54. package/src/cloudflare/ai-crawler.ts +89 -0
  55. package/src/cloudflare/ai-search-token.ts +324 -0
  56. package/src/cloudflare/ai-search.ts +952 -0
  57. package/src/cloudflare/auth.ts +17 -14
  58. package/src/cloudflare/bucket-custom-domain.ts +4 -1
  59. package/src/cloudflare/bucket.ts +9 -2
  60. package/src/cloudflare/index.ts +3 -0
  61. package/src/cloudflare/permission-groups.ts +6 -0
  62. package/src/scope.ts +14 -5
  63. package/src/test/bun.ts +25 -0
  64. package/src/test/vitest.ts +33 -0
  65. package/src/util/snake-to-camel.ts +59 -0
  66. package/workers/tunnel-proxy.js +1 -1
package/bin/alchemy.js CHANGED
@@ -37097,7 +37097,7 @@ function envPaths(name$1, { suffix = "nodejs" } = {}) {
37097
37097
  //#endregion
37098
37098
  //#region package.json
37099
37099
  var name = "alchemy";
37100
- var version = "0.85.0";
37100
+ var version = "0.85.1";
37101
37101
  var license = "Apache-2.0";
37102
37102
  var author = "Sam Goodwin <sam@alchemy.run>";
37103
37103
  var homepage = "https://alchemy.run";
@@ -38194,15 +38194,15 @@ var Scope = class Scope {
38194
38194
  const state = await this.state.get(id);
38195
38195
  return state !== void 0 && (type$1 === void 0 || state.kind === type$1);
38196
38196
  }
38197
- createPhysicalName(id, delimiter = "-") {
38198
- const app = this.appName;
38199
- const stage = this.stage;
38200
- return [
38201
- app,
38197
+ createPhysicalName(id, delimiter = "-", maxLength) {
38198
+ let name$1 = [
38199
+ this.appName,
38202
38200
  ...this.chain.slice(2),
38203
38201
  id,
38204
- stage
38205
- ].map((s) => s.replaceAll(/[^a-z0-9_-]/gi, delimiter)).join(delimiter);
38202
+ this.stage
38203
+ ].map((part) => part.replaceAll(/[^a-z0-9_-]/gi, delimiter)).join(delimiter);
38204
+ while (maxLength && name$1.length > maxLength) name$1 = name$1.split(delimiter).map((part) => part.slice(0, -1)).join(delimiter);
38205
+ return name$1;
38206
38206
  }
38207
38207
  async spawn(id, options) {
38208
38208
  const logsDir = path$1.join(this.dotAlchemy, "logs");
@@ -39818,8 +39818,9 @@ let CloudflareAuth;
39818
39818
  "queues:write": "See and change Cloudflare Queues settings and data",
39819
39819
  "r2_catalog:write": "Grants write level access to R2 Data Catalog",
39820
39820
  "radar:read": "Grants access to read Cloudflare Radar data",
39821
- "rag:read": "Grants read level access to Auto Rag",
39822
- "rag:write": "Grants write level access to Auto Rag",
39821
+ "ai-search:read": "Grants read level access to AI Search",
39822
+ "ai-search:write": "Grants write level access to AI Search",
39823
+ "ai-search:run": "Grants run level access to AI Search",
39823
39824
  "secrets_store:read": "Grants read level access to Secrets Store",
39824
39825
  "secrets_store:write": "Grants write level access to Secrets Store",
39825
39826
  "ssl_certs:write": "Grants read and write access to SSL MTLS certificates or Certificate Store",
@@ -39847,24 +39848,26 @@ let CloudflareAuth;
39847
39848
  };
39848
39849
  _CloudflareAuth.DEFAULT_SCOPES = [
39849
39850
  "account:read",
39850
- "user:read",
39851
- "workers:write",
39852
- "workers_kv:write",
39853
- "workers_routes:write",
39854
- "workers_scripts:write",
39855
- "workers_tail:read",
39851
+ "ai-search:write",
39852
+ "ai-search:run",
39853
+ "ai:write",
39854
+ "cloudchamber:write",
39855
+ "connectivity:admin",
39856
+ "containers:write",
39856
39857
  "d1:write",
39857
39858
  "pages:write",
39858
- "zone:read",
39859
- "ssl_certs:write",
39860
- "ai:write",
39861
- "queues:write",
39862
39859
  "pipelines:write",
39860
+ "queues:write",
39863
39861
  "secrets_store:write",
39864
- "containers:write",
39865
- "cloudchamber:write",
39862
+ "ssl_certs:write",
39863
+ "user:read",
39866
39864
  "vectorize:write",
39867
- "connectivity:admin"
39865
+ "workers_kv:write",
39866
+ "workers_routes:write",
39867
+ "workers_scripts:write",
39868
+ "workers_tail:read",
39869
+ "workers:write",
39870
+ "zone:read"
39868
39871
  ];
39869
39872
  _CloudflareAuth.formatHeadersWithRefresh = async (input) => {
39870
39873
  if (!Credentials.isOAuthExpired(input.credentials)) return formatHeaders(input.credentials);
@@ -231306,6 +231309,12 @@ const PERMISSION_GROUPS = [
231306
231309
  description: "Grants access to reading AI Gateways",
231307
231310
  scopes: ["com.cloudflare.api.account"]
231308
231311
  },
231312
+ {
231313
+ id: "9e9b428a0bcd46fd80e580b46a69963c",
231314
+ name: "AI Search Index Engine",
231315
+ description: "Grants access to run AI Search Index Engine",
231316
+ scopes: ["com.cloudflare.api.account"]
231317
+ },
231309
231318
  {
231310
231319
  id: "644535f4ed854494a59cb289d634b257",
231311
231320
  name: "AI Gateway Run",
@@ -80,6 +80,11 @@ export interface AccountApiTokenProps extends CloudflareApiOptions {
80
80
  * Optional conditions for token use (like IP restrictions)
81
81
  */
82
82
  condition?: TokenCondition;
83
+ /**
84
+ * Whether to delete the token when removed from Alchemy
85
+ * @default true
86
+ */
87
+ delete?: boolean;
83
88
  }
84
89
  /**
85
90
  * Output returned after Account API Token creation/update
@@ -1 +1 @@
1
- {"version":3,"file":"account-api-token.d.ts","sourceRoot":"","sources":["../../src/cloudflare/account-api-token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,gBAAgB,EAAE,CAAC,mBAAmB,GAAG,0BAA0B,CAAC,EAAE,CAAC;IAEvE;;OAEG;IACH,SAAS,EAAE;SACR,GAAG,IAAI,sBAAsB,CAAC,CAAC,EAAE,MAAM;KACzC,CAAC;CACH;AAED;;GAEG;AACH,KAAK,sBAAsB,GACvB,+BAA+B,GAC/B,iCAAiC,MAAM,EAAE,GACzC,4BAA4B,GAC5B,8BAA8B,MAAM,EAAE,GAEtC,mCAAmC,MAAM,EAAE,GAE3C,2BAA2B,MAAM,EAAE,GACnC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAEd;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AA4BD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,eAAe,yFAGlB,OAAO,CAAC,eAAe,CAAC,MAC1B,MAAM,SACH,oBAAoB,KAC1B,OAAO,CAAC,eAAe,CAAC,CAyJ5B,CAAC"}
1
+ {"version":3,"file":"account-api-token.d.ts","sourceRoot":"","sources":["../../src/cloudflare/account-api-token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,gBAAgB,EAAE,CAAC,mBAAmB,GAAG,0BAA0B,CAAC,EAAE,CAAC;IAEvE;;OAEG;IACH,SAAS,EAAE;SACR,GAAG,IAAI,sBAAsB,CAAC,CAAC,EAAE,MAAM;KACzC,CAAC;CACH;AAED;;GAEG;AACH,KAAK,sBAAsB,GACvB,+BAA+B,GAC/B,iCAAiC,MAAM,EAAE,GACzC,4BAA4B,GAC5B,8BAA8B,MAAM,EAAE,GAEtC,mCAAmC,MAAM,EAAE,GAE3C,2BAA2B,MAAM,EAAE,GACnC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAEd;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA4BD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,eAAe,yFAGlB,OAAO,CAAC,eAAe,CAAC,MAC1B,MAAM,SACH,oBAAoB,KAC1B,OAAO,CAAC,eAAe,CAAC,CAoK5B,CAAC"}
@@ -74,7 +74,7 @@ export const AccountApiToken = Resource("cloudflare::AccountApiToken", async fun
74
74
  const tokenName = props.name ?? this.scope.createPhysicalName(id);
75
75
  if (this.phase === "delete") {
76
76
  // Delete token if we have an ID
77
- if (this.output?.id) {
77
+ if (this.output?.id && props.delete !== false) {
78
78
  try {
79
79
  const deleteResponse = await api.delete(`/accounts/${api.accountId}/tokens/${this.output.id}`);
80
80
  if (!deleteResponse.ok && deleteResponse.status !== 404) {
@@ -153,7 +153,18 @@ export const AccountApiToken = Resource("cloudflare::AccountApiToken", async fun
153
153
  const errorData = await response.json().catch(() => ({
154
154
  errors: [{ message: response.statusText }],
155
155
  }));
156
- throw new Error(`Error ${this.phase === "update" ? "updating" : "creating"} token '${tokenName}': ${errorData.errors?.[0]?.message || response.statusText}`);
156
+ throw new Error([
157
+ `Error ${this.phase === "update" ? "updating" : "creating"} token '${tokenName}' (${response.status}): ${errorData.errors?.[0]?.message || response.statusText}`,
158
+ ...(api.credentials.type !== "api-key"
159
+ ? [
160
+ `\nTo create an Account API Token, you must use a Global API Key or an API Token with the "Account API Tokens Write" permission.`,
161
+ ]
162
+ : []),
163
+ ...(api.credentials.type === "oauth"
164
+ ? ["OAuth credentials are not supported."]
165
+ : []),
166
+ "See https://alchemy.run/guides/cloudflare/ for more details.",
167
+ ].join("\n"));
157
168
  }
158
169
  const result = await response.json();
159
170
  const tokenData = result.result;
@@ -1 +1 @@
1
- {"version":3,"file":"account-api-token.js","sourceRoot":"","sources":["../../src/cloudflare/account-api-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAA6B,MAAM,UAAU,CAAC;AAC1E,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AA+KhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CACrC,6BAA6B,EAC7B,KAAK,WAEH,EAAU,EACV,KAA2B;IAE3B,gEAAgE;IAChE,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,MAAM,CACrC,aAAa,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CACtD,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxD,MAAM,SAAS,GAAQ,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;wBAC9D,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC;qBACjD,CAAC,CAAC,CAAC;oBACJ,MAAM,CAAC,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,SAAS,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAElD,yCAAyC;IACzC,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACpD,OAAO,EAAE,KAAK,QAAQ;gBACpB,CAAC,CAAC;oBACE,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE;iBAC5B;gBACH,CAAC,CAAC;oBACE,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;iBACpB,CACN;YACD,SAAS,EAAE,MAAM,CAAC,WAAW,CAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACpD,IAAI,GAAG,KAAK,4BAA4B,EAAE,CAAC;oBACzC,OAAO,CAAC,8BAA8B,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,CACH;SACF,CAAC,CAAC;QACH,0DAA0D;QAC1D,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS;wBACnC,CAAC,CAAC;4BACE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE;4BACtC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;yBAC9C;wBACH,CAAC,CAAC,SAAS;iBACd;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF;;;OAGG;IACH,SAAS,oBAAoB,CAAC,OAAe;QAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,UAA8B,CAAC;IAEnC,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;QAC/C,wBAAwB;QACxB,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CACtB,aAAa,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EACrD,UAAU,CACX,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CACvB,aAAa,GAAG,CAAC,SAAS,SAAS,EACnC,UAAU,CACX,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,KAAK,CACb,SACE,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UACzC,WAAW,SAAS,MAClB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC,UAC7C,EAAE,CACH,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAmC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,UAAU,SAAS,0FAA0F,CAC9G,CAAC;QACJ,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IAClC,CAAC;IAED,uCAAuC;IACvC,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,SAAS,CAAC,SAAS;YACrB,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU;wBACvC,CAAC,CAAC;4BACE,EAAE,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE;4BAC3C,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;yBACnD;wBACH,CAAC,CAAC,SAAS;iBACd;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;KAChE,CAAC;AACJ,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"account-api-token.js","sourceRoot":"","sources":["../../src/cloudflare/account-api-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAA6B,MAAM,UAAU,CAAC;AAC1E,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAqLhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CACrC,6BAA6B,EAC7B,KAAK,WAEH,EAAU,EACV,KAA2B;IAE3B,gEAAgE;IAChE,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,MAAM,CACrC,aAAa,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CACtD,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxD,MAAM,SAAS,GAAQ,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;wBAC9D,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC;qBACjD,CAAC,CAAC,CAAC;oBACJ,MAAM,CAAC,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,SAAS,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAElD,yCAAyC;IACzC,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACpD,OAAO,EAAE,KAAK,QAAQ;gBACpB,CAAC,CAAC;oBACE,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE;iBAC5B;gBACH,CAAC,CAAC;oBACE,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;iBACpB,CACN;YACD,SAAS,EAAE,MAAM,CAAC,WAAW,CAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACpD,IAAI,GAAG,KAAK,4BAA4B,EAAE,CAAC;oBACzC,OAAO,CAAC,8BAA8B,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,CACH;SACF,CAAC,CAAC;QACH,0DAA0D;QAC1D,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS;wBACnC,CAAC,CAAC;4BACE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE;4BACtC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;yBAC9C;wBACH,CAAC,CAAC,SAAS;iBACd;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF;;;OAGG;IACH,SAAS,oBAAoB,CAAC,OAAe;QAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,UAA8B,CAAC;IAEnC,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;QAC/C,wBAAwB;QACxB,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CACtB,aAAa,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EACrD,UAAU,CACX,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CACvB,aAAa,GAAG,CAAC,SAAS,SAAS,EACnC,UAAU,CACX,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,KAAK,CACb;YACE,SACE,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UACzC,WAAW,SAAS,MAAM,QAAQ,CAAC,MAAM,MACvC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC,UAC7C,EAAE;YACF,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS;gBACpC,CAAC,CAAC;oBACE,iIAAiI;iBAClI;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO;gBAClC,CAAC,CAAC,CAAC,sCAAsC,CAAC;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACP,8DAA8D;SAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAmC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,UAAU,SAAS,0FAA0F,CAC9G,CAAC;QACJ,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IAClC,CAAC;IAED,uCAAuC;IACvC,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,SAAS,CAAC,SAAS;YACrB,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU;wBACvC,CAAC,CAAC;4BACE,EAAE,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE;4BAC3C,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;yBACnD;wBACH,CAAC,CAAC,SAAS;iBACd;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;KAChE,CAAC;AACJ,CAAC,CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { AiSearchWebCrawlerSource } from "./ai-search.ts";
2
+ /**
3
+ * Builds an AiSearchWebCrawlerSource configuration from URLs.
4
+ *
5
+ * This is a convenience helper that parses URLs and extracts the domain
6
+ * and path filters for use with AiSearch.
7
+ *
8
+ * @example
9
+ * // Crawl an entire domain
10
+ * const search = await AiSearch("docs-search", {
11
+ * source: AiCrawler(["https://docs.example.com"]),
12
+ * });
13
+ *
14
+ * @example
15
+ * // Crawl specific paths on a domain
16
+ * const search = await AiSearch("blog-search", {
17
+ * source: AiCrawler([
18
+ * "https://example.com/blog",
19
+ * "https://example.com/news",
20
+ * ]),
21
+ * });
22
+ *
23
+ * @param urls - URLs to crawl. All URLs must be from the same domain.
24
+ * @returns An AiSearchWebCrawlerSource configuration object
25
+ */
26
+ export declare function AiCrawler(urls: string[]): AiSearchWebCrawlerSource;
27
+ //# sourceMappingURL=ai-crawler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-crawler.d.ts","sourceRoot":"","sources":["../../src/cloudflare/ai-crawler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAmC/D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,wBAAwB,CA6BlE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Parse a URL and extract the domain and path
3
+ */
4
+ function parseUrl(url) {
5
+ // Handle URLs with or without protocol
6
+ let normalized = url;
7
+ if (!normalized.includes("://")) {
8
+ normalized = `https://${normalized}`;
9
+ }
10
+ const parsed = new URL(normalized);
11
+ return {
12
+ domain: parsed.hostname,
13
+ path: parsed.pathname,
14
+ };
15
+ }
16
+ /**
17
+ * Convert a path to a glob pattern for path filtering
18
+ */
19
+ function pathToGlobPattern(path) {
20
+ // Remove leading slash for pattern
21
+ const cleanPath = path.replace(/^\//, "");
22
+ if (!cleanPath || cleanPath === "/") {
23
+ // Root path - no filtering needed
24
+ return "**";
25
+ }
26
+ // Create a pattern that matches this path and its children
27
+ return `**/${cleanPath}**`;
28
+ }
29
+ /**
30
+ * Builds an AiSearchWebCrawlerSource configuration from URLs.
31
+ *
32
+ * This is a convenience helper that parses URLs and extracts the domain
33
+ * and path filters for use with AiSearch.
34
+ *
35
+ * @example
36
+ * // Crawl an entire domain
37
+ * const search = await AiSearch("docs-search", {
38
+ * source: AiCrawler(["https://docs.example.com"]),
39
+ * });
40
+ *
41
+ * @example
42
+ * // Crawl specific paths on a domain
43
+ * const search = await AiSearch("blog-search", {
44
+ * source: AiCrawler([
45
+ * "https://example.com/blog",
46
+ * "https://example.com/news",
47
+ * ]),
48
+ * });
49
+ *
50
+ * @param urls - URLs to crawl. All URLs must be from the same domain.
51
+ * @returns An AiSearchWebCrawlerSource configuration object
52
+ */
53
+ export function AiCrawler(urls) {
54
+ if (!urls || urls.length === 0) {
55
+ throw new Error("AiCrawler requires at least one URL");
56
+ }
57
+ // Parse all URLs
58
+ const parsed = urls.map(parseUrl);
59
+ // Verify all URLs are from the same domain
60
+ const domains = new Set(parsed.map((p) => p.domain));
61
+ if (domains.size > 1) {
62
+ throw new Error(`All URLs must be from the same domain. Found: ${[...domains].join(", ")}`);
63
+ }
64
+ const domain = parsed[0].domain;
65
+ // Build include paths from URL paths
66
+ // Only add path filters if we have specific paths (not just root)
67
+ const paths = parsed.map((p) => p.path).filter((p) => p && p !== "/");
68
+ const includePaths = paths.length > 0 ? paths.map(pathToGlobPattern) : undefined;
69
+ return {
70
+ type: "web-crawler",
71
+ domain,
72
+ includePaths,
73
+ };
74
+ }
75
+ //# sourceMappingURL=ai-crawler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-crawler.js","sourceRoot":"","sources":["../../src/cloudflare/ai-crawler.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,uCAAuC;IACvC,IAAI,UAAU,GAAG,GAAG,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,UAAU,GAAG,WAAW,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,QAAQ;QACvB,IAAI,EAAE,MAAM,CAAC,QAAQ;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,mCAAmC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACpC,kCAAkC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,OAAO,MAAM,SAAS,IAAI,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,iBAAiB;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAElC,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,iDAAiD,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEhC,qCAAqC;IACrC,kEAAkE;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACtE,MAAM,YAAY,GAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM;QACN,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,150 @@
1
+ import type { Context } from "../context.ts";
2
+ import type { Secret } from "../secret.ts";
3
+ import { CloudflareApi, type CloudflareApiOptions } from "./api.ts";
4
+ /**
5
+ * Properties for creating an AI Search Token
6
+ */
7
+ export interface AiSearchTokenProps extends CloudflareApiOptions {
8
+ /**
9
+ * Name of the token
10
+ * @default Uses the resource ID
11
+ */
12
+ name?: string;
13
+ /**
14
+ * Whether to adopt an existing token if one with the same name exists
15
+ * @default false
16
+ */
17
+ adopt?: boolean;
18
+ /**
19
+ * Whether to delete the token when removed from Alchemy
20
+ * @default true
21
+ */
22
+ delete?: boolean;
23
+ }
24
+ /**
25
+ * AI Search Token output
26
+ */
27
+ export type AiSearchToken = {
28
+ /**
29
+ * Resource type identifier for binding
30
+ * @internal
31
+ */
32
+ type: "ai_search_token";
33
+ /**
34
+ * The AI Search token ID (UUID)
35
+ */
36
+ tokenId: string;
37
+ /**
38
+ * The underlying account API token ID (for lifecycle management)
39
+ */
40
+ accountTokenId: string;
41
+ /**
42
+ * The account ID
43
+ */
44
+ accountId: string;
45
+ /**
46
+ * The account tag
47
+ */
48
+ accountTag: string;
49
+ /**
50
+ * Name of the token
51
+ */
52
+ name: string;
53
+ /**
54
+ * The CF API ID for this token
55
+ */
56
+ cfApiId: string;
57
+ /**
58
+ * The CF API key for this token (stored as Secret)
59
+ */
60
+ cfApiKey: Secret;
61
+ /**
62
+ * Whether the token is enabled
63
+ */
64
+ enabled: boolean;
65
+ /**
66
+ * When the token was created
67
+ */
68
+ createdAt: string;
69
+ /**
70
+ * When the token was last modified
71
+ */
72
+ modifiedAt: string;
73
+ };
74
+ /**
75
+ * API response for AI Search token
76
+ * @internal
77
+ */
78
+ interface AiSearchTokenApiResponse {
79
+ id: string;
80
+ account_id: string;
81
+ account_tag: string;
82
+ name: string;
83
+ cf_api_id: string;
84
+ cf_api_key: string;
85
+ enabled: boolean;
86
+ legacy: boolean;
87
+ created_at: string;
88
+ modified_at: string;
89
+ }
90
+ /**
91
+ * Type guard for AiSearchToken
92
+ */
93
+ export declare function isAiSearchToken(resource: unknown): resource is AiSearchToken;
94
+ /**
95
+ * Creates an AI Search token for accessing AI Search instances.
96
+ *
97
+ * AI Search tokens are used to authenticate with the AI Search API and provide
98
+ * access to R2 buckets or other data sources for indexing.
99
+ *
100
+ * This resource automatically:
101
+ * 1. Creates an account API token with AI Search Index Engine and R2 Storage Write permissions
102
+ * 2. Registers that token with the AI Search service
103
+ *
104
+ * @example
105
+ * // Create an AI Search token
106
+ * const token = await AiSearchToken("my-token", {
107
+ * name: "docs-search-token",
108
+ * });
109
+ *
110
+ * // Use the token with an AI Search instance
111
+ * const search = await AiSearch("docs-search", {
112
+ * source: {
113
+ * type: "r2",
114
+ * bucket: myBucket,
115
+ * token: token,
116
+ * },
117
+ * });
118
+ *
119
+ * @example
120
+ * // Let AiSearch auto-create a token (recommended)
121
+ * const search = await AiSearch("docs-search", {
122
+ * source: {
123
+ * type: "r2",
124
+ * bucket: myBucket,
125
+ * },
126
+ * });
127
+ */
128
+ export declare const AiSearchToken: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<AiSearchToken>, id: string, props: AiSearchTokenProps) => Promise<AiSearchToken>);
129
+ /**
130
+ * Create an AI Search token
131
+ */
132
+ export declare function createAiSearchToken(api: CloudflareApi, payload: {
133
+ name: string;
134
+ cf_api_id: string;
135
+ cf_api_key: string;
136
+ }): Promise<AiSearchTokenApiResponse>;
137
+ /**
138
+ * List all AI Search tokens in an account
139
+ */
140
+ export declare function listAiSearchTokens(api: CloudflareApi): Promise<AiSearchTokenApiResponse[]>;
141
+ /**
142
+ * Delete an AI Search token
143
+ */
144
+ export declare function deleteAiSearchToken(api: CloudflareApi, tokenId: string): Promise<void>;
145
+ /**
146
+ * Get an AI Search token
147
+ */
148
+ export declare function getAiSearchToken(api: CloudflareApi, tokenId: string): Promise<AiSearchTokenApiResponse>;
149
+ export {};
150
+ //# sourceMappingURL=ai-search-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-search-token.d.ts","sourceRoot":"","sources":["../../src/cloudflare/ai-search-token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EACL,aAAa,EAEb,KAAK,oBAAoB,EAC1B,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,IAAI,EAAE,iBAAiB,CAAC;IAExB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,UAAU,wBAAwB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,aAAa,CAO5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,aAAa,yFAGhB,OAAO,CAAC,aAAa,CAAC,MACxB,MAAM,SACH,kBAAkB,KACxB,OAAO,CAAC,aAAa,CAAC,CAmG1B,CAAC;AAEF;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAKrC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAKnC"}
@@ -0,0 +1,171 @@
1
+ import { alchemy } from "../alchemy.js";
2
+ import { Resource, ResourceKind } from "../resource.js";
3
+ import { AccountApiToken } from "./account-api-token.js";
4
+ import { CloudflareApiError } from "./api-error.js";
5
+ import { extractCloudflareResult } from "./api-response.js";
6
+ import { CloudflareApi, createCloudflareApi, } from "./api.js";
7
+ /**
8
+ * Type guard for AiSearchToken
9
+ */
10
+ export function isAiSearchToken(resource) {
11
+ return (typeof resource === "object" &&
12
+ resource !== null &&
13
+ (resource[ResourceKind] === "cloudflare::AiSearchToken" ||
14
+ resource.type === "ai_search_token"));
15
+ }
16
+ /**
17
+ * Creates an AI Search token for accessing AI Search instances.
18
+ *
19
+ * AI Search tokens are used to authenticate with the AI Search API and provide
20
+ * access to R2 buckets or other data sources for indexing.
21
+ *
22
+ * This resource automatically:
23
+ * 1. Creates an account API token with AI Search Index Engine and R2 Storage Write permissions
24
+ * 2. Registers that token with the AI Search service
25
+ *
26
+ * @example
27
+ * // Create an AI Search token
28
+ * const token = await AiSearchToken("my-token", {
29
+ * name: "docs-search-token",
30
+ * });
31
+ *
32
+ * // Use the token with an AI Search instance
33
+ * const search = await AiSearch("docs-search", {
34
+ * source: {
35
+ * type: "r2",
36
+ * bucket: myBucket,
37
+ * token: token,
38
+ * },
39
+ * });
40
+ *
41
+ * @example
42
+ * // Let AiSearch auto-create a token (recommended)
43
+ * const search = await AiSearch("docs-search", {
44
+ * source: {
45
+ * type: "r2",
46
+ * bucket: myBucket,
47
+ * },
48
+ * });
49
+ */
50
+ export const AiSearchToken = Resource("cloudflare::AiSearchToken", async function (id, props) {
51
+ const api = await createCloudflareApi(props);
52
+ const tokenName = props.name ?? this.scope.createPhysicalName(id);
53
+ if (this.phase === "delete") {
54
+ if (this.output?.tokenId && props.delete !== false) {
55
+ await deleteAiSearchToken(api, this.output.tokenId);
56
+ }
57
+ // The AccountApiToken will be cleaned up automatically by Alchemy's
58
+ // resource lifecycle management since it's a child resource
59
+ return this.destroy();
60
+ }
61
+ // For update, we can't really update tokens - just return existing
62
+ if (this.phase === "update" && this.output?.tokenId) {
63
+ return this.output;
64
+ }
65
+ // Create an account API token with AI Search + R2 permissions
66
+ const accountToken = await AccountApiToken("account-token", {
67
+ name: `${tokenName} (AI Search Service Token)`,
68
+ policies: [
69
+ {
70
+ effect: "allow",
71
+ permissionGroups: [
72
+ "AI Search Index Engine",
73
+ "Workers R2 Storage Write",
74
+ ],
75
+ resources: {
76
+ "com.cloudflare.api.account": "*",
77
+ },
78
+ },
79
+ ],
80
+ baseUrl: props.baseUrl,
81
+ profile: props.profile,
82
+ apiKey: props.apiKey,
83
+ apiToken: props.apiToken,
84
+ accountId: props.accountId,
85
+ email: props.email,
86
+ delete: props.delete,
87
+ });
88
+ if (!accountToken.value) {
89
+ throw new Error("Failed to create account API token for AI Search - no token value returned");
90
+ }
91
+ const cfApiId = accountToken.id;
92
+ const cfApiKey = accountToken.value.unencrypted;
93
+ // Register the token with AI Search
94
+ try {
95
+ const result = await createAiSearchToken(api, {
96
+ name: tokenName,
97
+ cf_api_id: cfApiId,
98
+ cf_api_key: cfApiKey,
99
+ });
100
+ return {
101
+ type: "ai_search_token",
102
+ tokenId: result.id,
103
+ accountTokenId: accountToken.id,
104
+ accountId: result.account_id,
105
+ accountTag: result.account_tag,
106
+ name: result.name,
107
+ cfApiId: result.cf_api_id,
108
+ cfApiKey: alchemy.secret(cfApiKey),
109
+ enabled: result.enabled,
110
+ createdAt: result.created_at,
111
+ modifiedAt: result.modified_at,
112
+ };
113
+ }
114
+ catch (error) {
115
+ // Check if token already exists and we should adopt it
116
+ if (error instanceof CloudflareApiError && props.adopt) {
117
+ // List tokens and find by name
118
+ const tokens = await listAiSearchTokens(api);
119
+ const existing = tokens.find((t) => t.name === tokenName);
120
+ if (existing) {
121
+ return {
122
+ type: "ai_search_token",
123
+ tokenId: existing.id,
124
+ accountTokenId: accountToken.id,
125
+ accountId: existing.account_id,
126
+ accountTag: existing.account_tag,
127
+ name: existing.name,
128
+ cfApiId: existing.cf_api_id,
129
+ cfApiKey: alchemy.secret(cfApiKey),
130
+ enabled: existing.enabled,
131
+ createdAt: existing.created_at,
132
+ modifiedAt: existing.modified_at,
133
+ };
134
+ }
135
+ }
136
+ throw error;
137
+ }
138
+ });
139
+ /**
140
+ * Create an AI Search token
141
+ */
142
+ export async function createAiSearchToken(api, payload) {
143
+ return await extractCloudflareResult(`create AI Search token "${payload.name}"`, api.post(`/accounts/${api.accountId}/ai-search/tokens`, payload));
144
+ }
145
+ /**
146
+ * List all AI Search tokens in an account
147
+ */
148
+ export async function listAiSearchTokens(api) {
149
+ return await extractCloudflareResult(`list AI Search tokens`, api.get(`/accounts/${api.accountId}/ai-search/tokens`));
150
+ }
151
+ /**
152
+ * Delete an AI Search token
153
+ */
154
+ export async function deleteAiSearchToken(api, tokenId) {
155
+ try {
156
+ await extractCloudflareResult(`delete AI Search token "${tokenId}"`, api.delete(`/accounts/${api.accountId}/ai-search/tokens/${tokenId}`));
157
+ }
158
+ catch (error) {
159
+ if (error instanceof CloudflareApiError && error.status === 404) {
160
+ return;
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ /**
166
+ * Get an AI Search token
167
+ */
168
+ export async function getAiSearchToken(api, tokenId) {
169
+ return await extractCloudflareResult(`get AI Search token "${tokenId}"`, api.get(`/accounts/${api.accountId}/ai-search/tokens/${tokenId}`));
170
+ }
171
+ //# sourceMappingURL=ai-search-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-search-token.js","sourceRoot":"","sources":["../../src/cloudflare/ai-search-token.ts"],"names":[],"mappings":"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"}