clinkx 0.1.3 → 0.1.5
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/conf/adapters/claude.json +2 -2
- package/conf/adapters/glm.json +2 -2
- package/conf/adapters/hapi/claude.json +2 -2
- package/conf/adapters/hapi/glm.json +2 -2
- package/dist/config.d.ts +3 -3
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/parsers/claude-stream-json.d.ts +14 -0
- package/dist/parsers/claude-stream-json.js +91 -0
- package/dist/parsers/claude-stream-json.js.map +1 -0
- package/dist/parsers/extract.d.ts +1 -0
- package/dist/parsers/extract.js +34 -1
- package/dist/parsers/extract.js.map +1 -1
- package/dist/parsers/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude",
|
|
3
3
|
"command": "claude",
|
|
4
|
-
"args": ["-p", "--output-format", "json"],
|
|
4
|
+
"args": ["-p", "--output-format", "stream-json", "--verbose"],
|
|
5
5
|
"unsafe_args": ["--permission-mode", "acceptEdits"],
|
|
6
|
-
"parser": "
|
|
6
|
+
"parser": "claude_stream_json",
|
|
7
7
|
"prompt_mode": "stdin",
|
|
8
8
|
"timeout_seconds": 3600,
|
|
9
9
|
"idle_timeout_startup_seconds": 180,
|
package/conf/adapters/glm.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glm",
|
|
3
3
|
"command": "claude",
|
|
4
|
-
"args": ["-p", "--output-format", "json"],
|
|
4
|
+
"args": ["-p", "--output-format", "stream-json", "--verbose"],
|
|
5
5
|
"unsafe_args": ["--permission-mode", "acceptEdits"],
|
|
6
6
|
"env": {
|
|
7
7
|
"ANTHROPIC_AUTH_TOKEN": "",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5",
|
|
10
10
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5"
|
|
11
11
|
},
|
|
12
|
-
"parser": "
|
|
12
|
+
"parser": "claude_stream_json",
|
|
13
13
|
"prompt_mode": "stdin",
|
|
14
14
|
"timeout_seconds": 3600,
|
|
15
15
|
"idle_timeout_startup_seconds": 180,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude",
|
|
3
3
|
"command": "hapi",
|
|
4
|
-
"args": ["-p", "--output-format", "json"],
|
|
4
|
+
"args": ["-p", "--output-format", "stream-json", "--verbose"],
|
|
5
5
|
"unsafe_args": ["--yolo"],
|
|
6
6
|
"env": {
|
|
7
7
|
"HAPI_API_URL": "https://your.domain.com"
|
|
8
8
|
},
|
|
9
|
-
"parser": "
|
|
9
|
+
"parser": "claude_stream_json",
|
|
10
10
|
"prompt_mode": "stdin",
|
|
11
11
|
"timeout_seconds": 3600,
|
|
12
12
|
"idle_timeout_startup_seconds": 180,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glm",
|
|
3
3
|
"command": "hapi",
|
|
4
|
-
"args": ["-p", "--output-format", "json"],
|
|
4
|
+
"args": ["-p", "--output-format", "stream-json", "--verbose"],
|
|
5
5
|
"unsafe_args": ["--yolo"],
|
|
6
6
|
"env": {
|
|
7
7
|
"HAPI_API_URL": "https://your.domain.com",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7",
|
|
11
11
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5"
|
|
12
12
|
},
|
|
13
|
-
"parser": "
|
|
13
|
+
"parser": "claude_stream_json",
|
|
14
14
|
"prompt_mode": "stdin",
|
|
15
15
|
"timeout_seconds": 3600,
|
|
16
16
|
"idle_timeout_startup_seconds": 180,
|
package/dist/config.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export declare const CliAdapterConfigSchema: z.ZodObject<{
|
|
|
28
28
|
timeout_seconds: z.ZodDefault<z.ZodNumber>;
|
|
29
29
|
idle_timeout_seconds: z.ZodOptional<z.ZodNumber>;
|
|
30
30
|
idle_timeout_startup_seconds: z.ZodOptional<z.ZodNumber>;
|
|
31
|
-
parser: z.ZodDefault<z.ZodEnum<["text", "json_extract", "gemini_json", "codex_jsonl", "claude_json"]>>;
|
|
31
|
+
parser: z.ZodDefault<z.ZodEnum<["text", "json_extract", "gemini_json", "codex_jsonl", "claude_json", "claude_stream_json"]>>;
|
|
32
32
|
tolerate_nonzero_exit_for_parse: z.ZodDefault<z.ZodBoolean>;
|
|
33
33
|
capabilities_hint: z.ZodOptional<z.ZodString>;
|
|
34
34
|
roles: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
@@ -62,7 +62,7 @@ export declare const CliAdapterConfigSchema: z.ZodObject<{
|
|
|
62
62
|
env: Record<string, string>;
|
|
63
63
|
env_allowlist: string[];
|
|
64
64
|
timeout_seconds: number;
|
|
65
|
-
parser: "text" | "json_extract" | "gemini_json" | "codex_jsonl" | "claude_json";
|
|
65
|
+
parser: "text" | "json_extract" | "gemini_json" | "codex_jsonl" | "claude_json" | "claude_stream_json";
|
|
66
66
|
tolerate_nonzero_exit_for_parse: boolean;
|
|
67
67
|
roles: Record<string, {
|
|
68
68
|
inline_prompt?: string | undefined;
|
|
@@ -90,7 +90,7 @@ export declare const CliAdapterConfigSchema: z.ZodObject<{
|
|
|
90
90
|
timeout_seconds?: number | undefined;
|
|
91
91
|
idle_timeout_seconds?: number | undefined;
|
|
92
92
|
idle_timeout_startup_seconds?: number | undefined;
|
|
93
|
-
parser?: "text" | "json_extract" | "gemini_json" | "codex_jsonl" | "claude_json" | undefined;
|
|
93
|
+
parser?: "text" | "json_extract" | "gemini_json" | "codex_jsonl" | "claude_json" | "claude_stream_json" | undefined;
|
|
94
94
|
tolerate_nonzero_exit_for_parse?: boolean | undefined;
|
|
95
95
|
capabilities_hint?: string | undefined;
|
|
96
96
|
roles?: Record<string, {
|
package/dist/config.js
CHANGED
|
@@ -26,7 +26,7 @@ export const CliAdapterConfigSchema = z.object({
|
|
|
26
26
|
idle_timeout_seconds: z.number().nonnegative().optional(),
|
|
27
27
|
idle_timeout_startup_seconds: z.number().nonnegative().optional(),
|
|
28
28
|
parser: z
|
|
29
|
-
.enum(["text", "json_extract", "gemini_json", "codex_jsonl", "claude_json"])
|
|
29
|
+
.enum(["text", "json_extract", "gemini_json", "codex_jsonl", "claude_json", "claude_stream_json"])
|
|
30
30
|
.default("text"),
|
|
31
31
|
tolerate_nonzero_exit_for_parse: z.boolean().default(false),
|
|
32
32
|
capabilities_hint: z.string().optional(),
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAIH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;CACpE,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACnD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACjE,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAIH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;CACpE,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACnD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACjE,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;SACjG,OAAO,CAAC,MAAM,CAAC;IAClB,+BAA+B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3C,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACxC,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;QAC5C,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,WAAW;KACtB,CAAC;IACF,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CAC/D,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Parser } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse Claude CLI `--output-format stream-json` JSONL output.
|
|
4
|
+
*
|
|
5
|
+
* Event types:
|
|
6
|
+
* - type:"system", subtype:"init" — session metadata (ignored)
|
|
7
|
+
* - type:"assistant" — message with content blocks
|
|
8
|
+
* - type:"result", subtype:"success" — final result string (canonical)
|
|
9
|
+
*
|
|
10
|
+
* Extraction strategy:
|
|
11
|
+
* 1. Find last `type=result` event → use its `result` field
|
|
12
|
+
* 2. Fallback: find last `type=assistant` event → extract message.content[].text
|
|
13
|
+
*/
|
|
14
|
+
export declare const claudeStreamJsonParser: Parser;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { preferredText } from "./utils.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extract the final text from `type=assistant` message content blocks.
|
|
4
|
+
* Claude stream-json emits: message.content = [{type:"text", text:"..."}]
|
|
5
|
+
*/
|
|
6
|
+
function extractAssistantText(value) {
|
|
7
|
+
if (value == null || typeof value !== "object")
|
|
8
|
+
return null;
|
|
9
|
+
const rec = value;
|
|
10
|
+
if (rec["type"] !== "assistant")
|
|
11
|
+
return null;
|
|
12
|
+
const message = rec["message"];
|
|
13
|
+
if (message == null || typeof message !== "object")
|
|
14
|
+
return null;
|
|
15
|
+
const msg = message;
|
|
16
|
+
const content = msg["content"];
|
|
17
|
+
if (!Array.isArray(content))
|
|
18
|
+
return null;
|
|
19
|
+
const texts = content
|
|
20
|
+
.map((block) => {
|
|
21
|
+
if (typeof block === "string")
|
|
22
|
+
return block;
|
|
23
|
+
if (block && typeof block === "object") {
|
|
24
|
+
const b = block;
|
|
25
|
+
if (typeof b["text"] === "string")
|
|
26
|
+
return b["text"];
|
|
27
|
+
}
|
|
28
|
+
return "";
|
|
29
|
+
})
|
|
30
|
+
.filter((t) => t.length > 0);
|
|
31
|
+
return texts.length > 0 ? texts.join("") : null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse Claude CLI `--output-format stream-json` JSONL output.
|
|
35
|
+
*
|
|
36
|
+
* Event types:
|
|
37
|
+
* - type:"system", subtype:"init" — session metadata (ignored)
|
|
38
|
+
* - type:"assistant" — message with content blocks
|
|
39
|
+
* - type:"result", subtype:"success" — final result string (canonical)
|
|
40
|
+
*
|
|
41
|
+
* Extraction strategy:
|
|
42
|
+
* 1. Find last `type=result` event → use its `result` field
|
|
43
|
+
* 2. Fallback: find last `type=assistant` event → extract message.content[].text
|
|
44
|
+
*/
|
|
45
|
+
export const claudeStreamJsonParser = {
|
|
46
|
+
name: "claude_stream_json",
|
|
47
|
+
preferredBuffers: ["stdoutTail", "stdoutHead"],
|
|
48
|
+
parse(input) {
|
|
49
|
+
const text = preferredText(input, ["stdoutTail", "stdoutHead"]);
|
|
50
|
+
if (text.trim().length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
const lines = text
|
|
53
|
+
.split("\n")
|
|
54
|
+
.map((l) => l.trim())
|
|
55
|
+
.filter((l) => l.length > 0);
|
|
56
|
+
let resultText = null;
|
|
57
|
+
let lastAssistantText = null;
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
let parsed;
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(line);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (parsed == null || typeof parsed !== "object")
|
|
67
|
+
continue;
|
|
68
|
+
const rec = parsed;
|
|
69
|
+
// Primary: type=result event with result field
|
|
70
|
+
if (rec["type"] === "result" && typeof rec["result"] === "string") {
|
|
71
|
+
resultText = rec["result"];
|
|
72
|
+
}
|
|
73
|
+
// Fallback: type=assistant event
|
|
74
|
+
const assistantText = extractAssistantText(parsed);
|
|
75
|
+
if (assistantText != null) {
|
|
76
|
+
lastAssistantText = assistantText;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Prefer result event, but treat empty/whitespace-only result as absent
|
|
80
|
+
// so we fall through to lastAssistantText via ??.
|
|
81
|
+
const content = (resultText && resultText.trim().length > 0 ? resultText : null) ?? lastAssistantText;
|
|
82
|
+
if (content == null || content.trim().length === 0)
|
|
83
|
+
return null;
|
|
84
|
+
return {
|
|
85
|
+
content,
|
|
86
|
+
source: "parser",
|
|
87
|
+
metadata: { parser: "claude_stream_json" },
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=claude-stream-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-stream-json.js","sourceRoot":"","sources":["../../src/parsers/claude-stream-json.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/extract.js
CHANGED
|
@@ -4,14 +4,17 @@ import { jsonExtractParser } from "./json-extract.js";
|
|
|
4
4
|
import { geminiJsonParser } from "./gemini-json.js";
|
|
5
5
|
import { codexJsonlParser } from "./codex-jsonl.js";
|
|
6
6
|
import { claudeJsonParser } from "./claude-json.js";
|
|
7
|
+
import { claudeStreamJsonParser } from "./claude-stream-json.js";
|
|
7
8
|
import { extractSummary } from "./summary.js";
|
|
8
9
|
import { readResultFile } from "../result-contract.js";
|
|
10
|
+
import { logger } from "../logger.js";
|
|
9
11
|
const PARSERS = [
|
|
10
12
|
textParser,
|
|
11
13
|
jsonExtractParser,
|
|
12
14
|
geminiJsonParser,
|
|
13
15
|
codexJsonlParser,
|
|
14
16
|
claudeJsonParser,
|
|
17
|
+
claudeStreamJsonParser,
|
|
15
18
|
];
|
|
16
19
|
function parserByName(name) {
|
|
17
20
|
return PARSERS.find((p) => p.name === name) ?? null;
|
|
@@ -25,7 +28,7 @@ async function tryReadResultContract(workdir, contract) {
|
|
|
25
28
|
}
|
|
26
29
|
function rawStdoutFallback(input) {
|
|
27
30
|
// JSONL adapters emit final events late; prefer tail.
|
|
28
|
-
const preferTailFirst = input.adapter.parser === "codex_jsonl" || input.adapter.parser === "jsonl";
|
|
31
|
+
const preferTailFirst = input.adapter.parser === "codex_jsonl" || input.adapter.parser === "jsonl" || input.adapter.parser === "claude_stream_json";
|
|
29
32
|
const content = preferTailFirst
|
|
30
33
|
? input.stdoutTail.length > 0
|
|
31
34
|
? input.stdoutTail
|
|
@@ -33,6 +36,16 @@ function rawStdoutFallback(input) {
|
|
|
33
36
|
: joinBuffers([input.stdoutHead, input.stdoutTail]);
|
|
34
37
|
return { content, source: "raw_fallback" };
|
|
35
38
|
}
|
|
39
|
+
/** Strip ANSI escape codes that CLI tools commonly emit to stderr. */
|
|
40
|
+
function stripAnsi(text) {
|
|
41
|
+
// Covers SGR sequences, cursor movement, and OSC sequences
|
|
42
|
+
return text.replace(/\x1b\[[0-9;]*[A-Za-z]|\x1b\][^\x07]*\x07/g, "");
|
|
43
|
+
}
|
|
44
|
+
function rawStderrFallback(input) {
|
|
45
|
+
const raw = input.stderrTail.length > 0 ? input.stderrTail : input.stderrHead;
|
|
46
|
+
const content = stripAnsi(raw);
|
|
47
|
+
return { content, source: "stderr_fallback" };
|
|
48
|
+
}
|
|
36
49
|
function hasValidPayload(result) {
|
|
37
50
|
return result.content.trim().length > 0;
|
|
38
51
|
}
|
|
@@ -45,6 +58,7 @@ function hasValidPayload(result) {
|
|
|
45
58
|
* 3) generic json_extract
|
|
46
59
|
* 4) <SUMMARY> extraction
|
|
47
60
|
* 5) raw stdout fallback
|
|
61
|
+
* 6) raw stderr fallback (when stdout is empty)
|
|
48
62
|
*/
|
|
49
63
|
export async function extractResult(input) {
|
|
50
64
|
const contractText = await tryReadResultContract(input.workdir, input.adapter.result_contract);
|
|
@@ -72,6 +86,25 @@ export async function extractResult(input) {
|
|
|
72
86
|
if (result == null) {
|
|
73
87
|
result = rawStdoutFallback(input);
|
|
74
88
|
}
|
|
89
|
+
// 6) stderr fallback: when stdout buffers are empty and extraction produced nothing, try stderr.
|
|
90
|
+
const stdoutEmpty = input.stdoutHead.length === 0 && input.stdoutTail.length === 0;
|
|
91
|
+
if (stdoutEmpty && !hasValidPayload(result)) {
|
|
92
|
+
const stderrResult = rawStderrFallback(input);
|
|
93
|
+
if (hasValidPayload(stderrResult)) {
|
|
94
|
+
logger.warn({ adapter: input.adapter.name, parser: input.adapter.parser }, "stdout empty, falling back to stderr for extraction");
|
|
95
|
+
result = stderrResult;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
logger.debug({
|
|
99
|
+
adapter: input.adapter.name,
|
|
100
|
+
parser: input.adapter.parser,
|
|
101
|
+
source: result.source,
|
|
102
|
+
contentLength: result.content.length,
|
|
103
|
+
stdoutHeadLen: input.stdoutHead.length,
|
|
104
|
+
stdoutTailLen: input.stdoutTail.length,
|
|
105
|
+
stderrHeadLen: input.stderrHead.length,
|
|
106
|
+
stderrTailLen: input.stderrTail.length,
|
|
107
|
+
}, "extraction complete");
|
|
75
108
|
// Error recovery parity: always attempt extraction, even on non-zero exit.
|
|
76
109
|
const exitCode = input.exitCode;
|
|
77
110
|
const tolerate = input.tolerateNonzeroExitForParse ?? false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/parsers/extract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/parsers/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/types.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export interface ParseInput {
|
|
|
15
15
|
}
|
|
16
16
|
export interface ParseResult {
|
|
17
17
|
content: string;
|
|
18
|
-
source: "result_contract" | "parser" | "json_extract" | "summary" | "raw_fallback";
|
|
18
|
+
source: "result_contract" | "parser" | "json_extract" | "summary" | "raw_fallback" | "stderr_fallback";
|
|
19
19
|
metadata?: Record<string, unknown>;
|
|
20
20
|
}
|
|
21
21
|
export interface Parser {
|