@lingjingai/scriptctl 0.42.0 → 0.43.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.
Files changed (64) hide show
  1. package/changes/0.43.0.md +21 -0
  2. package/dist/cli.js +0 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/domain/ingest/video-apply.d.ts +0 -33
  5. package/dist/domain/ingest/video-apply.js +8 -159
  6. package/dist/domain/ingest/video-apply.js.map +1 -1
  7. package/dist/domain/ingest/video-context.d.ts +51 -0
  8. package/dist/domain/ingest/video-context.js +293 -0
  9. package/dist/domain/ingest/video-context.js.map +1 -0
  10. package/dist/domain/ingest/video-serial-md.d.ts +60 -0
  11. package/dist/domain/ingest/video-serial-md.js +277 -0
  12. package/dist/domain/ingest/video-serial-md.js.map +1 -0
  13. package/dist/help-text.js +13 -10
  14. package/dist/help-text.js.map +1 -1
  15. package/dist/infra/ingest/video-transcode.d.ts +7 -0
  16. package/dist/infra/ingest/video-transcode.js +86 -0
  17. package/dist/infra/ingest/video-transcode.js.map +1 -0
  18. package/dist/infra/llm/gemini-video-model.js +14 -2
  19. package/dist/infra/llm/gemini-video-model.js.map +1 -1
  20. package/dist/llm/config.js +1 -2
  21. package/dist/llm/config.js.map +1 -1
  22. package/dist/llm/registry.d.ts +1 -7
  23. package/dist/llm/registry.js +5 -13
  24. package/dist/llm/registry.js.map +1 -1
  25. package/dist/llm/tasks/ingest/video-serial.d.ts +9 -0
  26. package/dist/llm/tasks/ingest/video-serial.js +120 -0
  27. package/dist/llm/tasks/ingest/video-serial.js.map +1 -0
  28. package/dist/llm/types.d.ts +1 -1
  29. package/dist/llm/types.js.map +1 -1
  30. package/dist/usecases/ingest/command.js +0 -3
  31. package/dist/usecases/ingest/command.js.map +1 -1
  32. package/dist/usecases/ingest/status.js +8 -20
  33. package/dist/usecases/ingest/status.js.map +1 -1
  34. package/dist/usecases/ingest/video-pipeline.d.ts +0 -6
  35. package/dist/usecases/ingest/video-pipeline.js +145 -127
  36. package/dist/usecases/ingest/video-pipeline.js.map +1 -1
  37. package/dist/usecases/ingest/view-server.d.ts +11 -0
  38. package/dist/usecases/ingest/view-server.js +89 -12
  39. package/dist/usecases/ingest/view-server.js.map +1 -1
  40. package/package.json +1 -1
  41. package/dist/domain/ingest/video-aggregate.d.ts +0 -23
  42. package/dist/domain/ingest/video-aggregate.js +0 -89
  43. package/dist/domain/ingest/video-aggregate.js.map +0 -1
  44. package/dist/domain/ingest/video-md-parser.d.ts +0 -2
  45. package/dist/domain/ingest/video-md-parser.js +0 -233
  46. package/dist/domain/ingest/video-md-parser.js.map +0 -1
  47. package/dist/llm/tasks/ingest/plot-speaker.d.ts +0 -11
  48. package/dist/llm/tasks/ingest/plot-speaker.js +0 -72
  49. package/dist/llm/tasks/ingest/plot-speaker.js.map +0 -1
  50. package/dist/llm/tasks/ingest/roster-merge.d.ts +0 -46
  51. package/dist/llm/tasks/ingest/roster-merge.js +0 -235
  52. package/dist/llm/tasks/ingest/roster-merge.js.map +0 -1
  53. package/dist/llm/tasks/ingest/state-merge.d.ts +0 -10
  54. package/dist/llm/tasks/ingest/state-merge.js +0 -84
  55. package/dist/llm/tasks/ingest/state-merge.js.map +0 -1
  56. package/dist/llm/tasks/ingest/video-correct.d.ts +0 -30
  57. package/dist/llm/tasks/ingest/video-correct.js +0 -144
  58. package/dist/llm/tasks/ingest/video-correct.js.map +0 -1
  59. package/dist/llm/tasks/ingest/video-transcribe.d.ts +0 -4
  60. package/dist/llm/tasks/ingest/video-transcribe.js +0 -105
  61. package/dist/llm/tasks/ingest/video-transcribe.js.map +0 -1
  62. package/dist/usecases/ingest/video-pass3.d.ts +0 -26
  63. package/dist/usecases/ingest/video-pass3.js +0 -0
  64. package/dist/usecases/ingest/video-pass3.js.map +0 -1
@@ -1,9 +1,12 @@
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.
1
+ // `scriptctl view --watch` — a live workspace monitor for TEXT or VIDEO ingest.
2
+ // Starts a tiny stdlib HTTP server (no deps) that a self-refreshing HTML dashboard
3
+ // polls: ingest progress (deriveIngestStatus), the artifact tree (text serial
4
+ // context/window md + provisional/final script, OR video per-episode transcript +
5
+ // context-fed-to-model + parsed json + registry + timing.jsonl), and any single
6
+ // file's content. The dashboard auto-refreshes so a running `scriptctl ingest` is
7
+ // watched live and each unit's products stream in as they finish. Runs until Ctrl-C.
8
+ // Text and video workspaces use disjoint layouts, so the artifact groups union
9
+ // cleanly — a workspace only populates the groups its pipeline produces.
7
10
  import * as http from "node:http";
8
11
  import * as fs from "node:fs";
9
12
  import * as path from "node:path";
@@ -34,15 +37,68 @@ export function listArtifacts(root) {
34
37
  return names.filter(filter).sort().map((n) => meta(`${dir}/${n}`)).filter((m) => !!m);
35
38
  };
36
39
  const only = (arr) => arr.filter((m) => !!m);
40
+ const epFile = (suffix) => dirFiles("ep", (n) => n.endsWith(suffix) && !n.endsWith(".error.json"));
37
41
  return {
38
42
  结果: only([meta("script.json"), meta("validation.json"), meta("review.html"), meta("timings.json")]),
43
+ // Text serial artifacts (empty for a video workspace).
39
44
  上下文: dirFiles("serial", (n) => n.startsWith("context_") && n.endsWith(".md")),
40
45
  每窗更新: dirFiles("serial", (n) => n.startsWith("win_") && n.endsWith(".md")),
41
46
  篇章梗概: dirFiles("serial", (n) => n.startsWith("arc_") && n.endsWith(".md")),
42
- 中间产物: only([meta("script.initial.json"), meta("provisional_assets.json"), meta("notes.json"), meta("manifest.json")]),
43
47
  前段: dirFiles("pass2", (n) => n.endsWith(".md")),
48
+ // Video serial artifacts (empty for a text workspace). Grouped by kind so an
49
+ // episode's whole story is one scan down the list.
50
+ 转录: epFile(".md").filter((m) => !m.rel.endsWith(".context.md")),
51
+ 送模上下文: epFile(".context.md"),
52
+ 解析: epFile(".json"),
53
+ 花名册: only([meta("context.json")]),
54
+ 计时: only([meta("timing.jsonl")]),
55
+ 中间产物: only([meta("script.initial.json"), meta("provisional_assets.json"), meta("notes.json"), meta("id_map.json"), meta("manifest.json")]),
44
56
  };
45
57
  }
58
+ // Parse timing.jsonl (one episode per line) into a compact summary the dashboard
59
+ // shows without shipping the whole file. Tolerant: skips malformed lines. Only the
60
+ // video pipeline writes timing.jsonl; a text workspace yields an empty summary.
61
+ export function readTiming(root) {
62
+ let text = "";
63
+ try {
64
+ text = fs.readFileSync(path.join(root, "timing.jsonl"), "utf-8");
65
+ }
66
+ catch {
67
+ return { episodes: [], totalMs: 0 };
68
+ }
69
+ const episodes = [];
70
+ let totalMs = 0;
71
+ for (const line of text.split(/\r?\n/)) {
72
+ const t = line.trim();
73
+ if (!t)
74
+ continue;
75
+ try {
76
+ const j = JSON.parse(t);
77
+ if (typeof j.episode !== "number")
78
+ continue;
79
+ const row = { episode: j.episode };
80
+ if (typeof j.transcodeMs === "number") {
81
+ row.transcodeMs = j.transcodeMs;
82
+ totalMs += j.transcodeMs;
83
+ }
84
+ if (typeof j.uploadMs === "number") {
85
+ row.uploadMs = j.uploadMs;
86
+ totalMs += j.uploadMs;
87
+ }
88
+ if (typeof j.generateMs === "number") {
89
+ row.generateMs = j.generateMs;
90
+ totalMs += j.generateMs;
91
+ }
92
+ if (typeof j.uploadMB === "string")
93
+ row.uploadMB = j.uploadMB;
94
+ if (typeof j.transcoded === "boolean")
95
+ row.transcoded = j.transcoded;
96
+ episodes.push(row);
97
+ }
98
+ catch { /* skip malformed line */ }
99
+ }
100
+ return { episodes, totalMs };
101
+ }
46
102
  // Read a workspace file, guarding against path traversal outside the root.
47
103
  export function readSafe(root, rel) {
48
104
  const abs = path.resolve(root, rel);
@@ -68,7 +124,7 @@ export async function runViewServer(opts) {
68
124
  return send(res, 200, "text/html; charset=utf-8", DASHBOARD_HTML);
69
125
  if (u.pathname === "/api/state") {
70
126
  const status = deriveIngestStatus(root);
71
- return send(res, 200, "application/json", JSON.stringify({ root, status, groups: listArtifacts(root) }));
127
+ return send(res, 200, "application/json", JSON.stringify({ root, status, groups: listArtifacts(root), timing: readTiming(root) }));
72
128
  }
73
129
  if (u.pathname === "/api/file") {
74
130
  const rel = u.searchParams.get("path") ?? "";
@@ -135,6 +191,12 @@ label{cursor:pointer;user-select:none}.empty{color:var(--dim);padding:34px;text-
135
191
  #view{padding:14px 18px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
136
192
  #view h1,#view h2{margin:14px 0 4px}#view h1{color:var(--acc);font-size:15px}#view h2{color:var(--warn);font-size:13px}
137
193
  #view .b{color:var(--dim)}
194
+ /* per-episode timing table (video only) */
195
+ .timing{padding:8px 16px 4px;background:var(--panel);border-bottom:1px solid var(--line);overflow:auto;max-height:132px}
196
+ table.tm{border-collapse:collapse;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
197
+ table.tm th,table.tm td{padding:2px 10px 2px 0;text-align:right}table.tm th:first-child,table.tm td:first-child{text-align:left}
198
+ table.tm th{color:var(--dim);font-weight:600;border-bottom:1px solid var(--line)}
199
+ table.tm td.slow{color:var(--warn)}
138
200
  </style></head><body>
139
201
  <header>
140
202
  <span class="title">scriptctl ingest</span>
@@ -149,6 +211,7 @@ label{cursor:pointer;user-select:none}.empty{color:var(--dim);padding:34px;text-
149
211
  <div class="ovwrap"><span class="dim">总进度</span><div class="ovtrack"><i id="ovBar"></i></div><span class="ovpct" id="ovPct">0%</span></div>
150
212
  <div class="stages" id="stages"></div>
151
213
  </div>
214
+ <div class="timing" id="timingWrap" style="display:none"><table class="tm" id="tmTable"></table></div>
152
215
  <main>
153
216
  <aside id="side"></aside>
154
217
  <section>
@@ -160,11 +223,23 @@ label{cursor:pointer;user-select:none}.empty{color:var(--dim);padding:34px;text-
160
223
  </section>
161
224
  </main>
162
225
  <script>
163
- var NAMES={normalize:'规范化',assemble:'装配',serial:'串行解析',govern:'治理成稿',transcribe:'转写',roster:'角色合并',correct:'校正',speaker:'发声源'};
226
+ var NAMES={normalize:'规范化',assemble:'装配',serial:'串行解析',govern:'治理成稿',finalize:'治理成稿',transcribe:'转写',roster:'角色合并',correct:'校正',speaker:'发声源'};
164
227
  var cur=null, follow=true, lastLatest=null;
165
228
  var timing=null, timingAt=0; // last status.timings + client time it arrived (avoids clock skew)
166
229
  function $(s){return document.querySelector(s)}
167
- function fmtDur(ms){var s=Math.round(ms/1000);return s>=60?(Math.floor(s/60)+'m'+('0'+(s%60)).slice(-2)+'s'):s+'s'}
230
+ function fmtDur(ms){if(ms==null)return '—';var s=Math.round(ms/1000);return s>=60?(Math.floor(s/60)+'m'+('0'+(s%60)).slice(-2)+'s'):s+'s'}
231
+ // per-episode timing table (video only; hidden when there is no timing.jsonl)
232
+ function renderEpTiming(tm){
233
+ if(!tm||!tm.episodes||!tm.episodes.length){$('#timingWrap').style.display='none';return}
234
+ $('#timingWrap').style.display='block';
235
+ var rows=['<tr><th>集</th><th>转码</th><th>大小</th><th>上传</th><th>解析</th></tr>'];
236
+ tm.episodes.forEach(function(e){
237
+ var slow=e.generateMs>60000?' class="slow"':'';
238
+ rows.push('<tr><td>ep'+('00'+e.episode).slice(-3)+'</td><td>'+fmtDur(e.transcodeMs)+(e.transcoded===false?'*':'')+'</td><td>'+(e.uploadMB||'?')+'M</td><td>'+fmtDur(e.uploadMs)+'</td><td'+slow+'>'+fmtDur(e.generateMs)+'</td></tr>');
239
+ });
240
+ rows.push('<tr><td class="dim">累计</td><td></td><td></td><td></td><td class="dim">'+fmtDur(tm.totalMs)+'</td></tr>');
241
+ $('#tmTable').innerHTML=rows.join('');
242
+ }
168
243
  // tick the total elapsed locally between polls; serial ETA/rate from the summary
169
244
  function renderTiming(){
170
245
  if(!timing){$('#elapsed').textContent='—';$('#eta').textContent='';return}
@@ -181,12 +256,13 @@ function renderTiming(){
181
256
  $('#follow').onchange=function(e){follow=e.target.checked};
182
257
  function esc(s){return s.replace(/[&<>]/g,function(c){return{'&':'&amp;','<':'&lt;','>':'&gt;'}[c]})}
183
258
  function renderContent(rel,text){
259
+ if(rel.endsWith('.jsonl')){$('#view').textContent=text.split('\\n').map(function(l){try{return JSON.stringify(JSON.parse(l))}catch(e){return l}}).join('\\n');return}
184
260
  if(rel.endsWith('.json')){try{text=JSON.stringify(JSON.parse(text),null,2)}catch(e){}$('#view').textContent=text;return}
185
261
  if(rel.endsWith('.md')){
186
262
  $('#view').innerHTML=text.split('\\n').map(function(l){
187
263
  if(l.indexOf('## ')===0)return '<h2>'+esc(l.slice(3))+'</h2>';
188
264
  if(l.indexOf('# ')===0)return '<h1>'+esc(l.slice(2))+'</h1>';
189
- if(l.indexOf(' ')===0||l.indexOf('- ')===0)return '<span class="b">'+esc(l)+'</span>';
265
+ if(l.indexOf(' ')===0||l.indexOf('- ')===0||l.indexOf('> ')===0)return '<span class="b">'+esc(l)+'</span>';
190
266
  return esc(l)||'&nbsp;';
191
267
  }).join('\\n');return}
192
268
  $('#view').textContent=text;
@@ -220,13 +296,14 @@ function poll(){
220
296
  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>'+(d?'<div class="dim" style="margin-top:4px">'+d+'</div>':'')+'</div>';
221
297
  }).join('');
222
298
  timing=s.timings||null;timingAt=Date.now();renderTiming();
299
+ renderEpTiming(d.timing);
223
300
  // sidebar
224
301
  var html='',latest=null;
225
302
  Object.keys(d.groups).forEach(function(grp){
226
303
  var files=d.groups[grp];if(!files.length)return;html+='<div class="grp">'+grp+'</div>';
227
304
  files.forEach(function(f){
228
305
  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>';
229
- if(grp==='每窗更新'||grp==='上下文')latest=f.rel;
306
+ if(grp==='每窗更新'||grp==='上下文'||grp==='转录'||grp==='解析')latest=f.rel;
230
307
  });
231
308
  });
232
309
  $('#side').innerHTML=html;
@@ -1 +1 @@
1
- {"version":3,"file":"view-server.js","sourceRoot":"","sources":["../../../src/usecases/ingest/view-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view-server.js","sourceRoot":"","sources":["../../../src/usecases/ingest/view-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingjingai/scriptctl",
3
- "version": "0.42.0",
3
+ "version": "0.43.0",
4
4
  "description": "剧本阶段统一 CLI:直转外部素材到 script.json,以及当前最终剧本的读取、校验、原子编辑与批量 patch 精修。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,23 +0,0 @@
1
- import type { VideoEpisodeDoc } from "./video-records.js";
2
- export interface ActorAgg {
3
- name: string;
4
- episodes: number[];
5
- appearances: string[];
6
- anchors: string[];
7
- voices: string[];
8
- roles: string[];
9
- states: string[];
10
- }
11
- export interface AssetAgg {
12
- name: string;
13
- episodes: number[];
14
- descs: string[];
15
- }
16
- export interface ContextData {
17
- episodes: number[];
18
- actors: ActorAgg[];
19
- locations: AssetAgg[];
20
- props: AssetAgg[];
21
- }
22
- export declare function aggregateContext(docs: VideoEpisodeDoc[]): ContextData;
23
- export declare function renderContextMd(ctx: ContextData): string;
@@ -1,89 +0,0 @@
1
- // Cross-episode context aggregation (§10.2 pass3, ported from cezhi-verify 03).
2
- // Deterministic — no LLM. Sums each name's cross-episode occurrences + anchors +
3
- // roles + states into a working roster. Names that might be the same person
4
- // (江文博/江总) are NOT auto-merged here; that is the roster-merge layer's job.
5
- function pushUniq(arr, v) {
6
- const s = (v ?? "").trim();
7
- if (s && !arr.includes(s))
8
- arr.push(s);
9
- }
10
- function aggActors(docs) {
11
- const map = new Map();
12
- for (const d of docs) {
13
- const stateByOwner = new Map();
14
- for (const s of d.actorStates) {
15
- if (!stateByOwner.has(s.owner))
16
- stateByOwner.set(s.owner, []);
17
- stateByOwner.get(s.owner).push(s.state);
18
- }
19
- for (const a of d.actors) {
20
- if (!map.has(a.name))
21
- map.set(a.name, { name: a.name, episodes: [], appearances: [], anchors: [], voices: [], roles: [], states: [] });
22
- const g = map.get(a.name);
23
- g.episodes.push(d.episode);
24
- pushUniq(g.appearances, a.appearance);
25
- pushUniq(g.anchors, a.anchor);
26
- pushUniq(g.voices, a.voice);
27
- pushUniq(g.roles, a.role);
28
- for (const st of stateByOwner.get(a.name) ?? [])
29
- pushUniq(g.states, st);
30
- }
31
- }
32
- return [...map.values()].sort((x, y) => y.episodes.length - x.episodes.length || x.name.localeCompare(y.name));
33
- }
34
- function aggAssets(docs, key) {
35
- const map = new Map();
36
- for (const d of docs)
37
- for (const it of d[key]) {
38
- if (!map.has(it.name))
39
- map.set(it.name, { name: it.name, episodes: [], descs: [] });
40
- const g = map.get(it.name);
41
- g.episodes.push(d.episode);
42
- pushUniq(g.descs, it.desc);
43
- }
44
- return [...map.values()].sort((x, y) => y.episodes.length - x.episodes.length);
45
- }
46
- export function aggregateContext(docs) {
47
- return {
48
- episodes: docs.map((d) => d.episode),
49
- actors: aggActors(docs),
50
- locations: aggAssets(docs, "locations"),
51
- props: aggAssets(docs, "props"),
52
- };
53
- }
54
- // Compact per-episode-two context markdown (unmerged) — kept for parity/debug;
55
- // the merged variant (video-roster.renderMergedContextMd) is what pass4 consumes.
56
- export function renderContextMd(ctx) {
57
- const L = [];
58
- L.push("# 跨集资产 CONTEXT(用于校正命名与引用)", "");
59
- L.push("说明:这是前几集汇总的花名册。第二遍请对照原视频,把本集里被字幕带偏或未点名的角色,", "校正到下面的规范名;同一个人在不同集用了不同称呼(如「江文博」vs「江总」)的,判断是否同人。", "");
60
- L.push("## 人物", "");
61
- for (const a of ctx.actors) {
62
- L.push(`### ${a.name} (出现于 ep ${a.episodes.join("/")})`);
63
- if (a.roles.length)
64
- L.push(`- 作用: ${a.roles.join(" | ")}`);
65
- if (a.anchors.length)
66
- L.push(`- 锚点: ${a.anchors.join(" | ")}`);
67
- if (a.appearances.length)
68
- L.push(`- 外观: ${a.appearances[0]}`);
69
- if (a.voices.length)
70
- L.push(`- 声线: ${a.voices.join(" | ")}`);
71
- if (a.states.length)
72
- L.push(`- 已知造型: ${a.states.join("、")}`);
73
- L.push("");
74
- }
75
- if (ctx.locations.length) {
76
- L.push("## 场景", "");
77
- for (const l of ctx.locations)
78
- L.push(`- ${l.name}(ep ${l.episodes.join("/")}): ${l.descs[0] ?? ""}`);
79
- L.push("");
80
- }
81
- if (ctx.props.length) {
82
- L.push("## 道具", "");
83
- for (const p of ctx.props)
84
- L.push(`- ${p.name}(ep ${p.episodes.join("/")}): ${p.descs[0] ?? ""}`);
85
- L.push("");
86
- }
87
- return L.join("\n");
88
- }
89
- //# sourceMappingURL=video-aggregate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"video-aggregate.js","sourceRoot":"","sources":["../../../src/domain/ingest/video-aggregate.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,4EAA4E;AAC5E,2EAA2E;AAgB3E,SAAS,QAAQ,CAAC,GAAa,EAAE,CAAU;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9D,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACvI,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;YAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACtC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9B,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB,EAAE,GAA0B;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAE,CAAC;YAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC;QACvB,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;QACvC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,GAAgB;IAC9C,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,IAAI,CAAC,4CAA4C,EAAE,iDAAiD,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS;YAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;YAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { VideoEpisodeDoc } from "./video-records.js";
2
- export declare function parseEpisodeMd(md: string, episode: number): VideoEpisodeDoc;
@@ -1,233 +0,0 @@
1
- // Deterministic parser: transcribe-pass markdown → VideoEpisodeDoc (§10.2). No
2
- // LLM. Parses the extended protocol — multi-line character blocks (外观/锚点/
3
- // 声线/作用) + scenes with sub-second timestamps + typed-speaker anchors. Lenient
4
- // by design (never throws on malformed lines); the transcribe task rejects an
5
- // empty transcript upstream.
6
- // Accepts MM:SS and, at fps>1, sub-second MM:SS.sss (and H:MM:SS.sss). Millis
7
- // optional for backward compatibility.
8
- const TS_RE = /^\[((?:\d{1,2}:)?\d{1,2}:\d{2}(?:\.\d{1,3})?)\]\s*/;
9
- function parseCharList(s) {
10
- return s.split(/[,,]/).map((x) => x.trim()).filter(Boolean).map((tok) => {
11
- const m = tok.match(/^(.+?)\s*[((]\s*(.+?)\s*[))]\s*$/);
12
- return m ? { name: m[1].trim(), state: m[2].trim() } : { name: tok };
13
- });
14
- }
15
- function parseAnchor(line) {
16
- const m = line.match(/^>\s*\[(act|dlg|think)([^\]]*)\]\s*(.*)$/);
17
- if (!m)
18
- return null;
19
- const kind = m[1];
20
- const spec = m[2].replace(/^\|/, ""); // name|emotion or empty
21
- let content = m[3].trim();
22
- let ts;
23
- const tm = content.match(TS_RE);
24
- if (tm) {
25
- ts = tm[1];
26
- content = content.replace(TS_RE, "").trim();
27
- }
28
- const parts = spec.split("|").map((x) => x.trim()).filter(Boolean);
29
- const a = { kind, content };
30
- if (ts)
31
- a.ts = ts;
32
- if (kind === "dlg" || kind === "think") {
33
- if (parts[0])
34
- a.speaker = parts[0];
35
- if (parts[1])
36
- a.emotion = parts[1];
37
- }
38
- return a;
39
- }
40
- function parseKvItem(line) {
41
- const m = line.match(/^-\s*(.+?)\s*[::]\s*(.*)$/);
42
- if (m)
43
- return { name: m[1].trim(), desc: m[2].trim() };
44
- const m2 = line.match(/^-\s*(.+?)\s*$/);
45
- return m2 ? { name: m2[1].trim(), desc: "" } : null;
46
- }
47
- function parseStateItem(line) {
48
- const m = line.match(/^-\s*(.+?)\s*[||]\s*(.+?)\s*[::]\s*(.*)$/);
49
- return m ? { owner: m[1].trim(), state: m[2].trim(), desc: m[3].trim() } : null;
50
- }
51
- export function parseEpisodeMd(md, episode) {
52
- const lines = md.split(/\r?\n/);
53
- const doc = {
54
- episode, synopsis: "", scenes: [], actors: [],
55
- locations: [], props: [], speakers: [],
56
- actorStates: [], locationStates: [], propStates: [],
57
- };
58
- let section = null;
59
- let scene = null;
60
- let curActor = null;
61
- const synBuf = [];
62
- const pushScene = () => { if (scene) {
63
- doc.scenes.push(scene);
64
- scene = null;
65
- } };
66
- const pushActor = () => { if (curActor) {
67
- doc.actors.push(curActor);
68
- curActor = null;
69
- } };
70
- for (const raw of lines) {
71
- const t = raw.replace(/\s+$/, "").trim();
72
- // Top/second-level headers switch sections.
73
- if (/^#\s*剧本/.test(t)) {
74
- section = "script";
75
- pushActor();
76
- continue;
77
- }
78
- if (/^#\s*资产/.test(t)) {
79
- section = null;
80
- pushScene();
81
- pushActor();
82
- continue;
83
- }
84
- if (/^##\s*梗概/.test(t)) {
85
- section = "synopsis";
86
- continue;
87
- }
88
- if (/^##\s*人物状态/.test(t)) {
89
- section = "actorStates";
90
- pushActor();
91
- continue;
92
- }
93
- if (/^##\s*场景状态/.test(t)) {
94
- section = "locationStates";
95
- continue;
96
- }
97
- if (/^##\s*道具状态/.test(t)) {
98
- section = "propStates";
99
- continue;
100
- }
101
- if (/^##\s*人物/.test(t)) {
102
- section = "actors";
103
- continue;
104
- }
105
- if (/^##\s*场景/.test(t) && section !== "script") {
106
- section = "locations";
107
- continue;
108
- }
109
- if (/^##\s*道具/.test(t)) {
110
- section = "props";
111
- continue;
112
- }
113
- if (/^##\s*发声源/.test(t)) {
114
- section = "speakers";
115
- pushActor();
116
- continue;
117
- }
118
- // In-script scene header: ## 场景 N
119
- if (section === "script" && /^##\s*场景/.test(t)) {
120
- pushScene();
121
- scene = { index: doc.scenes.length + 1, environment: {}, characters: [], props: [], anchors: [] };
122
- continue;
123
- }
124
- if (section === "synopsis") {
125
- if (t)
126
- synBuf.push(t);
127
- continue;
128
- }
129
- if (section === "script" && scene) {
130
- if (/^-\s*时空[::]/.test(t)) {
131
- const [space, time] = t.replace(/^-\s*时空[::]\s*/, "").trim().split(/\s+/);
132
- scene.environment = {};
133
- if (space)
134
- scene.environment.space = space;
135
- if (time)
136
- scene.environment.time = time;
137
- }
138
- else if (/^-\s*时间[::]/.test(t)) {
139
- scene.timeRange = t.replace(/^-\s*时间[::]\s*/, "").trim();
140
- }
141
- else if (/^-\s*地点[::]/.test(t)) {
142
- scene.location = t.replace(/^-\s*地点[::]\s*/, "").trim();
143
- }
144
- else if (/^-\s*角色[::]/.test(t)) {
145
- scene.characters = parseCharList(t.replace(/^-\s*角色[::]\s*/, ""));
146
- }
147
- else if (/^-\s*道具[::]/.test(t)) {
148
- const v = t.replace(/^-\s*道具[::]\s*/, "").trim();
149
- scene.props = /^无$/.test(v) ? [] : v.split(/[,,]/).map((x) => x.trim()).filter(Boolean);
150
- }
151
- else if (/^>/.test(t)) {
152
- const a = parseAnchor(t);
153
- if (a)
154
- scene.anchors.push(a);
155
- }
156
- else if (t && scene.anchors.length) {
157
- // Continuation line (no `>` prefix) → append to the previous anchor.
158
- scene.anchors[scene.anchors.length - 1].content += "\n" + t;
159
- }
160
- continue;
161
- }
162
- // Character section: multi-line blocks.
163
- if (section === "actors") {
164
- const head = t.match(/^-\s*(.+?)\s*$/);
165
- if (head && /^-\s/.test(t) && !/^-\s*(外观|锚点|声线|作用)[::]/.test(t)) {
166
- pushActor();
167
- curActor = { name: head[1].trim() };
168
- continue;
169
- }
170
- if (curActor) {
171
- const f = t.match(/^(外观|锚点|声线|作用)[::]\s*(.*)$/);
172
- if (f) {
173
- const val = f[2].trim();
174
- if (f[1] === "外观")
175
- curActor.appearance = val;
176
- else if (f[1] === "锚点")
177
- curActor.anchor = val;
178
- else if (f[1] === "声线")
179
- curActor.voice = val;
180
- else if (f[1] === "作用")
181
- curActor.role = val;
182
- }
183
- }
184
- continue;
185
- }
186
- if (section === "locations") {
187
- const it = parseKvItem(t);
188
- if (it && /^-/.test(t))
189
- doc.locations.push(it);
190
- continue;
191
- }
192
- if (section === "props") {
193
- const it = parseKvItem(t);
194
- if (it && /^-/.test(t))
195
- doc.props.push(it);
196
- continue;
197
- }
198
- if (section === "speakers") {
199
- const m = t.match(/^-\s*(.+?)\s*[((]\s*(\w+)\s*[))]\s*[::]?\s*(.*)$/);
200
- if (m)
201
- doc.speakers.push({ name: m[1].trim(), type: m[2].trim(), desc: m[3].trim() });
202
- else {
203
- const it = parseKvItem(t);
204
- if (it && /^-/.test(t))
205
- doc.speakers.push({ name: it.name, desc: it.desc });
206
- }
207
- continue;
208
- }
209
- if (section === "actorStates" && /^-/.test(t)) {
210
- const s = parseStateItem(t);
211
- if (s)
212
- doc.actorStates.push(s);
213
- continue;
214
- }
215
- if (section === "locationStates" && /^-/.test(t)) {
216
- const s = parseStateItem(t);
217
- if (s)
218
- doc.locationStates.push(s);
219
- continue;
220
- }
221
- if (section === "propStates" && /^-/.test(t)) {
222
- const s = parseStateItem(t);
223
- if (s)
224
- doc.propStates.push(s);
225
- continue;
226
- }
227
- }
228
- pushScene();
229
- pushActor();
230
- doc.synopsis = synBuf.join("");
231
- return doc;
232
- }
233
- //# sourceMappingURL=video-md-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"video-md-parser.js","sourceRoot":"","sources":["../../../src/domain/ingest/video-md-parser.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { LlmTaskExecutor } from "../../types.js";
2
- export declare const PLOT_SPEAKER_SYSTEM: string;
3
- export declare function plotSpeakerPrompt(episodeNo: number, allSynopsis: string, contextMd: string, pass1Md: string): string;
4
- export interface PlotSpeakerFix {
5
- ts: string;
6
- line: string;
7
- from: string;
8
- to: string;
9
- reason: string;
10
- }
11
- export declare function runPlotSpeaker(executor: LlmTaskExecutor, episodeNo: number, allSynopsis: string, contextMd: string, pass1Md: string, signal?: AbortSignal): Promise<PlotSpeakerFix[]>;