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.
@@ -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": "claude_json",
6
+ "parser": "claude_stream_json",
7
7
  "prompt_mode": "stdin",
8
8
  "timeout_seconds": 3600,
9
9
  "idle_timeout_startup_seconds": 180,
@@ -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": "claude_json",
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": "claude_json",
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": "claude_json",
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(),
@@ -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;SAC3E,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"}
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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"}
@@ -21,5 +21,6 @@ export interface ExtractOutput {
21
21
  * 3) generic json_extract
22
22
  * 4) <SUMMARY> extraction
23
23
  * 5) raw stdout fallback
24
+ * 6) raw stderr fallback (when stdout is empty)
24
25
  */
25
26
  export declare function extractResult(input: ExtractInput): Promise<ExtractOutput>;
@@ -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":"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"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/parsers/extract.ts"],"names":[],"mappings":"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"}
@@ -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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clinkx",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "ClinkX MCP STDIO server — CLI-to-CLI bridge tool",
5
5
  "type": "module",
6
6
  "engines": {