@lingjingai/scriptctl 0.1.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/dist/bin.d.ts +2 -0
- package/dist/bin.js +12 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +433 -0
- package/dist/cli.js.map +1 -0
- package/dist/common.d.ts +124 -0
- package/dist/common.js +337 -0
- package/dist/common.js.map +1 -0
- package/dist/domain/direct-core.d.ts +114 -0
- package/dist/domain/direct-core.js +3040 -0
- package/dist/domain/direct-core.js.map +1 -0
- package/dist/domain/script-core.d.ts +18 -0
- package/dist/domain/script-core.js +1886 -0
- package/dist/domain/script-core.js.map +1 -0
- package/dist/help-text.d.ts +2 -0
- package/dist/help-text.js +399 -0
- package/dist/help-text.js.map +1 -0
- package/dist/infra/converters.d.ts +10 -0
- package/dist/infra/converters.js +560 -0
- package/dist/infra/converters.js.map +1 -0
- package/dist/infra/env.d.ts +2 -0
- package/dist/infra/env.js +81 -0
- package/dist/infra/env.js.map +1 -0
- package/dist/infra/providers.d.ts +25 -0
- package/dist/infra/providers.js +330 -0
- package/dist/infra/providers.js.map +1 -0
- package/dist/infra/script-output-api.d.ts +44 -0
- package/dist/infra/script-output-api.js +160 -0
- package/dist/infra/script-output-api.js.map +1 -0
- package/dist/infra/storage.d.ts +35 -0
- package/dist/infra/storage.js +91 -0
- package/dist/infra/storage.js.map +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +55 -0
- package/dist/output.js.map +1 -0
- package/dist/usecases/direct.d.ts +13 -0
- package/dist/usecases/direct.js +1679 -0
- package/dist/usecases/direct.js.map +1 -0
- package/dist/usecases/doctor.d.ts +2 -0
- package/dist/usecases/doctor.js +75 -0
- package/dist/usecases/doctor.js.map +1 -0
- package/dist/usecases/script.d.ts +32 -0
- package/dist/usecases/script.js +949 -0
- package/dist/usecases/script.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/infra/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ProviderLike } from "../domain/direct-core.js";
|
|
2
|
+
type Dict = Record<string, unknown>;
|
|
3
|
+
export declare class MockProvider implements ProviderLike {
|
|
4
|
+
readonly name = "mock";
|
|
5
|
+
extractEpisode(sourceText: string, episodePlan: Dict): Dict;
|
|
6
|
+
extractBatch(sourceText: string, batchPlan: Dict): Dict;
|
|
7
|
+
extractMetadata(_sourceText: string, script: Dict): Dict;
|
|
8
|
+
extractAssetCuration(_sourceText: string, _script: Dict): Dict;
|
|
9
|
+
extractEpisodeTitles(sourceText: string, episodePlan: Dict): Dict;
|
|
10
|
+
}
|
|
11
|
+
export declare class AnthropicProvider implements ProviderLike {
|
|
12
|
+
readonly name = "anthropic";
|
|
13
|
+
private readonly client;
|
|
14
|
+
private readonly model;
|
|
15
|
+
constructor(model: string);
|
|
16
|
+
private messageRequest;
|
|
17
|
+
private collectResponseText;
|
|
18
|
+
extractEpisode(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
19
|
+
extractBatch(sourceText: string, batchPlan: Dict): Promise<Dict>;
|
|
20
|
+
extractEpisodeTitles(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
21
|
+
extractAssetCuration(_sourceText: string, script: Dict): Promise<Dict>;
|
|
22
|
+
extractMetadata(_sourceText: string, script: Dict): Promise<Dict>;
|
|
23
|
+
}
|
|
24
|
+
export declare function makeProvider(name: string, model: string): ProviderLike;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
import { ASSET_CURATION_SCHEMA, CliError, DEFAULT_BATCH_MAX_TOKENS, DEFAULT_MAX_TOKENS, DEFAULT_THINKING_BUDGET_TOKENS, EPISODE_TITLE_EXTRACTION_SCHEMA, EXIT_RUNTIME, EXIT_USAGE, MARKDOWN_BATCH_PROMPT_SPEC, METADATA_EXTRACTION_SCHEMA, NONSTREAMING_MAX_TOKENS, WORLDVIEW_VALUES, } from "../common.js";
|
|
3
|
+
import { _md_push_asset, _normalize_speaker_list, buildAssetCurationContext, buildEpisodeTitleContext, buildMetadataContext, deterministicEpisodeShortTitle, deterministicExtractEpisode, deterministicExtractMetadata, episodesNeedingGeneratedTitles, formatBatchSource, parseMarkdownBatch, } from "../domain/direct-core.js";
|
|
4
|
+
function strOf(v) {
|
|
5
|
+
if (v === null || v === undefined)
|
|
6
|
+
return "";
|
|
7
|
+
return String(v);
|
|
8
|
+
}
|
|
9
|
+
function isList(v) {
|
|
10
|
+
return Array.isArray(v);
|
|
11
|
+
}
|
|
12
|
+
function asList(v) {
|
|
13
|
+
return Array.isArray(v) ? v : [];
|
|
14
|
+
}
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Mock provider
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export class MockProvider {
|
|
19
|
+
name = "mock";
|
|
20
|
+
extractEpisode(sourceText, episodePlan) {
|
|
21
|
+
return this.extractBatch(sourceText, episodePlan);
|
|
22
|
+
}
|
|
23
|
+
extractBatch(sourceText, batchPlan) {
|
|
24
|
+
const result = deterministicExtractEpisode(sourceText, batchPlan);
|
|
25
|
+
const actors = [];
|
|
26
|
+
const locations = [];
|
|
27
|
+
const props = [];
|
|
28
|
+
const speakers = [];
|
|
29
|
+
for (const scene of asList(result["scenes"])) {
|
|
30
|
+
for (const name of asList(scene["actor_names"])) {
|
|
31
|
+
_md_push_asset(actors, strOf(name).trim(), null);
|
|
32
|
+
}
|
|
33
|
+
const loc = strOf(scene["location_name"]).trim();
|
|
34
|
+
if (loc && loc !== "未知场景")
|
|
35
|
+
_md_push_asset(locations, loc, null);
|
|
36
|
+
for (const prop of asList(scene["prop_names"])) {
|
|
37
|
+
_md_push_asset(props, strOf(prop).trim(), null);
|
|
38
|
+
}
|
|
39
|
+
for (const action of asList(scene["actions"])) {
|
|
40
|
+
const speaker = strOf(action["speaker"]).trim();
|
|
41
|
+
const speakerKind = strOf(action["speaker_kind"]).trim();
|
|
42
|
+
if (speaker && speakerKind && speakerKind !== "actor") {
|
|
43
|
+
speakers.push({ name: speaker, source_kind: speakerKind, description: null });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
result["actors"] = actors;
|
|
48
|
+
result["locations"] = locations;
|
|
49
|
+
result["props"] = props;
|
|
50
|
+
result["speakers"] = _normalize_speaker_list(speakers);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
extractMetadata(_sourceText, script) {
|
|
54
|
+
return deterministicExtractMetadata(script);
|
|
55
|
+
}
|
|
56
|
+
extractAssetCuration(_sourceText, _script) {
|
|
57
|
+
return { locations: [] };
|
|
58
|
+
}
|
|
59
|
+
extractEpisodeTitles(sourceText, episodePlan) {
|
|
60
|
+
return {
|
|
61
|
+
episode_titles: episodesNeedingGeneratedTitles(episodePlan).map((ep) => ({
|
|
62
|
+
episode: Number(ep["episode"] ?? 0),
|
|
63
|
+
title: deterministicEpisodeShortTitle(sourceText, ep),
|
|
64
|
+
})),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Anthropic provider
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export class AnthropicProvider {
|
|
72
|
+
name = "anthropic";
|
|
73
|
+
client;
|
|
74
|
+
model;
|
|
75
|
+
constructor(model) {
|
|
76
|
+
const apiKey = (process.env.SCRIPTCTL_ANTHROPIC_API_KEY ?? "").trim();
|
|
77
|
+
if (!apiKey) {
|
|
78
|
+
throw new CliError("INIT FAILED: Anthropic API key missing", "Anthropic API key missing.", {
|
|
79
|
+
exitCode: EXIT_RUNTIME,
|
|
80
|
+
required: ["SCRIPTCTL_ANTHROPIC_API_KEY"],
|
|
81
|
+
received: ["no API key environment variable"],
|
|
82
|
+
nextSteps: ["Configure an Anthropic key. Use --provider mock only for tests, never for delivery."],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const baseUrl = (process.env.SCRIPTCTL_ANTHROPIC_BASE_URL ?? "").trim();
|
|
86
|
+
const opts = { apiKey };
|
|
87
|
+
if (baseUrl)
|
|
88
|
+
opts.baseURL = baseUrl;
|
|
89
|
+
this.client = new Anthropic(opts);
|
|
90
|
+
this.model = model;
|
|
91
|
+
}
|
|
92
|
+
messageRequest(prompt, maxTokens) {
|
|
93
|
+
const rawMaxTokens = (process.env.SCRIPTCTL_MAX_TOKENS ?? "").trim();
|
|
94
|
+
let configuredMaxTokens = DEFAULT_MAX_TOKENS;
|
|
95
|
+
if (rawMaxTokens) {
|
|
96
|
+
const parsed = parseInt(rawMaxTokens, 10);
|
|
97
|
+
if (!Number.isNaN(parsed))
|
|
98
|
+
configuredMaxTokens = parsed;
|
|
99
|
+
}
|
|
100
|
+
let tokenBudget = maxTokens !== undefined ? maxTokens : configuredMaxTokens;
|
|
101
|
+
tokenBudget = Math.max(1024, Math.min(tokenBudget, configuredMaxTokens, DEFAULT_MAX_TOKENS));
|
|
102
|
+
const request = {
|
|
103
|
+
model: this.model,
|
|
104
|
+
max_tokens: tokenBudget,
|
|
105
|
+
messages: [{ role: "user", content: prompt }],
|
|
106
|
+
};
|
|
107
|
+
if (this.model.endsWith("-think")) {
|
|
108
|
+
const rawBudget = (process.env.SCRIPTCTL_THINKING_BUDGET_TOKENS ?? "").trim();
|
|
109
|
+
let budget = DEFAULT_THINKING_BUDGET_TOKENS;
|
|
110
|
+
if (rawBudget) {
|
|
111
|
+
const parsed = parseInt(rawBudget, 10);
|
|
112
|
+
if (!Number.isNaN(parsed))
|
|
113
|
+
budget = parsed;
|
|
114
|
+
}
|
|
115
|
+
request.thinking = { type: "enabled", budget_tokens: Math.max(1024, Math.min(budget, tokenBudget - 1000)) };
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
request.temperature = 0;
|
|
119
|
+
}
|
|
120
|
+
return request;
|
|
121
|
+
}
|
|
122
|
+
async collectResponseText(request) {
|
|
123
|
+
if (request.max_tokens > NONSTREAMING_MAX_TOKENS) {
|
|
124
|
+
const stream = await this.client.messages.stream(request);
|
|
125
|
+
const text = await stream.finalText();
|
|
126
|
+
const message = await stream.finalMessage();
|
|
127
|
+
return [text.trim(), strOf(message.stop_reason)];
|
|
128
|
+
}
|
|
129
|
+
const response = await this.client.messages.create(request);
|
|
130
|
+
return [textFromResponse(response), strOf(response.stop_reason)];
|
|
131
|
+
}
|
|
132
|
+
extractEpisode(sourceText, episodePlan) {
|
|
133
|
+
return this.extractBatch(sourceText, episodePlan);
|
|
134
|
+
}
|
|
135
|
+
async extractBatch(sourceText, batchPlan) {
|
|
136
|
+
const context = isList(batchPlan["context"]) || typeof batchPlan["context"] === "object" && batchPlan["context"] !== null
|
|
137
|
+
? batchPlan["context"]
|
|
138
|
+
: {};
|
|
139
|
+
const numberedSource = formatBatchSource(sourceText, batchPlan);
|
|
140
|
+
const prompt = "You convert one batch from an existing script into the documented markdown template.\n" +
|
|
141
|
+
"\n" +
|
|
142
|
+
`${MARKDOWN_BATCH_PROMPT_SPEC}\n` +
|
|
143
|
+
"\n" +
|
|
144
|
+
"Batch plan:\n" +
|
|
145
|
+
`${JSON.stringify(batchPlan)}\n` +
|
|
146
|
+
"\n" +
|
|
147
|
+
"Read-only context:\n" +
|
|
148
|
+
`${JSON.stringify(context)}\n` +
|
|
149
|
+
"\n" +
|
|
150
|
+
"Batch Source:\n" +
|
|
151
|
+
`${numberedSource}\n`;
|
|
152
|
+
const request = this.messageRequest(prompt, DEFAULT_BATCH_MAX_TOKENS);
|
|
153
|
+
const [raw, stopReason] = await this.collectResponseText(request);
|
|
154
|
+
if (stopReason === "max_tokens") {
|
|
155
|
+
throw new CliError("INIT FAILED: Provider output truncated", "Provider output truncated.", {
|
|
156
|
+
exitCode: EXIT_RUNTIME,
|
|
157
|
+
required: ["complete markdown within provider max_tokens"],
|
|
158
|
+
received: [
|
|
159
|
+
`stop_reason: ${stopReason}`,
|
|
160
|
+
`max_tokens: ${request.max_tokens}`,
|
|
161
|
+
`raw chars: ${raw.length}`,
|
|
162
|
+
`tail: ${raw.slice(-160) || "<empty response>"}`,
|
|
163
|
+
],
|
|
164
|
+
nextSteps: ["Rerun init; completed batch checkpoints will be reused. If this repeats, split the source episode or raise SCRIPTCTL_MAX_TOKENS."],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const parsed = parseMarkdownBatch(raw, batchPlan);
|
|
168
|
+
parsed["_raw_markdown"] = raw;
|
|
169
|
+
return parsed;
|
|
170
|
+
}
|
|
171
|
+
async extractEpisodeTitles(sourceText, episodePlan) {
|
|
172
|
+
const context = buildEpisodeTitleContext(sourceText, episodePlan);
|
|
173
|
+
if (context.length === 0)
|
|
174
|
+
return { episode_titles: [] };
|
|
175
|
+
const prompt = "You generate missing episode titles for a direct script conversion.\n" +
|
|
176
|
+
"Use only each episode excerpt below. Do not invent plot events outside it.\n" +
|
|
177
|
+
"Return JSON matching the configured schema.\n" +
|
|
178
|
+
"\n" +
|
|
179
|
+
"Requirements:\n" +
|
|
180
|
+
"- Return one item for every input episode.\n" +
|
|
181
|
+
"- The title field must be a short Chinese episode title, 2-8 Chinese characters when possible.\n" +
|
|
182
|
+
"- Do not include episode numbers, `ep_###`, `Episode ###`, punctuation wrappers, or quotes.\n" +
|
|
183
|
+
"- Prefer concrete plot hooks, conflicts, reversals, or memorable images from the episode.\n" +
|
|
184
|
+
"\n" +
|
|
185
|
+
"Episodes needing titles:\n" +
|
|
186
|
+
`${JSON.stringify(context)}\n`;
|
|
187
|
+
const request = { ...this.messageRequest(prompt, 4096) };
|
|
188
|
+
request["output_config"] = {
|
|
189
|
+
format: { type: "json_schema", schema: EPISODE_TITLE_EXTRACTION_SCHEMA },
|
|
190
|
+
};
|
|
191
|
+
const [raw, stopReason] = await this.collectResponseText(request);
|
|
192
|
+
if (stopReason === "max_tokens") {
|
|
193
|
+
throw new CliError("INIT FAILED: Episode title output truncated", "Episode title output truncated.", {
|
|
194
|
+
exitCode: EXIT_RUNTIME,
|
|
195
|
+
required: ["complete episode title JSON within provider max_tokens"],
|
|
196
|
+
received: [`stop_reason: ${stopReason}`, `max_tokens: ${request["max_tokens"]}`, `raw chars: ${raw.length}`],
|
|
197
|
+
nextSteps: ["Rerun init; if this repeats, split the source or provide explicit episode titles."],
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
return JSON.parse(raw);
|
|
202
|
+
}
|
|
203
|
+
catch (exc) {
|
|
204
|
+
throw new CliError("INIT FAILED: Provider returned invalid episode title JSON", "Provider returned invalid episode title JSON.", {
|
|
205
|
+
exitCode: EXIT_RUNTIME,
|
|
206
|
+
required: ["valid JSON matching configured episode title schema"],
|
|
207
|
+
received: [
|
|
208
|
+
`stop_reason: ${stopReason || "unknown"}`,
|
|
209
|
+
`raw head: ${raw.slice(0, 160) || "<empty response>"}`,
|
|
210
|
+
`raw tail: ${raw.slice(-160) || "<empty response>"}`,
|
|
211
|
+
],
|
|
212
|
+
nextSteps: ["Rerun init; title generation will retry before batch extraction."],
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async extractAssetCuration(_sourceText, script) {
|
|
217
|
+
const context = buildAssetCurationContext(script);
|
|
218
|
+
const prompt = "You decide which extracted locations should be merged into stable parent locations.\n" +
|
|
219
|
+
"Use only the structured script context below. Do not decide from names alone.\n" +
|
|
220
|
+
"Return JSON matching the configured schema.\n" +
|
|
221
|
+
"\n" +
|
|
222
|
+
"Requirements:\n" +
|
|
223
|
+
"- This task only handles location merge decisions. Actors and props are pruned by deterministic scene-count rules outside this provider step.\n" +
|
|
224
|
+
"- For locations, choose merge only when the location is clearly the same stable space as another existing location_id.\n" +
|
|
225
|
+
"- Keep a location whenever its parent location is uncertain, it may need distinct visual continuity, or no stable parent exists.\n" +
|
|
226
|
+
"- target_location_id must be an existing location_id when decision is merge; use null for keep.\n" +
|
|
227
|
+
"- Reasons must cite evidence from the provided examples/usage, not a keyword rule.\n" +
|
|
228
|
+
"- Do not rewrite actions or metadata; this task only decides asset curation.\n" +
|
|
229
|
+
"\n" +
|
|
230
|
+
"Script asset curation context:\n" +
|
|
231
|
+
`${JSON.stringify(context)}\n`;
|
|
232
|
+
const request = { ...this.messageRequest(prompt, DEFAULT_MAX_TOKENS) };
|
|
233
|
+
request["output_config"] = {
|
|
234
|
+
format: { type: "json_schema", schema: ASSET_CURATION_SCHEMA },
|
|
235
|
+
};
|
|
236
|
+
const [raw, stopReason] = await this.collectResponseText(request);
|
|
237
|
+
if (stopReason === "max_tokens") {
|
|
238
|
+
throw new CliError("INIT FAILED: Asset curation output truncated", "Asset curation output truncated.", {
|
|
239
|
+
exitCode: EXIT_RUNTIME,
|
|
240
|
+
required: ["complete asset curation JSON within provider max_tokens"],
|
|
241
|
+
received: [`stop_reason: ${stopReason}`, `max_tokens: ${request["max_tokens"]}`, `raw chars: ${raw.length}`],
|
|
242
|
+
nextSteps: ["Rerun init; extraction checkpoints will be reused and asset curation will retry."],
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
return JSON.parse(raw);
|
|
247
|
+
}
|
|
248
|
+
catch (exc) {
|
|
249
|
+
throw new CliError("INIT FAILED: Provider returned invalid asset curation JSON", "Provider returned invalid asset curation JSON.", {
|
|
250
|
+
exitCode: EXIT_RUNTIME,
|
|
251
|
+
required: ["valid JSON matching configured asset curation schema"],
|
|
252
|
+
received: [
|
|
253
|
+
`stop_reason: ${stopReason || "unknown"}`,
|
|
254
|
+
`raw head: ${raw.slice(0, 160) || "<empty response>"}`,
|
|
255
|
+
`raw tail: ${raw.slice(-160) || "<empty response>"}`,
|
|
256
|
+
],
|
|
257
|
+
nextSteps: ["Rerun init; extraction checkpoints will be reused and asset curation will retry."],
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async extractMetadata(_sourceText, script) {
|
|
262
|
+
const context = buildMetadataContext(script);
|
|
263
|
+
const prompt = "You produce global metadata for a direct script conversion.\n" +
|
|
264
|
+
"Use only the structured script context below. Do not invent plot events outside it.\n" +
|
|
265
|
+
"Return JSON matching the configured schema.\n" +
|
|
266
|
+
"\n" +
|
|
267
|
+
"Requirements:\n" +
|
|
268
|
+
`- worldview must be exactly one of: ${WORLDVIEW_VALUES.join(", ")}\n` +
|
|
269
|
+
"- confidence is high/medium/low; use low only when the script context is insufficient.\n" +
|
|
270
|
+
"- Every actor_id listed in the input must appear once with role_type 主角 or 配角 and a non-empty description.\n" +
|
|
271
|
+
"- Every location_id and prop_id listed in the input must appear once with a non-empty description.\n" +
|
|
272
|
+
"- Descriptions should be concise, useful for downstream asset generation, and grounded in names/states/examples.\n" +
|
|
273
|
+
"- Do not rewrite action/dialogue source content; this task only writes metadata fields.\n" +
|
|
274
|
+
"\n" +
|
|
275
|
+
"Script metadata context:\n" +
|
|
276
|
+
`${JSON.stringify(context)}\n`;
|
|
277
|
+
const request = { ...this.messageRequest(prompt, DEFAULT_MAX_TOKENS) };
|
|
278
|
+
request["output_config"] = {
|
|
279
|
+
format: { type: "json_schema", schema: METADATA_EXTRACTION_SCHEMA },
|
|
280
|
+
};
|
|
281
|
+
const [raw, stopReason] = await this.collectResponseText(request);
|
|
282
|
+
if (stopReason === "max_tokens") {
|
|
283
|
+
throw new CliError("INIT FAILED: Metadata output truncated", "Metadata output truncated.", {
|
|
284
|
+
exitCode: EXIT_RUNTIME,
|
|
285
|
+
required: ["complete metadata JSON within provider max_tokens"],
|
|
286
|
+
received: [`stop_reason: ${stopReason}`, `max_tokens: ${request["max_tokens"]}`, `raw chars: ${raw.length}`],
|
|
287
|
+
nextSteps: ["Rerun init; extraction checkpoints will be reused and metadata will retry."],
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
return JSON.parse(raw);
|
|
292
|
+
}
|
|
293
|
+
catch (exc) {
|
|
294
|
+
throw new CliError("INIT FAILED: Provider returned invalid metadata JSON", "Provider returned invalid metadata JSON.", {
|
|
295
|
+
exitCode: EXIT_RUNTIME,
|
|
296
|
+
required: ["valid JSON matching configured metadata schema"],
|
|
297
|
+
received: [
|
|
298
|
+
`stop_reason: ${stopReason || "unknown"}`,
|
|
299
|
+
`raw head: ${raw.slice(0, 160) || "<empty response>"}`,
|
|
300
|
+
`raw tail: ${raw.slice(-160) || "<empty response>"}`,
|
|
301
|
+
],
|
|
302
|
+
nextSteps: ["Rerun init; extraction checkpoints will be reused and metadata will retry."],
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function textFromResponse(response) {
|
|
308
|
+
const parts = [];
|
|
309
|
+
for (const block of response.content ?? []) {
|
|
310
|
+
if (block.text)
|
|
311
|
+
parts.push(block.text);
|
|
312
|
+
}
|
|
313
|
+
return parts.join("\n").trim();
|
|
314
|
+
}
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
// Factory
|
|
317
|
+
// ---------------------------------------------------------------------------
|
|
318
|
+
export function makeProvider(name, model) {
|
|
319
|
+
if (name === "mock")
|
|
320
|
+
return new MockProvider();
|
|
321
|
+
if (name === "anthropic")
|
|
322
|
+
return new AnthropicProvider(model);
|
|
323
|
+
throw new CliError("INIT FAILED: Unsupported provider", "Unsupported provider.", {
|
|
324
|
+
exitCode: EXIT_USAGE,
|
|
325
|
+
required: ["--provider: anthropic or mock"],
|
|
326
|
+
received: [`--provider: ${name}`],
|
|
327
|
+
nextSteps: ["Use --provider anthropic or --provider mock."],
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/infra/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface ScriptOutputApiErrorOptions {
|
|
2
|
+
status?: number | null;
|
|
3
|
+
code?: number | string | null;
|
|
4
|
+
payload?: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare class ScriptOutputApiError extends Error {
|
|
7
|
+
readonly status: number | null;
|
|
8
|
+
readonly code: number | string | null;
|
|
9
|
+
readonly payload: unknown;
|
|
10
|
+
constructor(message: string, opts?: ScriptOutputApiErrorOptions);
|
|
11
|
+
}
|
|
12
|
+
export declare function normalizeGatewayBase(value: string): string;
|
|
13
|
+
export declare function quotePath(value: string): string;
|
|
14
|
+
export interface ReplaceScriptOptions {
|
|
15
|
+
requestId: string;
|
|
16
|
+
baseRevision: number;
|
|
17
|
+
script: Record<string, unknown>;
|
|
18
|
+
source?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SaveValidationOptions {
|
|
21
|
+
revision: number;
|
|
22
|
+
validationStatus: string;
|
|
23
|
+
validationSummary: Record<string, unknown>;
|
|
24
|
+
issues: Array<Record<string, unknown>>;
|
|
25
|
+
}
|
|
26
|
+
export declare class ScriptOutputClient {
|
|
27
|
+
readonly gatewayBase: string;
|
|
28
|
+
readonly projectGroupNo: string;
|
|
29
|
+
readonly accessKey: string;
|
|
30
|
+
readonly timeoutMs: number;
|
|
31
|
+
constructor(opts: {
|
|
32
|
+
gatewayBase: string;
|
|
33
|
+
projectGroupNo: string;
|
|
34
|
+
accessKey: string;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
});
|
|
37
|
+
static fromEnv(projectGroupNo?: string | null): ScriptOutputClient;
|
|
38
|
+
private get projectPrefix();
|
|
39
|
+
getScript(): Promise<Record<string, unknown> | null>;
|
|
40
|
+
getRevision(): Promise<Record<string, unknown> | null>;
|
|
41
|
+
replaceScript(opts: ReplaceScriptOptions): Promise<Record<string, unknown>>;
|
|
42
|
+
saveValidationResult(opts: SaveValidationOptions): Promise<Record<string, unknown>>;
|
|
43
|
+
private request;
|
|
44
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
const SCRIPT_OUTPUT_PREFIX = "/api/anime/workbench/script-output/project-groups";
|
|
2
|
+
export class ScriptOutputApiError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
payload;
|
|
6
|
+
constructor(message, opts = {}) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "ScriptOutputApiError";
|
|
9
|
+
this.status = opts.status ?? null;
|
|
10
|
+
this.code = opts.code ?? null;
|
|
11
|
+
this.payload = opts.payload;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function normalizeGatewayBase(value) {
|
|
15
|
+
let base = value.trim().replace(/\/+$/, "");
|
|
16
|
+
for (const suffix of ["/api/anime/workbench", "/api/sandbox"]) {
|
|
17
|
+
if (base.endsWith(suffix)) {
|
|
18
|
+
base = base.slice(0, -suffix.length);
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return base.replace(/\/+$/, "");
|
|
23
|
+
}
|
|
24
|
+
export function quotePath(value) {
|
|
25
|
+
return encodeURIComponent(String(value));
|
|
26
|
+
}
|
|
27
|
+
function apiErrorFromText(text, status) {
|
|
28
|
+
let payload = null;
|
|
29
|
+
try {
|
|
30
|
+
payload = text ? JSON.parse(text) : null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
payload = null;
|
|
34
|
+
}
|
|
35
|
+
if (payload && typeof payload === "object") {
|
|
36
|
+
const obj = payload;
|
|
37
|
+
const message = String(obj.msg ?? obj.message ?? `HTTP ${status}`);
|
|
38
|
+
return new ScriptOutputApiError(message, { status, code: obj.code ?? null, payload: obj });
|
|
39
|
+
}
|
|
40
|
+
return new ScriptOutputApiError(text || `HTTP ${status}`, { status, payload: text });
|
|
41
|
+
}
|
|
42
|
+
export class ScriptOutputClient {
|
|
43
|
+
gatewayBase;
|
|
44
|
+
projectGroupNo;
|
|
45
|
+
accessKey;
|
|
46
|
+
timeoutMs;
|
|
47
|
+
constructor(opts) {
|
|
48
|
+
this.gatewayBase = opts.gatewayBase;
|
|
49
|
+
this.projectGroupNo = opts.projectGroupNo;
|
|
50
|
+
this.accessKey = opts.accessKey;
|
|
51
|
+
this.timeoutMs = opts.timeoutMs ?? 30000;
|
|
52
|
+
}
|
|
53
|
+
static fromEnv(projectGroupNo) {
|
|
54
|
+
const resolved = (projectGroupNo ?? process.env.SANDBOX_PROJECT_GROUP_NO ?? "").trim();
|
|
55
|
+
if (!resolved) {
|
|
56
|
+
throw new Error("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO");
|
|
57
|
+
}
|
|
58
|
+
const gatewayBase = normalizeGatewayBase(process.env.SCRIPTCTL_GATEWAY_URL || process.env.AWB_BASE_URL || "");
|
|
59
|
+
if (!gatewayBase) {
|
|
60
|
+
throw new Error("gateway URL missing; set SCRIPTCTL_GATEWAY_URL or AWB_BASE_URL");
|
|
61
|
+
}
|
|
62
|
+
const accessKey = (process.env.SCRIPTCTL_ACCESS_KEY ||
|
|
63
|
+
process.env.AWB_ACCESS_KEY ||
|
|
64
|
+
process.env.AWB_CODE ||
|
|
65
|
+
process.env.X_ACCESS_KEY ||
|
|
66
|
+
"").trim();
|
|
67
|
+
if (!accessKey) {
|
|
68
|
+
throw new Error("access key missing; set SCRIPTCTL_ACCESS_KEY, AWB_ACCESS_KEY, AWB_CODE, or X_ACCESS_KEY");
|
|
69
|
+
}
|
|
70
|
+
return new ScriptOutputClient({ gatewayBase, projectGroupNo: resolved, accessKey });
|
|
71
|
+
}
|
|
72
|
+
get projectPrefix() {
|
|
73
|
+
return `${SCRIPT_OUTPUT_PREFIX}/${quotePath(this.projectGroupNo)}`;
|
|
74
|
+
}
|
|
75
|
+
async getScript() {
|
|
76
|
+
return (await this.request("GET", this.projectPrefix, { allowMissing: true }));
|
|
77
|
+
}
|
|
78
|
+
async getRevision() {
|
|
79
|
+
return (await this.request("GET", `${this.projectPrefix}/revision`, { allowMissing: true }));
|
|
80
|
+
}
|
|
81
|
+
async replaceScript(opts) {
|
|
82
|
+
return (await this.request("PUT", this.projectPrefix, {
|
|
83
|
+
body: {
|
|
84
|
+
requestId: opts.requestId,
|
|
85
|
+
baseRevision: opts.baseRevision,
|
|
86
|
+
source: opts.source ?? "ctl",
|
|
87
|
+
script: opts.script,
|
|
88
|
+
},
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
async saveValidationResult(opts) {
|
|
92
|
+
return (await this.request("POST", `${this.projectPrefix}/validation-result`, {
|
|
93
|
+
body: {
|
|
94
|
+
revision: opts.revision,
|
|
95
|
+
validationStatus: opts.validationStatus,
|
|
96
|
+
validationSummary: opts.validationSummary,
|
|
97
|
+
issues: opts.issues,
|
|
98
|
+
},
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
async request(method, path, opts = {}) {
|
|
102
|
+
const rawBody = opts.body === undefined ? undefined : JSON.stringify(opts.body);
|
|
103
|
+
const headers = {
|
|
104
|
+
Accept: "application/json",
|
|
105
|
+
"X-Access-Key": this.accessKey,
|
|
106
|
+
};
|
|
107
|
+
if (rawBody !== undefined)
|
|
108
|
+
headers["Content-Type"] = "application/json; charset=utf-8";
|
|
109
|
+
const controller = new AbortController();
|
|
110
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
111
|
+
let response;
|
|
112
|
+
let text;
|
|
113
|
+
let status;
|
|
114
|
+
try {
|
|
115
|
+
response = await fetch(`${this.gatewayBase}${path}`, {
|
|
116
|
+
method,
|
|
117
|
+
headers,
|
|
118
|
+
body: rawBody,
|
|
119
|
+
signal: controller.signal,
|
|
120
|
+
});
|
|
121
|
+
status = response.status;
|
|
122
|
+
text = await response.text();
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
126
|
+
throw new ScriptOutputApiError("Gateway request timed out");
|
|
127
|
+
}
|
|
128
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
129
|
+
throw new ScriptOutputApiError(`Gateway request failed: ${reason}`);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
}
|
|
134
|
+
if (status >= 400)
|
|
135
|
+
throw apiErrorFromText(text, status);
|
|
136
|
+
let payload = null;
|
|
137
|
+
if (text) {
|
|
138
|
+
try {
|
|
139
|
+
payload = JSON.parse(text);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw new ScriptOutputApiError("Gateway response is not valid JSON", { status, payload: text });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (payload === null)
|
|
146
|
+
return null;
|
|
147
|
+
if (typeof payload !== "object")
|
|
148
|
+
return payload;
|
|
149
|
+
const obj = payload;
|
|
150
|
+
const code = obj.code;
|
|
151
|
+
if (code !== undefined && code !== null && String(code) !== "200") {
|
|
152
|
+
const message = String(obj.msg ?? obj.message ?? "script-output API failed");
|
|
153
|
+
if (opts.allowMissing && typeof message === "string" && message.includes("剧本不存在"))
|
|
154
|
+
return null;
|
|
155
|
+
throw new ScriptOutputApiError(message, { status, code: code, payload: obj });
|
|
156
|
+
}
|
|
157
|
+
return obj.data ?? obj;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=script-output-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-output-api.js","sourceRoot":"","sources":["../../src/infra/script-output-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface ArtifactStore {
|
|
2
|
+
exists(p: string): boolean;
|
|
3
|
+
readText(p: string): string;
|
|
4
|
+
writeText(p: string, text: string): void;
|
|
5
|
+
readJson<T = unknown>(p: string): T;
|
|
6
|
+
writeJson(p: string, data: unknown): void;
|
|
7
|
+
list(p: string, pattern?: string): string[];
|
|
8
|
+
delete(p: string): void;
|
|
9
|
+
deleteTree(p: string): void;
|
|
10
|
+
copyToPath(src: string, dst: string): void;
|
|
11
|
+
}
|
|
12
|
+
export declare class WorkspaceLayout {
|
|
13
|
+
readonly workspace: string;
|
|
14
|
+
constructor(workspace: string);
|
|
15
|
+
get sourceText(): string;
|
|
16
|
+
get directDir(): string;
|
|
17
|
+
get directScript(): string;
|
|
18
|
+
get validation(): string;
|
|
19
|
+
get runState(): string;
|
|
20
|
+
get episodeResultsDir(): string;
|
|
21
|
+
get batchResultsDir(): string;
|
|
22
|
+
outputScript(outputDir: string): string;
|
|
23
|
+
}
|
|
24
|
+
export declare class LocalArtifactStore implements ArtifactStore {
|
|
25
|
+
exists(p: string): boolean;
|
|
26
|
+
readText(p: string): string;
|
|
27
|
+
writeText(p: string, text: string): void;
|
|
28
|
+
readJson<T = unknown>(p: string): T;
|
|
29
|
+
writeJson(p: string, data: unknown): void;
|
|
30
|
+
list(p: string, pattern?: string): string[];
|
|
31
|
+
delete(p: string): void;
|
|
32
|
+
deleteTree(p: string): void;
|
|
33
|
+
copyToPath(src: string, dst: string): void;
|
|
34
|
+
}
|
|
35
|
+
export declare const DEFAULT_STORE: ArtifactStore;
|