@bingjiang0611/rotom 0.1.24 → 0.1.25

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 (60) hide show
  1. package/THIRD_PARTY_NOTICES.md +2 -2
  2. package/extensions/third-party/node_modules/.package-lock.json +3 -3
  3. package/extensions/third-party/node_modules/sol-pi/UPSTREAM.md +7 -3
  4. package/extensions/third-party/node_modules/sol-pi/package.json +1 -1
  5. package/extensions/third-party/node_modules/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/index.ts +5 -2
  6. package/extensions/third-party/node_modules/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/journal.ts +21 -0
  7. package/extensions/third-party/node_modules/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/provider.ts +7 -1
  8. package/extensions/third-party/package-lock.json +4 -4
  9. package/extensions/third-party/package.json +1 -1
  10. package/extensions/third-party/vendor/README.md +5 -4
  11. package/extensions/third-party/vendor/sol-pi-0.1.0-rotom.1.tgz +0 -0
  12. package/package.json +9 -9
  13. package/runtime/pi/fork-build.json +23 -23
  14. package/runtime/pi/node_modules/.package-lock.json +29 -29
  15. package/runtime/pi/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  16. package/runtime/pi/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +30 -7
  17. package/runtime/pi/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  18. package/runtime/pi/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  19. package/runtime/pi/node_modules/@earendil-works/pi-ai/package.json +3 -3
  20. package/runtime/pi/node_modules/@earendil-works/pi-codemode/package.json +2 -2
  21. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{chunk-3CD5ZAQX.js → chunk-6NUCYK64.js} +4 -4
  22. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{chunk-XQ3UQBJ2.js → chunk-DSV77X2M.js} +1 -1
  23. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{virtual-modules-C5BH2VI2.js → virtual-modules-INPREDLP.js} +1 -1
  24. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli-runtime.js +1 -1
  25. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/index.js +1 -1
  26. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/bundle/rpc-entry.js +1 -1
  27. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  28. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +4 -0
  29. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  30. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  31. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  32. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  33. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  34. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +1 -0
  35. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  36. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +8 -0
  37. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  38. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  39. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +1 -0
  40. package/runtime/pi/node_modules/@earendil-works/pi-coding-agent/package.json +7 -7
  41. package/runtime/pi/node_modules/@earendil-works/pi-mcp/package.json +2 -2
  42. package/runtime/pi/node_modules/@earendil-works/pi-telemetry/package.json +2 -2
  43. package/runtime/pi/node_modules/@earendil-works/pi-tui/package.json +2 -2
  44. package/runtime/pi/package-lock.json +37 -37
  45. package/runtime/pi/package.json +15 -15
  46. package/runtime/pi/vendor/earendil-works-pi-agent-core-1.3.0-rotom.2.tgz +0 -0
  47. package/runtime/pi/vendor/earendil-works-pi-ai-1.3.0-rotom.2.tgz +0 -0
  48. package/runtime/pi/vendor/earendil-works-pi-codemode-1.3.0-rotom.2.tgz +0 -0
  49. package/runtime/pi/vendor/{earendil-works-pi-coding-agent-1.3.0-rotom.1.tgz → earendil-works-pi-coding-agent-1.3.0-rotom.2.tgz} +0 -0
  50. package/runtime/pi/vendor/earendil-works-pi-mcp-1.3.0-rotom.2.tgz +0 -0
  51. package/runtime/pi/vendor/earendil-works-pi-telemetry-1.3.0-rotom.2.tgz +0 -0
  52. package/runtime/pi/vendor/earendil-works-pi-tui-1.3.0-rotom.2.tgz +0 -0
  53. package/runtime/product-config.mjs +4 -4
  54. package/extensions/third-party/vendor/sol-pi-0.1.0-rotom.0.tgz +0 -0
  55. package/runtime/pi/vendor/earendil-works-pi-agent-core-1.3.0-rotom.1.tgz +0 -0
  56. package/runtime/pi/vendor/earendil-works-pi-ai-1.3.0-rotom.1.tgz +0 -0
  57. package/runtime/pi/vendor/earendil-works-pi-codemode-1.3.0-rotom.1.tgz +0 -0
  58. package/runtime/pi/vendor/earendil-works-pi-mcp-1.3.0-rotom.1.tgz +0 -0
  59. package/runtime/pi/vendor/earendil-works-pi-telemetry-1.3.0-rotom.1.tgz +0 -0
  60. package/runtime/pi/vendor/earendil-works-pi-tui-1.3.0-rotom.1.tgz +0 -0
@@ -6,13 +6,13 @@ rotom 的根产品许可证尚未确定(当前 `UNLICENSED`);此状态不
6
6
 
7
7
  | Package | Version | Declared license | Distribution |
8
8
  |---|---|---|---|
9
- | `@earendil-works/pi-coding-agent`, `pi-agent-core`, `pi-ai`, `pi-tui`, `pi-telemetry`, `pi-codemode`, `pi-mcp` (all under `@earendil-works`) | `1.3.0-rotom.1` | MIT | In-repository Pi fork (`packages/rotom-pi/`), built into integrity-pinned archives and installed under `runtime/pi/node_modules/` |
9
+ | `@earendil-works/pi-coding-agent`, `pi-agent-core`, `pi-ai`, `pi-tui`, `pi-telemetry`, `pi-codemode`, `pi-mcp` (all under `@earendil-works`) | `1.3.0-rotom.2` | MIT | In-repository Pi fork (`packages/rotom-pi/`), built into integrity-pinned archives and installed under `runtime/pi/node_modules/` |
10
10
  | `@injaneity/pi-computer-use` | `0.5.1-rotom.0` | MIT | Independently maintained fork (`packages/rotom-computer-use/`), included from its integrity-pinned vendor archive |
11
11
  | `@juicesharp/rpiv-ask-user-question` | `2.6.2` | MIT | Included under `extensions/third-party/node_modules/` |
12
12
  | `@narumitw/pi-goal` | `0.54.4-rotom.8` | MIT | Independently maintained fork (`packages/rotom-goal/`), included from its integrity-pinned vendor archive |
13
13
  | `pi-context-view` | `0.7.1` | MIT | Included unmodified under `extensions/third-party/node_modules/` |
14
14
  | `pi-subagents` | `0.52.1-rotom.7` | MIT | Independently maintained Subagent source, included from its integrity-pinned vendor archive |
15
- | `sol-pi` (SoL-Pi, Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES) | `0.1.0-rotom.0` | MIT | Maintained import (`packages/rotom-sol-pi/`), included from its integrity-pinned vendor archive |
15
+ | `sol-pi` (SoL-Pi, Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES) | `0.1.0-rotom.1` | MIT | Maintained import (`packages/rotom-sol-pi/`), included from its integrity-pinned vendor archive |
16
16
 
17
17
  Each included extension retains its original `LICENSE` and package metadata; transitive dependency notices remain in their installed package directories. The modified Subagent, Computer Use, Goal and SoL-Pi archives' origin and scope are documented in `extensions/third-party/vendor/README.md` and each fork's `package/UPSTREAM.md`. Shipping the complete dependency does not enable its unselected tools, templates, or skills.
18
18
 
@@ -166,9 +166,9 @@
166
166
  }
167
167
  },
168
168
  "node_modules/sol-pi": {
169
- "version": "0.1.0-rotom.0",
170
- "resolved": "file:vendor/sol-pi-0.1.0-rotom.0.tgz",
171
- "integrity": "sha512-flcySXo03haUIopXUtuJCOcDevQiOGclTcDeHSOArGltmnbb++0tkf/EFycVB/MB3FmD56g/5UUV81Ll8LP2aw==",
169
+ "version": "0.1.0-rotom.1",
170
+ "resolved": "file:vendor/sol-pi-0.1.0-rotom.1.tgz",
171
+ "integrity": "sha512-t4h2lPg0ktcA4oyiBwKJur13Noc5pfYUhV5lXkRuoPV3CQ/Bf1oYil8zIgz8rBB5vMrYXUn6zRhDQg+S/VljAw==",
172
172
  "license": "MIT",
173
173
  "engines": {
174
174
  "node": ">=22.19.0"
@@ -3,13 +3,17 @@
3
3
  - Upstream: SoL-Pi, <https://github.com/NVlabs/SoL-Pi>. License: MIT, Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES; the original notice stays in `LICENSE`.
4
4
  - Upstream base: `2b791687` ("Update Pi to 0.85.1 and verify 0.84.2 compatibility (#63)").
5
5
  - Source: the maintainer's SoL-Pi branch at `b463fad0ffab6e42488f5c80687adab67174a0ee`, imported from its tracked files. On top of the upstream base it carries five commits: recalled pages keep source references (`81b80b0`), the Pi 0.85 compaction-reason test (`83c5426`), the 0.85.1 baseline merge (`807ad60`), selected upstream reliability backports (`32840b2`), and Pi error-result handling plus runtime compatibility repairs (`b463fad`).
6
- - Maintained version: `0.1.0-rotom.0`, a private component of [rotom](https://github.com/bingjiang0611/rotom). It is not an upstream or npm release.
6
+ - Maintained version: `0.1.0-rotom.1`, a private component of [rotom](https://github.com/bingjiang0611/rotom). It is not an upstream or npm release.
7
7
 
8
8
  ## Changes in this import
9
9
 
10
- - `package.json` / `package-lock.json`: version `0.1.0-rotom.0`, rotom description, `UPSTREAM.md` added to and the hero image removed from the packed files.
10
+ - `package.json` / `package-lock.json`: version `0.1.0-rotom.1`, rotom description, `UPSTREAM.md` added to and the hero image removed from the packed files.
11
11
  - Not imported: `.github/`, `AGENTS.md`, `CLAUDE.md`, `.gitattributes` and `assets/` (the README hero image link is therefore broken in this copy).
12
- - `src/` and `tests/` are byte-identical to the source commit.
12
+ - `src/` and `tests/` were byte-identical to the source commit in `0.1.0-rotom.0`.
13
+
14
+ ## rotom changes
15
+
16
+ - `0.1.0-rotom.1`: the Evidence-Preserving Reducer records each returned reducer response (applied or rejected) as a Pi `usage` entry of kind `sol_pi_reducer`, attributed to the reducer provider/model with the provider-reported usage unchanged. Pi's footer, session stats, usage breakdown and Goal budgets then include the reducer spend. It uses `pi.appendUsage`, which the rotom Pi fork exposes from `1.3.0-rotom.2`; on Pi releases without it (upstream Pi) only the SoL-Pi journal entry is written, as before. Calls that throw before a response (timeout, unavailable model, missing auth) record no usage. Files: `evidence-preserving-reducer/{provider,journal,index}.ts`, `tests/helpers.ts`, `tests/evidence-preserving-reducer.test.ts`.
13
17
 
14
18
  ## How rotom uses it
15
19
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sol-pi",
3
- "version": "0.1.0-rotom.0",
3
+ "version": "0.1.0-rotom.1",
4
4
  "description": "rotom-maintained build of SoL-Pi: context and tool-efficiency extensions for Pi",
5
5
  "type": "module",
6
6
  "private": true,
@@ -39,7 +39,7 @@ import {
39
39
  type ReducerConfigOptions,
40
40
  sha256,
41
41
  } from "./config.ts";
42
- import { createJournal, type Journal } from "./journal.ts";
42
+ import { createJournal, createUsageRecorder, type Journal, type UsageRecorder } from "./journal.ts";
43
43
  import { callReducer, type ProviderResult } from "./provider.ts";
44
44
  import { receiptText, validateReceipt } from "./receipt.ts";
45
45
 
@@ -57,6 +57,7 @@ function errorName(error: unknown): string | undefined {
57
57
 
58
58
  export async function reduceToolResult(
59
59
  journal: Journal,
60
+ recordUsage: UsageRecorder,
60
61
  config: ReducerConfig,
61
62
  event: ToolResultEvent,
62
63
  context: ExtensionContext,
@@ -103,6 +104,7 @@ export async function reduceToolResult(
103
104
  return undefined;
104
105
  }
105
106
 
107
+ recordUsage(provider);
106
108
  journal("provider_response", {
107
109
  toolCallId: event.toolCallId,
108
110
  sourceSha256: archive.hash,
@@ -179,6 +181,7 @@ export async function reduceToolResult(
179
181
  export function createEvidencePreservingReducerExtension(options: EvidencePreservingReducerOptions = {}): ExtensionFactory {
180
182
  return (pi: ExtensionAPI) => {
181
183
  const states = new Map<string, { config: ReducerConfig; journal: Journal }>();
184
+ const recordUsage = createUsageRecorder(pi);
182
185
  pi.on("tool_result", (event, context) => {
183
186
  let root: string;
184
187
  try {
@@ -192,7 +195,7 @@ export function createEvidencePreservingReducerExtension(options: EvidencePreser
192
195
  state = { config, journal: createJournal(pi, config) };
193
196
  states.set(root, state);
194
197
  }
195
- return reduceToolResult(state.journal, state.config, event, context);
198
+ return reduceToolResult(state.journal, recordUsage, state.config, event, context);
196
199
  });
197
200
  };
198
201
  }
@@ -2,8 +2,13 @@
2
2
  * SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
3
  * SPDX-License-Identifier: MIT
4
4
  */
5
+ import type { Usage } from "@earendil-works/pi-ai";
5
6
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
7
  import { REDUCER_EVENT_SCHEMA, REDUCER_EVENT_TYPE, type ReducerConfig } from "./config.ts";
8
+ import type { ProviderResult } from "./provider.ts";
9
+
10
+ /** Pi usage-entry kind for reducer model calls. */
11
+ export const REDUCER_USAGE_KIND = "sol_pi_reducer";
7
12
 
8
13
  /**
9
14
  * Append one non-context session entry per decision the reducer made.
@@ -23,3 +28,19 @@ export function createJournal(pi: ExtensionAPI, config: ReducerConfig): Journal
23
28
  });
24
29
  };
25
30
  }
31
+
32
+ type AppendUsage = (kind: string, provider: string, model: string, usage: Usage, note?: string) => void;
33
+ export type UsageRecorder = (provider: ProviderResult) => void;
34
+
35
+ /**
36
+ * Record each reducer response in Pi's usage entries so footer, session stats
37
+ * and budgets include the reducer spend. Pi releases without
38
+ * `pi.appendUsage` (upstream Pi) keep only the journal record.
39
+ */
40
+ export function createUsageRecorder(pi: ExtensionAPI): UsageRecorder {
41
+ const appendUsage = (pi as ExtensionAPI & { appendUsage?: AppendUsage }).appendUsage;
42
+ if (typeof appendUsage !== "function") return () => {};
43
+ return (provider) => {
44
+ appendUsage.call(pi, REDUCER_USAGE_KIND, provider.provider, provider.responseModel, provider.responseUsage);
45
+ };
46
+ }
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: MIT
4
4
  */
5
5
 
6
- import type { Api, AssistantMessage, Context, Model, ProviderStreamOptions } from "@earendil-works/pi-ai";
6
+ import type { Api, AssistantMessage, Context, Model, ProviderStreamOptions, Usage } from "@earendil-works/pi-ai";
7
7
  import { complete as completeCompat } from "@earendil-works/pi-ai/compat";
8
8
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
9
9
  import type { ArchiveObject } from "./archive.ts";
@@ -44,6 +44,10 @@ export interface ProviderResult {
44
44
  readonly ok: boolean;
45
45
  readonly outputText: string;
46
46
  readonly provider: string;
47
+ /** Concrete model that served the request, for usage attribution. */
48
+ readonly responseModel: string;
49
+ /** Provider-reported usage including cost, recorded unchanged in Pi's usage entries. */
50
+ readonly responseUsage: Usage;
47
51
  readonly stopReason: AssistantMessage["stopReason"];
48
52
  readonly usage: NormalizedUsage;
49
53
  }
@@ -154,6 +158,8 @@ export async function callReducer(
154
158
  ok: response.stopReason === "stop" || response.stopReason === "length",
155
159
  outputText: responseOutputText(response),
156
160
  provider: response.provider,
161
+ responseModel: response.responseModel ?? response.model,
162
+ responseUsage: response.usage,
157
163
  stopReason: response.stopReason,
158
164
  usage: normalizedUsage(response),
159
165
  };
@@ -11,7 +11,7 @@
11
11
  "@narumitw/pi-goal": "0.54.4-rotom.8",
12
12
  "pi-context-view": "0.7.1",
13
13
  "pi-subagents": "0.52.1-rotom.7",
14
- "sol-pi": "0.1.0-rotom.0"
14
+ "sol-pi": "0.1.0-rotom.1"
15
15
  }
16
16
  },
17
17
  "node_modules/@injaneity/pi-computer-use": {
@@ -177,9 +177,9 @@
177
177
  }
178
178
  },
179
179
  "node_modules/sol-pi": {
180
- "version": "0.1.0-rotom.0",
181
- "resolved": "file:vendor/sol-pi-0.1.0-rotom.0.tgz",
182
- "integrity": "sha512-flcySXo03haUIopXUtuJCOcDevQiOGclTcDeHSOArGltmnbb++0tkf/EFycVB/MB3FmD56g/5UUV81Ll8LP2aw==",
180
+ "version": "0.1.0-rotom.1",
181
+ "resolved": "file:vendor/sol-pi-0.1.0-rotom.1.tgz",
182
+ "integrity": "sha512-t4h2lPg0ktcA4oyiBwKJur13Noc5pfYUhV5lXkRuoPV3CQ/Bf1oYil8zIgz8rBB5vMrYXUn6zRhDQg+S/VljAw==",
183
183
  "license": "MIT",
184
184
  "engines": {
185
185
  "node": ">=22.19.0"
@@ -8,6 +8,6 @@
8
8
  "@narumitw/pi-goal": "0.54.4-rotom.8",
9
9
  "pi-context-view": "0.7.1",
10
10
  "pi-subagents": "0.52.1-rotom.7",
11
- "sol-pi": "0.1.0-rotom.0"
11
+ "sol-pi": "0.1.0-rotom.1"
12
12
  }
13
13
  }
@@ -46,12 +46,13 @@ The default product selects **`@narumitw/pi-goal@0.54.4-rotom.8`**, independentl
46
46
 
47
47
  ## Locked SoL-Pi distribution
48
48
 
49
- The default product selects **`sol-pi@0.1.0-rotom.0`**, maintained in `packages/rotom-sol-pi/`. SoL-Pi has no npm release; this archive is packed from that directory.
49
+ The default product selects **`sol-pi@0.1.0-rotom.1`**, maintained in `packages/rotom-sol-pi/`. SoL-Pi has no npm release; this archive is packed from that directory.
50
50
 
51
- - Archive: `sol-pi-0.1.0-rotom.0.tgz`
52
- - SHA512 SRI: `sha512-flcySXo03haUIopXUtuJCOcDevQiOGclTcDeHSOArGltmnbb++0tkf/EFycVB/MB3FmD56g/5UUV81Ll8LP2aw==`
51
+ - Archive: `sol-pi-0.1.0-rotom.1.tgz`
52
+ - SHA512 SRI: `sha512-t4h2lPg0ktcA4oyiBwKJur13Noc5pfYUhV5lXkRuoPV3CQ/Bf1oYil8zIgz8rBB5vMrYXUn6zRhDQg+S/VljAw==`
53
53
  - Upstream: <https://github.com/NVlabs/SoL-Pi>, License MIT (original notice in `package/LICENSE`; provenance in `package/UPSTREAM.md`).
54
- - Source: the maintainer's branch `b463fad` (upstream `2b791687` plus five fix/compat commits). `src/` is byte-identical; only package metadata changed.
54
+ - Source: the maintainer's branch `b463fad` (upstream `2b791687` plus five fix/compat commits). `.rotom.0` kept `src/` byte-identical. `.rotom.1` records each returned reducer response as a Pi `usage` entry (`sol_pi_reducer`) through the fork's `pi.appendUsage`, so the footer, session stats and Goal budgets include reducer spend; see `UPSTREAM.md`. The `.rotom.0` archive shipped in rotom 0.1.24 and is removed here.
55
+ - Tests: `.rotom.1` passes upstream's suite plus the new usage tests, 167/167, against the Pi `1.3.0-rotom.2` packages (`.rotom.0`: 166/166 on `1.3.0-rotom.1`). In `packages/rotom-sol-pi/` itself, the 2 `tests/install-guide.test.ts` cases fail because they read the non-imported upstream `AGENTS.md`/`CLAUDE.md`.
55
56
  - `extensions/third-party/sol-pi.ts` supplies rotom's default (Action Fusion, Observation Pack, Evidence-Preserving Reducer on; Online Context Compact off) only when no SoL-Pi config file exists.
56
57
 
57
58
  `pi-context-view@0.7.1` is taken unmodified from the public npm registry and pinned by its registry integrity in `package-lock.json` and `runtime/product-config.mjs`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bingjiang0611/rotom",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "private": false,
5
5
  "description": "Personal coding agent built on Pi, with explicit tools and runtime contracts",
6
6
  "license": "UNLICENSED",
@@ -91,19 +91,19 @@
91
91
  "extensions/third-party/vendor/pi-subagents-0.52.1-rotom.7.tgz",
92
92
  "extensions/third-party/vendor/narumitw-pi-goal-0.54.4-rotom.8.tgz",
93
93
  "extensions/third-party/vendor/injaneity-pi-computer-use-0.5.1-rotom.0.tgz",
94
- "extensions/third-party/vendor/sol-pi-0.1.0-rotom.0.tgz",
94
+ "extensions/third-party/vendor/sol-pi-0.1.0-rotom.1.tgz",
95
95
  "extensions/third-party/node_modules",
96
96
  "skills/pi-subagents/SKILL.md",
97
97
  "runtime/pi/package.json",
98
98
  "runtime/pi/package-lock.json",
99
99
  "runtime/pi/fork-build.json",
100
- "runtime/pi/vendor/earendil-works-pi-telemetry-1.3.0-rotom.1.tgz",
101
- "runtime/pi/vendor/earendil-works-pi-ai-1.3.0-rotom.1.tgz",
102
- "runtime/pi/vendor/earendil-works-pi-tui-1.3.0-rotom.1.tgz",
103
- "runtime/pi/vendor/earendil-works-pi-agent-core-1.3.0-rotom.1.tgz",
104
- "runtime/pi/vendor/earendil-works-pi-coding-agent-1.3.0-rotom.1.tgz",
105
- "runtime/pi/vendor/earendil-works-pi-codemode-1.3.0-rotom.1.tgz",
106
- "runtime/pi/vendor/earendil-works-pi-mcp-1.3.0-rotom.1.tgz",
100
+ "runtime/pi/vendor/earendil-works-pi-telemetry-1.3.0-rotom.2.tgz",
101
+ "runtime/pi/vendor/earendil-works-pi-ai-1.3.0-rotom.2.tgz",
102
+ "runtime/pi/vendor/earendil-works-pi-tui-1.3.0-rotom.2.tgz",
103
+ "runtime/pi/vendor/earendil-works-pi-agent-core-1.3.0-rotom.2.tgz",
104
+ "runtime/pi/vendor/earendil-works-pi-coding-agent-1.3.0-rotom.2.tgz",
105
+ "runtime/pi/vendor/earendil-works-pi-codemode-1.3.0-rotom.2.tgz",
106
+ "runtime/pi/vendor/earendil-works-pi-mcp-1.3.0-rotom.2.tgz",
107
107
  "runtime/pi/node_modules"
108
108
  ]
109
109
  }
@@ -1,44 +1,44 @@
1
1
  {
2
2
  "schema": "rotom-pi-fork/v1",
3
- "version": "1.3.0-rotom.1",
3
+ "version": "1.3.0-rotom.2",
4
4
  "upstreamRevision": "71023aec1546d6d677a65669c5665c0927ce0dd0",
5
- "sourceSha256": "c8e0e18077786b204120386b43e62ebd186adc03d21f31cb9af1e37440ca4d99",
5
+ "sourceSha256": "0cbc3f20d1d7666b7945ebcba3ae377d097f69a1766e5bcc3fdc779e9f6bdc5d",
6
6
  "builderSha256": "acb979e0c9b7e04cac0b0b24a35cca93301400fd4cd936b7b899a4dfb630756e",
7
7
  "artifacts": {
8
8
  "@earendil-works/pi-telemetry": {
9
- "version": "1.3.0-rotom.1",
10
- "file": "vendor/earendil-works-pi-telemetry-1.3.0-rotom.1.tgz",
11
- "integrity": "sha512-CrswxxxtvwyT8qN9KhBJsb3RL3EYru9QTuHIONacvzgNecamZ9P/dMRPzOQmBqwjqp8e+9nukP50HwOVLsLq9w=="
9
+ "version": "1.3.0-rotom.2",
10
+ "file": "vendor/earendil-works-pi-telemetry-1.3.0-rotom.2.tgz",
11
+ "integrity": "sha512-JX+D+lTE5wT1ZwTGIlYhQePxKMbPfctWZ3G9SWXNtcHV0BMKmN9tIW6O3Z5h6FbARDJvq5GgwIkz0P/ctCrDEg=="
12
12
  },
13
13
  "@earendil-works/pi-ai": {
14
- "version": "1.3.0-rotom.1",
15
- "file": "vendor/earendil-works-pi-ai-1.3.0-rotom.1.tgz",
16
- "integrity": "sha512-m1EvueP3mhHsFq8Y/R8txjMExBsX1RlFVq01jQCyrL2+UT+7/OU5G77DaqYXi/NKwykwepUm2rHA1xCNHImrgw=="
14
+ "version": "1.3.0-rotom.2",
15
+ "file": "vendor/earendil-works-pi-ai-1.3.0-rotom.2.tgz",
16
+ "integrity": "sha512-rTZR8o2zh++q1FBqfAOjPgk6eGjjAEAc3ZXS3Id3uTjf/LbyQXeWiu/biDZDtpNw9eBof+z05/mcbfIp3Eethg=="
17
17
  },
18
18
  "@earendil-works/pi-tui": {
19
- "version": "1.3.0-rotom.1",
20
- "file": "vendor/earendil-works-pi-tui-1.3.0-rotom.1.tgz",
21
- "integrity": "sha512-ym9aJhkAFs+u86mM7UxUFNbliBLY9e9B53ne85XMID/oev5+KR+yjtMFXYXhM1HeBTKkllRma3JCtzoSG3nLpA=="
19
+ "version": "1.3.0-rotom.2",
20
+ "file": "vendor/earendil-works-pi-tui-1.3.0-rotom.2.tgz",
21
+ "integrity": "sha512-IDuOXDilIvkRsF4bCx0Q02GK57ohnot6fL1yr70tbA9+TouxmtFBLqW0XeXh0oyZSXmavB8MBSxiVNhlAbiiFw=="
22
22
  },
23
23
  "@earendil-works/pi-agent-core": {
24
- "version": "1.3.0-rotom.1",
25
- "file": "vendor/earendil-works-pi-agent-core-1.3.0-rotom.1.tgz",
26
- "integrity": "sha512-1VQ8p8ckymLvLYeF/lQghR+wH7YICKJW1VS/cmJlyI49ZVY4zNVYeBKbneG+NaMIiNz5IXHPlY3RE9ezE4yZ4Q=="
24
+ "version": "1.3.0-rotom.2",
25
+ "file": "vendor/earendil-works-pi-agent-core-1.3.0-rotom.2.tgz",
26
+ "integrity": "sha512-biXnah8jKEs+h75t9Vdl2f71He33mTUAtc846XFg+Ym2uDfBkqoTf9xpQ1NPHMAkS4C/hkO7aOsKY6jQnh+YQw=="
27
27
  },
28
28
  "@earendil-works/pi-codemode": {
29
- "version": "1.3.0-rotom.1",
30
- "file": "vendor/earendil-works-pi-codemode-1.3.0-rotom.1.tgz",
31
- "integrity": "sha512-AjkqOlp9EQnRKs8PSPhn6vNc/Fu7BVC8WfyBKp6/iVLrTYnv+vB2e7JIyOlrh2yXBo6xKyoJ0c0AmXWgxPPIqw=="
29
+ "version": "1.3.0-rotom.2",
30
+ "file": "vendor/earendil-works-pi-codemode-1.3.0-rotom.2.tgz",
31
+ "integrity": "sha512-RK2HCSJDciiq+d1wI3wcUEfOtbgHGgQdNBr2Rb6fu7fgo1AMlYVLEB9Usza+yEojQZo1qy+4Q9cntcIhoelliA=="
32
32
  },
33
33
  "@earendil-works/pi-mcp": {
34
- "version": "1.3.0-rotom.1",
35
- "file": "vendor/earendil-works-pi-mcp-1.3.0-rotom.1.tgz",
36
- "integrity": "sha512-7Xwv4EDERBU2BBHkNzqWibxoaDwUXTiu06x10w8ImJG7L89eGuwfouTXQZ7/mX9fIQT5HkGp+/MiU8j5Cxlwng=="
34
+ "version": "1.3.0-rotom.2",
35
+ "file": "vendor/earendil-works-pi-mcp-1.3.0-rotom.2.tgz",
36
+ "integrity": "sha512-PRp1ldn50YH9oewJX/ouxzKScTvpwXkrzn/B2jGvSRuTwNM0z6FifonB3l8YZxR+k17EdO9hG77LQ9cUTpU3FA=="
37
37
  },
38
38
  "@earendil-works/pi-coding-agent": {
39
- "version": "1.3.0-rotom.1",
40
- "file": "vendor/earendil-works-pi-coding-agent-1.3.0-rotom.1.tgz",
41
- "integrity": "sha512-CtXA6EgoJWbvBKsbKsgGpM25S5sPpfSsnqR40upX9/Lf/J5vFOhIBs4St6sS2XYwaQn0po392zx2ez3+mWnmnw=="
39
+ "version": "1.3.0-rotom.2",
40
+ "file": "vendor/earendil-works-pi-coding-agent-1.3.0-rotom.2.tgz",
41
+ "integrity": "sha512-exOT4pJFc3E++aNApXsPVJT0XPJ8xotpb4XgtJnVZt+rpCfq+PSucqP7//AFQTcjFgYAaOWPmx8vx3ybNBy1qQ=="
42
42
  }
43
43
  }
44
44
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rotom-pi-runtime",
3
- "version": "1.3.0-rotom.1",
3
+ "version": "1.3.0-rotom.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
@@ -376,12 +376,12 @@
376
376
  }
377
377
  },
378
378
  "node_modules/@earendil-works/pi-agent-core": {
379
- "version": "1.3.0-rotom.1",
380
- "resolved": "file:vendor/earendil-works-pi-agent-core-1.3.0-rotom.1.tgz",
381
- "integrity": "sha512-1VQ8p8ckymLvLYeF/lQghR+wH7YICKJW1VS/cmJlyI49ZVY4zNVYeBKbneG+NaMIiNz5IXHPlY3RE9ezE4yZ4Q==",
379
+ "version": "1.3.0-rotom.2",
380
+ "resolved": "file:vendor/earendil-works-pi-agent-core-1.3.0-rotom.2.tgz",
381
+ "integrity": "sha512-biXnah8jKEs+h75t9Vdl2f71He33mTUAtc846XFg+Ym2uDfBkqoTf9xpQ1NPHMAkS4C/hkO7aOsKY6jQnh+YQw==",
382
382
  "license": "MIT",
383
383
  "dependencies": {
384
- "@earendil-works/pi-ai": "1.3.0-rotom.1",
384
+ "@earendil-works/pi-ai": "1.3.0-rotom.2",
385
385
  "typebox": "1.3.27"
386
386
  },
387
387
  "engines": {
@@ -389,14 +389,14 @@
389
389
  }
390
390
  },
391
391
  "node_modules/@earendil-works/pi-ai": {
392
- "version": "1.3.0-rotom.1",
393
- "resolved": "file:vendor/earendil-works-pi-ai-1.3.0-rotom.1.tgz",
394
- "integrity": "sha512-m1EvueP3mhHsFq8Y/R8txjMExBsX1RlFVq01jQCyrL2+UT+7/OU5G77DaqYXi/NKwykwepUm2rHA1xCNHImrgw==",
392
+ "version": "1.3.0-rotom.2",
393
+ "resolved": "file:vendor/earendil-works-pi-ai-1.3.0-rotom.2.tgz",
394
+ "integrity": "sha512-rTZR8o2zh++q1FBqfAOjPgk6eGjjAEAc3ZXS3Id3uTjf/LbyQXeWiu/biDZDtpNw9eBof+z05/mcbfIp3Eethg==",
395
395
  "license": "MIT",
396
396
  "dependencies": {
397
397
  "@anthropic-ai/sdk": "0.129.0",
398
398
  "@aws-sdk/client-bedrock-runtime": "3.1127.0",
399
- "@earendil-works/pi-telemetry": "1.3.0-rotom.1",
399
+ "@earendil-works/pi-telemetry": "1.3.0-rotom.2",
400
400
  "@google/genai": "2.21.0",
401
401
  "@smithy/node-http-handler": "4.12.1",
402
402
  "http-proxy-agent": "9.1.0",
@@ -436,9 +436,9 @@
436
436
  }
437
437
  },
438
438
  "node_modules/@earendil-works/pi-codemode": {
439
- "version": "1.3.0-rotom.1",
440
- "resolved": "file:vendor/earendil-works-pi-codemode-1.3.0-rotom.1.tgz",
441
- "integrity": "sha512-AjkqOlp9EQnRKs8PSPhn6vNc/Fu7BVC8WfyBKp6/iVLrTYnv+vB2e7JIyOlrh2yXBo6xKyoJ0c0AmXWgxPPIqw==",
439
+ "version": "1.3.0-rotom.2",
440
+ "resolved": "file:vendor/earendil-works-pi-codemode-1.3.0-rotom.2.tgz",
441
+ "integrity": "sha512-RK2HCSJDciiq+d1wI3wcUEfOtbgHGgQdNBr2Rb6fu7fgo1AMlYVLEB9Usza+yEojQZo1qy+4Q9cntcIhoelliA==",
442
442
  "license": "MIT",
443
443
  "dependencies": {
444
444
  "quickjs-wasi": "3.6.2"
@@ -448,16 +448,16 @@
448
448
  }
449
449
  },
450
450
  "node_modules/@earendil-works/pi-coding-agent": {
451
- "version": "1.3.0-rotom.1",
452
- "resolved": "file:vendor/earendil-works-pi-coding-agent-1.3.0-rotom.1.tgz",
453
- "integrity": "sha512-CtXA6EgoJWbvBKsbKsgGpM25S5sPpfSsnqR40upX9/Lf/J5vFOhIBs4St6sS2XYwaQn0po392zx2ez3+mWnmnw==",
451
+ "version": "1.3.0-rotom.2",
452
+ "resolved": "file:vendor/earendil-works-pi-coding-agent-1.3.0-rotom.2.tgz",
453
+ "integrity": "sha512-exOT4pJFc3E++aNApXsPVJT0XPJ8xotpb4XgtJnVZt+rpCfq+PSucqP7//AFQTcjFgYAaOWPmx8vx3ybNBy1qQ==",
454
454
  "license": "MIT",
455
455
  "dependencies": {
456
- "@earendil-works/pi-agent-core": "1.3.0-rotom.1",
457
- "@earendil-works/pi-ai": "1.3.0-rotom.1",
458
- "@earendil-works/pi-codemode": "1.3.0-rotom.1",
459
- "@earendil-works/pi-mcp": "1.3.0-rotom.1",
460
- "@earendil-works/pi-tui": "1.3.0-rotom.1",
456
+ "@earendil-works/pi-agent-core": "1.3.0-rotom.2",
457
+ "@earendil-works/pi-ai": "1.3.0-rotom.2",
458
+ "@earendil-works/pi-codemode": "1.3.0-rotom.2",
459
+ "@earendil-works/pi-mcp": "1.3.0-rotom.2",
460
+ "@earendil-works/pi-tui": "1.3.0-rotom.2",
461
461
  "@silvia-odwyer/photon-node": "0.3.4",
462
462
  "brace-expansion": "5.0.12",
463
463
  "chalk": "6.0.0",
@@ -484,9 +484,9 @@
484
484
  }
485
485
  },
486
486
  "node_modules/@earendil-works/pi-mcp": {
487
- "version": "1.3.0-rotom.1",
488
- "resolved": "file:vendor/earendil-works-pi-mcp-1.3.0-rotom.1.tgz",
489
- "integrity": "sha512-7Xwv4EDERBU2BBHkNzqWibxoaDwUXTiu06x10w8ImJG7L89eGuwfouTXQZ7/mX9fIQT5HkGp+/MiU8j5Cxlwng==",
487
+ "version": "1.3.0-rotom.2",
488
+ "resolved": "file:vendor/earendil-works-pi-mcp-1.3.0-rotom.2.tgz",
489
+ "integrity": "sha512-PRp1ldn50YH9oewJX/ouxzKScTvpwXkrzn/B2jGvSRuTwNM0z6FifonB3l8YZxR+k17EdO9hG77LQ9cUTpU3FA==",
490
490
  "license": "MIT",
491
491
  "dependencies": {
492
492
  "cross-spawn": "7.0.6"
@@ -496,18 +496,18 @@
496
496
  }
497
497
  },
498
498
  "node_modules/@earendil-works/pi-telemetry": {
499
- "version": "1.3.0-rotom.1",
500
- "resolved": "file:vendor/earendil-works-pi-telemetry-1.3.0-rotom.1.tgz",
501
- "integrity": "sha512-CrswxxxtvwyT8qN9KhBJsb3RL3EYru9QTuHIONacvzgNecamZ9P/dMRPzOQmBqwjqp8e+9nukP50HwOVLsLq9w==",
499
+ "version": "1.3.0-rotom.2",
500
+ "resolved": "file:vendor/earendil-works-pi-telemetry-1.3.0-rotom.2.tgz",
501
+ "integrity": "sha512-JX+D+lTE5wT1ZwTGIlYhQePxKMbPfctWZ3G9SWXNtcHV0BMKmN9tIW6O3Z5h6FbARDJvq5GgwIkz0P/ctCrDEg==",
502
502
  "license": "MIT",
503
503
  "engines": {
504
504
  "node": ">=22.19.0"
505
505
  }
506
506
  },
507
507
  "node_modules/@earendil-works/pi-tui": {
508
- "version": "1.3.0-rotom.1",
509
- "resolved": "file:vendor/earendil-works-pi-tui-1.3.0-rotom.1.tgz",
510
- "integrity": "sha512-ym9aJhkAFs+u86mM7UxUFNbliBLY9e9B53ne85XMID/oev5+KR+yjtMFXYXhM1HeBTKkllRma3JCtzoSG3nLpA==",
508
+ "version": "1.3.0-rotom.2",
509
+ "resolved": "file:vendor/earendil-works-pi-tui-1.3.0-rotom.2.tgz",
510
+ "integrity": "sha512-IDuOXDilIvkRsF4bCx0Q02GK57ohnot6fL1yr70tbA9+TouxmtFBLqW0XeXh0oyZSXmavB8MBSxiVNhlAbiiFw==",
511
511
  "license": "MIT",
512
512
  "dependencies": {
513
513
  "get-east-asian-width": "1.6.0",
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,KAAK,gBAAgB,EACrB,WAAW,EASX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,eAAe,EAEf,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AA6hBD,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC;AAEtF,KAAK,cAAc,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAiHpF,uCAAuC;AACvC,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACxD,uCAAuC;IACvC,KAAK,EAAE,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,+DAA+D;IAC/D,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,wDAAwD;IACxD,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAQrH"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,KAAK,gBAAgB,EACrB,WAAW,EASX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,eAAe,EAEf,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAojBD,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC;AAEtF,KAAK,cAAc,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAiHpF,uCAAuC;AACvC,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACxD,uCAAuC;IACvC,KAAK,EAAE,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,+DAA+D;IAC/D,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,wDAAwD;IACxD,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAQrH"}
@@ -182,13 +182,6 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
182
182
  await emit({ type: "agent_end", messages: newMessages });
183
183
  return;
184
184
  }
185
- // A turn-end listener may abort to stop before the next provider request
186
- // (for example, to compact at a completed tool boundary). Do not dispatch
187
- // another request with a signal that is already aborted.
188
- if (signal?.aborted) {
189
- await emit({ type: "agent_end", messages: newMessages });
190
- return;
191
- }
192
185
  explicitContinuation = decision?.action === "continue";
193
186
  pendingMessages = (await config.getSteeringMessages?.()) || [];
194
187
  if (hasMoreToolCalls || pendingMessages.length > 0) {
@@ -265,6 +258,36 @@ function withToolChanges(message, { toolsAdded, toolsRemoved }) {
265
258
  * This is where AgentMessage[] gets transformed to Message[] for the LLM.
266
259
  */
267
260
  async function streamAssistantResponse(context, config, signal, emit, streamFunction) {
261
+ // rotom: never dispatch a provider request (or resolve an API key, which may
262
+ // refresh OAuth) with a signal that is already aborted, for example after an
263
+ // abort during tool execution or from a turn-end listener. Settle the turn with
264
+ // the aborted message a provider would return, so the transcript still ends in
265
+ // an aborted assistant message that consumers (UI, Goal) treat as an interruption.
266
+ if (signal?.aborted) {
267
+ const aborted = {
268
+ role: "assistant",
269
+ content: [],
270
+ api: config.model.api,
271
+ provider: config.model.provider,
272
+ model: config.model.id,
273
+ usage: {
274
+ input: 0,
275
+ output: 0,
276
+ cacheRead: 0,
277
+ cacheWrite: 0,
278
+ totalTokens: 0,
279
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
280
+ },
281
+ stopReason: "aborted",
282
+ errorMessage: "Request was aborted",
283
+ timestamp: Date.now(),
284
+ thinkingLevel: config.reasoning ?? "off",
285
+ };
286
+ context.messages.push(aborted);
287
+ await emit({ type: "message_start", message: { ...aborted } });
288
+ await emit({ type: "message_end", message: aborted });
289
+ return aborted;
290
+ }
268
291
  // Apply context transform if configured (AgentMessage[] → AgentMessage[])
269
292
  let messages = context.messages;
270
293
  if (config.transformContext) {