@code-yeongyu/senpi 2026.8.28-2 → 2026.8.29
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/CHANGELOG.md +12 -0
- package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.js +2 -2
- package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +34 -2
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +1 -0
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +6 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"favorite-models-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/favorite-models-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAkB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAEd,KAAK,
|
|
1
|
+
{"version":3,"file":"favorite-models-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/favorite-models-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAkB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAEd,KAAK,EAML,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAEN,KAAK,gBAAgB,EAOrB,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACvC,yFAAyF;IACzF,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,sEAAsE;IACtE,SAAS,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,SAAU,YAAW,SAAS;IAClF,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAA0B;IAC7C,kGAAkG;IAClG,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAa;IAGlC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IACD,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,mBAAmB,CAAO;IAClC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,uBAAuB;IAmD5E,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,OAAO;IAmBf,gGAAgG;IAChG,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IA4ClB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmI/B,cAAc,IAAI,KAAK;CAGvB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { modelsAreEqual } from "@earendil-works/pi-ai";
|
|
2
|
-
import { Container, getKeybindings, Input, Key, matchesKey, Spacer, Text, } from "@earendil-works/pi-tui";
|
|
2
|
+
import { Container, getKeybindings, Input, Key, matchesKey, Spacer, Text, TruncatedText, } from "@earendil-works/pi-tui";
|
|
3
3
|
import { rankModelSearchItems } from "../model-search-rank.js";
|
|
4
4
|
import { theme } from "../theme/theme.js";
|
|
5
5
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
@@ -146,7 +146,7 @@ export class FavoriteModelsSelectorComponent extends Container {
|
|
|
146
146
|
const modelText = isSelected ? theme.fg("accent", item.model.id) : item.model.id;
|
|
147
147
|
const providerBadge = theme.fg("muted", ` [${item.model.provider}]`);
|
|
148
148
|
const currentMarker = this.currentModel && modelsAreEqual(this.currentModel, item.model) ? theme.fg("success", " ✓") : "";
|
|
149
|
-
this.listContainer.addChild(new
|
|
149
|
+
this.listContainer.addChild(new TruncatedText(`${prefix}${favoriteMarker} ${modelText}${providerBadge}${currentMarker}`));
|
|
150
150
|
}
|
|
151
151
|
// Add scroll indicator if needed
|
|
152
152
|
if (startIndex > 0 || endIndex < this.filteredItems.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"favorite-models-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/favorite-models-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACN,SAAS,EAET,cAAc,EACd,KAAK,EACL,GAAG,EACH,UAAU,EACV,MAAM,EACN,IAAI,GACJ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EACN,mBAAmB,EAEnB,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAuB9B;;;GAGG;AACH,MAAM,OAAO,+BAAgC,SAAQ,SAAS;IAa7D,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAClC,CAAC;IAQD,YAAY,MAA4B,EAAE,SAAkC;QAC3E,KAAK,EAAE,CAAC;QA3BD,eAAU,GAA4B,IAAI,GAAG,EAAE,CAAC;QAChD,WAAM,GAAa,EAAE,CAAC;QACtB,gBAAW,GAAqB,IAAI,CAAC;QAC7C,kGAAkG;QAC1F,eAAU,GAAa,EAAE,CAAC;QAC1B,kBAAa,GAAgB,EAAE,CAAC;QAChC,kBAAa,GAAG,CAAC,CAAC;QAI1B,iFAAiF;QACzE,aAAQ,GAAG,KAAK,CAAC;QAYjB,eAAU,GAAG,CAAC,CAAC;QACf,YAAO,GAAG,KAAK,CAAC;QAIvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAExC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,GAAG,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,SAAS;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CACP,KAAK,CAAC,EAAE,CACP,OAAO,EACP,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,OAAO,CAAC,2BAA2B,CAAC,sBAAsB,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAC1I,EACD,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,eAAe;QACf,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,iBAAiB;QACjB,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElC,cAAc;QACd,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU;QACjB,iFAAiF;QACjF,oFAAoF;QACpF,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,KAAK,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,EAAE;gBACV,KAAK;gBACL,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;aAC/C,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,aAAa;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;QAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC;QACrG,MAAM,KAAK,GAAG;YACb,GAAG,OAAO,CAAC,oBAAoB,CAAC,SAAS;YACzC,GAAG,OAAO,CAAC,2BAA2B,CAAC,WAAW;YAClD,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO;YACpC,SAAS;SACT,CAAC;QACF,OAAO,IAAI,CAAC,OAAO;YAClB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC7E,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEO,sBAAsB;QAC7B,MAAM,KAAK,GAAG;YACb,GAAG,OAAO,CAAC,sBAAsB,CAAC,MAAM;YACxC,GAAG,OAAO,CAAC,qBAAqB,CAAC,QAAQ;YACzC,GAAG,OAAO,CAAC,2BAA2B,CAAC,WAAW;YAClD,GAAG,OAAO,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,wBAAwB,CAAC,QAAQ;SAC/E,CAAC;QACF,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,OAAO,CAAC,mBAA4B;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,mBAAmB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QACzF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,sGAAsG;QACtG,IAAI,CAAC,aAAa,GAAG,oBAAoB,CACxC,KAAK,EACL,KAAK,EACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAC3E,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAClD,CAAC;QACF,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,IAAI,CAAC,aAAa;YACjB,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gGAAgG;IACxF,cAAc,CAAC,OAAe,EAAE,QAAgB;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC;YAAE,OAAO;QAC9C,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG;YAC7D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;SAC3B,CAAC;IACH,CAAC;IAEO,YAAY;QACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC;IAEO,UAAU;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvF,OAAO;QACR,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAC3G,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACnF,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrE,MAAM,aAAa,GAClB,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC1B,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,cAAc,IAAI,SAAS,GAAG,aAAa,GAAG,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CACzF,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC5D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC/F,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxG,CAAC;QACF,CAAC;IACF,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;QAE5B,aAAa;QACb,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QAED,0BAA0B;QAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QAC/D,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;gBAAE,OAAO;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC;gBACtC,6BAA6B;gBAC7B,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;oBACzD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC/C,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC3E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;oBAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrB,CAAC;YACF,CAAC;YACD,OAAO;QACR,CAAC;QAED,kBAAkB;QAClB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACR,CAAC;QAED,gDAAgD;QAChD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,CAAC;YACD,OAAO;QACR,CAAC;QAED,0DAA0D;QAC1D,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpG,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC5E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,uDAAuD;QACvD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpG,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,kCAAkC;QAClC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,IAAI,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACrC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBAC/F,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrF,IAAI,CAAC,WAAW,GAAG,WAAW;oBAC7B,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;oBACjE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC9D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,CAAC;YACD,OAAO;QACR,CAAC;QAED,2BAA2B;QAC3B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACnF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YAC9C,OAAO;QACR,CAAC;QAED,2CAA2C;QAC3C,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC;YACD,OAAO;QACR,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO;QACR,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,cAAc;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD","sourcesContent":["import { type Model, modelsAreEqual } from \"@earendil-works/pi-ai\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n} from \"@earendil-works/pi-tui\";\nimport { rankModelSearchItems } from \"../model-search-rank.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\nimport {\n\tclearFavoriteModels,\n\ttype FavoriteModelIds,\n\tfavoriteModels,\n\tgetModelFullId,\n\tgetSortedFavoriteModelIds,\n\tisFavoriteModel,\n\tmoveFavoriteModel,\n\ttoggleFavoriteModel,\n} from \"./model-favorites.ts\";\n\ninterface ModelItem {\n\tfullId: string;\n\tmodel: Model<any>;\n\tfavorite: boolean;\n}\n\nexport interface FavoriteModelsConfig {\n\tallModels: Model<any>[];\n\tfavoriteModelIds: FavoriteModelIds;\n\tcurrentModel?: Model<any>;\n}\n\nexport interface FavoriteModelsCallbacks {\n\t/** Called whenever the favorite model set or order changes (session-only, no persist) */\n\tonChange: (favoriteModelIds: FavoriteModelIds) => void | Promise<void>;\n\t/** Called when user wants to persist current selection to settings */\n\tonPersist: (favoriteModelIds: FavoriteModelIds) => void | Promise<void>;\n\tonSelect: (model: Model<any>) => void | Promise<void>;\n\tonCancel: () => void;\n}\n\n/**\n * Component for managing favorite models for Ctrl+P cycling.\n * Changes are session-only until explicitly persisted with Ctrl+S.\n */\nexport class FavoriteModelsSelectorComponent extends Container implements Focusable {\n\tprivate modelsById: Map<string, Model<any>> = new Map();\n\tprivate allIds: string[] = [];\n\tprivate favoriteIds: FavoriteModelIds = null;\n\t/** Row order frozen at construction; membership toggles never move rows, only reorder keys do. */\n\tprivate displayIds: string[] = [];\n\tprivate filteredItems: ModelItem[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\tprivate currentModel?: Model<any>;\n\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\tprivate listContainer: Container;\n\tprivate footerText: Text;\n\tprivate secondaryFooterText: Text;\n\tprivate callbacks: FavoriteModelsCallbacks;\n\tprivate maxVisible = 8;\n\tprivate isDirty = false;\n\n\tconstructor(config: FavoriteModelsConfig, callbacks: FavoriteModelsCallbacks) {\n\t\tsuper();\n\t\tthis.callbacks = callbacks;\n\t\tthis.currentModel = config.currentModel;\n\n\t\tfor (const model of config.allModels) {\n\t\t\tconst fullId = getModelFullId(model);\n\t\t\tthis.modelsById.set(fullId, model);\n\t\t\tthis.allIds.push(fullId);\n\t\t}\n\n\t\tthis.favoriteIds = config.favoriteModelIds === null ? null : [...config.favoriteModelIds];\n\t\tthis.displayIds = getSortedFavoriteModelIds(this.favoriteIds, this.allIds);\n\t\tthis.filteredItems = this.buildItems();\n\n\t\t// Header\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Favorite Models\")), 0, 0));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\t`${keyText(\"tui.select.confirm\")} selects. ${keyText(\"app.models.toggleFavorite\")} toggles favorite. ${keyText(\"app.models.save\")} saves.`,\n\t\t\t\t),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Search input\n\t\tthis.searchInput = new Input();\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\t// Footer hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.footerText = new Text(this.getFooterText(), 0, 0);\n\t\tthis.addChild(this.footerText);\n\t\tthis.secondaryFooterText = new Text(this.getSecondaryFooterText(), 0, 0);\n\t\tthis.addChild(this.secondaryFooterText);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate buildItems(): ModelItem[] {\n\t\t// Filter out IDs that no longer have a corresponding model (e.g., after logout).\n\t\t// Iterates the frozen displayIds snapshot; the favorite flag reads live membership.\n\t\tconst items: ModelItem[] = [];\n\t\tfor (const id of this.displayIds) {\n\t\t\tconst model = this.modelsById.get(id);\n\t\t\tif (!model) continue;\n\t\t\titems.push({\n\t\t\t\tfullId: id,\n\t\t\t\tmodel,\n\t\t\t\tfavorite: isFavoriteModel(this.favoriteIds, id),\n\t\t\t});\n\t\t}\n\t\treturn items;\n\t}\n\n\tprivate getFooterText(): string {\n\t\tconst favoriteCount = this.favoriteIds?.length ?? this.allIds.length;\n\t\tconst allFavorite = this.favoriteIds === null;\n\t\tconst countText = allFavorite ? \"all favorites\" : `${favoriteCount}/${this.allIds.length} favorites`;\n\t\tconst parts = [\n\t\t\t`${keyText(\"tui.select.confirm\")} select`,\n\t\t\t`${keyText(\"app.models.toggleFavorite\")} favorite`,\n\t\t\t`${keyText(\"app.models.save\")} save`,\n\t\t\tcountText,\n\t\t];\n\t\treturn this.isDirty\n\t\t\t? theme.fg(\"dim\", ` ${parts.join(\" · \")} `) + theme.fg(\"warning\", \"unsaved\")\n\t\t\t: theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate getSecondaryFooterText(): string {\n\t\tconst parts = [\n\t\t\t`${keyText(\"app.models.enableAll\")} all`,\n\t\t\t`${keyText(\"app.models.clearAll\")} clear`,\n\t\t\t`${keyText(\"app.models.toggleProvider\")} provider`,\n\t\t\t`${keyText(\"app.models.reorderUp\")}/${keyText(\"app.models.reorderDown\")} order`,\n\t\t];\n\t\treturn theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate refresh(preferredSelectedId?: string): void {\n\t\tconst query = this.searchInput.getValue();\n\t\tconst selectedId = preferredSelectedId ?? this.filteredItems[this.selectedIndex]?.fullId;\n\t\tconst items = this.buildItems();\n\t\t// Management surface: relevance ranking without a favorites partition (empty query keeps base order).\n\t\tthis.filteredItems = rankModelSearchItems(\n\t\t\titems,\n\t\t\tquery,\n\t\t\t(i) => ({ id: i.model.id, provider: i.model.provider, name: i.model.name }),\n\t\t\t{ favoritesFirst: false, isFavorite: () => false },\n\t\t);\n\t\tconst selectedIndex = selectedId ? this.filteredItems.findIndex((item) => item.fullId === selectedId) : -1;\n\t\tthis.selectedIndex =\n\t\t\tselectedIndex >= 0 ? selectedIndex : Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));\n\t\tthis.updateList();\n\t\tthis.footerText.setText(this.getFooterText());\n\t\tthis.secondaryFooterText.setText(this.getSecondaryFooterText());\n\t}\n\n\t/** Mirror a favoriteIds reorder swap onto the frozen display order so the row visibly moves. */\n\tprivate swapDisplayIds(firstId: string, secondId: string): void {\n\t\tconst firstIndex = this.displayIds.indexOf(firstId);\n\t\tconst secondIndex = this.displayIds.indexOf(secondId);\n\t\tif (firstIndex < 0 || secondIndex < 0) return;\n\t\t[this.displayIds[firstIndex], this.displayIds[secondIndex]] = [\n\t\t\tthis.displayIds[secondIndex],\n\t\t\tthis.displayIds[firstIndex],\n\t\t];\n\t}\n\n\tprivate notifyChange(): void {\n\t\tthis.callbacks.onChange(this.favoriteIds === null ? null : [...this.favoriteIds]);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredItems[i];\n\t\t\tif (!item) continue;\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst favoriteMarker = item.favorite ? theme.fg(\"success\", \"*\") : theme.fg(\"dim\", \"-\");\n\t\t\tconst modelText = isSelected ? theme.fg(\"accent\", item.model.id) : item.model.id;\n\t\t\tconst providerBadge = theme.fg(\"muted\", ` [${item.model.provider}]`);\n\t\t\tconst currentMarker =\n\t\t\t\tthis.currentModel && modelsAreEqual(this.currentModel, item.model) ? theme.fg(\"success\", \" ✓\") : \"\";\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(`${prefix}${favoriteMarker} ${modelText}${providerBadge}${currentMarker}`, 0, 0),\n\t\t\t);\n\t\t}\n\n\t\t// Add scroll indicator if needed\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredItems.length > 0) {\n\t\t\tconst selected = this.filteredItems[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", ` Model Name: ${selected.model.name}`), 0, 0));\n\t\t\t}\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Navigation\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\n\t\t// Reorder favorite models\n\t\tconst reorderUp = kb.matches(data, \"app.models.reorderUp\");\n\t\tconst reorderDown = kb.matches(data, \"app.models.reorderDown\");\n\t\tif (reorderUp || reorderDown) {\n\t\t\tif (this.favoriteIds === null) return;\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item && isFavoriteModel(this.favoriteIds, item.fullId)) {\n\t\t\t\tconst delta = reorderUp ? -1 : 1;\n\t\t\t\tconst currentIndex = this.favoriteIds.indexOf(item.fullId);\n\t\t\t\tconst newIndex = currentIndex + delta;\n\t\t\t\t// Only move if within bounds\n\t\t\t\tif (newIndex >= 0 && newIndex < this.favoriteIds.length) {\n\t\t\t\t\tconst displacedId = this.favoriteIds[newIndex];\n\t\t\t\t\tthis.favoriteIds = moveFavoriteModel(this.favoriteIds, item.fullId, delta);\n\t\t\t\t\tthis.swapDisplayIds(item.fullId, displacedId);\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.selectedIndex += delta;\n\t\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Select on Enter\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.callbacks.onSelect(item.model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle favorite status for the selected model\n\t\tif (kb.matches(data, \"app.models.toggleFavorite\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.favoriteIds = toggleFavoriteModel(this.favoriteIds, this.allIds, item.fullId);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Favorite all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.enableAll\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.favoriteIds = favoriteModels(this.favoriteIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh(item?.fullId);\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.clearAll\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.favoriteIds = clearFavoriteModels(this.favoriteIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh(item?.fullId);\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle provider of current item\n\t\tif (kb.matches(data, \"app.models.toggleProvider\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst provider = item.model.provider;\n\t\t\t\tconst providerIds = this.allIds.filter((id) => this.modelsById.get(id)?.provider === provider);\n\t\t\t\tconst allFavorite = providerIds.every((id) => isFavoriteModel(this.favoriteIds, id));\n\t\t\t\tthis.favoriteIds = allFavorite\n\t\t\t\t\t? clearFavoriteModels(this.favoriteIds, this.allIds, providerIds)\n\t\t\t\t\t: favoriteModels(this.favoriteIds, this.allIds, providerIds);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Save/persist to settings\n\t\tif (kb.matches(data, \"app.models.save\")) {\n\t\t\tthis.callbacks.onPersist(this.favoriteIds === null ? null : [...this.favoriteIds]);\n\t\t\tthis.isDirty = false;\n\t\t\tthis.footerText.setText(this.getFooterText());\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+C - clear search or cancel if empty\n\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tif (this.searchInput.getValue()) {\n\t\t\t\tthis.searchInput.setValue(\"\");\n\t\t\t\tthis.refresh();\n\t\t\t} else {\n\t\t\t\tthis.callbacks.onCancel();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Escape - cancel\n\t\tif (matchesKey(data, Key.escape)) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass everything else to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.refresh();\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"favorite-models-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/favorite-models-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Model, modelsAreEqual } from \"@earendil-works/pi-ai\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n\tTruncatedText,\n} from \"@earendil-works/pi-tui\";\nimport { rankModelSearchItems } from \"../model-search-rank.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\nimport {\n\tclearFavoriteModels,\n\ttype FavoriteModelIds,\n\tfavoriteModels,\n\tgetModelFullId,\n\tgetSortedFavoriteModelIds,\n\tisFavoriteModel,\n\tmoveFavoriteModel,\n\ttoggleFavoriteModel,\n} from \"./model-favorites.ts\";\n\ninterface ModelItem {\n\tfullId: string;\n\tmodel: Model<any>;\n\tfavorite: boolean;\n}\n\nexport interface FavoriteModelsConfig {\n\tallModels: Model<any>[];\n\tfavoriteModelIds: FavoriteModelIds;\n\tcurrentModel?: Model<any>;\n}\n\nexport interface FavoriteModelsCallbacks {\n\t/** Called whenever the favorite model set or order changes (session-only, no persist) */\n\tonChange: (favoriteModelIds: FavoriteModelIds) => void | Promise<void>;\n\t/** Called when user wants to persist current selection to settings */\n\tonPersist: (favoriteModelIds: FavoriteModelIds) => void | Promise<void>;\n\tonSelect: (model: Model<any>) => void | Promise<void>;\n\tonCancel: () => void;\n}\n\n/**\n * Component for managing favorite models for Ctrl+P cycling.\n * Changes are session-only until explicitly persisted with Ctrl+S.\n */\nexport class FavoriteModelsSelectorComponent extends Container implements Focusable {\n\tprivate modelsById: Map<string, Model<any>> = new Map();\n\tprivate allIds: string[] = [];\n\tprivate favoriteIds: FavoriteModelIds = null;\n\t/** Row order frozen at construction; membership toggles never move rows, only reorder keys do. */\n\tprivate displayIds: string[] = [];\n\tprivate filteredItems: ModelItem[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\tprivate currentModel?: Model<any>;\n\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\tprivate listContainer: Container;\n\tprivate footerText: Text;\n\tprivate secondaryFooterText: Text;\n\tprivate callbacks: FavoriteModelsCallbacks;\n\tprivate maxVisible = 8;\n\tprivate isDirty = false;\n\n\tconstructor(config: FavoriteModelsConfig, callbacks: FavoriteModelsCallbacks) {\n\t\tsuper();\n\t\tthis.callbacks = callbacks;\n\t\tthis.currentModel = config.currentModel;\n\n\t\tfor (const model of config.allModels) {\n\t\t\tconst fullId = getModelFullId(model);\n\t\t\tthis.modelsById.set(fullId, model);\n\t\t\tthis.allIds.push(fullId);\n\t\t}\n\n\t\tthis.favoriteIds = config.favoriteModelIds === null ? null : [...config.favoriteModelIds];\n\t\tthis.displayIds = getSortedFavoriteModelIds(this.favoriteIds, this.allIds);\n\t\tthis.filteredItems = this.buildItems();\n\n\t\t// Header\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Favorite Models\")), 0, 0));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\t`${keyText(\"tui.select.confirm\")} selects. ${keyText(\"app.models.toggleFavorite\")} toggles favorite. ${keyText(\"app.models.save\")} saves.`,\n\t\t\t\t),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Search input\n\t\tthis.searchInput = new Input();\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\t// Footer hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.footerText = new Text(this.getFooterText(), 0, 0);\n\t\tthis.addChild(this.footerText);\n\t\tthis.secondaryFooterText = new Text(this.getSecondaryFooterText(), 0, 0);\n\t\tthis.addChild(this.secondaryFooterText);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate buildItems(): ModelItem[] {\n\t\t// Filter out IDs that no longer have a corresponding model (e.g., after logout).\n\t\t// Iterates the frozen displayIds snapshot; the favorite flag reads live membership.\n\t\tconst items: ModelItem[] = [];\n\t\tfor (const id of this.displayIds) {\n\t\t\tconst model = this.modelsById.get(id);\n\t\t\tif (!model) continue;\n\t\t\titems.push({\n\t\t\t\tfullId: id,\n\t\t\t\tmodel,\n\t\t\t\tfavorite: isFavoriteModel(this.favoriteIds, id),\n\t\t\t});\n\t\t}\n\t\treturn items;\n\t}\n\n\tprivate getFooterText(): string {\n\t\tconst favoriteCount = this.favoriteIds?.length ?? this.allIds.length;\n\t\tconst allFavorite = this.favoriteIds === null;\n\t\tconst countText = allFavorite ? \"all favorites\" : `${favoriteCount}/${this.allIds.length} favorites`;\n\t\tconst parts = [\n\t\t\t`${keyText(\"tui.select.confirm\")} select`,\n\t\t\t`${keyText(\"app.models.toggleFavorite\")} favorite`,\n\t\t\t`${keyText(\"app.models.save\")} save`,\n\t\t\tcountText,\n\t\t];\n\t\treturn this.isDirty\n\t\t\t? theme.fg(\"dim\", ` ${parts.join(\" · \")} `) + theme.fg(\"warning\", \"unsaved\")\n\t\t\t: theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate getSecondaryFooterText(): string {\n\t\tconst parts = [\n\t\t\t`${keyText(\"app.models.enableAll\")} all`,\n\t\t\t`${keyText(\"app.models.clearAll\")} clear`,\n\t\t\t`${keyText(\"app.models.toggleProvider\")} provider`,\n\t\t\t`${keyText(\"app.models.reorderUp\")}/${keyText(\"app.models.reorderDown\")} order`,\n\t\t];\n\t\treturn theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate refresh(preferredSelectedId?: string): void {\n\t\tconst query = this.searchInput.getValue();\n\t\tconst selectedId = preferredSelectedId ?? this.filteredItems[this.selectedIndex]?.fullId;\n\t\tconst items = this.buildItems();\n\t\t// Management surface: relevance ranking without a favorites partition (empty query keeps base order).\n\t\tthis.filteredItems = rankModelSearchItems(\n\t\t\titems,\n\t\t\tquery,\n\t\t\t(i) => ({ id: i.model.id, provider: i.model.provider, name: i.model.name }),\n\t\t\t{ favoritesFirst: false, isFavorite: () => false },\n\t\t);\n\t\tconst selectedIndex = selectedId ? this.filteredItems.findIndex((item) => item.fullId === selectedId) : -1;\n\t\tthis.selectedIndex =\n\t\t\tselectedIndex >= 0 ? selectedIndex : Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));\n\t\tthis.updateList();\n\t\tthis.footerText.setText(this.getFooterText());\n\t\tthis.secondaryFooterText.setText(this.getSecondaryFooterText());\n\t}\n\n\t/** Mirror a favoriteIds reorder swap onto the frozen display order so the row visibly moves. */\n\tprivate swapDisplayIds(firstId: string, secondId: string): void {\n\t\tconst firstIndex = this.displayIds.indexOf(firstId);\n\t\tconst secondIndex = this.displayIds.indexOf(secondId);\n\t\tif (firstIndex < 0 || secondIndex < 0) return;\n\t\t[this.displayIds[firstIndex], this.displayIds[secondIndex]] = [\n\t\t\tthis.displayIds[secondIndex],\n\t\t\tthis.displayIds[firstIndex],\n\t\t];\n\t}\n\n\tprivate notifyChange(): void {\n\t\tthis.callbacks.onChange(this.favoriteIds === null ? null : [...this.favoriteIds]);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredItems[i];\n\t\t\tif (!item) continue;\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst favoriteMarker = item.favorite ? theme.fg(\"success\", \"*\") : theme.fg(\"dim\", \"-\");\n\t\t\tconst modelText = isSelected ? theme.fg(\"accent\", item.model.id) : item.model.id;\n\t\t\tconst providerBadge = theme.fg(\"muted\", ` [${item.model.provider}]`);\n\t\t\tconst currentMarker =\n\t\t\t\tthis.currentModel && modelsAreEqual(this.currentModel, item.model) ? theme.fg(\"success\", \" ✓\") : \"\";\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew TruncatedText(`${prefix}${favoriteMarker} ${modelText}${providerBadge}${currentMarker}`),\n\t\t\t);\n\t\t}\n\n\t\t// Add scroll indicator if needed\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredItems.length > 0) {\n\t\t\tconst selected = this.filteredItems[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", ` Model Name: ${selected.model.name}`), 0, 0));\n\t\t\t}\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Navigation\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\n\t\t// Reorder favorite models\n\t\tconst reorderUp = kb.matches(data, \"app.models.reorderUp\");\n\t\tconst reorderDown = kb.matches(data, \"app.models.reorderDown\");\n\t\tif (reorderUp || reorderDown) {\n\t\t\tif (this.favoriteIds === null) return;\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item && isFavoriteModel(this.favoriteIds, item.fullId)) {\n\t\t\t\tconst delta = reorderUp ? -1 : 1;\n\t\t\t\tconst currentIndex = this.favoriteIds.indexOf(item.fullId);\n\t\t\t\tconst newIndex = currentIndex + delta;\n\t\t\t\t// Only move if within bounds\n\t\t\t\tif (newIndex >= 0 && newIndex < this.favoriteIds.length) {\n\t\t\t\t\tconst displacedId = this.favoriteIds[newIndex];\n\t\t\t\t\tthis.favoriteIds = moveFavoriteModel(this.favoriteIds, item.fullId, delta);\n\t\t\t\t\tthis.swapDisplayIds(item.fullId, displacedId);\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.selectedIndex += delta;\n\t\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Select on Enter\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.callbacks.onSelect(item.model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle favorite status for the selected model\n\t\tif (kb.matches(data, \"app.models.toggleFavorite\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.favoriteIds = toggleFavoriteModel(this.favoriteIds, this.allIds, item.fullId);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Favorite all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.enableAll\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.favoriteIds = favoriteModels(this.favoriteIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh(item?.fullId);\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.clearAll\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.favoriteIds = clearFavoriteModels(this.favoriteIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh(item?.fullId);\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle provider of current item\n\t\tif (kb.matches(data, \"app.models.toggleProvider\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst provider = item.model.provider;\n\t\t\t\tconst providerIds = this.allIds.filter((id) => this.modelsById.get(id)?.provider === provider);\n\t\t\t\tconst allFavorite = providerIds.every((id) => isFavoriteModel(this.favoriteIds, id));\n\t\t\t\tthis.favoriteIds = allFavorite\n\t\t\t\t\t? clearFavoriteModels(this.favoriteIds, this.allIds, providerIds)\n\t\t\t\t\t: favoriteModels(this.favoriteIds, this.allIds, providerIds);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh(item.fullId);\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Save/persist to settings\n\t\tif (kb.matches(data, \"app.models.save\")) {\n\t\t\tthis.callbacks.onPersist(this.favoriteIds === null ? null : [...this.favoriteIds]);\n\t\t\tthis.isDirty = false;\n\t\t\tthis.footerText.setText(this.getFooterText());\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+C - clear search or cancel if empty\n\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tif (this.searchInput.getValue()) {\n\t\t\t\tthis.searchInput.setValue(\"\");\n\t\t\t\tthis.refresh();\n\t\t\t} else {\n\t\t\t\tthis.callbacks.onCancel();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Escape - cancel\n\t\tif (matchesKey(data, Key.escape)) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass everything else to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.refresh();\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-host-runtime.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,6BAA6B,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAO/E,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE,eAAO,MAAM,iCAAiC,qEAAqE,CAAC;AAEpH,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,gCAAgC,CAAC;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACpC,YAAY,EACZ,oBAAoB,GAAG,4BAA4B,GAAG,iBAAiB,GAAG,2BAA2B,CACrG,GAAG;IACH,kBAAkB,IAAI,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACrF,0BAA0B,IAAI,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,eAAe,IACZ,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,GAC3C,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACxD,yBAAyB,IACtB,UAAU,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,GACrD,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC3G,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACtD;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CACjD,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,6BAA6B,GACpC,OAAO,CAAC,mBAAmB,CAAC,CAgC9B;
|
|
1
|
+
{"version":3,"file":"interactive-host-runtime.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,6BAA6B,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAO/E,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE,eAAO,MAAM,iCAAiC,qEAAqE,CAAC;AAEpH,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,gCAAgC,CAAC;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACpC,YAAY,EACZ,oBAAoB,GAAG,4BAA4B,GAAG,iBAAiB,GAAG,2BAA2B,CACrG,GAAG;IACH,kBAAkB,IAAI,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACrF,0BAA0B,IAAI,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,eAAe,IACZ,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,GAC3C,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACxD,yBAAyB,IACtB,UAAU,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,GACrD,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC3G,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACtD;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CACjD,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,6BAA6B,GACpC,OAAO,CAAC,mBAAmB,CAAC,CAgC9B;AAqiBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAEhH"}
|
|
@@ -168,11 +168,14 @@ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarni
|
|
|
168
168
|
}
|
|
169
169
|
if (property === "getSessionName")
|
|
170
170
|
return () => state.sessionName;
|
|
171
|
+
if (property === "getUsageTotals")
|
|
172
|
+
return () => state.usageTotals;
|
|
171
173
|
const value = Reflect.get(sessionManager, property, sessionManager);
|
|
172
174
|
return typeof value === "function" ? value.bind(sessionManager) : value;
|
|
173
175
|
},
|
|
174
176
|
});
|
|
175
177
|
let streamingAssistant;
|
|
178
|
+
let mirroredCurrentAssistantUsage = false;
|
|
176
179
|
const listeners = new Set();
|
|
177
180
|
client.onEvent((wireEvent) => {
|
|
178
181
|
if (wireEvent.type === "agent_settled")
|
|
@@ -211,16 +214,39 @@ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarni
|
|
|
211
214
|
}
|
|
212
215
|
if (wireEvent.type === "thinking_level_changed")
|
|
213
216
|
state = { ...state, thinkingLevel: wireEvent.level };
|
|
217
|
+
if (wireEvent.type === "service_tier_changed") {
|
|
218
|
+
state = { ...state, serviceTier: wireEvent.tier, fastMode: wireEvent.fastMode };
|
|
219
|
+
}
|
|
214
220
|
if (wireEvent.type === "session_info_changed")
|
|
215
221
|
state = { ...state, sessionName: wireEvent.name };
|
|
216
222
|
if (wireEvent.type === "message_start") {
|
|
217
|
-
if (wireEvent.message.role === "assistant")
|
|
223
|
+
if (wireEvent.message.role === "assistant") {
|
|
218
224
|
streamingAssistant = structuredClone(wireEvent.message);
|
|
225
|
+
mirroredCurrentAssistantUsage = false;
|
|
226
|
+
}
|
|
219
227
|
local.agent.state.messages.push(structuredClone(wireEvent.message));
|
|
220
228
|
}
|
|
221
229
|
if (wireEvent.type === "message_end") {
|
|
222
|
-
if (wireEvent.message.role === "assistant")
|
|
230
|
+
if (wireEvent.message.role === "assistant") {
|
|
223
231
|
streamingAssistant = structuredClone(wireEvent.message);
|
|
232
|
+
const usage = wireEvent.message.usage;
|
|
233
|
+
if (usage && !mirroredCurrentAssistantUsage) {
|
|
234
|
+
mirroredCurrentAssistantUsage = true;
|
|
235
|
+
const latestPromptTokens = usage.input + usage.cacheRead + usage.cacheWrite;
|
|
236
|
+
state = {
|
|
237
|
+
...state,
|
|
238
|
+
usageTotals: {
|
|
239
|
+
...state.usageTotals,
|
|
240
|
+
input: state.usageTotals.input + usage.input,
|
|
241
|
+
output: state.usageTotals.output + usage.output,
|
|
242
|
+
cacheRead: state.usageTotals.cacheRead + usage.cacheRead,
|
|
243
|
+
cacheWrite: state.usageTotals.cacheWrite + usage.cacheWrite,
|
|
244
|
+
cost: state.usageTotals.cost + (usage.cost?.total ?? 0),
|
|
245
|
+
latestCacheHitRate: latestPromptTokens > 0 ? (usage.cacheRead / latestPromptTokens) * 100 : undefined,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
224
250
|
const messages = local.agent.state.messages;
|
|
225
251
|
const previous = messages.at(-1);
|
|
226
252
|
if (previous?.role === wireEvent.message.role)
|
|
@@ -392,6 +418,8 @@ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarni
|
|
|
392
418
|
return state.isStreaming;
|
|
393
419
|
if (property === "isCompacting")
|
|
394
420
|
return state.isCompacting;
|
|
421
|
+
if (property === "isFastModeActive")
|
|
422
|
+
return () => state.fastMode;
|
|
395
423
|
if (property === "pendingMessageCount")
|
|
396
424
|
return state.pendingMessageCount;
|
|
397
425
|
if (property === "getSteeringMessages")
|
|
@@ -445,8 +473,12 @@ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarni
|
|
|
445
473
|
return state.sessionId;
|
|
446
474
|
if (property === "sessionName")
|
|
447
475
|
return state.sessionName;
|
|
476
|
+
if (property === "serviceTier")
|
|
477
|
+
return state.serviceTier;
|
|
448
478
|
if (property === "sessionManager")
|
|
449
479
|
return remoteSessionManager;
|
|
480
|
+
if (property === "settingsManager")
|
|
481
|
+
return settingsManager;
|
|
450
482
|
if (property === "messages")
|
|
451
483
|
return target.messages;
|
|
452
484
|
if (property === "model")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-host-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSession, AgentSessionEvent, AgentSessionEventListener } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSessionRuntimeDiagnostic } from \"../../core/agent-session-services.ts\";\nimport { executeBashWithOperations } from \"../../core/bash-executor.ts\";\nimport type { ProjectTrustContext, ReplacedSessionContext } from \"../../core/extensions/index.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport type { BashOperations } from \"../../core/tools/bash.ts\";\nimport { type EnsuredHost, ensureHost } from \"../rpc/host-ensure.ts\";\nimport { RpcClient, type RpcClientEvent } from \"../rpc/rpc-client.ts\";\n\nexport const INTERACTIVE_HOST_FALLBACK_WARNING = \"Warning: shared interactive host unavailable; continuing locally\";\n\nexport interface InteractiveHostWarning {\n\treadonly type: \"interactive_host_fallback\" | \"interactive_host_action_failed\";\n\treadonly message: string;\n\treadonly cause: unknown;\n}\n\n/**\n * The session contract InteractiveMode actually runs against. The local\n * AgentSession answers these reads synchronously; the shared-host proxy answers\n * them over RPC. Declaring the union here keeps the proxy honest (no more\n * `as unknown as` lie at the boundary) and lets the compiler find every TUI\n * call site that must await.\n */\nexport type InteractiveSession = Omit<\n\tAgentSession,\n\t\"cycleThinkingLevel\" | \"getAvailableThinkingLevels\" | \"getSessionStats\" | \"getUserMessagesForForking\"\n> & {\n\tcycleThinkingLevel(): ThinkingLevel | undefined | Promise<ThinkingLevel | undefined>;\n\tgetAvailableThinkingLevels(): ThinkingLevel[] | Promise<ThinkingLevel[]>;\n\tgetSessionStats():\n\t\t| ReturnType<AgentSession[\"getSessionStats\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getSessionStats\"]>>;\n\tgetUserMessagesForForking():\n\t\t| ReturnType<AgentSession[\"getUserMessagesForForking\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getUserMessagesForForking\"]>>;\n};\n\nexport interface InteractiveHostRuntimeOptions {\n\treadonly socket: string;\n\treadonly agentDir?: string;\n\treadonly ensureHost?: (options: { socket: string; agentDir?: string }) => Promise<EnsuredHost | undefined>;\n\tonWarning?: (warning: InteractiveHostWarning) => void;\n}\n\n/**\n * Replace only the transport-facing session operations. The object returned is\n * deliberately still an AgentSessionRuntime: InteractiveMode and extensions\n * retain their existing runtime seam, while the authoritative prompt/session\n * state is hosted by the shared RPC process.\n */\nexport async function createInteractiveHostRuntime(\n\tlocalRuntime: AgentSessionRuntime,\n\toptions: InteractiveHostRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\tconst sessionPath = localRuntime.session.sessionFile;\n\tif (!sessionPath) return localRuntime;\n\tconst startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));\n\tconst client = new RpcClient({ socketPath: options.socket });\n\ttry {\n\t\tawait startHost({ socket: options.socket, agentDir: options.agentDir });\n\t\tawait client.start();\n\t\tconst opened = await client.openSession({\n\t\t\tsessionPath,\n\t\t\tcwd: localRuntime.cwd,\n\t\t\tprovider: localRuntime.session.model?.provider,\n\t\t\tmodelId: localRuntime.session.model?.id,\n\t\t\tthinkingLevel: localRuntime.session.thinkingLevel,\n\t\t});\n\t\tconst remoteSession = createRemoteSessionProxy(\n\t\t\tlocalRuntime.session,\n\t\t\tlocalRuntime.services.agentDir,\n\t\t\tclient,\n\t\t\topened.state,\n\t\t\toptions.onWarning,\n\t\t);\n\t\treturn new RemoteInteractiveRuntime(localRuntime, remoteSession, client) as unknown as AgentSessionRuntime;\n\t} catch (cause) {\n\t\tawait client.stop().catch(() => {});\n\t\toptions.onWarning?.({\n\t\t\ttype: \"interactive_host_fallback\",\n\t\t\tmessage: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\tcause,\n\t\t});\n\t\treturn localRuntime;\n\t}\n}\n\nclass RemoteInteractiveRuntime {\n\treadonly #local: AgentSessionRuntime;\n\treadonly #remoteSession: RemoteSessionProxy;\n\treadonly #client: RpcClient;\n\t#rebindSession: (() => Promise<void>) | undefined;\n\t#beforeSessionInvalidate: (() => void) | undefined;\n\n\tconstructor(local: AgentSessionRuntime, remoteSession: RemoteSessionProxy, client: RpcClient) {\n\t\tthis.#local = local;\n\t\tthis.#remoteSession = remoteSession;\n\t\tthis.#client = client;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this.#remoteSession.session;\n\t}\n\tget services(): AgentSessionRuntime[\"services\"] {\n\t\treturn this.#local.services;\n\t}\n\tget cwd(): string {\n\t\treturn this.#remoteSession.session.sessionManager.getCwd();\n\t}\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this.#local.diagnostics;\n\t}\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this.#local.modelFallbackMessage;\n\t}\n\tget launchProfile(): AgentSessionRuntime[\"launchProfile\"] {\n\t\treturn this.#local.launchProfile;\n\t}\n\tsetBeforeSessionInvalidate(callback?: () => void): void {\n\t\tthis.#beforeSessionInvalidate = callback;\n\t}\n\tsetRebindSession(callback?: () => Promise<void>): void {\n\t\tthis.#rebindSession = callback;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tawait this.#client.closeSession();\n\t\tawait this.#client.stop();\n\t\tawait this.#local.dispose();\n\t}\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.newSession(options?.parentSession);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tif (options?.setup) {\n\t\t\t\tconst capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\t\tawait options.setup(capture);\n\t\t\t\tfor (const entry of capture.getEntries()) await this.#client.appendSessionEntry(entry);\n\t\t\t\tawait this.#remoteSession.refresh();\n\t\t\t}\n\t\t\tawait this.#rebindSession?.();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.switchSession(sessionPath, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tawait this.#rebindSession?.();\n\t\t\t// The shared host already resolved trust; this callback is retained for\n\t\t\t// compatibility, but its result cannot override host-authoritative state.\n\t\t\toptions?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst result = await this.#client.fork(entryId, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn { cancelled: result.cancelled, selectedText: result.text };\n\t}\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.importJsonl(inputPath, cwdOverride);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync #refreshAndRebind(): Promise<void> {\n\t\tawait this.#remoteSession.refresh();\n\t\tawait this.#rebindSession?.();\n\t}\n}\n\ninterface RemoteSessionProxy {\n\treadonly session: AgentSession;\n\trefresh(): Promise<void>;\n\tabortLocalBash(): void;\n\tcreateReplacedSessionContext(): ReplacedSessionContext;\n}\n\nfunction createRemoteSessionProxy(\n\tlocal: AgentSession,\n\tagentDir: string,\n\tclient: RpcClient,\n\tinitialState: ReturnType<typeof stateFromRpc>,\n\tonWarning?: (warning: InteractiveHostWarning) => void,\n): RemoteSessionProxy {\n\t// Fire-and-forget setters keep the sync AgentSession signature, but their RPC\n\t// failures must not vanish: the matching *_changed wire event confirms success,\n\t// and a rejection here is the only signal of failure.\n\tconst reportActionFailure = (action: string) => (error: unknown) => {\n\t\tonWarning?.({\n\t\t\ttype: \"interactive_host_action_failed\",\n\t\t\tmessage: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\tcause: error,\n\t\t});\n\t};\n\tlet state = { ...initialState };\n\tlet bashChunk: ((chunk: string) => void) | undefined;\n\tlet localBashAbortController: AbortController | undefined;\n\tlet localBashRunning = false;\n\tlet hostBashRunning = initialState.isBashRunning;\n\tlet sessionManager = local.sessionManager;\n\tlet settingsManager = SettingsManager.create(initialState.cwd, agentDir, {\n\t\tprojectTrusted: initialState.projectTrusted,\n\t});\n\tconst updateBashState = () => {\n\t\tstate = { ...state, isBashRunning: localBashRunning || hostBashRunning };\n\t};\n\tconst remoteSessionManager = new Proxy({} as SessionManager, {\n\t\tget(_target, property, _receiver) {\n\t\t\tif (property === \"appendLabelChange\") {\n\t\t\t\treturn (entryId: string, label?: string) => void client.setLabel(entryId, label);\n\t\t\t}\n\t\t\tif (property === \"getSessionName\") return () => state.sessionName;\n\t\t\tconst value = Reflect.get(sessionManager, property, sessionManager);\n\t\t\treturn typeof value === \"function\" ? value.bind(sessionManager) : value;\n\t\t},\n\t});\n\tlet streamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined;\n\tconst listeners = new Set<AgentSessionEventListener>();\n\tclient.onEvent((wireEvent) => {\n\t\tif (wireEvent.type === \"agent_settled\") state = { ...state, isStreaming: false, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"bash_start\") {\n\t\t\thostBashRunning = true;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_end\") {\n\t\t\thostBashRunning = false;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_execution_update\") bashChunk?.(wireEvent.delta);\n\t\tif (wireEvent.type === \"agent_start\") state = { ...state, isStreaming: true };\n\t\tif (wireEvent.type === \"compaction_start\") state = { ...state, isCompacting: true };\n\t\tif (wireEvent.type === \"compaction_end\") state = { ...state, isCompacting: false };\n\t\tif (wireEvent.type === \"auto_retry_start\") state = { ...state, retryAttempt: wireEvent.attempt };\n\t\tif (wireEvent.type === \"auto_retry_end\") state = { ...state, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"queue_update\") {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tsteering: [...wireEvent.steering],\n\t\t\t\tfollowUp: [...wireEvent.followUp],\n\t\t\t\tordered: [...wireEvent.ordered],\n\t\t\t\tpendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,\n\t\t\t};\n\t\t}\n\t\tif (wireEvent.type === \"model_changed\") {\n\t\t\tstate = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };\n\t\t}\n\t\tif (wireEvent.type === \"thinking_level_changed\") state = { ...state, thinkingLevel: wireEvent.level };\n\t\tif (wireEvent.type === \"session_info_changed\") state = { ...state, sessionName: wireEvent.name };\n\t\tif (wireEvent.type === \"message_start\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tlocal.agent.state.messages.push(structuredClone(wireEvent.message));\n\t\t}\n\t\tif (wireEvent.type === \"message_end\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tconst messages = local.agent.state.messages;\n\t\t\tconst previous = messages.at(-1);\n\t\t\tif (previous?.role === wireEvent.message.role)\n\t\t\t\tmessages[messages.length - 1] = structuredClone(wireEvent.message);\n\t\t}\n\t\tif (wireEvent.type === \"compaction_end\" && wireEvent.accepted && !wireEvent.aborted) {\n\t\t\ttry {\n\t\t\t\tsessionManager.reloadFromDisk?.();\n\t\t\t\tlocal.agent.state.messages = sessionManager.buildSessionContext().messages;\n\t\t\t} catch {\n\t\t\t\t// Non-fatal if session file is transiently locked or unavailable\n\t\t\t}\n\t\t}\n\t\tconst event = hydrateMessageUpdate(wireEvent, streamingAssistant);\n\t\tfor (const listener of listeners) listener(event);\n\t});\n\tconst refresh = async (): Promise<void> => {\n\t\tconst nextState = await client.getState();\n\t\tstate = { ...stateFromRpc(nextState) };\n\t\tlet messages: AgentSession[\"messages\"];\n\t\tsettingsManager = SettingsManager.create(nextState.cwd, agentDir, {\n\t\t\tprojectTrusted: nextState.projectTrusted,\n\t\t});\n\t\tif (nextState.sessionFile) {\n\t\t\t// SessionManager.open retains the explicit path even when the host has\n\t\t\t// deferred creating the file for a setup-only session.\n\t\t\tsessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);\n\t\t\tif (nextState.entries?.length && !sessionManager.getEntries().length) {\n\t\t\t\tfor (const entry of nextState.entries) sessionManager.appendEntry(entry);\n\t\t\t}\n\t\t\tmessages = sessionManager.buildSessionContext().messages;\n\t\t} else {\n\t\t\tmessages = await client.getMessages();\n\t\t}\n\t\tlocal.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));\n\t\tstreamingAssistant = undefined;\n\t};\n\tconst session = new Proxy(local, {\n\t\tget(target, property, receiver) {\n\t\t\tif (property === \"prompt\")\n\t\t\t\treturn (message: string, options?: Parameters<AgentSession[\"prompt\"]>[1]) =>\n\t\t\t\t\tclient.prompt(message, {\n\t\t\t\t\t\t...(options?.images ? { images: options.images } : {}),\n\t\t\t\t\t\t...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t\t\t...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t\t\t...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),\n\t\t\t\t\t\t...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),\n\t\t\t\t\t});\n\t\t\tif (property === \"abort\") return () => client.abort();\n\t\t\tif (property === \"abortCompaction\") return () => void client.abortCompaction();\n\t\t\tif (property === \"steer\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"steer\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tsteering: [...state.steering, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"steer\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.steer(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"followUp\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"followUp\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tfollowUp: [...state.followUp, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"followUp\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.followUp(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"waitForIdle\") return () => client.waitForIdle();\n\t\t\tif (property === \"getLastAssistantText\") return () => target.getLastAssistantText();\n\t\t\tif (property === \"setModel\")\n\t\t\t\treturn async (model: NonNullable<AgentSession[\"model\"]>) => {\n\t\t\t\t\tconst next = await client.setModel(model.provider, model.id);\n\t\t\t\t\treturn { systemPromptName: next.systemPromptName, model: next };\n\t\t\t\t};\n\t\t\tif (property === \"cycleModel\") return () => client.cycleModel();\n\t\t\tif (property === \"setThinkingLevel\")\n\t\t\t\treturn (level: AgentSession[\"thinkingLevel\"]) =>\n\t\t\t\t\tvoid client.setThinkingLevel(level).catch(reportActionFailure(\"setThinkingLevel\"));\n\t\t\tif (property === \"cycleThinkingLevel\")\n\t\t\t\treturn () => client.cycleThinkingLevel().then((result) => result?.level);\n\t\t\tif (property === \"getAvailableThinkingLevels\") return () => client.getAvailableThinkingLevels();\n\t\t\tif (property === \"setSteeringMode\")\n\t\t\t\treturn (mode: AgentSession[\"steeringMode\"]) =>\n\t\t\t\t\tvoid client.setSteeringMode(mode).catch(reportActionFailure(\"setSteeringMode\"));\n\t\t\tif (property === \"setFollowUpMode\")\n\t\t\t\treturn (mode: AgentSession[\"followUpMode\"]) =>\n\t\t\t\t\tvoid client.setFollowUpMode(mode).catch(reportActionFailure(\"setFollowUpMode\"));\n\t\t\tif (property === \"compact\") return (instructions?: string) => client.compact(instructions);\n\t\t\tif (property === \"setAutoCompactionEnabled\")\n\t\t\t\treturn (enabled: boolean) =>\n\t\t\t\t\tvoid client.setAutoCompaction(enabled).catch(reportActionFailure(\"setAutoCompaction\"));\n\t\t\tif (property === \"executeBash\")\n\t\t\t\treturn async (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tonChunk?: (chunk: string) => void,\n\t\t\t\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations | Record<string, unknown> },\n\t\t\t\t) => {\n\t\t\t\t\tif (options?.operations && typeof options.operations.exec === \"function\") {\n\t\t\t\t\t\tconst abortController = new AbortController();\n\t\t\t\t\t\tlocalBashAbortController = abortController;\n\t\t\t\t\t\tlocalBashRunning = true;\n\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\tconst sessionAtStart = state.sessionId;\n\t\t\t\t\t\tconst prefix = settingsManager.getShellCommandPrefix();\n\t\t\t\t\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\t\t\tstate.cwd,\n\t\t\t\t\t\t\t\toptions.operations as BashOperations,\n\t\t\t\t\t\t\t\t{ onChunk, signal: abortController.signal },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (state.sessionId === sessionAtStart) {\n\t\t\t\t\t\t\t\tawait client.recordBashResult(command, result, options.excludeFromContext);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tlocalBashAbortController = undefined;\n\t\t\t\t\t\t\tlocalBashRunning = false;\n\t\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbashChunk = onChunk;\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await client.bash(command, {\n\t\t\t\t\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\t\t\t\t\toperations: options?.operations as Record<string, unknown> | undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tbashChunk = undefined;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\tif (property === \"abortBash\")\n\t\t\t\treturn () => {\n\t\t\t\t\tif (localBashAbortController) localBashAbortController.abort();\n\t\t\t\t\telse void client.abortBash().catch(reportActionFailure(\"abortBash\"));\n\t\t\t\t};\n\t\t\tif (property === \"getSessionStats\") return () => client.getSessionStats();\n\t\t\tif (property === \"exportToHtml\")\n\t\t\t\treturn (outputPath?: string) => client.exportHtml(outputPath).then((result) => result.path);\n\t\t\tif (property === \"setSessionName\")\n\t\t\t\treturn (name: string) => client.setSessionName(name).catch(reportActionFailure(\"setSessionName\"));\n\t\t\tif (property === \"navigateTree\")\n\t\t\t\treturn async (targetId: string, options?: Parameters<AgentSession[\"navigateTree\"]>[1]) => {\n\t\t\t\t\tconst result = await client.navigateTree(targetId, options);\n\t\t\t\t\tif (!result.cancelled) await refresh();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"getUserMessagesForForking\") return () => client.getForkMessages();\n\t\t\tif (property === \"subscribe\")\n\t\t\t\treturn (listener: AgentSessionEventListener) => {\n\t\t\t\t\tlisteners.add(listener);\n\t\t\t\t\tconst localUnsubscribe = target.subscribe(listener);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\t\tlocalUnsubscribe();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tif (property === \"isStreaming\") return state.isStreaming;\n\t\t\tif (property === \"isCompacting\") return state.isCompacting;\n\t\t\tif (property === \"pendingMessageCount\") return state.pendingMessageCount;\n\t\t\tif (property === \"getSteeringMessages\") return () => state.steering;\n\t\t\tif (property === \"getFollowUpMessages\") return () => state.followUp;\n\t\t\tif (property === \"clearQueue\")\n\t\t\t\treturn (options?: { abortWillFollow: boolean }) => {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tsteering: [...state.steering],\n\t\t\t\t\t\tfollowUp: [...state.followUp],\n\t\t\t\t\t\tordered: [...state.ordered],\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(result, \"ordered\", { value: result.ordered, enumerable: false });\n\t\t\t\t\tvoid client.clearQueue(options).catch(reportActionFailure(\"clearQueue\"));\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"abortBranchSummary\")\n\t\t\t\treturn () => void client.abortBranchSummary().catch(reportActionFailure(\"abortBranchSummary\"));\n\t\t\tif (property === \"recordBashResult\")\n\t\t\t\treturn (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tresult: Parameters<AgentSession[\"recordBashResult\"]>[1],\n\t\t\t\t\toptions?: { excludeFromContext?: boolean },\n\t\t\t\t) =>\n\t\t\t\t\tvoid client\n\t\t\t\t\t\t.recordBashResult(command, result, options?.excludeFromContext)\n\t\t\t\t\t\t.catch(reportActionFailure(\"recordBashResult\"));\n\t\t\tif (property === \"set_label\") return undefined;\n\t\t\tif (property === \"retryAttempt\") return state.retryAttempt;\n\t\t\tif (property === \"isBashRunning\") return state.isBashRunning;\n\t\t\tif (property === \"reload\") return (_options?: Parameters<AgentSession[\"reload\"]>[0]) => client.reload();\n\t\t\tif (property === \"checkReloadVeto\") return () => client.checkReloadVeto();\n\t\t\tif (property === \"exportToJsonl\")\n\t\t\t\treturn (outputPath?: string) => client.exportJsonl(outputPath).then((result) => result.path);\n\t\t\t// The footer and other renderers read session.state.*; surface the\n\t\t\t// host-authoritative fields there too, not only via the direct getters.\n\t\t\tif (property === \"state\") {\n\t\t\t\tconst localState = target.state;\n\t\t\t\treturn {\n\t\t\t\t\t...localState,\n\t\t\t\t\tmodel: state.model ?? localState.model,\n\t\t\t\t\tthinkingLevel: state.thinkingLevel,\n\t\t\t\t\tisStreaming: state.isStreaming,\n\t\t\t\t\tisCompacting: state.isCompacting,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (property === \"sessionFile\") return state.sessionFile;\n\t\t\tif (property === \"sessionId\") return state.sessionId;\n\t\t\tif (property === \"sessionName\") return state.sessionName;\n\t\t\tif (property === \"sessionManager\") return remoteSessionManager;\n\t\t\tif (property === \"messages\") return target.messages;\n\t\t\tif (property === \"model\") return state.model ?? target.model;\n\t\t\tif (property === \"thinkingLevel\") return state.thinkingLevel;\n\t\t\treturn Reflect.get(target, property, receiver);\n\t\t},\n\t});\n\treturn {\n\t\tsession,\n\t\trefresh,\n\t\tabortLocalBash: () => localBashAbortController?.abort(),\n\t\tcreateReplacedSessionContext: () => {\n\t\t\tconst context = local.createReplacedSessionContext();\n\t\t\tObject.defineProperty(context, \"cwd\", { value: state.cwd });\n\t\t\tObject.defineProperty(context, \"sessionManager\", { value: remoteSessionManager });\n\t\t\tcontext.sendMessage = (message, options) =>\n\t\t\t\tclient.sendCustomMessage(message, {\n\t\t\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t\t\t\tdeliverAs: options?.deliverAs,\n\t\t\t\t});\n\t\t\tcontext.sendUserMessage = (content, options) => {\n\t\t\t\tif (typeof content === \"string\")\n\t\t\t\t\treturn client.prompt(content, {\n\t\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t\t});\n\t\t\t\tconst text = content\n\t\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst images = content.filter((part) => part.type === \"image\");\n\t\t\t\treturn client.prompt(text, {\n\t\t\t\t\timages,\n\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn context;\n\t\t},\n\t};\n}\n\nfunction hydrateMessageUpdate(\n\tevent: RpcClientEvent,\n\tstreamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined,\n): AgentSessionEvent {\n\tif (event.type !== \"message_update\" || !streamingAssistant) return event as unknown as AgentSessionEvent;\n\tconst update = event.assistantMessageEvent;\n\tif (update.type !== \"text_delta\" && update.type !== \"thinking_delta\" && update.type !== \"toolcall_delta\") {\n\t\treturn event as unknown as AgentSessionEvent;\n\t}\n\tconst content = streamingAssistant.content[update.contentIndex];\n\tif (update.type === \"text_delta\" && content?.type === \"text\") content.text += update.delta;\n\tif (update.type === \"thinking_delta\" && content?.type === \"thinking\") content.thinking += update.delta;\n\tif (update.type === \"toolcall_delta\" && content?.type === \"toolCall\") {\n\t\tconst raw = JSON.stringify(content.arguments) + update.delta;\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\tcontent.arguments = parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the last valid arguments until the next complete update.\n\t\t}\n\t}\n\tstreamingAssistant.usage = event.usage;\n\treturn {\n\t\ttype: \"message_update\",\n\t\tmessage: structuredClone(streamingAssistant),\n\t\tassistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },\n\t} as AgentSessionEvent;\n}\n\nfunction stateFromRpc(state: {\n\tmodel?: AgentSession[\"model\"];\n\tthinkingLevel: AgentSession[\"thinkingLevel\"];\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tpendingMessageCount: number;\n\tretryAttempt: number;\n\tisBashRunning: boolean;\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tcwd: string;\n\tprojectTrusted: boolean;\n\tentries?: import(\"../../core/session-manager.ts\").SessionEntry[];\n\tsteering: string[];\n\tfollowUp: string[];\n\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n}) {\n\treturn state;\n}\n\nexport function isInteractiveHostEvent(event: RpcClientEvent): event is Extract<RpcClientEvent, { type: string }> {\n\treturn typeof event === \"object\" && event !== null && \"type\" in event;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-host-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSession, AgentSessionEvent, AgentSessionEventListener } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSessionRuntimeDiagnostic } from \"../../core/agent-session-services.ts\";\nimport { executeBashWithOperations } from \"../../core/bash-executor.ts\";\nimport type { ProjectTrustContext, ReplacedSessionContext } from \"../../core/extensions/index.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport type { BashOperations } from \"../../core/tools/bash.ts\";\nimport { type EnsuredHost, ensureHost } from \"../rpc/host-ensure.ts\";\nimport { RpcClient, type RpcClientEvent } from \"../rpc/rpc-client.ts\";\n\nexport const INTERACTIVE_HOST_FALLBACK_WARNING = \"Warning: shared interactive host unavailable; continuing locally\";\n\nexport interface InteractiveHostWarning {\n\treadonly type: \"interactive_host_fallback\" | \"interactive_host_action_failed\";\n\treadonly message: string;\n\treadonly cause: unknown;\n}\n\n/**\n * The session contract InteractiveMode actually runs against. The local\n * AgentSession answers these reads synchronously; the shared-host proxy answers\n * them over RPC. Declaring the union here keeps the proxy honest (no more\n * `as unknown as` lie at the boundary) and lets the compiler find every TUI\n * call site that must await.\n */\nexport type InteractiveSession = Omit<\n\tAgentSession,\n\t\"cycleThinkingLevel\" | \"getAvailableThinkingLevels\" | \"getSessionStats\" | \"getUserMessagesForForking\"\n> & {\n\tcycleThinkingLevel(): ThinkingLevel | undefined | Promise<ThinkingLevel | undefined>;\n\tgetAvailableThinkingLevels(): ThinkingLevel[] | Promise<ThinkingLevel[]>;\n\tgetSessionStats():\n\t\t| ReturnType<AgentSession[\"getSessionStats\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getSessionStats\"]>>;\n\tgetUserMessagesForForking():\n\t\t| ReturnType<AgentSession[\"getUserMessagesForForking\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getUserMessagesForForking\"]>>;\n};\n\nexport interface InteractiveHostRuntimeOptions {\n\treadonly socket: string;\n\treadonly agentDir?: string;\n\treadonly ensureHost?: (options: { socket: string; agentDir?: string }) => Promise<EnsuredHost | undefined>;\n\tonWarning?: (warning: InteractiveHostWarning) => void;\n}\n\n/**\n * Replace only the transport-facing session operations. The object returned is\n * deliberately still an AgentSessionRuntime: InteractiveMode and extensions\n * retain their existing runtime seam, while the authoritative prompt/session\n * state is hosted by the shared RPC process.\n */\nexport async function createInteractiveHostRuntime(\n\tlocalRuntime: AgentSessionRuntime,\n\toptions: InteractiveHostRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\tconst sessionPath = localRuntime.session.sessionFile;\n\tif (!sessionPath) return localRuntime;\n\tconst startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));\n\tconst client = new RpcClient({ socketPath: options.socket });\n\ttry {\n\t\tawait startHost({ socket: options.socket, agentDir: options.agentDir });\n\t\tawait client.start();\n\t\tconst opened = await client.openSession({\n\t\t\tsessionPath,\n\t\t\tcwd: localRuntime.cwd,\n\t\t\tprovider: localRuntime.session.model?.provider,\n\t\t\tmodelId: localRuntime.session.model?.id,\n\t\t\tthinkingLevel: localRuntime.session.thinkingLevel,\n\t\t});\n\t\tconst remoteSession = createRemoteSessionProxy(\n\t\t\tlocalRuntime.session,\n\t\t\tlocalRuntime.services.agentDir,\n\t\t\tclient,\n\t\t\topened.state,\n\t\t\toptions.onWarning,\n\t\t);\n\t\treturn new RemoteInteractiveRuntime(localRuntime, remoteSession, client) as unknown as AgentSessionRuntime;\n\t} catch (cause) {\n\t\tawait client.stop().catch(() => {});\n\t\toptions.onWarning?.({\n\t\t\ttype: \"interactive_host_fallback\",\n\t\t\tmessage: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\tcause,\n\t\t});\n\t\treturn localRuntime;\n\t}\n}\n\nclass RemoteInteractiveRuntime {\n\treadonly #local: AgentSessionRuntime;\n\treadonly #remoteSession: RemoteSessionProxy;\n\treadonly #client: RpcClient;\n\t#rebindSession: (() => Promise<void>) | undefined;\n\t#beforeSessionInvalidate: (() => void) | undefined;\n\n\tconstructor(local: AgentSessionRuntime, remoteSession: RemoteSessionProxy, client: RpcClient) {\n\t\tthis.#local = local;\n\t\tthis.#remoteSession = remoteSession;\n\t\tthis.#client = client;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this.#remoteSession.session;\n\t}\n\tget services(): AgentSessionRuntime[\"services\"] {\n\t\treturn this.#local.services;\n\t}\n\tget cwd(): string {\n\t\treturn this.#remoteSession.session.sessionManager.getCwd();\n\t}\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this.#local.diagnostics;\n\t}\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this.#local.modelFallbackMessage;\n\t}\n\tget launchProfile(): AgentSessionRuntime[\"launchProfile\"] {\n\t\treturn this.#local.launchProfile;\n\t}\n\tsetBeforeSessionInvalidate(callback?: () => void): void {\n\t\tthis.#beforeSessionInvalidate = callback;\n\t}\n\tsetRebindSession(callback?: () => Promise<void>): void {\n\t\tthis.#rebindSession = callback;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tawait this.#client.closeSession();\n\t\tawait this.#client.stop();\n\t\tawait this.#local.dispose();\n\t}\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.newSession(options?.parentSession);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tif (options?.setup) {\n\t\t\t\tconst capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\t\tawait options.setup(capture);\n\t\t\t\tfor (const entry of capture.getEntries()) await this.#client.appendSessionEntry(entry);\n\t\t\t\tawait this.#remoteSession.refresh();\n\t\t\t}\n\t\t\tawait this.#rebindSession?.();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.switchSession(sessionPath, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tawait this.#rebindSession?.();\n\t\t\t// The shared host already resolved trust; this callback is retained for\n\t\t\t// compatibility, but its result cannot override host-authoritative state.\n\t\t\toptions?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst result = await this.#client.fork(entryId, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn { cancelled: result.cancelled, selectedText: result.text };\n\t}\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.importJsonl(inputPath, cwdOverride);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync #refreshAndRebind(): Promise<void> {\n\t\tawait this.#remoteSession.refresh();\n\t\tawait this.#rebindSession?.();\n\t}\n}\n\ninterface RemoteSessionProxy {\n\treadonly session: AgentSession;\n\trefresh(): Promise<void>;\n\tabortLocalBash(): void;\n\tcreateReplacedSessionContext(): ReplacedSessionContext;\n}\n\nfunction createRemoteSessionProxy(\n\tlocal: AgentSession,\n\tagentDir: string,\n\tclient: RpcClient,\n\tinitialState: ReturnType<typeof stateFromRpc>,\n\tonWarning?: (warning: InteractiveHostWarning) => void,\n): RemoteSessionProxy {\n\t// Fire-and-forget setters keep the sync AgentSession signature, but their RPC\n\t// failures must not vanish: the matching *_changed wire event confirms success,\n\t// and a rejection here is the only signal of failure.\n\tconst reportActionFailure = (action: string) => (error: unknown) => {\n\t\tonWarning?.({\n\t\t\ttype: \"interactive_host_action_failed\",\n\t\t\tmessage: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\tcause: error,\n\t\t});\n\t};\n\tlet state = { ...initialState };\n\tlet bashChunk: ((chunk: string) => void) | undefined;\n\tlet localBashAbortController: AbortController | undefined;\n\tlet localBashRunning = false;\n\tlet hostBashRunning = initialState.isBashRunning;\n\tlet sessionManager = local.sessionManager;\n\tlet settingsManager = SettingsManager.create(initialState.cwd, agentDir, {\n\t\tprojectTrusted: initialState.projectTrusted,\n\t});\n\tconst updateBashState = () => {\n\t\tstate = { ...state, isBashRunning: localBashRunning || hostBashRunning };\n\t};\n\tconst remoteSessionManager = new Proxy({} as SessionManager, {\n\t\tget(_target, property, _receiver) {\n\t\t\tif (property === \"appendLabelChange\") {\n\t\t\t\treturn (entryId: string, label?: string) => void client.setLabel(entryId, label);\n\t\t\t}\n\t\t\tif (property === \"getSessionName\") return () => state.sessionName;\n\t\t\tif (property === \"getUsageTotals\") return () => state.usageTotals;\n\t\t\tconst value = Reflect.get(sessionManager, property, sessionManager);\n\t\t\treturn typeof value === \"function\" ? value.bind(sessionManager) : value;\n\t\t},\n\t});\n\tlet streamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined;\n\tlet mirroredCurrentAssistantUsage = false;\n\tconst listeners = new Set<AgentSessionEventListener>();\n\tclient.onEvent((wireEvent) => {\n\t\tif (wireEvent.type === \"agent_settled\") state = { ...state, isStreaming: false, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"bash_start\") {\n\t\t\thostBashRunning = true;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_end\") {\n\t\t\thostBashRunning = false;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_execution_update\") bashChunk?.(wireEvent.delta);\n\t\tif (wireEvent.type === \"agent_start\") state = { ...state, isStreaming: true };\n\t\tif (wireEvent.type === \"compaction_start\") state = { ...state, isCompacting: true };\n\t\tif (wireEvent.type === \"compaction_end\") state = { ...state, isCompacting: false };\n\t\tif (wireEvent.type === \"auto_retry_start\") state = { ...state, retryAttempt: wireEvent.attempt };\n\t\tif (wireEvent.type === \"auto_retry_end\") state = { ...state, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"queue_update\") {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tsteering: [...wireEvent.steering],\n\t\t\t\tfollowUp: [...wireEvent.followUp],\n\t\t\t\tordered: [...wireEvent.ordered],\n\t\t\t\tpendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,\n\t\t\t};\n\t\t}\n\t\tif (wireEvent.type === \"model_changed\") {\n\t\t\tstate = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };\n\t\t}\n\t\tif (wireEvent.type === \"thinking_level_changed\") state = { ...state, thinkingLevel: wireEvent.level };\n\t\tif (wireEvent.type === \"service_tier_changed\") {\n\t\t\tstate = { ...state, serviceTier: wireEvent.tier, fastMode: wireEvent.fastMode };\n\t\t}\n\t\tif (wireEvent.type === \"session_info_changed\") state = { ...state, sessionName: wireEvent.name };\n\t\tif (wireEvent.type === \"message_start\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") {\n\t\t\t\tstreamingAssistant = structuredClone(wireEvent.message);\n\t\t\t\tmirroredCurrentAssistantUsage = false;\n\t\t\t}\n\t\t\tlocal.agent.state.messages.push(structuredClone(wireEvent.message));\n\t\t}\n\t\tif (wireEvent.type === \"message_end\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") {\n\t\t\t\tstreamingAssistant = structuredClone(wireEvent.message);\n\t\t\t\tconst usage = wireEvent.message.usage;\n\t\t\t\tif (usage && !mirroredCurrentAssistantUsage) {\n\t\t\t\t\tmirroredCurrentAssistantUsage = true;\n\t\t\t\t\tconst latestPromptTokens = usage.input + usage.cacheRead + usage.cacheWrite;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tusageTotals: {\n\t\t\t\t\t\t\t...state.usageTotals,\n\t\t\t\t\t\t\tinput: state.usageTotals.input + usage.input,\n\t\t\t\t\t\t\toutput: state.usageTotals.output + usage.output,\n\t\t\t\t\t\t\tcacheRead: state.usageTotals.cacheRead + usage.cacheRead,\n\t\t\t\t\t\t\tcacheWrite: state.usageTotals.cacheWrite + usage.cacheWrite,\n\t\t\t\t\t\t\tcost: state.usageTotals.cost + (usage.cost?.total ?? 0),\n\t\t\t\t\t\t\tlatestCacheHitRate:\n\t\t\t\t\t\t\t\tlatestPromptTokens > 0 ? (usage.cacheRead / latestPromptTokens) * 100 : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst messages = local.agent.state.messages;\n\t\t\tconst previous = messages.at(-1);\n\t\t\tif (previous?.role === wireEvent.message.role)\n\t\t\t\tmessages[messages.length - 1] = structuredClone(wireEvent.message);\n\t\t}\n\t\tif (wireEvent.type === \"compaction_end\" && wireEvent.accepted && !wireEvent.aborted) {\n\t\t\ttry {\n\t\t\t\tsessionManager.reloadFromDisk?.();\n\t\t\t\tlocal.agent.state.messages = sessionManager.buildSessionContext().messages;\n\t\t\t} catch {\n\t\t\t\t// Non-fatal if session file is transiently locked or unavailable\n\t\t\t}\n\t\t}\n\t\tconst event = hydrateMessageUpdate(wireEvent, streamingAssistant);\n\t\tfor (const listener of listeners) listener(event);\n\t});\n\tconst refresh = async (): Promise<void> => {\n\t\tconst nextState = await client.getState();\n\t\tstate = { ...stateFromRpc(nextState) };\n\t\tlet messages: AgentSession[\"messages\"];\n\t\tsettingsManager = SettingsManager.create(nextState.cwd, agentDir, {\n\t\t\tprojectTrusted: nextState.projectTrusted,\n\t\t});\n\t\tif (nextState.sessionFile) {\n\t\t\t// SessionManager.open retains the explicit path even when the host has\n\t\t\t// deferred creating the file for a setup-only session.\n\t\t\tsessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);\n\t\t\tif (nextState.entries?.length && !sessionManager.getEntries().length) {\n\t\t\t\tfor (const entry of nextState.entries) sessionManager.appendEntry(entry);\n\t\t\t}\n\t\t\tmessages = sessionManager.buildSessionContext().messages;\n\t\t} else {\n\t\t\tmessages = await client.getMessages();\n\t\t}\n\t\tlocal.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));\n\t\tstreamingAssistant = undefined;\n\t};\n\tconst session = new Proxy(local, {\n\t\tget(target, property, receiver) {\n\t\t\tif (property === \"prompt\")\n\t\t\t\treturn (message: string, options?: Parameters<AgentSession[\"prompt\"]>[1]) =>\n\t\t\t\t\tclient.prompt(message, {\n\t\t\t\t\t\t...(options?.images ? { images: options.images } : {}),\n\t\t\t\t\t\t...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t\t\t...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t\t\t...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),\n\t\t\t\t\t\t...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),\n\t\t\t\t\t});\n\t\t\tif (property === \"abort\") return () => client.abort();\n\t\t\tif (property === \"abortCompaction\") return () => void client.abortCompaction();\n\t\t\tif (property === \"steer\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"steer\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tsteering: [...state.steering, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"steer\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.steer(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"followUp\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"followUp\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tfollowUp: [...state.followUp, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"followUp\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.followUp(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"waitForIdle\") return () => client.waitForIdle();\n\t\t\tif (property === \"getLastAssistantText\") return () => target.getLastAssistantText();\n\t\t\tif (property === \"setModel\")\n\t\t\t\treturn async (model: NonNullable<AgentSession[\"model\"]>) => {\n\t\t\t\t\tconst next = await client.setModel(model.provider, model.id);\n\t\t\t\t\treturn { systemPromptName: next.systemPromptName, model: next };\n\t\t\t\t};\n\t\t\tif (property === \"cycleModel\") return () => client.cycleModel();\n\t\t\tif (property === \"setThinkingLevel\")\n\t\t\t\treturn (level: AgentSession[\"thinkingLevel\"]) =>\n\t\t\t\t\tvoid client.setThinkingLevel(level).catch(reportActionFailure(\"setThinkingLevel\"));\n\t\t\tif (property === \"cycleThinkingLevel\")\n\t\t\t\treturn () => client.cycleThinkingLevel().then((result) => result?.level);\n\t\t\tif (property === \"getAvailableThinkingLevels\") return () => client.getAvailableThinkingLevels();\n\t\t\tif (property === \"setSteeringMode\")\n\t\t\t\treturn (mode: AgentSession[\"steeringMode\"]) =>\n\t\t\t\t\tvoid client.setSteeringMode(mode).catch(reportActionFailure(\"setSteeringMode\"));\n\t\t\tif (property === \"setFollowUpMode\")\n\t\t\t\treturn (mode: AgentSession[\"followUpMode\"]) =>\n\t\t\t\t\tvoid client.setFollowUpMode(mode).catch(reportActionFailure(\"setFollowUpMode\"));\n\t\t\tif (property === \"compact\") return (instructions?: string) => client.compact(instructions);\n\t\t\tif (property === \"setAutoCompactionEnabled\")\n\t\t\t\treturn (enabled: boolean) =>\n\t\t\t\t\tvoid client.setAutoCompaction(enabled).catch(reportActionFailure(\"setAutoCompaction\"));\n\t\t\tif (property === \"executeBash\")\n\t\t\t\treturn async (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tonChunk?: (chunk: string) => void,\n\t\t\t\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations | Record<string, unknown> },\n\t\t\t\t) => {\n\t\t\t\t\tif (options?.operations && typeof options.operations.exec === \"function\") {\n\t\t\t\t\t\tconst abortController = new AbortController();\n\t\t\t\t\t\tlocalBashAbortController = abortController;\n\t\t\t\t\t\tlocalBashRunning = true;\n\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\tconst sessionAtStart = state.sessionId;\n\t\t\t\t\t\tconst prefix = settingsManager.getShellCommandPrefix();\n\t\t\t\t\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\t\t\tstate.cwd,\n\t\t\t\t\t\t\t\toptions.operations as BashOperations,\n\t\t\t\t\t\t\t\t{ onChunk, signal: abortController.signal },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (state.sessionId === sessionAtStart) {\n\t\t\t\t\t\t\t\tawait client.recordBashResult(command, result, options.excludeFromContext);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tlocalBashAbortController = undefined;\n\t\t\t\t\t\t\tlocalBashRunning = false;\n\t\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbashChunk = onChunk;\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await client.bash(command, {\n\t\t\t\t\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\t\t\t\t\toperations: options?.operations as Record<string, unknown> | undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tbashChunk = undefined;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\tif (property === \"abortBash\")\n\t\t\t\treturn () => {\n\t\t\t\t\tif (localBashAbortController) localBashAbortController.abort();\n\t\t\t\t\telse void client.abortBash().catch(reportActionFailure(\"abortBash\"));\n\t\t\t\t};\n\t\t\tif (property === \"getSessionStats\") return () => client.getSessionStats();\n\t\t\tif (property === \"exportToHtml\")\n\t\t\t\treturn (outputPath?: string) => client.exportHtml(outputPath).then((result) => result.path);\n\t\t\tif (property === \"setSessionName\")\n\t\t\t\treturn (name: string) => client.setSessionName(name).catch(reportActionFailure(\"setSessionName\"));\n\t\t\tif (property === \"navigateTree\")\n\t\t\t\treturn async (targetId: string, options?: Parameters<AgentSession[\"navigateTree\"]>[1]) => {\n\t\t\t\t\tconst result = await client.navigateTree(targetId, options);\n\t\t\t\t\tif (!result.cancelled) await refresh();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"getUserMessagesForForking\") return () => client.getForkMessages();\n\t\t\tif (property === \"subscribe\")\n\t\t\t\treturn (listener: AgentSessionEventListener) => {\n\t\t\t\t\tlisteners.add(listener);\n\t\t\t\t\tconst localUnsubscribe = target.subscribe(listener);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\t\tlocalUnsubscribe();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tif (property === \"isStreaming\") return state.isStreaming;\n\t\t\tif (property === \"isCompacting\") return state.isCompacting;\n\t\t\tif (property === \"isFastModeActive\") return () => state.fastMode;\n\t\t\tif (property === \"pendingMessageCount\") return state.pendingMessageCount;\n\t\t\tif (property === \"getSteeringMessages\") return () => state.steering;\n\t\t\tif (property === \"getFollowUpMessages\") return () => state.followUp;\n\t\t\tif (property === \"clearQueue\")\n\t\t\t\treturn (options?: { abortWillFollow: boolean }) => {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tsteering: [...state.steering],\n\t\t\t\t\t\tfollowUp: [...state.followUp],\n\t\t\t\t\t\tordered: [...state.ordered],\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(result, \"ordered\", { value: result.ordered, enumerable: false });\n\t\t\t\t\tvoid client.clearQueue(options).catch(reportActionFailure(\"clearQueue\"));\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"abortBranchSummary\")\n\t\t\t\treturn () => void client.abortBranchSummary().catch(reportActionFailure(\"abortBranchSummary\"));\n\t\t\tif (property === \"recordBashResult\")\n\t\t\t\treturn (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tresult: Parameters<AgentSession[\"recordBashResult\"]>[1],\n\t\t\t\t\toptions?: { excludeFromContext?: boolean },\n\t\t\t\t) =>\n\t\t\t\t\tvoid client\n\t\t\t\t\t\t.recordBashResult(command, result, options?.excludeFromContext)\n\t\t\t\t\t\t.catch(reportActionFailure(\"recordBashResult\"));\n\t\t\tif (property === \"set_label\") return undefined;\n\t\t\tif (property === \"retryAttempt\") return state.retryAttempt;\n\t\t\tif (property === \"isBashRunning\") return state.isBashRunning;\n\t\t\tif (property === \"reload\") return (_options?: Parameters<AgentSession[\"reload\"]>[0]) => client.reload();\n\t\t\tif (property === \"checkReloadVeto\") return () => client.checkReloadVeto();\n\t\t\tif (property === \"exportToJsonl\")\n\t\t\t\treturn (outputPath?: string) => client.exportJsonl(outputPath).then((result) => result.path);\n\t\t\t// The footer and other renderers read session.state.*; surface the\n\t\t\t// host-authoritative fields there too, not only via the direct getters.\n\t\t\tif (property === \"state\") {\n\t\t\t\tconst localState = target.state;\n\t\t\t\treturn {\n\t\t\t\t\t...localState,\n\t\t\t\t\tmodel: state.model ?? localState.model,\n\t\t\t\t\tthinkingLevel: state.thinkingLevel,\n\t\t\t\t\tisStreaming: state.isStreaming,\n\t\t\t\t\tisCompacting: state.isCompacting,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (property === \"sessionFile\") return state.sessionFile;\n\t\t\tif (property === \"sessionId\") return state.sessionId;\n\t\t\tif (property === \"sessionName\") return state.sessionName;\n\t\t\tif (property === \"serviceTier\") return state.serviceTier;\n\t\t\tif (property === \"sessionManager\") return remoteSessionManager;\n\t\t\tif (property === \"settingsManager\") return settingsManager;\n\t\t\tif (property === \"messages\") return target.messages;\n\t\t\tif (property === \"model\") return state.model ?? target.model;\n\t\t\tif (property === \"thinkingLevel\") return state.thinkingLevel;\n\t\t\treturn Reflect.get(target, property, receiver);\n\t\t},\n\t});\n\treturn {\n\t\tsession,\n\t\trefresh,\n\t\tabortLocalBash: () => localBashAbortController?.abort(),\n\t\tcreateReplacedSessionContext: () => {\n\t\t\tconst context = local.createReplacedSessionContext();\n\t\t\tObject.defineProperty(context, \"cwd\", { value: state.cwd });\n\t\t\tObject.defineProperty(context, \"sessionManager\", { value: remoteSessionManager });\n\t\t\tcontext.sendMessage = (message, options) =>\n\t\t\t\tclient.sendCustomMessage(message, {\n\t\t\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t\t\t\tdeliverAs: options?.deliverAs,\n\t\t\t\t});\n\t\t\tcontext.sendUserMessage = (content, options) => {\n\t\t\t\tif (typeof content === \"string\")\n\t\t\t\t\treturn client.prompt(content, {\n\t\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t\t});\n\t\t\t\tconst text = content\n\t\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst images = content.filter((part) => part.type === \"image\");\n\t\t\t\treturn client.prompt(text, {\n\t\t\t\t\timages,\n\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn context;\n\t\t},\n\t};\n}\n\nfunction hydrateMessageUpdate(\n\tevent: RpcClientEvent,\n\tstreamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined,\n): AgentSessionEvent {\n\tif (event.type !== \"message_update\" || !streamingAssistant) return event as unknown as AgentSessionEvent;\n\tconst update = event.assistantMessageEvent;\n\tif (update.type !== \"text_delta\" && update.type !== \"thinking_delta\" && update.type !== \"toolcall_delta\") {\n\t\treturn event as unknown as AgentSessionEvent;\n\t}\n\tconst content = streamingAssistant.content[update.contentIndex];\n\tif (update.type === \"text_delta\" && content?.type === \"text\") content.text += update.delta;\n\tif (update.type === \"thinking_delta\" && content?.type === \"thinking\") content.thinking += update.delta;\n\tif (update.type === \"toolcall_delta\" && content?.type === \"toolCall\") {\n\t\tconst raw = JSON.stringify(content.arguments) + update.delta;\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\tcontent.arguments = parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the last valid arguments until the next complete update.\n\t\t}\n\t}\n\tstreamingAssistant.usage = event.usage;\n\treturn {\n\t\ttype: \"message_update\",\n\t\tmessage: structuredClone(streamingAssistant),\n\t\tassistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },\n\t} as AgentSessionEvent;\n}\n\nfunction stateFromRpc(state: {\n\tmodel?: AgentSession[\"model\"];\n\tthinkingLevel: AgentSession[\"thinkingLevel\"];\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tpendingMessageCount: number;\n\tusageTotals: import(\"../../core/session-manager.ts\").UsageTotals;\n\tretryAttempt: number;\n\tisBashRunning: boolean;\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tcwd: string;\n\tprojectTrusted: boolean;\n\tserviceTier?: AgentSession[\"serviceTier\"];\n\tfastMode: boolean;\n\tentries?: import(\"../../core/session-manager.ts\").SessionEntry[];\n\tsteering: string[];\n\tfollowUp: string[];\n\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n}) {\n\treturn state;\n}\n\nexport function isInteractiveHostEvent(event: RpcClientEvent): event is Extract<RpcClientEvent, { type: string }> {\n\treturn typeof event === \"object\" && event !== null && \"type\" in event;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAwC/E,OAAO,KAAK,EAWX,eAAe,EAEf,MAAM,gBAAgB,CAAC;AAGxB,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AA4BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAwC/E,OAAO,KAAK,EAWX,eAAe,EAEf,MAAM,gBAAgB,CAAC;AAGxB,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AA4BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAsC3E;AA4BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CA4pCtB"}
|
|
@@ -98,6 +98,7 @@ export function buildRpcSessionState(session) {
|
|
|
98
98
|
autoCompactionEnabled: session.autoCompactionEnabled,
|
|
99
99
|
messageCount: session.messages.length,
|
|
100
100
|
pendingMessageCount: session.pendingMessageCount,
|
|
101
|
+
usageTotals: session.sessionManager.getUsageTotals(),
|
|
101
102
|
};
|
|
102
103
|
}
|
|
103
104
|
function loadedMcpServers(snapshot) {
|