omp-conductor 0.13.0 → 0.15.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/README.md +549 -234
- package/package.json +8 -5
- package/schema/config.schema.json +609 -0
- package/src/availability.ts +165 -0
- package/src/board.ts +19 -32
- package/src/brief-upgrade.ts +1 -1
- package/src/briefs/orchestrator.md +72 -31
- package/src/briefs/policy.md +48 -36
- package/src/briefs/probes/gates.md +51 -0
- package/src/briefs/probes/project-context.md +59 -0
- package/src/briefs/probes/release-procedure.md +81 -0
- package/src/cli.ts +356 -212
- package/src/config-schema.ts +352 -0
- package/src/config.ts +1037 -679
- package/src/confinement.ts +54 -0
- package/src/daemon.ts +644 -390
- package/src/diff-flags.ts +73 -4
- package/src/digest-schedule.ts +92 -24
- package/src/escalate.ts +89 -22
- package/src/fleet.ts +351 -46
- package/src/generate-schema.ts +21 -0
- package/src/graph.ts +3 -3
- package/src/host.ts +16 -0
- package/src/omp.ts +21 -1
- package/src/orchestrator-tick.ts +732 -56
- package/src/privileged.ts +264 -0
- package/src/reports.ts +203 -6
- package/src/session-host.ts +3 -0
- package/src/setup-host.ts +209 -24
- package/src/setup-install.ts +320 -0
- package/src/setup-probe.ts +412 -0
- package/src/setup-wizard.ts +1946 -0
- package/src/setup.ts +457 -53
- package/src/store.ts +610 -98
- package/src/tracker/github.ts +43 -5
- package/src/types.ts +153 -14
- package/src/upgrade.ts +44 -10
- package/src/verbs/actions.ts +131 -13
- package/src/verbs/server.ts +40 -18
- package/src/wizard-ui.ts +249 -0
- package/src/worker.ts +24 -7
- package/skills/conductor-onboarding/SKILL.md +0 -748
- package/skills/conductor-update/SKILL.md +0 -51
- package/src/plugin.ts +0 -1495
package/src/confinement.ts
CHANGED
|
@@ -151,3 +151,57 @@ export function worktreeConfinement(root: string): (pi: ConfinementPi) => void {
|
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Tools a read-only session may call: reading, searching, and thinking.
|
|
157
|
+
*
|
|
158
|
+
* An allowlist rather than a blocklist, because the failure directions are not
|
|
159
|
+
* symmetric. A tool this package has never heard of — one a newer harness adds, or
|
|
160
|
+
* an MCP server contributes — must arrive **denied**: a blocklist would admit it by
|
|
161
|
+
* default, and the first unknown write tool would silently reopen the hole.
|
|
162
|
+
*/
|
|
163
|
+
const READ_ONLY_TOOLS = new Set([
|
|
164
|
+
"read",
|
|
165
|
+
"grep",
|
|
166
|
+
"glob",
|
|
167
|
+
"list",
|
|
168
|
+
"ls",
|
|
169
|
+
"todo",
|
|
170
|
+
"think",
|
|
171
|
+
"sequentialthinking",
|
|
172
|
+
]);
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Decide whether one tool_call may run in a read-only session.
|
|
176
|
+
*
|
|
177
|
+
* Unlike {@link confineToolCall}, this refuses `bash` **outright** rather than
|
|
178
|
+
* inspecting it. That is the distinction the module header draws: parsing a shell
|
|
179
|
+
* string is a false sense of security, but declining to hand over a shell at all
|
|
180
|
+
* is a real boundary. A probe needs to read files, so it loses nothing.
|
|
181
|
+
*/
|
|
182
|
+
export function readOnlyToolCall(toolName: string): ConfineDecision | undefined {
|
|
183
|
+
if (READ_ONLY_TOOLS.has(toolName)) return undefined;
|
|
184
|
+
return {
|
|
185
|
+
block: true,
|
|
186
|
+
reason:
|
|
187
|
+
`Blocked: ${toolName} is not available to this session, which may only read. ` +
|
|
188
|
+
`Answer from the files you can read (read, grep, glob) — there is no shell, ` +
|
|
189
|
+
`no edit, and no network verb here.`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Inline extension factory installing the read-only gate (#307).
|
|
195
|
+
*
|
|
196
|
+
* **Where this boundary does and does not hold.** It is installed by
|
|
197
|
+
* {@link createLocalSession}, so it covers exactly the sessions this package
|
|
198
|
+
* spawns. That is the whole population for the probes it exists for — a probe has
|
|
199
|
+
* no externally started shape, which is precisely what made the orchestrator's
|
|
200
|
+
* gate unenforceable in #143 — so for those it is absolute rather than advisory.
|
|
201
|
+
* It is not a sandbox: it constrains the session's tools, not the process.
|
|
202
|
+
*/
|
|
203
|
+
export function readOnlySession(): (pi: ConfinementPi) => void {
|
|
204
|
+
return (pi) => {
|
|
205
|
+
pi.on("tool_call", (event) => readOnlyToolCall(event.toolName));
|
|
206
|
+
};
|
|
207
|
+
}
|