overlord-cli 0.2608301049.0 → 0.2609011854.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 +13 -2
- package/dist/connectors/README.md +7 -2
- 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/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/codex/conformance-manifest.yaml +1 -1
- 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 +17 -21
- package/dist/connectors/core/overlord-mission/reference/cli.md +13 -18
- package/dist/connectors/core/overlord-mission/reference/mcp.md +1 -0
- package/dist/connectors/core/scripts/overlord-mcp.mjs +81 -16
- package/dist/connectors/docs/05-connectors-and-agent-plugins.md +8 -0
- package/dist/index.js +1647 -1318
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
|
@@ -162,12 +162,23 @@ emits back to the harness.
|
|
|
162
162
|
|
|
163
163
|
### Where the session channel comes from
|
|
164
164
|
|
|
165
|
+
**As of the Latch v2 cutover, this creation path is not currently wired into either launch
|
|
166
|
+
surface.** `createSessionChannel` (`packages/core/service/agent-session/channels.ts`) has no
|
|
167
|
+
production callers today: `POST /api/missions/:id/session-channel` is a permanent stub that
|
|
168
|
+
throws `410 session_controls_gone` for every caller (`backend/agent-session-routes.ts`,
|
|
169
|
+
`prepareMissionSessionChannel`), and neither `ovld launch`'s call site nor the runner-dispatched
|
|
170
|
+
launch call site passes a `sessionChannelId`/`sessionChannelToken` into `launchAgent`. In
|
|
171
|
+
practice, a launched agent's environment does not carry `OVERLORD_SESSION_CHANNEL_ID` today, so
|
|
172
|
+
`connectors/core/scripts/agent-session-hook.sh` exits before spawning `ovld` on every
|
|
173
|
+
invocation. Treat the table below as the intended design this module retains, not live
|
|
174
|
+
behavior — do not build against it assuming a channel exists at launch.
|
|
175
|
+
|
|
165
176
|
The credential your adapter's CLI call presents is not something the adapter finds or derives:
|
|
166
177
|
|
|
167
178
|
| Launch | Channel created at | Credential reaches the process via |
|
|
168
179
|
| ---------------------- | ---------------------------------------- | --------------------------------------------------- |
|
|
169
|
-
| Queued (runner) | the `launching` transition
|
|
170
|
-
| Manual (`ovld launch`) | `POST /api/missions/:id/session-channel` | owner-only local cache, keyed by channel id
|
|
180
|
+
| Queued (runner) | the `launching` transition (not wired) | owner-only local cache, keyed by channel id |
|
|
181
|
+
| Manual (`ovld launch`) | `POST /api/missions/:id/session-channel` (retired; returns 410) | owner-only local cache, keyed by channel id |
|
|
171
182
|
| Virtual gateway | the same preparation service | `OVERLORD_SESSION_CHANNEL_TOKEN` in the environment |
|
|
172
183
|
|
|
173
184
|
Only `OVERLORD_SESSION_CHANNEL_ID` is exported into the launch environment and the terminal
|
|
@@ -86,10 +86,10 @@ contributor adding an adapter can tell signal from neglect. Source of truth for
|
|
|
86
86
|
|
|
87
87
|
| Adapter | Commands | Hooks | Local MCP shim | MCP config | Rules | Native resume |
|
|
88
88
|
| ------------- | ------------- | ----------------------------------------------------- | -------------- | ----------------- | -------- | ------------- |
|
|
89
|
-
| `claude` | `commands/` | `hooks/hooks.json` (
|
|
89
|
+
| `claude` | `commands/` | `hooks/hooks.json` (3 types) | — | — | — | — |
|
|
90
90
|
| `codex` | — | `.codex-plugin/hooks.json` + `scripts/*.sh` (2 types) | rendered | `.mcp.json` | — | yes |
|
|
91
91
|
| `cursor` | `commands/` | `hooks/*.sh` (4 types) | rendered | `mcp.json` | `rules/` | — |
|
|
92
|
-
| `antigravity` | `skills/*.md` | `hooks.json`
|
|
92
|
+
| `antigravity` | `skills/*.md` | `hooks.json` (0 types — none shipped yet) | rendered | `mcp_config.json` | — | — |
|
|
93
93
|
| `pi` | — | `extensions/overlord.ts` (input/tool/session events) | — | — | — | yes |
|
|
94
94
|
| `opencode` | — | none — control plane, see below | — | — | — | — |
|
|
95
95
|
|
|
@@ -103,6 +103,11 @@ Intentional omissions:
|
|
|
103
103
|
yet start it automatically. A supervised execution target must supply that launch integration.
|
|
104
104
|
- **`claude` ships no local MCP shim.** The Claude plugin reaches Overlord's hosted
|
|
105
105
|
MCP server, so a local stdio bridge would duplicate it.
|
|
106
|
+
- **`claude` ships a 4th hook script, `scripts/permission-hook.sh`, that is not registered in
|
|
107
|
+
`hooks/hooks.json`.** It is a declared hazard (`shipped-permission-hook-inert` in
|
|
108
|
+
`connectors/adapters/claude/CAPABILITIES.md`), not live behavior: it calls a
|
|
109
|
+
`ovld protocol permission-request` subcommand that does not exist and is structurally
|
|
110
|
+
incapable of returning a decision even once wired in.
|
|
106
111
|
- **`pi` ships no shim, hooks directory, or commands.** PI integrates through one TypeScript
|
|
107
112
|
extension. It has no native permission dialog; its optional `tool_call` decision interceptor
|
|
108
113
|
is fail-open and requires explicit workspace and project opt-in.
|
package/dist/connectors/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.41
|
|
@@ -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.41",
|
|
5
5
|
"description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Cooperativ",
|
|
@@ -21,7 +21,7 @@ Use this mode when the prompt already contains a mission ID or explicitly says t
|
|
|
21
21
|
2. The attach response prints JSON to stdout containing `session.sessionKey`. The CLI also persists this key automatically so subsequent `ovld protocol` commands in the same working directory resolve it without `--session-key`. If auto-resolution fails, pass `--session-key <sessionKey>` explicitly on every subsequent call.
|
|
22
22
|
3. Treat the Overlord mission prompt as authoritative for the objective, constraints, and delivery target. Begin executing the current objective immediately after attach; do not wait for more instructions or ask for confirmation. This differs from `connect` or `load-context`, which only retrieve mission context and never imply the agent should act.
|
|
23
23
|
4. Post updates while working: `ovld protocol update --session-key <sessionKey> --mission-id <mission_id> --summary "..." --phase execute`.
|
|
24
|
-
During long mechanical stretches with nothing meaningful to post, send `ovld protocol heartbeat --session-key <sessionKey> --mission-id <mission_id> [--phase execute] [--
|
|
24
|
+
During long mechanical stretches with nothing meaningful to post, send `ovld protocol heartbeat --session-key <sessionKey> --mission-id <mission_id> [--phase execute] [--note "..."]` instead of an empty update.
|
|
25
25
|
5. Follow-up messages after the initial mission are captured automatically by the installed `UserPromptSubmit` hook and stay in discussion intent while the mission is in review. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
26
26
|
6. If blocked, call `ovld protocol ask --session-key <sessionKey> --mission-id <mission_id> --question "..."` and stop.
|
|
27
27
|
7. Deliver last with `ovld protocol deliver --session-key <sessionKey> --mission-id <mission_id> --summary "..."`. Normal delivery is summary-only; objective-ledger evidence syncs independently.
|
|
@@ -116,7 +116,7 @@ ovld protocol update --session-key <sessionKey> --mission-id $MISSION_ID --summa
|
|
|
116
116
|
### Heartbeat
|
|
117
117
|
|
|
118
118
|
```bash
|
|
119
|
-
ovld protocol heartbeat --session-key <sessionKey> --mission-id $MISSION_ID --phase execute --
|
|
119
|
+
ovld protocol heartbeat --session-key <sessionKey> --mission-id $MISSION_ID --phase execute --note "Running the integration suite"
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
Use `heartbeat` for liveness pings and transient UI telemetry when you have no meaningful narrative summary to post. It updates the attached session without creating a mission event.
|
|
@@ -173,8 +173,9 @@ opened file, and never make a separate call just to declare paths.
|
|
|
173
173
|
Artifacts, optional change rationales, and a delivery report remain current annotations when
|
|
174
174
|
they add review value. Use `--payload-json` when the full delivery object fits comfortably inline
|
|
175
175
|
(roughly under 8 KB). Larger inline `--*-json` values are rejected; stream them through the
|
|
176
|
-
corresponding `--*-file -` flag. A real scratch path belongs under
|
|
177
|
-
|
|
176
|
+
corresponding `--*-file -` flag. A real scratch path belongs under `$OVERLORD_TMPDIR` (this launch's private
|
|
177
|
+
`.overlord/tmp/sessions/<id>/` directory); `deliver` removes that directory for you, and nothing
|
|
178
|
+
else under `.overlord/tmp` is yours to delete.
|
|
178
179
|
|
|
179
180
|
If `heartbeat` succeeds but `deliver` or `update` fails, the session is likely fine — retry with the corresponding `--*-file -` flag instead of inline `--*-json`.
|
|
180
181
|
|
|
@@ -292,7 +293,7 @@ ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective"
|
|
|
292
293
|
```
|
|
293
294
|
|
|
294
295
|
```bash
|
|
295
|
-
ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
|
|
296
|
+
ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
|
|
296
297
|
```
|
|
297
298
|
|
|
298
299
|
```bash
|
|
@@ -303,17 +304,6 @@ ovld protocol add-objectives --mission-id 1:899 --objectives-json '[{"objective"
|
|
|
303
304
|
ovld protocol update-objective --objective-id <objective-uuid> --auto-advance
|
|
304
305
|
```
|
|
305
306
|
|
|
306
|
-
#### Local Durability For New Missions
|
|
307
|
-
|
|
308
|
-
`create`, `prompt`, `add-objectives`, and `record-work` save the objective/mission text to a local draft (`~/.overlord/pending-missions/`) **before** sending it, and delete that draft only once the server confirms the write. If the network drops mid-call, your text is never lost — the failure message points at the saved file. Manage outstanding drafts with `pending-missions`:
|
|
309
|
-
|
|
310
|
-
```bash
|
|
311
|
-
ovld protocol pending-missions # list drafts the server never confirmed
|
|
312
|
-
ovld protocol pending-missions --retry <id> # re-send a saved draft; clears it on success
|
|
313
|
-
ovld protocol pending-missions --clear <id> # delete one draft after confirming it landed
|
|
314
|
-
ovld protocol pending-missions --clear-all # delete every draft
|
|
315
|
-
```
|
|
316
|
-
|
|
317
307
|
To inspect project resolution explicitly:
|
|
318
308
|
|
|
319
309
|
```bash
|
|
@@ -342,11 +332,17 @@ ovld protocol create-project --name "Acme Web" --directory /path/to/repo
|
|
|
342
332
|
ovld protocol create-project --name "Acme Web" --no-directory
|
|
343
333
|
```
|
|
344
334
|
|
|
345
|
-
`ovld create-project` is
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
335
|
+
`ovld create-project --name "<name>"` is the top-level convenience command; it accepts
|
|
336
|
+
only `--name`, `--directory`/`--no-directory`, and `--json`, and always creates the
|
|
337
|
+
project in your resolved workspace. When a directory is registered it also writes
|
|
338
|
+
`.overlord/project.json` so future cwd-based resolution finds the project.
|
|
339
|
+
|
|
340
|
+
`ovld protocol create-project --name "<name>"` is the parentless Protocol surface;
|
|
341
|
+
unlike the top-level command it does not link a local directory. Pass
|
|
342
|
+
`--workspace-id <id|slug|name>` to choose a workspace when you belong to more than one
|
|
343
|
+
(omitting it returns `workspace_selection_required` with your choices); optional
|
|
344
|
+
`--description <text>` and `--slug <text>` are also accepted. There is no `--color`
|
|
345
|
+
flag on either surface.
|
|
350
346
|
|
|
351
347
|
#### Resolving the project ID when you don't have one
|
|
352
348
|
|
|
@@ -41,7 +41,7 @@ ovld protocol update --session-key <sessionKey> --mission-id $MISSION_ID --summa
|
|
|
41
41
|
## Heartbeat
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
ovld protocol heartbeat --session-key <sessionKey> --mission-id $MISSION_ID --phase execute --
|
|
44
|
+
ovld protocol heartbeat --session-key <sessionKey> --mission-id $MISSION_ID --phase execute --note "Running the integration suite"
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
Use `heartbeat` for liveness pings and transient UI telemetry when you have no meaningful narrative summary to post. It updates the attached session without creating a mission event.
|
|
@@ -189,7 +189,7 @@ ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective"
|
|
|
189
189
|
```
|
|
190
190
|
|
|
191
191
|
```bash
|
|
192
|
-
ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
|
|
192
|
+
ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
|
|
193
193
|
```
|
|
194
194
|
|
|
195
195
|
```bash
|
|
@@ -223,17 +223,6 @@ EOF
|
|
|
223
223
|
The full submission format, including the `record-work`-only `changedFiles` field and MCP
|
|
224
224
|
equivalent, is in [record-work.md](record-work.md).
|
|
225
225
|
|
|
226
|
-
### Local Durability For New Missions
|
|
227
|
-
|
|
228
|
-
`create`, `prompt`, `add-objectives`, and `record-work` save the objective/mission text to a local draft (`~/.overlord/pending-missions/`) **before** sending it, and delete that draft only once the server confirms the write. If the network drops mid-call, your text is never lost — the failure message points at the saved file. Manage outstanding drafts with `pending-missions`:
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
ovld protocol pending-missions # list drafts the server never confirmed
|
|
232
|
-
ovld protocol pending-missions --retry <id> # re-send a saved draft; clears it on success
|
|
233
|
-
ovld protocol pending-missions --clear <id> # delete one draft after confirming it landed
|
|
234
|
-
ovld protocol pending-missions --clear-all # delete every draft
|
|
235
|
-
```
|
|
236
|
-
|
|
237
226
|
To inspect project resolution explicitly:
|
|
238
227
|
|
|
239
228
|
```bash
|
|
@@ -262,11 +251,17 @@ ovld protocol create-project --name "Acme Web" --directory /path/to/repo
|
|
|
262
251
|
ovld protocol create-project --name "Acme Web" --no-directory
|
|
263
252
|
```
|
|
264
253
|
|
|
265
|
-
`ovld create-project` is
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
254
|
+
`ovld create-project --name "<name>"` is the top-level convenience command; it accepts
|
|
255
|
+
only `--name`, `--directory`/`--no-directory`, and `--json`, and always creates the
|
|
256
|
+
project in your resolved workspace. When a directory is registered it also writes
|
|
257
|
+
`.overlord/project.json` so future cwd-based resolution finds the project.
|
|
258
|
+
|
|
259
|
+
`ovld protocol create-project --name "<name>"` is the parentless Protocol surface;
|
|
260
|
+
unlike the top-level command it does not link a local directory. Pass
|
|
261
|
+
`--workspace-id <id|slug|name>` to choose a workspace when you belong to more than one
|
|
262
|
+
(omitting it returns `workspace_selection_required` with your choices); optional
|
|
263
|
+
`--description <text>` and `--slug <text>` are also accepted. There is no `--color`
|
|
264
|
+
flag on either surface.
|
|
270
265
|
|
|
271
266
|
### Resolving the project ID when you don't have one
|
|
272
267
|
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
- `overlord_record_work` (hosted MCP) and `ovld protocol record-work` (CLI) record already-completed chat work as a single review-column mission with a completed objective, explicitly supplied changed files, optional rationales, and the standard Gemini delivery summary — no `attach`/`deliver`. Hosted MCP requires `projectId` (it never chooses a project implicitly); the CLI resolves the project from the working directory or `--project-id`. The submission format is in [record-work.md](record-work.md). The route is `POST /api/protocol/record-work`.
|
|
11
11
|
- `overlord_add_artifact` (hosted MCP) and `ovld protocol add-artifact` (CLI) create a mission artifact during a turn without delivering. Required: `type` / `--type`, `label` / `--label`, mission scope (`missionId` / `--mission-id`, or an objective display id as `objectiveId` / `--objective-id`), plus at least one of `contentText` / `--content-text`/`--content-text-file` or `externalUrl` / `--external-url`. Optional `sessionKey` / `--session-key` stamps session/objective provenance; `objectiveId` / `--objective-id` does the same when there is no live session, and the session key wins if both are given. Same service as REST `POST /api/missions/:id/artifacts`. The route is `POST /api/protocol/add-artifact`.
|
|
12
12
|
- `overlord_update_artifact` (hosted MCP) and `ovld protocol update-artifact` (CLI) revise an existing mission artifact's label, Markdown content, and/or HTTP(S) URL in place. Required: `artifactId` / `--artifact-id`, `expectedRevision` / `--expected-revision`, and mission scope (`missionId` / `--mission-id`, or an objective display id as `objectiveId` / `--objective-id`). Provide at least one editable field. No session key is required. Same service as REST `PATCH /api/missions/:id/artifacts/:artifactId`. The route is `POST /api/protocol/update-artifact`.
|
|
13
|
+
- `overlord_delete_missions` / `overlord_delete_objectives` (hosted MCP) and `ovld protocol delete-missions` / `delete-objectives` (CLI) bulk soft-delete one to 100 mission or objective UUID/display-id references atomically. They require `confirm: true` / `--confirm`; before setting it, agents must show the resolved list to the user and receive affirmative approval. A missing, duplicate, deleted, or unauthorized target rejects the entire request. Mission deletion includes live child objectives; objective deletion removes live Run Queue membership.
|
|
13
14
|
- Run Queue MCP stays a thin Protocol surface: `overlord_list_run_queues` reads compact/full state; `overlord_reorder_run_queue` atomically replaces one queue's complete entry order; and `overlord_queue_objective` accepts `objectiveId`, optional `queue` / `after` / `front` / `position`, and `remove`. `overlord_manage_run_queue` creates, updates, deletes, and reorders queue definitions. Entry operations use `execution_request:create`; definition operations use `project:update`, so they require a full-scope token. Instruction text remains editable only in `draft` or `future` state. The routes are `POST /api/protocol/run-queue`, `reorder-run-queue`, `queue-objective`, `dequeue-objective`, `create-run-queue`, `update-run-queue`, `delete-run-queue`, `reorder-project-run-queues`, and `update-objective`.
|
|
14
15
|
- Objective attachment tools follow the `<verb>_<noun>` MCP naming: `list_attachments`, `prepare_attachment_upload`, `finalize_attachment_upload`, `get_attachment_download_url`, `upload_attachment_file`. CLI commands use `attachment-*`. `mission_id` / `missionId` is optional for attachment calls when the objective or attachment id lets the server derive mission scope.
|
|
15
16
|
- "Artifacts" may be published mid-turn with `add-artifact` / `overlord_add_artifact`, revised with `update-artifact` / `overlord_update_artifact`, or attached at `deliver` time (next_steps, test_results, migration, decision, note, url) — not user-uploaded files. Files attached by users live on objectives via the attachment tools above.
|
|
@@ -110,16 +110,14 @@ function compactSearchResponse(response) {
|
|
|
110
110
|
results: value.results.map(result => ({
|
|
111
111
|
...result,
|
|
112
112
|
matches: Array.isArray(result.matches)
|
|
113
|
-
? result.matches
|
|
114
|
-
|
|
115
|
-
.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return compactMatch;
|
|
122
|
-
})
|
|
113
|
+
? result.matches.slice(0, 2).map(match => {
|
|
114
|
+
const compactMatch = { ...match };
|
|
115
|
+
delete compactMatch.snippet;
|
|
116
|
+
delete compactMatch.matchedTerms;
|
|
117
|
+
delete compactMatch.createdAt;
|
|
118
|
+
delete compactMatch.updatedAt;
|
|
119
|
+
return compactMatch;
|
|
120
|
+
})
|
|
123
121
|
: result.matches
|
|
124
122
|
}))
|
|
125
123
|
};
|
|
@@ -312,7 +310,7 @@ const tools = [
|
|
|
312
310
|
name: 'overlord_list_deliveries',
|
|
313
311
|
title: 'List mission deliveries',
|
|
314
312
|
description:
|
|
315
|
-
|
|
313
|
+
"Use this to read a mission's delivered work after locating it. Returns newest-first normalized delivery records including summary, verification, follow-up notes, and authoritative delivery evidence; it never exposes raw delivery payloads.",
|
|
316
314
|
inputSchema: objectSchema({
|
|
317
315
|
missionId: stringProperty(
|
|
318
316
|
'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
|
|
@@ -336,7 +334,7 @@ const tools = [
|
|
|
336
334
|
'Optional reasoning-effort setting to snapshot onto the execution request.'
|
|
337
335
|
),
|
|
338
336
|
executionTargetId: stringProperty(
|
|
339
|
-
|
|
337
|
+
"Optional eligible execution target id. Omit to use the project's normal target selection."
|
|
340
338
|
)
|
|
341
339
|
},
|
|
342
340
|
['objectiveId', 'agent']
|
|
@@ -407,6 +405,44 @@ const tools = [
|
|
|
407
405
|
['objectiveId']
|
|
408
406
|
)
|
|
409
407
|
},
|
|
408
|
+
{
|
|
409
|
+
name: 'overlord_delete_missions',
|
|
410
|
+
title: 'Delete missions',
|
|
411
|
+
description:
|
|
412
|
+
'Use this only after showing the resolved mission list to the user and receiving an affirmative response. Soft-deletes one to 100 missions atomically; any missing, duplicate, deleted, or unauthorized target rejects the entire request. Deleting a mission also soft-deletes its live objectives.',
|
|
413
|
+
inputSchema: objectSchema(
|
|
414
|
+
{
|
|
415
|
+
missionIds: {
|
|
416
|
+
type: 'array',
|
|
417
|
+
description: 'One to 100 unique mission UUIDs or display IDs to delete.',
|
|
418
|
+
items: stringProperty('Mission UUID or workspace display ID.')
|
|
419
|
+
},
|
|
420
|
+
confirm: booleanProperty(
|
|
421
|
+
'Must be true only after the user has reviewed the resolved mission list and affirmatively approved deletion.'
|
|
422
|
+
)
|
|
423
|
+
},
|
|
424
|
+
['missionIds', 'confirm']
|
|
425
|
+
)
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
name: 'overlord_delete_objectives',
|
|
429
|
+
title: 'Delete objectives',
|
|
430
|
+
description:
|
|
431
|
+
'Use this only after showing the resolved objective list to the user and receiving an affirmative response. Soft-deletes one to 100 objectives atomically; any missing, duplicate, deleted, or unauthorized target rejects the entire request. Deleting an objective also removes its live Run Queue membership.',
|
|
432
|
+
inputSchema: objectSchema(
|
|
433
|
+
{
|
|
434
|
+
objectiveIds: {
|
|
435
|
+
type: 'array',
|
|
436
|
+
description: 'One to 100 unique objective UUIDs or display IDs to delete.',
|
|
437
|
+
items: stringProperty('Objective UUID or display ID.')
|
|
438
|
+
},
|
|
439
|
+
confirm: booleanProperty(
|
|
440
|
+
'Must be true only after the user has reviewed the resolved objective list and affirmatively approved deletion.'
|
|
441
|
+
)
|
|
442
|
+
},
|
|
443
|
+
['objectiveIds', 'confirm']
|
|
444
|
+
)
|
|
445
|
+
},
|
|
410
446
|
{
|
|
411
447
|
name: 'overlord_list_run_queues',
|
|
412
448
|
title: 'List Run Queues',
|
|
@@ -485,12 +521,14 @@ const tools = [
|
|
|
485
521
|
type: 'string',
|
|
486
522
|
enum: ['create', 'update', 'delete', 'reorder_queues', 'retry_entry'],
|
|
487
523
|
description:
|
|
488
|
-
|
|
524
|
+
"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
525
|
},
|
|
490
526
|
projectId: stringProperty(
|
|
491
527
|
'Project UUID, slug, or name. Required for create and reorder_queues.'
|
|
492
528
|
),
|
|
493
|
-
queue: stringProperty(
|
|
529
|
+
queue: stringProperty(
|
|
530
|
+
'Run Queue UUID or unambiguous name. Required for update and delete.'
|
|
531
|
+
),
|
|
494
532
|
name: stringProperty('New queue name for create, or the replacement name for update.'),
|
|
495
533
|
paused: booleanProperty(
|
|
496
534
|
'update only: true pauses dispatching from the queue, false resumes it.'
|
|
@@ -512,7 +550,7 @@ const tools = [
|
|
|
512
550
|
}
|
|
513
551
|
},
|
|
514
552
|
['action']
|
|
515
|
-
)
|
|
553
|
+
)
|
|
516
554
|
},
|
|
517
555
|
{
|
|
518
556
|
name: 'overlord_attach_session',
|
|
@@ -862,6 +900,33 @@ async function callOverlordTool(name, args) {
|
|
|
862
900
|
...(hasInstructionText ? { 'instruction-text': requiredString(args, 'instructionText') } : {})
|
|
863
901
|
});
|
|
864
902
|
}
|
|
903
|
+
if (name === 'overlord_delete_missions') {
|
|
904
|
+
if (!Array.isArray(args.missionIds) || !args.missionIds.every(id => typeof id === 'string')) {
|
|
905
|
+
throw new Error('missionIds must be an array of strings');
|
|
906
|
+
}
|
|
907
|
+
if (args.confirm !== true) {
|
|
908
|
+
throw new Error('confirm must be true after the user has affirmatively approved deletion');
|
|
909
|
+
}
|
|
910
|
+
return runProtocol('delete-missions', {
|
|
911
|
+
'mission-ids-json': args.missionIds,
|
|
912
|
+
confirm: true
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
if (name === 'overlord_delete_objectives') {
|
|
916
|
+
if (
|
|
917
|
+
!Array.isArray(args.objectiveIds) ||
|
|
918
|
+
!args.objectiveIds.every(id => typeof id === 'string')
|
|
919
|
+
) {
|
|
920
|
+
throw new Error('objectiveIds must be an array of strings');
|
|
921
|
+
}
|
|
922
|
+
if (args.confirm !== true) {
|
|
923
|
+
throw new Error('confirm must be true after the user has affirmatively approved deletion');
|
|
924
|
+
}
|
|
925
|
+
return runProtocol('delete-objectives', {
|
|
926
|
+
'objective-ids-json': args.objectiveIds,
|
|
927
|
+
confirm: true
|
|
928
|
+
});
|
|
929
|
+
}
|
|
865
930
|
if (name === 'overlord_list_run_queues') {
|
|
866
931
|
const detail = optionalString(args, 'detail') || 'compact';
|
|
867
932
|
if (detail !== 'compact' && detail !== 'full') {
|
|
@@ -1110,7 +1175,7 @@ process.stdin.on('data', async chunk => {
|
|
|
1110
1175
|
result: {
|
|
1111
1176
|
protocolVersion: PROTOCOL_VERSION,
|
|
1112
1177
|
capabilities: { tools: { listChanged: false } },
|
|
1113
|
-
serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.
|
|
1178
|
+
serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.41' }
|
|
1114
1179
|
}
|
|
1115
1180
|
});
|
|
1116
1181
|
continue;
|
|
@@ -236,6 +236,14 @@ Requirements:
|
|
|
236
236
|
- Degrades gracefully without a web app open: the harness's own fallback
|
|
237
237
|
decision (allow/deny/ask) applies when no one answers in time.
|
|
238
238
|
|
|
239
|
+
As of the Latch v2 cutover, no shipped launch path currently supplies the session-channel
|
|
240
|
+
credential this mechanism depends on (`createSessionChannel` has no production callers), so
|
|
241
|
+
"blocks the harness's tool call until answered" does not happen end-to-end for any existing
|
|
242
|
+
adapter today — do not assume a new connector can exercise this path against a real Overlord
|
|
243
|
+
deployment without first restoring that wiring. The one decision kind that is still remotely
|
|
244
|
+
answerable — a blocking **question** — goes through the mission protocol's `ask`/resolve flow
|
|
245
|
+
and a live Latch terminal session, not through this session-channel mechanism.
|
|
246
|
+
|
|
239
247
|
### Stop Hook
|
|
240
248
|
|
|
241
249
|
Future requirement:
|