veryfront 0.1.75 → 0.1.76
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/README.md +2 -0
- package/esm/cli/commands/files/command.d.ts +3 -3
- package/esm/deno.d.ts +5 -0
- package/esm/deno.js +11 -6
- package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.js +17 -1
- package/esm/src/jobs/index.d.ts +34 -0
- package/esm/src/jobs/index.d.ts.map +1 -0
- package/esm/src/jobs/index.js +33 -0
- package/esm/src/jobs/jobs-client.d.ts +134 -0
- package/esm/src/jobs/jobs-client.d.ts.map +1 -0
- package/esm/src/jobs/jobs-client.js +218 -0
- package/esm/src/jobs/schemas.d.ts +1304 -0
- package/esm/src/jobs/schemas.d.ts.map +1 -0
- package/esm/src/jobs/schemas.js +159 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +12 -6
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +21 -21
- package/esm/src/routing/api/route-executor.d.ts.map +1 -1
- package/esm/src/routing/api/route-executor.js +30 -3
- package/esm/src/security/deno-permissions.d.ts +1 -1
- package/esm/src/security/deno-permissions.d.ts.map +1 -1
- package/esm/src/security/deno-permissions.js +2 -1
- package/esm/src/security/sandbox/project-worker.d.ts.map +1 -1
- package/esm/src/security/sandbox/project-worker.js +2 -2
- package/esm/src/security/sandbox/worker-permissions.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-permissions.js +23 -20
- package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-pool.js +17 -14
- package/esm/src/security/sandbox/worker-types.d.ts +2 -0
- package/esm/src/security/sandbox/worker-types.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-types.js +2 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.js +72 -0
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +3 -0
- package/esm/src/task/control-plane.d.ts +105 -0
- package/esm/src/task/control-plane.d.ts.map +1 -0
- package/esm/src/task/control-plane.js +52 -0
- package/esm/src/task/types.d.ts +6 -0
- package/esm/src/task/types.d.ts.map +1 -1
- package/package.json +5 -1
- package/src/deno.js +11 -6
- package/src/src/data/server-data-fetcher.ts +30 -2
- package/src/src/jobs/index.ts +85 -0
- package/src/src/jobs/jobs-client.ts +503 -0
- package/src/src/jobs/schemas.ts +202 -0
- package/src/src/platform/adapters/veryfront-api-client/retry-handler.ts +15 -6
- package/src/src/proxy/handler.ts +27 -19
- package/src/src/routing/api/route-executor.ts +43 -7
- package/src/src/security/deno-permissions.ts +2 -1
- package/src/src/security/sandbox/project-worker.ts +2 -2
- package/src/src/security/sandbox/worker-permissions.ts +22 -19
- package/src/src/security/sandbox/worker-pool.ts +21 -13
- package/src/src/security/sandbox/worker-types.ts +3 -0
- package/src/src/server/handlers/request/internal-tasks-list.handler.ts +103 -0
- package/src/src/server/runtime-handler/index.ts +3 -0
- package/src/src/task/control-plane.ts +76 -0
- package/src/src/task/types.ts +6 -0
package/README.md
CHANGED
|
@@ -18,6 +18,8 @@ Purpose-built for TypeScript and React, Veryfront gives you everything you need
|
|
|
18
18
|
|
|
19
19
|
- [**Workflows**](https://veryfront.com/docs/code/guides/workflows) — Orchestrate multi-step AI pipelines with branching, parallelism, and human-in-the-loop approval gates.
|
|
20
20
|
|
|
21
|
+
- [**Jobs & Cron Jobs**](https://veryfront.com/docs/code/guides/jobs) — Run durable project-scoped background work now or on a schedule through the Veryfront platform.
|
|
22
|
+
|
|
21
23
|
- [**Multi-Agent**](https://veryfront.com/docs/code/guides/multi-agent) — Compose agents that delegate to each other as tools for complex, coordinated tasks.
|
|
22
24
|
|
|
23
25
|
- [**Memory & Streaming**](https://veryfront.com/docs/code/guides/memory-and-streaming) — Give agents conversation history and streaming responses. Built-in chat UI components for React.
|
|
@@ -31,8 +31,8 @@ declare const FilesGetArgsSchema: z.ZodObject<{
|
|
|
31
31
|
quiet: z.ZodDefault<z.ZodBoolean>;
|
|
32
32
|
}, "strip", z.ZodTypeAny, {
|
|
33
33
|
json: boolean;
|
|
34
|
-
quiet: boolean;
|
|
35
34
|
remotePath: string;
|
|
35
|
+
quiet: boolean;
|
|
36
36
|
projectSlug?: string | undefined;
|
|
37
37
|
projectDir?: string | undefined;
|
|
38
38
|
output?: string | undefined;
|
|
@@ -54,8 +54,8 @@ declare const FilesPutArgsSchema: z.ZodObject<{
|
|
|
54
54
|
}, "strip", z.ZodTypeAny, {
|
|
55
55
|
json: boolean;
|
|
56
56
|
from: string;
|
|
57
|
-
quiet: boolean;
|
|
58
57
|
remotePath: string;
|
|
58
|
+
quiet: boolean;
|
|
59
59
|
projectSlug?: string | undefined;
|
|
60
60
|
projectDir?: string | undefined;
|
|
61
61
|
}, {
|
|
@@ -74,8 +74,8 @@ declare const FilesDeleteArgsSchema: z.ZodObject<{
|
|
|
74
74
|
quiet: z.ZodDefault<z.ZodBoolean>;
|
|
75
75
|
}, "strip", z.ZodTypeAny, {
|
|
76
76
|
json: boolean;
|
|
77
|
-
quiet: boolean;
|
|
78
77
|
remotePath: string;
|
|
78
|
+
quiet: boolean;
|
|
79
79
|
projectSlug?: string | undefined;
|
|
80
80
|
projectDir?: string | undefined;
|
|
81
81
|
}, {
|
package/esm/deno.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ declare namespace _default {
|
|
|
22
22
|
"./workflow/discovery": string;
|
|
23
23
|
"./prompt": string;
|
|
24
24
|
"./resource": string;
|
|
25
|
+
"./jobs": string;
|
|
25
26
|
"./mcp": string;
|
|
26
27
|
"./middleware": string;
|
|
27
28
|
"./utils": string;
|
|
@@ -51,6 +52,7 @@ declare namespace _default {
|
|
|
51
52
|
"veryfront/components/ai": string;
|
|
52
53
|
"veryfront/sandbox": string;
|
|
53
54
|
"veryfront/embedding": string;
|
|
55
|
+
"veryfront/jobs": string;
|
|
54
56
|
"veryfront/agent/react": string;
|
|
55
57
|
"veryfront/agent/testing": string;
|
|
56
58
|
"veryfront/agent/middleware": string;
|
|
@@ -124,6 +126,7 @@ declare namespace _default {
|
|
|
124
126
|
"#veryfront/react": string;
|
|
125
127
|
"#veryfront/rendering": string;
|
|
126
128
|
"#veryfront/resource": string;
|
|
129
|
+
"#veryfront/jobs": string;
|
|
127
130
|
"#veryfront/routing": string;
|
|
128
131
|
"#veryfront/security": string;
|
|
129
132
|
"#veryfront/skill": string;
|
|
@@ -243,6 +246,7 @@ declare namespace _default {
|
|
|
243
246
|
"tailwindcss/colors": string;
|
|
244
247
|
redis: string;
|
|
245
248
|
pg: string;
|
|
249
|
+
jose: string;
|
|
246
250
|
"@opentelemetry/api": string;
|
|
247
251
|
"@opentelemetry/core": string;
|
|
248
252
|
"@opentelemetry/context-async-hooks": string;
|
|
@@ -291,6 +295,7 @@ declare namespace _default {
|
|
|
291
295
|
"test:coverage:integration": string;
|
|
292
296
|
"coverage:report": string;
|
|
293
297
|
"coverage:html": string;
|
|
298
|
+
bench: string;
|
|
294
299
|
clean: string;
|
|
295
300
|
lint: string;
|
|
296
301
|
fmt: string;
|
package/esm/deno.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.76",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"nodeModulesDir": "auto",
|
|
6
6
|
"exclude": [
|
|
@@ -32,6 +32,7 @@ export default {
|
|
|
32
32
|
"./workflow/discovery": "./src/workflow/discovery/index.ts",
|
|
33
33
|
"./prompt": "./src/prompt/index.ts",
|
|
34
34
|
"./resource": "./src/resource/index.ts",
|
|
35
|
+
"./jobs": "./src/jobs/index.ts",
|
|
35
36
|
"./mcp": "./src/mcp/index.ts",
|
|
36
37
|
"./middleware": "./src/middleware/index.ts",
|
|
37
38
|
"./utils": "./src/utils/index.ts",
|
|
@@ -61,6 +62,7 @@ export default {
|
|
|
61
62
|
"veryfront/components/ai": "./src/react/components/ai/index.ts",
|
|
62
63
|
"veryfront/sandbox": "./src/sandbox/index.ts",
|
|
63
64
|
"veryfront/embedding": "./src/embedding/index.ts",
|
|
65
|
+
"veryfront/jobs": "./src/jobs/index.ts",
|
|
64
66
|
"veryfront/agent/react": "./src/agent/react/index.ts",
|
|
65
67
|
"veryfront/agent/testing": "./src/agent/testing/index.ts",
|
|
66
68
|
"veryfront/agent/middleware": "./src/agent/middleware/index.ts",
|
|
@@ -134,6 +136,7 @@ export default {
|
|
|
134
136
|
"#veryfront/react": "./src/react/index.ts",
|
|
135
137
|
"#veryfront/rendering": "./src/rendering/index.ts",
|
|
136
138
|
"#veryfront/resource": "./src/resource/index.ts",
|
|
139
|
+
"#veryfront/jobs": "./src/jobs/index.ts",
|
|
137
140
|
"#veryfront/routing": "./src/routing/index.ts",
|
|
138
141
|
"#veryfront/security": "./src/security/index.ts",
|
|
139
142
|
"#veryfront/skill": "./src/skill/index.ts",
|
|
@@ -253,6 +256,7 @@ export default {
|
|
|
253
256
|
"tailwindcss/colors": "https://esm.sh/tailwindcss@4.1.8/colors",
|
|
254
257
|
"redis": "npm:redis@4.6.13",
|
|
255
258
|
"pg": "npm:pg",
|
|
259
|
+
"jose": "npm:jose@5.9.6",
|
|
256
260
|
"@opentelemetry/api": "npm:@opentelemetry/api@1",
|
|
257
261
|
"@opentelemetry/core": "npm:@opentelemetry/core@1",
|
|
258
262
|
"@opentelemetry/context-async-hooks": "npm:@opentelemetry/context-async-hooks@1",
|
|
@@ -290,11 +294,11 @@ export default {
|
|
|
290
294
|
"tasks": {
|
|
291
295
|
"setup": "deno run --allow-all scripts/setup.ts",
|
|
292
296
|
"generate": "deno run -A scripts/build/generate-templates-manifest.ts && deno run -A scripts/build/generate-dev-ui-manifest.ts && deno run -A scripts/build/prebundle-client-scripts.ts && deno run -A scripts/build/prebundle-bridge.ts",
|
|
293
|
-
"start": "deno task generate && deno run --allow-
|
|
294
|
-
"start:headless": "deno task generate && deno run --allow-
|
|
295
|
-
"proxy": "deno task generate && deno run --allow-
|
|
297
|
+
"start": "deno task generate && deno run --allow-read --allow-write --allow-net --allow-env --allow-run --allow-sys --unstable-worker-options --unstable-net cli/main.ts",
|
|
298
|
+
"start:headless": "deno task generate && deno run --allow-read --allow-write --allow-net --allow-env --allow-run --allow-sys --unstable-worker-options --unstable-net cli/main.ts --headless",
|
|
299
|
+
"proxy": "deno task generate && deno run --allow-read --allow-write --allow-net --allow-env --allow-run --allow-sys --unstable-worker-options --unstable-net cli/main.ts serve --mode=proxy",
|
|
296
300
|
"dev": "deno task generate && deno run --allow-all cli/main.ts dev",
|
|
297
|
-
"production": "deno task generate && deno run --allow-
|
|
301
|
+
"production": "deno task generate && deno run --allow-read --allow-write --allow-net --allow-env --allow-run --allow-sys --unstable-worker-options --unstable-net cli/main.ts serve --mode=production",
|
|
298
302
|
"build:prepare": "deno run -A scripts/build/generate-integrations-module.ts && deno task generate && deno run -A scripts/build/prepare-framework-sources.ts",
|
|
299
303
|
"build": "deno task build:prepare && deno run -A scripts/build/compile-binary.ts --output ./bin/veryfront",
|
|
300
304
|
"build:npm": "deno run -A scripts/build/generate-integrations-module.ts && deno task generate && deno run -A scripts/build/build-npm-dnt.ts",
|
|
@@ -309,11 +313,12 @@ export default {
|
|
|
309
313
|
"test:coverage:integration": "rm -rf coverage && VF_DISABLE_LRU_INTERVAL=1 SSR_TRANSFORM_PER_PROJECT_LIMIT=0 REVALIDATION_PER_PROJECT_LIMIT=0 NODE_ENV=production LOG_FORMAT=text deno test --no-check --parallel --fail-fast --allow-all --coverage=coverage '--ignore=tests/e2e,tests/integration/compiled-binary-e2e.test.ts' tests --unstable-worker-options --unstable-net || exit 1",
|
|
310
314
|
"coverage:report": "deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --lcov > coverage/lcov.info && deno run --allow-read scripts/lint/check-coverage.ts 80",
|
|
311
315
|
"coverage:html": "deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --html",
|
|
316
|
+
"bench": "VF_DISABLE_LRU_INTERVAL=1 NODE_ENV=production LOG_FORMAT=text deno bench --no-check --allow-all --unstable-worker-options --unstable-net $(find src -name '*.bench.ts')",
|
|
312
317
|
"clean": "rm -rf .cache/",
|
|
313
318
|
"lint": "DENO_NO_PACKAGE_JSON=1 deno lint src/ cli/",
|
|
314
319
|
"fmt": "deno fmt src/ cli/",
|
|
315
320
|
"fmt:check": "deno fmt --check src/ cli/",
|
|
316
|
-
"typecheck": "deno task generate && deno check src/index.ts cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/transforms/index.ts src/config/index.ts src/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/modules/index.ts src/proxy/main.ts src/chat/index.ts src/markdown/index.ts src/mdx/index.ts src/fs/index.ts src/oauth/index.ts src/agent/index.ts src/tool/index.ts src/workflow/index.ts src/prompt/index.ts src/resource/index.ts src/mcp/index.ts src/provider/index.ts",
|
|
321
|
+
"typecheck": "deno task generate && deno check src/index.ts cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/transforms/index.ts src/config/index.ts src/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/modules/index.ts src/proxy/main.ts src/chat/index.ts src/markdown/index.ts src/mdx/index.ts src/fs/index.ts src/oauth/index.ts src/agent/index.ts src/tool/index.ts src/workflow/index.ts src/prompt/index.ts src/resource/index.ts src/jobs/index.ts src/mcp/index.ts src/provider/index.ts",
|
|
317
322
|
"verify": "deno task generate && deno fmt --check src/ cli/ && DENO_NO_PACKAGE_JSON=1 deno lint src/ cli/ && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task docs:validate && deno task typecheck && deno task test && deno task test:e2e:binary",
|
|
318
323
|
"verify:quick": "deno task generate && deno fmt --check src/ cli/ && DENO_NO_PACKAGE_JSON=1 deno lint src/ cli/ && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task docs:validate && deno task typecheck",
|
|
319
324
|
"docs": "rm -rf docs/reference && deno run --allow-read --allow-write --allow-run scripts/docs/generate-api-reference.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-data-fetcher.d.ts","sourceRoot":"","sources":["../../../src/src/data/server-data-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server-data-fetcher.d.ts","sourceRoot":"","sources":["../../../src/src/data/server-data-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAYxE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAC5B,KAAK,CACH,UAAU,EAAE,YAAY,EACxB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,UAAU,CAAC;IA8EtB;;OAEG;YACW,aAAa;IAoE3B;;;OAGG;IACH,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -5,6 +5,7 @@ import { TimeoutError, withTimeoutThrow } from "../rendering/utils/stream-utils.
|
|
|
5
5
|
import { withSpan } from "../observability/tracing/otlp-setup.js";
|
|
6
6
|
import { CircuitBreakerOpen, getCircuitBreaker } from "../utils/circuit-breaker.js";
|
|
7
7
|
import { getWorkerPool, isDataIsolationEnabled } from "../security/sandbox/worker-pool.js";
|
|
8
|
+
import { MAX_WORKER_BODY_BYTES, } from "../security/sandbox/worker-types.js";
|
|
8
9
|
export class ServerDataFetcher {
|
|
9
10
|
fetch(pageModule, context, options) {
|
|
10
11
|
if (typeof pageModule.getServerData !== "function") {
|
|
@@ -71,7 +72,22 @@ export class ServerDataFetcher {
|
|
|
71
72
|
*/
|
|
72
73
|
async fetchIsolated(modulePath, projectDir, context) {
|
|
73
74
|
const pool = getWorkerPool();
|
|
74
|
-
|
|
75
|
+
let body = null;
|
|
76
|
+
if (context.request?.body) {
|
|
77
|
+
// Fast path: reject before buffering if Content-Length is known
|
|
78
|
+
const contentLength = context.request.headers?.get("content-length");
|
|
79
|
+
if (contentLength) {
|
|
80
|
+
const bytes = parseInt(contentLength, 10);
|
|
81
|
+
if (bytes > MAX_WORKER_BODY_BYTES) {
|
|
82
|
+
throw new Error(`Request body too large for isolated data fetch (${(bytes / 1024 / 1024).toFixed(1)} MB, limit ${MAX_WORKER_BODY_BYTES / 1024 / 1024} MB)`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
body = new Uint8Array(await context.request.arrayBuffer());
|
|
86
|
+
// Fallback: check actual size for chunked/streaming bodies
|
|
87
|
+
if (body.byteLength > MAX_WORKER_BODY_BYTES) {
|
|
88
|
+
throw new Error(`Request body too large for isolated data fetch (${(body.byteLength / 1024 / 1024).toFixed(1)} MB, limit ${MAX_WORKER_BODY_BYTES / 1024 / 1024} MB)`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
75
91
|
const workerResponse = await pool.execute(projectDir, [projectDir], {
|
|
76
92
|
type: "fetch-data",
|
|
77
93
|
id: dntShim.crypto.randomUUID(),
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs module for durable project-scoped background execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides a public SDK surface for one-off jobs, cron jobs, batch summaries,
|
|
5
|
+
* job target discovery, and the canonical split between user-visible `events`
|
|
6
|
+
* and raw debugging `logs`.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { VeryfrontJobsClient } from "veryfront/jobs";
|
|
13
|
+
*
|
|
14
|
+
* const jobs = new VeryfrontJobsClient({
|
|
15
|
+
* authToken: process.env.VERYFRONT_API_TOKEN,
|
|
16
|
+
* projectReference: "my-project",
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const job = await jobs.create({
|
|
20
|
+
* name: "Ingest 1 file",
|
|
21
|
+
* target: "task:knowledge-ingest",
|
|
22
|
+
* config: {
|
|
23
|
+
* file_count: 1,
|
|
24
|
+
* upload_ids: ["00000000-0000-0000-0000-000000000000"],
|
|
25
|
+
* },
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const events = await jobs.events(job.id);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import "../../_dnt.polyfills.js";
|
|
32
|
+
export { type CreateCronJobInput, type CreateJobInput, createJobsClient, type ListBatchJobsOptions, type ListCronJobsOptions, type ListJobEventsOptions, type ListJobsOptions, type ProjectScopedOptions, type UpdateCronJobInput, VeryfrontJobsClient, type VeryfrontJobsClientConfig, } from "./jobs-client.js";
|
|
33
|
+
export { type CronJob, CronJobSchema, type CronJobStatus, CronJobStatusSchema, type Job, type JobBatch, type JobBatchResult, JobBatchResultSchema, JobBatchSchema, type JobBatchStatusCounts, JobBatchStatusCountsSchema, type JobEvent, JobEventSchema, type JobEventsResponse, JobEventsResponseSchema, type JobLogsResponse, JobLogsResponseSchema, type JobResult, JobResultSchema, JobSchema, type JobStatus, JobStatusSchema, type JobTargetDefinition, JobTargetDefinitionSchema, type JobTargetDefinitionsResponse, JobTargetDefinitionsResponseSchema, type KnowledgeIngestBatchSource, KnowledgeIngestBatchSourceSchema, type KnowledgeIngestFileResult, KnowledgeIngestFileResultSchema, PageInfoSchema, type PaginatedCronJobsResponse, PaginatedCronJobsResponseSchema, type PaginatedJobsResponse, PaginatedJobsResponseSchema, type ReservedJobTargetFamily, ReservedJobTargetFamilySchema, } from "./schemas.js";
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,yBAAyB,CAAC;AAGjC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,OAAO,EACZ,aAAa,EACb,KAAK,aAAa,EAClB,mBAAmB,EACnB,KAAK,GAAG,EACR,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,oBAAoB,EACpB,cAAc,EACd,KAAK,oBAAoB,EACzB,0BAA0B,EAC1B,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,KAAK,eAAe,EACpB,qBAAqB,EACrB,KAAK,SAAS,EACd,eAAe,EACf,SAAS,EACT,KAAK,SAAS,EACd,eAAe,EACf,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,KAAK,4BAA4B,EACjC,kCAAkC,EAClC,KAAK,0BAA0B,EAC/B,gCAAgC,EAChC,KAAK,yBAAyB,EAC9B,+BAA+B,EAC/B,cAAc,EACd,KAAK,yBAAyB,EAC9B,+BAA+B,EAC/B,KAAK,qBAAqB,EAC1B,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,6BAA6B,GAC9B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs module for durable project-scoped background execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides a public SDK surface for one-off jobs, cron jobs, batch summaries,
|
|
5
|
+
* job target discovery, and the canonical split between user-visible `events`
|
|
6
|
+
* and raw debugging `logs`.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { VeryfrontJobsClient } from "veryfront/jobs";
|
|
13
|
+
*
|
|
14
|
+
* const jobs = new VeryfrontJobsClient({
|
|
15
|
+
* authToken: process.env.VERYFRONT_API_TOKEN,
|
|
16
|
+
* projectReference: "my-project",
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const job = await jobs.create({
|
|
20
|
+
* name: "Ingest 1 file",
|
|
21
|
+
* target: "task:knowledge-ingest",
|
|
22
|
+
* config: {
|
|
23
|
+
* file_count: 1,
|
|
24
|
+
* upload_ids: ["00000000-0000-0000-0000-000000000000"],
|
|
25
|
+
* },
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const events = await jobs.events(job.id);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import "../../_dnt.polyfills.js";
|
|
32
|
+
export { createJobsClient, VeryfrontJobsClient, } from "./jobs-client.js";
|
|
33
|
+
export { CronJobSchema, CronJobStatusSchema, JobBatchResultSchema, JobBatchSchema, JobBatchStatusCountsSchema, JobEventSchema, JobEventsResponseSchema, JobLogsResponseSchema, JobResultSchema, JobSchema, JobStatusSchema, JobTargetDefinitionSchema, JobTargetDefinitionsResponseSchema, KnowledgeIngestBatchSourceSchema, KnowledgeIngestFileResultSchema, PageInfoSchema, PaginatedCronJobsResponseSchema, PaginatedJobsResponseSchema, ReservedJobTargetFamilySchema, } from "./schemas.js";
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs client SDK for project-scoped background execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides a stable public client for one-off jobs, cron jobs, job batches,
|
|
5
|
+
* and job target discovery on the Veryfront Jobs API.
|
|
6
|
+
*/
|
|
7
|
+
import { type RetryConfig } from "../platform/adapters/veryfront-api-client/retry-handler.js";
|
|
8
|
+
import { type CronJob, type CronJobStatus, type Job, type JobBatch, type JobEventsResponse, type JobLogsResponse, type JobStatus, type JobTargetDefinition, type JobTargetDefinitionsResponse, type PaginatedCronJobsResponse, type PaginatedJobsResponse } from "./schemas.js";
|
|
9
|
+
export interface VeryfrontJobsClientConfig {
|
|
10
|
+
apiUrl?: string;
|
|
11
|
+
authToken?: string;
|
|
12
|
+
projectReference?: string;
|
|
13
|
+
retry?: Partial<RetryConfig>;
|
|
14
|
+
}
|
|
15
|
+
export interface ProjectScopedOptions {
|
|
16
|
+
projectReference?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ListJobsOptions extends ProjectScopedOptions {
|
|
19
|
+
cursor?: string;
|
|
20
|
+
limit?: number;
|
|
21
|
+
status?: JobStatus;
|
|
22
|
+
cronJobId?: string;
|
|
23
|
+
environmentId?: string;
|
|
24
|
+
batchId?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ListJobEventsOptions extends ProjectScopedOptions {
|
|
27
|
+
cursor?: string;
|
|
28
|
+
limit?: number;
|
|
29
|
+
direction?: "forward" | "backward";
|
|
30
|
+
}
|
|
31
|
+
export interface CreateJobInput extends ProjectScopedOptions {
|
|
32
|
+
name: string;
|
|
33
|
+
target: string;
|
|
34
|
+
environmentId?: string;
|
|
35
|
+
batchId?: string;
|
|
36
|
+
config?: Record<string, unknown>;
|
|
37
|
+
timeoutSeconds?: number;
|
|
38
|
+
backoffLimit?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface ListBatchJobsOptions extends ProjectScopedOptions {
|
|
41
|
+
cursor?: string;
|
|
42
|
+
limit?: number;
|
|
43
|
+
status?: JobStatus;
|
|
44
|
+
}
|
|
45
|
+
export interface CreateCronJobInput extends ProjectScopedOptions {
|
|
46
|
+
name: string;
|
|
47
|
+
target: string;
|
|
48
|
+
environmentId?: string;
|
|
49
|
+
schedule: string;
|
|
50
|
+
timezone?: string;
|
|
51
|
+
config?: Record<string, unknown>;
|
|
52
|
+
timeoutSeconds?: number;
|
|
53
|
+
backoffLimit?: number;
|
|
54
|
+
concurrencyPolicy?: "Allow" | "Forbid" | "Replace";
|
|
55
|
+
}
|
|
56
|
+
export interface ListCronJobsOptions extends ProjectScopedOptions {
|
|
57
|
+
cursor?: string;
|
|
58
|
+
limit?: number;
|
|
59
|
+
status?: CronJobStatus;
|
|
60
|
+
environmentId?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface UpdateCronJobInput extends ProjectScopedOptions {
|
|
63
|
+
name?: string;
|
|
64
|
+
schedule?: string;
|
|
65
|
+
timezone?: string;
|
|
66
|
+
config?: Record<string, unknown>;
|
|
67
|
+
timeoutSeconds?: number;
|
|
68
|
+
backoffLimit?: number;
|
|
69
|
+
concurrencyPolicy?: "Allow" | "Forbid" | "Replace";
|
|
70
|
+
status?: "active" | "paused";
|
|
71
|
+
}
|
|
72
|
+
type NamespaceMethod<TArgs extends unknown[], TResult> = (...args: TArgs) => Promise<TResult>;
|
|
73
|
+
export declare class VeryfrontJobsClient {
|
|
74
|
+
private readonly config;
|
|
75
|
+
private readonly retryConfig;
|
|
76
|
+
private requestToken?;
|
|
77
|
+
private requestProjectReference?;
|
|
78
|
+
readonly cron: {
|
|
79
|
+
create: NamespaceMethod<[CreateCronJobInput], CronJob>;
|
|
80
|
+
list: NamespaceMethod<[ListCronJobsOptions?], PaginatedCronJobsResponse>;
|
|
81
|
+
get: NamespaceMethod<[cronJobId: string, options?: ProjectScopedOptions], CronJob>;
|
|
82
|
+
update: NamespaceMethod<[cronJobId: string, input: UpdateCronJobInput], CronJob>;
|
|
83
|
+
delete: NamespaceMethod<[cronJobId: string, options?: ProjectScopedOptions], CronJob>;
|
|
84
|
+
trigger: NamespaceMethod<[cronJobId: string, options?: ProjectScopedOptions], Job>;
|
|
85
|
+
};
|
|
86
|
+
readonly batches: {
|
|
87
|
+
get: NamespaceMethod<[batchId: string, options?: ProjectScopedOptions], JobBatch>;
|
|
88
|
+
listJobs: NamespaceMethod<[
|
|
89
|
+
batchId: string,
|
|
90
|
+
options?: ListBatchJobsOptions
|
|
91
|
+
], PaginatedJobsResponse>;
|
|
92
|
+
};
|
|
93
|
+
readonly targets: {
|
|
94
|
+
list: NamespaceMethod<[options?: ProjectScopedOptions], JobTargetDefinitionsResponse>;
|
|
95
|
+
get: NamespaceMethod<[target: string, options?: ProjectScopedOptions], JobTargetDefinition>;
|
|
96
|
+
};
|
|
97
|
+
constructor(config?: VeryfrontJobsClientConfig);
|
|
98
|
+
setRequestToken(token: string): void;
|
|
99
|
+
clearRequestToken(): void;
|
|
100
|
+
setProjectReference(projectReference: string): void;
|
|
101
|
+
getProjectReference(): string | undefined;
|
|
102
|
+
clearProjectReference(): void;
|
|
103
|
+
create(input: CreateJobInput): Promise<Job>;
|
|
104
|
+
list(options?: ListJobsOptions): Promise<PaginatedJobsResponse>;
|
|
105
|
+
get(jobId: string, options?: ProjectScopedOptions): Promise<Job>;
|
|
106
|
+
/**
|
|
107
|
+
* Canonical user-visible operational output for a job.
|
|
108
|
+
* Prefer this over raw logs for status, progress, and per-file activity.
|
|
109
|
+
*/
|
|
110
|
+
events(jobId: string, options?: ListJobEventsOptions): Promise<JobEventsResponse>;
|
|
111
|
+
/**
|
|
112
|
+
* Raw debugging output for a job.
|
|
113
|
+
* This is secondary to `events()` for operational UX.
|
|
114
|
+
*/
|
|
115
|
+
logs(jobId: string, options?: ProjectScopedOptions): Promise<JobLogsResponse>;
|
|
116
|
+
cancel(jobId: string, options?: ProjectScopedOptions): Promise<Job>;
|
|
117
|
+
private createCronJob;
|
|
118
|
+
private listCronJobs;
|
|
119
|
+
private getCronJob;
|
|
120
|
+
private updateCronJob;
|
|
121
|
+
private deleteCronJob;
|
|
122
|
+
private triggerCronJob;
|
|
123
|
+
private getBatch;
|
|
124
|
+
private listBatchJobs;
|
|
125
|
+
private listTargets;
|
|
126
|
+
private getTarget;
|
|
127
|
+
private resolveApiUrl;
|
|
128
|
+
private resolveAuthToken;
|
|
129
|
+
private resolveProjectReference;
|
|
130
|
+
private requestProjectJson;
|
|
131
|
+
}
|
|
132
|
+
export declare function createJobsClient(config?: VeryfrontJobsClientConfig): VeryfrontJobsClient;
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=jobs-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs-client.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/jobs-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs client SDK for project-scoped background execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides a stable public client for one-off jobs, cron jobs, job batches,
|
|
5
|
+
* and job target discovery on the Veryfront Jobs API.
|
|
6
|
+
*/
|
|
7
|
+
import { getVeryfrontCloudBootstrap } from "../platform/cloud/resolver.js";
|
|
8
|
+
import { requestWithRetry, } from "../platform/adapters/veryfront-api-client/retry-handler.js";
|
|
9
|
+
import { API_CLIENT_ERROR } from "../platform/adapters/veryfront-api-client/types.js";
|
|
10
|
+
import { CronJobSchema, JobBatchSchema, JobEventsResponseSchema, JobLogsResponseSchema, JobSchema, JobTargetDefinitionSchema, JobTargetDefinitionsResponseSchema, PaginatedCronJobsResponseSchema, PaginatedJobsResponseSchema, } from "./schemas.js";
|
|
11
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
12
|
+
const DEFAULT_INITIAL_RETRY_DELAY_MS = 1_000;
|
|
13
|
+
const DEFAULT_MAX_RETRY_DELAY_MS = 10_000;
|
|
14
|
+
function toQueryParams(values) {
|
|
15
|
+
const params = new URLSearchParams();
|
|
16
|
+
for (const [key, value] of Object.entries(values)) {
|
|
17
|
+
if (value == null) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
params.set(key, String(value));
|
|
21
|
+
}
|
|
22
|
+
return params;
|
|
23
|
+
}
|
|
24
|
+
function withQuery(path, params) {
|
|
25
|
+
const query = params.toString();
|
|
26
|
+
return query.length > 0 ? `${path}?${query}` : path;
|
|
27
|
+
}
|
|
28
|
+
export class VeryfrontJobsClient {
|
|
29
|
+
config;
|
|
30
|
+
retryConfig;
|
|
31
|
+
requestToken;
|
|
32
|
+
requestProjectReference;
|
|
33
|
+
cron;
|
|
34
|
+
batches;
|
|
35
|
+
targets;
|
|
36
|
+
constructor(config = {}) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
this.retryConfig = {
|
|
39
|
+
maxRetries: config.retry?.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
40
|
+
initialDelay: config.retry?.initialDelay ?? DEFAULT_INITIAL_RETRY_DELAY_MS,
|
|
41
|
+
maxDelay: config.retry?.maxDelay ?? DEFAULT_MAX_RETRY_DELAY_MS,
|
|
42
|
+
};
|
|
43
|
+
this.cron = {
|
|
44
|
+
create: (input) => this.createCronJob(input),
|
|
45
|
+
list: (options) => this.listCronJobs(options),
|
|
46
|
+
get: (cronJobId, options) => this.getCronJob(cronJobId, options),
|
|
47
|
+
update: (cronJobId, input) => this.updateCronJob(cronJobId, input),
|
|
48
|
+
delete: (cronJobId, options) => this.deleteCronJob(cronJobId, options),
|
|
49
|
+
trigger: (cronJobId, options) => this.triggerCronJob(cronJobId, options),
|
|
50
|
+
};
|
|
51
|
+
this.batches = {
|
|
52
|
+
get: (batchId, options) => this.getBatch(batchId, options),
|
|
53
|
+
listJobs: (batchId, options) => this.listBatchJobs(batchId, options),
|
|
54
|
+
};
|
|
55
|
+
this.targets = {
|
|
56
|
+
list: (options) => this.listTargets(options),
|
|
57
|
+
get: (target, options) => this.getTarget(target, options),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
setRequestToken(token) {
|
|
61
|
+
this.requestToken = token;
|
|
62
|
+
}
|
|
63
|
+
clearRequestToken() {
|
|
64
|
+
this.requestToken = undefined;
|
|
65
|
+
}
|
|
66
|
+
setProjectReference(projectReference) {
|
|
67
|
+
this.requestProjectReference = projectReference;
|
|
68
|
+
}
|
|
69
|
+
getProjectReference() {
|
|
70
|
+
return this.requestProjectReference ?? this.config.projectReference;
|
|
71
|
+
}
|
|
72
|
+
clearProjectReference() {
|
|
73
|
+
this.requestProjectReference = undefined;
|
|
74
|
+
}
|
|
75
|
+
create(input) {
|
|
76
|
+
const { projectReference, environmentId, batchId, timeoutSeconds, backoffLimit, ...rest } = input;
|
|
77
|
+
return this.requestProjectJson(projectReference, "/jobs", JobSchema, {
|
|
78
|
+
method: "POST",
|
|
79
|
+
body: {
|
|
80
|
+
...rest,
|
|
81
|
+
environment_id: environmentId,
|
|
82
|
+
batch_id: batchId,
|
|
83
|
+
timeout_seconds: timeoutSeconds,
|
|
84
|
+
backoff_limit: backoffLimit,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
list(options = {}) {
|
|
89
|
+
const { projectReference, cursor, limit, status, cronJobId, environmentId, batchId } = options;
|
|
90
|
+
return this.requestProjectJson(projectReference, withQuery("/jobs", toQueryParams({
|
|
91
|
+
cursor,
|
|
92
|
+
limit,
|
|
93
|
+
status,
|
|
94
|
+
cron_job_id: cronJobId,
|
|
95
|
+
environment_id: environmentId,
|
|
96
|
+
batch_id: batchId,
|
|
97
|
+
})), PaginatedJobsResponseSchema);
|
|
98
|
+
}
|
|
99
|
+
get(jobId, options = {}) {
|
|
100
|
+
return this.requestProjectJson(options.projectReference, `/jobs/${encodeURIComponent(jobId)}`, JobSchema);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Canonical user-visible operational output for a job.
|
|
104
|
+
* Prefer this over raw logs for status, progress, and per-file activity.
|
|
105
|
+
*/
|
|
106
|
+
events(jobId, options = {}) {
|
|
107
|
+
const { projectReference, cursor, limit, direction } = options;
|
|
108
|
+
return this.requestProjectJson(projectReference, withQuery(`/jobs/${encodeURIComponent(jobId)}/events`, toQueryParams({ cursor, limit, direction })), JobEventsResponseSchema);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Raw debugging output for a job.
|
|
112
|
+
* This is secondary to `events()` for operational UX.
|
|
113
|
+
*/
|
|
114
|
+
logs(jobId, options = {}) {
|
|
115
|
+
return this.requestProjectJson(options.projectReference, `/jobs/${encodeURIComponent(jobId)}/logs`, JobLogsResponseSchema);
|
|
116
|
+
}
|
|
117
|
+
cancel(jobId, options = {}) {
|
|
118
|
+
return this.requestProjectJson(options.projectReference, `/jobs/${encodeURIComponent(jobId)}/cancel`, JobSchema, { method: "POST" });
|
|
119
|
+
}
|
|
120
|
+
createCronJob(input) {
|
|
121
|
+
const { projectReference, environmentId, timeoutSeconds, backoffLimit, concurrencyPolicy, ...rest } = input;
|
|
122
|
+
return this.requestProjectJson(projectReference, "/cron-jobs", CronJobSchema, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
body: {
|
|
125
|
+
...rest,
|
|
126
|
+
environment_id: environmentId,
|
|
127
|
+
timeout_seconds: timeoutSeconds,
|
|
128
|
+
backoff_limit: backoffLimit,
|
|
129
|
+
concurrency_policy: concurrencyPolicy,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
listCronJobs(options = {}) {
|
|
134
|
+
const { projectReference, cursor, limit, status, environmentId } = options;
|
|
135
|
+
return this.requestProjectJson(projectReference, withQuery("/cron-jobs", toQueryParams({
|
|
136
|
+
cursor,
|
|
137
|
+
limit,
|
|
138
|
+
status,
|
|
139
|
+
environment_id: environmentId,
|
|
140
|
+
})), PaginatedCronJobsResponseSchema);
|
|
141
|
+
}
|
|
142
|
+
getCronJob(cronJobId, options = {}) {
|
|
143
|
+
return this.requestProjectJson(options.projectReference, `/cron-jobs/${encodeURIComponent(cronJobId)}`, CronJobSchema);
|
|
144
|
+
}
|
|
145
|
+
updateCronJob(cronJobId, input) {
|
|
146
|
+
const { projectReference, timeoutSeconds, backoffLimit, concurrencyPolicy, ...rest } = input;
|
|
147
|
+
return this.requestProjectJson(projectReference, `/cron-jobs/${encodeURIComponent(cronJobId)}`, CronJobSchema, {
|
|
148
|
+
method: "PATCH",
|
|
149
|
+
body: {
|
|
150
|
+
...rest,
|
|
151
|
+
timeout_seconds: timeoutSeconds,
|
|
152
|
+
backoff_limit: backoffLimit,
|
|
153
|
+
concurrency_policy: concurrencyPolicy,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
deleteCronJob(cronJobId, options = {}) {
|
|
158
|
+
return this.requestProjectJson(options.projectReference, `/cron-jobs/${encodeURIComponent(cronJobId)}`, CronJobSchema, { method: "DELETE" });
|
|
159
|
+
}
|
|
160
|
+
triggerCronJob(cronJobId, options = {}) {
|
|
161
|
+
return this.requestProjectJson(options.projectReference, `/cron-jobs/${encodeURIComponent(cronJobId)}/trigger`, JobSchema, { method: "POST" });
|
|
162
|
+
}
|
|
163
|
+
getBatch(batchId, options = {}) {
|
|
164
|
+
return this.requestProjectJson(options.projectReference, `/job-batches/${encodeURIComponent(batchId)}`, JobBatchSchema);
|
|
165
|
+
}
|
|
166
|
+
listBatchJobs(batchId, options = {}) {
|
|
167
|
+
const { projectReference, cursor, limit, status } = options;
|
|
168
|
+
return this.requestProjectJson(projectReference, withQuery(`/job-batches/${encodeURIComponent(batchId)}/jobs`, toQueryParams({
|
|
169
|
+
cursor,
|
|
170
|
+
limit,
|
|
171
|
+
status,
|
|
172
|
+
})), PaginatedJobsResponseSchema);
|
|
173
|
+
}
|
|
174
|
+
listTargets(options = {}) {
|
|
175
|
+
return this.requestProjectJson(options.projectReference, "/job-targets", JobTargetDefinitionsResponseSchema);
|
|
176
|
+
}
|
|
177
|
+
getTarget(target, options = {}) {
|
|
178
|
+
return this.requestProjectJson(options.projectReference, `/job-targets/${encodeURIComponent(target)}`, JobTargetDefinitionSchema);
|
|
179
|
+
}
|
|
180
|
+
resolveApiUrl() {
|
|
181
|
+
return this.config.apiUrl ?? getVeryfrontCloudBootstrap().apiBaseUrl;
|
|
182
|
+
}
|
|
183
|
+
resolveAuthToken() {
|
|
184
|
+
const token = this.requestToken ?? this.config.authToken ??
|
|
185
|
+
getVeryfrontCloudBootstrap().apiToken;
|
|
186
|
+
if (token) {
|
|
187
|
+
return token;
|
|
188
|
+
}
|
|
189
|
+
throw API_CLIENT_ERROR.create({
|
|
190
|
+
detail: "Jobs auth not configured. Set VERYFRONT_API_TOKEN, provide request-scoped Veryfront credentials, or pass authToken explicitly.",
|
|
191
|
+
status: 401,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
resolveProjectReference(projectReference) {
|
|
195
|
+
const resolved = projectReference ??
|
|
196
|
+
this.requestProjectReference ??
|
|
197
|
+
this.config.projectReference ??
|
|
198
|
+
getVeryfrontCloudBootstrap().projectSlug;
|
|
199
|
+
if (resolved) {
|
|
200
|
+
return resolved;
|
|
201
|
+
}
|
|
202
|
+
throw API_CLIENT_ERROR.create({
|
|
203
|
+
detail: "Jobs project reference not configured. Pass projectReference explicitly, set VERYFRONT_PROJECT_SLUG, or provide request-scoped Veryfront project context.",
|
|
204
|
+
status: 400,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async requestProjectJson(projectReference, path, schema, options = {}) {
|
|
208
|
+
const resolvedProjectReference = this.resolveProjectReference(projectReference);
|
|
209
|
+
const raw = await requestWithRetry(`${this.resolveApiUrl()}/projects/${encodeURIComponent(resolvedProjectReference)}${path}`, this.resolveAuthToken(), this.retryConfig, {
|
|
210
|
+
method: options.method,
|
|
211
|
+
body: options.body == null ? undefined : JSON.stringify(options.body),
|
|
212
|
+
});
|
|
213
|
+
return schema.parse(raw);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export function createJobsClient(config) {
|
|
217
|
+
return new VeryfrontJobsClient(config);
|
|
218
|
+
}
|