@silvermoon-work/task-builder 0.0.0 → 0.1.0-canary-261109-2

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/init.js ADDED
@@ -0,0 +1,100 @@
1
+ import { taskSchemaUri, validateTaskBundle } from "@silvermoon-work/task-protocol";
2
+ import { stringify } from "yaml";
3
+ import { memoryTree } from "./tree.js";
4
+ /** Generate an owned template tree only; never touch a directory or install dependencies. */
5
+ export function createTaskProject(options = {}) {
6
+ const name = options.name ?? "task-project";
7
+ if (name.length > 214 ||
8
+ ["node_modules", "favicon.ico"].includes(name) ||
9
+ !/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(name))
10
+ throw new Error("Task project name must be a valid lowercase npm package name.");
11
+ const taskName = options.taskName ?? "Echo";
12
+ const minVersion = options.minRuntimeVersion ?? "22.13.0";
13
+ const sdkVersion = options.sdkVersion ?? "0.1.0-rc.2";
14
+ if (!sdkVersion.trim() || [...sdkVersion].some((char) => char.charCodeAt(0) < 32))
15
+ throw new Error("Dependency specifiers must be nonempty without control characters.");
16
+ validateTaskBundle({
17
+ $schema: taskSchemaUri,
18
+ name: taskName,
19
+ runtime: { type: "node", minVersion },
20
+ entry: "worker.cjs",
21
+ include: ["task.yaml", "worker.cjs"],
22
+ binary: [],
23
+ inputSchema: { type: "object" },
24
+ resultSchema: true,
25
+ messageSchema: false,
26
+ });
27
+ const textId = "https://task.invalid/echo/text";
28
+ const files = {
29
+ "package.json": `${JSON.stringify({
30
+ name,
31
+ version: "0.0.0",
32
+ private: true,
33
+ type: "module",
34
+ engines: { node: ">=22.13.0" },
35
+ dependencies: { "@potential-guide/task-sdk": sdkVersion },
36
+ }, null, 2)}\n`,
37
+ ".gitignore": "node_modules/\ndist/\nbundle.car\nbundle.cid\n.verification/\n",
38
+ "task.build.yaml": stringify({
39
+ name: taskName,
40
+ runtime: { minVersion },
41
+ source: { entry: "src/main.ts", contract: "src/contract.json", mode: "explicit" },
42
+ include: [{ from: "assets/**", to: "resources/" }],
43
+ outDirectory: "dist",
44
+ binary: [],
45
+ }),
46
+ "src/contract.json": `${JSON.stringify({
47
+ input: {
48
+ type: "object",
49
+ properties: { text: { $ref: textId } },
50
+ required: ["text"],
51
+ additionalProperties: false,
52
+ },
53
+ result: {
54
+ type: "object",
55
+ properties: {
56
+ text: { $ref: textId },
57
+ bytes: { type: "integer", minimum: 0 },
58
+ chunks: { type: "integer", minimum: 1 },
59
+ },
60
+ required: ["text", "bytes", "chunks"],
61
+ additionalProperties: false,
62
+ },
63
+ message: false,
64
+ schemas: { text: { $id: textId, type: "string", minLength: 1 } },
65
+ }, null, 2)}\n`,
66
+ "src/helper.ts": `export function greet(prefix: string, text: string): string {
67
+ return \`\${prefix.trim()} \${text}\`;
68
+ }
69
+ `,
70
+ "src/main.ts": `import { runTask } from "@potential-guide/task-sdk";
71
+ import { greet } from "./helper.js";
72
+
73
+ runTask<{ text: string }, { text: string; bytes: number; chunks: number }>(
74
+ async (input, context) => {
75
+ const reader = context.bundle.read("resources/greeting.txt").getReader();
76
+ const decoder = new TextDecoder("utf-8", { fatal: true });
77
+ let prefix = "";
78
+ let bytes = 0;
79
+ let chunks = 0;
80
+ try {
81
+ for (;;) {
82
+ const item = await reader.read();
83
+ if (item.done) break;
84
+ prefix += decoder.decode(item.value, { stream: true });
85
+ bytes += item.value.byteLength;
86
+ chunks++;
87
+ }
88
+ prefix += decoder.decode();
89
+ } finally {
90
+ reader.releaseLock();
91
+ }
92
+ return { text: greet(prefix, input.text), bytes, chunks };
93
+ },
94
+ );
95
+ `,
96
+ "assets/greeting.txt": "Hello\n",
97
+ };
98
+ return memoryTree(new Map(Object.entries(files).map(([path, text]) => [path, Buffer.from(text)])));
99
+ }
100
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.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) : Uint8Array.from(item.value);
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,24 @@
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
+ export type FileReader = (options: ReadOptions) => Promise<ReadableStream<Uint8Array>> | ReadableStream<Uint8Array>;
20
+ export declare function fileTree(files: ReadonlyMap<string, FileReader>): ReadonlyFileTree;
21
+ export declare function memoryTree(files: ReadonlyMap<string, Uint8Array>): ReadonlyFileTree;
22
+ export declare function streamChunks(stream: ReadableStream<Uint8Array>, options?: ReadOptions, observe?: (bytes: number) => void): AsyncGenerator<Uint8Array>;
23
+ export declare function iteratorStream(iterator: AsyncIterator<Uint8Array>, options?: ReadOptions, release?: () => Promise<void>): ReadableStream<Uint8Array>;
24
+ //# 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,CAarB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,WAAgB,oEAetE;AACD,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAEtE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,gBAAgB,CA2CjF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,gBAAgB,CASnF;AAED,wBAAuB,YAAY,CACjC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,OAAO,GAAE,WAAgB,EACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAChC,cAAc,CAAC,UAAU,CAAC,CA8B5B;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,OAAO,GAAE,WAAgB,EACzB,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB,GAC5C,cAAc,CAAC,UAAU,CAAC,CA6C5B"}
package/dist/tree.js ADDED
@@ -0,0 +1,196 @@
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 chunks = [];
35
+ let length = 0;
36
+ for await (const chunk of streamChunks(await tree.read(path, options), options, (bytes) => {
37
+ length += bytes;
38
+ if (length > limit)
39
+ throw treeError("capacity_exceeded", path, "File exceeds byte limit");
40
+ observe?.(bytes);
41
+ })) {
42
+ chunks.push(chunk);
43
+ }
44
+ return Buffer.concat(chunks, length);
45
+ }
46
+ export function memoryFile(bytes, options = {}) {
47
+ let sent = false;
48
+ return new ReadableStream({
49
+ pull(controller) {
50
+ options.signal?.throwIfAborted();
51
+ if (sent)
52
+ controller.close();
53
+ else {
54
+ sent = true;
55
+ controller.enqueue(Uint8Array.from(bytes));
56
+ }
57
+ },
58
+ }, { highWaterMark: 0 });
59
+ }
60
+ export function fileTree(files) {
61
+ const readers = new Map(files);
62
+ const directories = new Map([["", new Map()]]);
63
+ for (const path of readers.keys()) {
64
+ checkTreePath(path);
65
+ if (!path)
66
+ throw treeError("EINVAL", path, "File path must not be empty");
67
+ const parts = path.split("/");
68
+ let parent = "";
69
+ for (const [index, name] of parts.entries()) {
70
+ const directory = index < parts.length - 1;
71
+ const children = directories.get(parent);
72
+ if (!children)
73
+ throw treeError("EINVAL", parent, "Missing parent directory");
74
+ const previous = children.get(name);
75
+ const kind = directory ? "directory" : "file";
76
+ if (previous && previous.kind !== kind)
77
+ throw treeError("EINVAL", path, "File/directory collision");
78
+ children.set(name, { name, kind });
79
+ if (directory) {
80
+ parent = parent ? `${parent}/${name}` : name;
81
+ if (!directories.has(parent))
82
+ directories.set(parent, new Map());
83
+ }
84
+ }
85
+ }
86
+ return Object.freeze({
87
+ async list(path, options = {}) {
88
+ checkTreePath(path);
89
+ options.signal?.throwIfAborted();
90
+ const children = directories.get(path);
91
+ if (!children)
92
+ throw treeError(readers.has(path) ? "ENOTDIR" : "ENOENT", path, "Directory not found");
93
+ return [...children.values()]
94
+ .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))
95
+ .map((entry) => Object.freeze({ ...entry }));
96
+ },
97
+ async read(path, options = {}) {
98
+ checkTreePath(path);
99
+ options.signal?.throwIfAborted();
100
+ const read = readers.get(path);
101
+ if (!read)
102
+ throw treeError(directories.has(path) ? "EISDIR" : "ENOENT", path, "File not found");
103
+ return read(options);
104
+ },
105
+ });
106
+ }
107
+ export function memoryTree(files) {
108
+ return fileTree(new Map([...files].map(([path, bytes]) => {
109
+ const owned = Uint8Array.from(bytes);
110
+ return [path, (options) => memoryFile(owned, options)];
111
+ })));
112
+ }
113
+ export async function* streamChunks(stream, options = {}, observe) {
114
+ const reader = stream.getReader();
115
+ let complete = false;
116
+ let abort = () => { };
117
+ const aborted = new Promise((_resolve, reject) => {
118
+ abort = () => reject(options.signal?.reason);
119
+ });
120
+ options.signal?.addEventListener("abort", abort, { once: true });
121
+ try {
122
+ for (;;) {
123
+ options.signal?.throwIfAborted();
124
+ const item = await Promise.race([reader.read(), aborted]);
125
+ options.signal?.throwIfAborted();
126
+ if (item.done) {
127
+ complete = true;
128
+ return;
129
+ }
130
+ if (!(item.value instanceof Uint8Array))
131
+ throw new Error("File streams require Uint8Array chunks.");
132
+ observe?.(item.value.byteLength);
133
+ yield Uint8Array.from(item.value);
134
+ }
135
+ }
136
+ finally {
137
+ options.signal?.removeEventListener("abort", abort);
138
+ try {
139
+ if (!complete)
140
+ await reader.cancel();
141
+ }
142
+ finally {
143
+ reader.releaseLock();
144
+ }
145
+ }
146
+ }
147
+ export function iteratorStream(iterator, options = {}, release = async () => { }) {
148
+ let stopped = false;
149
+ let removeAbort = () => { };
150
+ let cleanup;
151
+ const close = () => {
152
+ cleanup ??= (async () => {
153
+ stopped = true;
154
+ removeAbort();
155
+ try {
156
+ await iterator.return?.();
157
+ }
158
+ finally {
159
+ await release();
160
+ }
161
+ })();
162
+ return cleanup;
163
+ };
164
+ return new ReadableStream({
165
+ start(controller) {
166
+ const abort = () => {
167
+ controller.error(options.signal?.reason);
168
+ void close().catch((error) => controller.error(error));
169
+ };
170
+ options.signal?.addEventListener("abort", abort, { once: true });
171
+ removeAbort = () => options.signal?.removeEventListener("abort", abort);
172
+ if (options.signal?.aborted)
173
+ abort();
174
+ },
175
+ async pull(controller) {
176
+ try {
177
+ options.signal?.throwIfAborted();
178
+ const item = await iterator.next();
179
+ if (stopped)
180
+ return;
181
+ if (item.done) {
182
+ await close();
183
+ controller.close();
184
+ }
185
+ else
186
+ controller.enqueue(item.value);
187
+ }
188
+ catch (error) {
189
+ controller.error(error);
190
+ await close();
191
+ }
192
+ },
193
+ cancel: close,
194
+ }, { highWaterMark: 0 });
195
+ }
196
+ //# 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,75 @@
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-2",
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
+ "./tree": {
15
+ "types": "./dist/tree.d.ts",
16
+ "import": "./dist/tree.js"
17
+ },
18
+ "./init": {
19
+ "types": "./dist/init.d.ts",
20
+ "import": "./dist/init.js"
21
+ },
22
+ "./car": {
23
+ "types": "./dist/car.d.ts",
24
+ "import": "./dist/car.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "examples/echo/src",
30
+ "examples/echo/assets",
31
+ "examples/echo/task.build.yaml",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "engines": {
36
+ "node": ">=22.13.0"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public",
40
+ "registry": "https://registry.npmjs.org/"
41
+ },
5
42
  "license": "MIT",
43
+ "dependencies": {
44
+ "@ipld/car": "5.4.6",
45
+ "@ipld/dag-pb": "4.2.0",
46
+ "@sinclair/typebox": "0.34.52",
47
+ "enhanced-resolve": "5.18.3",
48
+ "esbuild": "0.25.12",
49
+ "multiformats": "14.0.5",
50
+ "ipfs-unixfs-importer": "17.1.1",
51
+ "ipfs-unixfs-exporter": "16.2.3",
52
+ "yaml": "2.9.1",
53
+ "@silvermoon-work/task-protocol": "0.1.0-canary-261109-2"
54
+ },
55
+ "devDependencies": {
56
+ "@potential-guide/pguide-task-bundle": "0.1.0-rc.2",
57
+ "@potential-guide/task-sdk": "0.1.0-rc.2"
58
+ },
6
59
  "repository": {
7
60
  "type": "git",
8
- "url": "git+https://github.com/silvermoon-work/task-engine.git"
61
+ "url": "git+https://github.com/silvermoon-work/task-engine.git",
62
+ "directory": "packages/task-builder"
9
63
  },
10
- "publishConfig": {
11
- "access": "public"
64
+ "homepage": "https://github.com/silvermoon-work/task-engine/tree/main/packages/task-builder#readme",
65
+ "bugs": {
66
+ "url": "https://github.com/silvermoon-work/task-engine/issues"
67
+ },
68
+ "scripts": {
69
+ "build": "tsc -b",
70
+ "clean": "node -e \"for (const path of ['dist', '.cache']) require('node:fs').rmSync(path, { recursive: true, force: true })\"",
71
+ "lint": "biome lint .",
72
+ "test": "tsx --test \"test/*.test.ts\"",
73
+ "typecheck": "tsc -b --pretty false"
12
74
  }
13
- }
75
+ }