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.
- package/bin/alchemy.js +32 -23
- package/lib/cloudflare/account-api-token.d.ts +5 -0
- package/lib/cloudflare/account-api-token.d.ts.map +1 -1
- package/lib/cloudflare/account-api-token.js +13 -2
- package/lib/cloudflare/account-api-token.js.map +1 -1
- package/lib/cloudflare/ai-crawler.d.ts +27 -0
- package/lib/cloudflare/ai-crawler.d.ts.map +1 -0
- package/lib/cloudflare/ai-crawler.js +75 -0
- package/lib/cloudflare/ai-crawler.js.map +1 -0
- package/lib/cloudflare/ai-search-token.d.ts +150 -0
- package/lib/cloudflare/ai-search-token.d.ts.map +1 -0
- package/lib/cloudflare/ai-search-token.js +171 -0
- package/lib/cloudflare/ai-search-token.js.map +1 -0
- package/lib/cloudflare/ai-search.d.ts +397 -0
- package/lib/cloudflare/ai-search.d.ts.map +1 -0
- package/lib/cloudflare/ai-search.js +307 -0
- package/lib/cloudflare/ai-search.js.map +1 -0
- package/lib/cloudflare/auth.d.ts +3 -2
- package/lib/cloudflare/auth.d.ts.map +1 -1
- package/lib/cloudflare/auth.js +17 -14
- package/lib/cloudflare/auth.js.map +1 -1
- package/lib/cloudflare/bucket-custom-domain.d.ts.map +1 -1
- package/lib/cloudflare/bucket-custom-domain.js +4 -2
- package/lib/cloudflare/bucket-custom-domain.js.map +1 -1
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +8 -2
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/index.d.ts +3 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +3 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/permission-groups.d.ts +5 -0
- package/lib/cloudflare/permission-groups.d.ts.map +1 -1
- package/lib/cloudflare/permission-groups.js +6 -0
- package/lib/cloudflare/permission-groups.js.map +1 -1
- package/lib/scope.d.ts +1 -1
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +10 -5
- package/lib/scope.js.map +1 -1
- package/lib/test/bun.d.ts +17 -0
- package/lib/test/bun.d.ts.map +1 -1
- package/lib/test/bun.js +1 -0
- package/lib/test/bun.js.map +1 -1
- package/lib/test/vitest.d.ts +17 -0
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +3 -0
- package/lib/test/vitest.js.map +1 -1
- package/lib/util/snake-to-camel.d.ts +21 -0
- package/lib/util/snake-to-camel.d.ts.map +1 -0
- package/lib/util/snake-to-camel.js +34 -0
- package/lib/util/snake-to-camel.js.map +1 -0
- package/package.json +1 -1
- package/src/cloudflare/account-api-token.ts +23 -6
- package/src/cloudflare/ai-crawler.ts +89 -0
- package/src/cloudflare/ai-search-token.ts +324 -0
- package/src/cloudflare/ai-search.ts +952 -0
- package/src/cloudflare/auth.ts +17 -14
- package/src/cloudflare/bucket-custom-domain.ts +4 -1
- package/src/cloudflare/bucket.ts +9 -2
- package/src/cloudflare/index.ts +3 -0
- package/src/cloudflare/permission-groups.ts +6 -0
- package/src/scope.ts +14 -5
- package/src/test/bun.ts +25 -0
- package/src/test/vitest.ts +33 -0
- package/src/util/snake-to-camel.ts +59 -0
- 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.
|
|
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
|
-
|
|
38199
|
-
|
|
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((
|
|
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
|
-
"
|
|
39822
|
-
"
|
|
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
|
-
"
|
|
39851
|
-
"
|
|
39852
|
-
"
|
|
39853
|
-
"
|
|
39854
|
-
"
|
|
39855
|
-
"
|
|
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
|
-
"
|
|
39865
|
-
"
|
|
39862
|
+
"ssl_certs:write",
|
|
39863
|
+
"user:read",
|
|
39866
39864
|
"vectorize:write",
|
|
39867
|
-
"
|
|
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;
|
|
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(
|
|
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;
|
|
1
|
+
{"version":3,"file":"account-api-token.js","sourceRoot":"","sources":["../../src/cloudflare/account-api-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|