@lingjingai/scriptctl 0.25.1 → 0.25.3

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.
Files changed (48) hide show
  1. package/dist/cli.js +28 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common.d.ts +1 -0
  4. package/dist/domain/direct-core.d.ts +11 -0
  5. package/dist/domain/direct-core.js.map +1 -1
  6. package/dist/domain/loom/checkpointer.d.ts +3 -0
  7. package/dist/domain/loom/checkpointer.js +30 -0
  8. package/dist/domain/loom/checkpointer.js.map +1 -0
  9. package/dist/domain/loom/index.d.ts +44 -0
  10. package/dist/domain/loom/index.js +275 -0
  11. package/dist/domain/loom/index.js.map +1 -0
  12. package/dist/domain/loom/types.d.ts +100 -0
  13. package/dist/domain/loom/types.js +2 -0
  14. package/dist/domain/loom/types.js.map +1 -0
  15. package/dist/domain/script/patch/apply.js +1 -1
  16. package/dist/domain/script/patch/apply.js.map +1 -1
  17. package/dist/domain/script/patch/ops-meta.d.ts +2 -0
  18. package/dist/domain/script/patch/ops-meta.js +36 -1
  19. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  20. package/dist/domain/script/patch/registry.js +3 -1
  21. package/dist/domain/script/patch/registry.js.map +1 -1
  22. package/dist/domain/script/schema.js +2 -0
  23. package/dist/domain/script/schema.js.map +1 -1
  24. package/dist/help-text.js +59 -9
  25. package/dist/help-text.js.map +1 -1
  26. package/dist/infra/providers.d.ts +40 -0
  27. package/dist/infra/providers.js +282 -2
  28. package/dist/infra/providers.js.map +1 -1
  29. package/dist/output.js +31 -0
  30. package/dist/output.js.map +1 -1
  31. package/dist/usecases/direct.js +20 -1
  32. package/dist/usecases/direct.js.map +1 -1
  33. package/dist/usecases/parse.js +22 -5
  34. package/dist/usecases/parse.js.map +1 -1
  35. package/dist/usecases/script/actions.js +3 -7
  36. package/dist/usecases/script/actions.js.map +1 -1
  37. package/dist/usecases/script/episodes.js +16 -1
  38. package/dist/usecases/script/episodes.js.map +1 -1
  39. package/dist/usecases/script/lib.d.ts +1 -0
  40. package/dist/usecases/script/lib.js +43 -10
  41. package/dist/usecases/script/lib.js.map +1 -1
  42. package/dist/usecases/script/synopsis-generate.d.ts +116 -0
  43. package/dist/usecases/script/synopsis-generate.js +801 -0
  44. package/dist/usecases/script/synopsis-generate.js.map +1 -0
  45. package/dist/usecases/script/synopsis.d.ts +3 -0
  46. package/dist/usecases/script/synopsis.js +41 -0
  47. package/dist/usecases/script/synopsis.js.map +1 -0
  48. package/package.json +3 -2
@@ -0,0 +1,3 @@
1
+ import type { Checkpointer } from "./types.js";
2
+ export declare function fileCheckpointer(dir: string): Checkpointer;
3
+ export declare function noopCheckpointer(): Checkpointer;
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAsB3B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAyB3B,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAChH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAI,GAAW,EAAE,GAAW,EAAE,KAAQ;IAC7D,OAAO;QACL,GAAG;QACH,SAAS,EAAE,GAAG;QACd,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB,EAAE,MAAc;IACrD,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA+B,EAAE,WAAoB;IAC7E,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;QACjD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAmC,EACnC,WAAoB,EACpB,OAAwB;IAExB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpD,OAAO;YACL,OAAO;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,cAAc;aAC7B;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,OAAO,CAAC,cAAc;SAC7B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,QAAkE;IAElE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,KAAgB,EAChB,QAAkE,EAClE,IAAY;IAEZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,MAAM,CAAU,IAAa;IAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAkB,IAOpC;IACC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,EAAE,CAAkB,IAInC;IACC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,OAAO;IAEC;IACA;IAFnB,YACmB,KAAa,EACb,QAAoB,EAAE;QADtB,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAiB;IACtC,CAAC;IAEJ,KAAK,CAAkB,IAAwC;QAC7D,OAAO,IAAI,OAAO,CAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAA4C,EAAE,CAAC,CAAC,CAAC;IAC1I,CAAC;IAED,OAAO,CAAU,IAAoC;QACnD,OAAO,IAAI,OAAO,CAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAqC,EAAE,CAAC,CAAC,CAAC;IACrI,CAAC;IAED,MAAM,CACJ,KAAgB,EAChB,IAAsJ;QAEtJ,MAAM,UAAU,GAA0C,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5G,OAAO,IAAI,OAAO,CAAkB,IAAI,CAAC,KAAK,EAAE;YAC9C,GAAG,IAAI,CAAC,KAAK;YACb,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,UAAmD,EAAE;SACrF,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAmB,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAW,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAAS,KAAa;IACxC,OAAO,IAAI,OAAO,CAAiB,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAU,EACV,WAAmB,EACnB,MAA8C;IAE9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;QACzD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;YAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAE,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAS,KAAa,EAAE,IAA0C;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,IAAkC,EAAE,OAAiB,EAAE;IAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtE,MAAM,GAAG,GAA+C,EAAE,CAAC;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO;YACtC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAI,QAA2C,EAAE,MAAS;IAC/E,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAA8B,EAC9B,WAAoB;IAEpB,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAyC,EACzC,OAAwB;IAExB,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,IAA+B,EAC/B,WAAoB,EACpB,QAAuB;IAEvB,OAAO,cAAc,CACnB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAC5E,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAAkC,EAClC,MAAiB,EACjB,MAAyB;IAEzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAClB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAa,CAAC,CAAC;IACjG,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAqD;IAC/E,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAkC,EAClC,KAAgB,EAChB,IAA2C,EAC3C,OAAwB,EACxB,IAAc;IAEd,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QAChC,eAAe,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAa,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7G,MAAM,YAAY,GAAG,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACjE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC;IAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC;IACpD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,KAA6B,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,UAAU,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;IAC1H,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACxB,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAYD,KAAK,UAAU,cAAc,CAC3B,UAAwB,EACxB,GAAW,EACX,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAI,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,GAAG;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAClF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAWD,KAAK,UAAU,WAAW,CAAI,KAAc,EAAE,KAAiB,EAAE,IAAgB;IAC/E,MAAM,OAAO,GAAoB;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,gBAAgB,EAAE;QACjD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;QAClC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;KAC9B,CAAC;IACF,IAAI,IAAI,GAA6B,IAAI,CAAC;IAC1C,IAAI,YAAY,GAAY,KAAK,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAClF,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7E,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;gBAEpD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAgB,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;oBACjF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;wBACf,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;wBAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChE,CAAC;oBACD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACjE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;oBACxB,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;oBACrE,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAClE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;oBAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7D,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;gBACxB,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAsB,CAAC;YACvE,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAsB,CAAC;QAC5F,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,YAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,iDAAiD,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,MAAW,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACnE,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domain/loom/types.ts"],"names":[],"mappings":""}
@@ -19,7 +19,7 @@ export function applyPatchOperations(script, sourceText, operations, opts = {})
19
19
  if (!handler) {
20
20
  throw opErr("PATCH BLOCKED: Unsupported operation", "Unsupported patch operation.", {
21
21
  required: [
22
- "dot-style op: meta.worldview.set / asset.{rename,describe,alias.set,alias.add,alias.remove,states.set,role.set,merge,delete} / state.{add,rename,describe,delete} / context.{set,clear,ref.remove} / action.{type.set,actor.set,delete,insert,move,state.change,state.remove,transition.set,transition.clear,content.replace,content.regex-replace} / scene.{split,merge,delete,move} / dialogue.{speakers,overlap} / speaker.add / extend.{set,clear}",
22
+ "dot-style op: meta.{worldview,synopsis}.set / episode.{add,synopsis.set} / asset.{rename,describe,alias.set,alias.add,alias.remove,states.set,role.set,merge,delete} / state.{add,rename,describe,delete} / context.{set,clear,ref.remove} / action.{type.set,actor.set,delete,insert,move,state.change,state.remove,transition.set,transition.clear,content.replace,content.regex-replace} / scene.{split,merge,delete,move} / dialogue.{speakers,overlap} / speaker.add / extend.{set,clear}",
23
23
  ],
24
24
  received: [kind],
25
25
  nextSteps: [
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/apply.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,mFAAmF;AACnF,8EAA8E;AAC9E,6EAA6E;AAC7E,oEAAoE;AACpE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAa,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,yBAAyB;AACzB,MAAM,UAAU,oBAAoB,CAAC,MAAY,EAAE,UAAkB,EAAE,UAAkB,EAAE,OAA+B,EAAE;IAC1H,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,CAAC,sCAAsC,EAAE,8BAA8B,EAAE;gBAClF,QAAQ,EAAE;oBACR,wbAAwb;iBACzb;gBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;gBAChB,SAAS,EAAE;oBACT,4CAA4C;oBAC5C,gRAAgR;iBACjR;gBACD,SAAS,EAAE,gBAAgB;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;QAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/apply.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,mFAAmF;AACnF,8EAA8E;AAC9E,6EAA6E;AAC7E,oEAAoE;AACpE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAa,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,yBAAyB;AACzB,MAAM,UAAU,oBAAoB,CAAC,MAAY,EAAE,UAAkB,EAAE,UAAkB,EAAE,OAA+B,EAAE;IAC1H,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,CAAC,sCAAsC,EAAE,8BAA8B,EAAE;gBAClF,QAAQ,EAAE;oBACR,geAAge;iBACje;gBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;gBAChB,SAAS,EAAE;oBACT,4CAA4C;oBAC5C,gRAAgR;iBACjR;gBACD,SAAS,EAAE,gBAAgB;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;QAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,3 +1,5 @@
1
1
  import type { OpCtx } from "./types.js";
2
2
  export declare function op_episode_add(__ctx: OpCtx): void;
3
+ export declare function op_episode_synopsis_set(__ctx: OpCtx): void;
3
4
  export declare function op_meta_worldview_set(__ctx: OpCtx): void;
5
+ export declare function op_meta_synopsis_set(__ctx: OpCtx): void;
@@ -1,6 +1,20 @@
1
1
  import { WORLDVIEW_VALUES, } from "../../../common.js";
2
2
  import { isList, opErr, strOf } from "../shared.js";
3
- import { nextEpisodeId, } from "../lookups.js";
3
+ import { findEpisode, nextEpisodeId, } from "../lookups.js";
4
+ function requiredSynopsis(op, kind) {
5
+ const raw = "synopsis" in op ? op["synopsis"] : op["value"];
6
+ const synopsis = strOf(raw).trim();
7
+ if (!synopsis) {
8
+ throw opErr("SCRIPT OP BLOCKED: Synopsis missing", "Synopsis missing.", {
9
+ required: ["synopsis: non-empty text"],
10
+ received: ["<empty>"],
11
+ nextSteps: ["Pass a non-empty synopsis field."],
12
+ op: kind,
13
+ errorCode: "SYNOPSIS_MISSING",
14
+ });
15
+ }
16
+ return synopsis;
17
+ }
4
18
  export function op_episode_add(__ctx) {
5
19
  const { script, op, sourceText, applied, kind } = __ctx;
6
20
  // Append an empty episode. Scenes/actions are added afterwards with
@@ -26,6 +40,22 @@ export function op_episode_add(__ctx) {
26
40
  eps.push({ episode_id: epId, title: strOf(op["title"]).trim(), scenes: [] });
27
41
  applied.push(kind);
28
42
  }
43
+ export function op_episode_synopsis_set(__ctx) {
44
+ const { script, op, sourceText, applied, kind } = __ctx;
45
+ const episodeId = strOf(op["episode_id"] ?? op["target"] ?? op["at"]).trim();
46
+ if (!episodeId) {
47
+ throw opErr("SCRIPT OP BLOCKED: Episode id missing", "Episode id missing.", {
48
+ required: ["episode_id: ep_NNN"],
49
+ received: ["<empty>"],
50
+ nextSteps: ["Pass the episode id whose synopsis should be updated."],
51
+ op: kind,
52
+ errorCode: "EPISODE_ID_MISSING",
53
+ });
54
+ }
55
+ const episode = findEpisode(script, episodeId);
56
+ episode["synopsis"] = requiredSynopsis(op, kind);
57
+ applied.push(kind);
58
+ }
29
59
  export function op_meta_worldview_set(__ctx) {
30
60
  const { script, op, sourceText, applied, kind } = __ctx;
31
61
  // 0.6.0 dot-style equivalent of the legacy `set_worldview` op.
@@ -44,4 +74,9 @@ export function op_meta_worldview_set(__ctx) {
44
74
  script["worldview_raw"] = strOf(op["worldview_raw"]).trim();
45
75
  applied.push(kind);
46
76
  }
77
+ export function op_meta_synopsis_set(__ctx) {
78
+ const { script, op, sourceText, applied, kind } = __ctx;
79
+ script["synopsis"] = requiredSynopsis(op, kind);
80
+ applied.push(kind);
81
+ }
47
82
  //# sourceMappingURL=ops-meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ops-meta.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/ops-meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ops-meta.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/ops-meta.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { op_action_state_change, op_action_state_remove, op_action_transition_set, op_action_transition_clear, op_action_content_replace, op_action_content_regex_replace, op_action_type_set, op_action_actor_set, op_action_delete, op_action_insert, op_action_move } from "./ops-action.js";
2
2
  import { op_actor_add, op_location_add, op_prop_add, op_asset_role_set, op_asset_rename, op_asset_describe, op_asset_alias_set, op_asset_alias_add, op_asset_alias_remove, op_asset_states_set, op_asset_merge, op_asset_delete } from "./ops-asset.js";
3
3
  import { op_speaker_add, op_dialogue_speakers, op_dialogue_overlap, op_speaker_delete } from "./ops-dialogue.js";
4
- import { op_episode_add, op_meta_worldview_set } from "./ops-meta.js";
4
+ import { op_episode_add, op_episode_synopsis_set, op_meta_worldview_set, op_meta_synopsis_set } from "./ops-meta.js";
5
5
  import { op_scene_insert, op_scene_split, op_scene_merge, op_scene_delete, op_scene_move } from "./ops-scene.js";
6
6
  import { op_state_add, op_state_rename, op_state_describe, op_state_delete, op_context_set, op_context_clear, op_context_ref_remove } from "./ops-state.js";
7
7
  import { op_extend_set, op_extend_clear } from "./ops-extend.js";
@@ -25,7 +25,9 @@ export const OP_REGISTRY = {
25
25
  "location.add": op_location_add,
26
26
  "prop.add": op_prop_add,
27
27
  "episode.add": op_episode_add,
28
+ "episode.synopsis.set": op_episode_synopsis_set,
28
29
  "meta.worldview.set": op_meta_worldview_set,
30
+ "meta.synopsis.set": op_meta_synopsis_set,
29
31
  "asset.role.set": op_asset_role_set,
30
32
  "asset.rename": op_asset_rename,
31
33
  "asset.describe": op_asset_describe,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAC,sBAAsB,EAAC,wBAAwB,EAAC,0BAA0B,EAAC,yBAAyB,EAAC,+BAA+B,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtR,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,WAAW,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,mBAAmB,EAAC,cAAc,EAAC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7O,OAAO,EAAE,cAAc,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAC,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,eAAe,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtJ,OAAO,EAAE,aAAa,EAAC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,eAAe,EAAE,gBAAgB;IACjC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,sBAAsB;IAC7C,uBAAuB,EAAE,wBAAwB;IACjD,yBAAyB,EAAE,0BAA0B;IACrD,wBAAwB,EAAE,yBAAyB;IACnD,8BAA8B,EAAE,+BAA+B;IAC/D,aAAa,EAAE,cAAc;IAC7B,mBAAmB,EAAE,oBAAoB;IACzC,kBAAkB,EAAE,mBAAmB;IACvC,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,cAAc;IAC7B,oBAAoB,EAAE,qBAAqB;IAC3C,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,iBAAiB,EAAE,kBAAkB;IACrC,oBAAoB,EAAE,qBAAqB;IAC3C,kBAAkB,EAAE,mBAAmB;IACvC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,mBAAmB;IACvC,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,gBAAgB;IACjC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,iBAAiB;IACnC,oBAAoB,EAAE,qBAAqB;IAC3C,YAAY,EAAE,aAAa;IAC3B,cAAc,EAAE,eAAe;CAChC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAC,sBAAsB,EAAC,wBAAwB,EAAC,0BAA0B,EAAC,yBAAyB,EAAC,+BAA+B,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtR,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,WAAW,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,mBAAmB,EAAC,cAAc,EAAC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7O,OAAO,EAAE,cAAc,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAC,uBAAuB,EAAC,qBAAqB,EAAC,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,eAAe,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtJ,OAAO,EAAE,aAAa,EAAC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,eAAe,EAAE,gBAAgB;IACjC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,sBAAsB;IAC7C,uBAAuB,EAAE,wBAAwB;IACjD,yBAAyB,EAAE,0BAA0B;IACrD,wBAAwB,EAAE,yBAAyB;IACnD,8BAA8B,EAAE,+BAA+B;IAC/D,aAAa,EAAE,cAAc;IAC7B,mBAAmB,EAAE,oBAAoB;IACzC,kBAAkB,EAAE,mBAAmB;IACvC,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,cAAc;IAC7B,sBAAsB,EAAE,uBAAuB;IAC/C,oBAAoB,EAAE,qBAAqB;IAC3C,mBAAmB,EAAE,oBAAoB;IACzC,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,iBAAiB,EAAE,kBAAkB;IACrC,oBAAoB,EAAE,qBAAqB;IAC3C,kBAAkB,EAAE,mBAAmB;IACvC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,mBAAmB;IACvC,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,gBAAgB;IACjC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,iBAAiB;IACnC,oBAAoB,EAAE,qBAAqB;IAC3C,YAAY,EAAE,aAAa;IAC3B,cAAc,EAAE,eAAe;CAChC,CAAC"}
@@ -3,6 +3,7 @@
3
3
  export const PATCH_OP_SCHEMA = {
4
4
  // meta
5
5
  "meta.worldview.set": { required: ["worldview"], optional: ["worldview_raw"], description: "Set the script.worldview enum." },
6
+ "meta.synopsis.set": { required: ["synopsis"], optional: [], description: "Set the whole-script synopsis." },
6
7
  // state
7
8
  "state.add": { required: ["target", "name"], optional: ["description", "state_id"], description: "Add a state to an asset's states[]." },
8
9
  "state.rename": { required: ["target", "name"], optional: [], description: "Rename an asset state." },
@@ -13,6 +14,7 @@ export const PATCH_OP_SCHEMA = {
13
14
  "location.add": { required: ["name"], optional: ["location_id", "description"], description: "Register a new location." },
14
15
  "prop.add": { required: ["name"], optional: ["prop_id", "description"], description: "Register a new prop." },
15
16
  "episode.add": { required: [], optional: ["episode_id", "title"], description: "Append a new empty episode (no scenes)." },
17
+ "episode.synopsis.set": { required: ["episode_id", "synopsis"], optional: [], description: "Set one episode's synopsis." },
16
18
  "asset.rename": { required: ["target", "name"], optional: [], description: "Rename an asset (actor / location / prop)." },
17
19
  "asset.describe": { required: ["target", "description"], optional: [], description: "Set asset description." },
18
20
  "asset.alias.set": { required: ["target", "aliases"], optional: [], description: "Bulk replace aliases[]." },