clinkx 0.1.10 → 0.2.1
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/clinkx-workflows/dist/artifacts.d.ts +65 -0
- package/clinkx-workflows/dist/artifacts.js +268 -0
- package/clinkx-workflows/dist/artifacts.js.map +1 -0
- package/clinkx-workflows/dist/backend.d.ts +33 -0
- package/clinkx-workflows/dist/backend.js +9 -0
- package/clinkx-workflows/dist/backend.js.map +1 -0
- package/clinkx-workflows/dist/child-env.d.ts +23 -0
- package/clinkx-workflows/dist/child-env.js +53 -0
- package/clinkx-workflows/dist/child-env.js.map +1 -0
- package/clinkx-workflows/dist/clink-client.d.ts +51 -0
- package/clinkx-workflows/dist/clink-client.js +216 -0
- package/clinkx-workflows/dist/clink-client.js.map +1 -0
- package/clinkx-workflows/dist/config.d.ts +126 -0
- package/clinkx-workflows/dist/config.js +226 -0
- package/clinkx-workflows/dist/config.js.map +1 -0
- package/clinkx-workflows/dist/definition-normalizer.d.ts +59 -0
- package/clinkx-workflows/dist/definition-normalizer.js +75 -0
- package/clinkx-workflows/dist/definition-normalizer.js.map +1 -0
- package/clinkx-workflows/dist/engine.d.ts +235 -0
- package/clinkx-workflows/dist/engine.js +1044 -0
- package/clinkx-workflows/dist/engine.js.map +1 -0
- package/clinkx-workflows/dist/errors.d.ts +74 -0
- package/clinkx-workflows/dist/errors.js +84 -0
- package/clinkx-workflows/dist/errors.js.map +1 -0
- package/clinkx-workflows/dist/fidelity.d.ts +112 -0
- package/clinkx-workflows/dist/fidelity.js +140 -0
- package/clinkx-workflows/dist/fidelity.js.map +1 -0
- package/clinkx-workflows/dist/fingerprint.d.ts +69 -0
- package/clinkx-workflows/dist/fingerprint.js +143 -0
- package/clinkx-workflows/dist/fingerprint.js.map +1 -0
- package/clinkx-workflows/dist/index.d.ts +16 -0
- package/clinkx-workflows/dist/index.js +42 -0
- package/clinkx-workflows/dist/index.js.map +1 -0
- package/clinkx-workflows/dist/loader.d.ts +64 -0
- package/clinkx-workflows/dist/loader.js +371 -0
- package/clinkx-workflows/dist/loader.js.map +1 -0
- package/clinkx-workflows/dist/logger.d.ts +16 -0
- package/clinkx-workflows/dist/logger.js +31 -0
- package/clinkx-workflows/dist/logger.js.map +1 -0
- package/clinkx-workflows/dist/path-validation.d.ts +23 -0
- package/clinkx-workflows/dist/path-validation.js +73 -0
- package/clinkx-workflows/dist/path-validation.js.map +1 -0
- package/clinkx-workflows/dist/prompt-budget.d.ts +31 -0
- package/clinkx-workflows/dist/prompt-budget.js +78 -0
- package/clinkx-workflows/dist/prompt-budget.js.map +1 -0
- package/clinkx-workflows/dist/queue.d.ts +16 -0
- package/clinkx-workflows/dist/queue.js +46 -0
- package/clinkx-workflows/dist/queue.js.map +1 -0
- package/clinkx-workflows/dist/ranking-reducer.d.ts +11 -0
- package/clinkx-workflows/dist/ranking-reducer.js +245 -0
- package/clinkx-workflows/dist/ranking-reducer.js.map +1 -0
- package/clinkx-workflows/dist/reducers/index.d.ts +8 -0
- package/clinkx-workflows/dist/reducers/index.js +12 -0
- package/clinkx-workflows/dist/reducers/index.js.map +1 -0
- package/clinkx-workflows/dist/run-id.d.ts +17 -0
- package/clinkx-workflows/dist/run-id.js +26 -0
- package/clinkx-workflows/dist/run-id.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-answer.d.ts +8 -0
- package/clinkx-workflows/dist/run-summary/cards/council-answer.js +75 -0
- package/clinkx-workflows/dist/run-summary/cards/council-answer.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-code-review.d.ts +13 -0
- package/clinkx-workflows/dist/run-summary/cards/council-code-review.js +90 -0
- package/clinkx-workflows/dist/run-summary/cards/council-code-review.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-debug.d.ts +9 -0
- package/clinkx-workflows/dist/run-summary/cards/council-debug.js +79 -0
- package/clinkx-workflows/dist/run-summary/cards/council-debug.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-default.d.ts +11 -0
- package/clinkx-workflows/dist/run-summary/cards/council-default.js +57 -0
- package/clinkx-workflows/dist/run-summary/cards/council-default.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-discover.d.ts +10 -0
- package/clinkx-workflows/dist/run-summary/cards/council-discover.js +79 -0
- package/clinkx-workflows/dist/run-summary/cards/council-discover.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/generic.d.ts +2 -0
- package/clinkx-workflows/dist/run-summary/cards/generic.js +4 -0
- package/clinkx-workflows/dist/run-summary/cards/generic.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/index.d.ts +6 -0
- package/clinkx-workflows/dist/run-summary/cards/index.js +17 -0
- package/clinkx-workflows/dist/run-summary/cards/index.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/utils.d.ts +6 -0
- package/clinkx-workflows/dist/run-summary/utils.js +30 -0
- package/clinkx-workflows/dist/run-summary/utils.js.map +1 -0
- package/clinkx-workflows/dist/run-summary-derived.d.ts +19 -0
- package/clinkx-workflows/dist/run-summary-derived.js +100 -0
- package/clinkx-workflows/dist/run-summary-derived.js.map +1 -0
- package/clinkx-workflows/dist/run-summary.d.ts +70 -0
- package/clinkx-workflows/dist/run-summary.js +125 -0
- package/clinkx-workflows/dist/run-summary.js.map +1 -0
- package/clinkx-workflows/dist/schema.d.ts +609 -0
- package/clinkx-workflows/dist/schema.js +123 -0
- package/clinkx-workflows/dist/schema.js.map +1 -0
- package/clinkx-workflows/dist/server.d.ts +16 -0
- package/clinkx-workflows/dist/server.js +33 -0
- package/clinkx-workflows/dist/server.js.map +1 -0
- package/clinkx-workflows/dist/shutdown.d.ts +54 -0
- package/clinkx-workflows/dist/shutdown.js +120 -0
- package/clinkx-workflows/dist/shutdown.js.map +1 -0
- package/clinkx-workflows/dist/state-schema.d.ts +141 -0
- package/clinkx-workflows/dist/state-schema.js +21 -0
- package/clinkx-workflows/dist/state-schema.js.map +1 -0
- package/clinkx-workflows/dist/state.d.ts +37 -0
- package/clinkx-workflows/dist/state.js +838 -0
- package/clinkx-workflows/dist/state.js.map +1 -0
- package/clinkx-workflows/dist/template-loader.d.ts +30 -0
- package/clinkx-workflows/dist/template-loader.js +77 -0
- package/clinkx-workflows/dist/template-loader.js.map +1 -0
- package/clinkx-workflows/dist/template.d.ts +54 -0
- package/clinkx-workflows/dist/template.js +128 -0
- package/clinkx-workflows/dist/template.js.map +1 -0
- package/clinkx-workflows/dist/transport.d.ts +91 -0
- package/clinkx-workflows/dist/transport.js +249 -0
- package/clinkx-workflows/dist/transport.js.map +1 -0
- package/clinkx-workflows/dist/types.d.ts +137 -0
- package/clinkx-workflows/dist/types.js +11 -0
- package/clinkx-workflows/dist/types.js.map +1 -0
- package/clinkx-workflows/dist/validators/council.d.ts +1488 -0
- package/clinkx-workflows/dist/validators/council.js +509 -0
- package/clinkx-workflows/dist/validators/council.js.map +1 -0
- package/clinkx-workflows/dist/validators/index.d.ts +40 -0
- package/clinkx-workflows/dist/validators/index.js +43 -0
- package/clinkx-workflows/dist/validators/index.js.map +1 -0
- package/clinkx-workflows/dist/workflow-receipt.d.ts +4 -0
- package/clinkx-workflows/dist/workflow-receipt.js +177 -0
- package/clinkx-workflows/dist/workflow-receipt.js.map +1 -0
- package/clinkx-workflows/dist/workflow-tools.d.ts +77 -0
- package/clinkx-workflows/dist/workflow-tools.js +1131 -0
- package/clinkx-workflows/dist/workflow-tools.js.map +1 -0
- package/clinkx-workflows/dist/workflows/council-default.d.ts +123 -0
- package/clinkx-workflows/dist/workflows/council-default.js +141 -0
- package/clinkx-workflows/dist/workflows/council-default.js.map +1 -0
- package/clinkx-workflows/dist/workflows/index.d.ts +12 -0
- package/clinkx-workflows/dist/workflows/index.js +15 -0
- package/clinkx-workflows/dist/workflows/index.js.map +1 -0
- package/conf/adapters/claude.json +13 -1
- package/conf/adapters/codex.json +11 -2
- package/conf/adapters/gemini.json +9 -0
- package/conf/adapters/glm.json +10 -0
- package/conf/adapters/hapi/claude.json +12 -2
- package/conf/adapters/hapi/codex.json +11 -2
- package/conf/adapters/hapi/gemini.json +9 -0
- package/conf/adapters/hapi/glm.json +10 -0
- package/conf/prompts/json-codereviewer.txt +6 -0
- package/conf/prompts/json-debug.txt +5 -0
- package/conf/prompts/json-default.txt +5 -0
- package/conf/prompts/json.txt +4 -1
- package/dist/config.d.ts +29 -4
- package/dist/config.js +23 -3
- package/dist/config.js.map +1 -1
- package/dist/handler.d.ts +2 -0
- package/dist/handler.js +2 -1
- package/dist/handler.js.map +1 -1
- package/dist/local-clink-backend.d.ts +30 -0
- package/dist/local-clink-backend.js +106 -0
- package/dist/local-clink-backend.js.map +1 -0
- package/dist/parsers/claude-stream-json.d.ts +1 -1
- package/dist/parsers/claude-stream-json.js +26 -8
- package/dist/parsers/claude-stream-json.js.map +1 -1
- package/dist/parsers/extract.d.ts +2 -0
- package/dist/parsers/extract.js +46 -20
- package/dist/parsers/extract.js.map +1 -1
- package/dist/pipeline.d.ts +2 -4
- package/dist/pipeline.js +246 -31
- package/dist/pipeline.js.map +1 -1
- package/dist/prompt.js +8 -1
- package/dist/prompt.js.map +1 -1
- package/dist/registry.d.ts +4 -0
- package/dist/registry.js +14 -0
- package/dist/registry.js.map +1 -1
- package/dist/result-contract.d.ts +6 -1
- package/dist/result-contract.js +10 -22
- package/dist/result-contract.js.map +1 -1
- package/dist/runner.js +59 -12
- package/dist/runner.js.map +1 -1
- package/dist/schema.d.ts +20 -0
- package/dist/schema.js +29 -2
- package/dist/schema.js.map +1 -1
- package/dist/server.d.ts +3 -3
- package/dist/server.js +119 -45
- package/dist/server.js.map +1 -1
- package/package.json +12 -5
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clink client wrapper for clinkx-workflows.
|
|
3
|
+
*
|
|
4
|
+
* Provides callClink() — the typed interface for calling the child's
|
|
5
|
+
* clink tool and parsing its response into output_text + debug_metadata.
|
|
6
|
+
*
|
|
7
|
+
* Key behaviors:
|
|
8
|
+
* - Always sets debug: true on internal calls
|
|
9
|
+
* - Parses MCP text content blocks robustly (no positional assumptions)
|
|
10
|
+
* - Strips host _meta.progressToken from child calls (progress isolation)
|
|
11
|
+
* - Maps child -32602 to InvalidCallError
|
|
12
|
+
* - Maps child isError: true to CallExecutionError
|
|
13
|
+
* - Only output_text is stored/threaded/hashed
|
|
14
|
+
*/
|
|
15
|
+
import { InvalidCallError, CallExecutionError } from "./errors.js";
|
|
16
|
+
import { logger } from "./logger.js";
|
|
17
|
+
import { basename } from "node:path";
|
|
18
|
+
/**
|
|
19
|
+
* Build the tool arguments for a child clink call.
|
|
20
|
+
*
|
|
21
|
+
* Ensures debug: true is always set and strips any _meta.progressToken
|
|
22
|
+
* to prevent child from emitting progress to the host.
|
|
23
|
+
*/
|
|
24
|
+
export function buildCallArgs(input) {
|
|
25
|
+
// Clone to avoid mutating caller's input
|
|
26
|
+
const args = { ...input };
|
|
27
|
+
// Always enable debug for internal calls
|
|
28
|
+
args["debug"] = true;
|
|
29
|
+
// Strip host _meta.progressToken (1-11a: progress isolation)
|
|
30
|
+
if (args["_meta"] != null && typeof args["_meta"] === "object") {
|
|
31
|
+
const meta = { ...args["_meta"] };
|
|
32
|
+
delete meta["progressToken"];
|
|
33
|
+
// Only keep _meta if it still has keys
|
|
34
|
+
if (Object.keys(meta).length > 0) {
|
|
35
|
+
args["_meta"] = meta;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
delete args["_meta"];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return args;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse the MCP tool call result into output_text and debug_metadata.
|
|
45
|
+
*
|
|
46
|
+
* Does NOT assume positional ordering — scans all text content blocks
|
|
47
|
+
* and identifies the _debug block by JSON-parsing each one.
|
|
48
|
+
*/
|
|
49
|
+
export function parseCallResult(result) {
|
|
50
|
+
const textBlocks = [];
|
|
51
|
+
let debugMetadata = null;
|
|
52
|
+
if (result.content != null) {
|
|
53
|
+
for (const block of result.content) {
|
|
54
|
+
if (block.type === "text" && block.text != null) {
|
|
55
|
+
// Try to identify _debug block
|
|
56
|
+
const text = block.text.trim();
|
|
57
|
+
if (debugMetadata == null && text.startsWith("{")) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(text);
|
|
60
|
+
if ("_debug" in parsed && typeof parsed["_debug"] === "object") {
|
|
61
|
+
debugMetadata = parsed["_debug"];
|
|
62
|
+
continue; // Don't include _debug block in output_text
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Not JSON or not _debug — treat as output text
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
textBlocks.push(block.text);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
outputText: textBlocks.join(""),
|
|
75
|
+
debugMetadata,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function sanitizeDebugMetadataForLog(debug) {
|
|
79
|
+
if (debug == null)
|
|
80
|
+
return null;
|
|
81
|
+
if (typeof debug["adapter_config_path"] !== "string")
|
|
82
|
+
return debug;
|
|
83
|
+
return {
|
|
84
|
+
...debug,
|
|
85
|
+
adapter_config_path: basename(debug["adapter_config_path"]),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Call the child's clink tool and return parsed output.
|
|
90
|
+
*
|
|
91
|
+
* @param session - Active ClinkBackend
|
|
92
|
+
* @param input - Tool input arguments (ClinkInput shape)
|
|
93
|
+
* @param signal - Optional AbortSignal for cancellation
|
|
94
|
+
* @param context - Stage/call context for error attribution
|
|
95
|
+
* @returns Parsed clink call result
|
|
96
|
+
* @throws InvalidCallError on child -32602
|
|
97
|
+
* @throws CallExecutionError on child isError: true
|
|
98
|
+
*/
|
|
99
|
+
export async function callClink(session, input, signal, context, timeoutMs) {
|
|
100
|
+
const args = buildCallArgs(input);
|
|
101
|
+
const stageId = context?.stageId ?? "unknown";
|
|
102
|
+
const callId = context?.callId ?? "unknown";
|
|
103
|
+
let result;
|
|
104
|
+
try {
|
|
105
|
+
result = await session.callTool(args, signal != null || timeoutMs != null
|
|
106
|
+
? {
|
|
107
|
+
...(signal != null ? { signal } : {}),
|
|
108
|
+
...(timeoutMs != null ? { timeoutMs } : {}),
|
|
109
|
+
}
|
|
110
|
+
: undefined);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
// Check for MCP -32602 (InvalidParams) error from child
|
|
114
|
+
if (isMcpInvalidParams(err)) {
|
|
115
|
+
throw new InvalidCallError(`Child rejected call as invalid: ${err instanceof Error ? err.message : String(err)}`, stageId, callId);
|
|
116
|
+
}
|
|
117
|
+
throw err;
|
|
118
|
+
}
|
|
119
|
+
// Map child isError: true to CallExecutionError
|
|
120
|
+
if (result.isError === true) {
|
|
121
|
+
const parsed = parseCallResult(result);
|
|
122
|
+
const failureClass = classifyFailure(parsed.debugMetadata);
|
|
123
|
+
const childDebugMetadata = extractChildFailureMetadata(parsed.debugMetadata);
|
|
124
|
+
// Fallback: if pipeline missed the panic class (e.g. wrapper formatting
|
|
125
|
+
// differences), detect the codex-local crash signature in output text.
|
|
126
|
+
let effectiveFailureClass = failureClass;
|
|
127
|
+
let effectiveChildDebugMetadata = childDebugMetadata;
|
|
128
|
+
if (failureClass === "permanent" && parsed.outputText != null) {
|
|
129
|
+
const codexLocalMatch = parsed.outputText.match(/\[codex-local\]:?\s*Local Codex process failed(?::\s*Process exited with code:\s*(\d+))?/);
|
|
130
|
+
if (codexLocalMatch != null) {
|
|
131
|
+
const exitCode = codexLocalMatch[1] != null ? Number(codexLocalMatch[1]) : null;
|
|
132
|
+
const synthesizedClass = exitCode === 101 ? "codex_local_rust_panic" : "codex_local_crash";
|
|
133
|
+
if (TRANSIENT_PANIC_CLASSES.has(synthesizedClass)) {
|
|
134
|
+
effectiveFailureClass = "transient";
|
|
135
|
+
logger.info({ stage_id: stageId, call_id: callId, synthesized_panic_class: synthesizedClass }, "reclassified failure as transient via output-text fallback");
|
|
136
|
+
// Synthesize into childDebugMetadata (readonly fields — create new object)
|
|
137
|
+
if (effectiveChildDebugMetadata != null) {
|
|
138
|
+
effectiveChildDebugMetadata = { ...effectiveChildDebugMetadata, codex_panic_class: synthesizedClass };
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
effectiveChildDebugMetadata = { codex_panic_class: synthesizedClass };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
logger.warn({
|
|
147
|
+
stage_id: stageId,
|
|
148
|
+
call_id: callId,
|
|
149
|
+
failure_class: failureClass,
|
|
150
|
+
effective_failure_class: effectiveFailureClass,
|
|
151
|
+
debug: sanitizeDebugMetadataForLog(parsed.debugMetadata),
|
|
152
|
+
}, "child clink call returned isError");
|
|
153
|
+
throw new CallExecutionError(parsed.outputText || "Child clink call failed", stageId, callId, effectiveFailureClass, effectiveChildDebugMetadata);
|
|
154
|
+
}
|
|
155
|
+
return parseCallResult(result);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Panic classes confirmed as transient (retryable). Only classes with strong
|
|
159
|
+
* evidence of being transport-layer failures belong here. `codex_local_crash`
|
|
160
|
+
* is deliberately excluded — a generic wrapper exit may indicate a permanent
|
|
161
|
+
* failure (OOM, config error, sandbox violation).
|
|
162
|
+
*/
|
|
163
|
+
const TRANSIENT_PANIC_CLASSES = new Set([
|
|
164
|
+
"stdout_would_block",
|
|
165
|
+
"stdout_broken_pipe",
|
|
166
|
+
"stdout_write_failure",
|
|
167
|
+
"codex_local_rust_panic",
|
|
168
|
+
]);
|
|
169
|
+
/**
|
|
170
|
+
* Classify a child failure as transient or permanent based on _debug metadata.
|
|
171
|
+
*/
|
|
172
|
+
function classifyFailure(debug) {
|
|
173
|
+
if (debug == null)
|
|
174
|
+
return "permanent";
|
|
175
|
+
const reason = debug["termination_reason"];
|
|
176
|
+
if (reason === "wall" || reason === "idle")
|
|
177
|
+
return "transient";
|
|
178
|
+
const panicClass = debug["codex_panic_class"];
|
|
179
|
+
if (typeof panicClass === "string" && TRANSIENT_PANIC_CLASSES.has(panicClass)) {
|
|
180
|
+
return "transient";
|
|
181
|
+
}
|
|
182
|
+
const exitCode = debug["exit_code"];
|
|
183
|
+
if (exitCode === null || exitCode === undefined)
|
|
184
|
+
return "transient";
|
|
185
|
+
return "permanent";
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Extract structured failure metadata from the child's _debug block.
|
|
189
|
+
*/
|
|
190
|
+
function extractChildFailureMetadata(debug) {
|
|
191
|
+
if (debug == null)
|
|
192
|
+
return undefined;
|
|
193
|
+
const meta = {
|
|
194
|
+
rejection_reason: typeof debug["rejection_reason"] === "string" ? debug["rejection_reason"] : undefined,
|
|
195
|
+
parse_status: typeof debug["parse_status"] === "string" ? debug["parse_status"] : undefined,
|
|
196
|
+
parse_source: typeof debug["parse_source"] === "string" ? debug["parse_source"] : undefined,
|
|
197
|
+
adapter_config_path: typeof debug["adapter_config_path"] === "string" ? debug["adapter_config_path"] : undefined,
|
|
198
|
+
exit_code: typeof debug["exit_code"] === "number" || debug["exit_code"] === null ? debug["exit_code"] : undefined,
|
|
199
|
+
codex_panic_class: typeof debug["codex_panic_class"] === "string" ? debug["codex_panic_class"] : undefined,
|
|
200
|
+
};
|
|
201
|
+
// Only return if at least one field is present
|
|
202
|
+
const hasContent = meta.rejection_reason != null || meta.parse_status != null ||
|
|
203
|
+
meta.parse_source != null || meta.adapter_config_path != null || meta.exit_code !== undefined ||
|
|
204
|
+
meta.codex_panic_class != null;
|
|
205
|
+
return hasContent ? meta : undefined;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if an error is an MCP -32602 (InvalidParams) error.
|
|
209
|
+
*/
|
|
210
|
+
function isMcpInvalidParams(err) {
|
|
211
|
+
if (err == null || typeof err !== "object")
|
|
212
|
+
return false;
|
|
213
|
+
const code = err["code"];
|
|
214
|
+
return code === -32602;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=clink-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clink-client.js","sourceRoot":"","sources":["../src/clink-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAA6B,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAWrC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA8B;IAE9B,yCAAyC;IACzC,MAAM,IAAI,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnD,yCAAyC;IACzC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAErB,6DAA6D;IAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,EAAE,GAAI,IAAI,CAAC,OAAO,CAA6B,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,uCAAuC;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,aAAa,GAAmC,IAAI,CAAC;IAEzD,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBAChD,+BAA+B;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;wBAC3D,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;4BAC/D,aAAa,GAAG,MAAM,CAAC,QAAQ,CAA4B,CAAC;4BAC5D,SAAS,CAAC,4CAA4C;wBACxD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,gDAAgD;oBAClD,CAAC;gBACH,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAqC;IAErC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,OAAO,KAAK,CAAC,qBAAqB,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEnE,OAAO;QACL,GAAG,KAAK;QACR,mBAAmB,EAAE,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAqB,EACrB,KAA8B,EAC9B,MAAoB,EACpB,OAA6C,EAC7C,SAAkB;IAElB,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC;IAE5C,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAC7B,IAAI,EACJ,MAAM,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI;YACjC,CAAC,CAAC;gBACE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C;YACH,CAAC,CAAC,SAAS,CACd,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,wDAAwD;QACxD,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAgB,CACxB,mCAAmC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACrF,OAAO,EACP,MAAM,CACP,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,gDAAgD;IAChD,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7E,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,qBAAqB,GAAG,YAAY,CAAC;QACzC,IAAI,2BAA2B,GAAG,kBAAkB,CAAC;QACrD,IAAI,YAAY,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC9D,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAC7C,0FAA0F,CAC3F,CAAC;YACF,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChF,MAAM,gBAAgB,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAC3F,IAAI,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAClD,qBAAqB,GAAG,WAAW,CAAC;oBACpC,MAAM,CAAC,IAAI,CACT,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,EACjF,4DAA4D,CAC7D,CAAC;oBACF,2EAA2E;oBAC3E,IAAI,2BAA2B,IAAI,IAAI,EAAE,CAAC;wBACxC,2BAA2B,GAAG,EAAE,GAAG,2BAA2B,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;oBACxG,CAAC;yBAAM,CAAC;wBACN,2BAA2B,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;oBACxE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CACT;YACE,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,YAAY;YAC3B,uBAAuB,EAAE,qBAAqB;YAC9C,KAAK,EAAE,2BAA2B,CAAC,MAAM,CAAC,aAAa,CAAC;SACzD,EACD,mCAAmC,CACpC,CAAC;QAEF,MAAM,IAAI,kBAAkB,CAC1B,MAAM,CAAC,UAAU,IAAI,yBAAyB,EAC9C,OAAO,EACP,MAAM,EACN,qBAAqB,EACrB,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC;IAC3D,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;CACzB,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,eAAe,CACtB,KAAqC;IAErC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,WAAW,CAAC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC9C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAEpE,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAClC,KAAqC;IAErC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,IAAI,GAAyB;QACjC,gBAAgB,EAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACvG,YAAY,EAAE,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3F,YAAY,EAAE,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3F,mBAAmB,EAAE,OAAO,KAAK,CAAC,qBAAqB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;QAChH,SAAS,EAAE,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAkB,CAAC,CAAC,CAAC,SAAS;QAClI,iBAAiB,EAAE,OAAO,KAAK,CAAC,mBAAmB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS;KAC3G,CAAC;IAEF,+CAA+C;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;QAC3E,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAC7F,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC;IACjC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,IAAI,GAAI,GAA+B,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable definitions and defaults for clinkx-workflows.
|
|
3
|
+
*
|
|
4
|
+
* All workflow-server env vars use the CLINKX_WORKFLOWS_* prefix.
|
|
5
|
+
* Child env vars (CLINKX_*) are scrubbed from the child process environment
|
|
6
|
+
* and re-injected only with explicit workflow-owned values.
|
|
7
|
+
*
|
|
8
|
+
* ## Real vs Dead Knobs (child env)
|
|
9
|
+
*
|
|
10
|
+
* REAL controls (child env CAN control these):
|
|
11
|
+
* - CLINKX_MAX_CONCURRENT: fail-fast semaphore depth (concurrency.ts:3,25-29)
|
|
12
|
+
* - CLINKX_MAX_RESPONSE_CHARS: output truncation ceiling (pipeline.ts env fallback)
|
|
13
|
+
* - CLINKX_MAX_OUTPUT_BYTES: per-stream capture cap (runner.ts::createStreamCapture)
|
|
14
|
+
* - CLINKX_MAX_PROMPT_BYTES: pre-dispatch prompt ceiling (runner.ts)
|
|
15
|
+
* - CLINKX_CONFIG_PATH: adapter config path override
|
|
16
|
+
* - CLINKX_ALLOWED_ROOTS: comma-separated allowed path prefixes
|
|
17
|
+
* - CLINKX_LOG_LEVEL: pino log verbosity
|
|
18
|
+
*
|
|
19
|
+
* DEAD knobs (adapter JSON wins, env has no effect with current shipped adapters):
|
|
20
|
+
* - CLINKX_TIMEOUT_SECONDS: both shipped adapters set timeout_seconds in JSON
|
|
21
|
+
* (codex.json:9 = 3600, claude.json:8 = 3600). Adapter config wins per runner.ts:156-159.
|
|
22
|
+
* - CLINKX_IDLE_TIMEOUT_SECONDS: both shipped adapters set idle_timeout_seconds in JSON.
|
|
23
|
+
* Adapter config wins per runner.ts:164-167.
|
|
24
|
+
* - CLINKX_IDLE_TIMEOUT_STARTUP_SECONDS: both shipped adapters set idle_timeout_startup_seconds.
|
|
25
|
+
* Adapter config wins per runner.ts:168-171. Additionally, result_contract.enabled forces
|
|
26
|
+
* both idle timers to 0 (runner.ts:163-170).
|
|
27
|
+
*/
|
|
28
|
+
/** Resolve workspace root: explicit env > process.cwd() with warning. */
|
|
29
|
+
export declare function resolveWorkspaceRoot(): string;
|
|
30
|
+
/** Whether workspace root was explicitly configured. */
|
|
31
|
+
export declare function hasExplicitWorkspaceRoot(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Derive CLINKX_ALLOWED_ROOTS for the child process.
|
|
34
|
+
* Union of resolved workspace root + workflow state/artifact roots.
|
|
35
|
+
* Rejects filesystem root (/) as workspace root.
|
|
36
|
+
*/
|
|
37
|
+
export declare function deriveAllowedRoots(workspaceRoot: string, stateDir: string, artifactsDir: string): string;
|
|
38
|
+
/** Command to spawn the owned ClinkX child. */
|
|
39
|
+
export declare function getClinkxCmd(): string;
|
|
40
|
+
/** Workflow definition directory. */
|
|
41
|
+
export declare function getWorkflowsPath(): string;
|
|
42
|
+
/** Prompt template root directory (resolved relative to package root). */
|
|
43
|
+
export declare function getTemplatesPath(): string;
|
|
44
|
+
/** Upper bound for concurrent calls within a parallel stage. */
|
|
45
|
+
export declare function getMaxParallel(): number;
|
|
46
|
+
/** Passed to child as CLINKX_MAX_CONCURRENT. */
|
|
47
|
+
export declare function getChildMaxConcurrent(): number;
|
|
48
|
+
/** Passed to child as CLINKX_MAX_RESPONSE_CHARS (200k to avoid silent context truncation). */
|
|
49
|
+
export declare function getChildMaxResponseChars(): number;
|
|
50
|
+
/** Passed to child as CLINKX_MAX_OUTPUT_BYTES. */
|
|
51
|
+
export declare function getChildMaxOutputBytes(): number;
|
|
52
|
+
/** Passed to child as CLINKX_MAX_PROMPT_BYTES. */
|
|
53
|
+
export declare function getChildMaxPromptBytes(): number;
|
|
54
|
+
/** Optional workflow-owned child adapter bundle path. */
|
|
55
|
+
export declare function getChildConfigPath(): string | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Default workflow-level timeout (seconds).
|
|
58
|
+
*
|
|
59
|
+
* This is the hard wall clock ceiling for an entire workflow run. The engine
|
|
60
|
+
* creates an AbortController with this deadline; when exceeded, remaining
|
|
61
|
+
* stages are aborted. Overridden by `settings.timeout_seconds` in the
|
|
62
|
+
* workflow definition.
|
|
63
|
+
*
|
|
64
|
+
* This is the workflow-server-level timeout (Layer 1 in the timeout ownership
|
|
65
|
+
* model). It is distinct from:
|
|
66
|
+
* - Per-call timeout_seconds in workflow definitions (Layer 2, upward extension only)
|
|
67
|
+
* - Child-side adapter timeouts in adapter JSON (Layer 3, adapter-owned)
|
|
68
|
+
*
|
|
69
|
+
* See engine.ts module comment for the full timeout ownership model.
|
|
70
|
+
*/
|
|
71
|
+
export declare function getWorkflowTimeout(): number;
|
|
72
|
+
/** Pre-dispatch UTF-8 prompt/context ceiling (bytes). */
|
|
73
|
+
export declare function getMaxPromptBytes(): number;
|
|
74
|
+
/** Workflow server log level. */
|
|
75
|
+
export declare function getLogLevel(): string;
|
|
76
|
+
/** Persistent workflow state directory. */
|
|
77
|
+
export declare function getStateDir(): string;
|
|
78
|
+
/** Base directory containing persistent run state directories. */
|
|
79
|
+
export declare function getRunsDir(): string;
|
|
80
|
+
/** Persistent state directory for a specific run. */
|
|
81
|
+
export declare function getRunStateDir(runId: string): string;
|
|
82
|
+
/** Disposable per-run artifacts directory. */
|
|
83
|
+
export declare function getArtifactsDir(): string;
|
|
84
|
+
/**
|
|
85
|
+
* CLINKX_* env vars to scrub from child process environment before re-injection.
|
|
86
|
+
* All CLINKX_* vars are scrubbed; only explicit workflow-owned values are re-injected.
|
|
87
|
+
*/
|
|
88
|
+
export declare const CHILD_ENV_SCRUB_PREFIX = "CLINKX_";
|
|
89
|
+
/**
|
|
90
|
+
* Config-discovery vars to also scrub (prevent child from inheriting parent's
|
|
91
|
+
* config resolution path, which would bypass workflow-owned adapter bundles).
|
|
92
|
+
*/
|
|
93
|
+
export declare const CHILD_ENV_SCRUB_EXTRA: readonly ["XDG_CONFIG_HOME"];
|
|
94
|
+
/**
|
|
95
|
+
* Child env vars that are re-injected with workflow-owned values.
|
|
96
|
+
* Maps from workflow config key to child env var name.
|
|
97
|
+
*/
|
|
98
|
+
export declare const CHILD_ENV_REINJECT_MAP: {
|
|
99
|
+
readonly maxConcurrent: "CLINKX_MAX_CONCURRENT";
|
|
100
|
+
readonly maxResponseChars: "CLINKX_MAX_RESPONSE_CHARS";
|
|
101
|
+
readonly maxOutputBytes: "CLINKX_MAX_OUTPUT_BYTES";
|
|
102
|
+
readonly maxPromptBytes: "CLINKX_MAX_PROMPT_BYTES";
|
|
103
|
+
readonly configPath: "CLINKX_CONFIG_PATH";
|
|
104
|
+
readonly allowedRoots: "CLINKX_ALLOWED_ROOTS";
|
|
105
|
+
readonly logLevel: "CLINKX_LOG_LEVEL";
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Baseline OS env vars that are NEVER scrubbed from child.
|
|
109
|
+
* ClinkX's internal env.ts::buildEnv handles delegate subprocess sanitization.
|
|
110
|
+
*/
|
|
111
|
+
export declare const CHILD_ENV_BASELINE: readonly ["PATH", "HOME", "USER", "LANG", "TMPDIR"];
|
|
112
|
+
/**
|
|
113
|
+
* DEAD KNOBS: these env vars have no effect with current shipped adapters
|
|
114
|
+
* because adapter JSON config wins (runner.ts:156-171). Both shipped adapters
|
|
115
|
+
* set timeout_seconds in JSON (codex.json:9 = 3600, claude.json:8 = 3600).
|
|
116
|
+
*
|
|
117
|
+
* These are Layer 3 (child-side) timeout controls. The workflow engine does
|
|
118
|
+
* NOT attempt to control child-side timeouts via env vars. Instead, use
|
|
119
|
+
* CLINKX_WORKFLOWS_CHILD_CONFIG_PATH to point at a workflow-specific adapter
|
|
120
|
+
* bundle with the desired timeout floors.
|
|
121
|
+
*
|
|
122
|
+
* See engine.ts module comment for the full timeout ownership model.
|
|
123
|
+
*
|
|
124
|
+
* Do NOT set these in the child env — they create a false sense of control.
|
|
125
|
+
*/
|
|
126
|
+
export declare const DEAD_KNOBS: readonly ["CLINKX_TIMEOUT_SECONDS", "CLINKX_IDLE_TIMEOUT_SECONDS", "CLINKX_IDLE_TIMEOUT_STARTUP_SECONDS"];
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable definitions and defaults for clinkx-workflows.
|
|
3
|
+
*
|
|
4
|
+
* All workflow-server env vars use the CLINKX_WORKFLOWS_* prefix.
|
|
5
|
+
* Child env vars (CLINKX_*) are scrubbed from the child process environment
|
|
6
|
+
* and re-injected only with explicit workflow-owned values.
|
|
7
|
+
*
|
|
8
|
+
* ## Real vs Dead Knobs (child env)
|
|
9
|
+
*
|
|
10
|
+
* REAL controls (child env CAN control these):
|
|
11
|
+
* - CLINKX_MAX_CONCURRENT: fail-fast semaphore depth (concurrency.ts:3,25-29)
|
|
12
|
+
* - CLINKX_MAX_RESPONSE_CHARS: output truncation ceiling (pipeline.ts env fallback)
|
|
13
|
+
* - CLINKX_MAX_OUTPUT_BYTES: per-stream capture cap (runner.ts::createStreamCapture)
|
|
14
|
+
* - CLINKX_MAX_PROMPT_BYTES: pre-dispatch prompt ceiling (runner.ts)
|
|
15
|
+
* - CLINKX_CONFIG_PATH: adapter config path override
|
|
16
|
+
* - CLINKX_ALLOWED_ROOTS: comma-separated allowed path prefixes
|
|
17
|
+
* - CLINKX_LOG_LEVEL: pino log verbosity
|
|
18
|
+
*
|
|
19
|
+
* DEAD knobs (adapter JSON wins, env has no effect with current shipped adapters):
|
|
20
|
+
* - CLINKX_TIMEOUT_SECONDS: both shipped adapters set timeout_seconds in JSON
|
|
21
|
+
* (codex.json:9 = 3600, claude.json:8 = 3600). Adapter config wins per runner.ts:156-159.
|
|
22
|
+
* - CLINKX_IDLE_TIMEOUT_SECONDS: both shipped adapters set idle_timeout_seconds in JSON.
|
|
23
|
+
* Adapter config wins per runner.ts:164-167.
|
|
24
|
+
* - CLINKX_IDLE_TIMEOUT_STARTUP_SECONDS: both shipped adapters set idle_timeout_startup_seconds.
|
|
25
|
+
* Adapter config wins per runner.ts:168-171. Additionally, result_contract.enabled forces
|
|
26
|
+
* both idle timers to 0 (runner.ts:163-170).
|
|
27
|
+
*/
|
|
28
|
+
import { realpathSync } from "node:fs";
|
|
29
|
+
import { join, resolve } from "node:path";
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Workflow server env vars (CLINKX_WORKFLOWS_*)
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
function envStr(key, fallback) {
|
|
34
|
+
const v = process.env[key];
|
|
35
|
+
return v != null && v !== "" ? v : fallback;
|
|
36
|
+
}
|
|
37
|
+
function envInt(key, fallback) {
|
|
38
|
+
const v = process.env[key];
|
|
39
|
+
if (v == null || v === "")
|
|
40
|
+
return fallback;
|
|
41
|
+
const n = Number(v);
|
|
42
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
43
|
+
}
|
|
44
|
+
/** Resolve workspace root: explicit env > process.cwd() with warning. */
|
|
45
|
+
export function resolveWorkspaceRoot() {
|
|
46
|
+
const explicit = process.env["CLINKX_WORKFLOWS_WORKSPACE_ROOT"];
|
|
47
|
+
if (explicit != null && explicit !== "") {
|
|
48
|
+
try {
|
|
49
|
+
return realpathSync(resolve(explicit));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return resolve(explicit);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Fallback with warning — caller should log this
|
|
56
|
+
return resolve(process.cwd());
|
|
57
|
+
}
|
|
58
|
+
/** Whether workspace root was explicitly configured. */
|
|
59
|
+
export function hasExplicitWorkspaceRoot() {
|
|
60
|
+
const v = process.env["CLINKX_WORKFLOWS_WORKSPACE_ROOT"];
|
|
61
|
+
return v != null && v !== "";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Derive CLINKX_ALLOWED_ROOTS for the child process.
|
|
65
|
+
* Union of resolved workspace root + workflow state/artifact roots.
|
|
66
|
+
* Rejects filesystem root (/) as workspace root.
|
|
67
|
+
*/
|
|
68
|
+
export function deriveAllowedRoots(workspaceRoot, stateDir, artifactsDir) {
|
|
69
|
+
const roots = [workspaceRoot, stateDir, artifactsDir];
|
|
70
|
+
return roots.join(",");
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Config accessors
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
/** Command to spawn the owned ClinkX child. */
|
|
76
|
+
export function getClinkxCmd() {
|
|
77
|
+
return envStr("CLINKX_WORKFLOWS_CLINKX_CMD", "clinkx");
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolve a path relative to the package root (two levels up from dist/src/).
|
|
81
|
+
* If the path is absolute, return as-is.
|
|
82
|
+
*/
|
|
83
|
+
function resolvePackageRelative(raw) {
|
|
84
|
+
if (raw.startsWith("/")) {
|
|
85
|
+
return raw;
|
|
86
|
+
}
|
|
87
|
+
const packageRoot = resolve(import.meta.dirname, "..");
|
|
88
|
+
return resolve(packageRoot, raw);
|
|
89
|
+
}
|
|
90
|
+
/** Workflow definition directory. */
|
|
91
|
+
export function getWorkflowsPath() {
|
|
92
|
+
return envStr("CLINKX_WORKFLOWS_PATH", "workflows/");
|
|
93
|
+
}
|
|
94
|
+
/** Prompt template root directory (resolved relative to package root). */
|
|
95
|
+
export function getTemplatesPath() {
|
|
96
|
+
return resolvePackageRelative(envStr("CLINKX_WORKFLOWS_TEMPLATES_PATH", "templates/"));
|
|
97
|
+
}
|
|
98
|
+
/** Upper bound for concurrent calls within a parallel stage. */
|
|
99
|
+
export function getMaxParallel() {
|
|
100
|
+
return envInt("CLINKX_WORKFLOWS_MAX_PARALLEL", 5);
|
|
101
|
+
}
|
|
102
|
+
/** Passed to child as CLINKX_MAX_CONCURRENT. */
|
|
103
|
+
export function getChildMaxConcurrent() {
|
|
104
|
+
return envInt("CLINKX_WORKFLOWS_CHILD_MAX_CONCURRENT", 5);
|
|
105
|
+
}
|
|
106
|
+
/** Passed to child as CLINKX_MAX_RESPONSE_CHARS (200k to avoid silent context truncation). */
|
|
107
|
+
export function getChildMaxResponseChars() {
|
|
108
|
+
return envInt("CLINKX_WORKFLOWS_CHILD_MAX_RESPONSE_CHARS", 200_000);
|
|
109
|
+
}
|
|
110
|
+
/** Passed to child as CLINKX_MAX_OUTPUT_BYTES. */
|
|
111
|
+
export function getChildMaxOutputBytes() {
|
|
112
|
+
return envInt("CLINKX_WORKFLOWS_CHILD_MAX_OUTPUT_BYTES", 10_485_760);
|
|
113
|
+
}
|
|
114
|
+
/** Passed to child as CLINKX_MAX_PROMPT_BYTES. */
|
|
115
|
+
export function getChildMaxPromptBytes() {
|
|
116
|
+
return envInt("CLINKX_WORKFLOWS_CHILD_MAX_PROMPT_BYTES", 1_048_576);
|
|
117
|
+
}
|
|
118
|
+
/** Optional workflow-owned child adapter bundle path. */
|
|
119
|
+
export function getChildConfigPath() {
|
|
120
|
+
const v = process.env["CLINKX_WORKFLOWS_CHILD_CONFIG_PATH"];
|
|
121
|
+
return v != null && v !== "" ? v : undefined;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Default workflow-level timeout (seconds).
|
|
125
|
+
*
|
|
126
|
+
* This is the hard wall clock ceiling for an entire workflow run. The engine
|
|
127
|
+
* creates an AbortController with this deadline; when exceeded, remaining
|
|
128
|
+
* stages are aborted. Overridden by `settings.timeout_seconds` in the
|
|
129
|
+
* workflow definition.
|
|
130
|
+
*
|
|
131
|
+
* This is the workflow-server-level timeout (Layer 1 in the timeout ownership
|
|
132
|
+
* model). It is distinct from:
|
|
133
|
+
* - Per-call timeout_seconds in workflow definitions (Layer 2, upward extension only)
|
|
134
|
+
* - Child-side adapter timeouts in adapter JSON (Layer 3, adapter-owned)
|
|
135
|
+
*
|
|
136
|
+
* See engine.ts module comment for the full timeout ownership model.
|
|
137
|
+
*/
|
|
138
|
+
export function getWorkflowTimeout() {
|
|
139
|
+
return envInt("CLINKX_WORKFLOWS_TIMEOUT_SECONDS", 1800);
|
|
140
|
+
}
|
|
141
|
+
/** Pre-dispatch UTF-8 prompt/context ceiling (bytes). */
|
|
142
|
+
export function getMaxPromptBytes() {
|
|
143
|
+
return envInt("CLINKX_WORKFLOWS_MAX_PROMPT_BYTES", 900_000);
|
|
144
|
+
}
|
|
145
|
+
/** Workflow server log level. */
|
|
146
|
+
export function getLogLevel() {
|
|
147
|
+
return envStr("CLINKX_WORKFLOWS_LOG_LEVEL", "info");
|
|
148
|
+
}
|
|
149
|
+
/** Persistent workflow state directory. */
|
|
150
|
+
export function getStateDir() {
|
|
151
|
+
const xdgState = process.env["XDG_STATE_HOME"];
|
|
152
|
+
const defaultBase = xdgState != null && xdgState !== ""
|
|
153
|
+
? xdgState
|
|
154
|
+
: `${process.env["HOME"] ?? "~"}/.local/state`;
|
|
155
|
+
return envStr("CLINKX_WORKFLOWS_STATE_DIR", `${defaultBase}/clinkx-workflows`);
|
|
156
|
+
}
|
|
157
|
+
/** Base directory containing persistent run state directories. */
|
|
158
|
+
export function getRunsDir() {
|
|
159
|
+
return join(getStateDir(), "runs");
|
|
160
|
+
}
|
|
161
|
+
/** Persistent state directory for a specific run. */
|
|
162
|
+
export function getRunStateDir(runId) {
|
|
163
|
+
return join(getRunsDir(), runId);
|
|
164
|
+
}
|
|
165
|
+
/** Disposable per-run artifacts directory. */
|
|
166
|
+
export function getArtifactsDir() {
|
|
167
|
+
const tmpdir = process.env["TMPDIR"] ?? "/tmp";
|
|
168
|
+
return envStr("CLINKX_WORKFLOWS_ARTIFACTS_DIR", `${tmpdir}/clinkx-workflows/artifacts`);
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Child env scrub/reinject constants
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* CLINKX_* env vars to scrub from child process environment before re-injection.
|
|
175
|
+
* All CLINKX_* vars are scrubbed; only explicit workflow-owned values are re-injected.
|
|
176
|
+
*/
|
|
177
|
+
export const CHILD_ENV_SCRUB_PREFIX = "CLINKX_";
|
|
178
|
+
/**
|
|
179
|
+
* Config-discovery vars to also scrub (prevent child from inheriting parent's
|
|
180
|
+
* config resolution path, which would bypass workflow-owned adapter bundles).
|
|
181
|
+
*/
|
|
182
|
+
export const CHILD_ENV_SCRUB_EXTRA = ["XDG_CONFIG_HOME"];
|
|
183
|
+
/**
|
|
184
|
+
* Child env vars that are re-injected with workflow-owned values.
|
|
185
|
+
* Maps from workflow config key to child env var name.
|
|
186
|
+
*/
|
|
187
|
+
export const CHILD_ENV_REINJECT_MAP = {
|
|
188
|
+
maxConcurrent: "CLINKX_MAX_CONCURRENT",
|
|
189
|
+
maxResponseChars: "CLINKX_MAX_RESPONSE_CHARS",
|
|
190
|
+
maxOutputBytes: "CLINKX_MAX_OUTPUT_BYTES",
|
|
191
|
+
maxPromptBytes: "CLINKX_MAX_PROMPT_BYTES",
|
|
192
|
+
configPath: "CLINKX_CONFIG_PATH",
|
|
193
|
+
allowedRoots: "CLINKX_ALLOWED_ROOTS",
|
|
194
|
+
logLevel: "CLINKX_LOG_LEVEL",
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Baseline OS env vars that are NEVER scrubbed from child.
|
|
198
|
+
* ClinkX's internal env.ts::buildEnv handles delegate subprocess sanitization.
|
|
199
|
+
*/
|
|
200
|
+
export const CHILD_ENV_BASELINE = [
|
|
201
|
+
"PATH",
|
|
202
|
+
"HOME",
|
|
203
|
+
"USER",
|
|
204
|
+
"LANG",
|
|
205
|
+
"TMPDIR",
|
|
206
|
+
];
|
|
207
|
+
/**
|
|
208
|
+
* DEAD KNOBS: these env vars have no effect with current shipped adapters
|
|
209
|
+
* because adapter JSON config wins (runner.ts:156-171). Both shipped adapters
|
|
210
|
+
* set timeout_seconds in JSON (codex.json:9 = 3600, claude.json:8 = 3600).
|
|
211
|
+
*
|
|
212
|
+
* These are Layer 3 (child-side) timeout controls. The workflow engine does
|
|
213
|
+
* NOT attempt to control child-side timeouts via env vars. Instead, use
|
|
214
|
+
* CLINKX_WORKFLOWS_CHILD_CONFIG_PATH to point at a workflow-specific adapter
|
|
215
|
+
* bundle with the desired timeout floors.
|
|
216
|
+
*
|
|
217
|
+
* See engine.ts module comment for the full timeout ownership model.
|
|
218
|
+
*
|
|
219
|
+
* Do NOT set these in the child env — they create a false sense of control.
|
|
220
|
+
*/
|
|
221
|
+
export const DEAD_KNOBS = [
|
|
222
|
+
"CLINKX_TIMEOUT_SECONDS",
|
|
223
|
+
"CLINKX_IDLE_TIMEOUT_SECONDS",
|
|
224
|
+
"CLINKX_IDLE_TIMEOUT_STARTUP_SECONDS",
|
|
225
|
+
];
|
|
226
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot normalization for clinkx-workflows (2-10a).
|
|
3
|
+
*
|
|
4
|
+
* Normalizes a loaded workflow definition into snapshot-ready form:
|
|
5
|
+
* - Inlines template text (not just hashes) — hash-only snapshots can't reconstruct for resume
|
|
6
|
+
* - Includes template content hashes alongside inlined text
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkflowDefinition, Call } from "./schema.js";
|
|
9
|
+
/** A call with prompt_template resolved to inlined text + hash. */
|
|
10
|
+
export interface NormalizedCall extends Omit<Call, "prompt_template"> {
|
|
11
|
+
/** Always present after normalization — either original prompt or inlined template. */
|
|
12
|
+
readonly prompt: string;
|
|
13
|
+
/** Removed after normalization — replaced by inlined prompt. */
|
|
14
|
+
readonly prompt_template?: undefined;
|
|
15
|
+
/** Present only if the original call used prompt_template. */
|
|
16
|
+
readonly template_hash?: string | undefined;
|
|
17
|
+
/** Original template path, preserved for diagnostics. */
|
|
18
|
+
readonly template_path?: string | undefined;
|
|
19
|
+
/** Built-in reducer function ID. When set, this call runs a deterministic function instead of an LLM. */
|
|
20
|
+
readonly reducer?: string | undefined;
|
|
21
|
+
/** If true, upstream context artifacts are aliased to prevent identity leakage. */
|
|
22
|
+
readonly anonymize_context?: boolean | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface NormalizedStage {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly description?: string | undefined;
|
|
27
|
+
readonly parallel: boolean;
|
|
28
|
+
readonly retry: Call extends {
|
|
29
|
+
retry: infer R;
|
|
30
|
+
} ? R : {
|
|
31
|
+
readonly mode: "transport_only" | "all";
|
|
32
|
+
readonly max_retries: number;
|
|
33
|
+
readonly backoff_seconds: number;
|
|
34
|
+
readonly max_backoff_seconds: number;
|
|
35
|
+
};
|
|
36
|
+
readonly on_failure: "abort" | "continue";
|
|
37
|
+
readonly calls: readonly NormalizedCall[];
|
|
38
|
+
}
|
|
39
|
+
export interface NormalizedWorkflowDefinition {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly description: string;
|
|
42
|
+
readonly version: string;
|
|
43
|
+
readonly stages: readonly NormalizedStage[];
|
|
44
|
+
readonly variables: WorkflowDefinition["variables"];
|
|
45
|
+
readonly settings: WorkflowDefinition["settings"];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Normalize a workflow definition by inlining all template text.
|
|
49
|
+
*
|
|
50
|
+
* @param definition - Parsed and validated workflow definition
|
|
51
|
+
* @param templates - Map of template path → template content (from resolveAllTemplates)
|
|
52
|
+
* @returns Normalized definition with all prompts inlined
|
|
53
|
+
*/
|
|
54
|
+
export declare function normalizeDefinition(definition: WorkflowDefinition, templates: ReadonlyMap<string, string>): NormalizedWorkflowDefinition;
|
|
55
|
+
/**
|
|
56
|
+
* Snapshot-facing alias used by the execution engine and future persistence work.
|
|
57
|
+
* The normalized definition is already snapshot-ready because template text is inlined.
|
|
58
|
+
*/
|
|
59
|
+
export declare function normalizeForSnapshot(definition: WorkflowDefinition, templates: ReadonlyMap<string, string>): NormalizedWorkflowDefinition;
|