@botiverse/oar 0.34.0 → 0.35.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 CHANGED
@@ -57,13 +57,14 @@ echoes by identity, including steer → queue fallback. See the
57
57
 
58
58
  ## Public exports
59
59
 
60
- The package has six public entry points:
60
+ The package has these public entry points, plus `@botiverse/oar/community` for community runtimes (below):
61
61
 
62
62
  - `@botiverse/oar`: the runtime registry and adapters, `defineRuntime`, `UnsupportedOptionError`, the `oar-voyage/3` recorder (`openVoyage`), and everything the brands and observe entry points below export. Node-only (adapters import `node:child_process` and runtime SDKs).
63
63
  - `@botiverse/oar/brands`: browser-safe runtime names and SVG icons.
64
64
  - `@botiverse/oar/observe`: the browser-safe pure derivations over `RawEvent`s and `Event`s (`eventsOf`, `coalesceText`, `observeAgent`, `reduceStatus`, `tasksOf`, `observeStalls`, `classifyTool`, `reduceConversation`, `viewOf`, …) with no Node or adapter imports, so a browser or Electron-renderer bundle can import it directly. The root export re-exports all of them.
65
65
  - `@botiverse/oar/kernel`: the runtime-author SPI. `createSessionKernel` is the record stream every built-in adapter is built on (dense `seq`, cursor replay, control recording, the reachability rule) and `sealSession` derives the `Session` API face over an adapter. Pair with `defineRuntime` to ship a custom runtime (a scripted runtime for a host's tests, an in-process agent) without re-implementing the stream contract. `inputImagesRefusal` and `withInputImages` are the image rules every built-in runtime keeps, so a custom runtime refuses the inputs they refuse. `withdrawHeld` is the decision behind `withdraw` for a runtime that holds its own queue.
66
66
  - `@botiverse/oar/agents`: subagents. `createSubagents()` starts child sessions on any runtime that takes `SessionOptions.env` (not cursor), returns a report for every turn they end, takes follow-ups, enforces depth and concurrency limits, and reports each child as a task. The host takes reports with `wait` / `next` or receives them through an `onReport` hook; with `formatReport` and `reportOrigin` it can `deliver` one into a parent session so it wakes. See [subagents](https://github.com/botiverse/oar/blob/main/docs/spec/subagents.md). Node-only.
67
+ - `@botiverse/oar/agents/report`: just `formatReport`, `reportOrigin` and the `SubagentReport` type, with no Node or adapter imports, for a host that only forwards reports (a server relaying them from another machine). `@botiverse/oar/agents` loads every built-in runtime, because `createSubagents` defaults to them.
67
68
  - `@botiverse/oar/testing`: `scriptedRuntime({ turn })`, a ready-made runtime on the kernel SPI whose model is a script. It yields a real `Session` (same records, folds and control semantics) with no binary, login or provider, for hosts' tests and demos. A script can also start tasks (`turn.task`) that end after the turn, like a background command. Node-only.
68
69
 
69
70
  Brand SVG files are exported at `@botiverse/oar/assets/brands/<runtime-id>.svg`. Any other deep import (`@botiverse/oar/dist/...`, source paths) is internal and may break without notice.
@@ -97,10 +98,10 @@ opencode also refuse a `resume` in another directory than the session's own
97
98
  `SessionOptions.mcpServers` attaches MCP servers (stdio `{name, command,
98
99
  args?, env?}` or streamable HTTP `{name, type: "http", url, headers?}`) to
99
100
  one session, on top of the runtime's own: claude reads them from a 0600
100
- temporary file deleted when the session ends, codex from its thread config
101
- overrides, grok, kimi, opencode and antigravity from ACP `session/new` /
102
- `session/resume`, pi from an extension that registers them; cursor refuses
103
- them. Give them again on `resume`. Their `env` and `headers` values never
101
+ FIFO that never puts them on a disk (a temporary file on Windows), codex
102
+ from its thread config overrides, grok, kimi, opencode and antigravity from
103
+ ACP `session/new` / `session/resume`, pi from an extension that registers
104
+ them; cursor refuses them. Give them again on `resume`. Their `env` and `headers` values never
104
105
  appear in a record or an error; antigravity, which would store them in its
105
106
  conversation database, refuses an entry carrying them. See the
106
107
  [channels](https://github.com/botiverse/oar/blob/main/docs/spec/runtime-matrix.md#refused-session-options)
@@ -1,14 +1,10 @@
1
1
  import type { AvailableInstallation } from "../contracts/installation.js";
2
2
  import type { Runtime } from "../contracts/runtime.js";
3
- import type { InputOrigin, Session, SessionOptions } from "../contracts/session.js";
3
+ import type { Session, SessionOptions } from "../contracts/session.js";
4
4
  import { openVoyage } from "../voyage.js";
5
- import type { SubagentReport } from "./types.js";
6
5
  export declare const SUBAGENT_DEPTH_ENV = "OAR_SUBAGENT_DEPTH";
7
6
  export declare const DEFAULT_WAIT_MS = 30000;
8
7
  export declare function hostDepth(): number;
9
- /** The origin to deliver a report with: a notification from that subagent. */
10
- export declare function reportOrigin(report: SubagentReport): InputOrigin;
11
- export declare function formatReport(report: SubagentReport): string;
12
8
  export declare function sessionOf(runtime: Runtime, installation: AvailableInstallation, options: SessionOptions): Promise<Session | string>;
13
9
  export declare function installationOf(runtime: Runtime): Promise<AvailableInstallation | string>;
14
10
  /** Resolves on the first reader call, after `ms`, or when `signal` aborts. */
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/agents/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAEhE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI3D;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAOzI;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,GAAG,MAAM,CAAC,CAM9F;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/G;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAcjH"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/agents/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAOzI;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,GAAG,MAAM,CAAC,CAM9F;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/G;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAcjH"}
@@ -7,15 +7,6 @@ export function hostDepth() {
7
7
  const depth = Number(process.env[SUBAGENT_DEPTH_ENV] ?? "0");
8
8
  return Number.isInteger(depth) && depth >= 0 ? depth : 0;
9
9
  }
10
- /** The origin to deliver a report with: a notification from that subagent. */
11
- export function reportOrigin(report) {
12
- return { kind: "notification", source: `subagent:${report.id}` };
13
- }
14
- export function formatReport(report) {
15
- const outcome = report.outcome.kind === "failed" ? `failed: ${report.outcome.reason}` : report.outcome.kind;
16
- const who = report.name === undefined || report.name === report.id ? report.id : `${report.id} (${report.name})`;
17
- return `[subagent ${who} on ${report.runtime}, turn ${String(report.turn)}: ${outcome}; session ${report.sessionId}]\n${report.text}`;
18
- }
19
10
  export async function sessionOf(runtime, installation, options) {
20
11
  try {
21
12
  const session = await runtime.session(installation, options);
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/agents/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5G,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC;IACjH,OAAO,aAAa,GAAG,OAAO,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,aAAa,MAAM,CAAC,SAAS,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACxI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB,EAAE,YAAmC,EAAE,OAAuB;IAC5G,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,CAAC,EAAE,gCAAgC,CAAC;IACvD,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAClD,OAAO,YAAY,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9K,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB,EAAE,EAAU,EAAE,MAAoB;IAC9F,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,SAAiB;IACnD,OAAO,GAAG,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,IAAY,EAAE,MAAwC;IAChG,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/agents/helpers.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  * docs/spec/subagents.md.
5
5
  */
6
6
  export { createSubagents } from "./crew.js";
7
- export { formatReport, reportOrigin, SUBAGENT_DEPTH_ENV } from "./helpers.js";
7
+ export { SUBAGENT_DEPTH_ENV } from "./helpers.js";
8
+ export { formatReport, reportOrigin } from "./report.js";
8
9
  export type { SendMode, SendResult, SpawnOptions, SpawnRefusalCode, SpawnResult, Subagent, SubagentInfo, SubagentReport, Subagents, SubagentsOptions, SubagentState, SubagentTaskEvent, WaitOptions, } from "./types.js";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -4,5 +4,6 @@
4
4
  * docs/spec/subagents.md.
5
5
  */
6
6
  export { createSubagents } from "./crew.js";
7
- export { formatReport, reportOrigin, SUBAGENT_DEPTH_ENV } from "./helpers.js";
7
+ export { SUBAGENT_DEPTH_ENV } from "./helpers.js";
8
+ export { formatReport, reportOrigin } from "./report.js";
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Turning a subagent's report into input for a parent session. Pure, with no
3
+ * Node or adapter imports, so a host that only forwards reports (a server
4
+ * relaying them from another machine) can import it without loading a
5
+ * runtime: `@botiverse/oar/agents/report`. See docs/spec/subagents.md.
6
+ */
7
+ import type { InputOrigin } from "../contracts/session.js";
8
+ import type { SubagentReport } from "./types.js";
9
+ export type { SubagentReport } from "./types.js";
10
+ /** The origin to deliver a report with: a notification from that subagent. */
11
+ export declare function reportOrigin(report: SubagentReport): InputOrigin;
12
+ export declare function formatReport(report: SubagentReport): string;
13
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/agents/report.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAEhE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI3D"}
@@ -0,0 +1,10 @@
1
+ /** The origin to deliver a report with: a notification from that subagent. */
2
+ export function reportOrigin(report) {
3
+ return { kind: "notification", source: `subagent:${report.id}` };
4
+ }
5
+ export function formatReport(report) {
6
+ const outcome = report.outcome.kind === "failed" ? `failed: ${report.outcome.reason}` : report.outcome.kind;
7
+ const who = report.name === undefined || report.name === report.id ? report.id : `${report.id} (${report.name})`;
8
+ return `[subagent ${who} on ${report.runtime}, turn ${String(report.turn)}: ${outcome}; session ${report.sessionId}]\n${report.text}`;
9
+ }
10
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/agents/report.ts"],"names":[],"mappings":"AAWA,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5G,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC;IACjH,OAAO,aAAa,GAAG,OAAO,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,aAAa,MAAM,CAAC,SAAS,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACxI,CAAC"}
@@ -63,11 +63,12 @@ export interface SessionOptions {
63
63
  /**
64
64
  * MCP servers attached to THIS session, on top of the servers the runtime
65
65
  * is configured with: oar never edits the runtime's configuration or
66
- * drops the user's servers (claude reads the session's from a 0600
67
- * temporary file oar deletes when the session ends; codex from its
68
- * `thread/start` / `thread/resume` config overrides; grok, kimi, opencode
69
- * and antigravity from ACP `session/new` / `session/resume` `mcpServers`;
70
- * pi from an extension that registers them). Not remembered: give them
66
+ * drops the user's servers (claude reads the session's from a 0600 FIFO
67
+ * oar removes once read, on Windows a temporary file removed when claude
68
+ * exits; codex from its `thread/start` / `thread/resume` config
69
+ * overrides; grok, kimi, opencode and antigravity from ACP `session/new` /
70
+ * `session/resume` `mcpServers`; pi from an extension that registers
71
+ * them). Not remembered: give them
71
72
  * again on `resume`, where oar attaches them to the resumed session too. A
72
73
  * server named like one the user configured meets it the runtime's way for
73
74
  * this session (codex: merged into it field by field; pi: the open fails
@@ -1 +1 @@
1
- {"version":3,"file":"session-options.d.ts","sourceRoot":"","sources":["../../src/contracts/session-options.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GACvI;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAEhI;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,0SAA0S;IAC1S,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kPAAkP;IAClP,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kyBAAkyB;IAClyB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,iXAAiX;IACjX,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,mZAAmZ;IACnZ,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAC5C"}
1
+ {"version":3,"file":"session-options.d.ts","sourceRoot":"","sources":["../../src/contracts/session-options.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GACvI;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAEhI;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,0SAA0S;IAC1S,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kPAAkP;IAClP,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kyBAAkyB;IAClyB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,iXAAiX;IACjX,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,mZAAmZ;IACnZ,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAC5C"}
@@ -1,16 +1,13 @@
1
- import type { McpServer, SessionOptions } from "../../contracts/session.js";
1
+ import type { SessionOptions } from "../../contracts/session.js";
2
2
  import { type LineProcess } from "../../shared/executable/index.js";
3
3
  /** The process a claude session drives. */
4
4
  export type ClaudeProcess = LineProcess;
5
- /** claude's `--mcp-config` document for the entries: stdio `{type, command, args, env}`, http `{type, url, headers}`. */
6
- export declare function claudeMcpConfig(servers: readonly McpServer[]): {
7
- readonly mcpServers: Record<string, unknown>;
8
- };
9
5
  /**
10
6
  * Start claude for a session (`--session-id`, or `--resume` an existing one)
11
- * and wait until it runs; with MCP servers, their config file lives exactly
12
- * as long as the process. Rejects on a list with an empty or repeated name
13
- * before anything starts, and when claude cannot be spawned.
7
+ * and wait until it runs; with MCP servers, their config is handed over as
8
+ * mcp-config.ts describes and gone at the latest when the process exits.
9
+ * Rejects on a list with an empty or repeated name before anything starts,
10
+ * and when claude cannot be spawned.
14
11
  */
15
12
  export declare function launchClaude(command: string, sessionId: string, options: SessionOptions): Promise<ClaudeProcess>;
16
13
  //# sourceMappingURL=launch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/runtimes/claude/launch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAkBtF,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,yHAAyH;AACzH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAM/G;AAyCD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBtH"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/runtimes/claude/launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAgBtF,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAwBxC;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBtH"}
@@ -1,34 +1,6 @@
1
- import { rmSync } from "node:fs";
2
- import { mkdtemp, writeFile } from "node:fs/promises";
3
- import { tmpdir } from "node:os";
4
- import path from "node:path";
5
1
  import { spawnLineProcess } from "../../shared/executable/index.js";
6
- import { checkMcpServerNames, givenMcpServers, isHttpMcpServer } from "../../shared/mcp-servers.js";
7
- /** claude's `--mcp-config` document for the entries: stdio `{type, command, args, env}`, http `{type, url, headers}`. */
8
- export function claudeMcpConfig(servers) {
9
- return {
10
- mcpServers: Object.fromEntries(servers.map((server) => [server.name, isHttpMcpServer(server)
11
- ? { type: "http", url: server.url, ...(server.headers === undefined ? {} : { headers: server.headers }) }
12
- : { type: "stdio", command: server.command, args: server.args ?? [], ...(server.env === undefined ? {} : { env: server.env }) }])),
13
- };
14
- }
15
- /** The entries' config in a 0600 file in a fresh temporary directory, and how to delete both (synchronously, so an exit handler finishes before `exited` resolves). */
16
- async function writeMcpConfig(servers) {
17
- checkMcpServerNames(servers);
18
- const directory = await mkdtemp(path.join(tmpdir(), "oar-claude-mcp-"));
19
- const file = path.join(directory, "mcp.json");
20
- const remove = () => {
21
- rmSync(directory, { recursive: true, force: true });
22
- };
23
- try {
24
- await writeFile(file, JSON.stringify(claudeMcpConfig(servers)), { mode: 0o600, flag: "wx" });
25
- }
26
- catch (error) {
27
- remove();
28
- throw error;
29
- }
30
- return { path: file, remove };
31
- }
2
+ import { givenMcpServers } from "../../shared/mcp-servers.js";
3
+ import { handOverMcpConfig, sweepAbandonedMcpConfigs } from "./mcp-config.js";
32
4
  function spawnClaude(command, sessionId, options, mcpConfig) {
33
5
  return spawnLineProcess(command, [
34
6
  "-p",
@@ -52,27 +24,33 @@ function spawnClaude(command, sessionId, options, mcpConfig) {
52
24
  }
53
25
  /**
54
26
  * Start claude for a session (`--session-id`, or `--resume` an existing one)
55
- * and wait until it runs; with MCP servers, their config file lives exactly
56
- * as long as the process. Rejects on a list with an empty or repeated name
57
- * before anything starts, and when claude cannot be spawned.
27
+ * and wait until it runs; with MCP servers, their config is handed over as
28
+ * mcp-config.ts describes and gone at the latest when the process exits.
29
+ * Rejects on a list with an empty or repeated name before anything starts,
30
+ * and when claude cannot be spawned.
58
31
  */
59
32
  export async function launchClaude(command, sessionId, options) {
60
33
  const servers = givenMcpServers(options.mcpServers);
61
- const mcpConfig = servers === null ? null : await writeMcpConfig(servers);
34
+ // Either way, what dead hosts left behind goes first (mcp-config.ts).
35
+ const mcpConfig = servers === null ? null : await handOverMcpConfig(servers);
36
+ if (mcpConfig === null) {
37
+ await sweepAbandonedMcpConfigs();
38
+ }
62
39
  let child = null;
63
40
  try {
64
41
  child = spawnClaude(command, sessionId, options, mcpConfig?.path ?? null);
65
42
  }
66
43
  finally {
67
44
  if (child === null) {
68
- mcpConfig?.remove();
45
+ mcpConfig?.end();
69
46
  }
70
47
  }
71
48
  if (mcpConfig !== null) {
72
49
  // Fires once, for an exit or a failed spawn alike, before `exited` resolves.
73
50
  child.onExit(() => {
74
- mcpConfig.remove();
51
+ mcpConfig.end();
75
52
  });
53
+ mcpConfig.start();
76
54
  }
77
55
  await child.spawned;
78
56
  return child;
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/runtimes/claude/launch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/runtimes/claude/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { McpServer } from "../../contracts/session.js";
2
+ /** How the config reaches one claude process: the `--mcp-config` path, `start()` once claude is spawned, `end()` once it has exited or failed to spawn (idempotent). */
3
+ export interface McpConfigHandoff {
4
+ readonly path: string;
5
+ start(): void;
6
+ end(): void;
7
+ }
8
+ /** claude's `--mcp-config` document for the entries: stdio `{type, command, args, env}`, http `{type, url, headers}`. */
9
+ export declare function claudeMcpConfig(servers: readonly McpServer[]): {
10
+ readonly mcpServers: Record<string, unknown>;
11
+ };
12
+ /**
13
+ * Before any claude starts, with servers or without: remove what hosts that
14
+ * died left behind, letting a claude still waiting on such a FIFO go.
15
+ */
16
+ export declare function sweepAbandonedMcpConfigs(): Promise<void>;
17
+ /** The handoff for these entries (sweeping as above first). Rejects on an empty or repeated name before anything is created. */
18
+ export declare function handOverMcpConfig(servers: readonly McpServer[]): Promise<McpConfigHandoff>;
19
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/runtimes/claude/mcp-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA+B5D,wKAAwK;AACxK,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,GAAG,IAAI,IAAI,CAAC;CACb;AAED,yHAAyH;AACzH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAM/G;AA2FD;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,gIAAgI;AAChI,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuBhG"}
@@ -0,0 +1,137 @@
1
+ import { constants } from "node:fs";
2
+ import { open, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { runExecutable } from "../../shared/executable/run.js";
6
+ import { checkMcpServerNames, isHttpMcpServer } from "../../shared/mcp-servers.js";
7
+ import { privateTempDir, sweepPrivateTempDirs } from "../../shared/private-temp.js";
8
+ /** claude's `--mcp-config` document for the entries: stdio `{type, command, args, env}`, http `{type, url, headers}`. */
9
+ export function claudeMcpConfig(servers) {
10
+ return {
11
+ mcpServers: Object.fromEntries(servers.map((server) => [server.name, isHttpMcpServer(server)
12
+ ? { type: "http", url: server.url, ...(server.headers === undefined ? {} : { headers: server.headers }) }
13
+ : { type: "stdio", command: server.command, args: server.args ?? [], ...(server.env === undefined ? {} : { env: server.env }) }])),
14
+ };
15
+ }
16
+ function errorCode(error) {
17
+ return error instanceof Error && "code" in error ? error.code : undefined;
18
+ }
19
+ /** A 0600 FIFO at `file`; false where none can be made. */
20
+ async function makeFifo(file) {
21
+ if (process.platform === "win32") {
22
+ return false;
23
+ }
24
+ const made = await runExecutable("mkfifo", ["-m", "600", file]);
25
+ return made.ok;
26
+ }
27
+ /** The write end once a reader has the FIFO open; undefined when `stopped()` first. */
28
+ async function openWhenRead(file, stopped) {
29
+ let wait = 5;
30
+ while (!stopped()) {
31
+ try {
32
+ // oxlint-disable-next-line no-await-in-loop -- polling: each attempt waits for the previous one.
33
+ return await open(file, constants.O_WRONLY | constants.O_NONBLOCK);
34
+ }
35
+ catch (error) {
36
+ if (errorCode(error) !== "ENXIO") {
37
+ throw error;
38
+ }
39
+ }
40
+ // oxlint-disable-next-line no-await-in-loop -- as above; unref'd, so polling alone keeps no host alive.
41
+ await delay(wait, undefined, { ref: false });
42
+ wait = Math.min(wait * 2, 100);
43
+ }
44
+ return undefined;
45
+ }
46
+ /** Write all of `content` to a non-blocking pipe: a full pipe answers EAGAIN until the reader drains it. */
47
+ async function writeAll(handle, content, stopped) {
48
+ let rest = content;
49
+ while (rest.length > 0 && !stopped()) {
50
+ try {
51
+ // oxlint-disable-next-line no-await-in-loop -- sequential writes to one pipe.
52
+ const { bytesWritten } = await handle.write(rest);
53
+ rest = rest.subarray(bytesWritten);
54
+ }
55
+ catch (error) {
56
+ if (errorCode(error) !== "EAGAIN") {
57
+ throw error;
58
+ }
59
+ // oxlint-disable-next-line no-await-in-loop -- as above.
60
+ await delay(5, undefined, { ref: false });
61
+ }
62
+ }
63
+ }
64
+ function fifoHandoff(file, content, directory) {
65
+ let ended = false;
66
+ const stopped = () => ended;
67
+ const end = () => {
68
+ ended = true;
69
+ directory.remove();
70
+ };
71
+ const feed = async () => {
72
+ const handle = await openWhenRead(file, stopped);
73
+ if (handle === undefined) {
74
+ return;
75
+ }
76
+ try {
77
+ await writeAll(handle, Buffer.from(content), stopped);
78
+ }
79
+ finally {
80
+ await handle.close();
81
+ }
82
+ };
83
+ return {
84
+ path: file,
85
+ start: () => {
86
+ // A failed feed (claude closed its end early) leaves claude to report
87
+ // the config it could not read; the directory goes either way.
88
+ void (async () => {
89
+ try {
90
+ await feed();
91
+ }
92
+ catch {
93
+ // claude's own error is the report.
94
+ }
95
+ finally {
96
+ end();
97
+ }
98
+ })();
99
+ },
100
+ end,
101
+ };
102
+ }
103
+ const PREFIX = "oar-claude-mcp-";
104
+ /**
105
+ * Before any claude starts, with servers or without: remove what hosts that
106
+ * died left behind, letting a claude still waiting on such a FIFO go.
107
+ */
108
+ export async function sweepAbandonedMcpConfigs() {
109
+ await sweepPrivateTempDirs(PREFIX);
110
+ }
111
+ /** The handoff for these entries (sweeping as above first). Rejects on an empty or repeated name before anything is created. */
112
+ export async function handOverMcpConfig(servers) {
113
+ checkMcpServerNames(servers);
114
+ const directory = await privateTempDir(PREFIX);
115
+ const file = path.join(directory.path, "mcp.json");
116
+ const content = JSON.stringify(claudeMcpConfig(servers));
117
+ try {
118
+ if (await makeFifo(file)) {
119
+ return fifoHandoff(file, content, directory);
120
+ }
121
+ await writeFile(file, content, { mode: 0o600, flag: "wx" });
122
+ }
123
+ catch (error) {
124
+ directory.remove();
125
+ throw error;
126
+ }
127
+ return {
128
+ path: file,
129
+ start: () => {
130
+ // claude reads the file at startup; it goes when claude exits (end).
131
+ },
132
+ end: () => {
133
+ directory.remove();
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/runtimes/claude/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-config.d.ts","sourceRoot":"","sources":["../../../src/runtimes/opencode/prompt-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAYrE;AA2DD,4EAA4E;AAC5E,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,GAAE,gBAAgC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4B3J;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMhF"}
1
+ {"version":3,"file":"prompt-config.d.ts","sourceRoot":"","sources":["../../../src/runtimes/opencode/prompt-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAYrE;AA2DD,4EAA4E;AAC5E,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,GAAE,gBAAgC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+B3J;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMhF"}
@@ -1,10 +1,10 @@
1
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
1
+ import { rm, writeFile } from "node:fs/promises";
3
2
  import path from "node:path";
4
3
  import { UnsupportedOptionError } from "../../contracts/errors.js";
5
4
  import { processFailure } from "../../shared/executable/diagnostics.js";
6
5
  import { runExecutable } from "../../shared/executable/run.js";
7
6
  import { asRecord } from "../../shared/json.js";
7
+ import { privateTempDir } from "../../shared/private-temp.js";
8
8
  export function validateOpenCodePrompts(options) {
9
9
  const option = options.systemPrompt !== undefined ? "systemPrompt" : "appendSystemPrompt";
10
10
  if (options.systemPrompt === undefined && options.appendSystemPrompt === undefined) {
@@ -76,16 +76,19 @@ async function activeAgent(command, options, run) {
76
76
  export async function prepareOpenCodePrompts(command, options, run = runExecutable) {
77
77
  validateOpenCodePrompts(options);
78
78
  const agent = options.systemPrompt === undefined ? undefined : await activeAgent(command, options, run);
79
- const directory = options.appendSystemPrompt === undefined ? undefined : await mkdtemp(path.join(tmpdir(), "oar-opencode-prompt-"));
79
+ // privateTempDir: a host that ends without disposing leaves it to the backstops there.
80
+ const directory = options.appendSystemPrompt === undefined ? undefined : await privateTempDir("oar-opencode-prompt-");
80
81
  let removal = undefined;
81
82
  const cleanup = async () => {
82
83
  if (directory !== undefined) {
83
- removal ??= rm(directory, { recursive: true, force: true });
84
+ removal ??= rm(directory.path, { recursive: true, force: true });
84
85
  await removal;
86
+ // Already gone; this only takes it off the exit backstop.
87
+ directory.remove();
85
88
  }
86
89
  };
87
90
  try {
88
- const instructions = directory === undefined ? undefined : path.join(directory, "instructions.md");
91
+ const instructions = directory === undefined ? undefined : path.join(directory.path, "instructions.md");
89
92
  if (instructions !== undefined) {
90
93
  await writeFile(instructions, options.appendSystemPrompt ?? "", { mode: 0o600 });
91
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-config.js","sourceRoot":"","sources":["../../../src/runtimes/opencode/prompt-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-config.js","sourceRoot":"","sources":["../../../src/runtimes/opencode/prompt-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** A directory `privateTempDir` made: its path, and its removal (synchronous, idempotent). */
2
+ export interface PrivateTempDir {
3
+ readonly path: string;
4
+ remove(): void;
5
+ }
6
+ /** Remove `prefix` directories whose host pid no longer runs, releasing their FIFOs first; one that cannot be removed (another user's) stays. */
7
+ export declare function sweepPrivateTempDirs(prefix: string): Promise<void>;
8
+ /** A fresh 0700 directory for one runtime process, removed by `remove()` or, failing that, by the backstops above. */
9
+ export declare function privateTempDir(prefix: string): Promise<PrivateTempDir>;
10
+ //# sourceMappingURL=private-temp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-temp.d.ts","sourceRoot":"","sources":["../../src/shared/private-temp.ts"],"names":[],"mappings":"AAwBA,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,IAAI,CAAC;CAChB;AA8CD,iJAAiJ;AACjJ,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE;AAED,sHAAsH;AACtH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAe5E"}
@@ -0,0 +1,78 @@
1
+ import { closeSync, constants, lstatSync, openSync, readdirSync, rmSync } from "node:fs";
2
+ import { mkdtemp, readdir, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ const live = new Set();
6
+ let hooked = false;
7
+ function releaseFifos(directory) {
8
+ let names = [];
9
+ try {
10
+ names = readdirSync(directory);
11
+ }
12
+ catch {
13
+ return;
14
+ }
15
+ for (const name of names) {
16
+ const file = path.join(directory, name);
17
+ try {
18
+ if (lstatSync(file).isFIFO()) {
19
+ closeSync(openSync(file, constants.O_WRONLY | constants.O_NONBLOCK));
20
+ }
21
+ }
22
+ catch {
23
+ // ENXIO: no reader is waiting.
24
+ }
25
+ }
26
+ }
27
+ function removeDirectory(directory) {
28
+ releaseFifos(directory);
29
+ rmSync(directory, { recursive: true, force: true });
30
+ }
31
+ function removeLive() {
32
+ for (const directory of live) {
33
+ removeDirectory(directory);
34
+ }
35
+ live.clear();
36
+ }
37
+ function running(pid) {
38
+ try {
39
+ process.kill(pid, 0);
40
+ return true;
41
+ }
42
+ catch (error) {
43
+ // EPERM: the pid runs, as another user.
44
+ return error instanceof Error && "code" in error && error.code === "EPERM";
45
+ }
46
+ }
47
+ /** Remove `prefix` directories whose host pid no longer runs, releasing their FIFOs first; one that cannot be removed (another user's) stays. */
48
+ export async function sweepPrivateTempDirs(prefix) {
49
+ const root = tmpdir();
50
+ const names = await readdir(root).catch(() => []);
51
+ await Promise.all(names.map(async (name) => {
52
+ const pid = name.startsWith(prefix) ? /^(\d+)-/u.exec(name.slice(prefix.length))?.[1] : undefined;
53
+ if (pid === undefined || Number(pid) === process.pid || running(Number(pid))) {
54
+ return;
55
+ }
56
+ const directory = path.join(root, name);
57
+ releaseFifos(directory);
58
+ await rm(directory, { recursive: true, force: true }).catch(() => undefined);
59
+ }));
60
+ }
61
+ /** A fresh 0700 directory for one runtime process, removed by `remove()` or, failing that, by the backstops above. */
62
+ export async function privateTempDir(prefix) {
63
+ await sweepPrivateTempDirs(prefix);
64
+ const directory = await mkdtemp(path.join(tmpdir(), `${prefix}${String(process.pid)}-`));
65
+ if (!hooked) {
66
+ process.on("exit", removeLive);
67
+ hooked = true;
68
+ }
69
+ live.add(directory);
70
+ return {
71
+ path: directory,
72
+ remove: () => {
73
+ live.delete(directory);
74
+ removeDirectory(directory);
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=private-temp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-temp.js","sourceRoot":"","sources":["../../src/shared/private-temp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botiverse/oar",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "A programming interface for all agent harnesses: provider-independent contracts for controlling and observing agent runtimes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,6 +30,10 @@
30
30
  "types": "./dist/agents/index.d.ts",
31
31
  "import": "./dist/agents/index.js"
32
32
  },
33
+ "./agents/report": {
34
+ "types": "./dist/agents/report.d.ts",
35
+ "import": "./dist/agents/report.js"
36
+ },
33
37
  "./community": {
34
38
  "types": "./dist/community/index.d.ts",
35
39
  "import": "./dist/community/index.js"