@lingjingai/scriptctl 0.25.1 → 0.25.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +28 -2
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +1 -0
- package/dist/domain/direct-core.d.ts +11 -0
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/domain/loom/checkpointer.d.ts +3 -0
- package/dist/domain/loom/checkpointer.js +30 -0
- package/dist/domain/loom/checkpointer.js.map +1 -0
- package/dist/domain/loom/index.d.ts +44 -0
- package/dist/domain/loom/index.js +275 -0
- package/dist/domain/loom/index.js.map +1 -0
- package/dist/domain/loom/types.d.ts +100 -0
- package/dist/domain/loom/types.js +2 -0
- package/dist/domain/loom/types.js.map +1 -0
- package/dist/domain/script/patch/apply.js +1 -1
- package/dist/domain/script/patch/apply.js.map +1 -1
- package/dist/domain/script/patch/ops-meta.d.ts +2 -0
- package/dist/domain/script/patch/ops-meta.js +36 -1
- package/dist/domain/script/patch/ops-meta.js.map +1 -1
- package/dist/domain/script/patch/registry.js +3 -1
- package/dist/domain/script/patch/registry.js.map +1 -1
- package/dist/domain/script/schema.js +2 -0
- package/dist/domain/script/schema.js.map +1 -1
- package/dist/help-text.js +59 -9
- package/dist/help-text.js.map +1 -1
- package/dist/infra/providers.d.ts +40 -0
- package/dist/infra/providers.js +282 -2
- package/dist/infra/providers.js.map +1 -1
- package/dist/output.js +31 -0
- package/dist/output.js.map +1 -1
- package/dist/usecases/direct.js +20 -1
- package/dist/usecases/direct.js.map +1 -1
- package/dist/usecases/parse.js +22 -5
- package/dist/usecases/parse.js.map +1 -1
- package/dist/usecases/script/actions.js +3 -7
- package/dist/usecases/script/actions.js.map +1 -1
- package/dist/usecases/script/episodes.js +16 -1
- package/dist/usecases/script/episodes.js.map +1 -1
- package/dist/usecases/script/lib.d.ts +1 -0
- package/dist/usecases/script/lib.js +43 -10
- package/dist/usecases/script/lib.js.map +1 -1
- package/dist/usecases/script/synopsis-generate.d.ts +116 -0
- package/dist/usecases/script/synopsis-generate.js +801 -0
- package/dist/usecases/script/synopsis-generate.js.map +1 -0
- package/dist/usecases/script/synopsis.d.ts +3 -0
- package/dist/usecases/script/synopsis.js +41 -0
- package/dist/usecases/script/synopsis.js.map +1 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/script/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/script/schema.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,uEAAuE;AAOvE,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,OAAO;IACP,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC7H,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC5G,QAAQ;IACR,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE;IACxI,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACrG,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAClH,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE;IACzI,QAAQ;IACR,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE;IAC5K,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACzH,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC7G,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE;IAC1H,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC1H,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE;IACzH,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC9G,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC5G,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACpG,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACvG,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACvH,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAClH,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE;IAC3H,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,qEAAqE,EAAE;IACnK,SAAS;IACT,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,kDAAkD,EAAE;IAC9H,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC3G,wBAAwB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE;IAC5I,8BAA8B,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,uFAAuF,EAAE;IAC9L,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE;IACpJ,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACzH,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACnI,yBAAyB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE;IAChH,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE;IAC1G,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC5K,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE;IACjH,QAAQ;IACR,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE;IAChI,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE;IACrH,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6DAA6D,EAAE;IACrI,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE;IACjH,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAClK,UAAU;IACV,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE;IACnK,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACvG,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,6CAA6C,EAAE;IAC9H,qBAAqB;IACrB,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,6DAA6D,EAAE;IACzJ,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE;IAC7G,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC1I,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE;IACtK,8CAA8C;IAC9C,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,qOAAqO,EAAE;IACpT,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,qJAAqJ,EAAE;CAC5N,CAAC"}
|
package/dist/help-text.js
CHANGED
|
@@ -19,9 +19,9 @@ Workflow groups
|
|
|
19
19
|
|
|
20
20
|
Query (plural-noun)
|
|
21
21
|
- summary title + counts of episodes / scenes / actions / assets / speakers
|
|
22
|
-
- episodes
|
|
22
|
+
- episodes TSV rows: addr, title, counts, chars, synopsis
|
|
23
23
|
- scenes per-scene line with asset names; filters: --in / --has-actor / --has-location / --has-prop
|
|
24
|
-
- actions
|
|
24
|
+
- actions TSV rows: addr, type, delivery, speaker, actor, content; filters: --in / --grep / --type / --actor / --speaker / --has / --context
|
|
25
25
|
|
|
26
26
|
--in accepts a multi-region selector: comma-separated regions, each a point or
|
|
27
27
|
a lo..hi range, e.g. --in "ep_003..ep_007,ep_010,ep_012/scn_001..ep_012/scn_004".
|
|
@@ -67,6 +67,7 @@ Edit asset metadata
|
|
|
67
67
|
- alias <addr> [--add X --remove Y]
|
|
68
68
|
- role <actor:id> <主角|配角>
|
|
69
69
|
- worldview <value>
|
|
70
|
+
- synopsis <text> | synopsis <ep_NNN> <text> whole-script or per-episode synopsis
|
|
70
71
|
- extend <addr> [key] [value] free-form extend{} namespace (any dimension; --json-value / --clear; no key = read)
|
|
71
72
|
|
|
72
73
|
State / transition / context
|
|
@@ -91,7 +92,8 @@ Doctor
|
|
|
91
92
|
- doctor Check CLI runtime, dependencies, env, and storage.
|
|
92
93
|
|
|
93
94
|
Options
|
|
94
|
-
- --json Print
|
|
95
|
+
- --json Print JSON envelope for deterministic programs (jq/scripts); default text is agent-facing TSV when rows exist.
|
|
96
|
+
- --format addr Print only rows[].addr for xargs / do-script generation.
|
|
95
97
|
- --help Show help for a command.
|
|
96
98
|
|
|
97
99
|
Exit codes
|
|
@@ -388,7 +390,7 @@ Target selection (applies to every query / edit verb)
|
|
|
388
390
|
|
|
389
391
|
Options
|
|
390
392
|
- --workspace-path Workspace directory. Default: workspace
|
|
391
|
-
- --json Print
|
|
393
|
+
- --json Print JSON envelope for deterministic programs. Avoid unless parsing.
|
|
392
394
|
- --help Show this help.
|
|
393
395
|
|
|
394
396
|
Read-only. Always safe to run.
|
|
@@ -396,7 +398,7 @@ Read-only. Always safe to run.
|
|
|
396
398
|
],
|
|
397
399
|
[
|
|
398
400
|
["episodes"],
|
|
399
|
-
`List episodes with per-episode counts
|
|
401
|
+
`List episodes as TSV rows with per-episode counts, char totals, and synopsis.
|
|
400
402
|
|
|
401
403
|
Usage
|
|
402
404
|
- scriptctl episodes [options]
|
|
@@ -406,10 +408,12 @@ Options
|
|
|
406
408
|
- --in <selector> Multi-region selector, e.g. "ep_003..ep_007,ep_010".
|
|
407
409
|
- --min-chars <n> Only episodes with total chars >= N.
|
|
408
410
|
- --max-chars <n> Only episodes with total chars <= N.
|
|
411
|
+
- --format addr Print only episode ids.
|
|
409
412
|
- --draft / --project-group-no / --workspace-path / --json / --help
|
|
410
413
|
|
|
411
|
-
|
|
412
|
-
-
|
|
414
|
+
Default output
|
|
415
|
+
- TSV header + one row per episode:
|
|
416
|
+
addr episode_id title scenes actions chars_total chars_dialogue chars_action synopsis
|
|
413
417
|
|
|
414
418
|
Examples
|
|
415
419
|
- scriptctl episodes
|
|
@@ -444,6 +448,7 @@ Examples
|
|
|
444
448
|
[
|
|
445
449
|
["actions"],
|
|
446
450
|
`Search actions across the script (the workhorse for "find where to edit").
|
|
451
|
+
Default output is TSV: addr, type, delivery, speaker, actor, content.
|
|
447
452
|
|
|
448
453
|
Usage
|
|
449
454
|
- scriptctl actions [options]
|
|
@@ -461,8 +466,9 @@ Options
|
|
|
461
466
|
Requires at least one of: --in, --grep, --type, --actor, --speaker, --has. Bare \`scriptctl actions\`
|
|
462
467
|
errors out — dumping every action across all episodes is too large.
|
|
463
468
|
|
|
464
|
-
|
|
465
|
-
-
|
|
469
|
+
Default output
|
|
470
|
+
- TSV header + one row per action:
|
|
471
|
+
addr type delivery speaker actor content
|
|
466
472
|
|
|
467
473
|
Examples
|
|
468
474
|
- scriptctl actions --grep "台下掌声雷动"
|
|
@@ -918,6 +924,50 @@ Value must match the supported enum (see SCRIPT_SCHEMA worldview values).
|
|
|
918
924
|
|
|
919
925
|
Example
|
|
920
926
|
- scriptctl worldview 现代
|
|
927
|
+
`,
|
|
928
|
+
],
|
|
929
|
+
[
|
|
930
|
+
["synopsis"],
|
|
931
|
+
`Set the whole-script synopsis or one episode's synopsis.
|
|
932
|
+
|
|
933
|
+
Usage
|
|
934
|
+
- scriptctl synopsis <text> # set script.synopsis
|
|
935
|
+
- scriptctl synopsis <ep_NNN> <text> # set episode.synopsis
|
|
936
|
+
- scriptctl synopsis generate --apply # generate missing synopsis fields
|
|
937
|
+
|
|
938
|
+
Patch ops
|
|
939
|
+
- meta.synopsis.set
|
|
940
|
+
- episode.synopsis.set
|
|
941
|
+
|
|
942
|
+
Examples
|
|
943
|
+
- scriptctl synopsis "陈墨归国复仇,与苏晴重逢,围绕林氏集团的阴谋逐步展开。"
|
|
944
|
+
- scriptctl synopsis ep_001 "陈墨第一时间来到总裁办公室,与苏晴重逢。"
|
|
945
|
+
`,
|
|
946
|
+
],
|
|
947
|
+
[
|
|
948
|
+
["synopsis", "generate"],
|
|
949
|
+
`Generate missing episode and whole-script synopsis fields from script.json.
|
|
950
|
+
|
|
951
|
+
Usage
|
|
952
|
+
- scriptctl synopsis generate --script-path output/script.json
|
|
953
|
+
- scriptctl synopsis generate --script-path output/script.json --apply
|
|
954
|
+
- scriptctl synopsis generate --script-path output/script.json --overwrite --apply
|
|
955
|
+
|
|
956
|
+
Behavior
|
|
957
|
+
- Default is dry-run: runs extraction and validation but does not write.
|
|
958
|
+
- Without --overwrite, existing episode synopsis fields are reused and only missing
|
|
959
|
+
fields are filled.
|
|
960
|
+
- Whole-script fields are generated when any of synopsis/theme/logline/style/main_characters
|
|
961
|
+
is missing; --overwrite regenerates them.
|
|
962
|
+
- Uses a text-output contract and parser, not tool_use.
|
|
963
|
+
|
|
964
|
+
Options
|
|
965
|
+
- --provider <name> openai | anthropic | mock. Default: openai
|
|
966
|
+
- --model <model> model name for the provider. Default: deepseek-v4-pro-packy
|
|
967
|
+
- --concurrency <n> parallel chunk extraction, default 30
|
|
968
|
+
- --checkpoint <dir> checkpoint directory, default workspace direct loom dir
|
|
969
|
+
- --overwrite regenerate existing synopsis fields
|
|
970
|
+
- --apply write script.json
|
|
921
971
|
`,
|
|
922
972
|
],
|
|
923
973
|
[
|
package/dist/help-text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAuC;IACvD;QACE,EAAE;QACF
|
|
1
|
+
{"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { type ProviderLike } from "../domain/direct-core.js";
|
|
2
2
|
type Dict = Record<string, unknown>;
|
|
3
|
+
export interface ProviderCapabilities {
|
|
4
|
+
completeText: boolean;
|
|
5
|
+
extractBatch: boolean;
|
|
6
|
+
extractEpisode: boolean;
|
|
7
|
+
extractMetadata: boolean;
|
|
8
|
+
extractEpisodeTitles: boolean;
|
|
9
|
+
extractEpisodeSynopsis: boolean;
|
|
10
|
+
extractScriptSynopsis: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function providerCapabilities(name: string): ProviderCapabilities | null;
|
|
3
13
|
export declare class MockProvider implements ProviderLike {
|
|
4
14
|
readonly name = "mock";
|
|
15
|
+
completeText(request: {
|
|
16
|
+
system: string;
|
|
17
|
+
user: string;
|
|
18
|
+
}): {
|
|
19
|
+
text: string;
|
|
20
|
+
raw: Dict;
|
|
21
|
+
};
|
|
5
22
|
extractEpisode(sourceText: string, episodePlan: Dict): Dict;
|
|
6
23
|
extractBatch(sourceText: string, batchPlan: Dict): Dict;
|
|
7
24
|
extractMetadata(_sourceText: string, script: Dict): Dict;
|
|
@@ -15,6 +32,7 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
15
32
|
private readonly model;
|
|
16
33
|
constructor(model: string);
|
|
17
34
|
private messageRequest;
|
|
35
|
+
private textMessageRequest;
|
|
18
36
|
private collectResponseText;
|
|
19
37
|
/**
|
|
20
38
|
* Run a request that forces a specific tool call via `tool_choice`, then return that
|
|
@@ -33,6 +51,13 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
33
51
|
*/
|
|
34
52
|
private runToolUse;
|
|
35
53
|
extractEpisode(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
54
|
+
completeText(request: {
|
|
55
|
+
system: string;
|
|
56
|
+
user: string;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
text: string;
|
|
59
|
+
raw: Dict;
|
|
60
|
+
}>;
|
|
36
61
|
extractBatch(sourceText: string, batchPlan: Dict): Promise<Dict>;
|
|
37
62
|
extractEpisodeTitles(sourceText: string, episodePlan: Dict): Promise<Dict>;
|
|
38
63
|
extractMetadata(_sourceText: string, script: Dict): Promise<Dict>;
|
|
@@ -41,5 +66,20 @@ export declare class AnthropicProvider implements ProviderLike {
|
|
|
41
66
|
extractEpisodeSynopsis(synopses: string[], ctx: Dict): Promise<Dict>;
|
|
42
67
|
extractScriptSynopsis(synopses: string[], ctx: Dict): Promise<Dict>;
|
|
43
68
|
}
|
|
69
|
+
export declare class OpenAICompatibleProvider implements ProviderLike {
|
|
70
|
+
readonly name = "openai";
|
|
71
|
+
private readonly apiKey;
|
|
72
|
+
private readonly endpoint;
|
|
73
|
+
private readonly model;
|
|
74
|
+
constructor(model: string);
|
|
75
|
+
completeText(request: {
|
|
76
|
+
system: string;
|
|
77
|
+
user: string;
|
|
78
|
+
signal?: AbortSignal;
|
|
79
|
+
}): Promise<{
|
|
80
|
+
text: string;
|
|
81
|
+
raw: Dict;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
44
84
|
export declare function makeProvider(name: string, model: string): ProviderLike;
|
|
45
85
|
export {};
|
package/dist/infra/providers.js
CHANGED
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import { CliError, DEFAULT_BATCH_MAX_TOKENS, DEFAULT_MAX_TOKENS, DEFAULT_THINKING_BUDGET_TOKENS, EPISODE_SYNOPSIS_SCHEMA, EPISODE_TITLE_EXTRACTION_SCHEMA, EXIT_RUNTIME, EXIT_USAGE, DEFAULT_METADATA_ASSET_CHUNK, MARKDOWN_BATCH_PROMPT_SPEC, METADATA_DESC_MD_SPEC, METADATA_GLOBAL_MD_SPEC, SCRIPT_SYNOPSIS_SCHEMA, } from "../common.js";
|
|
3
3
|
import { _md_push_asset, _normalize_speaker_list, assembleMetadataFromParts, cleanSynopsisList, buildEpisodeTitleContext, buildMetadataContext, deterministicEpisodeShortTitle, deterministicExtractEpisode, deterministicExtractMetadata, episodesNeedingGeneratedTitles, formatBatchSource, isRetryableProviderError, parseAssetDescriptionsMd, parseGlobalMetadataMd, parseMarkdownBatch, providerAttempts, } from "../domain/direct-core.js";
|
|
4
|
+
const PROVIDER_CAPABILITIES = {
|
|
5
|
+
mock: {
|
|
6
|
+
completeText: true,
|
|
7
|
+
extractBatch: true,
|
|
8
|
+
extractEpisode: true,
|
|
9
|
+
extractMetadata: true,
|
|
10
|
+
extractEpisodeTitles: true,
|
|
11
|
+
extractEpisodeSynopsis: true,
|
|
12
|
+
extractScriptSynopsis: true,
|
|
13
|
+
},
|
|
14
|
+
anthropic: {
|
|
15
|
+
completeText: true,
|
|
16
|
+
extractBatch: true,
|
|
17
|
+
extractEpisode: true,
|
|
18
|
+
extractMetadata: true,
|
|
19
|
+
extractEpisodeTitles: true,
|
|
20
|
+
extractEpisodeSynopsis: true,
|
|
21
|
+
extractScriptSynopsis: true,
|
|
22
|
+
},
|
|
23
|
+
openai: {
|
|
24
|
+
completeText: true,
|
|
25
|
+
extractBatch: false,
|
|
26
|
+
extractEpisode: false,
|
|
27
|
+
extractMetadata: false,
|
|
28
|
+
extractEpisodeTitles: false,
|
|
29
|
+
extractEpisodeSynopsis: false,
|
|
30
|
+
extractScriptSynopsis: false,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export function providerCapabilities(name) {
|
|
34
|
+
return PROVIDER_CAPABILITIES[name] ?? null;
|
|
35
|
+
}
|
|
4
36
|
function strOf(v) {
|
|
5
37
|
if (v === null || v === undefined)
|
|
6
38
|
return "";
|
|
@@ -12,6 +44,9 @@ function isList(v) {
|
|
|
12
44
|
function asList(v) {
|
|
13
45
|
return Array.isArray(v) ? v : [];
|
|
14
46
|
}
|
|
47
|
+
function isDict(v) {
|
|
48
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
49
|
+
}
|
|
15
50
|
function sleepMs(ms) {
|
|
16
51
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
52
|
}
|
|
@@ -20,6 +55,76 @@ function sleepMs(ms) {
|
|
|
20
55
|
// ---------------------------------------------------------------------------
|
|
21
56
|
export class MockProvider {
|
|
22
57
|
name = "mock";
|
|
58
|
+
completeText(request) {
|
|
59
|
+
const system = request.system;
|
|
60
|
+
const user = request.user;
|
|
61
|
+
let text = "";
|
|
62
|
+
if (system.includes("## 片段梗概")) {
|
|
63
|
+
const body = firstNonEmptySourceLine(user);
|
|
64
|
+
text = [
|
|
65
|
+
"## 片段梗概",
|
|
66
|
+
`片段梗概:${body}`,
|
|
67
|
+
"",
|
|
68
|
+
"## 关键事件",
|
|
69
|
+
`- ${body}`,
|
|
70
|
+
"",
|
|
71
|
+
"## 人物变化",
|
|
72
|
+
"- 陈默 | 继续推进当前剧情",
|
|
73
|
+
"",
|
|
74
|
+
"## 结尾钩子",
|
|
75
|
+
body,
|
|
76
|
+
].join("\n");
|
|
77
|
+
}
|
|
78
|
+
else if (system.includes("## 分集梗概")) {
|
|
79
|
+
const body = firstNonEmptySourceLine(user);
|
|
80
|
+
text = [
|
|
81
|
+
"## 分集梗概",
|
|
82
|
+
`分集梗概:${body}`,
|
|
83
|
+
"",
|
|
84
|
+
"## 单句梗概",
|
|
85
|
+
body,
|
|
86
|
+
"",
|
|
87
|
+
"## 关键事件",
|
|
88
|
+
`- ${body}`,
|
|
89
|
+
].join("\n");
|
|
90
|
+
}
|
|
91
|
+
else if (system.includes("## 阶段梗概")) {
|
|
92
|
+
const body = firstNonEmptySourceLine(user);
|
|
93
|
+
text = [
|
|
94
|
+
"## 阶段梗概",
|
|
95
|
+
`阶段梗概:${body}`,
|
|
96
|
+
"",
|
|
97
|
+
"## 关键转折",
|
|
98
|
+
`- ${body}`,
|
|
99
|
+
"",
|
|
100
|
+
"## 未解决悬念",
|
|
101
|
+
"- ",
|
|
102
|
+
].join("\n");
|
|
103
|
+
}
|
|
104
|
+
else if (system.includes("## 全文梗概")) {
|
|
105
|
+
const body = firstNonEmptySourceLine(user);
|
|
106
|
+
text = [
|
|
107
|
+
"## 全文梗概",
|
|
108
|
+
`全文梗概:${body}`,
|
|
109
|
+
"",
|
|
110
|
+
"## 主题",
|
|
111
|
+
"mock-theme",
|
|
112
|
+
"",
|
|
113
|
+
"## 一句话",
|
|
114
|
+
"mock-logline",
|
|
115
|
+
"",
|
|
116
|
+
"## 风格",
|
|
117
|
+
"mock-style",
|
|
118
|
+
"",
|
|
119
|
+
"## 主要人物",
|
|
120
|
+
"- 陈默 | 主角",
|
|
121
|
+
].join("\n");
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
text = firstNonEmptySourceLine(user);
|
|
125
|
+
}
|
|
126
|
+
return { text, raw: { provider: "mock", system, user } };
|
|
127
|
+
}
|
|
23
128
|
extractEpisode(sourceText, episodePlan) {
|
|
24
129
|
return this.extractBatch(sourceText, episodePlan);
|
|
25
130
|
}
|
|
@@ -141,6 +246,10 @@ export class AnthropicProvider {
|
|
|
141
246
|
}
|
|
142
247
|
return request;
|
|
143
248
|
}
|
|
249
|
+
textMessageRequest(system, user, maxTokens) {
|
|
250
|
+
const request = this.messageRequest(user, maxTokens);
|
|
251
|
+
return system.trim() ? { ...request, system } : request;
|
|
252
|
+
}
|
|
144
253
|
async collectResponseText(request) {
|
|
145
254
|
// Non-streaming: the LiteLLM gateway drops idle streaming connections
|
|
146
255
|
// ("Premature close"), so every extraction uses the create path and is sized
|
|
@@ -197,6 +306,29 @@ export class AnthropicProvider {
|
|
|
197
306
|
extractEpisode(sourceText, episodePlan) {
|
|
198
307
|
return this.extractBatch(sourceText, episodePlan);
|
|
199
308
|
}
|
|
309
|
+
async completeText(request) {
|
|
310
|
+
const msg = this.textMessageRequest(request.system, request.user, DEFAULT_BATCH_MAX_TOKENS);
|
|
311
|
+
const [raw, stopReason] = await this.collectResponseTextWithRetry(msg);
|
|
312
|
+
if (stopReason === "max_tokens") {
|
|
313
|
+
throw new CliError("LLM FAILED: Provider output truncated", "Provider output truncated.", {
|
|
314
|
+
exitCode: EXIT_RUNTIME,
|
|
315
|
+
required: ["complete text within provider max_tokens"],
|
|
316
|
+
received: [`stop_reason: ${stopReason}`, `max_tokens: ${msg.max_tokens}`, `raw chars: ${raw.length}`, `tail: ${raw.slice(-160) || "<empty response>"}`],
|
|
317
|
+
nextSteps: ["Rerun the command; completed checkpoints will be reused. If this repeats, lower the input chunk size."],
|
|
318
|
+
errorCode: "PROVIDER_OUTPUT_TRUNCATED",
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
if (!raw.trim()) {
|
|
322
|
+
throw new CliError("LLM FAILED: Provider returned empty text", "Provider returned an empty response.", {
|
|
323
|
+
exitCode: EXIT_RUNTIME,
|
|
324
|
+
required: ["non-empty text response"],
|
|
325
|
+
received: [`stop_reason: ${stopReason || "unknown"}`, "raw chars: 0"],
|
|
326
|
+
nextSteps: ["Rerun with a smaller chunk or adjust the prompt/spec."],
|
|
327
|
+
errorCode: "PROVIDER_EMPTY_RESPONSE",
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
return { text: raw, raw: { stop_reason: stopReason } };
|
|
331
|
+
}
|
|
200
332
|
async extractBatch(sourceText, batchPlan) {
|
|
201
333
|
const context = isList(batchPlan["context"]) || typeof batchPlan["context"] === "object" && batchPlan["context"] !== null
|
|
202
334
|
? batchPlan["context"]
|
|
@@ -422,6 +554,95 @@ export class AnthropicProvider {
|
|
|
422
554
|
});
|
|
423
555
|
}
|
|
424
556
|
}
|
|
557
|
+
// ---------------------------------------------------------------------------
|
|
558
|
+
// OpenAI-compatible text provider
|
|
559
|
+
// ---------------------------------------------------------------------------
|
|
560
|
+
const OPENAI_TEXT_MAX_TOKENS = 4096;
|
|
561
|
+
export class OpenAICompatibleProvider {
|
|
562
|
+
name = "openai";
|
|
563
|
+
apiKey;
|
|
564
|
+
endpoint;
|
|
565
|
+
model;
|
|
566
|
+
constructor(model) {
|
|
567
|
+
const apiKey = (process.env.PROJECT_LITELLM_GATEWAY_API_KEY ?? "").trim();
|
|
568
|
+
if (!apiKey) {
|
|
569
|
+
throw new CliError("INIT FAILED: provider not configured", "Provider credentials are not configured for this environment.", {
|
|
570
|
+
exitCode: EXIT_RUNTIME,
|
|
571
|
+
required: ["PROJECT_LITELLM_GATEWAY_API_KEY"],
|
|
572
|
+
received: ["no API key environment variable"],
|
|
573
|
+
nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
|
|
574
|
+
errorCode: "PROVIDER_AUTH_MISSING",
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
const baseUrl = (process.env.PROJECT_LITELLM_GATEWAY_BASE_URL ?? "").trim();
|
|
578
|
+
if (!baseUrl) {
|
|
579
|
+
throw new CliError("INIT FAILED: provider not configured", "Provider endpoint is not configured for this environment.", {
|
|
580
|
+
exitCode: EXIT_RUNTIME,
|
|
581
|
+
required: ["PROJECT_LITELLM_GATEWAY_BASE_URL"],
|
|
582
|
+
received: ["no provider base URL"],
|
|
583
|
+
nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
|
|
584
|
+
errorCode: "PROVIDER_ENDPOINT_MISSING",
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
this.apiKey = apiKey;
|
|
588
|
+
this.endpoint = openAiChatCompletionsEndpoint(baseUrl);
|
|
589
|
+
this.model = model;
|
|
590
|
+
}
|
|
591
|
+
async completeText(request) {
|
|
592
|
+
const messages = [];
|
|
593
|
+
const system = request.system.trim();
|
|
594
|
+
if (system)
|
|
595
|
+
messages.push({ role: "system", content: system });
|
|
596
|
+
messages.push({ role: "user", content: request.user });
|
|
597
|
+
const body = {
|
|
598
|
+
model: this.model,
|
|
599
|
+
messages,
|
|
600
|
+
max_tokens: OPENAI_TEXT_MAX_TOKENS,
|
|
601
|
+
};
|
|
602
|
+
const response = await fetch(this.endpoint, {
|
|
603
|
+
method: "POST",
|
|
604
|
+
headers: {
|
|
605
|
+
"authorization": `Bearer ${this.apiKey}`,
|
|
606
|
+
"content-type": "application/json",
|
|
607
|
+
},
|
|
608
|
+
body: JSON.stringify(body),
|
|
609
|
+
signal: request.signal,
|
|
610
|
+
});
|
|
611
|
+
const rawBody = await response.text();
|
|
612
|
+
if (!response.ok) {
|
|
613
|
+
throw new CliError("LLM FAILED: Provider request failed", "Provider request failed.", {
|
|
614
|
+
exitCode: EXIT_RUNTIME,
|
|
615
|
+
required: ["successful OpenAI-compatible chat completion"],
|
|
616
|
+
received: [`status: ${response.status}`, `body: ${rawBody.slice(0, 500) || "<empty response>"}`],
|
|
617
|
+
nextSteps: ["Check the provider name/model and rerun; completed checkpoints will be reused."],
|
|
618
|
+
errorCode: "PROVIDER_REQUEST_FAILED",
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
const payload = parseJsonDict(rawBody, "LLM FAILED: Provider returned invalid JSON");
|
|
622
|
+
const choice = firstOpenAiChoice(payload);
|
|
623
|
+
const finishReason = choice ? strOf(choice["finish_reason"]).trim() : "";
|
|
624
|
+
const text = openAiChoiceContent(choice).trim();
|
|
625
|
+
if (finishReason === "length") {
|
|
626
|
+
throw new CliError("LLM FAILED: Provider output truncated", "Provider output truncated.", {
|
|
627
|
+
exitCode: EXIT_RUNTIME,
|
|
628
|
+
required: ["complete text within provider max_tokens"],
|
|
629
|
+
received: [`finish_reason: ${finishReason}`, `max_tokens: ${OPENAI_TEXT_MAX_TOKENS}`, `raw chars: ${text.length}`, `tail: ${text.slice(-160) || "<empty response>"}`],
|
|
630
|
+
nextSteps: ["Rerun the command; completed checkpoints will be reused. If this repeats, lower the input chunk size."],
|
|
631
|
+
errorCode: "PROVIDER_OUTPUT_TRUNCATED",
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
if (!text) {
|
|
635
|
+
throw new CliError("LLM FAILED: Provider returned empty text", "Provider returned an empty response.", {
|
|
636
|
+
exitCode: EXIT_RUNTIME,
|
|
637
|
+
required: ["non-empty text response"],
|
|
638
|
+
received: [`finish_reason: ${finishReason || "unknown"}`, `raw chars: ${rawBody.length}`],
|
|
639
|
+
nextSteps: ["Rerun with a smaller chunk or adjust the prompt/spec."],
|
|
640
|
+
errorCode: "PROVIDER_EMPTY_RESPONSE",
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
return { text, raw: { finish_reason: finishReason } };
|
|
644
|
+
}
|
|
645
|
+
}
|
|
425
646
|
function textFromResponse(response) {
|
|
426
647
|
const parts = [];
|
|
427
648
|
for (const block of response.content ?? []) {
|
|
@@ -430,6 +651,10 @@ function textFromResponse(response) {
|
|
|
430
651
|
}
|
|
431
652
|
return parts.join("\n").trim();
|
|
432
653
|
}
|
|
654
|
+
function firstNonEmptySourceLine(text) {
|
|
655
|
+
const lines = text.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
|
|
656
|
+
return lines.find((line) => !line.endsWith(":") && !line.endsWith(":")) ?? lines[0] ?? "";
|
|
657
|
+
}
|
|
433
658
|
/**
|
|
434
659
|
* Find a forced tool_use block by name in a Message's content array.
|
|
435
660
|
* Returns its `input` (already parsed by the SDK) or `null` when missing/non-object.
|
|
@@ -445,6 +670,59 @@ function findToolUseInput(content, toolName) {
|
|
|
445
670
|
}
|
|
446
671
|
return null;
|
|
447
672
|
}
|
|
673
|
+
function openAiChatCompletionsEndpoint(baseUrl) {
|
|
674
|
+
const base = baseUrl.trim().replace(/\/+$/, "");
|
|
675
|
+
if (base.endsWith("/chat/completions"))
|
|
676
|
+
return base;
|
|
677
|
+
if (base.endsWith("/v1"))
|
|
678
|
+
return `${base}/chat/completions`;
|
|
679
|
+
return `${base}/v1/chat/completions`;
|
|
680
|
+
}
|
|
681
|
+
function parseJsonDict(raw, title) {
|
|
682
|
+
try {
|
|
683
|
+
const payload = JSON.parse(raw);
|
|
684
|
+
if (isDict(payload))
|
|
685
|
+
return payload;
|
|
686
|
+
}
|
|
687
|
+
catch {
|
|
688
|
+
// Fall through to the structured provider error below.
|
|
689
|
+
}
|
|
690
|
+
throw new CliError(title, "Provider returned invalid JSON.", {
|
|
691
|
+
exitCode: EXIT_RUNTIME,
|
|
692
|
+
required: ["OpenAI-compatible JSON response"],
|
|
693
|
+
received: [`body: ${raw.slice(0, 500) || "<empty response>"}`],
|
|
694
|
+
nextSteps: ["Rerun the command; completed checkpoints will be reused."],
|
|
695
|
+
errorCode: "PROVIDER_INVALID_JSON",
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
function firstOpenAiChoice(payload) {
|
|
699
|
+
const choices = payload["choices"];
|
|
700
|
+
if (!Array.isArray(choices))
|
|
701
|
+
return null;
|
|
702
|
+
for (const choice of choices) {
|
|
703
|
+
if (isDict(choice))
|
|
704
|
+
return choice;
|
|
705
|
+
}
|
|
706
|
+
return null;
|
|
707
|
+
}
|
|
708
|
+
function openAiChoiceContent(choice) {
|
|
709
|
+
if (!choice)
|
|
710
|
+
return "";
|
|
711
|
+
const message = isDict(choice["message"]) ? choice["message"] : null;
|
|
712
|
+
if (!message)
|
|
713
|
+
return "";
|
|
714
|
+
const content = message["content"];
|
|
715
|
+
if (typeof content === "string")
|
|
716
|
+
return content;
|
|
717
|
+
if (!Array.isArray(content))
|
|
718
|
+
return "";
|
|
719
|
+
const parts = [];
|
|
720
|
+
for (const item of content) {
|
|
721
|
+
if (isDict(item) && typeof item["text"] === "string")
|
|
722
|
+
parts.push(item["text"]);
|
|
723
|
+
}
|
|
724
|
+
return parts.join("\n");
|
|
725
|
+
}
|
|
448
726
|
// ---------------------------------------------------------------------------
|
|
449
727
|
// Factory
|
|
450
728
|
// ---------------------------------------------------------------------------
|
|
@@ -453,11 +731,13 @@ export function makeProvider(name, model) {
|
|
|
453
731
|
return new MockProvider();
|
|
454
732
|
if (name === "anthropic")
|
|
455
733
|
return new AnthropicProvider(model);
|
|
734
|
+
if (name === "openai")
|
|
735
|
+
return new OpenAICompatibleProvider(model);
|
|
456
736
|
throw new CliError("INIT FAILED: Unsupported provider", "Unsupported provider.", {
|
|
457
737
|
exitCode: EXIT_USAGE,
|
|
458
|
-
required: ["--provider: anthropic | mock"],
|
|
738
|
+
required: ["--provider: anthropic | openai | mock"],
|
|
459
739
|
received: [`--provider: ${name}`],
|
|
460
|
-
nextSteps: ["Use --provider anthropic or --provider mock."],
|
|
740
|
+
nextSteps: ["Use --provider anthropic, --provider openai, or --provider mock."],
|
|
461
741
|
});
|
|
462
742
|
}
|
|
463
743
|
//# sourceMappingURL=providers.js.map
|