@botiverse/oar 0.0.1
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/LICENSE +202 -0
- package/README.md +13 -0
- package/dist/contracts/account-usage.d.ts +33 -0
- package/dist/contracts/account-usage.d.ts.map +1 -0
- package/dist/contracts/account-usage.js +2 -0
- package/dist/contracts/account-usage.js.map +1 -0
- package/dist/contracts/installation.d.ts +27 -0
- package/dist/contracts/installation.d.ts.map +1 -0
- package/dist/contracts/installation.js +2 -0
- package/dist/contracts/installation.js.map +1 -0
- package/dist/contracts/runtime.d.ts +12 -0
- package/dist/contracts/runtime.d.ts.map +1 -0
- package/dist/contracts/runtime.js +4 -0
- package/dist/contracts/runtime.js.map +1 -0
- package/dist/contracts/session.d.ts +188 -0
- package/dist/contracts/session.d.ts.map +1 -0
- package/dist/contracts/session.js +2 -0
- package/dist/contracts/session.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/installation.d.ts +15 -0
- package/dist/installation.d.ts.map +1 -0
- package/dist/installation.js +60 -0
- package/dist/installation.js.map +1 -0
- package/dist/observe/agent-status.d.ts +39 -0
- package/dist/observe/agent-status.d.ts.map +1 -0
- package/dist/observe/agent-status.js +31 -0
- package/dist/observe/agent-status.js.map +1 -0
- package/dist/observe/aggregate-events.d.ts +15 -0
- package/dist/observe/aggregate-events.d.ts.map +1 -0
- package/dist/observe/aggregate-events.js +70 -0
- package/dist/observe/aggregate-events.js.map +1 -0
- package/dist/observe/index.d.ts +17 -0
- package/dist/observe/index.d.ts.map +1 -0
- package/dist/observe/index.js +13 -0
- package/dist/observe/index.js.map +1 -0
- package/dist/observe/observe-agent.d.ts +38 -0
- package/dist/observe/observe-agent.d.ts.map +1 -0
- package/dist/observe/observe-agent.js +61 -0
- package/dist/observe/observe-agent.js.map +1 -0
- package/dist/observe/stall-observer.d.ts +19 -0
- package/dist/observe/stall-observer.d.ts.map +1 -0
- package/dist/observe/stall-observer.js +36 -0
- package/dist/observe/stall-observer.js.map +1 -0
- package/dist/observe/tool-activity.d.ts +21 -0
- package/dist/observe/tool-activity.d.ts.map +1 -0
- package/dist/observe/tool-activity.js +87 -0
- package/dist/observe/tool-activity.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +30 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtimes/claude/account-usage.d.ts +29 -0
- package/dist/runtimes/claude/account-usage.d.ts.map +1 -0
- package/dist/runtimes/claude/account-usage.js +179 -0
- package/dist/runtimes/claude/account-usage.js.map +1 -0
- package/dist/runtimes/claude/context-usage.d.ts +10 -0
- package/dist/runtimes/claude/context-usage.d.ts.map +1 -0
- package/dist/runtimes/claude/context-usage.js +23 -0
- package/dist/runtimes/claude/context-usage.js.map +1 -0
- package/dist/runtimes/claude/index.d.ts +9 -0
- package/dist/runtimes/claude/index.d.ts.map +1 -0
- package/dist/runtimes/claude/index.js +13 -0
- package/dist/runtimes/claude/index.js.map +1 -0
- package/dist/runtimes/claude/installation.d.ts +2 -0
- package/dist/runtimes/claude/installation.d.ts.map +1 -0
- package/dist/runtimes/claude/installation.js +3 -0
- package/dist/runtimes/claude/installation.js.map +1 -0
- package/dist/runtimes/claude/projection.d.ts +46 -0
- package/dist/runtimes/claude/projection.d.ts.map +1 -0
- package/dist/runtimes/claude/projection.js +110 -0
- package/dist/runtimes/claude/projection.js.map +1 -0
- package/dist/runtimes/claude/session.d.ts +3 -0
- package/dist/runtimes/claude/session.d.ts.map +1 -0
- package/dist/runtimes/claude/session.js +166 -0
- package/dist/runtimes/claude/session.js.map +1 -0
- package/dist/runtimes/codex/account-usage.d.ts +40 -0
- package/dist/runtimes/codex/account-usage.d.ts.map +1 -0
- package/dist/runtimes/codex/account-usage.js +185 -0
- package/dist/runtimes/codex/account-usage.js.map +1 -0
- package/dist/runtimes/codex/app-server-client.d.ts +17 -0
- package/dist/runtimes/codex/app-server-client.d.ts.map +1 -0
- package/dist/runtimes/codex/app-server-client.js +68 -0
- package/dist/runtimes/codex/app-server-client.js.map +1 -0
- package/dist/runtimes/codex/context-usage.d.ts +10 -0
- package/dist/runtimes/codex/context-usage.d.ts.map +1 -0
- package/dist/runtimes/codex/context-usage.js +16 -0
- package/dist/runtimes/codex/context-usage.js.map +1 -0
- package/dist/runtimes/codex/index.d.ts +9 -0
- package/dist/runtimes/codex/index.d.ts.map +1 -0
- package/dist/runtimes/codex/index.js +13 -0
- package/dist/runtimes/codex/index.js.map +1 -0
- package/dist/runtimes/codex/installation.d.ts +2 -0
- package/dist/runtimes/codex/installation.d.ts.map +1 -0
- package/dist/runtimes/codex/installation.js +17 -0
- package/dist/runtimes/codex/installation.js.map +1 -0
- package/dist/runtimes/codex/item-detail.d.ts +4 -0
- package/dist/runtimes/codex/item-detail.d.ts.map +1 -0
- package/dist/runtimes/codex/item-detail.js +47 -0
- package/dist/runtimes/codex/item-detail.js.map +1 -0
- package/dist/runtimes/codex/projection.d.ts +28 -0
- package/dist/runtimes/codex/projection.d.ts.map +1 -0
- package/dist/runtimes/codex/projection.js +98 -0
- package/dist/runtimes/codex/projection.js.map +1 -0
- package/dist/runtimes/codex/reasoning.d.ts +4 -0
- package/dist/runtimes/codex/reasoning.d.ts.map +1 -0
- package/dist/runtimes/codex/reasoning.js +23 -0
- package/dist/runtimes/codex/reasoning.js.map +1 -0
- package/dist/runtimes/codex/session.d.ts +3 -0
- package/dist/runtimes/codex/session.d.ts.map +1 -0
- package/dist/runtimes/codex/session.js +199 -0
- package/dist/runtimes/codex/session.js.map +1 -0
- package/dist/runtimes/pi/index.d.ts +12 -0
- package/dist/runtimes/pi/index.d.ts.map +1 -0
- package/dist/runtimes/pi/index.js +15 -0
- package/dist/runtimes/pi/index.js.map +1 -0
- package/dist/runtimes/pi/installation.d.ts +10 -0
- package/dist/runtimes/pi/installation.d.ts.map +1 -0
- package/dist/runtimes/pi/installation.js +33 -0
- package/dist/runtimes/pi/installation.js.map +1 -0
- package/dist/runtimes/pi/projection.d.ts +39 -0
- package/dist/runtimes/pi/projection.d.ts.map +1 -0
- package/dist/runtimes/pi/projection.js +112 -0
- package/dist/runtimes/pi/projection.js.map +1 -0
- package/dist/runtimes/pi/session.d.ts +11 -0
- package/dist/runtimes/pi/session.d.ts.map +1 -0
- package/dist/runtimes/pi/session.js +201 -0
- package/dist/runtimes/pi/session.js.map +1 -0
- package/dist/runtimes/pi/tool-detail.d.ts +4 -0
- package/dist/runtimes/pi/tool-detail.d.ts.map +1 -0
- package/dist/runtimes/pi/tool-detail.js +14 -0
- package/dist/runtimes/pi/tool-detail.js.map +1 -0
- package/dist/shared/diagnostic-text.d.ts +2 -0
- package/dist/shared/diagnostic-text.d.ts.map +1 -0
- package/dist/shared/diagnostic-text.js +15 -0
- package/dist/shared/diagnostic-text.js.map +1 -0
- package/dist/shared/executable/index.d.ts +8 -0
- package/dist/shared/executable/index.d.ts.map +1 -0
- package/dist/shared/executable/index.js +5 -0
- package/dist/shared/executable/index.js.map +1 -0
- package/dist/shared/executable/process.d.ts +27 -0
- package/dist/shared/executable/process.d.ts.map +1 -0
- package/dist/shared/executable/process.js +77 -0
- package/dist/shared/executable/process.js.map +1 -0
- package/dist/shared/executable/resolve.d.ts +16 -0
- package/dist/shared/executable/resolve.d.ts.map +1 -0
- package/dist/shared/executable/resolve.js +63 -0
- package/dist/shared/executable/resolve.js.map +1 -0
- package/dist/shared/executable/run.d.ts +13 -0
- package/dist/shared/executable/run.d.ts.map +1 -0
- package/dist/shared/executable/run.js +26 -0
- package/dist/shared/executable/run.js.map +1 -0
- package/dist/shared/executable/version.d.ts +6 -0
- package/dist/shared/executable/version.d.ts.map +1 -0
- package/dist/shared/executable/version.js +17 -0
- package/dist/shared/executable/version.js.map +1 -0
- package/dist/shared/failure-class.d.ts +8 -0
- package/dist/shared/failure-class.d.ts.map +1 -0
- package/dist/shared/failure-class.js +24 -0
- package/dist/shared/failure-class.js.map +1 -0
- package/dist/shared/installation.d.ts +9 -0
- package/dist/shared/installation.d.ts.map +1 -0
- package/dist/shared/installation.js +53 -0
- package/dist/shared/installation.js.map +1 -0
- package/dist/shared/instant.d.ts +4 -0
- package/dist/shared/instant.d.ts.map +1 -0
- package/dist/shared/instant.js +4 -0
- package/dist/shared/instant.js.map +1 -0
- package/dist/shared/json.d.ts +10 -0
- package/dist/shared/json.d.ts.map +1 -0
- package/dist/shared/json.js +29 -0
- package/dist/shared/json.js.map +1 -0
- package/dist/shared/seal-session.d.ts +8 -0
- package/dist/shared/seal-session.d.ts.map +1 -0
- package/dist/shared/seal-session.js +24 -0
- package/dist/shared/seal-session.js.map +1 -0
- package/dist/shared/session-kernel.d.ts +25 -0
- package/dist/shared/session-kernel.d.ts.map +1 -0
- package/dist/shared/session-kernel.js +64 -0
- package/dist/shared/session-kernel.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { asRecord } from "../../shared/json.js";
|
|
2
|
+
export function codexItemInput(item) {
|
|
3
|
+
switch (item.type) {
|
|
4
|
+
case "commandExecution":
|
|
5
|
+
return typeof item.command === "string" ? item.command : undefined;
|
|
6
|
+
case "fileChange":
|
|
7
|
+
return Array.isArray(item.changes) ? JSON.stringify(item.changes) : undefined;
|
|
8
|
+
case "mcpToolCall":
|
|
9
|
+
// The app-server schema defines arguments as a JSON value. Preserve that
|
|
10
|
+
// value exactly instead of guessing a human-readable representation.
|
|
11
|
+
return item.arguments === undefined ? undefined : JSON.stringify(item.arguments);
|
|
12
|
+
case "webSearch":
|
|
13
|
+
return typeof item.query === "string" ? item.query : undefined;
|
|
14
|
+
default:
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function codexItemOutput(item) {
|
|
19
|
+
switch (item.type) {
|
|
20
|
+
case "commandExecution": {
|
|
21
|
+
const status = typeof item.exitCode === "number"
|
|
22
|
+
? `exit ${String(item.exitCode)}`
|
|
23
|
+
: (typeof item.status === "string" ? item.status : undefined);
|
|
24
|
+
const output = typeof item.aggregatedOutput === "string" ? item.aggregatedOutput : undefined;
|
|
25
|
+
return [status, output].filter((part) => part !== undefined && part.length > 0).join("\n")
|
|
26
|
+
|| undefined;
|
|
27
|
+
}
|
|
28
|
+
case "fileChange":
|
|
29
|
+
return typeof item.status === "string" ? item.status : undefined;
|
|
30
|
+
case "mcpToolCall": {
|
|
31
|
+
const error = asRecord(item.error);
|
|
32
|
+
if (typeof error?.message === "string") {
|
|
33
|
+
return `error: ${error.message}`;
|
|
34
|
+
}
|
|
35
|
+
// result is the schema's nullable MCP result object; null means there is
|
|
36
|
+
// no result to display.
|
|
37
|
+
return item.result === undefined || item.result === null
|
|
38
|
+
? undefined
|
|
39
|
+
: JSON.stringify(item.result);
|
|
40
|
+
}
|
|
41
|
+
case "webSearch":
|
|
42
|
+
return Array.isArray(item.results) ? JSON.stringify(item.results) : undefined;
|
|
43
|
+
default:
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=item-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-detail.js","sourceRoot":"","sources":["../../../src/runtimes/codex/item-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAEjE,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,kBAAkB;YACrB,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,KAAK,YAAY;YACf,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,KAAK,aAAa;YAChB,yEAAyE;YACzE,qEAAqE;YACrE,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnF,KAAK,WAAW;YACd,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAC9C,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACjC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7F,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;mBACrF,SAAS,CAAC;QACjB,CAAC;QACD,KAAK,YAAY;YACf,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,CAAC;YACD,yEAAyE;YACzE,wBAAwB;YACxB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;gBACtD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SessionEventBody, TurnOutcome } from "../../contracts/session.js";
|
|
2
|
+
import { type JsonRecord } from "../../shared/json.js";
|
|
3
|
+
export type ProjectionCommand = {
|
|
4
|
+
readonly kind: "begin";
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: "emit";
|
|
7
|
+
readonly body: SessionEventBody;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: "settle";
|
|
10
|
+
readonly outcome: TurnOutcome;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* `lastErrorDetail` carries codex's structured `error` notification (which its
|
|
14
|
+
* terminal turn status does NOT include) into the failed settle reason.
|
|
15
|
+
*/
|
|
16
|
+
export interface CodexProjectionState {
|
|
17
|
+
readonly inTurn: boolean;
|
|
18
|
+
readonly lastErrorDetail: string | null;
|
|
19
|
+
}
|
|
20
|
+
export declare const initialCodexProjection: CodexProjectionState;
|
|
21
|
+
/** Control plane → state: a prompt (or resume) opens a turn. */
|
|
22
|
+
export declare function codexPrompted(state: CodexProjectionState): CodexProjectionState;
|
|
23
|
+
/** Fold one codex notification into the next state plus commands. */
|
|
24
|
+
export declare function foldCodexNotification(state: CodexProjectionState, method: string, params: JsonRecord): {
|
|
25
|
+
readonly state: CodexProjectionState;
|
|
26
|
+
readonly commands: readonly ProjectionCommand[];
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAcjE,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,sBAAsB,EAAE,oBAA+D,CAAC;AAErG,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAE/E;AAgDD,qEAAqE;AACrE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GACjB;IAAE,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAoC3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { classifyFailure } from "../../shared/failure-class.js";
|
|
2
|
+
import { asRecord } from "../../shared/json.js";
|
|
3
|
+
import { codexItemInput, codexItemOutput } from "./item-detail.js";
|
|
4
|
+
import { codexReasoningContent } from "./reasoning.js";
|
|
5
|
+
/**
|
|
6
|
+
* The codex notification → SessionEvent projection as a PURE FOLD (see
|
|
7
|
+
* runtimes/claude/projection.ts for the shape). Emits kernel commands
|
|
8
|
+
* (begin/emit/settle); the live adapter applies them and separately owns the
|
|
9
|
+
* transport-only codexTurnId (steer/abort identity), which is not part of the
|
|
10
|
+
* projection. Behavior is pinned by tests/replay against recorded fixtures.
|
|
11
|
+
*/
|
|
12
|
+
const TOOL_ITEM_TYPES = new Set(["commandExecution", "fileChange", "mcpToolCall", "webSearch"]);
|
|
13
|
+
export const initialCodexProjection = { inTurn: false, lastErrorDetail: null };
|
|
14
|
+
/** Control plane → state: a prompt (or resume) opens a turn. */
|
|
15
|
+
export function codexPrompted(state) {
|
|
16
|
+
return { ...state, inTurn: true };
|
|
17
|
+
}
|
|
18
|
+
// The runtime's own status is the truth: an interrupt that landed reports
|
|
19
|
+
// "interrupted"; one that lost the race to completion reports "completed".
|
|
20
|
+
function outcomeFromStatus(status) {
|
|
21
|
+
switch (status) {
|
|
22
|
+
case "interrupted":
|
|
23
|
+
return { kind: "aborted" };
|
|
24
|
+
case "completed":
|
|
25
|
+
return { kind: "completed" };
|
|
26
|
+
default: {
|
|
27
|
+
const reason = typeof status === "string" ? status : "unknown";
|
|
28
|
+
return { kind: "failed", reason, failure: classifyFailure(reason) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function toolEvents(method, item) {
|
|
33
|
+
const itemType = typeof item?.type === "string" ? item.type : "";
|
|
34
|
+
if (!TOOL_ITEM_TYPES.has(itemType)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const itemId = typeof item?.id === "string" ? item.id : "unknown";
|
|
38
|
+
if (method === "item/started") {
|
|
39
|
+
const input = item === null ? undefined : codexItemInput(item);
|
|
40
|
+
return [input === undefined
|
|
41
|
+
? { kind: "tool_call_started", callId: itemId, tool: itemType }
|
|
42
|
+
: { kind: "tool_call_started", callId: itemId, tool: itemType, input }];
|
|
43
|
+
}
|
|
44
|
+
const output = item === null ? undefined : codexItemOutput(item);
|
|
45
|
+
return [output === undefined
|
|
46
|
+
? { kind: "tool_call_ended", callId: itemId }
|
|
47
|
+
: { kind: "tool_call_ended", callId: itemId, output }];
|
|
48
|
+
}
|
|
49
|
+
function settleOutcome(state, status) {
|
|
50
|
+
const outcome = outcomeFromStatus(status);
|
|
51
|
+
if (outcome.kind === "failed" && state.lastErrorDetail !== null) {
|
|
52
|
+
const reason = `${outcome.reason}: ${state.lastErrorDetail}`;
|
|
53
|
+
return { kind: "failed", reason, failure: classifyFailure(reason) };
|
|
54
|
+
}
|
|
55
|
+
return outcome;
|
|
56
|
+
}
|
|
57
|
+
function emits(bodies) {
|
|
58
|
+
return bodies.map((body) => ({ kind: "emit", body }));
|
|
59
|
+
}
|
|
60
|
+
/** Fold one codex notification into the next state plus commands. */
|
|
61
|
+
export function foldCodexNotification(state, method, params) {
|
|
62
|
+
if (method === "turn/started") {
|
|
63
|
+
return state.inTurn
|
|
64
|
+
? { state, commands: [] }
|
|
65
|
+
: { state: { ...state, inTurn: true }, commands: [{ kind: "begin" }] };
|
|
66
|
+
}
|
|
67
|
+
if (method === "error") {
|
|
68
|
+
const error = asRecord(params.error);
|
|
69
|
+
const message = typeof error?.message === "string" ? error.message : "";
|
|
70
|
+
const details = typeof error?.additionalDetails === "string" ? error.additionalDetails : "";
|
|
71
|
+
const combined = [message, details].filter((part) => part.length > 0).join(" — ");
|
|
72
|
+
return combined.length > 0 ? { state: { ...state, lastErrorDetail: combined }, commands: [] } : { state, commands: [] };
|
|
73
|
+
}
|
|
74
|
+
if (!state.inTurn) {
|
|
75
|
+
return { state, commands: [] };
|
|
76
|
+
}
|
|
77
|
+
switch (method) {
|
|
78
|
+
case "item/agentMessage/delta":
|
|
79
|
+
return typeof params.delta === "string"
|
|
80
|
+
? { state, commands: emits([{ kind: "text_delta", text: params.delta }]) }
|
|
81
|
+
: { state, commands: [] };
|
|
82
|
+
case "rawResponseItem/completed": {
|
|
83
|
+
const content = codexReasoningContent(asRecord(params.item));
|
|
84
|
+
return content === null ? { state, commands: [] } : { state, commands: emits([{ kind: "reasoning", content }]) };
|
|
85
|
+
}
|
|
86
|
+
case "item/started":
|
|
87
|
+
case "item/completed":
|
|
88
|
+
return { state, commands: emits(toolEvents(method, asRecord(params.item))) };
|
|
89
|
+
case "turn/completed":
|
|
90
|
+
return {
|
|
91
|
+
state: { inTurn: false, lastErrorDetail: null },
|
|
92
|
+
commands: [{ kind: "settle", outcome: settleOutcome(state, asRecord(params.turn)?.status) }],
|
|
93
|
+
};
|
|
94
|
+
default:
|
|
95
|
+
return { state, commands: [] };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/runtimes/codex/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/reasoning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAYjE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAWtF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { asRecord } from "../../shared/json.js";
|
|
2
|
+
function textParts(value) {
|
|
3
|
+
if (!Array.isArray(value)) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
return value.flatMap((part) => {
|
|
7
|
+
const text = asRecord(part)?.text;
|
|
8
|
+
return typeof text === "string" && text.length > 0 ? [text] : [];
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function codexReasoningContent(item) {
|
|
12
|
+
if (item?.type !== "reasoning") {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const text = [...textParts(item.summary), ...textParts(item.content)].join("\n");
|
|
16
|
+
if (text.length > 0) {
|
|
17
|
+
return { kind: "text", text };
|
|
18
|
+
}
|
|
19
|
+
return typeof item.encrypted_content === "string"
|
|
20
|
+
? { kind: "redacted" }
|
|
21
|
+
: { kind: "empty" };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=reasoning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.js","sourceRoot":"","sources":["../../../src/runtimes/codex/reasoning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAEjE,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;QAClC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;QAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;QACtB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,YAAY,EAAQ,MAAM,4BAA4B,CAAC;AAgC5F,eAAO,MAAM,YAAY,EAAE,YA8L1B,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { asRecord } from "../../shared/json.js";
|
|
3
|
+
import { sealSession } from "../../shared/seal-session.js";
|
|
4
|
+
import { createSessionKernel } from "../../shared/session-kernel.js";
|
|
5
|
+
import { classifyFailure } from "../../shared/failure-class.js";
|
|
6
|
+
import { startAppServerClient } from "./app-server-client.js";
|
|
7
|
+
import { codexContextUsageFromNotification } from "./context-usage.js";
|
|
8
|
+
import { codexPrompted, foldCodexNotification, initialCodexProjection, } from "./projection.js";
|
|
9
|
+
export const codexSession = async (installation, options) => {
|
|
10
|
+
if (installation.via !== "executable") {
|
|
11
|
+
throw new Error("The codex session adapter needs an executable installation");
|
|
12
|
+
}
|
|
13
|
+
// YOLO default (repo policy 2026-08-24): bypass the sandbox too, not just
|
|
14
|
+
// approvals — OAR_CODEX_SANDBOX pins a stricter mode when a host wants one.
|
|
15
|
+
// Injected as a launch -c override because that is the only seam that
|
|
16
|
+
// governs codex's exec tool; thread/start.sandboxMode does NOT (pinned on a
|
|
17
|
+
// real login). A host that wants the user's own config to win can set
|
|
18
|
+
// OAR_CODEX_SANDBOX=inherit to skip the override entirely.
|
|
19
|
+
const sandboxMode = process.env.OAR_CODEX_SANDBOX ?? "danger-full-access";
|
|
20
|
+
const configOverrides = sandboxMode === "inherit" ? {} : { sandbox_mode: `"${sandboxMode}"` };
|
|
21
|
+
const client = startAppServerClient(installation.command, options.env, configOverrides);
|
|
22
|
+
await client.request("initialize", {
|
|
23
|
+
clientInfo: { name: "oar", version: "0.0.0" },
|
|
24
|
+
capabilities: { experimentalApi: true },
|
|
25
|
+
});
|
|
26
|
+
client.notify("initialized", {});
|
|
27
|
+
// Threads persist so a later SessionOptions.resume can reattach; the thread
|
|
28
|
+
// id is the runtime-native identity and becomes Session.id.
|
|
29
|
+
// System prompt seams (probed 2026-08-24 via the aimock journal):
|
|
30
|
+
// baseInstructions REPLACES codex's base prompt; developerInstructions
|
|
31
|
+
// APPENDS as a developer message. "instructions"/"userInstructions" are
|
|
32
|
+
// silently ignored by thread/start.
|
|
33
|
+
const instructionParams = {
|
|
34
|
+
...(options.systemPrompt === undefined ? {} : { baseInstructions: options.systemPrompt }),
|
|
35
|
+
...(options.appendSystemPrompt === undefined ? {} : { developerInstructions: options.appendSystemPrompt }),
|
|
36
|
+
};
|
|
37
|
+
const started = options.resume === undefined
|
|
38
|
+
? await client.request("thread/start", {
|
|
39
|
+
cwd: options.cwd,
|
|
40
|
+
...(options.model === undefined ? {} : { model: options.model }),
|
|
41
|
+
approvalPolicy: "never",
|
|
42
|
+
// Required in addition to initialize.experimentalApi. This exposes
|
|
43
|
+
// the completed Responses API reasoning item, whose encrypted_content
|
|
44
|
+
// lets us distinguish redaction from genuinely empty reasoning.
|
|
45
|
+
experimentalRawEvents: true,
|
|
46
|
+
...instructionParams,
|
|
47
|
+
})
|
|
48
|
+
: await client.request("thread/resume", {
|
|
49
|
+
threadId: options.resume,
|
|
50
|
+
cwd: options.cwd,
|
|
51
|
+
approvalPolicy: "never",
|
|
52
|
+
...instructionParams,
|
|
53
|
+
});
|
|
54
|
+
const threadId = asRecord(started.thread)?.id;
|
|
55
|
+
if (typeof threadId !== "string") {
|
|
56
|
+
throw new TypeError("codex thread start/resume returned no thread id");
|
|
57
|
+
}
|
|
58
|
+
const kernel = createSessionKernel(threadId);
|
|
59
|
+
let current = null;
|
|
60
|
+
let disposed = false;
|
|
61
|
+
let projection = initialCodexProjection;
|
|
62
|
+
let latestContextUsage = null;
|
|
63
|
+
// Drive the pure projection fold, applying its commands to the kernel; the
|
|
64
|
+
// fold owns turn framing and event translation, this owns the transport-only
|
|
65
|
+
// codexTurnId (steer/abort identity).
|
|
66
|
+
client.onNotification((method, params) => {
|
|
67
|
+
if (params.threadId !== threadId) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (method === "thread/tokenUsage/updated") {
|
|
71
|
+
latestContextUsage = codexContextUsageFromNotification(params) ?? latestContextUsage;
|
|
72
|
+
}
|
|
73
|
+
const { state: nextProjection, commands } = foldCodexNotification(projection, method, params);
|
|
74
|
+
projection = nextProjection;
|
|
75
|
+
for (const command of commands) {
|
|
76
|
+
switch (command.kind) {
|
|
77
|
+
case "begin": {
|
|
78
|
+
// Spontaneous turn (a drained queue submission we did not prompt):
|
|
79
|
+
// adopt it, taking the runtime turn id from the notification.
|
|
80
|
+
const startedTurn = asRecord(params.turn)?.id;
|
|
81
|
+
const kernelTurn = kernel.begin();
|
|
82
|
+
if (kernelTurn !== null && typeof startedTurn === "string") {
|
|
83
|
+
current = { kernelTurn, codexTurnId: Promise.resolve(startedTurn) };
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case "emit":
|
|
88
|
+
current?.kernelTurn.emit(command.body);
|
|
89
|
+
break;
|
|
90
|
+
case "settle":
|
|
91
|
+
current?.kernelTurn.settle(command.outcome);
|
|
92
|
+
current = null;
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
client.onExit(() => {
|
|
100
|
+
if (!disposed) {
|
|
101
|
+
kernel.active()?.settle({ kind: "failed", reason: "codex app-server exited", failure: "runtime_exited" });
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
const makeTurn = (state) => ({
|
|
105
|
+
id: state.kernelTurn.id,
|
|
106
|
+
outcome: state.kernelTurn.outcome,
|
|
107
|
+
abort: async () => {
|
|
108
|
+
if (state.kernelTurn.settled()) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const codexTurnId = await state.codexTurnId;
|
|
112
|
+
if (!state.kernelTurn.settled()) {
|
|
113
|
+
try {
|
|
114
|
+
await client.request("turn/interrupt", { threadId, turnId: codexTurnId });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// The turn ended before the interrupt landed — the contractual late
|
|
118
|
+
// abort no-op; turn/completed settles the real outcome.
|
|
119
|
+
}
|
|
120
|
+
await state.kernelTurn.outcome;
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
steer: async (input) => {
|
|
124
|
+
if (state.kernelTurn.settled()) {
|
|
125
|
+
return { kind: "not_steerable", reason: "turn already ended" };
|
|
126
|
+
}
|
|
127
|
+
const codexTurnId = await state.codexTurnId;
|
|
128
|
+
try {
|
|
129
|
+
await client.request("turn/steer", {
|
|
130
|
+
threadId,
|
|
131
|
+
input: [{ type: "text", text: input }],
|
|
132
|
+
expectedTurnId: codexTurnId,
|
|
133
|
+
});
|
|
134
|
+
return { kind: "accepted" };
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return { kind: "not_steerable", reason: error instanceof Error ? error.message : "rejected" };
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
const session = sealSession({
|
|
142
|
+
id: kernel.sessionId,
|
|
143
|
+
prompt(input) {
|
|
144
|
+
const kernelTurn = kernel.begin();
|
|
145
|
+
if (kernelTurn === null) {
|
|
146
|
+
return { kind: "busy" };
|
|
147
|
+
}
|
|
148
|
+
const codexTurnId = (async () => {
|
|
149
|
+
const response = await client.request("turn/start", {
|
|
150
|
+
threadId,
|
|
151
|
+
input: [{ type: "text", text: input }],
|
|
152
|
+
});
|
|
153
|
+
const turnId = asRecord(response.turn)?.id;
|
|
154
|
+
if (typeof turnId !== "string") {
|
|
155
|
+
throw new TypeError("codex turn/start returned no turn id");
|
|
156
|
+
}
|
|
157
|
+
return turnId;
|
|
158
|
+
})();
|
|
159
|
+
void (async () => {
|
|
160
|
+
try {
|
|
161
|
+
await codexTurnId;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const reason = error instanceof Error ? error.message : "turn/start failed";
|
|
165
|
+
kernelTurn.settle({ kind: "failed", reason, failure: classifyFailure(reason) });
|
|
166
|
+
}
|
|
167
|
+
})();
|
|
168
|
+
const state = { kernelTurn, codexTurnId };
|
|
169
|
+
current = state;
|
|
170
|
+
projection = codexPrompted(projection);
|
|
171
|
+
return { kind: "turn", turn: makeTurn(state) };
|
|
172
|
+
},
|
|
173
|
+
subscribe: (observer) => kernel.subscribe(observer),
|
|
174
|
+
contextUsage: () => latestContextUsage,
|
|
175
|
+
queue: {
|
|
176
|
+
durable: true,
|
|
177
|
+
add: async (input) => {
|
|
178
|
+
await client.request("thread/queue/add", {
|
|
179
|
+
threadId,
|
|
180
|
+
input: [{ type: "text", text: input }],
|
|
181
|
+
clientUserMessageId: randomUUID(),
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
dispose: async () => {
|
|
186
|
+
if (disposed) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
disposed = true;
|
|
190
|
+
kernel.active()?.settle({ kind: "aborted" });
|
|
191
|
+
client.kill();
|
|
192
|
+
// Await the actual exit: the process may hold state (codex's sqlite
|
|
193
|
+
// runtime in CODEX_HOME) that the next session needs released.
|
|
194
|
+
await client.exited;
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
return session;
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/codex/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bundled Pi runtime, embedded through the Pi SDK dependency. Account
|
|
3
|
+
* usage is intentionally absent: Pi runs on provider API keys and has no
|
|
4
|
+
* subscription usage surface to observe.
|
|
5
|
+
*/
|
|
6
|
+
export declare const piRuntime: {
|
|
7
|
+
readonly id: "pi";
|
|
8
|
+
readonly installation: import("../../index.js").InstallationProbe;
|
|
9
|
+
readonly session: import("../../index.js").StartSession;
|
|
10
|
+
};
|
|
11
|
+
export { piSession } from "./session.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtimes/pi/index.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;CAIpB,CAAC;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { defineRuntime } from "../../contracts/runtime.js";
|
|
2
|
+
import { piInstallation } from "./installation.js";
|
|
3
|
+
import { piSession } from "./session.js";
|
|
4
|
+
/**
|
|
5
|
+
* The bundled Pi runtime, embedded through the Pi SDK dependency. Account
|
|
6
|
+
* usage is intentionally absent: Pi runs on provider API keys and has no
|
|
7
|
+
* subscription usage surface to observe.
|
|
8
|
+
*/
|
|
9
|
+
export const piRuntime = defineRuntime({
|
|
10
|
+
id: "pi",
|
|
11
|
+
installation: piInstallation,
|
|
12
|
+
session: piSession,
|
|
13
|
+
});
|
|
14
|
+
export { piSession } from "./session.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/pi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;IACrC,EAAE,EAAE,IAAI;IACR,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InstallationProbe } from "../../contracts/installation.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pi ships inside this package as an sdk dependency; there is no executable to
|
|
4
|
+
* probe and no version to report (the embedder pins the sdk version). Normal
|
|
5
|
+
* installs resolve the specifier; bundled/SEA deployments have no node_modules
|
|
6
|
+
* on disk, so fall back to actually importing the compiled-in sdk. An install
|
|
7
|
+
* that omitted the optional dependency fails both and is an honest not_found.
|
|
8
|
+
*/
|
|
9
|
+
export declare const piInstallation: InstallationProbe;
|
|
10
|
+
//# sourceMappingURL=installation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../../../src/runtimes/pi/installation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,iCAAiC,CAAC;AAa/F;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,iBAa5B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const SDK_PACKAGE = "@earendil-works/pi-coding-agent";
|
|
2
|
+
async function sdkLoads() {
|
|
3
|
+
try {
|
|
4
|
+
await import(SDK_PACKAGE);
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Pi ships inside this package as an sdk dependency; there is no executable to
|
|
13
|
+
* probe and no version to report (the embedder pins the sdk version). Normal
|
|
14
|
+
* installs resolve the specifier; bundled/SEA deployments have no node_modules
|
|
15
|
+
* on disk, so fall back to actually importing the compiled-in sdk. An install
|
|
16
|
+
* that omitted the optional dependency fails both and is an honest not_found.
|
|
17
|
+
*/
|
|
18
|
+
export const piInstallation = async () => {
|
|
19
|
+
const resolvable = (() => {
|
|
20
|
+
try {
|
|
21
|
+
import.meta.resolve(SDK_PACKAGE);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
})();
|
|
28
|
+
if (resolvable || await sdkLoads()) {
|
|
29
|
+
return { kind: "available", via: "bundled" };
|
|
30
|
+
}
|
|
31
|
+
return { kind: "not_found" };
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../../../src/runtimes/pi/installation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAEtD,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB,KAAK,IAAmC,EAAE;IACzF,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,UAAU,IAAI,MAAM,QAAQ,EAAE,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { SessionEventBody, TurnOutcome } from "../../contracts/session.js";
|
|
3
|
+
/**
|
|
4
|
+
* The pi SDK-event → SessionEvent projection as a PURE FOLD (see
|
|
5
|
+
* runtimes/claude/projection.ts). Emits kernel commands (begin/emit/settle).
|
|
6
|
+
* pi is the most stateful of the three: a turn may be `adopted` (a run pi
|
|
7
|
+
* started that we did not prompt — settled here on agent_end) or prompt-
|
|
8
|
+
* initiated (settled by the adapter's prompt promise, which reads this same
|
|
9
|
+
* state via piSettledOutcome). abortRequested / providerError are control-
|
|
10
|
+
* plane and error inputs the provider stream alone does not carry.
|
|
11
|
+
*/
|
|
12
|
+
export type ProjectionCommand = {
|
|
13
|
+
readonly kind: "begin";
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: "emit";
|
|
16
|
+
readonly body: SessionEventBody;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "settle";
|
|
19
|
+
readonly outcome: TurnOutcome;
|
|
20
|
+
};
|
|
21
|
+
export interface PiProjectionState {
|
|
22
|
+
readonly inTurn: boolean;
|
|
23
|
+
readonly adopted: boolean;
|
|
24
|
+
readonly abortRequested: boolean;
|
|
25
|
+
readonly reasoningHadText: boolean;
|
|
26
|
+
readonly providerError: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
export declare const initialPiProjection: PiProjectionState;
|
|
29
|
+
/** Control plane → state: a prompt opens a non-adopted turn, resetting per-turn accumulators. */
|
|
30
|
+
export declare function piPrompted(): PiProjectionState;
|
|
31
|
+
export declare function piAbortRequested(state: PiProjectionState): PiProjectionState;
|
|
32
|
+
/** The outcome for a prompt-initiated turn (the fold settles adopted turns itself). */
|
|
33
|
+
export declare function piSettledOutcome(state: PiProjectionState): TurnOutcome;
|
|
34
|
+
/** Fold one pi SDK event into the next state plus commands. */
|
|
35
|
+
export declare function foldPiEvent(state: PiProjectionState, event: AgentSessionEvent): {
|
|
36
|
+
readonly state: PiProjectionState;
|
|
37
|
+
readonly commands: readonly ProjectionCommand[];
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/runtimes/pi/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGhF;;;;;;;;GAQG;AAEH,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,mBAAmB,EAAE,iBAMjC,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,UAAU,IAAI,iBAAiB,CAE9C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAE5E;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,WAAW,CAQtE;AAyCD,+DAA+D;AAC/D,wBAAgB,WAAW,CACzB,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,iBAAiB,GACvB;IAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAqDxF"}
|