@oisincoveney/pipeline 3.6.1 → 3.7.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.
@@ -0,0 +1,68 @@
1
+ # Caveman Mode (default ON)
2
+
3
+ Operate in caveman mode by default on every response: terse, smart-caveman phrasing — drop filler, keep ALL technical substance, code, commands, paths, and accuracy. This is active every response and does not drift off over a long session. Defer to the `caveman` skill for the exact compression rules and intensity levels. Turn off only when the user says "stop caveman" or "normal mode".
4
+
5
+ # Global Behavior
6
+
7
+ - Answer fully and stop. Never end with "Want me to do X?" or "Should I implement this?" — if the user wants more, they'll ask.
8
+ - Research before acting — know how components and libraries work before making changes.
9
+ - When uncertain, ask — don't guess.
10
+ - The answer to "Why is X an improvement?" should never be "I'm not sure."
11
+
12
+ ## Before writing code
13
+
14
+ - Search for existing implementations before creating new code.
15
+ - Check for existing utilities before adding helpers.
16
+ - Don't add dependencies without checking if functionality already exists in current deps.
17
+ - Reuse patterns from similar files in the codebase.
18
+
19
+ ## Problem-solving
20
+
21
+ - Is this a real problem? Reject over-engineering.
22
+ - Is there a simpler way? Always seek the simplest solution.
23
+ - Will it break anything? Backward compatibility matters.
24
+
25
+ # Anti-Patterns
26
+
27
+ ## Code quality
28
+
29
+ - NEVER manually edit auto-generated files — regenerate them instead.
30
+ - NEVER suppress type errors (`as any`, `@ts-ignore`, `@ts-expect-error`).
31
+ - NEVER use bandaids or hacks — proper fixes only.
32
+ - NEVER create new Zod schemas when generated ones exist.
33
+ - NEVER use `var` declarations.
34
+ - NEVER add `.unwrap()` calls in Rust code.
35
+
36
+ ## Error handling
37
+
38
+ - Silent error handling is NEVER permitted.
39
+ - Every fallback and default value MUST have specific business-logic reasoning.
40
+ - Unexpected errors MUST be logged, not swallowed.
41
+ - Errors affecting user flow MUST surface to the user — never hide failures.
42
+
43
+ ## Testing
44
+
45
+ - NEVER commit code without tests for new functionality.
46
+ - NEVER skip tests or mark them skipped to make CI pass.
47
+ - NEVER disable or delete existing tests — fix the code, not the tests.
48
+ - Test both success and error cases.
49
+
50
+ # Verification
51
+
52
+ - Run tests, lint, and typecheck after every change.
53
+ - Self-assessment is unreliable — use external signals (build output, test results) as ground truth.
54
+ - Don't claim something works without running it.
55
+ - If a test suite exists, run it. Don't skip it because "the change is small."
56
+
57
+ # Coding Style
58
+
59
+ - 120 char line width.
60
+ - Trailing commas everywhere.
61
+
62
+ ## Git
63
+
64
+ - NEVER commit/push directly to main.
65
+ - NEVER amend commits or rewrite history after pushing.
66
+ - NEVER use `--force` without explicit approval.
67
+ - Always create new commits — never amend, squash, or rebase unless explicitly asked.
68
+ - Conventional commit format: `feat|fix|chore|docs|test|refactor(scope): description`.
@@ -226,8 +226,8 @@ declare const configSchema: z.ZodObject<{
226
226
  policy: z.ZodOptional<z.ZodObject<{
227
227
  commands: z.ZodOptional<z.ZodEnum<{
228
228
  allow: "allow";
229
- deny: "deny";
230
229
  "trusted-only": "trusted-only";
230
+ deny: "deny";
231
231
  }>>;
232
232
  modules: z.ZodOptional<z.ZodEnum<{
233
233
  allow: "allow";
@@ -255,8 +255,8 @@ declare const configSchema: z.ZodObject<{
255
255
  global: "global";
256
256
  }>>;
257
257
  mode: z.ZodEnum<{
258
- local: "local";
259
258
  hosted: "hosted";
259
+ local: "local";
260
260
  }>;
261
261
  provider: z.ZodLiteral<"toolhive">;
262
262
  authorization_env: z.ZodDefault<z.ZodString>;
@@ -299,10 +299,10 @@ declare const configSchema: z.ZodObject<{
299
299
  }, z.core.$strict>>;
300
300
  output: z.ZodOptional<z.ZodObject<{
301
301
  format: z.ZodEnum<{
302
- json_schema: "json_schema";
303
302
  text: "text";
304
303
  json: "json";
305
304
  jsonl: "jsonl";
305
+ json_schema: "json_schema";
306
306
  }>;
307
307
  repair: z.ZodOptional<z.ZodObject<{
308
308
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -371,10 +371,10 @@ declare const configSchema: z.ZodObject<{
371
371
  disabled: "disabled";
372
372
  }>>>;
373
373
  output_formats: z.ZodOptional<z.ZodArray<z.ZodEnum<{
374
- json_schema: "json_schema";
375
374
  text: "text";
376
375
  json: "json";
377
376
  jsonl: "jsonl";
377
+ json_schema: "json_schema";
378
378
  }>>>;
379
379
  rules: z.ZodOptional<z.ZodBoolean>;
380
380
  skills: z.ZodOptional<z.ZodBoolean>;
@@ -481,8 +481,8 @@ declare const configSchema: z.ZodObject<{
481
481
  schedules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
482
482
  description: z.ZodOptional<z.ZodString>;
483
483
  baseline: z.ZodEnum<{
484
- quick: "quick";
485
484
  execute: "execute";
485
+ quick: "quick";
486
486
  }>;
487
487
  max_parallel_nodes: z.ZodOptional<z.ZodNumber>;
488
488
  node_catalog: z.ZodOptional<z.ZodString>;
@@ -0,0 +1,62 @@
1
+ import { resolvePackageAssetPath } from "../package-assets.js";
2
+ import { GENERATED_MARKER, INSTRUCTIONS_END, INSTRUCTIONS_START, OWNER_MARKER_PREFIX } from "./shared.js";
3
+ import { readFileSync } from "node:fs";
4
+ //#region src/install-commands/instructions.ts
5
+ /**
6
+ * The canonical global agent instruction body, package-owned so every machine,
7
+ * k8s job, and host renders the same behavior. Shipped in `defaults/` (see
8
+ * package.json `files`).
9
+ */
10
+ const INSTRUCTION_BODY = readFileSync(resolvePackageAssetPath("defaults/instructions/global.md"), "utf8").trimEnd();
11
+ /**
12
+ * The global instruction memory file each host reads, and the repo-relative
13
+ * path that `resolveHarnessTarget` rebases onto its per-machine config dir.
14
+ * Distinct from the bare `AGENTS.md` project guidance file, so these coexist
15
+ * with (and never trip) the PROJECT_ONLY AGENTS.md handling.
16
+ */
17
+ const INSTRUCTION_TARGETS = [
18
+ {
19
+ host: "claude-code",
20
+ path: ".claude/CLAUDE.md"
21
+ },
22
+ {
23
+ host: "codex",
24
+ path: ".codex/AGENTS.md"
25
+ },
26
+ {
27
+ host: "gemini",
28
+ path: ".gemini/GEMINI.md"
29
+ }
30
+ ];
31
+ /** Repo-relative paths of every generated instruction file (global scope). */
32
+ const INSTRUCTION_PATHS = INSTRUCTION_TARGETS.map((target) => target.path);
33
+ function instructionContent(host) {
34
+ return `${[
35
+ INSTRUCTIONS_START,
36
+ GENERATED_MARKER,
37
+ `${OWNER_MARKER_PREFIX}host=${host} -->`,
38
+ "",
39
+ INSTRUCTION_BODY,
40
+ "",
41
+ INSTRUCTIONS_END
42
+ ].join("\n")}\n`;
43
+ }
44
+ /**
45
+ * Per-host global instruction definitions. Each is upserted as a marker block
46
+ * so any user-authored content outside the markers in the target file is
47
+ * preserved. Emitted in global scope only (see GLOBAL_ONLY_PATHS).
48
+ */
49
+ function globalInstructionDefinitions() {
50
+ return INSTRUCTION_TARGETS.map(({ host, path }) => ({
51
+ block: {
52
+ end: INSTRUCTIONS_END,
53
+ start: INSTRUCTIONS_START
54
+ },
55
+ content: instructionContent(host),
56
+ host,
57
+ invocation: "(global instructions)",
58
+ path
59
+ }));
60
+ }
61
+ //#endregion
62
+ export { INSTRUCTION_PATHS, globalInstructionDefinitions };
@@ -9,6 +9,8 @@ const OWNER_TS_MARKER_PREFIX = "// @oisincoveney/pipeline:";
9
9
  const OWNER_YAML_MARKER_PREFIX = "# @oisincoveney/pipeline:";
10
10
  const AGENTS_MD_START = "<!-- @oisincoveney/pipeline:agents:start -->";
11
11
  const AGENTS_MD_END = "<!-- @oisincoveney/pipeline:agents:end -->";
12
+ const INSTRUCTIONS_START = "<!-- @oisincoveney/pipeline:instructions:start -->";
13
+ const INSTRUCTIONS_END = "<!-- @oisincoveney/pipeline:instructions:end -->";
12
14
  const SINGLE_OPENCODE_PLUGIN_ARRAY_RE = /\n {2}"plugin": \[\n {4}("[^"]+")\n {2}\]/;
13
15
  const OPENCODE_PROJECT_CONFIG_PATH = ".opencode/opencode.json";
14
16
  const CLAUDE_PROJECT_CONFIG_PATH = ".claude/settings.json";
@@ -34,6 +36,9 @@ function codexGlobalConfigDir() {
34
36
  function opencodeGlobalConfigDir() {
35
37
  return process.env.OPENCODE_CONFIG_DIR ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "opencode");
36
38
  }
39
+ function geminiGlobalConfigDir() {
40
+ return process.env.GEMINI_CONFIG_DIR ?? join(homedir(), ".gemini");
41
+ }
37
42
  function stripPrefix(value, prefix) {
38
43
  if (value === prefix) return "";
39
44
  return value.startsWith(`${prefix}/`) ? value.slice(prefix.length + 1) : value;
@@ -55,6 +60,7 @@ function resolveHarnessTarget(scope, cwd, relPath) {
55
60
  const normalized = relPath.replaceAll("\\", "/");
56
61
  if (normalized === ".claude" || normalized.startsWith(".claude/")) return join(claudeGlobalConfigDir(), stripPrefix(normalized, ".claude"));
57
62
  if (normalized === ".codex" || normalized.startsWith(".codex/")) return join(codexGlobalConfigDir(), stripPrefix(normalized, ".codex"));
63
+ if (normalized === ".gemini" || normalized.startsWith(".gemini/")) return join(geminiGlobalConfigDir(), stripPrefix(normalized, ".gemini"));
58
64
  return join(opencodeGlobalConfigDir(), stripPrefix(normalized, ".opencode"));
59
65
  }
60
66
  function profileEntries(config) {
@@ -88,4 +94,4 @@ function commandIdForHost(host, entrypointId) {
88
94
  return entrypointId;
89
95
  }
90
96
  //#endregion
91
- export { AGENTS_MD_END, AGENTS_MD_START, CLAUDE_PROJECT_CONFIG_PATH, COMMAND_HOSTS, DEFAULT_HARNESS_SCOPE, ENTRYPOINT_PATH_PATTERNS, GENERATED_MARKER, GENERATED_TS_MARKER, GENERATED_YAML_MARKER, OPENCODE_PROJECT_CONFIG_PATH, OWNER_MARKER_PREFIX, OWNER_TS_MARKER_PREFIX, OWNER_YAML_MARKER_PREFIX, SINGLE_OPENCODE_PLUGIN_ARRAY_RE, commandIdForHost, compactLines, entrypointDescription, entrypointEntries, instructionsPointer, invocationForHost, profileEntries, resolveHarnessTarget };
97
+ export { AGENTS_MD_END, AGENTS_MD_START, CLAUDE_PROJECT_CONFIG_PATH, COMMAND_HOSTS, DEFAULT_HARNESS_SCOPE, ENTRYPOINT_PATH_PATTERNS, GENERATED_MARKER, GENERATED_TS_MARKER, GENERATED_YAML_MARKER, INSTRUCTIONS_END, INSTRUCTIONS_START, OPENCODE_PROJECT_CONFIG_PATH, OWNER_MARKER_PREFIX, OWNER_TS_MARKER_PREFIX, OWNER_YAML_MARKER_PREFIX, SINGLE_OPENCODE_PLUGIN_ARRAY_RE, commandIdForHost, compactLines, entrypointDescription, entrypointEntries, instructionsPointer, invocationForHost, profileEntries, resolveHarnessTarget };
@@ -3,6 +3,7 @@ import "./config.js";
3
3
  import { COMMAND_HOSTS, ENTRYPOINT_PATH_PATTERNS, invocationForHost, resolveHarnessTarget } from "./install-commands/shared.js";
4
4
  import { opencodeAdapter } from "./install-commands/opencode.js";
5
5
  import { claudeCodeAdapter } from "./install-commands/claude-code.js";
6
+ import { INSTRUCTION_PATHS, globalInstructionDefinitions } from "./install-commands/instructions.js";
6
7
  import { existsSync, readFileSync, statSync } from "node:fs";
7
8
  import { dirname, join, relative } from "node:path";
8
9
  import { mkdir, readdir, rm, writeFile } from "node:fs/promises";
@@ -75,7 +76,7 @@ function entrypointIdFromGeneratedPath(host, path) {
75
76
  }
76
77
  function resolveDefinitionContent(definition, target) {
77
78
  const adapter = ADAPTERS[definition.host];
78
- if (!(adapter.mergeDefinition && existsSync(target))) return {
79
+ if (!(adapter?.mergeDefinition && existsSync(target))) return {
79
80
  conflict: false,
80
81
  content: definition.content
81
82
  };
@@ -120,7 +121,7 @@ function upsertGeneratedBlock(current, content, block) {
120
121
  return `${current.trimEnd()}${separator}${content}`;
121
122
  }
122
123
  function adapterForcesDefinition(definition) {
123
- const fn = ADAPTERS[definition.host].isAlwaysForced;
124
+ const fn = ADAPTERS[definition.host]?.isAlwaysForced;
124
125
  return fn ? fn(definition) : false;
125
126
  }
126
127
  function installActionForDefinition(definition, target, resolved, force) {
@@ -155,15 +156,18 @@ function commandInstallPlanItem(definition, action) {
155
156
  };
156
157
  }
157
158
  const PROJECT_ONLY_PATHS = new Set(["AGENTS.md"]);
159
+ const GLOBAL_ONLY_PATHS = new Set(INSTRUCTION_PATHS);
158
160
  function scopedDefinitions(definitions, scope) {
159
- if (scope !== "global") return definitions;
160
- return definitions.filter((definition) => !PROJECT_ONLY_PATHS.has(definition.path));
161
+ if (scope === "global") return definitions.filter((definition) => !PROJECT_ONLY_PATHS.has(definition.path));
162
+ return definitions.filter((definition) => !GLOBAL_ONLY_PATHS.has(definition.path));
161
163
  }
162
164
  function installCommandsContext(options) {
163
165
  const cwd = options.cwd ?? process.cwd();
164
166
  const host = options.host ?? "all";
165
167
  const scope = options.scope ?? "global";
166
- const definitions = scopedDefinitions(definitionsFor(host, loadPipelineConfig(cwd, { allowMissingLintFileReferences: true }), cwd), scope);
168
+ const config = loadPipelineConfig(cwd, { allowMissingLintFileReferences: true });
169
+ const instructionDefinitions = globalInstructionDefinitions().filter((definition) => host === "all" || definition.host === host);
170
+ const definitions = scopedDefinitions([...definitionsFor(host, config, cwd), ...instructionDefinitions], scope);
167
171
  return {
168
172
  cwd,
169
173
  definitions,
@@ -160,8 +160,8 @@ declare const mokaSubmitOptionsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
160
160
  }, z.core.$strict>>;
161
161
  serviceAccountName: z.ZodOptional<z.ZodString>;
162
162
  mode: z.ZodEnum<{
163
- full: "full";
164
163
  quick: "quick";
164
+ full: "full";
165
165
  }>;
166
166
  schedulePath: z.ZodOptional<z.ZodString>;
167
167
  scheduleYaml: z.ZodOptional<z.ZodString>;
@@ -43,8 +43,8 @@ declare const runnerDeliverySchema: z.ZodObject<{
43
43
  declare const mokaSubmissionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
44
44
  kind: z.ZodLiteral<"graph">;
45
45
  mode: z.ZodEnum<{
46
- full: "full";
47
46
  quick: "quick";
47
+ full: "full";
48
48
  }>;
49
49
  }, z.core.$strict>, z.ZodObject<{
50
50
  argv: z.ZodArray<z.ZodString>;
@@ -104,8 +104,8 @@ declare const runnerCommandPayloadSchema: z.ZodObject<{
104
104
  submission: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
105
105
  kind: z.ZodLiteral<"graph">;
106
106
  mode: z.ZodEnum<{
107
- full: "full";
108
107
  quick: "quick";
108
+ full: "full";
109
109
  }>;
110
110
  }, z.core.$strict>, z.ZodObject<{
111
111
  argv: z.ZodArray<z.ZodString>;
@@ -261,6 +261,7 @@ interface RunnerHookResultDetails {
261
261
  }
262
262
  interface RunnerEventEnvelope {
263
263
  at?: string;
264
+ runId: string;
264
265
  sequence: number;
265
266
  type: string;
266
267
  }
@@ -143,6 +143,7 @@ function parseRunnerCommandPayloadWithIssues(rawPayload) {
143
143
  function mapRuntimeEventToRunnerEventRecords(event, context) {
144
144
  const record = {
145
145
  at: context.timestamp,
146
+ runId: context.runId,
146
147
  sequence: context.sequence ?? 1
147
148
  };
148
149
  return mapWorkflowRunnerEvent(event, context, record) ?? mapNodeRunnerEvent(event, record) ?? mapGateRunnerEvent(event, record) ?? mapArtifactRunnerEvent(event, record) ?? mapLogRunnerEvent(event, record) ?? throwUnhandledRuntimeEvent(event);
@@ -164,6 +165,7 @@ function mapWorkflowRunnerEvent(event, context, record) {
164
165
  source: edge.source,
165
166
  target: edge.target
166
167
  },
168
+ runId: context.runId,
167
169
  sequence: (context.sequence ?? 1) + index + 1,
168
170
  type: "workflow.edge"
169
171
  }))];
@@ -188,6 +190,7 @@ function mapWorkflowRunnerEvent(event, context, record) {
188
190
  }
189
191
  function mapNodeRunnerEvent(event, record) {
190
192
  switch (event.type) {
193
+ case "node.session": return [];
191
194
  case "node.start": return [{
192
195
  ...record,
193
196
  type: event.type,
@@ -8,6 +8,7 @@ import { z } from "zod";
8
8
  */
9
9
  declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
10
10
  at: z.ZodOptional<z.ZodString>;
11
+ runId: z.ZodString;
11
12
  sequence: z.ZodNumber;
12
13
  type: z.ZodEnum<{
13
14
  "workflow.planned": "workflow.planned";
@@ -30,6 +31,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
30
31
  }, z.core.$strip>;
31
32
  }, z.core.$strip>, z.ZodObject<{
32
33
  at: z.ZodOptional<z.ZodString>;
34
+ runId: z.ZodString;
33
35
  sequence: z.ZodNumber;
34
36
  edge: z.ZodObject<{
35
37
  id: z.ZodString;
@@ -39,6 +41,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
39
41
  type: z.ZodLiteral<"workflow.edge">;
40
42
  }, z.core.$strip>, z.ZodObject<{
41
43
  at: z.ZodOptional<z.ZodString>;
44
+ runId: z.ZodString;
42
45
  sequence: z.ZodNumber;
43
46
  node: z.ZodObject<{
44
47
  attempt: z.ZodNumber;
@@ -62,6 +65,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
62
65
  }>;
63
66
  }, z.core.$strip>, z.ZodObject<{
64
67
  at: z.ZodOptional<z.ZodString>;
68
+ runId: z.ZodString;
65
69
  sequence: z.ZodNumber;
66
70
  gate: z.ZodObject<{
67
71
  event: z.ZodOptional<z.ZodString>;
@@ -89,6 +93,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
89
93
  }>;
90
94
  }, z.core.$strip>, z.ZodObject<{
91
95
  at: z.ZodOptional<z.ZodString>;
96
+ runId: z.ZodString;
92
97
  sequence: z.ZodNumber;
93
98
  hookResult: z.ZodObject<{
94
99
  artifacts: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -113,6 +118,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
113
118
  type: z.ZodLiteral<"hook.result">;
114
119
  }, z.core.$strip>, z.ZodObject<{
115
120
  at: z.ZodOptional<z.ZodString>;
121
+ runId: z.ZodString;
116
122
  sequence: z.ZodNumber;
117
123
  artifact: z.ZodObject<{
118
124
  kind: z.ZodLiteral<"artifact">;
@@ -135,6 +141,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
135
141
  }>;
136
142
  }, z.core.$strip>, z.ZodObject<{
137
143
  at: z.ZodOptional<z.ZodString>;
144
+ runId: z.ZodString;
138
145
  sequence: z.ZodNumber;
139
146
  log: z.ZodObject<{
140
147
  attempt: z.ZodOptional<z.ZodNumber>;
@@ -160,6 +167,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
160
167
  }>;
161
168
  }, z.core.$strip>, z.ZodObject<{
162
169
  at: z.ZodOptional<z.ZodString>;
170
+ runId: z.ZodString;
163
171
  sequence: z.ZodNumber;
164
172
  finalResult: z.ZodObject<{
165
173
  outcome: z.ZodEnum<{
@@ -178,6 +186,7 @@ declare const runnerEventRecordSchema: z.ZodUnion<readonly [z.ZodObject<{
178
186
  declare const runnerEventBatchSchema: z.ZodObject<{
179
187
  events: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
180
188
  at: z.ZodOptional<z.ZodString>;
189
+ runId: z.ZodString;
181
190
  sequence: z.ZodNumber;
182
191
  type: z.ZodEnum<{
183
192
  "workflow.planned": "workflow.planned";
@@ -200,6 +209,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
200
209
  }, z.core.$strip>;
201
210
  }, z.core.$strip>, z.ZodObject<{
202
211
  at: z.ZodOptional<z.ZodString>;
212
+ runId: z.ZodString;
203
213
  sequence: z.ZodNumber;
204
214
  edge: z.ZodObject<{
205
215
  id: z.ZodString;
@@ -209,6 +219,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
209
219
  type: z.ZodLiteral<"workflow.edge">;
210
220
  }, z.core.$strip>, z.ZodObject<{
211
221
  at: z.ZodOptional<z.ZodString>;
222
+ runId: z.ZodString;
212
223
  sequence: z.ZodNumber;
213
224
  node: z.ZodObject<{
214
225
  attempt: z.ZodNumber;
@@ -232,6 +243,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
232
243
  }>;
233
244
  }, z.core.$strip>, z.ZodObject<{
234
245
  at: z.ZodOptional<z.ZodString>;
246
+ runId: z.ZodString;
235
247
  sequence: z.ZodNumber;
236
248
  gate: z.ZodObject<{
237
249
  event: z.ZodOptional<z.ZodString>;
@@ -259,6 +271,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
259
271
  }>;
260
272
  }, z.core.$strip>, z.ZodObject<{
261
273
  at: z.ZodOptional<z.ZodString>;
274
+ runId: z.ZodString;
262
275
  sequence: z.ZodNumber;
263
276
  hookResult: z.ZodObject<{
264
277
  artifacts: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -283,6 +296,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
283
296
  type: z.ZodLiteral<"hook.result">;
284
297
  }, z.core.$strip>, z.ZodObject<{
285
298
  at: z.ZodOptional<z.ZodString>;
299
+ runId: z.ZodString;
286
300
  sequence: z.ZodNumber;
287
301
  artifact: z.ZodObject<{
288
302
  kind: z.ZodLiteral<"artifact">;
@@ -305,6 +319,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
305
319
  }>;
306
320
  }, z.core.$strip>, z.ZodObject<{
307
321
  at: z.ZodOptional<z.ZodString>;
322
+ runId: z.ZodString;
308
323
  sequence: z.ZodNumber;
309
324
  log: z.ZodObject<{
310
325
  attempt: z.ZodOptional<z.ZodNumber>;
@@ -330,6 +345,7 @@ declare const runnerEventBatchSchema: z.ZodObject<{
330
345
  }>;
331
346
  }, z.core.$strip>, z.ZodObject<{
332
347
  at: z.ZodOptional<z.ZodString>;
348
+ runId: z.ZodString;
333
349
  sequence: z.ZodNumber;
334
350
  finalResult: z.ZodObject<{
335
351
  outcome: z.ZodEnum<{
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  //#region src/runner-event-schema.ts
3
3
  const runnerEventEnvelopeSchema = z.object({
4
4
  at: z.string().optional(),
5
+ runId: z.string().min(1),
5
6
  sequence: z.number().int().positive()
6
7
  });
7
8
  const runnerWorkflowNodeDetailsSchema = z.object({
@@ -18,6 +18,7 @@ function createRunnerEventSink(options) {
18
18
  nextSequence += 1;
19
19
  return {
20
20
  at: timestamp(options.now),
21
+ runId: options.runId,
21
22
  sequence
22
23
  };
23
24
  };
package/package.json CHANGED
@@ -126,7 +126,7 @@
126
126
  "prepack": "bun run build:cli"
127
127
  },
128
128
  "type": "module",
129
- "version": "3.6.1",
129
+ "version": "3.7.1",
130
130
  "description": "Config-driven multi-agent pipeline runner for repository work",
131
131
  "main": "./dist/index.js",
132
132
  "types": "./dist/index.d.ts",