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.
Files changed (44) hide show
  1. package/README.md +549 -234
  2. package/package.json +8 -5
  3. package/schema/config.schema.json +609 -0
  4. package/src/availability.ts +165 -0
  5. package/src/board.ts +19 -32
  6. package/src/brief-upgrade.ts +1 -1
  7. package/src/briefs/orchestrator.md +72 -31
  8. package/src/briefs/policy.md +48 -36
  9. package/src/briefs/probes/gates.md +51 -0
  10. package/src/briefs/probes/project-context.md +59 -0
  11. package/src/briefs/probes/release-procedure.md +81 -0
  12. package/src/cli.ts +356 -212
  13. package/src/config-schema.ts +352 -0
  14. package/src/config.ts +1037 -679
  15. package/src/confinement.ts +54 -0
  16. package/src/daemon.ts +644 -390
  17. package/src/diff-flags.ts +73 -4
  18. package/src/digest-schedule.ts +92 -24
  19. package/src/escalate.ts +89 -22
  20. package/src/fleet.ts +351 -46
  21. package/src/generate-schema.ts +21 -0
  22. package/src/graph.ts +3 -3
  23. package/src/host.ts +16 -0
  24. package/src/omp.ts +21 -1
  25. package/src/orchestrator-tick.ts +732 -56
  26. package/src/privileged.ts +264 -0
  27. package/src/reports.ts +203 -6
  28. package/src/session-host.ts +3 -0
  29. package/src/setup-host.ts +209 -24
  30. package/src/setup-install.ts +320 -0
  31. package/src/setup-probe.ts +412 -0
  32. package/src/setup-wizard.ts +1946 -0
  33. package/src/setup.ts +457 -53
  34. package/src/store.ts +610 -98
  35. package/src/tracker/github.ts +43 -5
  36. package/src/types.ts +153 -14
  37. package/src/upgrade.ts +44 -10
  38. package/src/verbs/actions.ts +131 -13
  39. package/src/verbs/server.ts +40 -18
  40. package/src/wizard-ui.ts +249 -0
  41. package/src/worker.ts +24 -7
  42. package/skills/conductor-onboarding/SKILL.md +0 -748
  43. package/skills/conductor-update/SKILL.md +0 -51
  44. package/src/plugin.ts +0 -1495
@@ -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
+ }