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.
- package/dist/connectors/AGENTS.md +1 -1
- package/dist/connectors/VERSION +1 -1
- package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/antigravity/plugin.json +1 -1
- package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/claude/CAPABILITIES.md +2 -2
- package/dist/connectors/adapters/claude/codec/claude.codec.yaml +3 -0
- package/dist/connectors/adapters/claude/conformance-manifest.yaml +2 -2
- package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-notebook.json +40 -0
- package/dist/connectors/adapters/claude/harness-capabilities.yaml +1 -0
- package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/codex/CAPABILITIES.md +3 -3
- package/dist/connectors/adapters/codex/codec/codex.codec.yaml +7 -0
- package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -2
- package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use.json +7 -2
- package/dist/connectors/adapters/codex/harness-capabilities.yaml +5 -4
- package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/opencode/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
- package/dist/connectors/core/overlord-mission/SKILL.md +5 -0
- package/dist/connectors/core/overlord-mission/reference/cli.md +4 -0
- package/dist/connectors/core/scripts/overlord-mcp.mjs +23 -4
- package/dist/connectors/docs/05-connectors-and-agent-plugins.md +19 -4
- package/dist/index.js +102 -11
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
|
@@ -316,7 +316,7 @@ connectors/
|
|
|
316
316
|
README.md ← architectural overview
|
|
317
317
|
```
|
|
318
318
|
|
|
319
|
-
|
|
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
|
|
package/dist/connectors/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.39
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://antigravity.google/schemas/v1/plugin.json",
|
|
3
3
|
"name": "overlord",
|
|
4
|
-
"version": "0.3.
|
|
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",
|
|
@@ -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** `
|
|
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: "
|
|
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: "
|
|
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
|
+
}
|
|
@@ -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** `
|
|
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.
|
|
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: "
|
|
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: "
|
|
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": "
|
|
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": {
|
|
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.
|
|
56
|
-
|
|
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
|
|
85
|
-
`declared_edit`/`direct` evidence. Codec-normalized
|
|
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.
|
|
@@ -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.
|
|
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,
|
|
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.
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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": "
|
|
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": "
|
|
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.
|
|
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 = "
|
|
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
|
|
7671
|
-
|
|
7672
|
-
|
|
7673
|
-
|
|
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
|
});
|