overlord-cli 0.2608251110.0 → 0.2608261137.0

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.
Files changed (25) hide show
  1. package/dist/connectors/VERSION +1 -1
  2. package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
  3. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  4. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  5. package/dist/connectors/adapters/claude/CAPABILITIES.md +2 -2
  6. package/dist/connectors/adapters/claude/codec/claude.codec.yaml +3 -0
  7. package/dist/connectors/adapters/claude/conformance-manifest.yaml +2 -2
  8. package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-notebook.json +40 -0
  9. package/dist/connectors/adapters/claude/harness-capabilities.yaml +1 -0
  10. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
  11. package/dist/connectors/adapters/codex/CAPABILITIES.md +3 -3
  12. package/dist/connectors/adapters/codex/codec/codex.codec.yaml +7 -0
  13. package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -2
  14. package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use.json +7 -2
  15. package/dist/connectors/adapters/codex/harness-capabilities.yaml +5 -4
  16. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  17. package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
  18. package/dist/connectors/adapters/opencode/conformance-manifest.yaml +1 -1
  19. package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
  20. package/dist/connectors/core/overlord-mission/SKILL.md +5 -0
  21. package/dist/connectors/core/overlord-mission/reference/cli.md +4 -0
  22. package/dist/connectors/core/scripts/overlord-mcp.mjs +1 -1
  23. package/dist/index.js +86 -11
  24. package/dist/index.js.map +2 -2
  25. package/package.json +1 -1
@@ -1 +1 @@
1
- 0.3.37
1
+ 0.3.39
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: antigravity
4
4
  label: "Antigravity Connector"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.37",
4
+ "version": "0.3.39",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.37",
3
+ "version": "0.3.39",
4
4
  "description": "Overlord mission protocol workflow for Claude Code — attach/update/ask/deliver, slash commands, and hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Harness version verified** `2.1.227` · **range** `>=2.1.0` · **scheme** `semver`
8
8
 
9
- **Descriptor digest** `c7e52ce7d4698d35888a533b42d67c56d7616b3bb90e8537e4afcc39e1b6cc5d`
9
+ **Descriptor digest** `0f708197c1306226e137a332532fabbc68c41023ba0bd46614468d9fef38a14e`
10
10
 
11
11
  > The tier is derived from passing fixtures, never authored. `unsupported` means the harness
12
12
  > cannot do it — do not attempt it. `not-implemented` means it is buildable and unbuilt: that is
@@ -61,7 +61,7 @@ callbacks, record unavailable evidence health.
61
61
  | `observe.prompt` | ✅ supported | `UserPromptSubmit` | fixtures: `fixtures/normalize-user-prompt-submit.json` |
62
62
  | `observe.toolCall` | 🚧 not-implemented | `PreToolUse` | tracked as `agent-session-phase-2` |
63
63
  | `observe.toolResult` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
64
- | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use-write.json`, `fixtures/post-tool-use-parity.json`, `fixtures/post-tool-use-capture.json` |
64
+ | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use-write.json`, `fixtures/normalize-post-tool-use-notebook.json`, `fixtures/post-tool-use-parity.json`, `fixtures/post-tool-use-capture.json` |
65
65
  | `observe.sessionLifecycle` | 🚧 not-implemented | `SessionStart` | tracked as `latch-engine` |
66
66
  | `decide.shell` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
67
67
  | `decide.mcp` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
@@ -40,6 +40,9 @@ events:
40
40
  # no generic path-key fallback.
41
41
  filePathPaths:
42
42
  - file_path
43
+ - notebook_path
44
+ - filePath
45
+ - path
43
46
 
44
47
  # The one place raw user content flows, deliberately: the activity feed exists to show
45
48
  # follow-up prompts. Secret redaction still runs over the text.
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: claude
4
4
  label: "Claude Code Connector"
@@ -14,7 +14,7 @@ connector:
14
14
  harnessCapabilities:
15
15
  path: connectors/adapters/claude/harness-capabilities.yaml
16
16
  schemaVersion: 1
17
- digest: "c7e52ce7d4698d35888a533b42d67c56d7616b3bb90e8537e4afcc39e1b6cc5d"
17
+ digest: "0f708197c1306226e137a332532fabbc68c41023ba0bd46614468d9fef38a14e"
18
18
  # ── END GENERATED ────────────────────────────────────────────────────────────
19
19
  installPath: "~/.ovld/claude/marketplace/plugins/overlord"
20
20
  managedFiles:
@@ -0,0 +1,40 @@
1
+ {
2
+ "fixtureVersion": 1,
3
+ "kind": "normalized-event",
4
+ "description": "Claude NotebookEdit supplies notebook_path rather than file_path; the connector-owned fallback records only the relative path.",
5
+ "codec": "codec/claude.codec.yaml",
6
+ "occurredAt": "2026-08-26T00:00:00.000Z",
7
+ "payload": {
8
+ "session_id": "claude-notebook-1",
9
+ "cwd": "/repo",
10
+ "hook_event_name": "PostToolUse",
11
+ "tool_name": "NotebookEdit",
12
+ "tool_input": {
13
+ "notebook_path": "/repo/notebooks/analysis.ipynb",
14
+ "new_source": "token=AKIAIOSFODNN7EXAMPLE"
15
+ }
16
+ },
17
+ "expect": {
18
+ "eventId": "ev_47e3742894f673ce3e71298321a3ee6d",
19
+ "producerSequence": null,
20
+ "occurredAt": "2026-08-26T00:00:00.000Z",
21
+ "kind": "file.edited",
22
+ "severity": "info",
23
+ "nativeEvent": "PostToolUse",
24
+ "nativeTurnId": null,
25
+ "nativeCallId": null,
26
+ "subagentId": null,
27
+ "correlationId": "claude-notebook-1",
28
+ "origin": "agent",
29
+ "summary": "Write a file: notebooks/analysis.ipynb: 26 bytes",
30
+ "payload": {
31
+ "tool": "edit",
32
+ "action": "Write a file",
33
+ "subject": "notebooks/analysis.ipynb",
34
+ "detail": "26 bytes",
35
+ "paths": ["notebooks/analysis.ipynb"],
36
+ "formatterVersion": 1
37
+ }
38
+ },
39
+ "mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "/repo"]
40
+ }
@@ -83,6 +83,7 @@ capabilities:
83
83
  native: PostToolUse
84
84
  fixtures:
85
85
  - fixtures/normalize-post-tool-use-write.json
86
+ - fixtures/normalize-post-tool-use-notebook.json
86
87
  - fixtures/post-tool-use-parity.json
87
88
  - fixtures/post-tool-use-capture.json
88
89
  notes: >-
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.37",
3
+ "version": "0.3.39",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Harness version verified** `0.147.0` · **range** `>=0.124.0` · **scheme** `semver`
8
8
 
9
- **Descriptor digest** `bc823089f8c0fc97b888dec6b4e10eb55b596b1194664e1fe200468fe2c622c0`
9
+ **Descriptor digest** `4d4908a81023cf7943ebbcb35d8477751f97d916597adc3bf3cec63bdb58dc4b`
10
10
 
11
11
  > The tier is derived from passing fixtures, never authored. `unsupported` means the harness
12
12
  > cannot do it — do not attempt it. `not-implemented` means it is buildable and unbuilt: that is
@@ -47,7 +47,7 @@ Per-hook timeouts in seconds; the documentation gives a 600-second default. The
47
47
  | Classification | `post-only` |
48
48
  | Executable fixture | `fixtures/mutation-window-evidence.json` |
49
49
 
50
- Recorded pre/post shapes are separate calls and do not prove a paired window. A directly named native edit path normalized by the Codex codec as `file.edited` may record objective-bound, non-exclusive `declared_edit`/`direct` evidence. The recorded apply_patch completion has no normalized edit path, so it records unavailable evidence health.
50
+ Recorded pre/post shapes are separate calls and do not prove a paired window. A directly named native edit path normalized by the Codex codec as `file.edited` may record objective-bound, non-exclusive `declared_edit`/`direct` evidence. `apply_patch` destinations are reduced only from its declared `*** Add|Update|Delete File:` headers; patch text itself is never retained.
51
51
 
52
52
  The completion fixture proves post-only timing but exposes no normalized `file.edited`
53
53
  path. Runtime file evidence is unavailable for this adapter.
@@ -77,7 +77,7 @@ path. Runtime file evidence is unavailable for this adapter.
77
77
  ### Capability notes
78
78
 
79
79
  - **`observe.toolCall`** — There is no mechanical observation path until Overlord has a native Conversation Hub client.
80
- - **`observe.fileEdit`** — The lifecycle PostToolUse registration forwards Codex's native payload to local `capture-change` only when `OVERLORD_OBJECTIVE_ID` resolves an exact active-session binding. Native paths normalized by the Codex codec as `file.edited` record non-exclusive `declared_edit`/`direct` evidence. Codec-normalized read, search, and fetch callbacks are silent no-ops; mutation-capable callbacks without a normalized edit path, plus shell, generic, unknown, and unmapped callbacks, record unavailable evidence health. It remains separate from mechanical agent-session observation.
80
+ - **`observe.fileEdit`** — The lifecycle PostToolUse registration forwards Codex's native payload to local `capture-change` only when `OVERLORD_OBJECTIVE_ID` resolves an exact active-session binding. Native paths and declared `apply_patch` headers normalized by the Codex codec as `file.edited` record non-exclusive `declared_edit`/`direct` evidence. Codec-normalized read, search, and fetch callbacks are silent no-ops; mutation-capable callbacks without a normalized edit path, plus shell, generic, unknown, and unmapped callbacks, record unavailable evidence health. It remains separate from mechanical agent-session observation.
81
81
  - **`decide.universal`** — The native Codex prompt owns approvals; Overlord exposes no remote decision control.
82
82
  - **`answer.structuredQuestion`** — `codex app-server` exposes ToolRequestUserInput with per-option label/description and an autoResolutionMs — an ACP-shaped structured question in everything but name. It is unreachable until the single-subscriber question is settled.
83
83
  - **`inject.midTurn`** — ThreadInjectItems/TurnSteer exist on the experimental app-server surface only. The binary carries "expected exactly one client subscribed to the thread, found {}", so if the TUI is that one client Overlord cannot also subscribe and this path is closed.
@@ -31,6 +31,13 @@ events:
31
31
  fileEditKind: file.edited
32
32
  filePathPaths:
33
33
  - file_path
34
+ - filePath
35
+ - path
36
+ # Codex apply_patch carries destinations in bounded patch headers rather
37
+ # than a standalone path field. The codec extracts only those headers.
38
+ filePathPatchTextPaths:
39
+ - command
40
+ - patch
34
41
 
35
42
  - native: UserPromptSubmit
36
43
  kind: prompt.submitted
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: codex
4
4
  label: "Codex Connector"
@@ -14,7 +14,7 @@ connector:
14
14
  harnessCapabilities:
15
15
  path: connectors/adapters/codex/harness-capabilities.yaml
16
16
  schemaVersion: 1
17
- digest: "bc823089f8c0fc97b888dec6b4e10eb55b596b1194664e1fe200468fe2c622c0"
17
+ digest: "4d4908a81023cf7943ebbcb35d8477751f97d916597adc3bf3cec63bdb58dc4b"
18
18
  # ── END GENERATED ────────────────────────────────────────────────────────────
19
19
  installPath: "~/.codex/plugins/overlord"
20
20
  managedFiles:
@@ -16,7 +16,7 @@
16
16
  "tool_response": { "text": "changed with postgres://user:hunter2@db/app" }
17
17
  },
18
18
  "expect": {
19
- "eventId": "ev_b6414915d58f532e1e3eea254578e9b9",
19
+ "eventId": "ev_bf289659aca425896e8c26747d35c87e",
20
20
  "producerSequence": null,
21
21
  "occurredAt": "2026-08-01T00:00:00.000Z",
22
22
  "kind": "file.edited",
@@ -28,7 +28,12 @@
28
28
  "correlationId": "codex-session-1",
29
29
  "origin": "agent",
30
30
  "summary": "Write a file",
31
- "payload": { "tool": "edit", "action": "Write a file", "formatterVersion": 1 }
31
+ "payload": {
32
+ "tool": "edit",
33
+ "action": "Write a file",
34
+ "paths": ["src/token.ts"],
35
+ "formatterVersion": 1
36
+ }
32
37
  },
33
38
  "mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "hunter2", "secret.jsonl", "/Users/jake"]
34
39
  }
@@ -52,8 +52,8 @@ mutationHooks:
52
52
  notes: >-
53
53
  Recorded pre/post shapes are separate calls and do not prove a paired window. A directly named
54
54
  native edit path normalized by the Codex codec as `file.edited` may record objective-bound,
55
- non-exclusive `declared_edit`/`direct` evidence. The recorded apply_patch completion has no
56
- normalized edit path, so it records unavailable evidence health.
55
+ non-exclusive `declared_edit`/`direct` evidence. `apply_patch` destinations are reduced only
56
+ from its declared `*** Add|Update|Delete File:` headers; patch text itself is never retained.
57
57
 
58
58
  capabilities:
59
59
  observe.prompt:
@@ -81,8 +81,9 @@ capabilities:
81
81
  notes: >-
82
82
  The lifecycle PostToolUse registration forwards Codex's native payload to local
83
83
  `capture-change` only when `OVERLORD_OBJECTIVE_ID` resolves an exact active-session binding.
84
- Native paths normalized by the Codex codec as `file.edited` record non-exclusive
85
- `declared_edit`/`direct` evidence. Codec-normalized read, search, and fetch callbacks are
84
+ Native paths and declared `apply_patch` headers normalized by the Codex codec as
85
+ `file.edited` record non-exclusive `declared_edit`/`direct` evidence. Codec-normalized
86
+ read, search, and fetch callbacks are
86
87
  silent no-ops; mutation-capable callbacks without a normalized edit path, plus shell,
87
88
  generic, unknown, and unmapped callbacks, record unavailable evidence health. It remains
88
89
  separate from mechanical agent-session observation.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.37",
3
+ "version": "0.3.39",
4
4
  "description": "Overlord mission protocol workflow for Cursor — attach/update/ask/deliver, slash commands, MCP bridge, and follow-up capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: opencode
4
4
  label: "OpenCode Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "123"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: pi
4
4
  label: "PI Connector"
@@ -165,6 +165,11 @@ ovld protocol deliver --session-key <sessionKey> \
165
165
  This is the normal delivery shape: a summary is sufficient. The CLI syncs objective-ledger
166
166
  evidence independently before the lifecycle transition.
167
167
 
168
+ After running a generator, migration, or script that writes files, you may add its known outputs
169
+ to this existing call with `--paths path/one.ts,path/two.ts`. This is optional, paths-only
170
+ metadata for outputs the native hook cannot name; never use it to enumerate every changed or
171
+ opened file, and never make a separate call just to declare paths.
172
+
168
173
  Artifacts, optional change rationales, and a delivery report remain current annotations when
169
174
  they add review value. Use `--payload-json` when the full delivery object fits comfortably inline
170
175
  (roughly under 8 KB). Larger inline `--*-json` values are rejected; stream them through the
@@ -113,6 +113,10 @@ Native paths normalized by the connector-owned codec as `file.edited` are valid,
113
113
  no-ops. Mutation-capable callbacks without a normalized edit path, plus shell, generic, unknown,
114
114
  and unmapped callbacks, report unavailable evidence health.
115
115
 
116
+ For outputs of a generator, migration, or file-writing script that the hook cannot name, an agent
117
+ may add `--paths path/one.ts,path/two.ts` to its existing `update` or `deliver` call. It is
118
+ optional, paths-only metadata; it is never a request to enumerate every changed or opened file.
119
+
116
120
  ### Shared worktree safety (critical)
117
121
 
118
122
  The working tree may contain file changes from **other agents, missions, or objectives** running concurrently in the same checkout or worktree. Those changes are **not yours to undo**.
@@ -1110,7 +1110,7 @@ process.stdin.on('data', async chunk => {
1110
1110
  result: {
1111
1111
  protocolVersion: PROTOCOL_VERSION,
1112
1112
  capabilities: { tools: { listChanged: false } },
1113
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.37' }
1113
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.39' }
1114
1114
  }
1115
1115
  });
1116
1116
  continue;
package/dist/index.js CHANGED
@@ -4458,7 +4458,7 @@ var init_catalog_generated = __esm({
4458
4458
  "codec": "claude",
4459
4459
  "integrationShape": "callback",
4460
4460
  "capabilityTier": 1,
4461
- "descriptorDigest": "c7e52ce7d4698d35888a533b42d67c56d7616b3bb90e8537e4afcc39e1b6cc5d",
4461
+ "descriptorDigest": "0f708197c1306226e137a332532fabbc68c41023ba0bd46614468d9fef38a14e",
4462
4462
  "descriptorSchemaVersion": 1,
4463
4463
  "harness": {
4464
4464
  "name": "Claude Code",
@@ -4660,7 +4660,7 @@ var init_catalog_generated = __esm({
4660
4660
  "codec": "codex",
4661
4661
  "integrationShape": "callback",
4662
4662
  "capabilityTier": 1,
4663
- "descriptorDigest": "bc823089f8c0fc97b888dec6b4e10eb55b596b1194664e1fe200468fe2c622c0",
4663
+ "descriptorDigest": "4d4908a81023cf7943ebbcb35d8477751f97d916597adc3bf3cec63bdb58dc4b",
4664
4664
  "descriptorSchemaVersion": 1,
4665
4665
  "harness": {
4666
4666
  "name": "Codex CLI",
@@ -4690,7 +4690,7 @@ var init_catalog_generated = __esm({
4690
4690
  "fixture": "fixtures/mutation-window-evidence.json",
4691
4691
  "reason": null,
4692
4692
  "evidenceRef": null,
4693
- "notes": "Recorded pre/post shapes are separate calls and do not prove a paired window. A directly named native edit path normalized by the Codex codec as `file.edited` may record objective-bound, non-exclusive `declared_edit`/`direct` evidence. The recorded apply_patch completion has no normalized edit path, so it records unavailable evidence health."
4693
+ "notes": "Recorded pre/post shapes are separate calls and do not prove a paired window. A directly named native edit path normalized by the Codex codec as `file.edited` may record objective-bound, non-exclusive `declared_edit`/`direct` evidence. `apply_patch` destinations are reduced only from its declared `*** Add|Update|Delete File:` headers; patch text itself is never retained."
4694
4694
  },
4695
4695
  "capabilities": {
4696
4696
  "observe.prompt": {
@@ -5438,7 +5438,7 @@ var init_catalog_generated = __esm({
5438
5438
  }
5439
5439
  }
5440
5440
  ];
5441
- HARNESS_CATALOG_DIGEST = "9cc9f237fc308dec078f5a3c6fc89741fa46005d76cce4b2250dc4c82d12f847";
5441
+ HARNESS_CATALOG_DIGEST = "9b5e5074ad777fa04280b57040141eab441d4d386da054cc415f8f2166460672";
5442
5442
  }
5443
5443
  });
5444
5444
 
@@ -7621,6 +7621,23 @@ function readOutcome(value) {
7621
7621
  }
7622
7622
  return void 0;
7623
7623
  }
7624
+ function declaredPatchPaths(input, paths, projectRoot) {
7625
+ const output = [];
7626
+ for (const declaredPath of paths ?? []) {
7627
+ const patch = readPath2(input, declaredPath);
7628
+ if (typeof patch !== "string" || patch.length > 1048576)
7629
+ continue;
7630
+ PATCH_HEADER.lastIndex = 0;
7631
+ for (const match of patch.matchAll(PATCH_HEADER)) {
7632
+ const reduced = reduceEvidencePath(match[1], projectRoot);
7633
+ if (reduced && !output.includes(reduced))
7634
+ output.push(reduced);
7635
+ if (output.length >= MAX_PATCH_PATHS)
7636
+ return output;
7637
+ }
7638
+ }
7639
+ return output;
7640
+ }
7624
7641
  function findCodecRule(codec, nativeEventName) {
7625
7642
  if (!nativeEventName)
7626
7643
  return null;
@@ -7667,10 +7684,19 @@ function normalizeNativeEvent({ codec, payload, nativeEventName, nativeSessionId
7667
7684
  sealedInput.formatterVersion = FORMATTER_VERSION;
7668
7685
  if (rule.fileEditKind && (tool === "write" || tool === "edit")) {
7669
7686
  kind = rule.fileEditKind;
7670
- const evidencePath = (rule.filePathPaths ?? []).reduce((accepted, declaredPath) => accepted ?? reduceEvidencePath(readPath2(input, declaredPath), projectRoot), null);
7671
- if (evidencePath) {
7672
- sealedInput.paths = [evidencePath];
7673
- idParts.push(evidencePath);
7687
+ const exactPaths = [];
7688
+ for (const declaredPath of rule.filePathPaths ?? []) {
7689
+ const reduced = reduceEvidencePath(readPath2(input, declaredPath), projectRoot);
7690
+ if (reduced && !exactPaths.includes(reduced))
7691
+ exactPaths.push(reduced);
7692
+ }
7693
+ for (const extracted of declaredPatchPaths(input, rule.filePathPatchTextPaths, projectRoot)) {
7694
+ if (!exactPaths.includes(extracted))
7695
+ exactPaths.push(extracted);
7696
+ }
7697
+ if (exactPaths.length > 0) {
7698
+ sealedInput.paths = exactPaths;
7699
+ idParts.push(...exactPaths);
7674
7700
  }
7675
7701
  }
7676
7702
  idParts.push(tool, description.subject ?? "", description.detail ?? "");
@@ -7738,6 +7764,7 @@ function summarizeEvent(kind, payload) {
7738
7764
  riskMarkers: payload.riskMarkers ?? []
7739
7765
  });
7740
7766
  }
7767
+ var PATCH_HEADER, MAX_PATCH_PATHS;
7741
7768
  var init_codec = __esm({
7742
7769
  "../packages/core/dist/service/agent-session/pure/codec.js"() {
7743
7770
  "use strict";
@@ -7748,6 +7775,8 @@ var init_codec = __esm({
7748
7775
  init_redact();
7749
7776
  init_text();
7750
7777
  init_tool_normalize();
7778
+ PATCH_HEADER = /^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm;
7779
+ MAX_PATCH_PATHS = 32;
7751
7780
  }
7752
7781
  });
7753
7782
 
@@ -8017,7 +8046,10 @@ var init_codec_registry_generated = __esm({
8017
8046
  "inputPath": "tool_input",
8018
8047
  "fileEditKind": "file.edited",
8019
8048
  "filePathPaths": [
8020
- "file_path"
8049
+ "file_path",
8050
+ "notebook_path",
8051
+ "filePath",
8052
+ "path"
8021
8053
  ]
8022
8054
  },
8023
8055
  {
@@ -8064,7 +8096,13 @@ var init_codec_registry_generated = __esm({
8064
8096
  "turnIdPath": "turn_id",
8065
8097
  "fileEditKind": "file.edited",
8066
8098
  "filePathPaths": [
8067
- "file_path"
8099
+ "file_path",
8100
+ "filePath",
8101
+ "path"
8102
+ ],
8103
+ "filePathPatchTextPaths": [
8104
+ "command",
8105
+ "patch"
8068
8106
  ]
8069
8107
  },
8070
8108
  {
@@ -22411,6 +22449,10 @@ deliver:
22411
22449
  evidence automatically before update, changes, and deliver. Optional rationales,
22412
22450
  hook health, and path attribution cannot fail delivery. Do not continue implementation
22413
22451
  after delivery without explicit follow-up.
22452
+
22453
+ --paths <a,b,c> is optional, metadata-only evidence for outputs of a generator,
22454
+ migration, or script. It is batched into this existing call, never inspects VCS,
22455
+ and is not an instruction to list every changed or opened file.
22414
22456
  Inline --*-json values larger than ~8 KB are rejected; use --change-rationales-file -
22415
22457
  (or --payload-file -) and stream JSON on stdin. Keep --summary inline.
22416
22458
  Run \`${primaryCommand} protocol changes --objective-id <id>\` to inspect the attached
@@ -23637,6 +23679,37 @@ function missionDisplayId(mission) {
23637
23679
  const record = asRecord5(mission);
23638
23680
  return typeof record.displayId === "string" ? record.displayId : typeof record.id === "string" ? record.id : "unknown";
23639
23681
  }
23682
+ function appendDeclaredOutputPaths({
23683
+ flags,
23684
+ active,
23685
+ workingDirectory
23686
+ }) {
23687
+ const value = flags["--paths"];
23688
+ if (value === void 0) return;
23689
+ delete flags["--paths"];
23690
+ if (typeof value !== "string" || value.trim() === "") {
23691
+ throw new CliError({ message: "--paths requires a comma-separated list of output paths." });
23692
+ }
23693
+ if (!active) {
23694
+ throw new CliError({
23695
+ message: "--paths requires the attached objective session in this working directory."
23696
+ });
23697
+ }
23698
+ const paths = value.split(",").map((entry) => entry.trim()).filter(Boolean);
23699
+ if (paths.length === 0) {
23700
+ throw new CliError({ message: "--paths requires at least one output path." });
23701
+ }
23702
+ appendChangeEvidence({
23703
+ workingDirectory,
23704
+ objectiveId: active.objectiveId,
23705
+ sessionKey: active.sessionKey,
23706
+ filePaths: paths.slice(0, MAX_DECLARED_OUTPUT_PATHS),
23707
+ source: "declared_edit",
23708
+ quality: "direct",
23709
+ overlap: false,
23710
+ hookHealth: "agent_declared_generator_output"
23711
+ });
23712
+ }
23640
23713
  async function resolveProtocolFileInputs({
23641
23714
  flags,
23642
23715
  stdin
@@ -23875,6 +23948,7 @@ async function runProtocolCommand({
23875
23948
  const sessionKey = typeof flags["--session-key"] === "string" ? flags["--session-key"] : null;
23876
23949
  const active = sessionKey ? readActiveSessions(workingDirectory).find((entry) => entry.sessionKey === sessionKey) : void 0;
23877
23950
  lifecycleActive = active;
23951
+ appendDeclaredOutputPaths({ flags, active, workingDirectory });
23878
23952
  if (sessionKey && active) {
23879
23953
  await syncObjectiveLedger({ runtime, workingDirectory, missionId, sessionKey, active });
23880
23954
  }
@@ -25033,7 +25107,7 @@ Note: ${reinstallHint}`);
25033
25107
  message: "Usage: ovld runner service <install|start|stop|restart|status|uninstall> [--no-start] [--json]"
25034
25108
  });
25035
25109
  }
25036
- var SYNC_CHANGE_EVIDENCE_KEYS, PROTOCOL_FILE_FLAGS, SESSION_KEY_SUBCOMMANDS, OBJECTIVE_SCOPED_SUBCOMMANDS, RETIRED_CHANGE_TRACKING_FLAGS, MAX_CHANGES_HEALTH_ENTRIES, MAX_RUNNER_FAILURE_MESSAGE_LENGTH;
25110
+ var SYNC_CHANGE_EVIDENCE_KEYS, PROTOCOL_FILE_FLAGS, SESSION_KEY_SUBCOMMANDS, OBJECTIVE_SCOPED_SUBCOMMANDS, RETIRED_CHANGE_TRACKING_FLAGS, MAX_CHANGES_HEALTH_ENTRIES, MAX_DECLARED_OUTPUT_PATHS, MAX_RUNNER_FAILURE_MESSAGE_LENGTH;
25037
25111
  var init_commands = __esm({
25038
25112
  "src/commands.ts"() {
25039
25113
  "use strict";
@@ -25135,6 +25209,7 @@ var init_commands = __esm({
25135
25209
  ]
25136
25210
  };
25137
25211
  MAX_CHANGES_HEALTH_ENTRIES = 128;
25212
+ MAX_DECLARED_OUTPUT_PATHS = 512;
25138
25213
  MAX_RUNNER_FAILURE_MESSAGE_LENGTH = 1200;
25139
25214
  }
25140
25215
  });