@lingjingai/scriptctl 0.25.1 → 0.25.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cli.js +28 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common.d.ts +1 -0
  4. package/dist/domain/direct-core.d.ts +11 -0
  5. package/dist/domain/direct-core.js.map +1 -1
  6. package/dist/domain/loom/checkpointer.d.ts +3 -0
  7. package/dist/domain/loom/checkpointer.js +30 -0
  8. package/dist/domain/loom/checkpointer.js.map +1 -0
  9. package/dist/domain/loom/index.d.ts +44 -0
  10. package/dist/domain/loom/index.js +275 -0
  11. package/dist/domain/loom/index.js.map +1 -0
  12. package/dist/domain/loom/types.d.ts +100 -0
  13. package/dist/domain/loom/types.js +2 -0
  14. package/dist/domain/loom/types.js.map +1 -0
  15. package/dist/domain/script/patch/apply.js +1 -1
  16. package/dist/domain/script/patch/apply.js.map +1 -1
  17. package/dist/domain/script/patch/ops-meta.d.ts +2 -0
  18. package/dist/domain/script/patch/ops-meta.js +36 -1
  19. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  20. package/dist/domain/script/patch/registry.js +3 -1
  21. package/dist/domain/script/patch/registry.js.map +1 -1
  22. package/dist/domain/script/schema.js +2 -0
  23. package/dist/domain/script/schema.js.map +1 -1
  24. package/dist/help-text.js +59 -9
  25. package/dist/help-text.js.map +1 -1
  26. package/dist/infra/providers.d.ts +40 -0
  27. package/dist/infra/providers.js +282 -2
  28. package/dist/infra/providers.js.map +1 -1
  29. package/dist/output.js +31 -0
  30. package/dist/output.js.map +1 -1
  31. package/dist/usecases/direct.js +20 -1
  32. package/dist/usecases/direct.js.map +1 -1
  33. package/dist/usecases/parse.js +22 -5
  34. package/dist/usecases/parse.js.map +1 -1
  35. package/dist/usecases/script/actions.js +3 -7
  36. package/dist/usecases/script/actions.js.map +1 -1
  37. package/dist/usecases/script/episodes.js +16 -1
  38. package/dist/usecases/script/episodes.js.map +1 -1
  39. package/dist/usecases/script/lib.d.ts +1 -0
  40. package/dist/usecases/script/lib.js +43 -10
  41. package/dist/usecases/script/lib.js.map +1 -1
  42. package/dist/usecases/script/synopsis-generate.d.ts +116 -0
  43. package/dist/usecases/script/synopsis-generate.js +801 -0
  44. package/dist/usecases/script/synopsis-generate.js.map +1 -0
  45. package/dist/usecases/script/synopsis.d.ts +3 -0
  46. package/dist/usecases/script/synopsis.js +41 -0
  47. package/dist/usecases/script/synopsis.js.map +1 -0
  48. package/package.json +3 -2
@@ -1 +1 @@
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,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,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"}
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 per-episode line: scenes, actions, chars
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 per-action line; filters: --in / --grep / --type / --actor / --speaker / --has / --context
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 machine-readable JSON instead of agent text.
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 machine-readable JSON. Avoid unless parsing.
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 and char totals.
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
- Output line
412
- - ep_NNN: scenes=N, actions=N, chars=N (dialogue=N, action=N), title=...
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
- Output line
465
- - ep_NNN/scn_NNN#idx [type] [speaker|actor] content
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
  [
@@ -1 +1 @@
1
- {"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"help-text.js","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAuC;IACvD;QACE,EAAE;QACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;CAeH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;;;;;CAqBH;KACE;IACD;QACE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDH;KACE;IACD;QACE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACpB;;;;;;;;;;;;;;;;;CAiBH;KACE;IACD;QACE,CAAC,QAAQ,EAAE,UAAU,CAAC;QACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BH;KACE;IACD;QACE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BH;KACE;IACD;QACE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCH;KACE;IAED,4EAA4E;IAC5E,6CAA6C;IAC7C,4EAA4E;IAE5E;QACE,CAAC,SAAS,CAAC;QACX;;;;;;;;;;;;;;;;;;;;;;;;;CAyBH;KACE;IACD;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;;;;;;;;;;;;;;CAsBH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;;;CAmBH;KACE;IACD;QACE,CAAC,SAAS,CAAC;QACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;CAeH;KACE;IACD;QACE,CAAC,WAAW,CAAC;QACb;;;;;;;;;;CAUH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;CAUH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;CAeH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;CAiBH;KACE;IACD;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;;;;;;CAcH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;CAgBH;KACE;IACD;QACE,CAAC,MAAM,CAAC;QACR;;;;;;;;;;;;;;;;;;;;;;CAsBH;KACE;IACD;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;;;CAWH;KACE;IAED,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAE5E;QACE,CAAC,SAAS,CAAC;QACX;;;;;;;;;;;;;;;;;;CAkBH;KACE;IACD;QACE,CAAC,MAAM,CAAC;QACR;;;;;;;CAOH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;CAQH;KACE;IAED,4EAA4E;IAC5E,kEAAkE;IAClE,4EAA4E;IAE5E;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BH;KACE;IACD;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;;;;;CAqBH;KACE;IACD;QACE,CAAC,MAAM,CAAC;QACR;;;;;;;;;;;;;;CAcH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;;;;;CAcH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;CAUH;KACE;IAED,4EAA4E;IAC5E,8DAA8D;IAC9D,4EAA4E;IAE5E;QACE,CAAC,cAAc,CAAC;QAChB;;;;;;;;;;;;;;;;;;;CAmBH;KACE;IACD;QACE,CAAC,YAAY,CAAC;QACd;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,SAAS,CAAC;QACX;;;;;;;;;;;;;CAaH;KACE;IAED,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAE5E;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;;CAWH;KACE;IACD;QACE,CAAC,MAAM,CAAC;QACR;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,WAAW,CAAC;QACb;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;;;;;;CAcH;KACE;IACD;QACE,CAAC,UAAU,EAAE,UAAU,CAAC;QACxB;;;;;;;;;;;;;;;;;;;;;;CAsBH;KACE;IAED;QACE,CAAC,QAAQ,CAAC;QACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCH;KACE;IAED,4EAA4E;IAC5E,gCAAgC;IAChC,4EAA4E;IAE5E;QACE,CAAC,WAAW,CAAC;QACb;;;;;;;;;;;;;;;;CAgBH;KACE;IACD;QACE,CAAC,cAAc,CAAC;QAChB;;;;;;;CAOH;KACE;IACD;QACE,CAAC,cAAc,CAAC;QAChB;;;;;;;;;;;;;CAaH;KACE;IAED,4EAA4E;IAC5E,kCAAkC;IAClC,4EAA4E;IAE5E;QACE,CAAC,UAAU,CAAC;QACZ;;;;;;;;;;CAUH;KACE;IACD;QACE,CAAC,SAAS,CAAC;QACX;;;;;;;;;CASH;KACE;IACD;QACE,CAAC,aAAa,CAAC;QACf;;;;;;;;;;;;;;;;;CAiBH;KACE;IAED,4EAA4E;IAC5E,6BAA6B;IAC7B,4EAA4E;IAE5E;QACE,CAAC,OAAO,CAAC;QACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BH;KACE;CACF,CAAC;AAEF,SAAS,KAAK,CAAC,OAA0B;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAC3C,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CACtD,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,OAA0B;IAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC"}
@@ -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 {};
@@ -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