diff --git a/package.json b/package.json index f0abdc9..4f969a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@getpipher/armory-fleet", - "version": "0.10.0", + "version": "0.10.1", "private": false, "description": "The armory suite's subagent orchestrator for the pi coding agent \u2014 a cross-harness, superpowers-native fleet where every agent is armory-native from birth.", "license": "MIT", diff --git a/src/index.ts b/src/index.ts index 38953af..6bf2fc6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -288,15 +288,17 @@ export default async function (pi: ExtensionAPI): Promise { } // SPEC-5b-2: live widget (above editor). Display-only, independent // of the /fleet panel. getTheme is a live getter (EditorTheme gotcha). Disposed on session end. + const getModelContextWindow = (m: string): number | undefined => { + const { provider, id } = splitModel(m, deps.parentModel.provider); + return sharedModelRegistry.find(provider, id)?.contextWindow; + }; + deps.getModelContextWindow = getModelContextWindow; fleetWidget = new FleetWidgetController({ runRegistry: deps.runRegistry, bgRuns, ui: ctx.ui as never, getTheme: () => ctx.ui.theme, - getModelContextWindow: (m: string) => { - const { provider, id } = splitModel(m, deps.parentModel.provider); - return sharedModelRegistry.find(provider, id)?.contextWindow; - }, + getModelContextWindow, }); fleetWidget.start(); diff --git a/src/panel/fleet-panel.ts b/src/panel/fleet-panel.ts index b3de023..7b3b770 100644 --- a/src/panel/fleet-panel.ts +++ b/src/panel/fleet-panel.ts @@ -56,6 +56,8 @@ export interface FleetPanelDeps { tierStore?: TierStore; /** SPEC-6-1: callback to rebuild the tier registry after a write. */ reloadTiers?: () => void; + /** SPEC-6-1: model contextWindow resolver for Runs-tab ctx% (Surface C). Optional — ctx% hidden when absent. */ + getModelContextWindow?: (model: string) => number | undefined; } export interface FleetPanelOpts { @@ -146,7 +148,7 @@ export class FleetPanel extends Container { : this.view === "lifecycle" ? [...this.deps.lifecycleRuns.values()].map((l: LifecycleRunRecord) => ({ value: l.runId, label: lifecycleRow(l) })) : this.view === "runs" - ? buildRunsIndex(this.deps.runLog?.dir ?? "").map((r: RunMeta) => ({ value: r.runId, label: runsRow(r) })) + ? buildRunsIndex(this.deps.runLog?.dir ?? "").map((r: RunMeta) => ({ value: r.runId, label: runsRow(r, this.deps.getModelContextWindow) })) : this.view === "agents" ? [...this.deps.registry.values()].map((a: AgentDef) => ({ value: a.name, label: agentsRow(a) })) : this.view === "scheduled" diff --git a/src/tools/subagent.ts b/src/tools/subagent.ts index adb51ae..930f43b 100644 --- a/src/tools/subagent.ts +++ b/src/tools/subagent.ts @@ -56,6 +56,8 @@ export interface SubagentToolDeps { tierStore?: import("../tiers/tier-store.ts").TierStore; /** SPEC-6-1: rebuild the tier registry after a panel write. */ reloadTiers?: () => void; + /** SPEC-6-1: model contextWindow resolver for Runs-tab ctx% (Surface C). Optional — ctx% hidden when absent. */ + getModelContextWindow?: (model: string) => number | undefined; } /** Build the pi.registerTool definition. Thin wrapper over spawnSubagent. */