@kenkaiiii/gg-editor 0.6.3 → 0.6.5
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 +5 -1
- package/dist/core/auth/openai.d.ts.map +1 -1
- package/dist/core/auth/openai.js +5 -1
- package/dist/core/auth/openai.js.map +1 -1
- package/dist/core/doctor-runner.js +1 -3
- package/dist/core/doctor-runner.js.map +1 -1
- package/dist/core/hosts/lazy.d.ts +5 -5
- package/dist/core/hosts/lazy.d.ts.map +1 -1
- package/dist/core/hosts/lazy.js +16 -0
- package/dist/core/hosts/lazy.js.map +1 -1
- package/dist/core/hosts/premiere/adapter.d.ts +4 -1
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -1
- package/dist/core/hosts/premiere/adapter.js +6 -5
- package/dist/core/hosts/premiere/adapter.js.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.js +45 -0
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/adapter.d.ts +6 -2
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -1
- package/dist/core/hosts/resolve/adapter.js +13 -5
- package/dist/core/hosts/resolve/adapter.js.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.js +376 -2
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.d.ts +22 -4
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge.integration.test.js +338 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.js +56 -6
- package/dist/core/hosts/resolve/bridge.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.test.js +61 -1
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -1
- package/dist/core/hosts/types.d.ts +81 -0
- package/dist/core/hosts/types.d.ts.map +1 -1
- package/dist/core/hosts/types.js.map +1 -1
- package/dist/core/safe-paths.d.ts +47 -0
- package/dist/core/safe-paths.d.ts.map +1 -0
- package/dist/core/safe-paths.js +102 -0
- package/dist/core/safe-paths.js.map +1 -0
- package/dist/core/safe-paths.test.d.ts +2 -0
- package/dist/core/safe-paths.test.d.ts.map +1 -0
- package/dist/core/safe-paths.test.js +76 -0
- package/dist/core/safe-paths.test.js.map +1 -0
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +125 -0
- package/dist/skills.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +33 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/compose-layered.d.ts.map +1 -1
- package/dist/tools/compose-layered.js +2 -1
- package/dist/tools/compose-layered.js.map +1 -1
- package/dist/tools/compose-thumbnail.d.ts.map +1 -1
- package/dist/tools/compose-thumbnail.js +10 -2
- package/dist/tools/compose-thumbnail.js.map +1 -1
- package/dist/tools/concat-videos.d.ts.map +1 -1
- package/dist/tools/concat-videos.js +2 -1
- package/dist/tools/concat-videos.js.map +1 -1
- package/dist/tools/cut-filler-words.d.ts.map +1 -1
- package/dist/tools/cut-filler-words.js +2 -1
- package/dist/tools/cut-filler-words.js.map +1 -1
- package/dist/tools/extract-frame.d.ts.map +1 -1
- package/dist/tools/extract-frame.js +9 -2
- package/dist/tools/extract-frame.js.map +1 -1
- package/dist/tools/fusion-comp.d.ts +49 -0
- package/dist/tools/fusion-comp.d.ts.map +1 -0
- package/dist/tools/fusion-comp.js +129 -0
- package/dist/tools/fusion-comp.js.map +1 -0
- package/dist/tools/generate-gif.d.ts.map +1 -1
- package/dist/tools/generate-gif.js +12 -2
- package/dist/tools/generate-gif.js.map +1 -1
- package/dist/tools/host-eval.d.ts +35 -0
- package/dist/tools/host-eval.d.ts.map +1 -0
- package/dist/tools/host-eval.js +70 -0
- package/dist/tools/host-eval.js.map +1 -0
- package/dist/tools/host-tools.test.js +42 -0
- package/dist/tools/host-tools.test.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.js +4 -0
- package/dist/tools/index.test.js.map +1 -1
- package/dist/tools/overlay-watermark.d.ts.map +1 -1
- package/dist/tools/overlay-watermark.js +2 -1
- package/dist/tools/overlay-watermark.js.map +1 -1
- package/dist/tools/reformat-timeline.d.ts.map +1 -1
- package/dist/tools/reformat-timeline.js +3 -2
- package/dist/tools/reformat-timeline.js.map +1 -1
- package/dist/tools/reorder-timeline.d.ts.map +1 -1
- package/dist/tools/reorder-timeline.js +3 -2
- package/dist/tools/reorder-timeline.js.map +1 -1
- package/dist/tools/transcribe.d.ts.map +1 -1
- package/dist/tools/transcribe.js +2 -1
- package/dist/tools/transcribe.js.map +1 -1
- package/dist/tools/write-ass.d.ts.map +1 -1
- package/dist/tools/write-ass.js +3 -2
- package/dist/tools/write-ass.js.map +1 -1
- package/dist/tools/write-edl.d.ts.map +1 -1
- package/dist/tools/write-edl.js +3 -2
- package/dist/tools/write-edl.js.map +1 -1
- package/dist/tools/write-fcpxml.d.ts.map +1 -1
- package/dist/tools/write-fcpxml.js +3 -2
- package/dist/tools/write-fcpxml.js.map +1 -1
- package/dist/tools/write-keyword-captions.d.ts.map +1 -1
- package/dist/tools/write-keyword-captions.js +2 -1
- package/dist/tools/write-keyword-captions.js.map +1 -1
- package/dist/tools/write-lower-third.d.ts.map +1 -1
- package/dist/tools/write-lower-third.js +3 -2
- package/dist/tools/write-lower-third.js.map +1 -1
- package/dist/tools/write-srt.d.ts.map +1 -1
- package/dist/tools/write-srt.js +3 -2
- package/dist/tools/write-srt.js.map +1 -1
- package/dist/tools/write-title-card.d.ts.map +1 -1
- package/dist/tools/write-title-card.js +3 -2
- package/dist/tools/write-title-card.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { findPython, resolveEnv } from "./bridge.js";
|
|
3
3
|
describe("findPython", () => {
|
|
4
4
|
it("returns a python3 candidate or undefined cleanly", () => {
|
|
@@ -46,5 +46,65 @@ describe("resolveEnv", () => {
|
|
|
46
46
|
process.env.RESOLVE_SCRIPT_API = before;
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
|
+
it("sets PYTHONHOME to the python prefix on Windows when not preset", async () => {
|
|
50
|
+
// Mock node:os.platform() to report Windows. resolveEnv() reads platform()
|
|
51
|
+
// lazily so we re-import after mocking.
|
|
52
|
+
vi.resetModules();
|
|
53
|
+
vi.doMock("node:os", async () => {
|
|
54
|
+
const real = await vi.importActual("node:os");
|
|
55
|
+
return { ...real, platform: () => "win32" };
|
|
56
|
+
});
|
|
57
|
+
const before = process.env.PYTHONHOME;
|
|
58
|
+
delete process.env.PYTHONHOME;
|
|
59
|
+
try {
|
|
60
|
+
const mod = await import("./bridge.js");
|
|
61
|
+
const env = mod.resolveEnv({ cmd: "python", args: [], prefix: "C:/Python311" });
|
|
62
|
+
expect(env.PYTHONHOME).toBe("C:/Python311");
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
if (before === undefined)
|
|
66
|
+
delete process.env.PYTHONHOME;
|
|
67
|
+
else
|
|
68
|
+
process.env.PYTHONHOME = before;
|
|
69
|
+
vi.doUnmock("node:os");
|
|
70
|
+
vi.resetModules();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
it("does not set PYTHONHOME on darwin/linux", () => {
|
|
74
|
+
// Real platform() on the test runner is darwin or linux — no Windows path
|
|
75
|
+
// taken, so PYTHONHOME stays undefined unless the user pre-set it.
|
|
76
|
+
const beforeHome = process.env.PYTHONHOME;
|
|
77
|
+
delete process.env.PYTHONHOME;
|
|
78
|
+
try {
|
|
79
|
+
const env = resolveEnv({ cmd: "python3", args: [], prefix: "/usr/local" });
|
|
80
|
+
expect(env.PYTHONHOME).toBeUndefined();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
if (beforeHome !== undefined)
|
|
84
|
+
process.env.PYTHONHOME = beforeHome;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
it("preserves a pre-set PYTHONHOME on Windows", async () => {
|
|
88
|
+
vi.resetModules();
|
|
89
|
+
vi.doMock("node:os", async () => {
|
|
90
|
+
const real = await vi.importActual("node:os");
|
|
91
|
+
return { ...real, platform: () => "win32" };
|
|
92
|
+
});
|
|
93
|
+
const before = process.env.PYTHONHOME;
|
|
94
|
+
process.env.PYTHONHOME = "C:/User/CustomHome";
|
|
95
|
+
try {
|
|
96
|
+
const mod = await import("./bridge.js");
|
|
97
|
+
const env = mod.resolveEnv({ cmd: "python", args: [], prefix: "C:/Python311" });
|
|
98
|
+
expect(env.PYTHONHOME).toBe("C:/User/CustomHome");
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
if (before === undefined)
|
|
102
|
+
delete process.env.PYTHONHOME;
|
|
103
|
+
else
|
|
104
|
+
process.env.PYTHONHOME = before;
|
|
105
|
+
vi.doUnmock("node:os");
|
|
106
|
+
vi.resetModules();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
49
109
|
});
|
|
50
110
|
//# sourceMappingURL=bridge.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.test.js","sourceRoot":"","sources":["../../../../src/core/hosts/resolve/bridge.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bridge.test.js","sourceRoot":"","sources":["../../../../src/core/hosts/resolve/bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,51 @@
|
|
|
1
1
|
import type { ClipInfo, Frame, FrameRange, HostCapabilities, HostName, MarkerInfo, TimelineState } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Discriminated union of every fusion_comp action the bridge supports. Kept
|
|
4
|
+
* in lockstep with `m_fusion_comp` in bridge-source.ts.
|
|
5
|
+
*/
|
|
6
|
+
export type FusionCompArgs = {
|
|
7
|
+
action: "list_nodes";
|
|
8
|
+
clipId?: string;
|
|
9
|
+
} | {
|
|
10
|
+
action: "add_node";
|
|
11
|
+
toolId: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
clipId?: string;
|
|
14
|
+
} | {
|
|
15
|
+
action: "delete_node";
|
|
16
|
+
name: string;
|
|
17
|
+
clipId?: string;
|
|
18
|
+
} | {
|
|
19
|
+
action: "connect";
|
|
20
|
+
fromNode: string;
|
|
21
|
+
toNode: string;
|
|
22
|
+
fromOutput?: string;
|
|
23
|
+
toInput?: string;
|
|
24
|
+
clipId?: string;
|
|
25
|
+
} | {
|
|
26
|
+
action: "set_input";
|
|
27
|
+
node: string;
|
|
28
|
+
input: string;
|
|
29
|
+
value: unknown;
|
|
30
|
+
clipId?: string;
|
|
31
|
+
} | {
|
|
32
|
+
action: "get_input";
|
|
33
|
+
node: string;
|
|
34
|
+
input: string;
|
|
35
|
+
clipId?: string;
|
|
36
|
+
} | {
|
|
37
|
+
action: "set_keyframe";
|
|
38
|
+
node: string;
|
|
39
|
+
input: string;
|
|
40
|
+
frame: number;
|
|
41
|
+
value: unknown;
|
|
42
|
+
clipId?: string;
|
|
43
|
+
} | {
|
|
44
|
+
action: "set_render_range";
|
|
45
|
+
start: number;
|
|
46
|
+
end: number;
|
|
47
|
+
clipId?: string;
|
|
48
|
+
};
|
|
2
49
|
/**
|
|
3
50
|
* VideoHost — the NLE-agnostic interface every adapter implements.
|
|
4
51
|
*
|
|
@@ -146,6 +193,40 @@ export interface VideoHost {
|
|
|
146
193
|
* have a page concept. Adapters that don't support it should omit this method.
|
|
147
194
|
*/
|
|
148
195
|
openPage?(name: "media" | "cut" | "edit" | "fusion" | "color" | "fairlight" | "deliver"): Promise<void>;
|
|
196
|
+
/**
|
|
197
|
+
* Drive a Fusion composition (motion-graphics graph) inside Resolve.
|
|
198
|
+
* Optional; Resolve-only — adapters without a Fusion equivalent omit it.
|
|
199
|
+
*
|
|
200
|
+
* `clipId` (optional): scope the call to that clip's first Fusion comp
|
|
201
|
+
* (or auto-create one). When omitted, operates on the active Fusion-page
|
|
202
|
+
* comp.
|
|
203
|
+
*
|
|
204
|
+
* Actions are dispatched server-side; see `bridge-source.ts:m_fusion_comp`
|
|
205
|
+
* for the canonical action set.
|
|
206
|
+
*/
|
|
207
|
+
executeFusionComp?(args: FusionCompArgs): Promise<unknown>;
|
|
208
|
+
/**
|
|
209
|
+
* Escape hatch — run a snippet of host-native scripting code with the live
|
|
210
|
+
* NLE objects pre-bound and return its result + captured stdout. Optional;
|
|
211
|
+
* only adapters with a real scripting bridge implement it (Resolve = Python,
|
|
212
|
+
* Premiere = ExtendScript). The `none` adapter omits it.
|
|
213
|
+
*
|
|
214
|
+
* Usage rule (enforced by the tool's system-prompt guidance, not the type):
|
|
215
|
+
* this is for things no named tool covers. Don't use it to do work the
|
|
216
|
+
* dedicated tools already do — those tools have validation, output shaping,
|
|
217
|
+
* and capability fallbacks this raw path skips.
|
|
218
|
+
*
|
|
219
|
+
* Resolve pre-bound globals: resolve, project, projectManager, mediaPool,
|
|
220
|
+
* mediaStorage, timeline, fusion, dvr; result via `set_result(value)` or
|
|
221
|
+
* top-level `result =`.
|
|
222
|
+
*
|
|
223
|
+
* Premiere pre-bound globals: app, project, sequence, qe; result via
|
|
224
|
+
* `setResult(value)` or top-level `result = `.
|
|
225
|
+
*/
|
|
226
|
+
executeCode?(code: string): Promise<{
|
|
227
|
+
result: unknown;
|
|
228
|
+
stdout?: string;
|
|
229
|
+
}>;
|
|
149
230
|
}
|
|
150
231
|
/**
|
|
151
232
|
* Thrown by adapters when an op is not supported by the live host API.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hosts/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hosts/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hosts/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hosts/types.ts"],"names":[],"mappings":"AAsPA;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IACA;IAFlB,YACkB,IAAc,EACd,EAAU,EAC1B,OAAgB;QAEhB,KAAK,CAAC,OAAO,IAAI,SAAS,IAAI,0BAA0B,EAAE,qBAAqB,CAAC,CAAC;QAJjE,SAAI,GAAJ,IAAI,CAAU;QACd,OAAE,GAAF,EAAE,CAAQ;QAI1B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IADlB,YACkB,IAAc,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAU;QAI9B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path-safety helpers for file-writing tools.
|
|
3
|
+
*
|
|
4
|
+
* Two distinct guards live here:
|
|
5
|
+
*
|
|
6
|
+
* 1. `safeOutputPath()` — path-traversal guard. Resolves `requested` against
|
|
7
|
+
* `cwd`, then refuses absolute paths that escape the configured allow-list
|
|
8
|
+
* of roots (cwd, system tempdir, the per-user output dir under ~/Documents).
|
|
9
|
+
* Tools writing on behalf of the agent must call this before opening any
|
|
10
|
+
* file handle — it stops the agent from writing to `../../etc/passwd` even
|
|
11
|
+
* when the user has not validated the value.
|
|
12
|
+
*
|
|
13
|
+
* 2. `safeResolveOutputPath()` — sandbox redirect for paths that NLE hosts
|
|
14
|
+
* (Resolve, Premiere) need to read back. macOS-sandboxed Node writes under
|
|
15
|
+
* `/var/folders/...` are invisible to the host process, so we transparently
|
|
16
|
+
* redirect to `~/Documents/gg-editor-out/`. The redirect is reported back
|
|
17
|
+
* through tool output so the agent can surface it.
|
|
18
|
+
*/
|
|
19
|
+
/** Default user-visible output directory for sandbox-redirected files. */
|
|
20
|
+
export declare const USER_OUTPUT_DIR_NAME = "gg-editor-out";
|
|
21
|
+
/** Build the full path of the per-user output directory. */
|
|
22
|
+
export declare function userOutputDir(): string;
|
|
23
|
+
export interface SafeOutputOptions {
|
|
24
|
+
/** Additional absolute paths that are valid output roots. */
|
|
25
|
+
allowRoots?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve `requested` against `cwd` and verify it lies under an allowed root.
|
|
29
|
+
* Throws an Error whose message follows the `error:` format consumed by tools.
|
|
30
|
+
*/
|
|
31
|
+
export declare function safeOutputPath(cwd: string, requested: string, opts?: SafeOutputOptions): string;
|
|
32
|
+
export interface SafeResolveResult {
|
|
33
|
+
/** Final absolute path after redirect (if any). */
|
|
34
|
+
path: string;
|
|
35
|
+
/** True when the original request landed in a sandbox-only location. */
|
|
36
|
+
redirected: boolean;
|
|
37
|
+
/** Human-readable reason for the redirect, when applicable. */
|
|
38
|
+
reason?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Like `safeOutputPath`, but additionally redirects sandbox-only paths to the
|
|
42
|
+
* user-visible output dir so that NLE host processes (which run outside Node's
|
|
43
|
+
* sandbox) can read the result back. Use for stills / thumbnails / GIFs that
|
|
44
|
+
* the host might import.
|
|
45
|
+
*/
|
|
46
|
+
export declare function safeResolveOutputPath(cwd: string, requested: string, opts?: SafeOutputOptions): SafeResolveResult;
|
|
47
|
+
//# sourceMappingURL=safe-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-paths.d.ts","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,4DAA4D;AAC5D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAuBD,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAY/F;AA2BD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,iBAAiB,GACvB,iBAAiB,CAWnB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path-safety helpers for file-writing tools.
|
|
3
|
+
*
|
|
4
|
+
* Two distinct guards live here:
|
|
5
|
+
*
|
|
6
|
+
* 1. `safeOutputPath()` — path-traversal guard. Resolves `requested` against
|
|
7
|
+
* `cwd`, then refuses absolute paths that escape the configured allow-list
|
|
8
|
+
* of roots (cwd, system tempdir, the per-user output dir under ~/Documents).
|
|
9
|
+
* Tools writing on behalf of the agent must call this before opening any
|
|
10
|
+
* file handle — it stops the agent from writing to `../../etc/passwd` even
|
|
11
|
+
* when the user has not validated the value.
|
|
12
|
+
*
|
|
13
|
+
* 2. `safeResolveOutputPath()` — sandbox redirect for paths that NLE hosts
|
|
14
|
+
* (Resolve, Premiere) need to read back. macOS-sandboxed Node writes under
|
|
15
|
+
* `/var/folders/...` are invisible to the host process, so we transparently
|
|
16
|
+
* redirect to `~/Documents/gg-editor-out/`. The redirect is reported back
|
|
17
|
+
* through tool output so the agent can surface it.
|
|
18
|
+
*/
|
|
19
|
+
import { homedir, tmpdir } from "node:os";
|
|
20
|
+
import { basename, isAbsolute, resolve as resolvePath } from "node:path";
|
|
21
|
+
/** Default user-visible output directory for sandbox-redirected files. */
|
|
22
|
+
export const USER_OUTPUT_DIR_NAME = "gg-editor-out";
|
|
23
|
+
/** Build the full path of the per-user output directory. */
|
|
24
|
+
export function userOutputDir() {
|
|
25
|
+
return resolvePath(homedir(), "Documents", USER_OUTPUT_DIR_NAME);
|
|
26
|
+
}
|
|
27
|
+
function realTmpdir() {
|
|
28
|
+
// On macOS, tmpdir() returns /var/folders/... which itself is one of the
|
|
29
|
+
// sandbox roots we redirect FROM. We still allow it as an output root for
|
|
30
|
+
// ffmpeg-only tools that don't feed Resolve back; the redirect helper is
|
|
31
|
+
// the one that pushes Resolve-facing writes elsewhere.
|
|
32
|
+
return resolvePath(tmpdir());
|
|
33
|
+
}
|
|
34
|
+
function defaultAllowRoots(cwd) {
|
|
35
|
+
return [resolvePath(cwd), realTmpdir(), userOutputDir()];
|
|
36
|
+
}
|
|
37
|
+
function isUnderRoot(absPath, root) {
|
|
38
|
+
const a = absPath;
|
|
39
|
+
const r = root.endsWith("/") || root.endsWith("\\") ? root.slice(0, -1) : root;
|
|
40
|
+
if (a === r)
|
|
41
|
+
return true;
|
|
42
|
+
// Use platform-aware separator: on Windows the resolve() output uses '\\'.
|
|
43
|
+
const sep = a.includes("\\") && !a.includes("/") ? "\\" : "/";
|
|
44
|
+
return a.startsWith(r + sep);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve `requested` against `cwd` and verify it lies under an allowed root.
|
|
48
|
+
* Throws an Error whose message follows the `error:` format consumed by tools.
|
|
49
|
+
*/
|
|
50
|
+
export function safeOutputPath(cwd, requested, opts) {
|
|
51
|
+
if (!requested || typeof requested !== "string") {
|
|
52
|
+
throw new Error("output path is empty");
|
|
53
|
+
}
|
|
54
|
+
const abs = resolvePath(cwd, requested);
|
|
55
|
+
const roots = [...defaultAllowRoots(cwd), ...(opts?.allowRoots ?? []).map((r) => resolvePath(r))];
|
|
56
|
+
for (const root of roots) {
|
|
57
|
+
if (isUnderRoot(abs, root))
|
|
58
|
+
return abs;
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`output path '${requested}' resolves outside allowed roots (cwd, tempdir, ~/Documents/${USER_OUTPUT_DIR_NAME})`);
|
|
61
|
+
}
|
|
62
|
+
/** Sandbox roots whose writes are invisible to host (Resolve/Premiere) processes. */
|
|
63
|
+
function sandboxRoots() {
|
|
64
|
+
const roots = ["/var/folders/", "/private/var/folders/", "/private/tmp/", "/tmp/", "/var/tmp/"];
|
|
65
|
+
// On Windows, %LOCALAPPDATA%\Temp comes back via tmpdir(); treat the system
|
|
66
|
+
// tempdir as a sandbox if it's not directly under the user profile.
|
|
67
|
+
const t = realTmpdir();
|
|
68
|
+
const home = resolvePath(homedir());
|
|
69
|
+
if (!isUnderRoot(t, home))
|
|
70
|
+
roots.push(t);
|
|
71
|
+
return roots;
|
|
72
|
+
}
|
|
73
|
+
function isSandboxPath(absPath) {
|
|
74
|
+
for (const root of sandboxRoots()) {
|
|
75
|
+
if (absPath === root ||
|
|
76
|
+
absPath.startsWith(root) ||
|
|
77
|
+
// Tolerate trailing-slash absent variants on POSIX:
|
|
78
|
+
(root.endsWith("/") && absPath.startsWith(root.slice(0, -1) + "/"))) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Like `safeOutputPath`, but additionally redirects sandbox-only paths to the
|
|
86
|
+
* user-visible output dir so that NLE host processes (which run outside Node's
|
|
87
|
+
* sandbox) can read the result back. Use for stills / thumbnails / GIFs that
|
|
88
|
+
* the host might import.
|
|
89
|
+
*/
|
|
90
|
+
export function safeResolveOutputPath(cwd, requested, opts) {
|
|
91
|
+
const abs = isAbsolute(requested) ? resolvePath(requested) : safeOutputPath(cwd, requested, opts);
|
|
92
|
+
if (!isSandboxPath(abs)) {
|
|
93
|
+
return { path: abs, redirected: false };
|
|
94
|
+
}
|
|
95
|
+
const out = resolvePath(userOutputDir(), basename(abs));
|
|
96
|
+
return {
|
|
97
|
+
path: out,
|
|
98
|
+
redirected: true,
|
|
99
|
+
reason: `original path '${abs}' is in a sandboxed temp directory and would be invisible to the host process`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=safe-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-paths.js","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-paths.test.d.ts","sourceRoot":"","sources":["../../src/core/safe-paths.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { homedir, tmpdir } from "node:os";
|
|
2
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { USER_OUTPUT_DIR_NAME, safeOutputPath, safeResolveOutputPath, userOutputDir, } from "./safe-paths.js";
|
|
5
|
+
const cwd = resolvePath(homedir(), "sample-project");
|
|
6
|
+
describe("safeOutputPath", () => {
|
|
7
|
+
it("accepts a relative path under cwd", () => {
|
|
8
|
+
const out = safeOutputPath(cwd, "out/clip.mp4");
|
|
9
|
+
expect(out).toBe(resolvePath(cwd, "out/clip.mp4"));
|
|
10
|
+
});
|
|
11
|
+
it("rejects escape via parent-dir traversal", () => {
|
|
12
|
+
expect(() => safeOutputPath("/Users/agent/proj", "../../etc/passwd")).toThrow(/outside allowed roots/);
|
|
13
|
+
});
|
|
14
|
+
it("accepts absolute paths under the user output dir", () => {
|
|
15
|
+
const target = resolvePath(userOutputDir(), "thumb.jpg");
|
|
16
|
+
const out = safeOutputPath(cwd, target);
|
|
17
|
+
expect(out).toBe(target);
|
|
18
|
+
});
|
|
19
|
+
it("accepts absolute paths under the system tempdir", () => {
|
|
20
|
+
const target = resolvePath(tmpdir(), "scratch", "x.wav");
|
|
21
|
+
const out = safeOutputPath(cwd, target);
|
|
22
|
+
expect(out).toBe(target);
|
|
23
|
+
});
|
|
24
|
+
it("rejects an absolute path outside the allowlist", () => {
|
|
25
|
+
expect(() => safeOutputPath(cwd, "/etc/hosts")).toThrow(/outside allowed roots/);
|
|
26
|
+
});
|
|
27
|
+
it("accepts paths under user-supplied allowRoots", () => {
|
|
28
|
+
const root = resolvePath(homedir(), "Movies", "raw");
|
|
29
|
+
const target = resolvePath(root, "a.mp4");
|
|
30
|
+
const out = safeOutputPath(cwd, target, { allowRoots: [root] });
|
|
31
|
+
expect(out).toBe(target);
|
|
32
|
+
});
|
|
33
|
+
it("rejects empty input", () => {
|
|
34
|
+
expect(() => safeOutputPath(cwd, "")).toThrow(/empty/);
|
|
35
|
+
});
|
|
36
|
+
it("treats Windows-style drive letters consistently with node:path", () => {
|
|
37
|
+
// On POSIX runners this becomes a relative-looking path; the assertion
|
|
38
|
+
// just guarantees we don't throw on the segment shape — node:path picks
|
|
39
|
+
// the platform behaviour and we trust it.
|
|
40
|
+
const out = safeOutputPath(cwd, "C:/Users/me/out.mp4");
|
|
41
|
+
expect(out.endsWith("out.mp4")).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("safeResolveOutputPath", () => {
|
|
45
|
+
it("leaves a regular cwd-relative path unchanged", () => {
|
|
46
|
+
const r = safeResolveOutputPath(cwd, "thumb.jpg");
|
|
47
|
+
expect(r.redirected).toBe(false);
|
|
48
|
+
expect(r.path.endsWith("thumb.jpg")).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it("redirects /tmp paths to ~/Documents/gg-editor-out", () => {
|
|
51
|
+
const r = safeResolveOutputPath(cwd, "/tmp/grab.jpg");
|
|
52
|
+
expect(r.redirected).toBe(true);
|
|
53
|
+
expect(r.path).toBe(resolvePath(userOutputDir(), "grab.jpg"));
|
|
54
|
+
expect(r.reason).toMatch(/sandbox/);
|
|
55
|
+
});
|
|
56
|
+
it("redirects /var/folders sandbox paths", () => {
|
|
57
|
+
const r = safeResolveOutputPath(cwd, "/var/folders/zz/abc/T/grab.jpg");
|
|
58
|
+
expect(r.redirected).toBe(true);
|
|
59
|
+
expect(r.path).toBe(resolvePath(userOutputDir(), "grab.jpg"));
|
|
60
|
+
});
|
|
61
|
+
it("redirects /private/var paths", () => {
|
|
62
|
+
const r = safeResolveOutputPath(cwd, "/private/var/folders/zz/T/grab.jpg");
|
|
63
|
+
expect(r.redirected).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
it("preserves an absolute path under the user output dir", () => {
|
|
66
|
+
const target = resolvePath(userOutputDir(), "explicit.jpg");
|
|
67
|
+
const r = safeResolveOutputPath(cwd, target);
|
|
68
|
+
expect(r.redirected).toBe(false);
|
|
69
|
+
expect(r.path).toBe(target);
|
|
70
|
+
});
|
|
71
|
+
it("exports a sensible USER_OUTPUT_DIR_NAME constant", () => {
|
|
72
|
+
expect(USER_OUTPUT_DIR_NAME).toBe("gg-editor-out");
|
|
73
|
+
expect(userOutputDir().endsWith(USER_OUTPUT_DIR_NAME)).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=safe-paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-paths.test.js","sourceRoot":"","sources":["../../src/core/safe-paths.test.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AA2vBD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAqC/C,CAAC;AAEF,eAAO,MAAM,WAAW,UAAsB,CAAC"}
|
package/dist/skills.js
CHANGED
|
@@ -643,6 +643,126 @@ better reference frame if confidence was low.
|
|
|
643
643
|
- Don't bake \`grade_skin_tones\` over the original target file. Always
|
|
644
644
|
write to a new path.
|
|
645
645
|
`;
|
|
646
|
+
const FUSION_LOWER_THIRD = `# fusion-lower-third
|
|
647
|
+
|
|
648
|
+
**When to use:** the user asks for a name/title chyron that should be
|
|
649
|
+
*editable inside the NLE* (not baked-in pixels), or wants a quick
|
|
650
|
+
title card built natively in DaVinci Resolve's Fusion page.
|
|
651
|
+
|
|
652
|
+
**Goal:** compose a Background + TextPlus + Merge graph in Fusion via
|
|
653
|
+
\`fusion_comp\`. Resolve only — Premiere has no Fusion equivalent; for
|
|
654
|
+
that, fall back to \`write_lower_third\` + \`burn_subtitles\`.
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## When to pick which
|
|
659
|
+
|
|
660
|
+
- **fusion_comp** — Resolve, comp lives inside the project, user can
|
|
661
|
+
tweak it later. Best when the user is already on the Fusion page or
|
|
662
|
+
wants a chyron that travels with the project file.
|
|
663
|
+
- **write_lower_third + burn_subtitles** — works on any host, output
|
|
664
|
+
is a baked-in pixel layer. Faster to iterate from the agent side
|
|
665
|
+
but the user can no longer edit the text without re-running the
|
|
666
|
+
pipeline.
|
|
667
|
+
|
|
668
|
+
If unsure, ask: "Resolve-native (editable) or baked-in?"
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## Recipe — name + title lower-third on the active comp
|
|
673
|
+
|
|
674
|
+
Pre-flight: \`host_info\` must report \`name === "resolve"\`. If it doesn't,
|
|
675
|
+
stop and tell the user this skill is Resolve-only.
|
|
676
|
+
|
|
677
|
+
\`\`\`
|
|
678
|
+
host_info # confirm Resolve
|
|
679
|
+
|
|
680
|
+
# 1. Get to the Fusion page so the user can see the result.
|
|
681
|
+
open_page(name="fusion")
|
|
682
|
+
|
|
683
|
+
# 2. Build the graph.
|
|
684
|
+
fusion_comp(action="add_node", toolId="Background", name="LT_Strap")
|
|
685
|
+
fusion_comp(action="add_node", toolId="TextPlus", name="LT_Text")
|
|
686
|
+
fusion_comp(action="add_node", toolId="Merge", name="LT_Comp")
|
|
687
|
+
|
|
688
|
+
# 3. Wire it: strap as Background, text as Foreground.
|
|
689
|
+
fusion_comp(action="connect", fromNode="LT_Strap", toNode="LT_Comp",
|
|
690
|
+
toInput="Background")
|
|
691
|
+
fusion_comp(action="connect", fromNode="LT_Text", toNode="LT_Comp",
|
|
692
|
+
toInput="Foreground")
|
|
693
|
+
|
|
694
|
+
# 4. Set the text content + colour.
|
|
695
|
+
fusion_comp(action="set_input", node="LT_Text", input="StyledText",
|
|
696
|
+
value="<Name>\\n<Title>")
|
|
697
|
+
fusion_comp(action="set_input", node="LT_Text", input="Size", value=0.06)
|
|
698
|
+
fusion_comp(action="set_input", node="LT_Text", input="Color1Red", value=1)
|
|
699
|
+
fusion_comp(action="set_input", node="LT_Text", input="Color1Green", value=1)
|
|
700
|
+
fusion_comp(action="set_input", node="LT_Text", input="Color1Blue", value=1)
|
|
701
|
+
|
|
702
|
+
# 5. Park the strap in the lower-left third.
|
|
703
|
+
fusion_comp(action="set_input", node="LT_Strap", input="TopLeftRed", value=0)
|
|
704
|
+
fusion_comp(action="set_input", node="LT_Strap", input="TopLeftGreen", value=0)
|
|
705
|
+
fusion_comp(action="set_input", node="LT_Strap", input="TopLeftBlue", value=0)
|
|
706
|
+
fusion_comp(action="set_input", node="LT_Strap", input="TopLeftAlpha", value=0.85)
|
|
707
|
+
\`\`\`
|
|
708
|
+
|
|
709
|
+
The Merge node is the comp's MediaOut by default; the user sees the
|
|
710
|
+
result on the active timeline clip immediately.
|
|
711
|
+
|
|
712
|
+
---
|
|
713
|
+
|
|
714
|
+
## Animating in / out
|
|
715
|
+
|
|
716
|
+
Use \`set_keyframe\` on the Merge's \`Blend\` input (overall opacity):
|
|
717
|
+
|
|
718
|
+
\`\`\`
|
|
719
|
+
fusion_comp(action="set_keyframe", node="LT_Comp", input="Blend",
|
|
720
|
+
frame=0, value=0) # invisible at clip start
|
|
721
|
+
fusion_comp(action="set_keyframe", node="LT_Comp", input="Blend",
|
|
722
|
+
frame=12, value=1) # fade in over 12f
|
|
723
|
+
fusion_comp(action="set_keyframe", node="LT_Comp", input="Blend",
|
|
724
|
+
frame=72, value=1) # hold
|
|
725
|
+
fusion_comp(action="set_keyframe", node="LT_Comp", input="Blend",
|
|
726
|
+
frame=84, value=0) # fade out
|
|
727
|
+
\`\`\`
|
|
728
|
+
|
|
729
|
+
Frames are relative to the comp's render range — set it explicitly if
|
|
730
|
+
the agent needs to control the in/out range:
|
|
731
|
+
|
|
732
|
+
\`\`\`
|
|
733
|
+
fusion_comp(action="set_render_range", start=0, end=120)
|
|
734
|
+
\`\`\`
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## Targeting a specific clip's comp
|
|
739
|
+
|
|
740
|
+
Pass \`clipId\` to scope every action to that clip's first Fusion comp
|
|
741
|
+
(auto-created if the clip has none). Useful for batched lower-thirds
|
|
742
|
+
across multiple clips:
|
|
743
|
+
|
|
744
|
+
\`\`\`
|
|
745
|
+
get_timeline # discover clipIds
|
|
746
|
+
fusion_comp(action="add_node", toolId="TextPlus",
|
|
747
|
+
name="LT_Text", clipId="<clipId>")
|
|
748
|
+
\`\`\`
|
|
749
|
+
|
|
750
|
+
---
|
|
751
|
+
|
|
752
|
+
## Troubleshooting
|
|
753
|
+
|
|
754
|
+
- **\`Resolve.Fusion() unavailable\`** — Resolve build is too old or
|
|
755
|
+
user is on a free seat. Fusion is Studio-only at scriptable depth.
|
|
756
|
+
- **\`No active Fusion comp\`** — user hasn't switched to the Fusion
|
|
757
|
+
page on a clip with a comp. Either call \`open_page("fusion")\` first
|
|
758
|
+
on a known clip, or pass \`clipId\` so we operate on that clip's comp
|
|
759
|
+
directly.
|
|
760
|
+
- **\`AddTool('X') returned None\`** — \`toolId\` is wrong. The canonical
|
|
761
|
+
IDs the agent will hit: \`Background\`, \`TextPlus\`, \`Merge\`,
|
|
762
|
+
\`Transform\`, \`ColorCorrector\`, \`DeltaKeyer\`, \`Brightness\`, \`Glow\`,
|
|
763
|
+
\`Blur\`. There's no scriptable enumeration; check Fusion's docs if
|
|
764
|
+
the user names a tool not in this list.
|
|
765
|
+
`;
|
|
646
766
|
export const SKILLS = {
|
|
647
767
|
"long-form-content-edit": {
|
|
648
768
|
name: "long-form-content-edit",
|
|
@@ -669,6 +789,11 @@ export const SKILLS = {
|
|
|
669
789
|
description: "Recipe for matching faces across clips when host scripting can't reach power windows or qualifiers. Two paths: grade_skin_tones (file-only, every host — bakes a vision-derived colorbalance + selectivecolor + eq grade into a new mp4, pair with replace_clip) and match_clip_color (Resolve only — derives the same grade as a CDL and pipes it through set_primary_correction, non-baked). Both share one vision pass over a reference frame and a target frame; below confidence 0.4 the grade is unreliable.",
|
|
670
790
|
content: SKIN_TONE_MATCHING,
|
|
671
791
|
},
|
|
792
|
+
"fusion-lower-third": {
|
|
793
|
+
name: "fusion-lower-third",
|
|
794
|
+
description: "Recipe for building a name/title chyron natively in DaVinci Resolve's Fusion page via fusion_comp. Walks the agent through Background + TextPlus + Merge node graph, wiring, text styling, lower-third positioning, and keyframed fade in/out via Merge.Blend. Resolve-only (Studio); for cross-host pixel-baked chyrons fall back to write_lower_third + burn_subtitles.",
|
|
795
|
+
content: FUSION_LOWER_THIRD,
|
|
796
|
+
},
|
|
672
797
|
};
|
|
673
798
|
export const SKILL_NAMES = Object.keys(SKILLS);
|
|
674
799
|
//# sourceMappingURL=skills.js.map
|
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G9B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgH/B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FvB,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K7B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJ1B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,wBAAwB,EAAE;QACxB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,iUAAiU;QACnU,OAAO,EAAE,sBAAsB;KAChC;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,gOAAgO;QAClO,OAAO,EAAE,uBAAuB;KACjC;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,iPAAiP;QACnP,OAAO,EAAE,eAAe;KACzB;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,sfAAsf;QACxf,OAAO,EAAE,qBAAqB;KAC/B;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,ofAAof;QACtf,OAAO,EAAE,kBAAkB;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G9B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgH/B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FvB,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K7B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJ1B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuH1B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,wBAAwB,EAAE;QACxB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,iUAAiU;QACnU,OAAO,EAAE,sBAAsB;KAChC;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,gOAAgO;QAClO,OAAO,EAAE,uBAAuB;KACjC;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,iPAAiP;QACnP,OAAO,EAAE,eAAe;KACzB;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,sfAAsf;QACxf,OAAO,EAAE,qBAAqB;KAC/B;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,ofAAof;QACtf,OAAO,EAAE,kBAAkB;KAC5B;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,2WAA2W;QAC7W,OAAO,EAAE,kBAAkB;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA6B9F,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA6B9F,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAib5F;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAO7E"}
|