@lingjingai/scriptctl 0.36.4 → 0.37.0
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/changes/0.36.5.md +13 -0
- package/changes/0.37.0.md +17 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/domain/ingest/assembler.js +14 -6
- package/dist/domain/ingest/assembler.js.map +1 -1
- package/dist/domain/ingest/asset-state-md-parser.d.ts +2 -0
- package/dist/domain/ingest/asset-state-md-parser.js +133 -0
- package/dist/domain/ingest/asset-state-md-parser.js.map +1 -0
- package/dist/domain/ingest/serial-context.d.ts +93 -0
- package/dist/domain/ingest/serial-context.js +186 -0
- package/dist/domain/ingest/serial-context.js.map +1 -0
- package/dist/domain/ingest/state-reconcile.d.ts +1 -0
- package/dist/domain/ingest/state-reconcile.js +2 -0
- package/dist/domain/ingest/state-reconcile.js.map +1 -1
- package/dist/help-text.js +1 -1
- package/dist/llm/config.js +9 -3
- package/dist/llm/config.js.map +1 -1
- package/dist/llm/registry.d.ts +1 -0
- package/dist/llm/registry.js +4 -0
- package/dist/llm/registry.js.map +1 -1
- package/dist/llm/tasks/ingest/episode-assets.d.ts +8 -0
- package/dist/llm/tasks/ingest/episode-assets.js +46 -0
- package/dist/llm/tasks/ingest/episode-assets.js.map +1 -0
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/usecases/ingest/pipeline.js +40 -46
- package/dist/usecases/ingest/pipeline.js.map +1 -1
- package/dist/usecases/ingest/serial-govern.d.ts +23 -0
- package/dist/usecases/ingest/serial-govern.js +169 -0
- package/dist/usecases/ingest/serial-govern.js.map +1 -0
- package/dist/usecases/ingest/status.js +17 -1
- package/dist/usecases/ingest/status.js.map +1 -1
- package/dist/usecases/ingest/view-command.js +5 -0
- package/dist/usecases/ingest/view-command.js.map +1 -1
- package/dist/usecases/ingest/view-server.d.ts +16 -0
- package/dist/usecases/ingest/view-server.js +220 -0
- package/dist/usecases/ingest/view-server.js.map +1 -0
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/usecases/ingest/pipeline.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/usecases/ingest/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type NameScript, type NameScene } from "../../domain/ingest/assembler.js";
|
|
2
|
+
import type { LlmTaskExecutor } from "../../llm/types.js";
|
|
3
|
+
export interface SerialCheckpoint {
|
|
4
|
+
readUpdate(episode: number): string | undefined;
|
|
5
|
+
writeStep(episode: number, contextMd: string, updateMd: string): void;
|
|
6
|
+
}
|
|
7
|
+
export interface SerialGovernOptions {
|
|
8
|
+
executor: LlmTaskExecutor;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
checkpoint?: SerialCheckpoint;
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SerialGovernResult {
|
|
14
|
+
doc: Record<string, unknown>;
|
|
15
|
+
episodes: number;
|
|
16
|
+
reused: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function runSerialGovern(body: NameScript, opts: SerialGovernOptions): Promise<SerialGovernResult>;
|
|
19
|
+
export declare function renderEpisodeBody(ep: {
|
|
20
|
+
episode_id: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
scenes: NameScene[];
|
|
23
|
+
}): string;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Serial governance orchestrator (§ serial), incremental. Input is the name-based
|
|
2
|
+
// body (assembled NameScript) — NOT the roster. It walks episodes IN ORDER with a
|
|
3
|
+
// context that starts EMPTY: per episode the model reads that episode's body plus
|
|
4
|
+
// the context-so-far and reports discovered entities / importance / 造型 / and per
|
|
5
|
+
// scene who is present in which look. Nothing is seeded from the front's extracted
|
|
6
|
+
// assets/states.
|
|
7
|
+
//
|
|
8
|
+
// The final v3 is built FROM the accumulated registry: the serial scene refs are
|
|
9
|
+
// injected into the body, assignProvisionalIds mints ids + assets, the registry's
|
|
10
|
+
// importance/descriptions/looks are overlaid, and governDeterministic materializes.
|
|
11
|
+
// Per-episode md checkpoint + transient-retry as before.
|
|
12
|
+
import { CliError, EXIT_INPUT } from "../../common.js";
|
|
13
|
+
import { assignProvisionalIds } from "../../domain/ingest/assembler.js";
|
|
14
|
+
import { governDeterministic } from "../../domain/ingest/govern.js";
|
|
15
|
+
import { parseUpdateMarkdown } from "../../domain/ingest/asset-state-md-parser.js";
|
|
16
|
+
import { emptyContext, applyDelta, compact, render, resolveCanon, resolveLook, findEntity, baseLook } from "../../domain/ingest/serial-context.js";
|
|
17
|
+
import { runEpisodeAssets } from "../../llm/tasks/ingest/episode-assets.js";
|
|
18
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
19
|
+
const isArr = (v) => Array.isArray(v);
|
|
20
|
+
const norm = (s) => s.normalize("NFC").replace(/\s+/g, " ").trim();
|
|
21
|
+
const RETRYABLE = new Set(["timeout", "rate_limited", "request_failed", "endpoint"]);
|
|
22
|
+
const isTransient = (e) => !!e && typeof e === "object" && "code" in e && RETRYABLE.has(String(e.code));
|
|
23
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
24
|
+
async function episodeUpdate(executor, epNo, contextMd, bodyMd, signal) {
|
|
25
|
+
for (let attempt = 1;; attempt++) {
|
|
26
|
+
try {
|
|
27
|
+
return (await runEpisodeAssets(executor, contextMd, bodyMd, signal)).markdown;
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
if (isTransient(e) && attempt < 3 && !signal?.aborted) {
|
|
31
|
+
await sleep(3000 * attempt);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
throw new CliError("INGEST SERIAL FAILED", `serial govern failed at episode ${epNo}.`, {
|
|
35
|
+
exitCode: EXIT_INPUT, errorCode: "INGEST_SERIAL_FAILED",
|
|
36
|
+
received: [e instanceof Error ? e.message : String(e)],
|
|
37
|
+
nextSteps: [`Rerun \`scriptctl ingest\` to resume from episode ${epNo} (earlier episodes are cached).`],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function runSerialGovern(body, opts) {
|
|
43
|
+
const ctx = emptyContext();
|
|
44
|
+
const episodes = body.episodes ?? [];
|
|
45
|
+
let reused = 0;
|
|
46
|
+
for (let i = 0; i < episodes.length; i++) {
|
|
47
|
+
const ep = episodes[i];
|
|
48
|
+
const epNo = i + 1;
|
|
49
|
+
const contextMd = render(ctx);
|
|
50
|
+
const bodyMd = renderEpisodeBody(ep);
|
|
51
|
+
const cached = opts.force ? undefined : opts.checkpoint?.readUpdate(epNo);
|
|
52
|
+
let updateMd;
|
|
53
|
+
if (cached !== undefined) {
|
|
54
|
+
updateMd = cached;
|
|
55
|
+
reused++;
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
updateMd = await episodeUpdate(opts.executor, epNo, contextMd, bodyMd, opts.signal);
|
|
59
|
+
opts.checkpoint?.writeStep(epNo, contextMd, updateMd);
|
|
60
|
+
applyDelta(ctx, parseUpdateMarkdown(updateMd), epNo);
|
|
61
|
+
compact(ctx);
|
|
62
|
+
}
|
|
63
|
+
return { doc: finalize(body, ctx), episodes: episodes.length, reused };
|
|
64
|
+
}
|
|
65
|
+
const SPACE = { interior: "内", exterior: "外" };
|
|
66
|
+
const TIME = { day: "日", night: "夜" };
|
|
67
|
+
// Render one episode's body as readable 正文 — scene id + time/space + the action/
|
|
68
|
+
// dialogue lines (speaker by name). NO declared cast/props/location: the model
|
|
69
|
+
// infers presence and looks from the text itself.
|
|
70
|
+
export function renderEpisodeBody(ep) {
|
|
71
|
+
const out = [`# ${ep.episode_id}${ep.title ? ` ${ep.title}` : ""}`];
|
|
72
|
+
for (const sc of ep.scenes) {
|
|
73
|
+
out.push(`## ${sc.scene_id}`);
|
|
74
|
+
const env = [SPACE[sc.environment?.space ?? ""], TIME[sc.environment?.time ?? ""]].filter(Boolean).join(" ");
|
|
75
|
+
if (env)
|
|
76
|
+
out.push(`时空:${env}`);
|
|
77
|
+
for (const ac of sc.actions) {
|
|
78
|
+
const sp = ac.speaker ? ("name" in ac.speaker ? ac.speaker.name : `[${ac.speaker.kind}]`) : "";
|
|
79
|
+
const emo = ac.emotion ? `(${ac.emotion})` : "";
|
|
80
|
+
if (ac.type === "dialogue")
|
|
81
|
+
out.push(`${sp}${emo}:${ac.content}`);
|
|
82
|
+
else if (ac.type === "inner_thought")
|
|
83
|
+
out.push(`${sp}(心)${emo}:${ac.content}`);
|
|
84
|
+
else if (ac.type === "transition")
|
|
85
|
+
out.push(`【转场】${ac.content}`);
|
|
86
|
+
else
|
|
87
|
+
out.push(ac.content);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out.join("\n");
|
|
91
|
+
}
|
|
92
|
+
// Build the final v3 doc from the body + accumulated registry. Inject serial scene
|
|
93
|
+
// refs (canonical names + look as state), mint ids via assignProvisionalIds, overlay
|
|
94
|
+
// registry importance/description/aliases/look-descriptions, then materialize.
|
|
95
|
+
function finalize(body, ctx) {
|
|
96
|
+
const doc = JSON.parse(JSON.stringify(body));
|
|
97
|
+
for (const ep of doc.episodes) {
|
|
98
|
+
for (const sc of ep.scenes) {
|
|
99
|
+
const ref = ctx.scenes[sc.scene_id];
|
|
100
|
+
if (ref) {
|
|
101
|
+
sc.location = ref.location ? { name: resolveCanon(ctx, ref.location) } : null;
|
|
102
|
+
sc.actors = ref.actors.map((a) => nameStateRef(ctx, a));
|
|
103
|
+
sc.props = ref.props.map((p) => nameStateRef(ctx, p));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
sc.location = null;
|
|
107
|
+
sc.actors = [];
|
|
108
|
+
sc.props = [];
|
|
109
|
+
}
|
|
110
|
+
for (const ac of sc.actions)
|
|
111
|
+
if (ac.speaker && "name" in ac.speaker)
|
|
112
|
+
ac.speaker.name = resolveCanon(ctx, ac.speaker.name);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const script = assignProvisionalIds(doc).script;
|
|
116
|
+
overlay(script, ctx);
|
|
117
|
+
const governed = governDeterministic(script);
|
|
118
|
+
renameSyntheticDefault(governed);
|
|
119
|
+
return governed;
|
|
120
|
+
}
|
|
121
|
+
// Scene ref → {name, state}. An explicit look resolves to its canonical look name;
|
|
122
|
+
// no look falls back to the entity's baseline 常态 look (so an ordinary scene never
|
|
123
|
+
// inherits a dramatic outfit, and 常态 — being the most frequent — becomes default).
|
|
124
|
+
function nameStateRef(ctx, a) {
|
|
125
|
+
const canon = resolveCanon(ctx, a.name);
|
|
126
|
+
const e = findEntity(ctx, canon);
|
|
127
|
+
const look = a.look ? (e ? resolveLook(e, a.look) : a.look) : (e ? baseLook(e) : undefined);
|
|
128
|
+
return look ? { name: canon, state: look } : { name: canon };
|
|
129
|
+
}
|
|
130
|
+
// Assets with no discovered look keep a synthetic default whose name leaked as the
|
|
131
|
+
// literal "default"; relabel it to 常态 for a meaningful baseline.
|
|
132
|
+
function renameSyntheticDefault(script) {
|
|
133
|
+
for (const listKey of ["actors", "locations", "props"]) {
|
|
134
|
+
for (const asset of isArr(script[listKey]) ? script[listKey] : []) {
|
|
135
|
+
if (!isObj(asset))
|
|
136
|
+
continue;
|
|
137
|
+
for (const st of isArr(asset.states) ? asset.states : []) {
|
|
138
|
+
if (isObj(st) && st.state_id === "default" && st.state_name === "default")
|
|
139
|
+
st.state_name = "常态";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Stamp registry meta onto the minted assets: importance (background if the model
|
|
145
|
+
// never classified), description, aliases, and per-look state descriptions.
|
|
146
|
+
function overlay(script, ctx) {
|
|
147
|
+
for (const [listKey, nameKey] of [["actors", "actor_name"], ["locations", "location_name"], ["props", "prop_name"]]) {
|
|
148
|
+
for (const asset of isArr(script[listKey]) ? script[listKey] : []) {
|
|
149
|
+
if (!isObj(asset))
|
|
150
|
+
continue;
|
|
151
|
+
const e = findEntity(ctx, String(asset[nameKey]));
|
|
152
|
+
asset.importance = (e?.importance ?? "background");
|
|
153
|
+
if (e) {
|
|
154
|
+
if (e.description)
|
|
155
|
+
asset.description = e.description;
|
|
156
|
+
if (e.aliases.length)
|
|
157
|
+
asset.aliases = [...new Set([...(isArr(asset.aliases) ? asset.aliases : []), ...e.aliases])];
|
|
158
|
+
for (const st of isArr(asset.states) ? asset.states : []) {
|
|
159
|
+
if (!isObj(st) || st.state_id === "default")
|
|
160
|
+
continue;
|
|
161
|
+
const look = e.looks.find((l) => norm(l.name) === norm(String(st.state_name)));
|
|
162
|
+
if (look?.description)
|
|
163
|
+
st.description = look.description;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=serial-govern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial-govern.js","sourceRoot":"","sources":["../../../src/usecases/ingest/serial-govern.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,16 @@ function collectErrors(root, pass) {
|
|
|
57
57
|
return ref;
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
+
// Episode count for the serial pass bar; derived from the assembled body.
|
|
61
|
+
function readEpisodeCount(root) {
|
|
62
|
+
try {
|
|
63
|
+
const s = JSON.parse(fs.readFileSync(path.join(root, "body.json"), "utf-8"));
|
|
64
|
+
return Array.isArray(s.episodes) ? s.episodes.length : 0;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
60
70
|
function textPasses(root, manifest) {
|
|
61
71
|
const total = manifest.chunks ?? 0;
|
|
62
72
|
const normalize = {
|
|
@@ -64,9 +74,15 @@ function textPasses(root, manifest) {
|
|
|
64
74
|
done: countSuffix(root, "pass2", ".md"),
|
|
65
75
|
failed: countSuffix(root, "pass2", ".error.json"),
|
|
66
76
|
};
|
|
77
|
+
// Serial govern: one `serial/ep_NNN.md` per finished episode (context_NNN.md
|
|
78
|
+
// also lives there, so match the ep_ prefix, not just the .md suffix).
|
|
79
|
+
const epTotal = readEpisodeCount(root);
|
|
80
|
+
const serialDone = listSuffix(root, "serial", ".md").filter((n) => n.startsWith("ep_")).length;
|
|
81
|
+
const serial = { total: epTotal, done: serialDone, failed: 0 };
|
|
67
82
|
const passes = [
|
|
68
83
|
{ name: "normalize", done: total > 0 && normalize.done >= total && normalize.failed === 0, unit: normalize },
|
|
69
|
-
{ name: "assemble", done: has(root, "
|
|
84
|
+
{ name: "assemble", done: has(root, "body.json") },
|
|
85
|
+
{ name: "serial", done: epTotal > 0 && serialDone >= epTotal, unit: serial },
|
|
70
86
|
{ name: "govern", done: has(root, "script.json") },
|
|
71
87
|
];
|
|
72
88
|
return { passes, units: normalize };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/usecases/ingest/status.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,gFAAgF;AAChF,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAGvD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AA4CvF,0EAA0E;AAC1E,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC;AAChH,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,GAAW,EAAW,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAExF,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAa,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAIhF,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxD,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC;YAClG,IAAI,CAAC,CAAC,KAAK;gBAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,MAAM,GAAG,GAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACjD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAkB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAe;QAC5B,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;QACvC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KAClD,CAAC;IACF,MAAM,MAAM,GAAiB;QAC3B,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/usecases/ingest/status.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,gFAAgF;AAChF,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAGvD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AA4CvF,0EAA0E;AAC1E,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC;AAChH,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,GAAW,EAAW,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAExF,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAa,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAIhF,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxD,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC;YAClG,IAAI,CAAC,CAAC,KAAK;gBAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,MAAM,GAAG,GAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACjD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAA6B,CAAC;QACzG,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAkB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAe;QAC5B,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;QACvC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KAClD,CAAC;IACF,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/F,MAAM,MAAM,GAAe,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAiB;QAC3B,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;QAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,IAAI,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;QAC5E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE;KACnD,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,QAAkB;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAe;QAC7B,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;QACvC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KAClD,CAAC;IACF,MAAM,OAAO,GAAe;QAC1B,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC;QACrD,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KAClD,CAAC;IACF,MAAM,OAAO,GAAe;QAC1B,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC;QACjD,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KAClD,CAAC;IACF,MAAM,MAAM,GAAiB;QAC3B,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,IAAI,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;QAChH,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE;QACpF,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;QACpG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;QACpG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE;KACnD,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;YACzE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI;SACpF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAe,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAErG,MAAM,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,0EAA0E;IAC1E,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,iDAAiD;IACjD,IAAI,KAAkB,CAAC;IACvB,IAAI,MAAM,IAAI,UAAU,EAAE,EAAE;QAAE,KAAK,GAAG,OAAO,CAAC;SACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,KAAK,GAAG,QAAQ,CAAC;;QAC1E,KAAK,GAAG,YAAY,CAAC;IAE1B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAErF,OAAO;QACL,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;QAChE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAa;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,CAAe;IACjC,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC;IAC/D,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9G,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,SAAS,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,WAAW,CAAC,CAAC;IAC3I,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,uDAAuD,CAAC,CAAC;IAChH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -7,6 +7,7 @@ import * as path from "node:path";
|
|
|
7
7
|
import { CliError, EXIT_INPUT, EXIT_OK } from "../../common.js";
|
|
8
8
|
import { renderReviewHtml } from "../../infra/ingest/review-renderer.js";
|
|
9
9
|
import { WorkspaceStore } from "../../infra/ingest/workspace-store.js";
|
|
10
|
+
import { runViewServer } from "./view-server.js";
|
|
10
11
|
const strOf = (v) => (v === null || v === undefined ? "" : String(v));
|
|
11
12
|
const pad = (n) => String(n).padStart(3, "0");
|
|
12
13
|
// Symlink each episode's media into <ws>/src/ep_NNN.mp4 (best-effort; the review
|
|
@@ -33,6 +34,10 @@ function linkMedia(store) {
|
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
export async function commandView(opts) {
|
|
37
|
+
// --watch: live monitor server (progress + artifacts + context, auto-refresh),
|
|
38
|
+
// runs until Ctrl-C. Works while ingest is still running (no script.json yet).
|
|
39
|
+
if (opts["watch"])
|
|
40
|
+
return runViewServer(opts);
|
|
36
41
|
const workspacePath = strOf(opts["workspace_path"] || "workspace");
|
|
37
42
|
const store = new WorkspaceStore(path.resolve(workspacePath));
|
|
38
43
|
if (!store.has("script.json")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-command.js","sourceRoot":"","sources":["../../../src/usecases/ingest/view-command.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,kFAAkF;AAClF,gFAAgF;AAEhF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"view-command.js","sourceRoot":"","sources":["../../../src/usecases/ingest/view-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Report } from "../../common.js";
|
|
2
|
+
type Dict = Record<string, unknown>;
|
|
3
|
+
interface FileMeta {
|
|
4
|
+
rel: string;
|
|
5
|
+
size: number;
|
|
6
|
+
mtime: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function listArtifacts(root: string): Record<string, FileMeta[]>;
|
|
9
|
+
export declare function readSafe(root: string, rel: string): {
|
|
10
|
+
ok: true;
|
|
11
|
+
text: string;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
};
|
|
15
|
+
export declare function runViewServer(opts: Dict): Promise<[Report, number]>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// `scriptctl view --watch` — a live workspace monitor. Starts a tiny stdlib HTTP
|
|
2
|
+
// server (no deps) that a self-refreshing HTML dashboard polls: ingest progress
|
|
3
|
+
// (deriveIngestStatus), the artifact tree (pass files, per-episode serial context
|
|
4
|
+
// + update md, provisional + final script), and any single file's content. The
|
|
5
|
+
// dashboard auto-refreshes so a running `scriptctl ingest` is watched live and the
|
|
6
|
+
// per-episode context/decision md stream in as episodes finish. Runs until Ctrl-C.
|
|
7
|
+
import * as http from "node:http";
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { spawn } from "node:child_process";
|
|
11
|
+
import { EXIT_OK } from "../../common.js";
|
|
12
|
+
import { deriveIngestStatus } from "./status.js";
|
|
13
|
+
const strOf = (v) => (v === null || v === undefined ? "" : String(v));
|
|
14
|
+
// Curated artifact list for the sidebar, grouped and ordered for reviewing an
|
|
15
|
+
// ingest run. Only files that exist are returned.
|
|
16
|
+
export function listArtifacts(root) {
|
|
17
|
+
const meta = (rel) => {
|
|
18
|
+
try {
|
|
19
|
+
const s = fs.statSync(path.join(root, rel));
|
|
20
|
+
return { rel, size: s.size, mtime: s.mtimeMs };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const dirFiles = (dir, filter) => {
|
|
27
|
+
let names = [];
|
|
28
|
+
try {
|
|
29
|
+
names = fs.readdirSync(path.join(root, dir));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
return names.filter(filter).sort().map((n) => meta(`${dir}/${n}`)).filter((m) => !!m);
|
|
35
|
+
};
|
|
36
|
+
const only = (arr) => arr.filter((m) => !!m);
|
|
37
|
+
return {
|
|
38
|
+
结果: only([meta("script.json"), meta("validation.json"), meta("review.html")]),
|
|
39
|
+
上下文: dirFiles("serial", (n) => n.startsWith("context_") && n.endsWith(".md")),
|
|
40
|
+
每集更新: dirFiles("serial", (n) => n.startsWith("ep_") && n.endsWith(".md")),
|
|
41
|
+
中间产物: only([meta("script.initial.json"), meta("provisional_assets.json"), meta("notes.json"), meta("manifest.json")]),
|
|
42
|
+
前段: dirFiles("pass2", (n) => n.endsWith(".md")),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Read a workspace file, guarding against path traversal outside the root.
|
|
46
|
+
export function readSafe(root, rel) {
|
|
47
|
+
const abs = path.resolve(root, rel);
|
|
48
|
+
if (abs !== root && !abs.startsWith(root + path.sep))
|
|
49
|
+
return { ok: false };
|
|
50
|
+
try {
|
|
51
|
+
return { ok: true, text: fs.readFileSync(abs, "utf-8") };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { ok: false };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function send(res, code, type, body) {
|
|
58
|
+
res.writeHead(code, { "Content-Type": type, "Cache-Control": "no-store" });
|
|
59
|
+
res.end(body);
|
|
60
|
+
}
|
|
61
|
+
export async function runViewServer(opts) {
|
|
62
|
+
const root = path.resolve(strOf(opts["workspace_path"] || "workspace"));
|
|
63
|
+
const port = Number(opts["port"]) || 0; // 0 → OS-assigned ephemeral (no conflicts)
|
|
64
|
+
const server = http.createServer((req, res) => {
|
|
65
|
+
const u = new URL(req.url ?? "/", "http://localhost");
|
|
66
|
+
if (u.pathname === "/")
|
|
67
|
+
return send(res, 200, "text/html; charset=utf-8", DASHBOARD_HTML);
|
|
68
|
+
if (u.pathname === "/api/state") {
|
|
69
|
+
const status = deriveIngestStatus(root);
|
|
70
|
+
return send(res, 200, "application/json", JSON.stringify({ root, status, groups: listArtifacts(root) }));
|
|
71
|
+
}
|
|
72
|
+
if (u.pathname === "/api/file") {
|
|
73
|
+
const rel = u.searchParams.get("path") ?? "";
|
|
74
|
+
const r = readSafe(root, rel);
|
|
75
|
+
return r.ok ? send(res, 200, "text/plain; charset=utf-8", r.text) : send(res, 404, "text/plain", "not found");
|
|
76
|
+
}
|
|
77
|
+
send(res, 404, "text/plain", "not found");
|
|
78
|
+
});
|
|
79
|
+
const actualPort = await new Promise((resolve, reject) => {
|
|
80
|
+
server.once("error", reject);
|
|
81
|
+
server.listen(port, "127.0.0.1", () => resolve(server.address().port));
|
|
82
|
+
});
|
|
83
|
+
const url = `http://127.0.0.1:${actualPort}/`;
|
|
84
|
+
process.stdout.write(`ingest 监听面板: ${url}\n工作区: ${root}\nCtrl-C 退出。\n`);
|
|
85
|
+
if (process.platform === "darwin") {
|
|
86
|
+
try {
|
|
87
|
+
spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
88
|
+
}
|
|
89
|
+
catch { /* best-effort */ }
|
|
90
|
+
}
|
|
91
|
+
// Block until interrupted; resolve cleanly so the CLI exits 0 on Ctrl-C.
|
|
92
|
+
await new Promise((resolve) => { process.once("SIGINT", () => { server.close(); resolve(); }); process.once("SIGTERM", () => { server.close(); resolve(); }); });
|
|
93
|
+
return [{ result: [url] }, EXIT_OK];
|
|
94
|
+
}
|
|
95
|
+
const DASHBOARD_HTML = `<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
96
|
+
<title>scriptctl ingest 监听</title>
|
|
97
|
+
<style>
|
|
98
|
+
:root{--bg:#f6f7f9;--panel:#ffffff;--panel2:#f0f2f5;--line:#e3e6ea;--fg:#1f2430;--dim:#6b7280;--acc:#2563eb;--ok:#16a34a;--warn:#d97706;--err:#dc2626}
|
|
99
|
+
*{box-sizing:border-box}body{margin:0;font:13px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;background:var(--bg);color:var(--fg);height:100vh;display:grid;grid-template-rows:auto auto 1fr}
|
|
100
|
+
header{padding:12px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;align-items:center;flex-wrap:wrap}
|
|
101
|
+
header .title{font-weight:700;font-size:15px}
|
|
102
|
+
.now{font-size:14px}.now b{color:var(--acc)}
|
|
103
|
+
.state{padding:3px 12px;border-radius:20px;font-weight:600;font-size:12px}
|
|
104
|
+
.state.ready{background:#e7f6ee;color:var(--ok)}.state.incomplete{background:#e8f0fe;color:var(--acc)}.state.failed{background:#fde8e8;color:var(--err)}.state.empty{background:var(--panel2);color:var(--dim)}
|
|
105
|
+
.dim{color:var(--dim)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
106
|
+
/* overall bar + stage stepper */
|
|
107
|
+
.progress{background:var(--panel);border-bottom:1px solid var(--line);padding:12px 16px}
|
|
108
|
+
.ovwrap{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
|
109
|
+
.ovtrack{flex:1;height:10px;background:var(--panel2);border-radius:6px;overflow:hidden}
|
|
110
|
+
.ovtrack i{display:block;height:100%;background:linear-gradient(90deg,#3b82f6,#2563eb);border-radius:6px;transition:width .4s}
|
|
111
|
+
.ovpct{font-weight:700;min-width:44px;text-align:right}
|
|
112
|
+
.stages{display:flex;align-items:stretch;gap:0}
|
|
113
|
+
.stage{flex:1;padding:8px 12px;border:1px solid var(--line);background:var(--panel);border-radius:8px;margin-right:8px}
|
|
114
|
+
.stage:last-child{margin-right:0}
|
|
115
|
+
.stage-h{display:flex;align-items:center;gap:7px;font-weight:600}
|
|
116
|
+
.stage .dot{width:9px;height:9px;border-radius:50%;background:#cbd2dc;flex:none}
|
|
117
|
+
.stage .cnt{margin-left:auto;font-size:12px;color:var(--dim)}
|
|
118
|
+
.stage .track{height:6px;background:var(--panel2);border-radius:4px;margin-top:8px;overflow:hidden}
|
|
119
|
+
.stage .track i{display:block;height:100%;width:0;border-radius:4px;transition:width .4s}
|
|
120
|
+
.stage.wait{opacity:.7}
|
|
121
|
+
.stage.done{border-color:#bfe6cd}.stage.done .dot{background:var(--ok)}.stage.done .track i{background:var(--ok)}.stage.done .stage-h b{color:var(--ok)}
|
|
122
|
+
.stage.run{border-color:#bcd3fb;box-shadow:0 0 0 2px #e8f0fe}.stage.run .dot{background:var(--acc);animation:pulse 1.2s infinite}.stage.run .track i{background:var(--acc)}
|
|
123
|
+
.stage.fail{border-color:#f3bcbc}.stage.fail .dot{background:var(--err)}.stage.fail .track i{background:var(--err)}
|
|
124
|
+
@keyframes pulse{50%{opacity:.35}}
|
|
125
|
+
main{display:grid;grid-template-columns:280px 1fr;min-height:0}
|
|
126
|
+
aside{background:var(--panel);border-right:1px solid var(--line);overflow:auto;padding:8px}
|
|
127
|
+
.grp{margin:8px 4px 2px;color:var(--dim);font-size:11px;font-weight:700;letter-spacing:.04em}
|
|
128
|
+
.f{padding:4px 8px;border-radius:6px;cursor:pointer;display:flex;justify-content:space-between;gap:8px;white-space:nowrap;overflow:hidden}
|
|
129
|
+
.f:hover{background:var(--panel2)}.f.sel{background:#e8f0fe;color:var(--acc);font-weight:600}
|
|
130
|
+
.f .sz{color:var(--dim);font-size:11px}
|
|
131
|
+
section{overflow:auto;background:var(--panel)}
|
|
132
|
+
.toolbar{position:sticky;top:0;background:var(--panel2);border-bottom:1px solid var(--line);padding:6px 12px;display:flex;gap:14px;align-items:center;font-size:12px}
|
|
133
|
+
label{cursor:pointer;user-select:none}.empty{color:var(--dim);padding:34px;text-align:center}
|
|
134
|
+
#view{padding:14px 18px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
|
|
135
|
+
#view h1,#view h2{margin:14px 0 4px}#view h1{color:var(--acc);font-size:15px}#view h2{color:var(--warn);font-size:13px}
|
|
136
|
+
#view .b{color:var(--dim)}
|
|
137
|
+
</style></head><body>
|
|
138
|
+
<header>
|
|
139
|
+
<span class="title">scriptctl ingest</span>
|
|
140
|
+
<span id="stateBadge" class="state empty">—</span>
|
|
141
|
+
<span class="now">当前:<b id="curState">—</b></span>
|
|
142
|
+
<span class="dim mono" id="root" style="margin-left:auto"></span>
|
|
143
|
+
<span class="dim" id="tick"></span>
|
|
144
|
+
</header>
|
|
145
|
+
<div class="progress">
|
|
146
|
+
<div class="ovwrap"><span class="dim">总进度</span><div class="ovtrack"><i id="ovBar"></i></div><span class="ovpct" id="ovPct">0%</span></div>
|
|
147
|
+
<div class="stages" id="stages"></div>
|
|
148
|
+
</div>
|
|
149
|
+
<main>
|
|
150
|
+
<aside id="side"></aside>
|
|
151
|
+
<section>
|
|
152
|
+
<div class="toolbar">
|
|
153
|
+
<span id="cur" class="mono dim">未选择文件</span>
|
|
154
|
+
<label style="margin-left:auto"><input type="checkbox" id="follow" checked> 跟随最新集</label>
|
|
155
|
+
</div>
|
|
156
|
+
<div id="view"><div class="empty">左侧选择文件,或等待 ingest 产出…</div></div>
|
|
157
|
+
</section>
|
|
158
|
+
</main>
|
|
159
|
+
<script>
|
|
160
|
+
var NAMES={normalize:'规范化',assemble:'装配',serial:'串行解析',govern:'治理成稿',transcribe:'转写',roster:'角色合并',correct:'校正',speaker:'发声源'};
|
|
161
|
+
var cur=null, follow=true, lastLatest=null;
|
|
162
|
+
function $(s){return document.querySelector(s)}
|
|
163
|
+
$('#follow').onchange=function(e){follow=e.target.checked};
|
|
164
|
+
function esc(s){return s.replace(/[&<>]/g,function(c){return{'&':'&','<':'<','>':'>'}[c]})}
|
|
165
|
+
function renderContent(rel,text){
|
|
166
|
+
if(rel.endsWith('.json')){try{text=JSON.stringify(JSON.parse(text),null,2)}catch(e){}$('#view').textContent=text;return}
|
|
167
|
+
if(rel.endsWith('.md')){
|
|
168
|
+
$('#view').innerHTML=text.split('\\n').map(function(l){
|
|
169
|
+
if(l.indexOf('## ')===0)return '<h2>'+esc(l.slice(3))+'</h2>';
|
|
170
|
+
if(l.indexOf('# ')===0)return '<h1>'+esc(l.slice(2))+'</h1>';
|
|
171
|
+
if(l.indexOf(' ')===0||l.indexOf('- ')===0)return '<span class="b">'+esc(l)+'</span>';
|
|
172
|
+
return esc(l)||' ';
|
|
173
|
+
}).join('\\n');return}
|
|
174
|
+
$('#view').textContent=text;
|
|
175
|
+
}
|
|
176
|
+
function loadFile(rel){
|
|
177
|
+
cur=rel;$('#cur').textContent=rel;
|
|
178
|
+
var fs=document.querySelectorAll('.f');for(var i=0;i<fs.length;i++)fs[i].classList.toggle('sel',fs[i].dataset.rel===rel);
|
|
179
|
+
fetch('/api/file?path='+encodeURIComponent(rel)).then(function(r){return r.text()}).then(function(t){renderContent(rel,t)}).catch(function(){});
|
|
180
|
+
}
|
|
181
|
+
function frac(p){return p.unit&&p.unit.total?p.unit.done/p.unit.total:(p.done?1:0)}
|
|
182
|
+
function poll(){
|
|
183
|
+
fetch('/api/state').then(function(r){return r.json()}).then(function(d){
|
|
184
|
+
var s=d.status,passes=s.passes||[];
|
|
185
|
+
$('#root').textContent=d.root;
|
|
186
|
+
$('#stateBadge').className='state '+s.state;
|
|
187
|
+
$('#stateBadge').textContent={ready:'已完成',incomplete:'进行中',failed:'失败',empty:'空'}[s.state]||s.state;
|
|
188
|
+
// overall progress = mean of per-stage fractions
|
|
189
|
+
var sum=0;passes.forEach(function(p){sum+=frac(p)});
|
|
190
|
+
var pct=passes.length?Math.round(100*sum/passes.length):0;
|
|
191
|
+
$('#ovBar').style.width=pct+'%';$('#ovPct').textContent=pct+'%';
|
|
192
|
+
// current stage
|
|
193
|
+
var curP=null;for(var i=0;i<passes.length;i++){if(!passes[i].done){curP=passes[i];break}}
|
|
194
|
+
$('#curState').textContent=s.state==='ready'?'已完成 ✓':(curP?(NAMES[curP.name]||curP.name)+(curP.unit?' · '+curP.unit.done+'/'+curP.unit.total:''):'—');
|
|
195
|
+
// staged stepper with per-stage bars
|
|
196
|
+
$('#stages').innerHTML=passes.map(function(p){
|
|
197
|
+
var st=p.done?'done':(p.unit&&p.unit.failed?'fail':(p.unit&&p.unit.done>0||p===curP?'run':'wait'));
|
|
198
|
+
var cnt=p.unit?(p.unit.done+'/'+p.unit.total+(p.unit.failed?' ✗'+p.unit.failed:'')):(p.done?'✓':'—');
|
|
199
|
+
return '<div class="stage '+st+'"><div class="stage-h"><span class="dot"></span><b>'+(NAMES[p.name]||p.name)+'</b><span class="cnt">'+cnt+'</span></div><div class="track"><i style="width:'+Math.round(frac(p)*100)+'%"></i></div></div>';
|
|
200
|
+
}).join('');
|
|
201
|
+
// sidebar
|
|
202
|
+
var html='',latest=null;
|
|
203
|
+
Object.keys(d.groups).forEach(function(grp){
|
|
204
|
+
var files=d.groups[grp];if(!files.length)return;html+='<div class="grp">'+grp+'</div>';
|
|
205
|
+
files.forEach(function(f){
|
|
206
|
+
html+='<div class="f" data-rel="'+f.rel+'"><span>'+f.rel.split('/').pop()+'</span><span class="sz">'+(f.size>1024?(f.size/1024).toFixed(0)+'k':f.size)+'</span></div>';
|
|
207
|
+
if(grp==='每集更新'||grp==='上下文')latest=f.rel;
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
$('#side').innerHTML=html;
|
|
211
|
+
var els=document.querySelectorAll('.f');
|
|
212
|
+
for(var j=0;j<els.length;j++){(function(el){el.onclick=function(){follow=false;$('#follow').checked=false;loadFile(el.dataset.rel)};if(el.dataset.rel===cur)el.classList.add('sel')})(els[j])}
|
|
213
|
+
$('#tick').textContent='● '+new Date().toLocaleTimeString();
|
|
214
|
+
if(follow&&latest&&latest!==lastLatest){lastLatest=latest;loadFile(latest)}
|
|
215
|
+
else if(cur){loadFile(cur)}
|
|
216
|
+
}).catch(function(){$('#tick').textContent='● 离线'});
|
|
217
|
+
}
|
|
218
|
+
poll();setInterval(poll,1500);
|
|
219
|
+
</script></body></html>`;
|
|
220
|
+
//# sourceMappingURL=view-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-server.js","sourceRoot":"","sources":["../../../src/usecases/ingest/view-server.ts"],"names":[],"mappings":"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"}
|