@nodetool-ai/runtime 0.8.8 → 0.8.9-beta.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/.nodetool-build-stamp +1 -1
- package/dist/context.d.ts +6 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +13 -24
- package/dist/context.js.map +1 -1
- package/dist/host-binaries.d.ts +5 -5
- package/dist/host-binaries.js +5 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/invocation-account.d.ts +1 -42
- package/dist/invocation-account.d.ts.map +1 -1
- package/dist/invocation-account.js +1 -59
- package/dist/invocation-account.js.map +1 -1
- package/dist/media/abort.d.ts +8 -0
- package/dist/media/abort.d.ts.map +1 -0
- package/dist/media/abort.js +18 -0
- package/dist/media/abort.js.map +1 -0
- package/dist/media/audio-encoder.d.ts +37 -0
- package/dist/media/audio-encoder.d.ts.map +1 -0
- package/dist/media/audio-encoder.js +118 -0
- package/dist/media/audio-encoder.js.map +1 -0
- package/dist/media/audio.d.ts +36 -0
- package/dist/media/audio.d.ts.map +1 -0
- package/dist/media/audio.js +84 -0
- package/dist/media/audio.js.map +1 -0
- package/dist/media/av.d.ts +51 -0
- package/dist/media/av.d.ts.map +1 -0
- package/dist/media/av.js +146 -0
- package/dist/media/av.js.map +1 -0
- package/dist/media/codecs.d.ts +9 -0
- package/dist/media/codecs.d.ts.map +1 -0
- package/dist/media/codecs.js +17 -0
- package/dist/media/codecs.js.map +1 -0
- package/dist/media/concat.d.ts +56 -0
- package/dist/media/concat.d.ts.map +1 -0
- package/dist/media/concat.js +319 -0
- package/dist/media/concat.js.map +1 -0
- package/dist/media/convert.d.ts +31 -0
- package/dist/media/convert.d.ts.map +1 -0
- package/dist/media/convert.js +114 -0
- package/dist/media/convert.js.map +1 -0
- package/dist/media/decode.d.ts +31 -0
- package/dist/media/decode.d.ts.map +1 -0
- package/dist/media/decode.js +85 -0
- package/dist/media/decode.js.map +1 -0
- package/dist/media/filter-graph.d.ts +53 -0
- package/dist/media/filter-graph.d.ts.map +1 -0
- package/dist/media/filter-graph.js +260 -0
- package/dist/media/filter-graph.js.map +1 -0
- package/dist/media/frames.d.ts +31 -0
- package/dist/media/frames.d.ts.map +1 -0
- package/dist/media/frames.js +112 -0
- package/dist/media/frames.js.map +1 -0
- package/dist/media/index.d.ts +26 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +26 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/mux.d.ts +58 -0
- package/dist/media/mux.d.ts.map +1 -0
- package/dist/media/mux.js +234 -0
- package/dist/media/mux.js.map +1 -0
- package/dist/media/probe.d.ts +84 -0
- package/dist/media/probe.d.ts.map +1 -0
- package/dist/media/probe.js +133 -0
- package/dist/media/probe.js.map +1 -0
- package/dist/media/rgba.d.ts +78 -0
- package/dist/media/rgba.d.ts.map +1 -0
- package/dist/media/rgba.js +285 -0
- package/dist/media/rgba.js.map +1 -0
- package/dist/media/testing.d.ts +119 -0
- package/dist/media/testing.d.ts.map +1 -0
- package/dist/media/testing.js +343 -0
- package/dist/media/testing.js.map +1 -0
- package/dist/media/transcode.d.ts +17 -0
- package/dist/media/transcode.d.ts.map +1 -0
- package/dist/media/transcode.js +19 -0
- package/dist/media/transcode.js.map +1 -0
- package/dist/media/transform.d.ts +61 -0
- package/dist/media/transform.d.ts.map +1 -0
- package/dist/media/transform.js +371 -0
- package/dist/media/transform.js.map +1 -0
- package/dist/media/verify.d.ts +17 -0
- package/dist/media/verify.d.ts.map +1 -0
- package/dist/media/verify.js +65 -0
- package/dist/media/verify.js.map +1 -0
- package/dist/media-loader.d.ts +8 -0
- package/dist/media-loader.d.ts.map +1 -0
- package/dist/media-loader.js +10 -0
- package/dist/media-loader.js.map +1 -0
- package/dist/prefixed-storage-adapter.d.ts.map +1 -1
- package/dist/prefixed-storage-adapter.js +1 -1
- package/dist/prefixed-storage-adapter.js.map +1 -1
- package/dist/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/providers/anthropic-provider.js +1 -17
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/data-uri.d.ts +6 -0
- package/dist/providers/data-uri.d.ts.map +1 -0
- package/dist/providers/data-uri.js +19 -0
- package/dist/providers/data-uri.js.map +1 -0
- package/dist/providers/fake-provider.js +1 -1
- package/dist/providers/meta-transcription.d.ts +1 -5
- package/dist/providers/meta-transcription.d.ts.map +1 -1
- package/dist/providers/meta-transcription.js +9 -55
- package/dist/providers/meta-transcription.js.map +1 -1
- package/dist/providers/node-llama-cpp-trending.generated.js +91 -91
- package/dist/providers/node-llama-cpp-trending.generated.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +1 -17
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-provider.js +2 -2
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts +1 -69
- package/dist/providers/safe-url.d.ts.map +1 -1
- package/dist/providers/safe-url.js +1 -284
- package/dist/providers/safe-url.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +1 -1
- package/dist/providers/topaz-provider.js +1 -1
- package/dist/providers/video-frame-fallback.d.ts +1 -1
- package/dist/providers/video-frame-fallback.js +4 -4
- package/dist/providers/video-frame-fallback.js.map +1 -1
- package/dist/providers/video-frames.d.ts +6 -16
- package/dist/providers/video-frames.d.ts.map +1 -1
- package/dist/providers/video-frames.js +48 -116
- package/dist/providers/video-frames.js.map +1 -1
- package/dist/storage-workspace.d.ts +1 -61
- package/dist/storage-workspace.d.ts.map +1 -1
- package/dist/storage-workspace.js +2 -430
- package/dist/storage-workspace.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +57 -1
- package/dist/testing.js.map +1 -1
- package/dist/trim-video-window.d.ts.map +1 -1
- package/dist/trim-video-window.js +2 -32
- package/dist/trim-video-window.js.map +1 -1
- package/dist/workspace.d.ts +1 -118
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -111
- package/dist/workspace.js.map +1 -1
- package/dist/yt-dlp-format.d.ts +22 -0
- package/dist/yt-dlp-format.d.ts.map +1 -0
- package/dist/yt-dlp-format.js +90 -0
- package/dist/yt-dlp-format.js.map +1 -0
- package/package.json +23 -6
|
@@ -1,434 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The one {@link Workspace} implementation, over any {@link StorageAdapter}.
|
|
3
|
-
*
|
|
4
|
-
* There is deliberately no second implementation for local folders: a local
|
|
5
|
-
* workspace is this class over a `FileStorageAdapter`, which is what keeps the
|
|
6
|
-
* two deployments on the same code path instead of on two that drift.
|
|
7
|
-
*/
|
|
8
|
-
import { getNodeBuiltinSync } from "@nodetool-ai/config";
|
|
9
|
-
import { FileStorageAdapter } from "@nodetool-ai/storage";
|
|
10
1
|
import { setWorkspaceFactory } from "./context.js";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
import { WorkspacePathError } from "./workspace.js";
|
|
14
|
-
// Loaded lazily so this module still imports in browser / Edge runtimes, the
|
|
15
|
-
// same way the storage adapters above it do. Only `materialize`, `absorb`,
|
|
16
|
-
// `scratchDir` and the local branches of `mkdir`/`deleteAll` need them, and
|
|
17
|
-
// each says so when they are missing.
|
|
18
|
-
const nodeFsP = getNodeBuiltinSync("node:fs/promises");
|
|
19
|
-
const nodePath = getNodeBuiltinSync("node:path");
|
|
20
|
-
const nodeOs = getNodeBuiltinSync("node:os");
|
|
21
|
-
function requireNode() {
|
|
22
|
-
if (!nodeFsP || !nodePath || !nodeOs) {
|
|
23
|
-
throw new Error("Local workspace file access requires a Node.js runtime; this workspace " +
|
|
24
|
-
"operation is not available here");
|
|
25
|
-
}
|
|
26
|
-
return { fs: nodeFsP, path: nodePath, os: nodeOs };
|
|
27
|
-
}
|
|
28
|
-
/** `path.resolve`, but only where Node is available. */
|
|
29
|
-
function resolvePath(...parts) {
|
|
30
|
-
return requireNode().path.resolve(...parts);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Strip the prefixes a caller may write a workspace path with.
|
|
34
|
-
*
|
|
35
|
-
* `/workspace/notes.md`, `workspace/notes.md` and `notes.md` are the same
|
|
36
|
-
* file: agents and generated code write all three, and the sandbox has always
|
|
37
|
-
* treated `/workspace` as the root. An absolute path is read as
|
|
38
|
-
* workspace-relative rather than rejected, because that is what a model writes
|
|
39
|
-
* when it thinks it is on a normal filesystem.
|
|
40
|
-
*/
|
|
41
|
-
function stripWorkspacePrefix(path) {
|
|
42
|
-
let p = path.replaceAll("\\", "/").trim();
|
|
43
|
-
if (p.startsWith("/workspace/"))
|
|
44
|
-
return p.slice("/workspace/".length);
|
|
45
|
-
if (p === "/workspace" || p === "workspace")
|
|
46
|
-
return "";
|
|
47
|
-
if (p.startsWith("workspace/"))
|
|
48
|
-
return p.slice("workspace/".length);
|
|
49
|
-
// A Windows drive letter or a POSIX absolute path: keep the tail.
|
|
50
|
-
p = p.replace(/^[A-Za-z]:\//, "");
|
|
51
|
-
return p.startsWith("/") ? p.slice(1) : p;
|
|
52
|
-
}
|
|
53
|
-
/** Normalize to a key: no `.`/`..` segments, no leading or trailing slash. */
|
|
54
|
-
function normalize(path) {
|
|
55
|
-
const segments = [];
|
|
56
|
-
for (const segment of stripWorkspacePrefix(path).split("/")) {
|
|
57
|
-
if (!segment || segment === ".")
|
|
58
|
-
continue;
|
|
59
|
-
if (segment === "..") {
|
|
60
|
-
if (segments.length === 0)
|
|
61
|
-
throw new WorkspacePathError(path);
|
|
62
|
-
segments.pop();
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
segments.push(segment);
|
|
66
|
-
}
|
|
67
|
-
return segments.join("/");
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The real directory an adapter reads and writes, when it has one.
|
|
71
|
-
*
|
|
72
|
-
* Detected by shape rather than by `instanceof`: a host may pass any adapter
|
|
73
|
-
* that fronts a real directory, including one of its own. An `instanceof`
|
|
74
|
-
* check against `FileStorageAdapter` silently reports such a workspace as
|
|
75
|
-
* virtual, which would send every local run through the staging path.
|
|
76
|
-
*/
|
|
77
|
-
function localRootOf(storage) {
|
|
78
|
-
const candidate = storage.rootDir;
|
|
79
|
-
return typeof candidate === "string" && candidate !== "" ? candidate : null;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Whether a path's real (symlink-resolved) location stays inside the root.
|
|
83
|
-
*
|
|
84
|
-
* A local workspace's containment cannot be decided lexically: a symlink
|
|
85
|
-
* inside it can point anywhere on the host, and following one is how an agent
|
|
86
|
-
* reads `~/.ssh/id_rsa` through a file called `notes`. A virtual workspace
|
|
87
|
-
* needs none of this — an object store has no symlinks — which is why the
|
|
88
|
-
* check runs only when there is a real directory.
|
|
89
|
-
*
|
|
90
|
-
* A path that is not there is not an escape — a write target legitimately does
|
|
91
|
-
* not exist yet, and a read of a missing file must answer "missing" rather
|
|
92
|
-
* than "outside" — so the nearest existing ancestor is checked instead.
|
|
93
|
-
* `lstat`, not `access`: a DANGLING symlink pointing outside the root looks
|
|
94
|
-
* absent to `access`, and the create would then follow it out.
|
|
95
|
-
*/
|
|
96
|
-
async function realPathWithinRoot(root, candidate) {
|
|
97
|
-
const { fs, path } = requireNode();
|
|
98
|
-
const realRoot = await fs.realpath(root);
|
|
99
|
-
const within = (real) => {
|
|
100
|
-
const rel = path.relative(realRoot, real);
|
|
101
|
-
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
102
|
-
};
|
|
103
|
-
try {
|
|
104
|
-
return within(await fs.realpath(candidate));
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Not resolvable — either absent, or a link with no target.
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
// Exists as a link whose target does not — never follow it.
|
|
111
|
-
await fs.lstat(candidate);
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
// Genuinely absent: the parent decides.
|
|
116
|
-
}
|
|
117
|
-
// Walk up to the nearest ancestor that exists — writing `out/deep/x.txt`
|
|
118
|
-
// into a workspace that has neither directory yet is ordinary, and only the
|
|
119
|
-
// first real ancestor can be resolved.
|
|
120
|
-
let parent = path.dirname(candidate);
|
|
121
|
-
while (true) {
|
|
122
|
-
try {
|
|
123
|
-
return within(await fs.realpath(parent));
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// realpath failed — either this ancestor is genuinely absent, or it is
|
|
127
|
-
// itself a dangling symlink. lstat, not the loop's next iteration,
|
|
128
|
-
// tells them apart: a dangling symlink exists at this exact path and
|
|
129
|
-
// must never be walked past, or a symlink one level up pointing
|
|
130
|
-
// straight at the root would resolve "within" by accident.
|
|
131
|
-
try {
|
|
132
|
-
await fs.lstat(parent);
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
catch {
|
|
136
|
-
// Genuinely absent: keep climbing.
|
|
137
|
-
}
|
|
138
|
-
const next = path.dirname(parent);
|
|
139
|
-
if (next === parent)
|
|
140
|
-
return false;
|
|
141
|
-
parent = next;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const textDecoder = new TextDecoder();
|
|
146
|
-
const textEncoder = new TextEncoder();
|
|
147
|
-
export class StorageWorkspace {
|
|
148
|
-
storage;
|
|
149
|
-
localDir;
|
|
150
|
-
scratch = null;
|
|
151
|
-
constructor(storage, opts = {}) {
|
|
152
|
-
this.storage = storage;
|
|
153
|
-
this.localDir = opts.localDir ?? localRootOf(storage);
|
|
154
|
-
}
|
|
155
|
-
rootReady = null;
|
|
156
|
-
/** Create the workspace directory once, on first use. */
|
|
157
|
-
ensureRoot() {
|
|
158
|
-
if (!this.localDir)
|
|
159
|
-
return Promise.resolve();
|
|
160
|
-
const dir = this.localDir;
|
|
161
|
-
this.rootReady ??= requireNode()
|
|
162
|
-
.fs.mkdir(dir, { recursive: true })
|
|
163
|
-
.then(() => undefined);
|
|
164
|
-
return this.rootReady;
|
|
165
|
-
}
|
|
166
|
-
key(path) {
|
|
167
|
-
const key = normalize(path);
|
|
168
|
-
if (!key)
|
|
169
|
-
throw new WorkspacePathError(path);
|
|
170
|
-
return key;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Refuse a path whose real location leaves the workspace.
|
|
174
|
-
*
|
|
175
|
-
* Called on every operation that touches a local workspace. `key()` already
|
|
176
|
-
* refuses a `..` that climbs out lexically; this is the half a symlink
|
|
177
|
-
* defeats.
|
|
178
|
-
*/
|
|
179
|
-
async assertContained(path) {
|
|
180
|
-
if (!this.localDir)
|
|
181
|
-
return;
|
|
182
|
-
// The root may not exist yet (a workspace folder created on first use).
|
|
183
|
-
// Without this the walk below climbs past it to an ancestor that does
|
|
184
|
-
// exist, finds that outside the root, and refuses every path in a
|
|
185
|
-
// perfectly good workspace.
|
|
186
|
-
await this.ensureRoot();
|
|
187
|
-
const target = resolvePath(this.localDir, this.key(path));
|
|
188
|
-
if (!(await realPathWithinRoot(this.localDir, target))) {
|
|
189
|
-
throw new WorkspacePathError(path);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
uri(path) {
|
|
193
|
-
return this.storage.uriForKey(this.key(path));
|
|
194
|
-
}
|
|
195
|
-
read(path) {
|
|
196
|
-
return withTaskSpan("io", "workspace.read", {}, async (span) => {
|
|
197
|
-
await this.assertContained(path);
|
|
198
|
-
const bytes = await this.storage.retrieve(this.uri(path));
|
|
199
|
-
span?.setAttribute("nodetool.workspace.bytes", bytes?.byteLength ?? 0);
|
|
200
|
-
// The file backend answers with a Buffer, the object stores with a plain
|
|
201
|
-
// Uint8Array. A caller comparing or structured-cloning the result must
|
|
202
|
-
// not be able to tell which backend it got, so narrow to the common type.
|
|
203
|
-
if (bytes === null)
|
|
204
|
-
return null;
|
|
205
|
-
return bytes instanceof Uint8Array && bytes.constructor === Uint8Array
|
|
206
|
-
? bytes
|
|
207
|
-
: new Uint8Array(bytes);
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
async readText(path) {
|
|
211
|
-
const bytes = await this.read(path);
|
|
212
|
-
return bytes === null ? null : textDecoder.decode(bytes);
|
|
213
|
-
}
|
|
214
|
-
write(path, data, contentType) {
|
|
215
|
-
const bytes = typeof data === "string" ? textEncoder.encode(data) : data;
|
|
216
|
-
return withTaskSpan("io", "workspace.write", { "nodetool.workspace.bytes": bytes.byteLength }, async () => {
|
|
217
|
-
await this.assertContained(path);
|
|
218
|
-
await this.storage.store(this.key(path), bytes, contentType);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
async exists(path) {
|
|
222
|
-
try {
|
|
223
|
-
await this.assertContained(path);
|
|
224
|
-
}
|
|
225
|
-
catch {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
return this.storage.exists(this.uri(path));
|
|
229
|
-
}
|
|
230
|
-
async stat(path) {
|
|
231
|
-
await this.assertContained(path);
|
|
232
|
-
const key = this.key(path);
|
|
233
|
-
const st = await this.storage.stat(this.storage.uriForKey(key));
|
|
234
|
-
if (st) {
|
|
235
|
-
return {
|
|
236
|
-
path: key,
|
|
237
|
-
size: st.size,
|
|
238
|
-
modifiedAt: st.modifiedAt,
|
|
239
|
-
contentType: st.contentType,
|
|
240
|
-
isDirectory: false
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
// No object at that key: it may still be a directory. On an object store a
|
|
244
|
-
// directory exists only as a shared prefix of other keys, so an empty one
|
|
245
|
-
// is indistinguishable from an absent one — but on a local workspace it is
|
|
246
|
-
// a real directory, and reporting an existing empty folder as missing is a
|
|
247
|
-
// difference a caller can see.
|
|
248
|
-
const listing = await this.storage.list(`${key}/`, { delimiter: "/" });
|
|
249
|
-
if (listing.entries.length > 0 || listing.commonPrefixes.length > 0) {
|
|
250
|
-
return { path: key, size: 0, modifiedAt: 0, isDirectory: true };
|
|
251
|
-
}
|
|
252
|
-
if (this.localDir) {
|
|
253
|
-
const { fs } = requireNode();
|
|
254
|
-
try {
|
|
255
|
-
const info = await fs.stat(resolvePath(this.localDir, key));
|
|
256
|
-
if (info.isDirectory()) {
|
|
257
|
-
return {
|
|
258
|
-
path: key,
|
|
259
|
-
size: 0,
|
|
260
|
-
modifiedAt: info.mtimeMs,
|
|
261
|
-
isDirectory: true
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
// Absent — fall through.
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
list(path = "", opts = {}) {
|
|
272
|
-
return withTaskSpan("io", "workspace.list", { "nodetool.workspace.recursive": opts.recursive === true }, () => this.listEntries(path, opts));
|
|
273
|
-
}
|
|
274
|
-
async listEntries(path, opts) {
|
|
275
|
-
const key = normalize(path);
|
|
276
|
-
if (key)
|
|
277
|
-
await this.assertContained(key);
|
|
278
|
-
const prefix = key ? `${key}/` : "";
|
|
279
|
-
const listing = await this.storage.list(prefix, opts.recursive === true ? {} : { delimiter: "/" });
|
|
280
|
-
const files = listing.entries.map((entry) => ({
|
|
281
|
-
path: entry.key,
|
|
282
|
-
name: entry.key.slice(entry.key.lastIndexOf("/") + 1),
|
|
283
|
-
size: entry.size,
|
|
284
|
-
modifiedAt: entry.modifiedAt,
|
|
285
|
-
isDirectory: false
|
|
286
|
-
}));
|
|
287
|
-
const dirs = listing.commonPrefixes.map((p) => {
|
|
288
|
-
const trimmed = p.endsWith("/") ? p.slice(0, -1) : p;
|
|
289
|
-
return {
|
|
290
|
-
path: trimmed,
|
|
291
|
-
name: trimmed.slice(trimmed.lastIndexOf("/") + 1),
|
|
292
|
-
size: 0,
|
|
293
|
-
modifiedAt: 0,
|
|
294
|
-
isDirectory: true
|
|
295
|
-
};
|
|
296
|
-
});
|
|
297
|
-
return [...dirs, ...files].sort((a, b) => a.path.localeCompare(b.path));
|
|
298
|
-
}
|
|
299
|
-
async delete(path) {
|
|
300
|
-
await this.assertContained(path);
|
|
301
|
-
return this.storage.delete(this.uri(path));
|
|
302
|
-
}
|
|
303
|
-
async deleteAll(path) {
|
|
304
|
-
const key = normalize(path);
|
|
305
|
-
// Same containment rule as every other mutating operation: without it a
|
|
306
|
-
// symlinked directory inside the workspace (`out -> ~/Documents`) makes
|
|
307
|
-
// this delete the link's target. `list` reads through the symlink and
|
|
308
|
-
// hands back keys that are lexically inside the root, so the adapter's own
|
|
309
|
-
// lexical check passes and `unlink` follows the link out.
|
|
310
|
-
if (key)
|
|
311
|
-
await this.assertContained(key);
|
|
312
|
-
const listing = await this.storage.list(key ? `${key}/` : "");
|
|
313
|
-
let deleted = 0;
|
|
314
|
-
for (const entry of listing.entries) {
|
|
315
|
-
if (await this.storage.delete(entry.uri))
|
|
316
|
-
deleted++;
|
|
317
|
-
}
|
|
318
|
-
// On an object store the prefix is gone once its keys are. A real
|
|
319
|
-
// directory would linger and keep showing up in `list`, so remove it —
|
|
320
|
-
// otherwise the same call leaves two different workspaces behind.
|
|
321
|
-
if (this.localDir && key) {
|
|
322
|
-
await requireNode().fs.rm(resolvePath(this.localDir, key), {
|
|
323
|
-
recursive: true,
|
|
324
|
-
force: true
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
return deleted;
|
|
328
|
-
}
|
|
329
|
-
async mkdir(path) {
|
|
330
|
-
// An object store has no directories — a key's prefix is its directory, so
|
|
331
|
-
// there is nothing to create and nothing to fail. A local workspace makes
|
|
332
|
-
// the real directory so an empty one survives and a host binary can cd
|
|
333
|
-
// into it.
|
|
334
|
-
if (this.localDir) {
|
|
335
|
-
const key = normalize(path);
|
|
336
|
-
if (!key)
|
|
337
|
-
return;
|
|
338
|
-
await this.assertContained(key);
|
|
339
|
-
await requireNode().fs.mkdir(resolvePath(this.localDir, key), {
|
|
340
|
-
recursive: true
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
async copy(from, to) {
|
|
345
|
-
const bytes = await this.read(from);
|
|
346
|
-
if (bytes === null) {
|
|
347
|
-
throw new Error(`Cannot copy '${from}': it does not exist`);
|
|
348
|
-
}
|
|
349
|
-
const st = await this.stat(from);
|
|
350
|
-
await this.write(to, bytes, st?.contentType);
|
|
351
|
-
}
|
|
352
|
-
async move(from, to) {
|
|
353
|
-
await this.copy(from, to);
|
|
354
|
-
await this.delete(from);
|
|
355
|
-
}
|
|
356
|
-
materialize(path) {
|
|
357
|
-
return withTaskSpan("io", "workspace.materialize", {}, () => this.stage(path));
|
|
358
|
-
}
|
|
359
|
-
async stage(path) {
|
|
360
|
-
await this.assertContained(path);
|
|
361
|
-
const key = this.key(path);
|
|
362
|
-
if (this.localDir)
|
|
363
|
-
return resolvePath(this.localDir, key);
|
|
364
|
-
const bytes = await this.read(key);
|
|
365
|
-
if (bytes === null) {
|
|
366
|
-
throw new Error(`Cannot stage '${path}': it does not exist`);
|
|
367
|
-
}
|
|
368
|
-
const node = requireNode();
|
|
369
|
-
const target = node.path.join(await this.scratchDir(), key);
|
|
370
|
-
await node.fs.mkdir(node.path.dirname(target), { recursive: true });
|
|
371
|
-
await node.fs.writeFile(target, bytes);
|
|
372
|
-
return target;
|
|
373
|
-
}
|
|
374
|
-
absorb(localPath, path) {
|
|
375
|
-
return withTaskSpan("io", "workspace.absorb", {}, () => this.absorbFile(localPath, path));
|
|
376
|
-
}
|
|
377
|
-
async absorbFile(localPath, path) {
|
|
378
|
-
const node = requireNode();
|
|
379
|
-
if (this.localDir &&
|
|
380
|
-
node.path.resolve(localPath) ===
|
|
381
|
-
node.path.resolve(this.localDir, this.key(path))) {
|
|
382
|
-
// The binary already wrote in place — the workspace *is* that file.
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
await this.write(path, new Uint8Array(await node.fs.readFile(localPath)));
|
|
386
|
-
}
|
|
387
|
-
async scratchDir() {
|
|
388
|
-
if (this.localDir)
|
|
389
|
-
return this.localDir;
|
|
390
|
-
const node = requireNode();
|
|
391
|
-
this.scratch ??= node.fs.mkdtemp(node.path.join(node.os.tmpdir(), "nodetool-ws-"));
|
|
392
|
-
return this.scratch;
|
|
393
|
-
}
|
|
394
|
-
async cleanupScratch() {
|
|
395
|
-
const scratch = this.scratch;
|
|
396
|
-
this.scratch = null;
|
|
397
|
-
if (scratch) {
|
|
398
|
-
await requireNode().fs.rm(await scratch, { recursive: true, force: true });
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Build a workspace over a storage backend.
|
|
404
|
-
*
|
|
405
|
-
* `prefix` carves a namespace out of a shared bucket — how a cloud deployment
|
|
406
|
-
* gives each user their own workspace inside the one bucket it has.
|
|
407
|
-
*/
|
|
408
|
-
export function createWorkspace(storage, opts = {}) {
|
|
409
|
-
if (!opts.prefix)
|
|
410
|
-
return new StorageWorkspace(storage);
|
|
411
|
-
return new StorageWorkspace(new PrefixedStorageAdapter(storage, opts.prefix), {
|
|
412
|
-
// A prefixed view of a local folder still has a real directory: the
|
|
413
|
-
// subfolder the prefix names.
|
|
414
|
-
localDir: (() => {
|
|
415
|
-
const root = localRootOf(storage);
|
|
416
|
-
return root ? resolvePath(root, opts.prefix) : null;
|
|
417
|
-
})()
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
/** A workspace over a real directory. */
|
|
421
|
-
export function createLocalWorkspace(dir) {
|
|
422
|
-
return new StorageWorkspace(new FileStorageAdapter(dir));
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Teach {@link ProcessingContext} how to build a workspace from the older
|
|
426
|
-
* `workspaceDir` / `workspaceStorage` options.
|
|
427
|
-
*
|
|
428
|
-
* The context cannot import this module — it must stay loadable off Node —
|
|
429
|
-
* so the direction is inverted: importing this file (which every host does,
|
|
430
|
-
* via the package index) installs the factory.
|
|
431
|
-
*/
|
|
2
|
+
import { StorageWorkspace, createLocalWorkspace } from "@nodetool-ai/runtime-core";
|
|
3
|
+
export { StorageWorkspace, createWorkspace, createLocalWorkspace } from "@nodetool-ai/runtime-core";
|
|
432
4
|
setWorkspaceFactory((opts) => {
|
|
433
5
|
if (opts.workspace)
|
|
434
6
|
return opts.workspace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-workspace.js","sourceRoot":"","sources":["../src/storage-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAuB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAInB,MAAM,gBAAgB,CAAC;AAExB,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,sCAAsC;AACtC,MAAM,OAAO,GACX,kBAAkB,CAAoC,kBAAkB,CAAC,CAAC;AAC5E,MAAM,QAAQ,GAAG,kBAAkB,CAA6B,WAAW,CAAC,CAAC;AAC7E,MAAM,MAAM,GAAG,kBAAkB,CAA2B,SAAS,CAAC,CAAC;AAEvE,SAAS,WAAW;IAKlB,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,iCAAiC,CACpC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,wDAAwD;AACxD,SAAS,WAAW,CAAC,GAAG,KAAe;IACrC,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpE,kEAAkE;IAClE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG;YAAE,SAAS;QAC1C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC9D,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,OAAuB;IAC1C,MAAM,SAAS,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC7D,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAY,EACZ,SAAiB;IAEjB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IACD,IAAI,CAAC;QACH,4DAA4D;QAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IACD,yEAAyE;IACzE,4EAA4E;IAC5E,uCAAuC;IACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,mEAAmE;YACnE,qEAAqE;YACrE,gEAAgE;YAChE,2DAA2D;YAC3D,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACvB,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,mCAAmC;YACrC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC;YAClC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,OAAO,gBAAgB;IAClB,OAAO,CAAiB;IACxB,QAAQ,CAAgB;IACzB,OAAO,GAA2B,IAAI,CAAC;IAE/C,YAAY,OAAuB,EAAE,IAAI,GAAiC,EAAE;QAC1E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,SAAS,GAAyB,IAAI,CAAC;IAE/C,yDAAyD;IACjD,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;aAC7B,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;aAClC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,eAAe,CAAC,IAAY;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,wEAAwE;QACxE,sEAAsE;QACtE,kEAAkE;QAClE,4BAA4B;QAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,IAAY;QACf,OAAO,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7D,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,EAAE,YAAY,CAAC,0BAA0B,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;YACvE,yEAAyE;YACzE,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;gBACpE,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CACH,IAAY,EACZ,IAAyB,EACzB,WAAoB;QAEpB,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,OAAO,YAAY,CACjB,IAAI,EACJ,iBAAiB,EACjB,EAAE,0BAA0B,EAAE,KAAK,CAAC,UAAU,EAAE,EAChD,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,EAAE,EAAE,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,WAAW,EAAE,KAAK;aACnB,CAAC;QACJ,CAAC;QACD,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAClE,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,OAAO;wBACL,IAAI,EAAE,GAAG;wBACT,IAAI,EAAE,CAAC;wBACP,UAAU,EAAE,IAAI,CAAC,OAAO;wBACxB,WAAW,EAAE,IAAI;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CACF,IAAI,GAAG,EAAE,EACT,IAAI,GAA4B,EAAE;QAElC,OAAO,YAAY,CACjB,IAAI,EACJ,gBAAgB,EAChB,EAAE,8BAA8B,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAC3D,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,IAAY,EACZ,IAA6B;QAE7B,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,GAAG;YAAE,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CACrC,MAAM,EACN,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAClD,CAAC;QACF,MAAM,KAAK,GAAqB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,EAAE,KAAK,CAAC,GAAG;YACf,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAqB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9D,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjD,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,wEAAwE;QACxE,wEAAwE;QACxE,sEAAsE;QACtE,2EAA2E;QAC3E,0DAA0D;QAC1D,IAAI,GAAG;YAAE,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;QACtD,CAAC;QACD,kEAAkE;QAClE,uEAAuE;QACvE,kEAAkE;QAClE,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACzD,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,2EAA2E;QAC3E,0EAA0E;QAC1E,uEAAuE;QACvE,WAAW;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBAC5D,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,EAAU;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,sBAAsB,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,EAAU;QACjC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,YAAY,CAAC,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,GAAG,EAAE,CAC1D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CACjB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,IAAY;QAC9B,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,IAAY;QACpC,OAAO,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,GAAG,EAAE,CACrD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CACjC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,IAAY;QACtD,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,IACE,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAClD,CAAC;YACD,oEAAoE;YACpE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACxC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,OAAO,CAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CACjD,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAuB,EACvB,IAAI,GAA+B,EAAE;IAErC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,IAAI,gBAAgB,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;QAC5E,oEAAoE;QACpE,8BAA8B;QAC9B,QAAQ,EAAE,CAAC,GAAG,EAAE;YACd,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,EAAE;KACL,CAAC,CAAC;AACL,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,IAAI,gBAAgB,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;IAC3B,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1C,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage-workspace.js","sourceRoot":"","sources":["../src/storage-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEpG,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;IAC3B,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1C,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC"}
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnE;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnE;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAwJnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAC5E,MAAM,IAAI,CAyBZ"}
|
package/dist/testing.js
CHANGED
|
@@ -14,7 +14,7 @@ const fs = getNodeBuiltinSync("node:fs");
|
|
|
14
14
|
import { InMemoryStorageAdapter } from "@nodetool-ai/storage";
|
|
15
15
|
import { ProcessingContext, MemoryCache } from "./context.js";
|
|
16
16
|
import { FakeProvider } from "./providers/fake-provider.js";
|
|
17
|
-
import { isString } from "@nodetool-ai/protocol";
|
|
17
|
+
import { isString, isRecord } from "@nodetool-ai/protocol";
|
|
18
18
|
/**
|
|
19
19
|
* Default `fetch` stub. Returns an empty `200 OK` `text/plain` response
|
|
20
20
|
* for every URL. Real workflows expecting JSON will get `{}` back.
|
|
@@ -58,6 +58,9 @@ export function createFakeContext(options = {}) {
|
|
|
58
58
|
let assetCounter = 0;
|
|
59
59
|
let sequenceCounter = 0;
|
|
60
60
|
const sequences = new Map();
|
|
61
|
+
const storyboards = new Map();
|
|
62
|
+
const entities = new Map();
|
|
63
|
+
const assets = new Map();
|
|
61
64
|
const context = new ProcessingContext({
|
|
62
65
|
jobId: options.jobId ?? "fake-job",
|
|
63
66
|
userId,
|
|
@@ -98,8 +101,61 @@ export function createFakeContext(options = {}) {
|
|
|
98
101
|
await storage.store(`${userId}/${id}.${ext}`, args.content, args.contentType);
|
|
99
102
|
}
|
|
100
103
|
}
|
|
104
|
+
assets.set(id, args.contentType);
|
|
101
105
|
return { id, name: args.name, content_type: args.contentType };
|
|
102
106
|
},
|
|
107
|
+
getStoryboard: async ({ id }) => storyboards.get(id) ?? null,
|
|
108
|
+
listStoryboards: async ({ projectId, limit }) => [...storyboards.values()]
|
|
109
|
+
.filter(board => !projectId || board.project_id === projectId)
|
|
110
|
+
.slice(0, limit),
|
|
111
|
+
findRecastStoryboard: async ({ projectId, templateId, recastKey }) => [...storyboards.values()]
|
|
112
|
+
.find(board => (!projectId || board.project_id === projectId) && isRecord(board.document) && board.document.templateId === templateId && board.document.recastKey === recastKey) ?? null,
|
|
113
|
+
createStoryboard: async ({ name, projectId, document }) => {
|
|
114
|
+
const id = globalThis.crypto.randomUUID().replaceAll("-", "");
|
|
115
|
+
const board = { id, name: name ?? "", project_id: projectId ?? "default", document };
|
|
116
|
+
storyboards.set(id, board);
|
|
117
|
+
return board;
|
|
118
|
+
},
|
|
119
|
+
updateStoryboard: async ({ id, document }) => {
|
|
120
|
+
const existing = storyboards.get(id);
|
|
121
|
+
if (!existing) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const saved = { ...existing, document: document ?? existing.document };
|
|
125
|
+
storyboards.set(id, saved);
|
|
126
|
+
return saved;
|
|
127
|
+
},
|
|
128
|
+
getEntity: async ({ id }) => entities.get(id) ?? null,
|
|
129
|
+
listEntities: async ({ projectId, kind, tags, nameContains, limit }) => [...entities.values()]
|
|
130
|
+
.filter(entity => (!projectId || entity.project_id === projectId) && (!kind || entity.kind === kind) && (!nameContains || entity.name.toLowerCase().includes(nameContains.toLowerCase())) && (!tags?.length || tags.every(tag => entity.tags?.includes(tag))))
|
|
131
|
+
.slice(0, limit),
|
|
132
|
+
upsertEntity: async (args) => {
|
|
133
|
+
if (!assets.get(args.imageAssetId)?.startsWith("image/")) {
|
|
134
|
+
throw new Error("Fake entity reference must identify a created image asset");
|
|
135
|
+
}
|
|
136
|
+
const projectId = args.projectId ?? "default";
|
|
137
|
+
const existing = [...entities.values()].find(entity => entity.project_id === projectId && (args.source?.key ? entity.source?.key === args.source.key : entity.kind === args.kind && entity.name.toLowerCase() === args.name.toLowerCase()));
|
|
138
|
+
const entity = {
|
|
139
|
+
...existing,
|
|
140
|
+
type: "entity", id: existing?.id ?? args.imageAssetId,
|
|
141
|
+
kind: args.kind, name: args.name, descriptor: args.descriptor, project_id: projectId,
|
|
142
|
+
reference_images: [{ type: "image", asset_id: args.imageAssetId, uri: `asset://${args.imageAssetId}.png` }]
|
|
143
|
+
};
|
|
144
|
+
if (args.description !== undefined) {
|
|
145
|
+
entity.description = args.description;
|
|
146
|
+
}
|
|
147
|
+
if (args.tags !== undefined) {
|
|
148
|
+
entity.tags = args.tags;
|
|
149
|
+
}
|
|
150
|
+
if (args.source !== undefined) {
|
|
151
|
+
entity.source = args.source;
|
|
152
|
+
}
|
|
153
|
+
if (args.voiceId !== undefined) {
|
|
154
|
+
entity.voice_id = args.voiceId;
|
|
155
|
+
}
|
|
156
|
+
entities.set(entity.id, entity);
|
|
157
|
+
return { entity, created: !existing };
|
|
158
|
+
},
|
|
103
159
|
// Timeline nodes save a sequence document and read it back by id.
|
|
104
160
|
createTimelineSequence: async ({ sequence }) => {
|
|
105
161
|
sequenceCounter += 1;
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,EAAE,GAAG,kBAAkB,CAC3B,SAAS,CACkB,CAAC;AAC9B,MAAM,IAAI,GAAG,kBAAkB,CAC7B,WAAW,CACkB,CAAC;AAChC,MAAM,EAAE,GAAG,kBAAkB,CAC3B,SAAS,CACkB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trim-video-window.d.ts","sourceRoot":"","sources":["../src/trim-video-window.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trim-video-window.d.ts","sourceRoot":"","sources":["../src/trim-video-window.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAmBrB"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { promisify } from "node:util";
|
|
3
|
-
import { promises as fs } from "node:fs";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
1
|
+
import { trimVideo } from "./media/convert.js";
|
|
6
2
|
import { withTaskSpan } from "./tracing-helpers.js";
|
|
7
|
-
const execFile = promisify(execFileCallback);
|
|
8
3
|
/**
|
|
9
4
|
* Materialize the exact constant-speed source window sent to a video editor.
|
|
10
5
|
* The source asset remains untouched in storage. The returned MP4 starts at
|
|
@@ -20,31 +15,6 @@ export async function trimVideoWindow(input, startMs, endMs, signal) {
|
|
|
20
15
|
throw new Error("Video edit source window must be a positive finite range.");
|
|
21
16
|
}
|
|
22
17
|
signal?.throwIfAborted();
|
|
23
|
-
|
|
24
|
-
const inputPath = path.join(dir, "input.mp4");
|
|
25
|
-
const outputPath = path.join(dir, "window.mp4");
|
|
26
|
-
try {
|
|
27
|
-
await fs.writeFile(inputPath, input);
|
|
28
|
-
await withTaskSpan("cpu", "ffmpeg.trim_video_window", { "nodetool.video.input_bytes": input.length }, () => execFile("ffmpeg", [
|
|
29
|
-
"-y",
|
|
30
|
-
"-i",
|
|
31
|
-
inputPath,
|
|
32
|
-
"-ss",
|
|
33
|
-
String(startMs / 1000),
|
|
34
|
-
"-t",
|
|
35
|
-
String((endMs - startMs) / 1000),
|
|
36
|
-
"-c:v",
|
|
37
|
-
"libx264",
|
|
38
|
-
"-c:a",
|
|
39
|
-
"aac",
|
|
40
|
-
"-movflags",
|
|
41
|
-
"+faststart",
|
|
42
|
-
outputPath
|
|
43
|
-
], { maxBuffer: 50 * 1024 * 1024, signal }));
|
|
44
|
-
return new Uint8Array(await fs.readFile(outputPath));
|
|
45
|
-
}
|
|
46
|
-
finally {
|
|
47
|
-
await fs.rm(dir, { recursive: true, force: true });
|
|
48
|
-
}
|
|
18
|
+
return withTaskSpan("cpu", "media.trim_video_window", { "nodetool.video.input_bytes": input.length }, () => trimVideo(input, startMs / 1000, endMs / 1000, { signal }));
|
|
49
19
|
}
|
|
50
20
|
//# sourceMappingURL=trim-video-window.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trim-video-window.js","sourceRoot":"","sources":["../src/trim-video-window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"trim-video-window.js","sourceRoot":"","sources":["../src/trim-video-window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAiB,EACjB,OAAe,EACf,KAAa,EACb,MAAoB;IAEpB,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,GAAG,CAAC;QACX,KAAK,IAAI,OAAO,EAChB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,YAAY,CACjB,KAAK,EACL,yBAAyB,EACzB,EAAE,4BAA4B,EAAE,KAAK,CAAC,MAAM,EAAE,EAC9C,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CACjE,CAAC;AACJ,CAAC"}
|