@lingjingai/scriptctl 0.25.2 → 0.25.4
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/cli.js +26 -3
- package/dist/cli.js.map +1 -1
- package/dist/common.js +3 -2
- package/dist/common.js.map +1 -1
- package/dist/domain/direct-core.d.ts +11 -0
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/domain/loom/checkpointer.d.ts +3 -0
- package/dist/domain/loom/checkpointer.js +30 -0
- package/dist/domain/loom/checkpointer.js.map +1 -0
- package/dist/domain/loom/index.d.ts +44 -0
- package/dist/domain/loom/index.js +275 -0
- package/dist/domain/loom/index.js.map +1 -0
- package/dist/domain/loom/types.d.ts +100 -0
- package/dist/domain/loom/types.js +2 -0
- package/dist/domain/loom/types.js.map +1 -0
- package/dist/help-text.js +27 -0
- package/dist/help-text.js.map +1 -1
- package/dist/infra/providers.d.ts +40 -0
- package/dist/infra/providers.js +289 -4
- package/dist/infra/providers.js.map +1 -1
- package/dist/usecases/direct.js +20 -1
- package/dist/usecases/direct.js.map +1 -1
- package/dist/usecases/parse.js +22 -5
- package/dist/usecases/parse.js.map +1 -1
- package/dist/usecases/script/synopsis-generate.d.ts +116 -0
- package/dist/usecases/script/synopsis-generate.js +801 -0
- package/dist/usecases/script/synopsis-generate.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { exists, readJson, sha256Text, writeJson, } from "../../common.js";
|
|
3
|
+
function keyPath(dir, key) {
|
|
4
|
+
const digest = sha256Text(key);
|
|
5
|
+
return path.join(dir, `${digest}.json`);
|
|
6
|
+
}
|
|
7
|
+
export function fileCheckpointer(dir) {
|
|
8
|
+
return {
|
|
9
|
+
read(key) {
|
|
10
|
+
const p = keyPath(dir, key);
|
|
11
|
+
if (!exists(p))
|
|
12
|
+
return null;
|
|
13
|
+
return readJson(p);
|
|
14
|
+
},
|
|
15
|
+
write(record) {
|
|
16
|
+
writeJson(keyPath(dir, record.key), record);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function noopCheckpointer() {
|
|
21
|
+
return {
|
|
22
|
+
read() {
|
|
23
|
+
return null;
|
|
24
|
+
},
|
|
25
|
+
write() {
|
|
26
|
+
// intentionally empty
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=checkpointer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointer.js","sourceRoot":"","sources":["../../../src/domain/loom/checkpointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,iBAAiB,CAAC;AAMzB,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO;QACL,IAAI,CAAc,GAAW;YAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5B,OAAO,QAAQ,CAAsB,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAc,MAA2B;YAC5C,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK;YACH,sBAAsB;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ExtractTask, FnTask, LlmTask, LoomResult, LoomStep, ParcelNode, ReduceTask, RootNode, RunOptions, ScopeName, ScopeNode, SplitSpec } from "./types.js";
|
|
2
|
+
export { fileCheckpointer, noopCheckpointer, } from "./checkpointer.js";
|
|
3
|
+
export type { Checkpointer, CheckpointRecord, ExtractTask, FnTask, LlmTask, LoomReport, LoomResult, LoomTree, ModelRequest, ModelResponse, ParcelNode, ReduceTask, RootNode, RunOptions, ScopeName, ScopeNode, SplitSpec, TextModel, } from "./types.js";
|
|
4
|
+
export declare function root<TParcel>(children: Array<ScopeNode<unknown, TParcel> | ParcelNode<TParcel>>): RootNode<TParcel>;
|
|
5
|
+
export declare function group<TScope, TParcel>(scope: ScopeName, children: Array<ScopeNode<unknown, TParcel> | ParcelNode<TParcel>>, data: TScope): ScopeNode<TScope, TParcel>;
|
|
6
|
+
export declare function parcel<TParcel>(data: TParcel): ParcelNode<TParcel>;
|
|
7
|
+
export declare function llm<TInput, TOutput>(opts: {
|
|
8
|
+
version?: string;
|
|
9
|
+
instruction: string;
|
|
10
|
+
format: string;
|
|
11
|
+
input?: (ctx: {
|
|
12
|
+
parcel: TInput;
|
|
13
|
+
}) => string;
|
|
14
|
+
parse: (ctx: {
|
|
15
|
+
text: string;
|
|
16
|
+
parcel: TInput;
|
|
17
|
+
raw?: unknown;
|
|
18
|
+
}) => TOutput;
|
|
19
|
+
validate?: (output: TOutput) => void;
|
|
20
|
+
}): LlmTask<TInput, TOutput>;
|
|
21
|
+
export declare function fn<TInput, TOutput>(opts: {
|
|
22
|
+
version?: string;
|
|
23
|
+
run: (ctx: {
|
|
24
|
+
parcel: TInput;
|
|
25
|
+
}) => Promise<TOutput> | TOutput;
|
|
26
|
+
validate?: (output: TOutput) => void;
|
|
27
|
+
}): FnTask<TInput, TOutput>;
|
|
28
|
+
export declare class LoomJob<TInput, TCurrent> {
|
|
29
|
+
private readonly input;
|
|
30
|
+
private readonly steps;
|
|
31
|
+
constructor(input: TInput, steps?: LoomStep[]);
|
|
32
|
+
split<TScope, TParcel>(spec: SplitSpec<TInput, TScope, TParcel>): LoomJob<TInput, TParcel>;
|
|
33
|
+
extract<TOutput>(task: ExtractTask<TCurrent, TOutput>): LoomJob<TInput, TOutput>;
|
|
34
|
+
reduce<TOutput, TScope = unknown>(scope: ScopeName, task: ReduceTask<TCurrent, TOutput, TScope> | ((items: TCurrent[], ctx: {
|
|
35
|
+
scope: TScope | null;
|
|
36
|
+
scopeName: ScopeName;
|
|
37
|
+
}) => Promise<TOutput> | TOutput)): LoomJob<TInput, TOutput>;
|
|
38
|
+
plan(): {
|
|
39
|
+
input: TInput;
|
|
40
|
+
steps: LoomStep[];
|
|
41
|
+
};
|
|
42
|
+
run(opts?: RunOptions): Promise<LoomResult<TCurrent>>;
|
|
43
|
+
}
|
|
44
|
+
export declare function loom<TInput>(input: TInput): LoomJob<TInput, TInput>;
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { sha256Text } from "../../common.js";
|
|
2
|
+
import { noopCheckpointer, } from "./checkpointer.js";
|
|
3
|
+
export { fileCheckpointer, noopCheckpointer, } from "./checkpointer.js";
|
|
4
|
+
function stableStringify(value) {
|
|
5
|
+
if (Array.isArray(value))
|
|
6
|
+
return `[${value.map((v) => stableStringify(v)).join(",")}]`;
|
|
7
|
+
if (value && typeof value === "object") {
|
|
8
|
+
const obj = value;
|
|
9
|
+
return `{${Object.keys(obj).sort().map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(",")}}`;
|
|
10
|
+
}
|
|
11
|
+
return JSON.stringify(value);
|
|
12
|
+
}
|
|
13
|
+
function signature(value) {
|
|
14
|
+
return sha256Text(stableStringify(value));
|
|
15
|
+
}
|
|
16
|
+
function checkpointRecord(key, sig, value) {
|
|
17
|
+
return {
|
|
18
|
+
key,
|
|
19
|
+
signature: sig,
|
|
20
|
+
value,
|
|
21
|
+
createdAt: new Date().toISOString(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function joinPrompt(instruction, format) {
|
|
25
|
+
return [instruction.trim(), format.trim()].filter(Boolean).join("\n\n");
|
|
26
|
+
}
|
|
27
|
+
function renderLlmRequest(task, parcelValue) {
|
|
28
|
+
return {
|
|
29
|
+
system: joinPrompt(task.instruction, task.format),
|
|
30
|
+
user: task.input ? task.input({ parcel: parcelValue }) : String(parcelValue),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function extractCheckpointPayload(task, parcelValue, runtime) {
|
|
34
|
+
if (task.kind === "llm") {
|
|
35
|
+
const request = renderLlmRequest(task, parcelValue);
|
|
36
|
+
return {
|
|
37
|
+
request,
|
|
38
|
+
payload: {
|
|
39
|
+
step: "extract",
|
|
40
|
+
kind: "llm",
|
|
41
|
+
version: task.version ?? "",
|
|
42
|
+
system: request.system,
|
|
43
|
+
user: request.user,
|
|
44
|
+
salt: runtime.checkpointSalt,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
payload: {
|
|
50
|
+
step: "extract",
|
|
51
|
+
kind: "fn",
|
|
52
|
+
version: task.version ?? "",
|
|
53
|
+
parcel: parcelValue,
|
|
54
|
+
salt: runtime.checkpointSalt,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function root(children) {
|
|
59
|
+
return { kind: "root", children };
|
|
60
|
+
}
|
|
61
|
+
export function group(scope, children, data) {
|
|
62
|
+
return { kind: "scope", scope, data, children };
|
|
63
|
+
}
|
|
64
|
+
export function parcel(data) {
|
|
65
|
+
return { kind: "parcel", data };
|
|
66
|
+
}
|
|
67
|
+
export function llm(opts) {
|
|
68
|
+
return { kind: "llm", ...opts };
|
|
69
|
+
}
|
|
70
|
+
export function fn(opts) {
|
|
71
|
+
return { kind: "fn", ...opts };
|
|
72
|
+
}
|
|
73
|
+
export class LoomJob {
|
|
74
|
+
input;
|
|
75
|
+
steps;
|
|
76
|
+
constructor(input, steps = []) {
|
|
77
|
+
this.input = input;
|
|
78
|
+
this.steps = steps;
|
|
79
|
+
}
|
|
80
|
+
split(spec) {
|
|
81
|
+
return new LoomJob(this.input, [...this.steps, { kind: "split", spec: spec }]);
|
|
82
|
+
}
|
|
83
|
+
extract(task) {
|
|
84
|
+
return new LoomJob(this.input, [...this.steps, { kind: "extract", task: task }]);
|
|
85
|
+
}
|
|
86
|
+
reduce(scope, task) {
|
|
87
|
+
const normalized = typeof task === "function" ? { run: task } : task;
|
|
88
|
+
return new LoomJob(this.input, [
|
|
89
|
+
...this.steps,
|
|
90
|
+
{ kind: "reduce", scope, task: normalized },
|
|
91
|
+
]);
|
|
92
|
+
}
|
|
93
|
+
plan() {
|
|
94
|
+
return { input: this.input, steps: [...this.steps] };
|
|
95
|
+
}
|
|
96
|
+
async run(opts = {}) {
|
|
97
|
+
const result = await executePlan(this.input, this.steps, opts);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function loom(input) {
|
|
102
|
+
return new LoomJob(input);
|
|
103
|
+
}
|
|
104
|
+
async function mapWithConcurrency(items, concurrency, worker) {
|
|
105
|
+
if (items.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
const out = new Array(items.length);
|
|
108
|
+
let cursor = 0;
|
|
109
|
+
const limit = Math.max(1, Math.min(concurrency, items.length));
|
|
110
|
+
await Promise.all(Array.from({ length: limit }, async () => {
|
|
111
|
+
while (true) {
|
|
112
|
+
const idx = cursor++;
|
|
113
|
+
if (idx >= items.length)
|
|
114
|
+
break;
|
|
115
|
+
out[idx] = await worker(items[idx], idx);
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
function splitTree(input, spec) {
|
|
121
|
+
const scopes = spec.partition(input);
|
|
122
|
+
return root(scopes.map((scopeData) => {
|
|
123
|
+
const chunks = spec.chunk(scopeData).map((chunk) => parcel(chunk));
|
|
124
|
+
return group(spec.scope, chunks, scopeData);
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
function flattenParcels(node, path = []) {
|
|
128
|
+
if (node.kind === "parcel")
|
|
129
|
+
return [{ parcel: node.data, path }];
|
|
130
|
+
const children = node.kind === "root" ? node.children : node.children;
|
|
131
|
+
const out = [];
|
|
132
|
+
for (let i = 0; i < children.length; i++) {
|
|
133
|
+
const child = children[i];
|
|
134
|
+
const childPath = child.kind === "scope"
|
|
135
|
+
? [...path, `${child.scope}:${i}`]
|
|
136
|
+
: [...path, `parcel:${i}`];
|
|
137
|
+
out.push(...flattenParcels(child, childPath));
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
function validateOutput(validate, output) {
|
|
142
|
+
validate?.(output);
|
|
143
|
+
return output;
|
|
144
|
+
}
|
|
145
|
+
async function runFnExtractTask(task, parcelValue) {
|
|
146
|
+
return validateOutput(task.validate, await task.run({ parcel: parcelValue }));
|
|
147
|
+
}
|
|
148
|
+
async function runLlmModel(request, runtime) {
|
|
149
|
+
if (!runtime.model)
|
|
150
|
+
throw new Error("loom llm task requires run({ model })");
|
|
151
|
+
return runtime.model({
|
|
152
|
+
system: request.system,
|
|
153
|
+
user: request.user,
|
|
154
|
+
signal: runtime.signal,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function parseLlmResponse(task, parcelValue, response) {
|
|
158
|
+
return validateOutput(task.validate, task.parse({ text: response.text, parcel: parcelValue, raw: response.raw }));
|
|
159
|
+
}
|
|
160
|
+
function replaceParcels(node, values, cursor) {
|
|
161
|
+
if (node.kind === "parcel") {
|
|
162
|
+
const value = values[cursor.index];
|
|
163
|
+
cursor.index += 1;
|
|
164
|
+
return parcel(value);
|
|
165
|
+
}
|
|
166
|
+
const children = node.children.map((child) => replaceParcels(child, values, cursor));
|
|
167
|
+
if (node.kind === "root")
|
|
168
|
+
return root(children);
|
|
169
|
+
return group(node.scope, children, node.data);
|
|
170
|
+
}
|
|
171
|
+
function allChildrenParcels(node) {
|
|
172
|
+
return node.children.every((child) => child.kind === "parcel");
|
|
173
|
+
}
|
|
174
|
+
async function reduceScopeNode(node, scope, task, runtime, path) {
|
|
175
|
+
if (node.kind === "parcel")
|
|
176
|
+
return node;
|
|
177
|
+
const reducedChildren = [];
|
|
178
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
179
|
+
const child = node.children[i];
|
|
180
|
+
reducedChildren.push(await reduceScopeNode(child, scope, task, runtime, [...path, `${child.kind}:${i}`]));
|
|
181
|
+
}
|
|
182
|
+
const rebuilt = node.kind === "root" ? root(reducedChildren) : group(node.scope, reducedChildren, node.data);
|
|
183
|
+
const isTargetRoot = scope === "root" && rebuilt.kind === "root";
|
|
184
|
+
const isTargetScope = rebuilt.kind === "scope" && rebuilt.scope === scope;
|
|
185
|
+
if (!isTargetRoot && !isTargetScope)
|
|
186
|
+
return rebuilt;
|
|
187
|
+
if (!allChildrenParcels(rebuilt))
|
|
188
|
+
return rebuilt;
|
|
189
|
+
const items = rebuilt.children.map((child) => child.data);
|
|
190
|
+
const scopeData = rebuilt.kind === "scope" ? rebuilt.data : null;
|
|
191
|
+
const scopeName = rebuilt.kind === "scope" ? rebuilt.scope : "root";
|
|
192
|
+
const version = task.version ?? "";
|
|
193
|
+
const key = `reduce:${scope}:${path.join("/")}:${signature({ items, scopeData, version, salt: runtime.checkpointSalt })}`;
|
|
194
|
+
const sig = signature({ step: "reduce", scope, version, items, scopeData, salt: runtime.checkpointSalt });
|
|
195
|
+
const cached = await readCheckpoint(runtime.checkpoint, key, sig);
|
|
196
|
+
if (cached.hit) {
|
|
197
|
+
runtime.report.reused += 1;
|
|
198
|
+
return parcel(validateOutput(task.validate, cached.value));
|
|
199
|
+
}
|
|
200
|
+
const out = validateOutput(task.validate, await task.run(items, { scope: scopeData, scopeName }));
|
|
201
|
+
runtime.report.ran += 1;
|
|
202
|
+
await runtime.checkpoint.write(checkpointRecord(key, sig, out));
|
|
203
|
+
return parcel(out);
|
|
204
|
+
}
|
|
205
|
+
async function readCheckpoint(checkpoint, key, sig) {
|
|
206
|
+
const record = await checkpoint.read(key);
|
|
207
|
+
if (record && record.signature === sig)
|
|
208
|
+
return { hit: true, value: record.value };
|
|
209
|
+
return { hit: false };
|
|
210
|
+
}
|
|
211
|
+
async function executePlan(input, steps, opts) {
|
|
212
|
+
const runtime = {
|
|
213
|
+
model: opts.model,
|
|
214
|
+
signal: opts.signal,
|
|
215
|
+
checkpointSalt: opts.checkpointSalt,
|
|
216
|
+
checkpoint: opts.checkpoint ?? noopCheckpointer(),
|
|
217
|
+
concurrency: opts.concurrency ?? 4,
|
|
218
|
+
report: { reused: 0, ran: 0 },
|
|
219
|
+
};
|
|
220
|
+
let tree = null;
|
|
221
|
+
let currentInput = input;
|
|
222
|
+
for (const step of steps) {
|
|
223
|
+
if (step.kind === "split") {
|
|
224
|
+
tree = splitTree(currentInput, step.spec);
|
|
225
|
+
currentInput = tree;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (!tree) {
|
|
229
|
+
tree = root([parcel(currentInput)]);
|
|
230
|
+
}
|
|
231
|
+
if (step.kind === "extract") {
|
|
232
|
+
const leaves = flattenParcels(tree);
|
|
233
|
+
const values = await mapWithConcurrency(leaves, runtime.concurrency, async (leaf) => {
|
|
234
|
+
const checkpoint = extractCheckpointPayload(step.task, leaf.parcel, runtime);
|
|
235
|
+
const sig = signature(checkpoint.payload);
|
|
236
|
+
const key = `extract:${leaf.path.join("/")}:${sig}`;
|
|
237
|
+
if (step.task.kind === "llm") {
|
|
238
|
+
const cached = await readCheckpoint(runtime.checkpoint, key, sig);
|
|
239
|
+
if (cached.hit) {
|
|
240
|
+
runtime.report.reused += 1;
|
|
241
|
+
return parseLlmResponse(step.task, leaf.parcel, cached.value);
|
|
242
|
+
}
|
|
243
|
+
const request = checkpoint.request ?? renderLlmRequest(step.task, leaf.parcel);
|
|
244
|
+
const response = await runLlmModel(request, runtime);
|
|
245
|
+
const value = parseLlmResponse(step.task, leaf.parcel, response);
|
|
246
|
+
runtime.report.ran += 1;
|
|
247
|
+
await runtime.checkpoint.write(checkpointRecord(key, sig, response));
|
|
248
|
+
return value;
|
|
249
|
+
}
|
|
250
|
+
const cached = await readCheckpoint(runtime.checkpoint, key, sig);
|
|
251
|
+
if (cached.hit) {
|
|
252
|
+
runtime.report.reused += 1;
|
|
253
|
+
return validateOutput(step.task.validate, cached.value);
|
|
254
|
+
}
|
|
255
|
+
const value = await runFnExtractTask(step.task, leaf.parcel);
|
|
256
|
+
runtime.report.ran += 1;
|
|
257
|
+
await runtime.checkpoint.write(checkpointRecord(key, sig, value));
|
|
258
|
+
return value;
|
|
259
|
+
});
|
|
260
|
+
tree = replaceParcels(tree, values, { index: 0 });
|
|
261
|
+
currentInput = tree;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
tree = await reduceScopeNode(tree, step.scope, step.task, runtime, []);
|
|
265
|
+
currentInput = tree;
|
|
266
|
+
}
|
|
267
|
+
if (!tree)
|
|
268
|
+
return { value: currentInput, report: runtime.report };
|
|
269
|
+
const leaves = flattenParcels(tree);
|
|
270
|
+
if (leaves.length !== 1) {
|
|
271
|
+
throw new Error(`loom plan ended with ${leaves.length} result(s); reduce to root before run completes`);
|
|
272
|
+
}
|
|
273
|
+
return { value: leaves[0].parcel, report: runtime.report };
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/loom/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export type ScopeName = string;
|
|
2
|
+
export interface ModelRequest {
|
|
3
|
+
system: string;
|
|
4
|
+
user: string;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
metadata?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface ModelResponse {
|
|
9
|
+
text: string;
|
|
10
|
+
raw?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export type TextModel = (request: ModelRequest) => Promise<ModelResponse> | ModelResponse;
|
|
13
|
+
export interface ScopeNode<TScope, TParcel> {
|
|
14
|
+
kind: "scope";
|
|
15
|
+
scope: ScopeName;
|
|
16
|
+
data: TScope;
|
|
17
|
+
children: Array<ScopeNode<unknown, TParcel> | ParcelNode<TParcel>>;
|
|
18
|
+
}
|
|
19
|
+
export interface ParcelNode<TParcel> {
|
|
20
|
+
kind: "parcel";
|
|
21
|
+
data: TParcel;
|
|
22
|
+
}
|
|
23
|
+
export interface RootNode<TParcel> {
|
|
24
|
+
kind: "root";
|
|
25
|
+
children: Array<ScopeNode<unknown, TParcel> | ParcelNode<TParcel>>;
|
|
26
|
+
}
|
|
27
|
+
export type LoomTree<TParcel> = RootNode<TParcel>;
|
|
28
|
+
export interface LlmTask<TInput, TOutput> {
|
|
29
|
+
kind: "llm";
|
|
30
|
+
version?: string;
|
|
31
|
+
instruction: string;
|
|
32
|
+
format: string;
|
|
33
|
+
input?: (ctx: {
|
|
34
|
+
parcel: TInput;
|
|
35
|
+
}) => string;
|
|
36
|
+
parse: (ctx: {
|
|
37
|
+
text: string;
|
|
38
|
+
parcel: TInput;
|
|
39
|
+
raw?: unknown;
|
|
40
|
+
}) => TOutput;
|
|
41
|
+
validate?: (output: TOutput) => void;
|
|
42
|
+
}
|
|
43
|
+
export interface FnTask<TInput, TOutput> {
|
|
44
|
+
kind: "fn";
|
|
45
|
+
version?: string;
|
|
46
|
+
run: (ctx: {
|
|
47
|
+
parcel: TInput;
|
|
48
|
+
}) => Promise<TOutput> | TOutput;
|
|
49
|
+
validate?: (output: TOutput) => void;
|
|
50
|
+
}
|
|
51
|
+
export type ExtractTask<TInput, TOutput> = LlmTask<TInput, TOutput> | FnTask<TInput, TOutput>;
|
|
52
|
+
export interface ReduceTask<TInput, TOutput, TScope = unknown> {
|
|
53
|
+
version?: string;
|
|
54
|
+
run: (items: TInput[], ctx: {
|
|
55
|
+
scope: TScope | null;
|
|
56
|
+
scopeName: ScopeName;
|
|
57
|
+
}) => Promise<TOutput> | TOutput;
|
|
58
|
+
validate?: (output: TOutput) => void;
|
|
59
|
+
}
|
|
60
|
+
export interface SplitSpec<TInput, TScope, TParcel> {
|
|
61
|
+
scope: ScopeName;
|
|
62
|
+
partition: (input: TInput) => TScope[];
|
|
63
|
+
chunk: (scope: TScope) => TParcel[];
|
|
64
|
+
}
|
|
65
|
+
export type LoomStep = {
|
|
66
|
+
kind: "split";
|
|
67
|
+
spec: SplitSpec<unknown, unknown, unknown>;
|
|
68
|
+
} | {
|
|
69
|
+
kind: "extract";
|
|
70
|
+
task: ExtractTask<unknown, unknown>;
|
|
71
|
+
} | {
|
|
72
|
+
kind: "reduce";
|
|
73
|
+
scope: ScopeName;
|
|
74
|
+
task: ReduceTask<unknown, unknown, unknown>;
|
|
75
|
+
};
|
|
76
|
+
export interface CheckpointRecord<T = unknown> {
|
|
77
|
+
key: string;
|
|
78
|
+
signature: string;
|
|
79
|
+
value: T;
|
|
80
|
+
createdAt: string;
|
|
81
|
+
}
|
|
82
|
+
export interface Checkpointer {
|
|
83
|
+
read<T = unknown>(key: string): Promise<CheckpointRecord<T> | null> | CheckpointRecord<T> | null;
|
|
84
|
+
write<T = unknown>(record: CheckpointRecord<T>): Promise<void> | void;
|
|
85
|
+
}
|
|
86
|
+
export interface RunOptions {
|
|
87
|
+
model?: TextModel;
|
|
88
|
+
concurrency?: number;
|
|
89
|
+
checkpoint?: Checkpointer;
|
|
90
|
+
checkpointSalt?: unknown;
|
|
91
|
+
signal?: AbortSignal;
|
|
92
|
+
}
|
|
93
|
+
export interface LoomReport {
|
|
94
|
+
reused: number;
|
|
95
|
+
ran: number;
|
|
96
|
+
}
|
|
97
|
+
export interface LoomResult<T> {
|
|
98
|
+
value: T;
|
|
99
|
+
report: LoomReport;
|
|
100
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domain/loom/types.ts"],"names":[],"mappings":""}
|
package/dist/help-text.js
CHANGED
|
@@ -933,6 +933,7 @@ Example
|
|
|
933
933
|
Usage
|
|
934
934
|
- scriptctl synopsis <text> # set script.synopsis
|
|
935
935
|
- scriptctl synopsis <ep_NNN> <text> # set episode.synopsis
|
|
936
|
+
- scriptctl synopsis generate --apply # generate missing synopsis fields
|
|
936
937
|
|
|
937
938
|
Patch ops
|
|
938
939
|
- meta.synopsis.set
|
|
@@ -941,6 +942,32 @@ Patch ops
|
|
|
941
942
|
Examples
|
|
942
943
|
- scriptctl synopsis "陈墨归国复仇,与苏晴重逢,围绕林氏集团的阴谋逐步展开。"
|
|
943
944
|
- scriptctl synopsis ep_001 "陈墨第一时间来到总裁办公室,与苏晴重逢。"
|
|
945
|
+
`,
|
|
946
|
+
],
|
|
947
|
+
[
|
|
948
|
+
["synopsis", "generate"],
|
|
949
|
+
`Generate missing episode and whole-script synopsis fields from script.json.
|
|
950
|
+
|
|
951
|
+
Usage
|
|
952
|
+
- scriptctl synopsis generate --script-path output/script.json
|
|
953
|
+
- scriptctl synopsis generate --script-path output/script.json --apply
|
|
954
|
+
- scriptctl synopsis generate --script-path output/script.json --overwrite --apply
|
|
955
|
+
|
|
956
|
+
Behavior
|
|
957
|
+
- Default is dry-run: runs extraction and validation but does not write.
|
|
958
|
+
- Without --overwrite, existing episode synopsis fields are reused and only missing
|
|
959
|
+
fields are filled.
|
|
960
|
+
- Whole-script fields are generated when any of synopsis/theme/logline/style/main_characters
|
|
961
|
+
is missing; --overwrite regenerates them.
|
|
962
|
+
- Uses a text-output contract and parser, not tool_use.
|
|
963
|
+
|
|
964
|
+
Options
|
|
965
|
+
- --provider <name> openai | anthropic | mock. Default: openai
|
|
966
|
+
- --model <model> model name for the provider. Default: deepseek-v4-pro-packy
|
|
967
|
+
- --concurrency <n> parallel chunk extraction, default 30
|
|
968
|
+
- --checkpoint <dir> checkpoint directory, default workspace direct loom dir
|
|
969
|
+
- --overwrite regenerate existing synopsis fields
|
|
970
|
+
- --apply write script.json
|
|
944
971
|
`,
|
|
945
972
|
],
|
|
946
973
|
[
|
package/dist/help-text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { type ProviderLike } from "../domain/direct-core.js";
|
|
2
2
|
type Dict = Record<string, unknown>;
|
|
3
|
+
export interface ProviderCapabilities {
|
|
4
|
+
completeText: boolean;
|
|
5
|
+
extractBatch: boolean;
|
|
6
|
+
extractEpisode: boolean;
|
|
7
|
+
extractMetadata: boolean;
|
|
8
|
+
extractEpisodeTitles: boolean;
|
|
9
|
+
extractEpisodeSynopsis: boolean;
|
|
10
|
+
extractScriptSynopsis: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function providerCapabilities(name: string): ProviderCapabilities | null;
|
|
3
13
|
export declare class MockProvider implements ProviderLike {
|
|
4
14
|
readonly name = "mock";
|
|
15
|
+
completeText(request: {
|
|
16
|
+
system: string;
|
|
17
|
+
user: string;
|
|
18
|
+
}): {
|
|
19
|
+
text: string;
|
|
20
|
+
raw: Dict;
|
|
21
|
+
};
|
|
5
22
|
extractEpisode(sourceText: string, episodePlan: Dict): Dict;
|
|
6
23
|
extractBatch(sourceText: string, batchPlan: Dict): Dict;
|
|
7
24
|
extractMetadata(_sourceText: string, script: Dict): Dict;
|
|
@@ -15,6 +32,7 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
15
32
|
private readonly model;
|
|
16
33
|
constructor(model: string);
|
|
17
34
|
private messageRequest;
|
|
35
|
+
private textMessageRequest;
|
|
18
36
|
private collectResponseText;
|
|
19
37
|
/**
|
|
20
38
|
* Run a request that forces a specific tool call via `tool_choice`, then return that
|
|
@@ -33,6 +51,13 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
33
51
|
*/
|
|
34
52
|
private runToolUse;
|
|
35
53
|
extractEpisode(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
54
|
+
completeText(request: {
|
|
55
|
+
system: string;
|
|
56
|
+
user: string;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
text: string;
|
|
59
|
+
raw: Dict;
|
|
60
|
+
}>;
|
|
36
61
|
extractBatch(sourceText: string, batchPlan: Dict): Promise<Dict>;
|
|
37
62
|
extractEpisodeTitles(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
38
63
|
extractMetadata(_sourceText: string, script: Dict): Promise<Dict>;
|
|
@@ -41,5 +66,20 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
41
66
|
extractEpisodeSynopsis(synopses: string[], ctx: Dict): Promise<Dict>;
|
|
42
67
|
extractScriptSynopsis(synopses: string[], ctx: Dict): Promise<Dict>;
|
|
43
68
|
}
|
|
69
|
+
export declare class OpenAICompatibleProvider implements ProviderLike {
|
|
70
|
+
readonly name = "openai";
|
|
71
|
+
private readonly apiKey;
|
|
72
|
+
private readonly endpoint;
|
|
73
|
+
private readonly model;
|
|
74
|
+
constructor(model: string);
|
|
75
|
+
completeText(request: {
|
|
76
|
+
system: string;
|
|
77
|
+
user: string;
|
|
78
|
+
signal?: AbortSignal;
|
|
79
|
+
}): Promise<{
|
|
80
|
+
text: string;
|
|
81
|
+
raw: Dict;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
44
84
|
export declare function makeProvider(name: string, model: string): ProviderLike;
|
|
45
85
|
export {};
|