@lingjingai/scriptctl 0.7.0 → 0.7.2
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/README.md +1 -1
- package/dist/common.d.ts +1 -1
- package/dist/common.js +1 -1
- package/dist/common.js.map +1 -1
- package/dist/help-text.js +1 -1
- package/dist/infra/local-script-output-store.d.ts +12 -1
- package/dist/infra/local-script-output-store.js +27 -6
- package/dist/infra/local-script-output-store.js.map +1 -1
- package/dist/infra/script-output-store.d.ts +18 -2
- package/dist/infra/script-output-store.js +17 -0
- package/dist/infra/script-output-store.js.map +1 -1
- package/dist/usecases/doctor.js +43 -38
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/episode.js +26 -23
- package/dist/usecases/episode.js.map +1 -1
- package/dist/usecases/script.d.ts +0 -1
- package/dist/usecases/script.js +31 -8
- package/dist/usecases/script.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ scriptctl script patch --patch <patch.json>
|
|
|
41
41
|
|---|---|
|
|
42
42
|
| `PROJECT_LITELLM_GATEWAY_API_KEY` | Anthropic key(仅 `--provider anthropic` 时需要) |
|
|
43
43
|
| `PROJECT_LITELLM_GATEWAY_BASE_URL` | 自定义 Anthropic gateway |
|
|
44
|
-
| `SCRIPTCTL_ANTHROPIC_MODEL` | 覆盖默认 model(默认 `claude-opus-4-7-
|
|
44
|
+
| `SCRIPTCTL_ANTHROPIC_MODEL` | 覆盖默认 model(默认 `claude-opus-4-7-aihubmix`) |
|
|
45
45
|
| `AWB_BASE_URL` | script-output gateway URL |
|
|
46
46
|
| `LINGJING_AWB_ACCESS_KEY` | gateway 访问凭证 |
|
|
47
47
|
| `SANDBOX_PROJECT_GROUP_NO` | 项目组号(也可用 `--project-group-no`) |
|
package/dist/common.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export declare const EXIT_NEEDS_AGENT = 78;
|
|
|
16
16
|
export declare function isDebug(): boolean;
|
|
17
17
|
export declare const DEFAULT_PROVIDER = "anthropic";
|
|
18
18
|
export declare const DEFAULT_CONCURRENCY = 30;
|
|
19
|
-
export declare const DEFAULT_MODEL = "claude-opus-4-7-
|
|
19
|
+
export declare const DEFAULT_MODEL = "claude-opus-4-7-aihubmix";
|
|
20
20
|
export declare const DEFAULT_MAX_TOKENS = 32000;
|
|
21
21
|
export declare const DEFAULT_BATCH_MAX_TOKENS = 16000;
|
|
22
22
|
export declare const DEFAULT_PROVIDER_ATTEMPTS = 3;
|
package/dist/common.js
CHANGED
|
@@ -21,7 +21,7 @@ export function isDebug() {
|
|
|
21
21
|
}
|
|
22
22
|
export const DEFAULT_PROVIDER = "anthropic";
|
|
23
23
|
export const DEFAULT_CONCURRENCY = 30;
|
|
24
|
-
export const DEFAULT_MODEL = "claude-opus-4-7-
|
|
24
|
+
export const DEFAULT_MODEL = "claude-opus-4-7-aihubmix";
|
|
25
25
|
export const DEFAULT_MAX_TOKENS = 32000;
|
|
26
26
|
export const DEFAULT_BATCH_MAX_TOKENS = 16000;
|
|
27
27
|
export const DEFAULT_PROVIDER_ATTEMPTS = 3;
|
package/dist/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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"}
|
package/dist/help-text.js
CHANGED
|
@@ -139,7 +139,7 @@ Required
|
|
|
139
139
|
Options
|
|
140
140
|
- --workspace-path Workspace directory. Default: workspace
|
|
141
141
|
- --provider LLM provider: anthropic, mock(test only). Default: anthropic
|
|
142
|
-
- --model Provider model. Default: claude-opus-4-7-
|
|
142
|
+
- --model Provider model. Default: claude-opus-4-7-aihubmix
|
|
143
143
|
- --concurrency Parallel episode extraction workers. Default: 30
|
|
144
144
|
- --batch-mode Batch planning mode: episode. Default: episode
|
|
145
145
|
- --batch-target-lines Target non-metadata content lines per batch. Default: 36
|
|
@@ -19,7 +19,18 @@ export declare class LocalScriptOutputStore implements ScriptOutputStore {
|
|
|
19
19
|
readonly dirPath: string;
|
|
20
20
|
constructor(dirPath: string);
|
|
21
21
|
get projectGroupNo(): string;
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the on-disk store path:
|
|
24
|
+
* 1. `SCRIPTCTL_OUTPUT_DIR` env if set (explicit override)
|
|
25
|
+
* 2. otherwise a sibling of the workspace dir named `output/` — matching
|
|
26
|
+
* the project-template convention where `workspace/` and `output/` sit
|
|
27
|
+
* next to each other under the run dir.
|
|
28
|
+
*
|
|
29
|
+
* Callers pass `workspacePath` from `--workspace-path` so a custom workspace
|
|
30
|
+
* still gets a co-located output dir; when omitted, defaults to "workspace"
|
|
31
|
+
* (the same default used by all usecases), which resolves to `<cwd>/output`.
|
|
32
|
+
*/
|
|
33
|
+
static fromEnv(workspacePath?: string): LocalScriptOutputStore;
|
|
23
34
|
private get scriptPath();
|
|
24
35
|
private get revisionPath();
|
|
25
36
|
private validationPath;
|
|
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { exists, readJson, writeJson } from "../common.js";
|
|
4
4
|
import { ScriptOutputApiError, } from "./script-output-store.js";
|
|
5
|
+
const IDEMPOTENCY_CAP = 256;
|
|
5
6
|
/**
|
|
6
7
|
* Filesystem-backed ScriptOutputStore for local debugging. Layout:
|
|
7
8
|
*
|
|
@@ -30,18 +31,28 @@ export class LocalScriptOutputStore {
|
|
|
30
31
|
get projectGroupNo() {
|
|
31
32
|
return this.dirPath;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the on-disk store path:
|
|
36
|
+
* 1. `SCRIPTCTL_OUTPUT_DIR` env if set (explicit override)
|
|
37
|
+
* 2. otherwise a sibling of the workspace dir named `output/` — matching
|
|
38
|
+
* the project-template convention where `workspace/` and `output/` sit
|
|
39
|
+
* next to each other under the run dir.
|
|
40
|
+
*
|
|
41
|
+
* Callers pass `workspacePath` from `--workspace-path` so a custom workspace
|
|
42
|
+
* still gets a co-located output dir; when omitted, defaults to "workspace"
|
|
43
|
+
* (the same default used by all usecases), which resolves to `<cwd>/output`.
|
|
44
|
+
*/
|
|
45
|
+
static fromEnv(workspacePath) {
|
|
46
|
+
const envDir = (process.env.SCRIPTCTL_OUTPUT_DIR ?? "").trim();
|
|
47
|
+
const ws = (workspacePath ?? "").trim() || "workspace";
|
|
48
|
+
const dir = envDir || path.join(path.dirname(path.resolve(ws)), "output");
|
|
38
49
|
try {
|
|
39
50
|
fs.mkdirSync(dir, { recursive: true });
|
|
40
51
|
}
|
|
41
52
|
catch (err) {
|
|
42
53
|
const reason = err instanceof Error ? err.message : String(err);
|
|
43
54
|
throw new ScriptOutputApiError(`local output dir not writable: ${reason}`, {
|
|
44
|
-
configMissing: "
|
|
55
|
+
configMissing: "output",
|
|
45
56
|
});
|
|
46
57
|
}
|
|
47
58
|
return new LocalScriptOutputStore(dir);
|
|
@@ -103,6 +114,16 @@ export class LocalScriptOutputStore {
|
|
|
103
114
|
revision: nextRevision,
|
|
104
115
|
source,
|
|
105
116
|
};
|
|
117
|
+
// Cap idempotency map at IDEMPOTENCY_CAP entries — replay protection only
|
|
118
|
+
// covers very recent writes in production-equivalent flows, and the cap
|
|
119
|
+
// keeps revision.json from growing unbounded on long-running local stores.
|
|
120
|
+
// JS objects preserve insertion order, so dropping the oldest keys is FIFO.
|
|
121
|
+
const idempotencyKeys = Object.keys(idempotency);
|
|
122
|
+
if (idempotencyKeys.length > IDEMPOTENCY_CAP) {
|
|
123
|
+
for (const stale of idempotencyKeys.slice(0, idempotencyKeys.length - IDEMPOTENCY_CAP)) {
|
|
124
|
+
delete idempotency[stale];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
106
127
|
writeJson(this.revisionPath, {
|
|
107
128
|
revision: nextRevision,
|
|
108
129
|
requestId: opts.requestId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-script-output-store.js","sourceRoot":"","sources":["../../src/infra/local-script-output-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,oBAAoB,GAIrB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"local-script-output-store.js","sourceRoot":"","sources":["../../src/infra/local-script-output-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type ConfigMissingSlot = "gateway" | "access" | "project" | "output";
|
|
1
2
|
export interface ScriptOutputApiErrorOptions {
|
|
2
3
|
status?: number | null;
|
|
3
4
|
code?: number | string | null;
|
|
@@ -6,14 +7,15 @@ export interface ScriptOutputApiErrorOptions {
|
|
|
6
7
|
* Which env var was missing when fromEnv() failed — used by apiErrorToCli to
|
|
7
8
|
* route the failure into a sanitized public error. Kept as a stable token
|
|
8
9
|
* (not the raw env name) so apiErrorToCli doesn't need to parse messages.
|
|
10
|
+
* "output" is the local-mode slot (SCRIPTCTL_OUTPUT_DIR missing or unwritable).
|
|
9
11
|
*/
|
|
10
|
-
configMissing?:
|
|
12
|
+
configMissing?: ConfigMissingSlot;
|
|
11
13
|
}
|
|
12
14
|
export declare class ScriptOutputApiError extends Error {
|
|
13
15
|
readonly status: number | null;
|
|
14
16
|
readonly code: number | string | null;
|
|
15
17
|
readonly payload: unknown;
|
|
16
|
-
readonly configMissing:
|
|
18
|
+
readonly configMissing: ConfigMissingSlot | null;
|
|
17
19
|
constructor(message: string, opts?: ScriptOutputApiErrorOptions);
|
|
18
20
|
}
|
|
19
21
|
export interface ReplaceScriptOptions {
|
|
@@ -49,3 +51,17 @@ export interface ScriptOutputStore {
|
|
|
49
51
|
replaceScript(opts: ReplaceScriptOptions): Promise<Record<string, unknown>>;
|
|
50
52
|
saveValidationResult(opts: SaveValidationOptions): Promise<Record<string, unknown>>;
|
|
51
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Single source of truth for `SCRIPTCTL_OUTPUT_MODE` parsing. Returns:
|
|
56
|
+
* - mode: resolved mode (unrecognized values fall back to "remote")
|
|
57
|
+
* - raw: the trimmed lower-cased env value, or null when unset
|
|
58
|
+
* - recognized: true if the env is unset OR matches a known token
|
|
59
|
+
*
|
|
60
|
+
* Callers should always use `.mode` for routing; `.recognized` exists so
|
|
61
|
+
* `doctor` can warn users about typos ("SCRIPTCTL_OUTPUT_MODE=loca").
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveOutputMode(): {
|
|
64
|
+
mode: "local" | "remote";
|
|
65
|
+
raw: string | null;
|
|
66
|
+
recognized: boolean;
|
|
67
|
+
};
|
|
@@ -12,4 +12,21 @@ export class ScriptOutputApiError extends Error {
|
|
|
12
12
|
this.configMissing = opts.configMissing ?? null;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Single source of truth for `SCRIPTCTL_OUTPUT_MODE` parsing. Returns:
|
|
17
|
+
* - mode: resolved mode (unrecognized values fall back to "remote")
|
|
18
|
+
* - raw: the trimmed lower-cased env value, or null when unset
|
|
19
|
+
* - recognized: true if the env is unset OR matches a known token
|
|
20
|
+
*
|
|
21
|
+
* Callers should always use `.mode` for routing; `.recognized` exists so
|
|
22
|
+
* `doctor` can warn users about typos ("SCRIPTCTL_OUTPUT_MODE=loca").
|
|
23
|
+
*/
|
|
24
|
+
export function resolveOutputMode() {
|
|
25
|
+
const raw = (process.env.SCRIPTCTL_OUTPUT_MODE ?? "").trim().toLowerCase();
|
|
26
|
+
if (raw === "")
|
|
27
|
+
return { mode: "remote", raw: null, recognized: true };
|
|
28
|
+
if (raw === "local" || raw === "remote")
|
|
29
|
+
return { mode: raw, raw, recognized: true };
|
|
30
|
+
return { mode: "remote", raw, recognized: false };
|
|
31
|
+
}
|
|
15
32
|
//# sourceMappingURL=script-output-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-output-store.js","sourceRoot":"","sources":["../../src/infra/script-output-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"script-output-store.js","sourceRoot":"","sources":["../../src/infra/script-output-store.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,MAAM,CAAgB;IACtB,IAAI,CAAyB;IAC7B,OAAO,CAAU;IACjB,aAAa,CAA2B;IAEjD,YAAY,OAAe,EAAE,OAAoC,EAAE;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IAClD,CAAC;CACF;AAsCD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAK/B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3E,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvE,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACpD,CAAC"}
|
package/dist/usecases/doctor.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
2
3
|
import { createRequire } from "node:module";
|
|
3
4
|
import { EXIT_OK, isDebug } from "../common.js";
|
|
4
5
|
import { candidateEnvPaths } from "../infra/env.js";
|
|
6
|
+
import { resolveOutputMode } from "../infra/script-output-store.js";
|
|
5
7
|
const require = createRequire(import.meta.url);
|
|
6
8
|
function moduleAvailable(name) {
|
|
7
9
|
try {
|
|
@@ -12,30 +14,35 @@ function moduleAvailable(name) {
|
|
|
12
14
|
return false;
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return raw === "local" ? "local" : "remote";
|
|
18
|
-
}
|
|
17
|
+
// Read-only probe — never creates or modifies anything. doctor must stay
|
|
18
|
+
// side-effect-free so `--json` consumers can re-run it idempotently.
|
|
19
19
|
function probeLocalOutputDir(dir) {
|
|
20
|
-
if (!dir)
|
|
21
|
-
return { dirSet: false, writable: false, hasScript: false };
|
|
22
20
|
let writable = false;
|
|
23
21
|
try {
|
|
24
|
-
fs.
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
const stat = fs.statSync(dir);
|
|
23
|
+
if (stat.isDirectory()) {
|
|
24
|
+
fs.accessSync(dir, fs.constants.W_OK);
|
|
25
|
+
writable = true;
|
|
26
|
+
}
|
|
27
27
|
}
|
|
28
28
|
catch {
|
|
29
29
|
writable = false;
|
|
30
30
|
}
|
|
31
31
|
let hasScript = false;
|
|
32
32
|
try {
|
|
33
|
-
hasScript = fs.statSync(
|
|
33
|
+
hasScript = fs.statSync(path.join(dir, "script.json")).isFile();
|
|
34
34
|
}
|
|
35
35
|
catch {
|
|
36
36
|
hasScript = false;
|
|
37
37
|
}
|
|
38
|
-
return {
|
|
38
|
+
return { writable, hasScript };
|
|
39
|
+
}
|
|
40
|
+
// Default output path mirrors LocalScriptOutputStore.fromEnv()'s fallback:
|
|
41
|
+
// sibling of the default workspace dir, which lives at <cwd>/workspace, so
|
|
42
|
+
// the default output is <cwd>/output. The project-template lays both out
|
|
43
|
+
// at the same level under each stage dir.
|
|
44
|
+
function defaultLocalOutputDir() {
|
|
45
|
+
return path.join(path.dirname(path.resolve("workspace")), "output");
|
|
39
46
|
}
|
|
40
47
|
export function commandDoctor(_opts) {
|
|
41
48
|
const envPaths = candidateEnvPaths();
|
|
@@ -57,9 +64,10 @@ export function commandDoctor(_opts) {
|
|
|
57
64
|
}
|
|
58
65
|
const anthropicKeyConfigured = Boolean(process.env.PROJECT_LITELLM_GATEWAY_API_KEY);
|
|
59
66
|
const geminiKeyConfigured = Boolean(process.env.SCRIPTCTL_GEMINI_API_KEY || process.env.GEMINI_API_KEY);
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
67
|
+
const modeInfo = resolveOutputMode();
|
|
68
|
+
const mode = modeInfo.mode;
|
|
69
|
+
const localDirRaw = (process.env.SCRIPTCTL_OUTPUT_DIR ?? "").trim() || defaultLocalOutputDir();
|
|
70
|
+
const localProbe = mode === "local" ? probeLocalOutputDir(localDirRaw) : null;
|
|
63
71
|
const gatewayUrlConfigured = Boolean(process.env.AWB_BASE_URL);
|
|
64
72
|
const gatewayAccessConfigured = Boolean(process.env.LINGJING_AWB_ACCESS_KEY);
|
|
65
73
|
const projectGroupConfigured = Boolean(process.env.SANDBOX_PROJECT_GROUP_NO);
|
|
@@ -79,23 +87,23 @@ export function commandDoctor(_opts) {
|
|
|
79
87
|
? `env_file: ${existingEnvPaths[0] ?? "missing"}`
|
|
80
88
|
: `env_file: ${existingEnvPaths.length > 0 ? "loaded" : "missing"}`;
|
|
81
89
|
const fmtCheck = (ok) => (ok ? "configured" : "not configured");
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
const storageLine =
|
|
85
|
-
? `storage: local-output (${debug && localDirRaw ? localDirRaw : localProbe?.dirSet ? "configured" : "not configured"})`
|
|
86
|
-
: "storage: local-filesystem";
|
|
90
|
+
// Workspace storage is always the local filesystem. Stable since pre-0.7.0;
|
|
91
|
+
// scripts that grep `storage:` keep working.
|
|
92
|
+
const storageLine = "storage: local-filesystem";
|
|
87
93
|
const result = [
|
|
88
94
|
`node: ${nodeVersion}`,
|
|
89
95
|
storageLine,
|
|
90
|
-
`output mode: ${mode}`,
|
|
91
96
|
envFileLine,
|
|
92
97
|
`provider anthropic: ${fmtCheck(anthropicKeyConfigured)}`,
|
|
93
98
|
`provider gemini: ${fmtCheck(geminiKeyConfigured)}`,
|
|
94
99
|
];
|
|
100
|
+
// Doctor result lines vary by where the published script lands, but the
|
|
101
|
+
// word "mode" / "local" / "remote" is deliberately absent: upper layers
|
|
102
|
+
// must not know there are two backends. Operators with SCRIPTCTL_DEBUG=1
|
|
103
|
+
// can correlate via env paths if needed.
|
|
95
104
|
if (mode === "local" && localProbe) {
|
|
96
|
-
result.push(`output
|
|
97
|
-
result.push(`output
|
|
98
|
-
result.push(`output script: ${localProbe.hasScript ? "present" : "absent"}`);
|
|
105
|
+
result.push(`output writable: ${fmtCheck(localProbe.writable)}`);
|
|
106
|
+
result.push(`output snapshot: ${localProbe.hasScript ? "present" : "absent"}`);
|
|
99
107
|
}
|
|
100
108
|
else {
|
|
101
109
|
result.push(`gateway endpoint: ${fmtCheck(gatewayUrlConfigured)}`);
|
|
@@ -112,12 +120,14 @@ export function commandDoctor(_opts) {
|
|
|
112
120
|
if (!anthropicKeyConfigured && !geminiKeyConfigured) {
|
|
113
121
|
nextSteps.push("Configure provider credentials before running delivery commands.");
|
|
114
122
|
}
|
|
123
|
+
// SCRIPTCTL_OUTPUT_MODE typos used to be surfaced here as a warning, but
|
|
124
|
+
// exposing the env-var name leaks the mode concept to the upper layer.
|
|
125
|
+
// In debug mode operators can still notice it via `received` diagnostics
|
|
126
|
+
// (modeInfo.recognized=false → fallback to remote, gateway checks fire).
|
|
127
|
+
void modeInfo;
|
|
115
128
|
if (mode === "local") {
|
|
116
|
-
if (
|
|
117
|
-
nextSteps.push("
|
|
118
|
-
}
|
|
119
|
-
else if (!localProbe.writable) {
|
|
120
|
-
nextSteps.push("SCRIPTCTL_OUTPUT_DIR is not writable; pick a different directory or fix permissions.");
|
|
129
|
+
if (localProbe && !localProbe.writable) {
|
|
130
|
+
nextSteps.push("Output target is not writable; check directory permissions.");
|
|
121
131
|
}
|
|
122
132
|
}
|
|
123
133
|
else if (!gatewayUrlConfigured || !gatewayAccessConfigured || !projectGroupConfigured) {
|
|
@@ -131,30 +141,25 @@ export function commandDoctor(_opts) {
|
|
|
131
141
|
}
|
|
132
142
|
const [major, minor] = nodeVersion.split(".").map((n) => parseInt(n, 10));
|
|
133
143
|
const nodeOk = (major ?? 0) > 20 || ((major ?? 0) === 20 && (minor ?? 0) >= 0);
|
|
134
|
-
// checks.output
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
// External scripts that previously read checks.gateway must migrate to
|
|
138
|
-
// checks.output. The `mode` discriminator lets them branch cleanly.
|
|
144
|
+
// checks.output exposes only the relevant sub-keys; presence of `endpoint`
|
|
145
|
+
// (remote-style) vs `dir` (local-style) is the implicit discriminator.
|
|
146
|
+
// No `mode` field — upper layers must not branch on a mode concept.
|
|
139
147
|
const outputChecks = mode === "local"
|
|
140
148
|
? {
|
|
141
|
-
mode,
|
|
142
149
|
dir: {
|
|
143
|
-
ok: Boolean(localProbe?.
|
|
144
|
-
set: Boolean(localProbe?.dirSet),
|
|
150
|
+
ok: Boolean(localProbe?.writable),
|
|
145
151
|
writable: Boolean(localProbe?.writable),
|
|
146
152
|
hasScript: Boolean(localProbe?.hasScript),
|
|
147
153
|
},
|
|
148
154
|
}
|
|
149
155
|
: {
|
|
150
|
-
mode,
|
|
151
156
|
endpoint: { ok: gatewayUrlConfigured },
|
|
152
157
|
access: { ok: gatewayAccessConfigured },
|
|
153
158
|
project: { ok: projectGroupConfigured },
|
|
154
159
|
};
|
|
155
160
|
const checks = {
|
|
156
161
|
node: { version: nodeVersion, ok: nodeOk },
|
|
157
|
-
storage: { backend:
|
|
162
|
+
storage: { backend: "local-filesystem", ok: true },
|
|
158
163
|
env: {
|
|
159
164
|
ok: existingEnvPaths.length > 0,
|
|
160
165
|
...(debug ? { paths: existingEnvPaths } : { count: existingEnvPaths.length }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/usecases/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/usecases/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/usecases/episode.js
CHANGED
|
@@ -24,6 +24,7 @@ import { detectCollisions, hasHardCollision, summarizeReports, } from "../domain
|
|
|
24
24
|
import { isTechnicalEpisodeTitle, mergeEpisodeResults, parseMarkdownBatch } from "../domain/direct-core.js";
|
|
25
25
|
import { validateScript } from "../domain/script-core.js";
|
|
26
26
|
import { ScriptOutputApiError } from "../infra/script-output-api.js";
|
|
27
|
+
import { resolveOutputMode } from "../infra/script-output-store.js";
|
|
27
28
|
import { summarizeIssues } from "./direct.js";
|
|
28
29
|
import { apiErrorToCli, currentRevisionOrZero, scriptOutputClient, sortDeep, } from "./script.js";
|
|
29
30
|
import { DEFAULT_WRITING_PROMPT, injectSpec } from "../infra/default-writing-prompt.js";
|
|
@@ -164,23 +165,13 @@ function extractEpisodeTitle(workspace, n, outlineOverride) {
|
|
|
164
165
|
function checkGatewayEnv(projectGroupOverride) {
|
|
165
166
|
const debug = isDebug();
|
|
166
167
|
const tick = (ok) => (ok ? "✓" : "✗ MISSING");
|
|
167
|
-
const mode = (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
// local mode is configured lets push proceed into LocalScriptOutputStore.
|
|
168
|
+
const mode = resolveOutputMode().mode;
|
|
169
|
+
// Local backend has no env preflight — the store auto-resolves a default
|
|
170
|
+
// path (sibling `output/` next to workspace) and lazy-creates it. Any
|
|
171
|
+
// permissions failure surfaces from LocalScriptOutputStore.fromEnv as a
|
|
172
|
+
// standard SCRIPT_API_CONFIG_MISSING envelope, so no UX is lost.
|
|
173
173
|
if (mode === "local") {
|
|
174
|
-
|
|
175
|
-
const missing = [];
|
|
176
|
-
if (!outputDir) {
|
|
177
|
-
missing.push(debug ? "SCRIPTCTL_OUTPUT_DIR" : "output dir");
|
|
178
|
-
}
|
|
179
|
-
const table = [
|
|
180
|
-
` Output mode ${tick(true)} local`,
|
|
181
|
-
` Output dir ${tick(Boolean(outputDir))}${debug && outputDir ? ` ${outputDir}` : ""}`,
|
|
182
|
-
].join("\n");
|
|
183
|
-
return { ready: missing.length === 0, table, missing };
|
|
174
|
+
return { ready: true, table: ` Output target ${tick(true)}`, missing: [] };
|
|
184
175
|
}
|
|
185
176
|
const gatewayUrl = (process.env.AWB_BASE_URL || "").trim();
|
|
186
177
|
const accessKey = (process.env.LINGJING_AWB_ACCESS_KEY || "").trim();
|
|
@@ -1029,13 +1020,20 @@ export async function commandEpisodeMerge(opts) {
|
|
|
1029
1020
|
}
|
|
1030
1021
|
export async function commandEpisodePush(opts) {
|
|
1031
1022
|
const workspace = opts.workspace_path ?? "workspace";
|
|
1032
|
-
// Step 1:
|
|
1023
|
+
// Step 1: env preflight — push is the only command that talks to the
|
|
1024
|
+
// output store. Wording adapts to whichever backend is active without
|
|
1025
|
+
// revealing the mode concept to the caller.
|
|
1033
1026
|
const env = checkGatewayEnv(opts.project_group_no);
|
|
1034
1027
|
if (!env.ready) {
|
|
1028
|
+
const isLocal = resolveOutputMode().mode === "local";
|
|
1035
1029
|
return [
|
|
1036
1030
|
{
|
|
1037
|
-
title:
|
|
1038
|
-
|
|
1031
|
+
title: isLocal
|
|
1032
|
+
? "PUSH BLOCKED: output target not configured"
|
|
1033
|
+
: "PUSH BLOCKED: gateway env missing",
|
|
1034
|
+
message: isLocal
|
|
1035
|
+
? "Cannot upload — output target is not configured."
|
|
1036
|
+
: "Cannot upload without gateway credentials.",
|
|
1039
1037
|
summary: env.table,
|
|
1040
1038
|
result: env.missing.map((v) => `missing: ${v}`),
|
|
1041
1039
|
next: [
|
|
@@ -1196,14 +1194,19 @@ export function commandEpisodeInit(opts) {
|
|
|
1196
1194
|
if (!existed || overwrite) {
|
|
1197
1195
|
writeJson(metaFile, META_TEMPLATE);
|
|
1198
1196
|
}
|
|
1199
|
-
//
|
|
1200
|
-
// block on missing env vars because the agent may not need
|
|
1197
|
+
// Output-store env preflight — informational at init time (init is fully
|
|
1198
|
+
// local; we don't block on missing env vars because the agent may not need
|
|
1199
|
+
// them until publish day). Heading adapts to whichever backend will be used
|
|
1200
|
+
// without naming the mode concept.
|
|
1201
1201
|
const env = checkGatewayEnv();
|
|
1202
|
+
const readinessHeading = resolveOutputMode().mode === "local"
|
|
1203
|
+
? "Output target readiness:"
|
|
1204
|
+
: "Gateway readiness:";
|
|
1202
1205
|
const gatewayLines = env.ready
|
|
1203
|
-
? ["",
|
|
1206
|
+
? ["", readinessHeading, env.table, " → ready for `episode publish` whenever you are."]
|
|
1204
1207
|
: [
|
|
1205
1208
|
"",
|
|
1206
|
-
|
|
1209
|
+
readinessHeading,
|
|
1207
1210
|
env.table,
|
|
1208
1211
|
" ⚠ Set the missing vars before `episode publish` (init doesn't need them).",
|
|
1209
1212
|
];
|