overlord-cli 0.2608250836.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 (27) hide show
  1. package/dist/connectors/AGENTS.md +1 -1
  2. package/dist/connectors/VERSION +1 -1
  3. package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
  4. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  5. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  6. package/dist/connectors/adapters/claude/CAPABILITIES.md +2 -2
  7. package/dist/connectors/adapters/claude/codec/claude.codec.yaml +3 -0
  8. package/dist/connectors/adapters/claude/conformance-manifest.yaml +2 -2
  9. package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-notebook.json +40 -0
  10. package/dist/connectors/adapters/claude/harness-capabilities.yaml +1 -0
  11. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
  12. package/dist/connectors/adapters/codex/CAPABILITIES.md +3 -3
  13. package/dist/connectors/adapters/codex/codec/codex.codec.yaml +7 -0
  14. package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -2
  15. package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use.json +7 -2
  16. package/dist/connectors/adapters/codex/harness-capabilities.yaml +5 -4
  17. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  18. package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
  19. package/dist/connectors/adapters/opencode/conformance-manifest.yaml +1 -1
  20. package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
  21. package/dist/connectors/core/overlord-mission/SKILL.md +5 -0
  22. package/dist/connectors/core/overlord-mission/reference/cli.md +4 -0
  23. package/dist/connectors/core/scripts/overlord-mcp.mjs +23 -4
  24. package/dist/connectors/docs/05-connectors-and-agent-plugins.md +19 -4
  25. package/dist/index.js +102 -11
  26. package/dist/index.js.map +2 -2
  27. package/package.json +1 -1
@@ -316,7 +316,7 @@ connectors/
316
316
  README.md ← architectural overview
317
317
  ```
318
318
 
319
- No adapter implementations have landed yet. When they do, the Claude and Codex adapters serve as the reference implementations.
319
+ The Claude and Codex adapters are the reference implementations; Cursor, Pi, Antigravity, and OpenCode adapters have also shipped. See `connectors/HARNESS-MATRIX.md` for the current per-adapter capability matrix.
320
320
 
321
321
  ---
322
322
 
@@ -1 +1 @@
1
- 0.3.36
1
+ 0.3.39
@@ -1,4 +1,4 @@
1
- contractVersion: "117"
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.36",
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.36",
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: "117"
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.36",
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: "117"
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.36",
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: "117"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "117"
1
+ contractVersion: "125"
2
2
  componentType: connector
3
3
  componentKey: opencode
4
4
  label: "OpenCode Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "117"
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**.
@@ -478,14 +478,14 @@ const tools = [
478
478
  name: 'overlord_manage_run_queue',
479
479
  title: 'Manage Run Queues',
480
480
  description:
481
- "Use this only when the user explicitly asks to create, rename, pause, resume, delete, or reorder the project's Run Queue definitions. These are administrative project-configuration actions and require a full-scope token; adding, moving, or removing objectives inside a queue uses overlord_queue_objective and overlord_reorder_run_queue instead.",
481
+ "Use this only when the user explicitly asks to create, rename, pause, resume, delete, or reorder the project's Run Queue definitions, or to retry one held queue entry. The queue-definition actions are administrative project-configuration and require a full-scope token; adding, moving, or removing objectives inside a queue uses overlord_queue_objective and overlord_reorder_run_queue instead.",
482
482
  inputSchema: objectSchema(
483
483
  {
484
484
  action: {
485
485
  type: 'string',
486
- enum: ['create', 'update', 'delete', 'reorder_queues'],
486
+ enum: ['create', 'update', 'delete', 'reorder_queues', 'retry_entry'],
487
487
  description:
488
- 'create a queue, update (rename/pause/resume) one, delete one, or reorder the queue definitions.'
488
+ 'create a queue, update (rename/pause/resume) one, delete one, reorder the queue definitions, or retry_entry to clear one held entry\'s hold and attempt budget so the dispatcher tries it again.'
489
489
  },
490
490
  projectId: stringProperty(
491
491
  'Project UUID, slug, or name. Required for create and reorder_queues.'
@@ -498,6 +498,12 @@ const tools = [
498
498
  moveEntriesTo: stringProperty(
499
499
  'delete only: destination queue UUID or unambiguous name. Required when the queue still holds entries.'
500
500
  ),
501
+ entry: stringProperty(
502
+ 'retry_entry only: entry UUID, objective UUID, or objective display id. One of entry or objectiveId is required.'
503
+ ),
504
+ objectiveId: stringProperty(
505
+ 'retry_entry only: objective UUID or display id whose live entry should be retried.'
506
+ ),
501
507
  orderedQueues: {
502
508
  type: 'array',
503
509
  description:
@@ -953,6 +959,19 @@ async function callOverlordTool(name, args) {
953
959
  });
954
960
  }
955
961
 
962
+ if (action === 'retry_entry') {
963
+ const entry = optionalString(args, 'entry');
964
+ const objectiveRef = optionalString(args, 'objectiveId');
965
+ if (!entry && !objectiveRef) {
966
+ throw new Error("action 'retry_entry' requires entry or objectiveId");
967
+ }
968
+ return runProtocol('retry-queue-entry', {
969
+ ...(entry ? { entry } : {}),
970
+ ...(objectiveRef ? { 'objective-id': objectiveRef } : {}),
971
+ ...(projectRef ? { 'project-id': projectRef } : {})
972
+ });
973
+ }
974
+
956
975
  if (action === 'reorder_queues') {
957
976
  if (!projectRef) throw new Error("action 'reorder_queues' requires projectId");
958
977
  if (
@@ -1091,7 +1110,7 @@ process.stdin.on('data', async chunk => {
1091
1110
  result: {
1092
1111
  protocolVersion: PROTOCOL_VERSION,
1093
1112
  capabilities: { tools: { listChanged: false } },
1094
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.36' }
1113
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.39' }
1095
1114
  }
1096
1115
  });
1097
1116
  continue;
@@ -132,7 +132,11 @@ Requirements:
132
132
 
133
133
  - Install local Cursor plugin/rules/commands.
134
134
  - Add `beforeSubmitPrompt` hook to record follow-ups.
135
- - Map `beforeShellExecution` and `beforeMCPExecution` onto the canonical observational `PermissionRequest` hook without overriding Cursor's permission decision.
135
+ - Wire `beforeShellExecution`, `beforeMCPExecution`, and `preToolUse` to the Agent
136
+ Session Module's blocking Decide capability (`ovld agent-session request`) per
137
+ the descriptor — Cursor has no single universal `PermissionRequest` event, so
138
+ do not route all three through one shared hook. See
139
+ `connectors/adapters/cursor/CAPABILITIES.md` for current per-capability status.
136
140
  - Add `postToolUse` edit capture for file tools and shell-mediated changes.
137
141
  - Add a bounded `stop` hook for pending-delivery reminders.
138
142
  - Add permission allow rules for protocol commands.
@@ -212,13 +216,24 @@ Requirements:
212
216
  - Records native session/resume ID when the harness exposes one.
213
217
  - Does not restart execution by itself.
214
218
 
215
- ### Permission Hook
219
+ ### Permission Hook (Decide capability)
220
+
221
+ This is the Agent Session Module's **Decide** capability, not a one-way event
222
+ push. See `planning/feature-plans/agent-session-module.md` and
223
+ `docs/src/content/docs/docs-for-agents/agent-sessions.mdx` for the current
224
+ architecture; `connectors/HARNESS-MATRIX.md` for live per-adapter status.
216
225
 
217
226
  Requirements:
218
227
 
219
- - Publishes `permission_request` with tool/request payload.
228
+ - Creates an answerable request (`ovld agent-session request`) carrying the
229
+ tool/request payload, one of the four request kinds (`permission`,
230
+ `question`, `choice`, `retry`), and a decision window.
231
+ - Blocks the harness's tool call until the request is answered, the window
232
+ elapses, or a fallback decision applies — it does not merely publish an
233
+ event and continue.
220
234
  - Does not leak secrets.
221
- - Works without requiring a web app.
235
+ - Degrades gracefully without a web app open: the harness's own fallback
236
+ decision (allow/deny/ask) applies when no one answers in time.
222
237
 
223
238
  ### Stop Hook
224
239
 
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
  {
@@ -22176,6 +22214,21 @@ dequeue-objective:
22176
22214
  Returns:
22177
22215
  { removed, objectiveId }. Already-unqueued objectives return removed: false.
22178
22216
 
22217
+ retry-queue-entry:
22218
+ Purpose:
22219
+ Retry one held Run Queue entry: clears its hold and resets the attempt
22220
+ budget so the dispatcher tries it again on the next tick.
22221
+ Required (one of):
22222
+ --objective-id <id> Objective UUID or display id with a live entry
22223
+ --entry <id> Entry UUID, objective UUID, or display id
22224
+ Optional:
22225
+ --project-id <id|slug|name> Confirms the entry's project
22226
+ Returns:
22227
+ The RunQueueEntryDto, back in waiting with attempt_count reset to 0.
22228
+ Rules:
22229
+ An entry already dispatched or running cannot be retried \u2014 remove it with
22230
+ \`dequeue-objective\` (or a forced entry delete) first.
22231
+
22179
22232
  search:
22180
22233
  Purpose:
22181
22234
  Find grouped mission, objective, and delivery matches by keyword, status type, or project.
@@ -22396,6 +22449,10 @@ deliver:
22396
22449
  evidence automatically before update, changes, and deliver. Optional rationales,
22397
22450
  hook health, and path attribution cannot fail delivery. Do not continue implementation
22398
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.
22399
22456
  Inline --*-json values larger than ~8 KB are rejected; use --change-rationales-file -
22400
22457
  (or --payload-file -) and stream JSON on stdin. Keep --summary inline.
22401
22458
  Run \`${primaryCommand} protocol changes --objective-id <id>\` to inspect the attached
@@ -22576,6 +22633,7 @@ var init_protocol_help = __esm({
22576
22633
  "run-queue",
22577
22634
  "queue-objective",
22578
22635
  "resume-follow-up",
22636
+ "retry-queue-entry",
22579
22637
  "search",
22580
22638
  "search-missions",
22581
22639
  "sync-changes",
@@ -23621,6 +23679,37 @@ function missionDisplayId(mission) {
23621
23679
  const record = asRecord5(mission);
23622
23680
  return typeof record.displayId === "string" ? record.displayId : typeof record.id === "string" ? record.id : "unknown";
23623
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
+ }
23624
23713
  async function resolveProtocolFileInputs({
23625
23714
  flags,
23626
23715
  stdin
@@ -23859,6 +23948,7 @@ async function runProtocolCommand({
23859
23948
  const sessionKey = typeof flags["--session-key"] === "string" ? flags["--session-key"] : null;
23860
23949
  const active = sessionKey ? readActiveSessions(workingDirectory).find((entry) => entry.sessionKey === sessionKey) : void 0;
23861
23950
  lifecycleActive = active;
23951
+ appendDeclaredOutputPaths({ flags, active, workingDirectory });
23862
23952
  if (sessionKey && active) {
23863
23953
  await syncObjectiveLedger({ runtime, workingDirectory, missionId, sessionKey, active });
23864
23954
  }
@@ -25017,7 +25107,7 @@ Note: ${reinstallHint}`);
25017
25107
  message: "Usage: ovld runner service <install|start|stop|restart|status|uninstall> [--no-start] [--json]"
25018
25108
  });
25019
25109
  }
25020
- 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;
25021
25111
  var init_commands = __esm({
25022
25112
  "src/commands.ts"() {
25023
25113
  "use strict";
@@ -25119,6 +25209,7 @@ var init_commands = __esm({
25119
25209
  ]
25120
25210
  };
25121
25211
  MAX_CHANGES_HEALTH_ENTRIES = 128;
25212
+ MAX_DECLARED_OUTPUT_PATHS = 512;
25122
25213
  MAX_RUNNER_FAILURE_MESSAGE_LENGTH = 1200;
25123
25214
  }
25124
25215
  });