@silvermoon-work/task-builder 0.0.0 → 0.1.0-canary-261109-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/dist/node.js ADDED
@@ -0,0 +1,142 @@
1
+ import { constants } from "node:fs";
2
+ import { mkdir, open, readdir, realpath, rmdir, stat, unlink } from "node:fs/promises";
3
+ import { dirname, join, relative, resolve, sep } from "node:path";
4
+ import { Readable } from "node:stream";
5
+ import { checkTreePath, listTree, treeError, } from "./tree.js";
6
+ function inside(root, path) {
7
+ const distance = relative(root, path);
8
+ return (!distance || (!distance.startsWith(`..${sep}`) && distance !== ".." && !distance.includes(":")));
9
+ }
10
+ /** A live read-only view, not an atomic snapshot. Confined dependency links are followed. */
11
+ export async function directoryTree(directory) {
12
+ const root = await realpath(resolve(directory));
13
+ if (!(await stat(root)).isDirectory())
14
+ throw treeError("ENOTDIR", root, "Input must be a directory");
15
+ const locate = async (path) => {
16
+ checkTreePath(path);
17
+ const target = await realpath(join(root, ...path.split("/")));
18
+ if (!inside(root, target))
19
+ throw treeError("EINVAL", path, "Link escapes input tree");
20
+ return target;
21
+ };
22
+ return Object.freeze({
23
+ async list(path, options = {}) {
24
+ options.signal?.throwIfAborted();
25
+ const entries = [];
26
+ for (const entry of await readdir(await locate(path), { withFileTypes: true })) {
27
+ options.signal?.throwIfAborted();
28
+ const child = path ? `${path}/${entry.name}` : entry.name;
29
+ const target = entry.isSymbolicLink() ? await locate(child) : undefined;
30
+ const info = target ? await stat(target) : entry;
31
+ if (!info.isFile() && !info.isDirectory())
32
+ throw treeError("EINVAL", child, "Tree contains a special file");
33
+ entries.push({
34
+ name: entry.name,
35
+ kind: info.isDirectory() ? "directory" : "file",
36
+ ...(target !== undefined ? { target: relative(root, target).split(sep).join("/") } : {}),
37
+ });
38
+ }
39
+ return entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
40
+ },
41
+ async read(path, options = {}) {
42
+ options.signal?.throwIfAborted();
43
+ const target = await locate(path);
44
+ if (!(await stat(target)).isFile())
45
+ throw treeError("EISDIR", path, "Expected a regular file");
46
+ const handle = await open(target, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
47
+ return Readable.toWeb(handle.createReadStream({
48
+ highWaterMark: 65_536,
49
+ ...(options.signal ? { signal: options.signal } : {}),
50
+ }));
51
+ },
52
+ });
53
+ }
54
+ /** Write sequentially into a new directory; never replace an existing output. */
55
+ export async function writeDirectory(tree, directory, options = {}) {
56
+ options.signal?.throwIfAborted();
57
+ const output = resolve(directory);
58
+ const parent = await realpath(dirname(output));
59
+ if (parent !== dirname(output))
60
+ throw new Error("Output parent must be canonical, without links.");
61
+ await mkdir(output, { recursive: false });
62
+ const files = [];
63
+ const directories = [output];
64
+ const write = async (path) => {
65
+ for (const entry of await listTree(tree, path, options)) {
66
+ options.signal?.throwIfAborted();
67
+ const child = path ? `${path}/${entry.name}` : entry.name;
68
+ const target = join(output, ...child.split("/"));
69
+ if (entry.kind === "directory") {
70
+ await mkdir(target);
71
+ directories.push(target);
72
+ await write(child);
73
+ }
74
+ else {
75
+ const handle = await open(target, "wx");
76
+ files.push(target);
77
+ let reader;
78
+ let complete = false;
79
+ try {
80
+ reader = (await tree.read(child, options)).getReader();
81
+ for (;;) {
82
+ options.signal?.throwIfAborted();
83
+ const item = await reader.read();
84
+ if (item.done) {
85
+ complete = true;
86
+ break;
87
+ }
88
+ let offset = 0;
89
+ while (offset < item.value.byteLength) {
90
+ options.signal?.throwIfAborted();
91
+ const { bytesWritten } = await handle.write(item.value, offset);
92
+ if (!bytesWritten)
93
+ throw new Error(`Output write made no progress: ${child}`);
94
+ offset += bytesWritten;
95
+ }
96
+ }
97
+ }
98
+ finally {
99
+ try {
100
+ if (reader) {
101
+ try {
102
+ if (!complete)
103
+ await reader.cancel();
104
+ }
105
+ finally {
106
+ reader.releaseLock();
107
+ }
108
+ }
109
+ }
110
+ finally {
111
+ await handle.close();
112
+ }
113
+ }
114
+ }
115
+ }
116
+ };
117
+ try {
118
+ await write("");
119
+ return files.map((file) => relative(output, file).split(sep).join("/")).sort();
120
+ }
121
+ catch (error) {
122
+ const errors = [error];
123
+ for (const file of [...files].reverse())
124
+ try {
125
+ await unlink(file);
126
+ }
127
+ catch (cleanupError) {
128
+ errors.push(cleanupError);
129
+ }
130
+ for (const directory of [...directories].reverse())
131
+ try {
132
+ await rmdir(directory);
133
+ }
134
+ catch (cleanupError) {
135
+ errors.push(cleanupError);
136
+ }
137
+ if (errors.length > 1)
138
+ throw new AggregateError(errors, "Build failed and output cleanup failed.");
139
+ throw error;
140
+ }
141
+ }
142
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ReadonlyFileTree, type ReadOptions } from "./tree.js";
2
+ export declare function resourceStream(input: ReadonlyFileTree, source: string, path: string, binary: boolean, fileBytes: number, observe: (path: string, bytes: number) => void, options: ReadOptions): ReadableStream<Uint8Array>;
3
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE/E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EAC9C,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,UAAU,CAAC,CA6E5B"}
@@ -0,0 +1,84 @@
1
+ import { createTaskTextNormalizer } from "@silvermoon-work/task-protocol";
2
+ import { treeError } from "./tree.js";
3
+ export function resourceStream(input, source, path, binary, fileBytes, observe, options) {
4
+ let reader;
5
+ let pending;
6
+ let stopped = false;
7
+ let bytes = 0;
8
+ const normalizer = binary ? undefined : createTaskTextNormalizer(path);
9
+ let removeAbort = () => { };
10
+ const close = async (reason) => {
11
+ stopped = true;
12
+ removeAbort();
13
+ if (!reader && pending)
14
+ reader = (await pending).getReader();
15
+ if (reader) {
16
+ try {
17
+ await reader.cancel(reason);
18
+ }
19
+ finally {
20
+ reader.releaseLock();
21
+ reader = undefined;
22
+ }
23
+ }
24
+ };
25
+ return new ReadableStream({
26
+ start(controller) {
27
+ const abort = () => {
28
+ controller.error(options.signal?.reason);
29
+ void close(options.signal?.reason).catch((error) => {
30
+ // Cancellation errors are observable through the errored output stream.
31
+ controller.error(error);
32
+ });
33
+ };
34
+ options.signal?.addEventListener("abort", abort, { once: true });
35
+ removeAbort = () => options.signal?.removeEventListener("abort", abort);
36
+ if (options.signal?.aborted)
37
+ abort();
38
+ },
39
+ async pull(controller) {
40
+ try {
41
+ options.signal?.throwIfAborted();
42
+ if (!reader) {
43
+ pending = input.read(source, options);
44
+ const stream = await pending;
45
+ if (stopped)
46
+ return;
47
+ reader = stream.getReader();
48
+ pending = undefined;
49
+ }
50
+ for (;;) {
51
+ const item = await reader.read();
52
+ if (stopped)
53
+ return;
54
+ options.signal?.throwIfAborted();
55
+ if (item.done) {
56
+ normalizer?.finish();
57
+ observe(path, bytes);
58
+ reader.releaseLock();
59
+ reader = undefined;
60
+ stopped = true;
61
+ removeAbort();
62
+ controller.close();
63
+ return;
64
+ }
65
+ const output = normalizer ? normalizer.push(item.value) : item.value.slice();
66
+ bytes += output.byteLength;
67
+ if (bytes > fileBytes)
68
+ throw treeError("capacity_exceeded", path, "Resource exceeds byte limit");
69
+ observe(path, bytes);
70
+ if (output.byteLength) {
71
+ controller.enqueue(output);
72
+ return;
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ controller.error(error);
78
+ await close(error);
79
+ }
80
+ },
81
+ cancel: close,
82
+ }, { highWaterMark: 0 });
83
+ }
84
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"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"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ export interface TreeEntry {
2
+ readonly name: string;
3
+ readonly kind: "file" | "directory";
4
+ /** Optional canonical tree-relative target for a filesystem dependency alias. */
5
+ readonly target?: string;
6
+ }
7
+ export interface ReadOptions {
8
+ readonly signal?: AbortSignal;
9
+ }
10
+ export interface ReadonlyFileTree {
11
+ list(path: string, options?: ReadOptions): Promise<readonly TreeEntry[]>;
12
+ read(path: string, options?: ReadOptions): Promise<ReadableStream<Uint8Array>>;
13
+ }
14
+ export declare function treeError(code: string, path: string, message: string): NodeJS.ErrnoException;
15
+ export declare function checkTreePath(path: string): void;
16
+ export declare function listTree(tree: ReadonlyFileTree, path: string, options?: ReadOptions): Promise<readonly TreeEntry[]>;
17
+ export declare function readBytes(tree: ReadonlyFileTree, path: string, limit: number, options?: ReadOptions, observe?: (bytes: number) => void): Promise<Uint8Array>;
18
+ export declare function memoryFile(bytes: Uint8Array, options?: ReadOptions): import("stream/web").ReadableStream<Uint8Array<ArrayBufferLike>>;
19
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;CAChF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,CAE5F;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAkB/B;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,EACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,WAAgB,oEAetE"}
package/dist/tree.js ADDED
@@ -0,0 +1,84 @@
1
+ export function treeError(code, path, message) {
2
+ return Object.assign(new Error(`${message}: ${path || "."}`), { code, path });
3
+ }
4
+ export function checkTreePath(path) {
5
+ if (path !== "" &&
6
+ (path.startsWith("/") ||
7
+ path.includes("\\") ||
8
+ path.includes(":") ||
9
+ [...path].some((character) => character.charCodeAt(0) < 32) ||
10
+ path.split("/").some((part) => !part || part === "." || part === "..")))
11
+ throw treeError("EINVAL", path, "Expected a relative file-tree path");
12
+ }
13
+ export async function listTree(tree, path, options = {}) {
14
+ checkTreePath(path);
15
+ options.signal?.throwIfAborted();
16
+ const entries = await tree.list(path, options);
17
+ const names = new Set();
18
+ for (const entry of entries) {
19
+ checkTreePath(entry.name);
20
+ if (entry.target !== undefined)
21
+ checkTreePath(entry.target);
22
+ if (!entry.name ||
23
+ entry.name.includes("/") ||
24
+ names.has(entry.name) ||
25
+ !["file", "directory"].includes(entry.kind))
26
+ throw treeError("EINVAL", path, "Invalid or duplicate tree entry");
27
+ names.add(entry.name);
28
+ }
29
+ return [...entries].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
30
+ }
31
+ export async function readBytes(tree, path, limit, options = {}, observe) {
32
+ checkTreePath(path);
33
+ options.signal?.throwIfAborted();
34
+ const reader = (await tree.read(path, options)).getReader();
35
+ let abort = () => { };
36
+ const aborted = new Promise((_resolve, reject) => {
37
+ abort = () => reject(options.signal?.reason);
38
+ });
39
+ options.signal?.addEventListener("abort", abort, { once: true });
40
+ const chunks = [];
41
+ let length = 0;
42
+ let complete = false;
43
+ try {
44
+ for (;;) {
45
+ options.signal?.throwIfAborted();
46
+ const item = await Promise.race([reader.read(), aborted]);
47
+ options.signal?.throwIfAborted();
48
+ if (item.done) {
49
+ complete = true;
50
+ return Buffer.concat(chunks, length);
51
+ }
52
+ length += item.value.byteLength;
53
+ if (length > limit)
54
+ throw treeError("capacity_exceeded", path, "File exceeds byte limit");
55
+ observe?.(item.value.byteLength);
56
+ chunks.push(item.value.slice());
57
+ }
58
+ }
59
+ finally {
60
+ options.signal?.removeEventListener("abort", abort);
61
+ try {
62
+ if (!complete)
63
+ await reader.cancel();
64
+ }
65
+ finally {
66
+ reader.releaseLock();
67
+ }
68
+ }
69
+ }
70
+ export function memoryFile(bytes, options = {}) {
71
+ let sent = false;
72
+ return new ReadableStream({
73
+ pull(controller) {
74
+ options.signal?.throwIfAborted();
75
+ if (sent)
76
+ controller.close();
77
+ else {
78
+ sent = true;
79
+ controller.enqueue(bytes.slice());
80
+ }
81
+ },
82
+ }, { highWaterMark: 0 });
83
+ }
84
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Hello
@@ -0,0 +1,15 @@
1
+ {
2
+ "input": {
3
+ "type": "object",
4
+ "properties": { "text": { "type": "string" } },
5
+ "required": ["text"],
6
+ "additionalProperties": false
7
+ },
8
+ "result": {
9
+ "type": "object",
10
+ "properties": { "text": { "type": "string" } },
11
+ "required": ["text"],
12
+ "additionalProperties": false
13
+ },
14
+ "message": false
15
+ }
@@ -0,0 +1,18 @@
1
+ import { runTask } from "@potential-guide/task-sdk";
2
+
3
+ runTask<{ text: string }, { text: string }>(async (input, context) => {
4
+ const reader = context.bundle.read("resources/greeting.txt").getReader();
5
+ const decoder = new TextDecoder();
6
+ let greeting = "";
7
+ try {
8
+ for (;;) {
9
+ const item = await reader.read();
10
+ if (item.done) break;
11
+ greeting += decoder.decode(item.value, { stream: true });
12
+ }
13
+ greeting += decoder.decode();
14
+ } finally {
15
+ reader.releaseLock();
16
+ }
17
+ return { text: `${greeting.trim()} ${input.text}` };
18
+ });
@@ -0,0 +1,12 @@
1
+ name: Echo
2
+ runtime:
3
+ minVersion: "22.13.0"
4
+ source:
5
+ entry: src/main.ts
6
+ contract: src/contract.json
7
+ mode: explicit
8
+ include:
9
+ - from: assets/**
10
+ to: resources/
11
+ outDirectory: dist
12
+ binary: []
package/package.json CHANGED
@@ -1,13 +1,62 @@
1
1
  {
2
2
  "name": "@silvermoon-work/task-builder",
3
- "version": "0.0.0",
4
- "description": "Task builder for composing and configuring generic task pipelines. Bootstrap placeholder only.",
3
+ "version": "0.1.0-canary-261109-1",
4
+ "description": "Task Bundle builds from read-only file trees with streaming resources.",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./node": {
15
+ "types": "./dist/node.d.ts",
16
+ "import": "./dist/node.js"
17
+ }
18
+ },
19
+ "bin": {
20
+ "task-builder": "./dist/cli.js"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "examples",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "engines": {
29
+ "node": ">=22.13.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org/"
34
+ },
5
35
  "license": "MIT",
36
+ "dependencies": {
37
+ "@sinclair/typebox": "0.34.52",
38
+ "enhanced-resolve": "5.18.3",
39
+ "esbuild": "0.25.12",
40
+ "yaml": "2.9.1",
41
+ "@silvermoon-work/task-protocol": "0.1.0-canary-261109-2"
42
+ },
43
+ "devDependencies": {
44
+ "@potential-guide/task-sdk": "0.1.0-rc.2"
45
+ },
6
46
  "repository": {
7
47
  "type": "git",
8
- "url": "git+https://github.com/silvermoon-work/task-engine.git"
48
+ "url": "git+https://github.com/silvermoon-work/task-engine.git",
49
+ "directory": "packages/task-builder"
9
50
  },
10
- "publishConfig": {
11
- "access": "public"
51
+ "homepage": "https://github.com/silvermoon-work/task-engine/tree/main/packages/task-builder#readme",
52
+ "bugs": {
53
+ "url": "https://github.com/silvermoon-work/task-engine/issues"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc -b",
57
+ "clean": "node -e \"for (const path of ['dist', '.cache']) require('node:fs').rmSync(path, { recursive: true, force: true })\"",
58
+ "lint": "biome lint .",
59
+ "test": "tsx --test \"test/*.test.ts\"",
60
+ "typecheck": "tsc -b --pretty false"
12
61
  }
13
- }
62
+ }