@sheason/pi-coding-agent 0.78.0-sheason.0.6.0-alpha.1 → 0.78.0-sheason.0.6.0-alpha.2
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/dist/core/agent-session-proxy.d.ts +16 -1
- package/dist/core/agent-session-proxy.d.ts.map +1 -1
- package/dist/core/agent-session-proxy.js.map +1 -1
- package/dist/core/local-agent-session-proxy.d.ts.map +1 -1
- package/dist/core/local-agent-session-proxy.js +8 -0
- package/dist/core/local-agent-session-proxy.js.map +1 -1
- package/dist/modes/connect/remote-agent-session-proxy.d.ts +1 -0
- package/dist/modes/connect/remote-agent-session-proxy.d.ts.map +1 -1
- package/dist/modes/connect/remote-agent-session-proxy.js +25 -10
- package/dist/modes/connect/remote-agent-session-proxy.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +46 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentMessage, ThinkingLevel } from "@sheason/pi-agent-core";
|
|
2
|
+
import type { Api } from "@sheason/pi-ai";
|
|
2
3
|
import type { AgentSessionEvent } from "./agent-session.ts";
|
|
3
4
|
import type { SourceInfo } from "./source-info.ts";
|
|
4
5
|
export interface ProxyPromptOptions {
|
|
@@ -90,11 +91,25 @@ export interface ModelInfo {
|
|
|
90
91
|
reasoning: boolean;
|
|
91
92
|
contextWindow: number;
|
|
92
93
|
}
|
|
93
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Model item for remote model selector. Field-compatible with `Model<any>`
|
|
96
|
+
* (the upstream `ScopedModelsSelectorComponent`'s expected input type) so
|
|
97
|
+
* connect-mode callers can cast `ModelItemData[]` to `Model<any>[]` without
|
|
98
|
+
* fabricating missing fields. Fields mirror the relevant subset of
|
|
99
|
+
* `packages/ai/src/types.ts#Model`.
|
|
100
|
+
*/
|
|
94
101
|
export interface ModelItemData {
|
|
95
102
|
id: string;
|
|
96
103
|
name: string;
|
|
97
104
|
provider: string;
|
|
105
|
+
api: Api;
|
|
106
|
+
baseUrl: string;
|
|
107
|
+
cost: {
|
|
108
|
+
input: number;
|
|
109
|
+
output: number;
|
|
110
|
+
cacheRead: number;
|
|
111
|
+
cacheWrite: number;
|
|
112
|
+
};
|
|
98
113
|
reasoning: boolean;
|
|
99
114
|
contextWindow: number;
|
|
100
115
|
maxTokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-proxy.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport interface ProxyPromptOptions {\n\timages?: Array<{ url: string; mediaType?: string }>;\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n}\n\n/** A single keybinding hint entry for the startup banner. */\nexport interface BannerKeyHint {\n\t/** Display text for the key (e.g. \"Ctrl+C\", \"/\", \"!!\") */\n\tkey: string;\n\t/** Description of what the key does (e.g. \"to interrupt\", \"for commands\") */\n\tdescription: string;\n}\n\n/** A loaded resource section (Context, Skills, Prompts, Extensions, Themes). */\nexport interface LoadedResourceSection {\n\t/** Section name (e.g. \"Context\", \"Skills\", \"Prompts\", \"Extensions\", \"Themes\") */\n\tname: string;\n\t/** Compact display (single line, comma-separated) */\n\tcompactList: string;\n\t/** Expanded display (one item per line, with paths) */\n\texpandedList: string;\n}\n\n/** A diagnostic entry for resource conflicts/errors. */\nexport interface ResourceDiagnosticEntry {\n\t/** Diagnostic type */\n\ttype: \"warning\" | \"error\" | \"collision\";\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File path if applicable */\n\tpath?: string;\n\t/** Collision details if type is \"collision\" */\n\tcollision?: {\n\t\tresourceType: \"extension\" | \"skill\" | \"prompt\" | \"theme\";\n\t\tname: string;\n\t\twinnerPath: string;\n\t\tloserPath: string;\n\t\twinnerSource?: string;\n\t\tloserSource?: string;\n\t};\n}\n\n/** Structured banner data, theme-independent so connect clients can render with their own theme. */\nexport interface BannerData {\n\t/** App name */\n\tappName: string;\n\t/** Version string (e.g. \"0.76.0\") */\n\tversion: string;\n\t/** Expanded keybinding hints (shown when banner is expanded) */\n\texpandedHints: BannerKeyHint[];\n\t/** Compact keybinding hints (shown when banner is collapsed) */\n\tcompactHints: BannerKeyHint[];\n\t/** Compact onboarding text */\n\tcompactOnboarding: string;\n\t/** Full onboarding text */\n\tonboarding: string;\n\t/** Loaded resource sections (Context, Skills, Prompts, etc.) */\n\tloadedResources: LoadedResourceSection[];\n\t/** Diagnostics (Skill conflicts, Prompt conflicts, Extension issues, etc.) */\n\tdiagnostics: Array<{\n\t\t/** Section label (e.g. \"Skill conflicts\", \"Prompt conflicts\", \"Extension issues\") */\n\t\tlabel: string;\n\t\t/** Diagnostic entries */\n\t\tentries: ResourceDiagnosticEntry[];\n\t}>;\n\t/** Changelog markdown for \"What's New\" section, or undefined if no new entries */\n\tchangelogMarkdown: string | undefined;\n}\n\n/** Cumulative token usage across all assistant messages in the session. */\nexport interface TokenUsage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tusingSubscription: boolean;\n}\n\n/** Context window usage info for the current branch. */\nexport interface ContextUsageInfo {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\n/** Model details needed by the footer and UI. */\nexport interface ModelInfo {\n\tid: string;\n\tprovider: string;\n\treasoning: boolean;\n\tcontextWindow: number;\n}\n\n/** Model item for remote model selector. */\nexport interface ModelItemData {\n\tid: string;\n\tname: string;\n\tprovider: string;\n\treasoning: boolean;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tinput: (\"text\" | \"image\")[];\n}\n\n/** Settings that can be read and modified remotely via serve mode. */\nexport interface RemoteSettings {\n\tautoCompact: boolean;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: readonly ThinkingLevel[];\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tenableSkillCommands: boolean;\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\t// Extended server-side settings\n\tshowImages: boolean;\n\timageWidthCells: number;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\ttransport: string;\n\thttpIdleTimeoutMs: number;\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tcollapseChangelog: boolean;\n\tenableInstallTelemetry: boolean;\n\ttreeFilterMode: string;\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\twarnings: Record<string, unknown>;\n}\n\n/** Lightweight tree node for wire transport (no full message content). */\nexport interface TreeNodeData {\n\tid: string;\n\ttype: string;\n\tparentId: string | null;\n\ttimestamp: string;\n\tlabel?: string;\n\t/** Preview text for message entries */\n\tpreview?: string;\n\tchildren: TreeNodeData[];\n}\n\n/** User message item for fork selector. */\nexport interface UserMessageItem {\n\tid: string;\n\ttext: string;\n}\n\n/** Session info for session selector. */\nexport interface SessionItemData {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tparentSessionPath?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** Slash command exposed via serve mode for connect mode autocomplete. */\nexport interface ServeSlashCommand {\n\t/** Command name (without leading slash) */\n\tname: string;\n\t/** Human-readable description */\n\tdescription?: string;\n\t/** Argument hint (e.g. \"<provider/model-id>\") */\n\targumentHint?: string;\n\t/** What kind of command this is */\n\tsource: \"builtin\" | \"extension\" | \"prompt\" | \"skill\";\n\t/** Source metadata (absent for builtin commands) */\n\tsourceInfo?: SourceInfo;\n}\n\nexport interface SessionStateSnapshot {\n\tmodel: string;\n\tthinkingLevel: ThinkingLevel;\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tisBashRunning: boolean;\n\tsteeringMessages: readonly string[];\n\tfollowUpMessages: readonly string[];\n\tsessionFile: string | undefined;\n\tsessionName: string | undefined;\n\tmessages: readonly AgentMessage[];\n\tbanner: BannerData | undefined;\n\ttokenUsage: TokenUsage;\n\tcontextUsage: ContextUsageInfo;\n\tmodelInfo: ModelInfo;\n\tautoCompactEnabled: boolean;\n\tcwd: string;\n\tavailableProviderCount: number;\n\tremoteSettings: RemoteSettings;\n\t/** Currently scoped model IDs for Ctrl+P cycling (null = all enabled) */\n\tscopedModelIds: string[] | null;\n\t/** Persisted enabled model patterns from settings */\n\tenabledModelPatterns: string[] | undefined;\n\t/** Extension paths loaded on the server — client can load the same extensions for UI */\n\textensionPaths: string[];\n}\n\nexport interface AgentSessionProxy {\n\t// Event subscription\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void;\n\n\t// Commands\n\tprompt(text: string, options?: ProxyPromptOptions): Promise<void>;\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tabort(): void;\n\tabortBash(): void;\n\n\t// State queries\n\treadonly model: string;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly isStreaming: boolean;\n\treadonly isCompacting: boolean;\n\treadonly isBashRunning: boolean;\n\treadonly steeringMessages: readonly string[];\n\treadonly followUpMessages: readonly string[];\n\treadonly sessionFile: string | undefined;\n\treadonly sessionName: string | undefined;\n\treadonly messages: readonly AgentMessage[];\n\n\t// Session operations\n\tcompact(customInstructions?: string): Promise<void>;\n\tsetModel(modelId: string): void;\n\tcycleModel(direction: 1 | -1): void;\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\tcycleThinkingLevel(direction: 1 | -1): void;\n\tsetAutoCompactEnabled(enabled: boolean): void;\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\n\t// Runtime operations\n\tnewSession(): Promise<void>;\n\tswitchSession(sessionFile: string): Promise<void>;\n\tfork(entryId?: string): Promise<void>;\n\trenameSession(name: string): void;\n\tsetLabel(entryId: string, label: string | undefined): void;\n\treload(): Promise<void>;\n\n\t// Scoped model management\n\tsetScopedModels(enabledIds: string[] | null): void;\n\tsetEnabledModels(patterns: string[] | undefined): void;\n\n\t/** Generic settings update — applies a batch of key/value pairs to the server's SettingsManager */\n\tupdateSettings(updates: Record<string, unknown>): void;\n\n\t// Data queries (for connect mode selectors)\n\tgetTree(): TreeNodeData[];\n\tgetUserMessagesForForking(): UserMessageItem[];\n\tgetSessions(): Promise<SessionItemData[]>;\n\n\t/** Async variants for remote proxies — local impl wraps sync methods */\n\tfetchTree(): Promise<TreeNodeData[]>;\n\tfetchUserMessages(): Promise<UserMessageItem[]>;\n\tfetchCommands(): Promise<ServeSlashCommand[]>;\n\tfetchModels(): Promise<ModelItemData[]>;\n\n\t// Command discovery\n\tgetCommands(): ServeSlashCommand[];\n\n\t// Model discovery\n\tgetModels(): ModelItemData[];\n\n\t// Lifecycle\n\tdispose(): void;\n\n\t// Snapshot\n\tgetSnapshot(): SessionStateSnapshot;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-proxy.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { Api } from \"@sheason/pi-ai\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport interface ProxyPromptOptions {\n\timages?: Array<{ url: string; mediaType?: string }>;\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n}\n\n/** A single keybinding hint entry for the startup banner. */\nexport interface BannerKeyHint {\n\t/** Display text for the key (e.g. \"Ctrl+C\", \"/\", \"!!\") */\n\tkey: string;\n\t/** Description of what the key does (e.g. \"to interrupt\", \"for commands\") */\n\tdescription: string;\n}\n\n/** A loaded resource section (Context, Skills, Prompts, Extensions, Themes). */\nexport interface LoadedResourceSection {\n\t/** Section name (e.g. \"Context\", \"Skills\", \"Prompts\", \"Extensions\", \"Themes\") */\n\tname: string;\n\t/** Compact display (single line, comma-separated) */\n\tcompactList: string;\n\t/** Expanded display (one item per line, with paths) */\n\texpandedList: string;\n}\n\n/** A diagnostic entry for resource conflicts/errors. */\nexport interface ResourceDiagnosticEntry {\n\t/** Diagnostic type */\n\ttype: \"warning\" | \"error\" | \"collision\";\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File path if applicable */\n\tpath?: string;\n\t/** Collision details if type is \"collision\" */\n\tcollision?: {\n\t\tresourceType: \"extension\" | \"skill\" | \"prompt\" | \"theme\";\n\t\tname: string;\n\t\twinnerPath: string;\n\t\tloserPath: string;\n\t\twinnerSource?: string;\n\t\tloserSource?: string;\n\t};\n}\n\n/** Structured banner data, theme-independent so connect clients can render with their own theme. */\nexport interface BannerData {\n\t/** App name */\n\tappName: string;\n\t/** Version string (e.g. \"0.76.0\") */\n\tversion: string;\n\t/** Expanded keybinding hints (shown when banner is expanded) */\n\texpandedHints: BannerKeyHint[];\n\t/** Compact keybinding hints (shown when banner is collapsed) */\n\tcompactHints: BannerKeyHint[];\n\t/** Compact onboarding text */\n\tcompactOnboarding: string;\n\t/** Full onboarding text */\n\tonboarding: string;\n\t/** Loaded resource sections (Context, Skills, Prompts, etc.) */\n\tloadedResources: LoadedResourceSection[];\n\t/** Diagnostics (Skill conflicts, Prompt conflicts, Extension issues, etc.) */\n\tdiagnostics: Array<{\n\t\t/** Section label (e.g. \"Skill conflicts\", \"Prompt conflicts\", \"Extension issues\") */\n\t\tlabel: string;\n\t\t/** Diagnostic entries */\n\t\tentries: ResourceDiagnosticEntry[];\n\t}>;\n\t/** Changelog markdown for \"What's New\" section, or undefined if no new entries */\n\tchangelogMarkdown: string | undefined;\n}\n\n/** Cumulative token usage across all assistant messages in the session. */\nexport interface TokenUsage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tusingSubscription: boolean;\n}\n\n/** Context window usage info for the current branch. */\nexport interface ContextUsageInfo {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\n/** Model details needed by the footer and UI. */\nexport interface ModelInfo {\n\tid: string;\n\tprovider: string;\n\treasoning: boolean;\n\tcontextWindow: number;\n}\n\n/**\n * Model item for remote model selector. Field-compatible with `Model<any>`\n * (the upstream `ScopedModelsSelectorComponent`'s expected input type) so\n * connect-mode callers can cast `ModelItemData[]` to `Model<any>[]` without\n * fabricating missing fields. Fields mirror the relevant subset of\n * `packages/ai/src/types.ts#Model`.\n */\nexport interface ModelItemData {\n\tid: string;\n\tname: string;\n\tprovider: string;\n\tapi: Api;\n\tbaseUrl: string;\n\tcost: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t};\n\treasoning: boolean;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tinput: (\"text\" | \"image\")[];\n}\n\n/** Settings that can be read and modified remotely via serve mode. */\nexport interface RemoteSettings {\n\tautoCompact: boolean;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: readonly ThinkingLevel[];\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tenableSkillCommands: boolean;\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\t// Extended server-side settings\n\tshowImages: boolean;\n\timageWidthCells: number;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\ttransport: string;\n\thttpIdleTimeoutMs: number;\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tcollapseChangelog: boolean;\n\tenableInstallTelemetry: boolean;\n\ttreeFilterMode: string;\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\twarnings: Record<string, unknown>;\n}\n\n/** Lightweight tree node for wire transport (no full message content). */\nexport interface TreeNodeData {\n\tid: string;\n\ttype: string;\n\tparentId: string | null;\n\ttimestamp: string;\n\tlabel?: string;\n\t/** Preview text for message entries */\n\tpreview?: string;\n\tchildren: TreeNodeData[];\n}\n\n/** User message item for fork selector. */\nexport interface UserMessageItem {\n\tid: string;\n\ttext: string;\n}\n\n/** Session info for session selector. */\nexport interface SessionItemData {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tparentSessionPath?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** Slash command exposed via serve mode for connect mode autocomplete. */\nexport interface ServeSlashCommand {\n\t/** Command name (without leading slash) */\n\tname: string;\n\t/** Human-readable description */\n\tdescription?: string;\n\t/** Argument hint (e.g. \"<provider/model-id>\") */\n\targumentHint?: string;\n\t/** What kind of command this is */\n\tsource: \"builtin\" | \"extension\" | \"prompt\" | \"skill\";\n\t/** Source metadata (absent for builtin commands) */\n\tsourceInfo?: SourceInfo;\n}\n\nexport interface SessionStateSnapshot {\n\tmodel: string;\n\tthinkingLevel: ThinkingLevel;\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tisBashRunning: boolean;\n\tsteeringMessages: readonly string[];\n\tfollowUpMessages: readonly string[];\n\tsessionFile: string | undefined;\n\tsessionName: string | undefined;\n\tmessages: readonly AgentMessage[];\n\tbanner: BannerData | undefined;\n\ttokenUsage: TokenUsage;\n\tcontextUsage: ContextUsageInfo;\n\tmodelInfo: ModelInfo;\n\tautoCompactEnabled: boolean;\n\tcwd: string;\n\tavailableProviderCount: number;\n\tremoteSettings: RemoteSettings;\n\t/** Currently scoped model IDs for Ctrl+P cycling (null = all enabled) */\n\tscopedModelIds: string[] | null;\n\t/** Persisted enabled model patterns from settings */\n\tenabledModelPatterns: string[] | undefined;\n\t/** Extension paths loaded on the server — client can load the same extensions for UI */\n\textensionPaths: string[];\n}\n\nexport interface AgentSessionProxy {\n\t// Event subscription\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void;\n\n\t// Commands\n\tprompt(text: string, options?: ProxyPromptOptions): Promise<void>;\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tabort(): void;\n\tabortBash(): void;\n\n\t// State queries\n\treadonly model: string;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly isStreaming: boolean;\n\treadonly isCompacting: boolean;\n\treadonly isBashRunning: boolean;\n\treadonly steeringMessages: readonly string[];\n\treadonly followUpMessages: readonly string[];\n\treadonly sessionFile: string | undefined;\n\treadonly sessionName: string | undefined;\n\treadonly messages: readonly AgentMessage[];\n\n\t// Session operations\n\tcompact(customInstructions?: string): Promise<void>;\n\tsetModel(modelId: string): void;\n\tcycleModel(direction: 1 | -1): void;\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\tcycleThinkingLevel(direction: 1 | -1): void;\n\tsetAutoCompactEnabled(enabled: boolean): void;\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\n\t// Runtime operations\n\tnewSession(): Promise<void>;\n\tswitchSession(sessionFile: string): Promise<void>;\n\tfork(entryId?: string): Promise<void>;\n\trenameSession(name: string): void;\n\tsetLabel(entryId: string, label: string | undefined): void;\n\treload(): Promise<void>;\n\n\t// Scoped model management\n\tsetScopedModels(enabledIds: string[] | null): void;\n\tsetEnabledModels(patterns: string[] | undefined): void;\n\n\t/** Generic settings update — applies a batch of key/value pairs to the server's SettingsManager */\n\tupdateSettings(updates: Record<string, unknown>): void;\n\n\t// Data queries (for connect mode selectors)\n\tgetTree(): TreeNodeData[];\n\tgetUserMessagesForForking(): UserMessageItem[];\n\tgetSessions(): Promise<SessionItemData[]>;\n\n\t/** Async variants for remote proxies — local impl wraps sync methods */\n\tfetchTree(): Promise<TreeNodeData[]>;\n\tfetchUserMessages(): Promise<UserMessageItem[]>;\n\tfetchCommands(): Promise<ServeSlashCommand[]>;\n\tfetchModels(): Promise<ModelItemData[]>;\n\n\t// Command discovery\n\tgetCommands(): ServeSlashCommand[];\n\n\t// Model discovery\n\tgetModels(): ModelItemData[];\n\n\t// Lifecycle\n\tdispose(): void;\n\n\t// Snapshot\n\tgetSnapshot(): SessionStateSnapshot;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-proxy.js","sourceRoot":"","sources":["../../src/core/agent-session-proxy.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport interface ProxyPromptOptions {\n\timages?: Array<{ url: string; mediaType?: string }>;\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n}\n\n/** A single keybinding hint entry for the startup banner. */\nexport interface BannerKeyHint {\n\t/** Display text for the key (e.g. \"Ctrl+C\", \"/\", \"!!\") */\n\tkey: string;\n\t/** Description of what the key does (e.g. \"to interrupt\", \"for commands\") */\n\tdescription: string;\n}\n\n/** A loaded resource section (Context, Skills, Prompts, Extensions, Themes). */\nexport interface LoadedResourceSection {\n\t/** Section name (e.g. \"Context\", \"Skills\", \"Prompts\", \"Extensions\", \"Themes\") */\n\tname: string;\n\t/** Compact display (single line, comma-separated) */\n\tcompactList: string;\n\t/** Expanded display (one item per line, with paths) */\n\texpandedList: string;\n}\n\n/** A diagnostic entry for resource conflicts/errors. */\nexport interface ResourceDiagnosticEntry {\n\t/** Diagnostic type */\n\ttype: \"warning\" | \"error\" | \"collision\";\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File path if applicable */\n\tpath?: string;\n\t/** Collision details if type is \"collision\" */\n\tcollision?: {\n\t\tresourceType: \"extension\" | \"skill\" | \"prompt\" | \"theme\";\n\t\tname: string;\n\t\twinnerPath: string;\n\t\tloserPath: string;\n\t\twinnerSource?: string;\n\t\tloserSource?: string;\n\t};\n}\n\n/** Structured banner data, theme-independent so connect clients can render with their own theme. */\nexport interface BannerData {\n\t/** App name */\n\tappName: string;\n\t/** Version string (e.g. \"0.76.0\") */\n\tversion: string;\n\t/** Expanded keybinding hints (shown when banner is expanded) */\n\texpandedHints: BannerKeyHint[];\n\t/** Compact keybinding hints (shown when banner is collapsed) */\n\tcompactHints: BannerKeyHint[];\n\t/** Compact onboarding text */\n\tcompactOnboarding: string;\n\t/** Full onboarding text */\n\tonboarding: string;\n\t/** Loaded resource sections (Context, Skills, Prompts, etc.) */\n\tloadedResources: LoadedResourceSection[];\n\t/** Diagnostics (Skill conflicts, Prompt conflicts, Extension issues, etc.) */\n\tdiagnostics: Array<{\n\t\t/** Section label (e.g. \"Skill conflicts\", \"Prompt conflicts\", \"Extension issues\") */\n\t\tlabel: string;\n\t\t/** Diagnostic entries */\n\t\tentries: ResourceDiagnosticEntry[];\n\t}>;\n\t/** Changelog markdown for \"What's New\" section, or undefined if no new entries */\n\tchangelogMarkdown: string | undefined;\n}\n\n/** Cumulative token usage across all assistant messages in the session. */\nexport interface TokenUsage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tusingSubscription: boolean;\n}\n\n/** Context window usage info for the current branch. */\nexport interface ContextUsageInfo {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\n/** Model details needed by the footer and UI. */\nexport interface ModelInfo {\n\tid: string;\n\tprovider: string;\n\treasoning: boolean;\n\tcontextWindow: number;\n}\n\n
|
|
1
|
+
{"version":3,"file":"agent-session-proxy.js","sourceRoot":"","sources":["../../src/core/agent-session-proxy.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { Api } from \"@sheason/pi-ai\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport interface ProxyPromptOptions {\n\timages?: Array<{ url: string; mediaType?: string }>;\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n}\n\n/** A single keybinding hint entry for the startup banner. */\nexport interface BannerKeyHint {\n\t/** Display text for the key (e.g. \"Ctrl+C\", \"/\", \"!!\") */\n\tkey: string;\n\t/** Description of what the key does (e.g. \"to interrupt\", \"for commands\") */\n\tdescription: string;\n}\n\n/** A loaded resource section (Context, Skills, Prompts, Extensions, Themes). */\nexport interface LoadedResourceSection {\n\t/** Section name (e.g. \"Context\", \"Skills\", \"Prompts\", \"Extensions\", \"Themes\") */\n\tname: string;\n\t/** Compact display (single line, comma-separated) */\n\tcompactList: string;\n\t/** Expanded display (one item per line, with paths) */\n\texpandedList: string;\n}\n\n/** A diagnostic entry for resource conflicts/errors. */\nexport interface ResourceDiagnosticEntry {\n\t/** Diagnostic type */\n\ttype: \"warning\" | \"error\" | \"collision\";\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File path if applicable */\n\tpath?: string;\n\t/** Collision details if type is \"collision\" */\n\tcollision?: {\n\t\tresourceType: \"extension\" | \"skill\" | \"prompt\" | \"theme\";\n\t\tname: string;\n\t\twinnerPath: string;\n\t\tloserPath: string;\n\t\twinnerSource?: string;\n\t\tloserSource?: string;\n\t};\n}\n\n/** Structured banner data, theme-independent so connect clients can render with their own theme. */\nexport interface BannerData {\n\t/** App name */\n\tappName: string;\n\t/** Version string (e.g. \"0.76.0\") */\n\tversion: string;\n\t/** Expanded keybinding hints (shown when banner is expanded) */\n\texpandedHints: BannerKeyHint[];\n\t/** Compact keybinding hints (shown when banner is collapsed) */\n\tcompactHints: BannerKeyHint[];\n\t/** Compact onboarding text */\n\tcompactOnboarding: string;\n\t/** Full onboarding text */\n\tonboarding: string;\n\t/** Loaded resource sections (Context, Skills, Prompts, etc.) */\n\tloadedResources: LoadedResourceSection[];\n\t/** Diagnostics (Skill conflicts, Prompt conflicts, Extension issues, etc.) */\n\tdiagnostics: Array<{\n\t\t/** Section label (e.g. \"Skill conflicts\", \"Prompt conflicts\", \"Extension issues\") */\n\t\tlabel: string;\n\t\t/** Diagnostic entries */\n\t\tentries: ResourceDiagnosticEntry[];\n\t}>;\n\t/** Changelog markdown for \"What's New\" section, or undefined if no new entries */\n\tchangelogMarkdown: string | undefined;\n}\n\n/** Cumulative token usage across all assistant messages in the session. */\nexport interface TokenUsage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tusingSubscription: boolean;\n}\n\n/** Context window usage info for the current branch. */\nexport interface ContextUsageInfo {\n\ttokens: number | null;\n\tcontextWindow: number;\n\tpercent: number | null;\n}\n\n/** Model details needed by the footer and UI. */\nexport interface ModelInfo {\n\tid: string;\n\tprovider: string;\n\treasoning: boolean;\n\tcontextWindow: number;\n}\n\n/**\n * Model item for remote model selector. Field-compatible with `Model<any>`\n * (the upstream `ScopedModelsSelectorComponent`'s expected input type) so\n * connect-mode callers can cast `ModelItemData[]` to `Model<any>[]` without\n * fabricating missing fields. Fields mirror the relevant subset of\n * `packages/ai/src/types.ts#Model`.\n */\nexport interface ModelItemData {\n\tid: string;\n\tname: string;\n\tprovider: string;\n\tapi: Api;\n\tbaseUrl: string;\n\tcost: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t};\n\treasoning: boolean;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tinput: (\"text\" | \"image\")[];\n}\n\n/** Settings that can be read and modified remotely via serve mode. */\nexport interface RemoteSettings {\n\tautoCompact: boolean;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: readonly ThinkingLevel[];\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\tenableSkillCommands: boolean;\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\t// Extended server-side settings\n\tshowImages: boolean;\n\timageWidthCells: number;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\ttransport: string;\n\thttpIdleTimeoutMs: number;\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tcollapseChangelog: boolean;\n\tenableInstallTelemetry: boolean;\n\ttreeFilterMode: string;\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\twarnings: Record<string, unknown>;\n}\n\n/** Lightweight tree node for wire transport (no full message content). */\nexport interface TreeNodeData {\n\tid: string;\n\ttype: string;\n\tparentId: string | null;\n\ttimestamp: string;\n\tlabel?: string;\n\t/** Preview text for message entries */\n\tpreview?: string;\n\tchildren: TreeNodeData[];\n}\n\n/** User message item for fork selector. */\nexport interface UserMessageItem {\n\tid: string;\n\ttext: string;\n}\n\n/** Session info for session selector. */\nexport interface SessionItemData {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tparentSessionPath?: string;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n}\n\n/** Slash command exposed via serve mode for connect mode autocomplete. */\nexport interface ServeSlashCommand {\n\t/** Command name (without leading slash) */\n\tname: string;\n\t/** Human-readable description */\n\tdescription?: string;\n\t/** Argument hint (e.g. \"<provider/model-id>\") */\n\targumentHint?: string;\n\t/** What kind of command this is */\n\tsource: \"builtin\" | \"extension\" | \"prompt\" | \"skill\";\n\t/** Source metadata (absent for builtin commands) */\n\tsourceInfo?: SourceInfo;\n}\n\nexport interface SessionStateSnapshot {\n\tmodel: string;\n\tthinkingLevel: ThinkingLevel;\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tisBashRunning: boolean;\n\tsteeringMessages: readonly string[];\n\tfollowUpMessages: readonly string[];\n\tsessionFile: string | undefined;\n\tsessionName: string | undefined;\n\tmessages: readonly AgentMessage[];\n\tbanner: BannerData | undefined;\n\ttokenUsage: TokenUsage;\n\tcontextUsage: ContextUsageInfo;\n\tmodelInfo: ModelInfo;\n\tautoCompactEnabled: boolean;\n\tcwd: string;\n\tavailableProviderCount: number;\n\tremoteSettings: RemoteSettings;\n\t/** Currently scoped model IDs for Ctrl+P cycling (null = all enabled) */\n\tscopedModelIds: string[] | null;\n\t/** Persisted enabled model patterns from settings */\n\tenabledModelPatterns: string[] | undefined;\n\t/** Extension paths loaded on the server — client can load the same extensions for UI */\n\textensionPaths: string[];\n}\n\nexport interface AgentSessionProxy {\n\t// Event subscription\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void;\n\n\t// Commands\n\tprompt(text: string, options?: ProxyPromptOptions): Promise<void>;\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void;\n\tabort(): void;\n\tabortBash(): void;\n\n\t// State queries\n\treadonly model: string;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly isStreaming: boolean;\n\treadonly isCompacting: boolean;\n\treadonly isBashRunning: boolean;\n\treadonly steeringMessages: readonly string[];\n\treadonly followUpMessages: readonly string[];\n\treadonly sessionFile: string | undefined;\n\treadonly sessionName: string | undefined;\n\treadonly messages: readonly AgentMessage[];\n\n\t// Session operations\n\tcompact(customInstructions?: string): Promise<void>;\n\tsetModel(modelId: string): void;\n\tcycleModel(direction: 1 | -1): void;\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\tcycleThinkingLevel(direction: 1 | -1): void;\n\tsetAutoCompactEnabled(enabled: boolean): void;\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\n\t// Runtime operations\n\tnewSession(): Promise<void>;\n\tswitchSession(sessionFile: string): Promise<void>;\n\tfork(entryId?: string): Promise<void>;\n\trenameSession(name: string): void;\n\tsetLabel(entryId: string, label: string | undefined): void;\n\treload(): Promise<void>;\n\n\t// Scoped model management\n\tsetScopedModels(enabledIds: string[] | null): void;\n\tsetEnabledModels(patterns: string[] | undefined): void;\n\n\t/** Generic settings update — applies a batch of key/value pairs to the server's SettingsManager */\n\tupdateSettings(updates: Record<string, unknown>): void;\n\n\t// Data queries (for connect mode selectors)\n\tgetTree(): TreeNodeData[];\n\tgetUserMessagesForForking(): UserMessageItem[];\n\tgetSessions(): Promise<SessionItemData[]>;\n\n\t/** Async variants for remote proxies — local impl wraps sync methods */\n\tfetchTree(): Promise<TreeNodeData[]>;\n\tfetchUserMessages(): Promise<UserMessageItem[]>;\n\tfetchCommands(): Promise<ServeSlashCommand[]>;\n\tfetchModels(): Promise<ModelItemData[]>;\n\n\t// Command discovery\n\tgetCommands(): ServeSlashCommand[];\n\n\t// Model discovery\n\tgetModels(): ModelItemData[];\n\n\t// Lifecycle\n\tdispose(): void;\n\n\t// Snapshot\n\tgetSnapshot(): SessionStateSnapshot;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-agent-session-proxy.d.ts","sourceRoot":"","sources":["../../src/core/local-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { ImageContent } from \"@sheason/pi-ai\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tBannerData,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"./agent-session-proxy.ts\";\nimport type { AgentSessionRuntime } from \"./agent-session-runtime.ts\";\nimport { BUILTIN_SLASH_COMMANDS } from \"./slash-commands.ts\";\n\n/**\n * Convert proxy-style image format ({ url, mediaType }) to the ImageContent\n * format expected by AgentSession ({ type, data, mimeType }).\n *\n * Supports:\n * - data URLs: data:image/png;base64,iVBOR... -> { type: \"image\", data: \"iVBOR...\", mimeType: \"image/png\" }\n * - bare base64 with mediaType: { url: \"<base64>\", mediaType: \"image/png\" }\n */\nfunction toImageContent(images: Array<{ url: string; mediaType?: string }>): ImageContent[] {\n\treturn images.map(({ url, mediaType }): ImageContent => {\n\t\t// Data URL: data:<mimeType>;base64,<data>\n\t\tconst dataUrlMatch = url.match(/^data:([^;]+);base64,(.+)$/s);\n\t\tif (dataUrlMatch) {\n\t\t\treturn { type: \"image\", data: dataUrlMatch[2], mimeType: dataUrlMatch[1] };\n\t\t}\n\t\t// Bare base64 — mediaType is required\n\t\tif (mediaType) {\n\t\t\treturn { type: \"image\", data: url, mimeType: mediaType };\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot convert image: URL is not a data URL and no mediaType provided. ` +\n\t\t\t\t`LocalAgentSessionProxy only supports data-URL images or base64 with explicit mediaType.`,\n\t\t);\n\t});\n}\n\n/**\n * Local implementation of AgentSessionProxy that wraps an in-process\n * AgentSession + AgentSessionRuntime.\n *\n * Used by serve mode (and could be used by interactive mode in the future).\n */\nexport class LocalAgentSessionProxy implements AgentSessionProxy {\n\tprivate readonly _runtime: AgentSessionRuntime;\n\tprivate _banner: BannerData | undefined;\n\t/** Listeners registered through this proxy — re-subscribed when the session changes */\n\tprivate _proxyListeners: Array<(event: AgentSessionEvent) => void> = [];\n\tprivate _sessionUnsubscribe: (() => void) | undefined;\n\n\tconstructor(runtime: AgentSessionRuntime) {\n\t\tthis._runtime = runtime;\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session and emit session_replaced */\n\tresubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._resubscribe(reason);\n\t}\n\n\t/** Called by the host mode to wire up the rebindSession callback */\n\tinstallRebindCallback(): void {\n\t\tthis._runtime.setRebindSession(async (_session, reason) => {\n\t\t\tthis._resubscribe(reason);\n\t\t});\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session */\n\tprivate _resubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._sessionUnsubscribe?.();\n\t\tthis._sessionUnsubscribe = undefined;\n\t\tif (this._proxyListeners.length === 0) return;\n\t\tconst session = this._runtime.session;\n\t\tconst combinedListener = (event: AgentSessionEvent) => {\n\t\t\tfor (const listener of this._proxyListeners) {\n\t\t\t\tlistener(event);\n\t\t\t}\n\t\t};\n\t\tthis._sessionUnsubscribe = session.subscribe(combinedListener);\n\t\t// Notify listeners that the session was replaced so they can reset UI\n\t\tfor (const listener of this._proxyListeners) {\n\t\t\tlistener({ type: \"session_replaced\", reason });\n\t\t}\n\t}\n\n\t/** Set the banner data (called by serve mode after initialization) */\n\tsetBanner(banner: BannerData | undefined): void {\n\t\tthis._banner = banner;\n\t}\n\n\tprivate get session(): AgentSession {\n\t\treturn this._runtime.session;\n\t}\n\n\t// =========================================================================\n\t// Event subscription\n\t// =========================================================================\n\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void {\n\t\tthis._proxyListeners.push(listener);\n\t\t// If this is the first listener, subscribe to the session\n\t\tif (this._proxyListeners.length === 1) {\n\t\t\tthis._resubscribe();\n\t\t}\n\t\treturn () => {\n\t\t\tconst index = this._proxyListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._proxyListeners.splice(index, 1);\n\t\t\t}\n\t\t\t// If no more listeners, unsubscribe from session\n\t\t\tif (this._proxyListeners.length === 0) {\n\t\t\t\tthis._sessionUnsubscribe?.();\n\t\t\t\tthis._sessionUnsubscribe = undefined;\n\t\t\t}\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Commands\n\t// =========================================================================\n\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tconst images = options?.images ? toImageContent(options.images) : undefined;\n\t\tawait this.session.prompt(text, { images, streamingBehavior: options?.streamingBehavior });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.steer() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.steer(text, converted);\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.followUp() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.followUp(text, converted);\n\t}\n\n\tabort(): void {\n\t\t// AgentSession.abort() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.abort();\n\t}\n\n\tabortBash(): void {\n\t\tthis.session.abortBash();\n\t}\n\n\t// =========================================================================\n\t// State queries\n\t// =========================================================================\n\n\tget model(): string {\n\t\treturn this.session.model?.id ?? \"\";\n\t}\n\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.session.thinkingLevel;\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.session.isStreaming;\n\t}\n\n\tget isCompacting(): boolean {\n\t\treturn this.session.isCompacting;\n\t}\n\n\tget isBashRunning(): boolean {\n\t\treturn this.session.isBashRunning;\n\t}\n\n\tget steeringMessages(): readonly string[] {\n\t\treturn this.session.getSteeringMessages();\n\t}\n\n\tget followUpMessages(): readonly string[] {\n\t\treturn this.session.getFollowUpMessages();\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.session.sessionFile;\n\t}\n\n\tget sessionName(): string | undefined {\n\t\treturn this.session.sessionName;\n\t}\n\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this.session.messages;\n\t}\n\n\t// =========================================================================\n\t// Session operations\n\t// =========================================================================\n\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this.session.compact(customInstructions);\n\t}\n\n\tsetModel(modelId: string): void {\n\t\t// AgentSession.setModel() takes a Model<any> object, not a string.\n\t\t// Look up the model by ID from the model registry.\n\t\tconst registry = this.session.modelRegistry;\n\t\tconst available = registry.getAvailable();\n\n\t\t// Try \"provider/modelId\" format first\n\t\tconst slashIndex = modelId.indexOf(\"/\");\n\t\tlet model: ReturnType<typeof available.find> | undefined;\n\t\tif (slashIndex !== -1) {\n\t\t\tconst provider = modelId.slice(0, slashIndex);\n\t\t\tconst id = modelId.slice(slashIndex + 1);\n\t\t\tmodel = registry.find(provider, id);\n\t\t}\n\n\t\t// Fallback: search by model ID alone\n\t\tif (!model) {\n\t\t\tmodel = available.find((m) => m.id === modelId);\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthrow new Error(`Model not found: ${modelId}`);\n\t\t}\n\n\t\t// AgentSession.setModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.setModel(model);\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tconst dir = direction === 1 ? \"forward\" : \"backward\";\n\t\t// AgentSession.cycleModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.cycleModel(dir);\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis.session.setThinkingLevel(level);\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\t// AgentSession.cycleThinkingLevel() takes no arguments and cycles forward.\n\t\t// Implement directional cycling manually.\n\t\tconst levels = this.session.getAvailableThinkingLevels();\n\t\tif (levels.length === 0) return;\n\n\t\tconst currentIndex = levels.indexOf(this.session.thinkingLevel);\n\t\tconst len = levels.length;\n\t\tconst nextIndex = direction === 1 ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\n\t\tthis.session.setThinkingLevel(levels[nextIndex]);\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.session.setAutoCompactionEnabled(enabled);\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setSteeringMode(mode);\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setFollowUpMode(mode);\n\t}\n\n\t// =========================================================================\n\t// Runtime operations\n\t// =========================================================================\n\n\tasync newSession(): Promise<void> {\n\t\tawait this._runtime.newSession();\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._runtime.switchSession(sessionFile);\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._runtime.fork(entryId ?? \"\");\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis.session.sessionManager.appendSessionInfo(name);\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis.session.sessionManager.appendLabelChange(entryId, label);\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tif (enabledIds && enabledIds.length > 0) {\n\t\t\tconst allModels = this.session.modelRegistry.getAvailable();\n\t\t\tconst enabledSet = new Set(enabledIds);\n\t\t\tconst scoped = allModels.filter((m) => enabledSet.has(`${m.provider}/${m.id}`));\n\t\t\tthis.session.setScopedModels(scoped.map((m) => ({ model: m })));\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis.session.settingsManager.setEnabledModels(patterns);\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tconst sm = this.session.settingsManager;\n\t\tif (\"showImages\" in updates && typeof updates.showImages === \"boolean\") sm.setShowImages(updates.showImages);\n\t\tif (\"imageWidthCells\" in updates && typeof updates.imageWidthCells === \"number\")\n\t\t\tsm.setImageWidthCells(updates.imageWidthCells);\n\t\tif (\"autoResizeImages\" in updates && typeof updates.autoResizeImages === \"boolean\")\n\t\t\tsm.setImageAutoResize(updates.autoResizeImages);\n\t\tif (\"blockImages\" in updates && typeof updates.blockImages === \"boolean\") sm.setBlockImages(updates.blockImages);\n\t\tif (\"enableSkillCommands\" in updates && typeof updates.enableSkillCommands === \"boolean\")\n\t\t\tsm.setEnableSkillCommands(updates.enableSkillCommands);\n\t\tif (\"transport\" in updates && typeof updates.transport === \"string\") sm.setTransport(updates.transport as any);\n\t\tif (\"httpIdleTimeoutMs\" in updates && typeof updates.httpIdleTimeoutMs === \"number\")\n\t\t\tsm.setHttpIdleTimeoutMs(updates.httpIdleTimeoutMs);\n\t\tif (\"theme\" in updates && typeof updates.theme === \"string\") sm.setTheme(updates.theme);\n\t\tif (\"hideThinkingBlock\" in updates && typeof updates.hideThinkingBlock === \"boolean\")\n\t\t\tsm.setHideThinkingBlock(updates.hideThinkingBlock);\n\t\tif (\"collapseChangelog\" in updates && typeof updates.collapseChangelog === \"boolean\")\n\t\t\tsm.setCollapseChangelog(updates.collapseChangelog);\n\t\tif (\"enableInstallTelemetry\" in updates && typeof updates.enableInstallTelemetry === \"boolean\")\n\t\t\tsm.setEnableInstallTelemetry(updates.enableInstallTelemetry);\n\t\tif (\"doubleEscapeAction\" in updates && typeof updates.doubleEscapeAction === \"string\")\n\t\t\tsm.setDoubleEscapeAction(updates.doubleEscapeAction as any);\n\t\tif (\"treeFilterMode\" in updates && typeof updates.treeFilterMode === \"string\")\n\t\t\tsm.setTreeFilterMode(updates.treeFilterMode as any);\n\t\tif (\"showHardwareCursor\" in updates && typeof updates.showHardwareCursor === \"boolean\")\n\t\t\tsm.setShowHardwareCursor(updates.showHardwareCursor);\n\t\tif (\"editorPaddingX\" in updates && typeof updates.editorPaddingX === \"number\")\n\t\t\tsm.setEditorPaddingX(updates.editorPaddingX);\n\t\tif (\"autocompleteMaxVisible\" in updates && typeof updates.autocompleteMaxVisible === \"number\")\n\t\t\tsm.setAutocompleteMaxVisible(updates.autocompleteMaxVisible);\n\t\tif (\"quietStartup\" in updates && typeof updates.quietStartup === \"boolean\")\n\t\t\tsm.setQuietStartup(updates.quietStartup);\n\t\tif (\"clearOnShrink\" in updates && typeof updates.clearOnShrink === \"boolean\")\n\t\t\tsm.setClearOnShrink(updates.clearOnShrink);\n\t\tif (\"showTerminalProgress\" in updates && typeof updates.showTerminalProgress === \"boolean\")\n\t\t\tsm.setShowTerminalProgress(updates.showTerminalProgress);\n\t\tif (\"warnings\" in updates && typeof updates.warnings === \"object\" && updates.warnings !== null)\n\t\t\tsm.setWarnings(updates.warnings as any);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.session.reload();\n\t}\n\n\tgetTree(): TreeNodeData[] {\n\t\tconst tree = this.session.sessionManager.getTree();\n\t\treturn tree.map((node) => this._convertTreeNode(node));\n\t}\n\n\tprivate _convertTreeNode(node: {\n\t\tentry: { id: string; type: string; parentId: string | null; timestamp: string };\n\t\tchildren: unknown[];\n\t\tlabel?: string;\n\t}): TreeNodeData {\n\t\tlet preview: string | undefined;\n\t\tconst entry = node.entry;\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msg = (\n\t\t\t\tentry as unknown as {\n\t\t\t\t\ttype: \"message\";\n\t\t\t\t\tmessage: { role: string; content: string | Array<{ type: string; text?: string }> };\n\t\t\t\t}\n\t\t\t).message;\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\tpreview =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content.slice(0, 80)\n\t\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t\t.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n\t\t\t\t\t\t\t\t.map((p) => p.text)\n\t\t\t\t\t\t\t\t.join(\" \")\n\t\t\t\t\t\t\t\t.slice(0, 80);\n\t\t\t} else if (msg.role === \"assistant\") {\n\t\t\t\tpreview = \"(assistant)\";\n\t\t\t}\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tpreview = \"(compaction)\";\n\t\t}\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\ttype: entry.type,\n\t\t\tparentId: entry.parentId,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlabel: node.label,\n\t\t\tpreview,\n\t\t\tchildren: (node.children as unknown[]).map((child) =>\n\t\t\t\tthis._convertTreeNode(child as Parameters<typeof this._convertTreeNode>[0]),\n\t\t\t),\n\t\t};\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\treturn this.session.getUserMessagesForForking().map((m) => ({ id: m.entryId, text: m.text }));\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\tconst { SessionManager } = await import(\"./session-manager.ts\");\n\t\tconst cwd = this.session.sessionManager.getCwd();\n\t\tconst sessions = await SessionManager.list(cwd);\n\t\treturn sessions.map((s) => ({\n\t\t\tpath: s.path,\n\t\t\tid: s.id,\n\t\t\tcwd: s.cwd,\n\t\t\tname: s.name,\n\t\t\tparentSessionPath: s.parentSessionPath,\n\t\t\tcreated: s.created.toISOString(),\n\t\t\tmodified: s.modified.toISOString(),\n\t\t\tmessageCount: s.messageCount,\n\t\t\tfirstMessage: s.firstMessage,\n\t\t}));\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this.getTree();\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this.getUserMessagesForForking();\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this.getCommands();\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tconst commands: ServeSlashCommand[] = [];\n\n\t\t// 1. Builtin commands\n\t\tfor (const cmd of BUILTIN_SLASH_COMMANDS) {\n\t\t\tcommands.push({ name: cmd.name, description: cmd.description, source: \"builtin\" });\n\t\t}\n\t\t// /model gets an argument hint\n\t\tconst modelCmd = commands.find((c) => c.name === \"model\");\n\t\tif (modelCmd) modelCmd.argumentHint = \"<provider/model-id>\";\n\n\t\t// 2. Prompt templates\n\t\tfor (const tmpl of this.session.promptTemplates) {\n\t\t\tcommands.push({\n\t\t\t\tname: tmpl.name,\n\t\t\t\tdescription: tmpl.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: tmpl.sourceInfo,\n\t\t\t});\n\t\t}\n\n\t\t// 3. Extension commands (exclude names that clash with builtins)\n\t\tconst builtinNames = new Set(BUILTIN_SLASH_COMMANDS.map((c) => c.name));\n\t\tfor (const cmd of this.session.extensionRunner.getRegisteredCommands()) {\n\t\t\tif (!builtinNames.has(cmd.name)) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: cmd.invocationName,\n\t\t\t\t\tdescription: cmd.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tsourceInfo: cmd.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// 4. Skill commands (gated by enableSkillCommands)\n\t\tif (this.session.settingsManager.getEnableSkillCommands()) {\n\t\t\tfor (const skill of this.session.resourceLoader.getSkills().skills) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\treturn this.session.modelRegistry.getAvailable().map((m) => ({\n\t\t\tid: m.id,\n\t\t\tname: m.name,\n\t\t\tprovider: m.provider,\n\t\t\treasoning: m.reasoning,\n\t\t\tcontextWindow: m.contextWindow,\n\t\t\tmaxTokens: m.maxTokens,\n\t\t\tinput: m.input,\n\t\t}));\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this.getModels();\n\t}\n\n\t// =========================================================================\n\t// Lifecycle\n\t// =========================================================================\n\n\tdispose(): void {\n\t\t// Don't dispose runtime here — the mode that created it handles that\n\t}\n\n\t// =========================================================================\n\t// Extras (not in interface)\n\t// =========================================================================\n\n\t/** Expose runtime for modes that need direct access (e.g., rebindSession callbacks) */\n\tget runtime(): AgentSessionRuntime {\n\t\treturn this._runtime;\n\t}\n\n\t/** Snapshot for serve mode */\n\tgetSnapshot(): SessionStateSnapshot {\n\t\tconst session = this.session;\n\t\tconst model = session.model;\n\n\t\t// Compute cumulative token usage from all entries\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tconst usingSubscription = model ? session.modelRegistry.isUsingOAuth(model) : false;\n\t\tconst tokenUsage: TokenUsage = {\n\t\t\tinput: totalInput,\n\t\t\toutput: totalOutput,\n\t\t\tcacheRead: totalCacheRead,\n\t\t\tcacheWrite: totalCacheWrite,\n\t\t\tcost: totalCost,\n\t\t\tusingSubscription,\n\t\t};\n\n\t\t// Compute context usage\n\t\tconst rawContextUsage = session.getContextUsage();\n\t\tconst contextUsage: ContextUsageInfo = rawContextUsage\n\t\t\t? {\n\t\t\t\t\ttokens: rawContextUsage.tokens,\n\t\t\t\t\tcontextWindow: rawContextUsage.contextWindow,\n\t\t\t\t\tpercent: rawContextUsage.percent,\n\t\t\t\t}\n\t\t\t: { tokens: null, contextWindow: model?.contextWindow ?? 0, percent: null };\n\n\t\t// Extract model info\n\t\tconst modelInfo: ModelInfo = model\n\t\t\t? { id: model.id, provider: model.provider, reasoning: model.reasoning, contextWindow: model.contextWindow }\n\t\t\t: { id: \"\", provider: \"\", reasoning: false, contextWindow: 0 };\n\n\t\treturn {\n\t\t\tmodel: this.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tisStreaming: this.isStreaming,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tsteeringMessages: this.steeringMessages,\n\t\t\tfollowUpMessages: this.followUpMessages,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionName: this.sessionName,\n\t\t\tmessages: this.messages,\n\t\t\tbanner: this._banner,\n\t\t\ttokenUsage,\n\t\t\tcontextUsage,\n\t\t\tmodelInfo,\n\t\t\tautoCompactEnabled: session.autoCompactionEnabled,\n\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\tavailableProviderCount: session.modelRegistry.getAvailable().length,\n\t\t\tremoteSettings: {\n\t\t\t\tautoCompact: session.autoCompactionEnabled,\n\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: session.getAvailableThinkingLevels(),\n\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\tenableSkillCommands: session.settingsManager.getEnableSkillCommands(),\n\t\t\t\tdoubleEscapeAction: session.settingsManager.getDoubleEscapeAction(),\n\t\t\t\tshowImages: session.settingsManager.getShowImages(),\n\t\t\t\timageWidthCells: session.settingsManager.getImageWidthCells(),\n\t\t\t\tautoResizeImages: session.settingsManager.getImageAutoResize(),\n\t\t\t\tblockImages: session.settingsManager.getBlockImages(),\n\t\t\t\ttransport: session.settingsManager.getTransport(),\n\t\t\t\thttpIdleTimeoutMs: session.settingsManager.getHttpIdleTimeoutMs(),\n\t\t\t\tcurrentTheme: session.settingsManager.getTheme() ?? \"\",\n\t\t\t\tavailableThemes: session.resourceLoader.getThemes().themes.map((t) => t.name) as string[],\n\t\t\t\thideThinkingBlock: session.settingsManager.getHideThinkingBlock(),\n\t\t\t\tcollapseChangelog: session.settingsManager.getCollapseChangelog(),\n\t\t\t\tenableInstallTelemetry: session.settingsManager.getEnableInstallTelemetry(),\n\t\t\t\ttreeFilterMode: session.settingsManager.getTreeFilterMode(),\n\t\t\t\tshowHardwareCursor: session.settingsManager.getShowHardwareCursor(),\n\t\t\t\teditorPaddingX: session.settingsManager.getEditorPaddingX(),\n\t\t\t\tautocompleteMaxVisible: session.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\tquietStartup: session.settingsManager.getQuietStartup(),\n\t\t\t\tclearOnShrink: session.settingsManager.getClearOnShrink(),\n\t\t\t\tshowTerminalProgress: session.settingsManager.getShowTerminalProgress(),\n\t\t\t\twarnings: session.settingsManager.getWarnings() as unknown as Record<string, unknown>,\n\t\t\t},\n\t\t\tscopedModelIds:\n\t\t\t\tsession.scopedModels.length > 0\n\t\t\t\t\t? session.scopedModels.map((sm) => `${sm.model.provider}/${sm.model.id}`)\n\t\t\t\t\t: null,\n\t\t\tenabledModelPatterns: session.settingsManager.getEnabledModels(),\n\t\t\textensionPaths: session.extensionRunner.getExtensionPaths(),\n\t\t};\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-agent-session-proxy.d.ts","sourceRoot":"","sources":["../../src/core/local-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { ImageContent } from \"@sheason/pi-ai\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tBannerData,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"./agent-session-proxy.ts\";\nimport type { AgentSessionRuntime } from \"./agent-session-runtime.ts\";\nimport { BUILTIN_SLASH_COMMANDS } from \"./slash-commands.ts\";\n\n/**\n * Convert proxy-style image format ({ url, mediaType }) to the ImageContent\n * format expected by AgentSession ({ type, data, mimeType }).\n *\n * Supports:\n * - data URLs: data:image/png;base64,iVBOR... -> { type: \"image\", data: \"iVBOR...\", mimeType: \"image/png\" }\n * - bare base64 with mediaType: { url: \"<base64>\", mediaType: \"image/png\" }\n */\nfunction toImageContent(images: Array<{ url: string; mediaType?: string }>): ImageContent[] {\n\treturn images.map(({ url, mediaType }): ImageContent => {\n\t\t// Data URL: data:<mimeType>;base64,<data>\n\t\tconst dataUrlMatch = url.match(/^data:([^;]+);base64,(.+)$/s);\n\t\tif (dataUrlMatch) {\n\t\t\treturn { type: \"image\", data: dataUrlMatch[2], mimeType: dataUrlMatch[1] };\n\t\t}\n\t\t// Bare base64 — mediaType is required\n\t\tif (mediaType) {\n\t\t\treturn { type: \"image\", data: url, mimeType: mediaType };\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot convert image: URL is not a data URL and no mediaType provided. ` +\n\t\t\t\t`LocalAgentSessionProxy only supports data-URL images or base64 with explicit mediaType.`,\n\t\t);\n\t});\n}\n\n/**\n * Local implementation of AgentSessionProxy that wraps an in-process\n * AgentSession + AgentSessionRuntime.\n *\n * Used by serve mode (and could be used by interactive mode in the future).\n */\nexport class LocalAgentSessionProxy implements AgentSessionProxy {\n\tprivate readonly _runtime: AgentSessionRuntime;\n\tprivate _banner: BannerData | undefined;\n\t/** Listeners registered through this proxy — re-subscribed when the session changes */\n\tprivate _proxyListeners: Array<(event: AgentSessionEvent) => void> = [];\n\tprivate _sessionUnsubscribe: (() => void) | undefined;\n\n\tconstructor(runtime: AgentSessionRuntime) {\n\t\tthis._runtime = runtime;\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session and emit session_replaced */\n\tresubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._resubscribe(reason);\n\t}\n\n\t/** Called by the host mode to wire up the rebindSession callback */\n\tinstallRebindCallback(): void {\n\t\tthis._runtime.setRebindSession(async (_session, reason) => {\n\t\t\tthis._resubscribe(reason);\n\t\t});\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session */\n\tprivate _resubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._sessionUnsubscribe?.();\n\t\tthis._sessionUnsubscribe = undefined;\n\t\tif (this._proxyListeners.length === 0) return;\n\t\tconst session = this._runtime.session;\n\t\tconst combinedListener = (event: AgentSessionEvent) => {\n\t\t\tfor (const listener of this._proxyListeners) {\n\t\t\t\tlistener(event);\n\t\t\t}\n\t\t};\n\t\tthis._sessionUnsubscribe = session.subscribe(combinedListener);\n\t\t// Notify listeners that the session was replaced so they can reset UI\n\t\tfor (const listener of this._proxyListeners) {\n\t\t\tlistener({ type: \"session_replaced\", reason });\n\t\t}\n\t}\n\n\t/** Set the banner data (called by serve mode after initialization) */\n\tsetBanner(banner: BannerData | undefined): void {\n\t\tthis._banner = banner;\n\t}\n\n\tprivate get session(): AgentSession {\n\t\treturn this._runtime.session;\n\t}\n\n\t// =========================================================================\n\t// Event subscription\n\t// =========================================================================\n\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void {\n\t\tthis._proxyListeners.push(listener);\n\t\t// If this is the first listener, subscribe to the session\n\t\tif (this._proxyListeners.length === 1) {\n\t\t\tthis._resubscribe();\n\t\t}\n\t\treturn () => {\n\t\t\tconst index = this._proxyListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._proxyListeners.splice(index, 1);\n\t\t\t}\n\t\t\t// If no more listeners, unsubscribe from session\n\t\t\tif (this._proxyListeners.length === 0) {\n\t\t\t\tthis._sessionUnsubscribe?.();\n\t\t\t\tthis._sessionUnsubscribe = undefined;\n\t\t\t}\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Commands\n\t// =========================================================================\n\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tconst images = options?.images ? toImageContent(options.images) : undefined;\n\t\tawait this.session.prompt(text, { images, streamingBehavior: options?.streamingBehavior });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.steer() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.steer(text, converted);\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.followUp() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.followUp(text, converted);\n\t}\n\n\tabort(): void {\n\t\t// AgentSession.abort() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.abort();\n\t}\n\n\tabortBash(): void {\n\t\tthis.session.abortBash();\n\t}\n\n\t// =========================================================================\n\t// State queries\n\t// =========================================================================\n\n\tget model(): string {\n\t\treturn this.session.model?.id ?? \"\";\n\t}\n\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.session.thinkingLevel;\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.session.isStreaming;\n\t}\n\n\tget isCompacting(): boolean {\n\t\treturn this.session.isCompacting;\n\t}\n\n\tget isBashRunning(): boolean {\n\t\treturn this.session.isBashRunning;\n\t}\n\n\tget steeringMessages(): readonly string[] {\n\t\treturn this.session.getSteeringMessages();\n\t}\n\n\tget followUpMessages(): readonly string[] {\n\t\treturn this.session.getFollowUpMessages();\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.session.sessionFile;\n\t}\n\n\tget sessionName(): string | undefined {\n\t\treturn this.session.sessionName;\n\t}\n\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this.session.messages;\n\t}\n\n\t// =========================================================================\n\t// Session operations\n\t// =========================================================================\n\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this.session.compact(customInstructions);\n\t}\n\n\tsetModel(modelId: string): void {\n\t\t// AgentSession.setModel() takes a Model<any> object, not a string.\n\t\t// Look up the model by ID from the model registry.\n\t\tconst registry = this.session.modelRegistry;\n\t\tconst available = registry.getAvailable();\n\n\t\t// Try \"provider/modelId\" format first\n\t\tconst slashIndex = modelId.indexOf(\"/\");\n\t\tlet model: ReturnType<typeof available.find> | undefined;\n\t\tif (slashIndex !== -1) {\n\t\t\tconst provider = modelId.slice(0, slashIndex);\n\t\t\tconst id = modelId.slice(slashIndex + 1);\n\t\t\tmodel = registry.find(provider, id);\n\t\t}\n\n\t\t// Fallback: search by model ID alone\n\t\tif (!model) {\n\t\t\tmodel = available.find((m) => m.id === modelId);\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthrow new Error(`Model not found: ${modelId}`);\n\t\t}\n\n\t\t// AgentSession.setModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.setModel(model);\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tconst dir = direction === 1 ? \"forward\" : \"backward\";\n\t\t// AgentSession.cycleModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.cycleModel(dir);\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis.session.setThinkingLevel(level);\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\t// AgentSession.cycleThinkingLevel() takes no arguments and cycles forward.\n\t\t// Implement directional cycling manually.\n\t\tconst levels = this.session.getAvailableThinkingLevels();\n\t\tif (levels.length === 0) return;\n\n\t\tconst currentIndex = levels.indexOf(this.session.thinkingLevel);\n\t\tconst len = levels.length;\n\t\tconst nextIndex = direction === 1 ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\n\t\tthis.session.setThinkingLevel(levels[nextIndex]);\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.session.setAutoCompactionEnabled(enabled);\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setSteeringMode(mode);\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setFollowUpMode(mode);\n\t}\n\n\t// =========================================================================\n\t// Runtime operations\n\t// =========================================================================\n\n\tasync newSession(): Promise<void> {\n\t\tawait this._runtime.newSession();\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._runtime.switchSession(sessionFile);\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._runtime.fork(entryId ?? \"\");\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis.session.sessionManager.appendSessionInfo(name);\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis.session.sessionManager.appendLabelChange(entryId, label);\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tif (enabledIds && enabledIds.length > 0) {\n\t\t\tconst allModels = this.session.modelRegistry.getAvailable();\n\t\t\tconst enabledSet = new Set(enabledIds);\n\t\t\tconst scoped = allModels.filter((m) => enabledSet.has(`${m.provider}/${m.id}`));\n\t\t\tthis.session.setScopedModels(scoped.map((m) => ({ model: m })));\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis.session.settingsManager.setEnabledModels(patterns);\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tconst sm = this.session.settingsManager;\n\t\tif (\"showImages\" in updates && typeof updates.showImages === \"boolean\") sm.setShowImages(updates.showImages);\n\t\tif (\"imageWidthCells\" in updates && typeof updates.imageWidthCells === \"number\")\n\t\t\tsm.setImageWidthCells(updates.imageWidthCells);\n\t\tif (\"autoResizeImages\" in updates && typeof updates.autoResizeImages === \"boolean\")\n\t\t\tsm.setImageAutoResize(updates.autoResizeImages);\n\t\tif (\"blockImages\" in updates && typeof updates.blockImages === \"boolean\") sm.setBlockImages(updates.blockImages);\n\t\tif (\"enableSkillCommands\" in updates && typeof updates.enableSkillCommands === \"boolean\")\n\t\t\tsm.setEnableSkillCommands(updates.enableSkillCommands);\n\t\tif (\"transport\" in updates && typeof updates.transport === \"string\") sm.setTransport(updates.transport as any);\n\t\tif (\"httpIdleTimeoutMs\" in updates && typeof updates.httpIdleTimeoutMs === \"number\")\n\t\t\tsm.setHttpIdleTimeoutMs(updates.httpIdleTimeoutMs);\n\t\tif (\"theme\" in updates && typeof updates.theme === \"string\") sm.setTheme(updates.theme);\n\t\tif (\"hideThinkingBlock\" in updates && typeof updates.hideThinkingBlock === \"boolean\")\n\t\t\tsm.setHideThinkingBlock(updates.hideThinkingBlock);\n\t\tif (\"collapseChangelog\" in updates && typeof updates.collapseChangelog === \"boolean\")\n\t\t\tsm.setCollapseChangelog(updates.collapseChangelog);\n\t\tif (\"enableInstallTelemetry\" in updates && typeof updates.enableInstallTelemetry === \"boolean\")\n\t\t\tsm.setEnableInstallTelemetry(updates.enableInstallTelemetry);\n\t\tif (\"doubleEscapeAction\" in updates && typeof updates.doubleEscapeAction === \"string\")\n\t\t\tsm.setDoubleEscapeAction(updates.doubleEscapeAction as any);\n\t\tif (\"treeFilterMode\" in updates && typeof updates.treeFilterMode === \"string\")\n\t\t\tsm.setTreeFilterMode(updates.treeFilterMode as any);\n\t\tif (\"showHardwareCursor\" in updates && typeof updates.showHardwareCursor === \"boolean\")\n\t\t\tsm.setShowHardwareCursor(updates.showHardwareCursor);\n\t\tif (\"editorPaddingX\" in updates && typeof updates.editorPaddingX === \"number\")\n\t\t\tsm.setEditorPaddingX(updates.editorPaddingX);\n\t\tif (\"autocompleteMaxVisible\" in updates && typeof updates.autocompleteMaxVisible === \"number\")\n\t\t\tsm.setAutocompleteMaxVisible(updates.autocompleteMaxVisible);\n\t\tif (\"quietStartup\" in updates && typeof updates.quietStartup === \"boolean\")\n\t\t\tsm.setQuietStartup(updates.quietStartup);\n\t\tif (\"clearOnShrink\" in updates && typeof updates.clearOnShrink === \"boolean\")\n\t\t\tsm.setClearOnShrink(updates.clearOnShrink);\n\t\tif (\"showTerminalProgress\" in updates && typeof updates.showTerminalProgress === \"boolean\")\n\t\t\tsm.setShowTerminalProgress(updates.showTerminalProgress);\n\t\tif (\"warnings\" in updates && typeof updates.warnings === \"object\" && updates.warnings !== null)\n\t\t\tsm.setWarnings(updates.warnings as any);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.session.reload();\n\t}\n\n\tgetTree(): TreeNodeData[] {\n\t\tconst tree = this.session.sessionManager.getTree();\n\t\treturn tree.map((node) => this._convertTreeNode(node));\n\t}\n\n\tprivate _convertTreeNode(node: {\n\t\tentry: { id: string; type: string; parentId: string | null; timestamp: string };\n\t\tchildren: unknown[];\n\t\tlabel?: string;\n\t}): TreeNodeData {\n\t\tlet preview: string | undefined;\n\t\tconst entry = node.entry;\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msg = (\n\t\t\t\tentry as unknown as {\n\t\t\t\t\ttype: \"message\";\n\t\t\t\t\tmessage: { role: string; content: string | Array<{ type: string; text?: string }> };\n\t\t\t\t}\n\t\t\t).message;\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\tpreview =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content.slice(0, 80)\n\t\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t\t.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n\t\t\t\t\t\t\t\t.map((p) => p.text)\n\t\t\t\t\t\t\t\t.join(\" \")\n\t\t\t\t\t\t\t\t.slice(0, 80);\n\t\t\t} else if (msg.role === \"assistant\") {\n\t\t\t\tpreview = \"(assistant)\";\n\t\t\t}\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tpreview = \"(compaction)\";\n\t\t}\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\ttype: entry.type,\n\t\t\tparentId: entry.parentId,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlabel: node.label,\n\t\t\tpreview,\n\t\t\tchildren: (node.children as unknown[]).map((child) =>\n\t\t\t\tthis._convertTreeNode(child as Parameters<typeof this._convertTreeNode>[0]),\n\t\t\t),\n\t\t};\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\treturn this.session.getUserMessagesForForking().map((m) => ({ id: m.entryId, text: m.text }));\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\tconst { SessionManager } = await import(\"./session-manager.ts\");\n\t\tconst cwd = this.session.sessionManager.getCwd();\n\t\tconst sessions = await SessionManager.list(cwd);\n\t\treturn sessions.map((s) => ({\n\t\t\tpath: s.path,\n\t\t\tid: s.id,\n\t\t\tcwd: s.cwd,\n\t\t\tname: s.name,\n\t\t\tparentSessionPath: s.parentSessionPath,\n\t\t\tcreated: s.created.toISOString(),\n\t\t\tmodified: s.modified.toISOString(),\n\t\t\tmessageCount: s.messageCount,\n\t\t\tfirstMessage: s.firstMessage,\n\t\t}));\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this.getTree();\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this.getUserMessagesForForking();\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this.getCommands();\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tconst commands: ServeSlashCommand[] = [];\n\n\t\t// 1. Builtin commands\n\t\tfor (const cmd of BUILTIN_SLASH_COMMANDS) {\n\t\t\tcommands.push({ name: cmd.name, description: cmd.description, source: \"builtin\" });\n\t\t}\n\t\t// /model gets an argument hint\n\t\tconst modelCmd = commands.find((c) => c.name === \"model\");\n\t\tif (modelCmd) modelCmd.argumentHint = \"<provider/model-id>\";\n\n\t\t// 2. Prompt templates\n\t\tfor (const tmpl of this.session.promptTemplates) {\n\t\t\tcommands.push({\n\t\t\t\tname: tmpl.name,\n\t\t\t\tdescription: tmpl.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: tmpl.sourceInfo,\n\t\t\t});\n\t\t}\n\n\t\t// 3. Extension commands (exclude names that clash with builtins)\n\t\tconst builtinNames = new Set(BUILTIN_SLASH_COMMANDS.map((c) => c.name));\n\t\tfor (const cmd of this.session.extensionRunner.getRegisteredCommands()) {\n\t\t\tif (!builtinNames.has(cmd.name)) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: cmd.invocationName,\n\t\t\t\t\tdescription: cmd.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tsourceInfo: cmd.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// 4. Skill commands (gated by enableSkillCommands)\n\t\tif (this.session.settingsManager.getEnableSkillCommands()) {\n\t\t\tfor (const skill of this.session.resourceLoader.getSkills().skills) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\treturn this.session.modelRegistry.getAvailable().map((m) => ({\n\t\t\tid: m.id,\n\t\t\tname: m.name,\n\t\t\tprovider: m.provider,\n\t\t\tapi: m.api,\n\t\t\tbaseUrl: m.baseUrl,\n\t\t\tcost: {\n\t\t\t\tinput: m.cost.input,\n\t\t\t\toutput: m.cost.output,\n\t\t\t\tcacheRead: m.cost.cacheRead,\n\t\t\t\tcacheWrite: m.cost.cacheWrite,\n\t\t\t},\n\t\t\treasoning: m.reasoning,\n\t\t\tcontextWindow: m.contextWindow,\n\t\t\tmaxTokens: m.maxTokens,\n\t\t\tinput: m.input,\n\t\t}));\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this.getModels();\n\t}\n\n\t// =========================================================================\n\t// Lifecycle\n\t// =========================================================================\n\n\tdispose(): void {\n\t\t// Don't dispose runtime here — the mode that created it handles that\n\t}\n\n\t// =========================================================================\n\t// Extras (not in interface)\n\t// =========================================================================\n\n\t/** Expose runtime for modes that need direct access (e.g., rebindSession callbacks) */\n\tget runtime(): AgentSessionRuntime {\n\t\treturn this._runtime;\n\t}\n\n\t/** Snapshot for serve mode */\n\tgetSnapshot(): SessionStateSnapshot {\n\t\tconst session = this.session;\n\t\tconst model = session.model;\n\n\t\t// Compute cumulative token usage from all entries\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tconst usingSubscription = model ? session.modelRegistry.isUsingOAuth(model) : false;\n\t\tconst tokenUsage: TokenUsage = {\n\t\t\tinput: totalInput,\n\t\t\toutput: totalOutput,\n\t\t\tcacheRead: totalCacheRead,\n\t\t\tcacheWrite: totalCacheWrite,\n\t\t\tcost: totalCost,\n\t\t\tusingSubscription,\n\t\t};\n\n\t\t// Compute context usage\n\t\tconst rawContextUsage = session.getContextUsage();\n\t\tconst contextUsage: ContextUsageInfo = rawContextUsage\n\t\t\t? {\n\t\t\t\t\ttokens: rawContextUsage.tokens,\n\t\t\t\t\tcontextWindow: rawContextUsage.contextWindow,\n\t\t\t\t\tpercent: rawContextUsage.percent,\n\t\t\t\t}\n\t\t\t: { tokens: null, contextWindow: model?.contextWindow ?? 0, percent: null };\n\n\t\t// Extract model info\n\t\tconst modelInfo: ModelInfo = model\n\t\t\t? { id: model.id, provider: model.provider, reasoning: model.reasoning, contextWindow: model.contextWindow }\n\t\t\t: { id: \"\", provider: \"\", reasoning: false, contextWindow: 0 };\n\n\t\treturn {\n\t\t\tmodel: this.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tisStreaming: this.isStreaming,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tsteeringMessages: this.steeringMessages,\n\t\t\tfollowUpMessages: this.followUpMessages,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionName: this.sessionName,\n\t\t\tmessages: this.messages,\n\t\t\tbanner: this._banner,\n\t\t\ttokenUsage,\n\t\t\tcontextUsage,\n\t\t\tmodelInfo,\n\t\t\tautoCompactEnabled: session.autoCompactionEnabled,\n\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\tavailableProviderCount: session.modelRegistry.getAvailable().length,\n\t\t\tremoteSettings: {\n\t\t\t\tautoCompact: session.autoCompactionEnabled,\n\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: session.getAvailableThinkingLevels(),\n\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\tenableSkillCommands: session.settingsManager.getEnableSkillCommands(),\n\t\t\t\tdoubleEscapeAction: session.settingsManager.getDoubleEscapeAction(),\n\t\t\t\tshowImages: session.settingsManager.getShowImages(),\n\t\t\t\timageWidthCells: session.settingsManager.getImageWidthCells(),\n\t\t\t\tautoResizeImages: session.settingsManager.getImageAutoResize(),\n\t\t\t\tblockImages: session.settingsManager.getBlockImages(),\n\t\t\t\ttransport: session.settingsManager.getTransport(),\n\t\t\t\thttpIdleTimeoutMs: session.settingsManager.getHttpIdleTimeoutMs(),\n\t\t\t\tcurrentTheme: session.settingsManager.getTheme() ?? \"\",\n\t\t\t\tavailableThemes: session.resourceLoader.getThemes().themes.map((t) => t.name) as string[],\n\t\t\t\thideThinkingBlock: session.settingsManager.getHideThinkingBlock(),\n\t\t\t\tcollapseChangelog: session.settingsManager.getCollapseChangelog(),\n\t\t\t\tenableInstallTelemetry: session.settingsManager.getEnableInstallTelemetry(),\n\t\t\t\ttreeFilterMode: session.settingsManager.getTreeFilterMode(),\n\t\t\t\tshowHardwareCursor: session.settingsManager.getShowHardwareCursor(),\n\t\t\t\teditorPaddingX: session.settingsManager.getEditorPaddingX(),\n\t\t\t\tautocompleteMaxVisible: session.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\tquietStartup: session.settingsManager.getQuietStartup(),\n\t\t\t\tclearOnShrink: session.settingsManager.getClearOnShrink(),\n\t\t\t\tshowTerminalProgress: session.settingsManager.getShowTerminalProgress(),\n\t\t\t\twarnings: session.settingsManager.getWarnings() as unknown as Record<string, unknown>,\n\t\t\t},\n\t\t\tscopedModelIds:\n\t\t\t\tsession.scopedModels.length > 0\n\t\t\t\t\t? session.scopedModels.map((sm) => `${sm.model.provider}/${sm.model.id}`)\n\t\t\t\t\t: null,\n\t\t\tenabledModelPatterns: session.settingsManager.getEnabledModels(),\n\t\t\textensionPaths: session.extensionRunner.getExtensionPaths(),\n\t\t};\n\t}\n}\n"]}
|
|
@@ -403,6 +403,14 @@ export class LocalAgentSessionProxy {
|
|
|
403
403
|
id: m.id,
|
|
404
404
|
name: m.name,
|
|
405
405
|
provider: m.provider,
|
|
406
|
+
api: m.api,
|
|
407
|
+
baseUrl: m.baseUrl,
|
|
408
|
+
cost: {
|
|
409
|
+
input: m.cost.input,
|
|
410
|
+
output: m.cost.output,
|
|
411
|
+
cacheRead: m.cost.cacheRead,
|
|
412
|
+
cacheWrite: m.cost.cacheWrite,
|
|
413
|
+
},
|
|
406
414
|
reasoning: m.reasoning,
|
|
407
415
|
contextWindow: m.contextWindow,
|
|
408
416
|
maxTokens: m.maxTokens,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-agent-session-proxy.js","sourceRoot":"","sources":["../../src/core/local-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { ImageContent } from \"@sheason/pi-ai\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tBannerData,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"./agent-session-proxy.ts\";\nimport type { AgentSessionRuntime } from \"./agent-session-runtime.ts\";\nimport { BUILTIN_SLASH_COMMANDS } from \"./slash-commands.ts\";\n\n/**\n * Convert proxy-style image format ({ url, mediaType }) to the ImageContent\n * format expected by AgentSession ({ type, data, mimeType }).\n *\n * Supports:\n * - data URLs: data:image/png;base64,iVBOR... -> { type: \"image\", data: \"iVBOR...\", mimeType: \"image/png\" }\n * - bare base64 with mediaType: { url: \"<base64>\", mediaType: \"image/png\" }\n */\nfunction toImageContent(images: Array<{ url: string; mediaType?: string }>): ImageContent[] {\n\treturn images.map(({ url, mediaType }): ImageContent => {\n\t\t// Data URL: data:<mimeType>;base64,<data>\n\t\tconst dataUrlMatch = url.match(/^data:([^;]+);base64,(.+)$/s);\n\t\tif (dataUrlMatch) {\n\t\t\treturn { type: \"image\", data: dataUrlMatch[2], mimeType: dataUrlMatch[1] };\n\t\t}\n\t\t// Bare base64 — mediaType is required\n\t\tif (mediaType) {\n\t\t\treturn { type: \"image\", data: url, mimeType: mediaType };\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot convert image: URL is not a data URL and no mediaType provided. ` +\n\t\t\t\t`LocalAgentSessionProxy only supports data-URL images or base64 with explicit mediaType.`,\n\t\t);\n\t});\n}\n\n/**\n * Local implementation of AgentSessionProxy that wraps an in-process\n * AgentSession + AgentSessionRuntime.\n *\n * Used by serve mode (and could be used by interactive mode in the future).\n */\nexport class LocalAgentSessionProxy implements AgentSessionProxy {\n\tprivate readonly _runtime: AgentSessionRuntime;\n\tprivate _banner: BannerData | undefined;\n\t/** Listeners registered through this proxy — re-subscribed when the session changes */\n\tprivate _proxyListeners: Array<(event: AgentSessionEvent) => void> = [];\n\tprivate _sessionUnsubscribe: (() => void) | undefined;\n\n\tconstructor(runtime: AgentSessionRuntime) {\n\t\tthis._runtime = runtime;\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session and emit session_replaced */\n\tresubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._resubscribe(reason);\n\t}\n\n\t/** Called by the host mode to wire up the rebindSession callback */\n\tinstallRebindCallback(): void {\n\t\tthis._runtime.setRebindSession(async (_session, reason) => {\n\t\t\tthis._resubscribe(reason);\n\t\t});\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session */\n\tprivate _resubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._sessionUnsubscribe?.();\n\t\tthis._sessionUnsubscribe = undefined;\n\t\tif (this._proxyListeners.length === 0) return;\n\t\tconst session = this._runtime.session;\n\t\tconst combinedListener = (event: AgentSessionEvent) => {\n\t\t\tfor (const listener of this._proxyListeners) {\n\t\t\t\tlistener(event);\n\t\t\t}\n\t\t};\n\t\tthis._sessionUnsubscribe = session.subscribe(combinedListener);\n\t\t// Notify listeners that the session was replaced so they can reset UI\n\t\tfor (const listener of this._proxyListeners) {\n\t\t\tlistener({ type: \"session_replaced\", reason });\n\t\t}\n\t}\n\n\t/** Set the banner data (called by serve mode after initialization) */\n\tsetBanner(banner: BannerData | undefined): void {\n\t\tthis._banner = banner;\n\t}\n\n\tprivate get session(): AgentSession {\n\t\treturn this._runtime.session;\n\t}\n\n\t// =========================================================================\n\t// Event subscription\n\t// =========================================================================\n\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void {\n\t\tthis._proxyListeners.push(listener);\n\t\t// If this is the first listener, subscribe to the session\n\t\tif (this._proxyListeners.length === 1) {\n\t\t\tthis._resubscribe();\n\t\t}\n\t\treturn () => {\n\t\t\tconst index = this._proxyListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._proxyListeners.splice(index, 1);\n\t\t\t}\n\t\t\t// If no more listeners, unsubscribe from session\n\t\t\tif (this._proxyListeners.length === 0) {\n\t\t\t\tthis._sessionUnsubscribe?.();\n\t\t\t\tthis._sessionUnsubscribe = undefined;\n\t\t\t}\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Commands\n\t// =========================================================================\n\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tconst images = options?.images ? toImageContent(options.images) : undefined;\n\t\tawait this.session.prompt(text, { images, streamingBehavior: options?.streamingBehavior });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.steer() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.steer(text, converted);\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.followUp() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.followUp(text, converted);\n\t}\n\n\tabort(): void {\n\t\t// AgentSession.abort() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.abort();\n\t}\n\n\tabortBash(): void {\n\t\tthis.session.abortBash();\n\t}\n\n\t// =========================================================================\n\t// State queries\n\t// =========================================================================\n\n\tget model(): string {\n\t\treturn this.session.model?.id ?? \"\";\n\t}\n\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.session.thinkingLevel;\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.session.isStreaming;\n\t}\n\n\tget isCompacting(): boolean {\n\t\treturn this.session.isCompacting;\n\t}\n\n\tget isBashRunning(): boolean {\n\t\treturn this.session.isBashRunning;\n\t}\n\n\tget steeringMessages(): readonly string[] {\n\t\treturn this.session.getSteeringMessages();\n\t}\n\n\tget followUpMessages(): readonly string[] {\n\t\treturn this.session.getFollowUpMessages();\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.session.sessionFile;\n\t}\n\n\tget sessionName(): string | undefined {\n\t\treturn this.session.sessionName;\n\t}\n\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this.session.messages;\n\t}\n\n\t// =========================================================================\n\t// Session operations\n\t// =========================================================================\n\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this.session.compact(customInstructions);\n\t}\n\n\tsetModel(modelId: string): void {\n\t\t// AgentSession.setModel() takes a Model<any> object, not a string.\n\t\t// Look up the model by ID from the model registry.\n\t\tconst registry = this.session.modelRegistry;\n\t\tconst available = registry.getAvailable();\n\n\t\t// Try \"provider/modelId\" format first\n\t\tconst slashIndex = modelId.indexOf(\"/\");\n\t\tlet model: ReturnType<typeof available.find> | undefined;\n\t\tif (slashIndex !== -1) {\n\t\t\tconst provider = modelId.slice(0, slashIndex);\n\t\t\tconst id = modelId.slice(slashIndex + 1);\n\t\t\tmodel = registry.find(provider, id);\n\t\t}\n\n\t\t// Fallback: search by model ID alone\n\t\tif (!model) {\n\t\t\tmodel = available.find((m) => m.id === modelId);\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthrow new Error(`Model not found: ${modelId}`);\n\t\t}\n\n\t\t// AgentSession.setModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.setModel(model);\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tconst dir = direction === 1 ? \"forward\" : \"backward\";\n\t\t// AgentSession.cycleModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.cycleModel(dir);\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis.session.setThinkingLevel(level);\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\t// AgentSession.cycleThinkingLevel() takes no arguments and cycles forward.\n\t\t// Implement directional cycling manually.\n\t\tconst levels = this.session.getAvailableThinkingLevels();\n\t\tif (levels.length === 0) return;\n\n\t\tconst currentIndex = levels.indexOf(this.session.thinkingLevel);\n\t\tconst len = levels.length;\n\t\tconst nextIndex = direction === 1 ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\n\t\tthis.session.setThinkingLevel(levels[nextIndex]);\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.session.setAutoCompactionEnabled(enabled);\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setSteeringMode(mode);\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setFollowUpMode(mode);\n\t}\n\n\t// =========================================================================\n\t// Runtime operations\n\t// =========================================================================\n\n\tasync newSession(): Promise<void> {\n\t\tawait this._runtime.newSession();\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._runtime.switchSession(sessionFile);\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._runtime.fork(entryId ?? \"\");\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis.session.sessionManager.appendSessionInfo(name);\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis.session.sessionManager.appendLabelChange(entryId, label);\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tif (enabledIds && enabledIds.length > 0) {\n\t\t\tconst allModels = this.session.modelRegistry.getAvailable();\n\t\t\tconst enabledSet = new Set(enabledIds);\n\t\t\tconst scoped = allModels.filter((m) => enabledSet.has(`${m.provider}/${m.id}`));\n\t\t\tthis.session.setScopedModels(scoped.map((m) => ({ model: m })));\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis.session.settingsManager.setEnabledModels(patterns);\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tconst sm = this.session.settingsManager;\n\t\tif (\"showImages\" in updates && typeof updates.showImages === \"boolean\") sm.setShowImages(updates.showImages);\n\t\tif (\"imageWidthCells\" in updates && typeof updates.imageWidthCells === \"number\")\n\t\t\tsm.setImageWidthCells(updates.imageWidthCells);\n\t\tif (\"autoResizeImages\" in updates && typeof updates.autoResizeImages === \"boolean\")\n\t\t\tsm.setImageAutoResize(updates.autoResizeImages);\n\t\tif (\"blockImages\" in updates && typeof updates.blockImages === \"boolean\") sm.setBlockImages(updates.blockImages);\n\t\tif (\"enableSkillCommands\" in updates && typeof updates.enableSkillCommands === \"boolean\")\n\t\t\tsm.setEnableSkillCommands(updates.enableSkillCommands);\n\t\tif (\"transport\" in updates && typeof updates.transport === \"string\") sm.setTransport(updates.transport as any);\n\t\tif (\"httpIdleTimeoutMs\" in updates && typeof updates.httpIdleTimeoutMs === \"number\")\n\t\t\tsm.setHttpIdleTimeoutMs(updates.httpIdleTimeoutMs);\n\t\tif (\"theme\" in updates && typeof updates.theme === \"string\") sm.setTheme(updates.theme);\n\t\tif (\"hideThinkingBlock\" in updates && typeof updates.hideThinkingBlock === \"boolean\")\n\t\t\tsm.setHideThinkingBlock(updates.hideThinkingBlock);\n\t\tif (\"collapseChangelog\" in updates && typeof updates.collapseChangelog === \"boolean\")\n\t\t\tsm.setCollapseChangelog(updates.collapseChangelog);\n\t\tif (\"enableInstallTelemetry\" in updates && typeof updates.enableInstallTelemetry === \"boolean\")\n\t\t\tsm.setEnableInstallTelemetry(updates.enableInstallTelemetry);\n\t\tif (\"doubleEscapeAction\" in updates && typeof updates.doubleEscapeAction === \"string\")\n\t\t\tsm.setDoubleEscapeAction(updates.doubleEscapeAction as any);\n\t\tif (\"treeFilterMode\" in updates && typeof updates.treeFilterMode === \"string\")\n\t\t\tsm.setTreeFilterMode(updates.treeFilterMode as any);\n\t\tif (\"showHardwareCursor\" in updates && typeof updates.showHardwareCursor === \"boolean\")\n\t\t\tsm.setShowHardwareCursor(updates.showHardwareCursor);\n\t\tif (\"editorPaddingX\" in updates && typeof updates.editorPaddingX === \"number\")\n\t\t\tsm.setEditorPaddingX(updates.editorPaddingX);\n\t\tif (\"autocompleteMaxVisible\" in updates && typeof updates.autocompleteMaxVisible === \"number\")\n\t\t\tsm.setAutocompleteMaxVisible(updates.autocompleteMaxVisible);\n\t\tif (\"quietStartup\" in updates && typeof updates.quietStartup === \"boolean\")\n\t\t\tsm.setQuietStartup(updates.quietStartup);\n\t\tif (\"clearOnShrink\" in updates && typeof updates.clearOnShrink === \"boolean\")\n\t\t\tsm.setClearOnShrink(updates.clearOnShrink);\n\t\tif (\"showTerminalProgress\" in updates && typeof updates.showTerminalProgress === \"boolean\")\n\t\t\tsm.setShowTerminalProgress(updates.showTerminalProgress);\n\t\tif (\"warnings\" in updates && typeof updates.warnings === \"object\" && updates.warnings !== null)\n\t\t\tsm.setWarnings(updates.warnings as any);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.session.reload();\n\t}\n\n\tgetTree(): TreeNodeData[] {\n\t\tconst tree = this.session.sessionManager.getTree();\n\t\treturn tree.map((node) => this._convertTreeNode(node));\n\t}\n\n\tprivate _convertTreeNode(node: {\n\t\tentry: { id: string; type: string; parentId: string | null; timestamp: string };\n\t\tchildren: unknown[];\n\t\tlabel?: string;\n\t}): TreeNodeData {\n\t\tlet preview: string | undefined;\n\t\tconst entry = node.entry;\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msg = (\n\t\t\t\tentry as unknown as {\n\t\t\t\t\ttype: \"message\";\n\t\t\t\t\tmessage: { role: string; content: string | Array<{ type: string; text?: string }> };\n\t\t\t\t}\n\t\t\t).message;\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\tpreview =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content.slice(0, 80)\n\t\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t\t.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n\t\t\t\t\t\t\t\t.map((p) => p.text)\n\t\t\t\t\t\t\t\t.join(\" \")\n\t\t\t\t\t\t\t\t.slice(0, 80);\n\t\t\t} else if (msg.role === \"assistant\") {\n\t\t\t\tpreview = \"(assistant)\";\n\t\t\t}\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tpreview = \"(compaction)\";\n\t\t}\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\ttype: entry.type,\n\t\t\tparentId: entry.parentId,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlabel: node.label,\n\t\t\tpreview,\n\t\t\tchildren: (node.children as unknown[]).map((child) =>\n\t\t\t\tthis._convertTreeNode(child as Parameters<typeof this._convertTreeNode>[0]),\n\t\t\t),\n\t\t};\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\treturn this.session.getUserMessagesForForking().map((m) => ({ id: m.entryId, text: m.text }));\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\tconst { SessionManager } = await import(\"./session-manager.ts\");\n\t\tconst cwd = this.session.sessionManager.getCwd();\n\t\tconst sessions = await SessionManager.list(cwd);\n\t\treturn sessions.map((s) => ({\n\t\t\tpath: s.path,\n\t\t\tid: s.id,\n\t\t\tcwd: s.cwd,\n\t\t\tname: s.name,\n\t\t\tparentSessionPath: s.parentSessionPath,\n\t\t\tcreated: s.created.toISOString(),\n\t\t\tmodified: s.modified.toISOString(),\n\t\t\tmessageCount: s.messageCount,\n\t\t\tfirstMessage: s.firstMessage,\n\t\t}));\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this.getTree();\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this.getUserMessagesForForking();\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this.getCommands();\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tconst commands: ServeSlashCommand[] = [];\n\n\t\t// 1. Builtin commands\n\t\tfor (const cmd of BUILTIN_SLASH_COMMANDS) {\n\t\t\tcommands.push({ name: cmd.name, description: cmd.description, source: \"builtin\" });\n\t\t}\n\t\t// /model gets an argument hint\n\t\tconst modelCmd = commands.find((c) => c.name === \"model\");\n\t\tif (modelCmd) modelCmd.argumentHint = \"<provider/model-id>\";\n\n\t\t// 2. Prompt templates\n\t\tfor (const tmpl of this.session.promptTemplates) {\n\t\t\tcommands.push({\n\t\t\t\tname: tmpl.name,\n\t\t\t\tdescription: tmpl.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: tmpl.sourceInfo,\n\t\t\t});\n\t\t}\n\n\t\t// 3. Extension commands (exclude names that clash with builtins)\n\t\tconst builtinNames = new Set(BUILTIN_SLASH_COMMANDS.map((c) => c.name));\n\t\tfor (const cmd of this.session.extensionRunner.getRegisteredCommands()) {\n\t\t\tif (!builtinNames.has(cmd.name)) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: cmd.invocationName,\n\t\t\t\t\tdescription: cmd.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tsourceInfo: cmd.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// 4. Skill commands (gated by enableSkillCommands)\n\t\tif (this.session.settingsManager.getEnableSkillCommands()) {\n\t\t\tfor (const skill of this.session.resourceLoader.getSkills().skills) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\treturn this.session.modelRegistry.getAvailable().map((m) => ({\n\t\t\tid: m.id,\n\t\t\tname: m.name,\n\t\t\tprovider: m.provider,\n\t\t\treasoning: m.reasoning,\n\t\t\tcontextWindow: m.contextWindow,\n\t\t\tmaxTokens: m.maxTokens,\n\t\t\tinput: m.input,\n\t\t}));\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this.getModels();\n\t}\n\n\t// =========================================================================\n\t// Lifecycle\n\t// =========================================================================\n\n\tdispose(): void {\n\t\t// Don't dispose runtime here — the mode that created it handles that\n\t}\n\n\t// =========================================================================\n\t// Extras (not in interface)\n\t// =========================================================================\n\n\t/** Expose runtime for modes that need direct access (e.g., rebindSession callbacks) */\n\tget runtime(): AgentSessionRuntime {\n\t\treturn this._runtime;\n\t}\n\n\t/** Snapshot for serve mode */\n\tgetSnapshot(): SessionStateSnapshot {\n\t\tconst session = this.session;\n\t\tconst model = session.model;\n\n\t\t// Compute cumulative token usage from all entries\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tconst usingSubscription = model ? session.modelRegistry.isUsingOAuth(model) : false;\n\t\tconst tokenUsage: TokenUsage = {\n\t\t\tinput: totalInput,\n\t\t\toutput: totalOutput,\n\t\t\tcacheRead: totalCacheRead,\n\t\t\tcacheWrite: totalCacheWrite,\n\t\t\tcost: totalCost,\n\t\t\tusingSubscription,\n\t\t};\n\n\t\t// Compute context usage\n\t\tconst rawContextUsage = session.getContextUsage();\n\t\tconst contextUsage: ContextUsageInfo = rawContextUsage\n\t\t\t? {\n\t\t\t\t\ttokens: rawContextUsage.tokens,\n\t\t\t\t\tcontextWindow: rawContextUsage.contextWindow,\n\t\t\t\t\tpercent: rawContextUsage.percent,\n\t\t\t\t}\n\t\t\t: { tokens: null, contextWindow: model?.contextWindow ?? 0, percent: null };\n\n\t\t// Extract model info\n\t\tconst modelInfo: ModelInfo = model\n\t\t\t? { id: model.id, provider: model.provider, reasoning: model.reasoning, contextWindow: model.contextWindow }\n\t\t\t: { id: \"\", provider: \"\", reasoning: false, contextWindow: 0 };\n\n\t\treturn {\n\t\t\tmodel: this.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tisStreaming: this.isStreaming,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tsteeringMessages: this.steeringMessages,\n\t\t\tfollowUpMessages: this.followUpMessages,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionName: this.sessionName,\n\t\t\tmessages: this.messages,\n\t\t\tbanner: this._banner,\n\t\t\ttokenUsage,\n\t\t\tcontextUsage,\n\t\t\tmodelInfo,\n\t\t\tautoCompactEnabled: session.autoCompactionEnabled,\n\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\tavailableProviderCount: session.modelRegistry.getAvailable().length,\n\t\t\tremoteSettings: {\n\t\t\t\tautoCompact: session.autoCompactionEnabled,\n\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: session.getAvailableThinkingLevels(),\n\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\tenableSkillCommands: session.settingsManager.getEnableSkillCommands(),\n\t\t\t\tdoubleEscapeAction: session.settingsManager.getDoubleEscapeAction(),\n\t\t\t\tshowImages: session.settingsManager.getShowImages(),\n\t\t\t\timageWidthCells: session.settingsManager.getImageWidthCells(),\n\t\t\t\tautoResizeImages: session.settingsManager.getImageAutoResize(),\n\t\t\t\tblockImages: session.settingsManager.getBlockImages(),\n\t\t\t\ttransport: session.settingsManager.getTransport(),\n\t\t\t\thttpIdleTimeoutMs: session.settingsManager.getHttpIdleTimeoutMs(),\n\t\t\t\tcurrentTheme: session.settingsManager.getTheme() ?? \"\",\n\t\t\t\tavailableThemes: session.resourceLoader.getThemes().themes.map((t) => t.name) as string[],\n\t\t\t\thideThinkingBlock: session.settingsManager.getHideThinkingBlock(),\n\t\t\t\tcollapseChangelog: session.settingsManager.getCollapseChangelog(),\n\t\t\t\tenableInstallTelemetry: session.settingsManager.getEnableInstallTelemetry(),\n\t\t\t\ttreeFilterMode: session.settingsManager.getTreeFilterMode(),\n\t\t\t\tshowHardwareCursor: session.settingsManager.getShowHardwareCursor(),\n\t\t\t\teditorPaddingX: session.settingsManager.getEditorPaddingX(),\n\t\t\t\tautocompleteMaxVisible: session.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\tquietStartup: session.settingsManager.getQuietStartup(),\n\t\t\t\tclearOnShrink: session.settingsManager.getClearOnShrink(),\n\t\t\t\tshowTerminalProgress: session.settingsManager.getShowTerminalProgress(),\n\t\t\t\twarnings: session.settingsManager.getWarnings() as unknown as Record<string, unknown>,\n\t\t\t},\n\t\t\tscopedModelIds:\n\t\t\t\tsession.scopedModels.length > 0\n\t\t\t\t\t? session.scopedModels.map((sm) => `${sm.model.provider}/${sm.model.id}`)\n\t\t\t\t\t: null,\n\t\t\tenabledModelPatterns: session.settingsManager.getEnabledModels(),\n\t\t\textensionPaths: session.extensionRunner.getExtensionPaths(),\n\t\t};\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-agent-session-proxy.js","sourceRoot":"","sources":["../../src/core/local-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { ImageContent } from \"@sheason/pi-ai\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tBannerData,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"./agent-session-proxy.ts\";\nimport type { AgentSessionRuntime } from \"./agent-session-runtime.ts\";\nimport { BUILTIN_SLASH_COMMANDS } from \"./slash-commands.ts\";\n\n/**\n * Convert proxy-style image format ({ url, mediaType }) to the ImageContent\n * format expected by AgentSession ({ type, data, mimeType }).\n *\n * Supports:\n * - data URLs: data:image/png;base64,iVBOR... -> { type: \"image\", data: \"iVBOR...\", mimeType: \"image/png\" }\n * - bare base64 with mediaType: { url: \"<base64>\", mediaType: \"image/png\" }\n */\nfunction toImageContent(images: Array<{ url: string; mediaType?: string }>): ImageContent[] {\n\treturn images.map(({ url, mediaType }): ImageContent => {\n\t\t// Data URL: data:<mimeType>;base64,<data>\n\t\tconst dataUrlMatch = url.match(/^data:([^;]+);base64,(.+)$/s);\n\t\tif (dataUrlMatch) {\n\t\t\treturn { type: \"image\", data: dataUrlMatch[2], mimeType: dataUrlMatch[1] };\n\t\t}\n\t\t// Bare base64 — mediaType is required\n\t\tif (mediaType) {\n\t\t\treturn { type: \"image\", data: url, mimeType: mediaType };\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot convert image: URL is not a data URL and no mediaType provided. ` +\n\t\t\t\t`LocalAgentSessionProxy only supports data-URL images or base64 with explicit mediaType.`,\n\t\t);\n\t});\n}\n\n/**\n * Local implementation of AgentSessionProxy that wraps an in-process\n * AgentSession + AgentSessionRuntime.\n *\n * Used by serve mode (and could be used by interactive mode in the future).\n */\nexport class LocalAgentSessionProxy implements AgentSessionProxy {\n\tprivate readonly _runtime: AgentSessionRuntime;\n\tprivate _banner: BannerData | undefined;\n\t/** Listeners registered through this proxy — re-subscribed when the session changes */\n\tprivate _proxyListeners: Array<(event: AgentSessionEvent) => void> = [];\n\tprivate _sessionUnsubscribe: (() => void) | undefined;\n\n\tconstructor(runtime: AgentSessionRuntime) {\n\t\tthis._runtime = runtime;\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session and emit session_replaced */\n\tresubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._resubscribe(reason);\n\t}\n\n\t/** Called by the host mode to wire up the rebindSession callback */\n\tinstallRebindCallback(): void {\n\t\tthis._runtime.setRebindSession(async (_session, reason) => {\n\t\t\tthis._resubscribe(reason);\n\t\t});\n\t}\n\n\t/** Re-subscribe all proxy listeners to the current session */\n\tprivate _resubscribe(reason: \"new\" | \"resume\" | \"fork\" = \"new\"): void {\n\t\tthis._sessionUnsubscribe?.();\n\t\tthis._sessionUnsubscribe = undefined;\n\t\tif (this._proxyListeners.length === 0) return;\n\t\tconst session = this._runtime.session;\n\t\tconst combinedListener = (event: AgentSessionEvent) => {\n\t\t\tfor (const listener of this._proxyListeners) {\n\t\t\t\tlistener(event);\n\t\t\t}\n\t\t};\n\t\tthis._sessionUnsubscribe = session.subscribe(combinedListener);\n\t\t// Notify listeners that the session was replaced so they can reset UI\n\t\tfor (const listener of this._proxyListeners) {\n\t\t\tlistener({ type: \"session_replaced\", reason });\n\t\t}\n\t}\n\n\t/** Set the banner data (called by serve mode after initialization) */\n\tsetBanner(banner: BannerData | undefined): void {\n\t\tthis._banner = banner;\n\t}\n\n\tprivate get session(): AgentSession {\n\t\treturn this._runtime.session;\n\t}\n\n\t// =========================================================================\n\t// Event subscription\n\t// =========================================================================\n\n\tsubscribe(listener: (event: AgentSessionEvent) => void): () => void {\n\t\tthis._proxyListeners.push(listener);\n\t\t// If this is the first listener, subscribe to the session\n\t\tif (this._proxyListeners.length === 1) {\n\t\t\tthis._resubscribe();\n\t\t}\n\t\treturn () => {\n\t\t\tconst index = this._proxyListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._proxyListeners.splice(index, 1);\n\t\t\t}\n\t\t\t// If no more listeners, unsubscribe from session\n\t\t\tif (this._proxyListeners.length === 0) {\n\t\t\t\tthis._sessionUnsubscribe?.();\n\t\t\t\tthis._sessionUnsubscribe = undefined;\n\t\t\t}\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Commands\n\t// =========================================================================\n\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tconst images = options?.images ? toImageContent(options.images) : undefined;\n\t\tawait this.session.prompt(text, { images, streamingBehavior: options?.streamingBehavior });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.steer() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.steer(text, converted);\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tconst converted = images ? toImageContent(images) : undefined;\n\t\t// AgentSession.followUp() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.followUp(text, converted);\n\t}\n\n\tabort(): void {\n\t\t// AgentSession.abort() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.abort();\n\t}\n\n\tabortBash(): void {\n\t\tthis.session.abortBash();\n\t}\n\n\t// =========================================================================\n\t// State queries\n\t// =========================================================================\n\n\tget model(): string {\n\t\treturn this.session.model?.id ?? \"\";\n\t}\n\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.session.thinkingLevel;\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.session.isStreaming;\n\t}\n\n\tget isCompacting(): boolean {\n\t\treturn this.session.isCompacting;\n\t}\n\n\tget isBashRunning(): boolean {\n\t\treturn this.session.isBashRunning;\n\t}\n\n\tget steeringMessages(): readonly string[] {\n\t\treturn this.session.getSteeringMessages();\n\t}\n\n\tget followUpMessages(): readonly string[] {\n\t\treturn this.session.getFollowUpMessages();\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.session.sessionFile;\n\t}\n\n\tget sessionName(): string | undefined {\n\t\treturn this.session.sessionName;\n\t}\n\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this.session.messages;\n\t}\n\n\t// =========================================================================\n\t// Session operations\n\t// =========================================================================\n\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this.session.compact(customInstructions);\n\t}\n\n\tsetModel(modelId: string): void {\n\t\t// AgentSession.setModel() takes a Model<any> object, not a string.\n\t\t// Look up the model by ID from the model registry.\n\t\tconst registry = this.session.modelRegistry;\n\t\tconst available = registry.getAvailable();\n\n\t\t// Try \"provider/modelId\" format first\n\t\tconst slashIndex = modelId.indexOf(\"/\");\n\t\tlet model: ReturnType<typeof available.find> | undefined;\n\t\tif (slashIndex !== -1) {\n\t\t\tconst provider = modelId.slice(0, slashIndex);\n\t\t\tconst id = modelId.slice(slashIndex + 1);\n\t\t\tmodel = registry.find(provider, id);\n\t\t}\n\n\t\t// Fallback: search by model ID alone\n\t\tif (!model) {\n\t\t\tmodel = available.find((m) => m.id === modelId);\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthrow new Error(`Model not found: ${modelId}`);\n\t\t}\n\n\t\t// AgentSession.setModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.setModel(model);\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tconst dir = direction === 1 ? \"forward\" : \"backward\";\n\t\t// AgentSession.cycleModel() is async but the interface declares void.\n\t\t// Fire-and-forget to satisfy the synchronous signature.\n\t\tvoid this.session.cycleModel(dir);\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis.session.setThinkingLevel(level);\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\t// AgentSession.cycleThinkingLevel() takes no arguments and cycles forward.\n\t\t// Implement directional cycling manually.\n\t\tconst levels = this.session.getAvailableThinkingLevels();\n\t\tif (levels.length === 0) return;\n\n\t\tconst currentIndex = levels.indexOf(this.session.thinkingLevel);\n\t\tconst len = levels.length;\n\t\tconst nextIndex = direction === 1 ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\n\t\tthis.session.setThinkingLevel(levels[nextIndex]);\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.session.setAutoCompactionEnabled(enabled);\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setSteeringMode(mode);\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.session.setFollowUpMode(mode);\n\t}\n\n\t// =========================================================================\n\t// Runtime operations\n\t// =========================================================================\n\n\tasync newSession(): Promise<void> {\n\t\tawait this._runtime.newSession();\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._runtime.switchSession(sessionFile);\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._runtime.fork(entryId ?? \"\");\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis.session.sessionManager.appendSessionInfo(name);\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis.session.sessionManager.appendLabelChange(entryId, label);\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tif (enabledIds && enabledIds.length > 0) {\n\t\t\tconst allModels = this.session.modelRegistry.getAvailable();\n\t\t\tconst enabledSet = new Set(enabledIds);\n\t\t\tconst scoped = allModels.filter((m) => enabledSet.has(`${m.provider}/${m.id}`));\n\t\t\tthis.session.setScopedModels(scoped.map((m) => ({ model: m })));\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis.session.settingsManager.setEnabledModels(patterns);\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tconst sm = this.session.settingsManager;\n\t\tif (\"showImages\" in updates && typeof updates.showImages === \"boolean\") sm.setShowImages(updates.showImages);\n\t\tif (\"imageWidthCells\" in updates && typeof updates.imageWidthCells === \"number\")\n\t\t\tsm.setImageWidthCells(updates.imageWidthCells);\n\t\tif (\"autoResizeImages\" in updates && typeof updates.autoResizeImages === \"boolean\")\n\t\t\tsm.setImageAutoResize(updates.autoResizeImages);\n\t\tif (\"blockImages\" in updates && typeof updates.blockImages === \"boolean\") sm.setBlockImages(updates.blockImages);\n\t\tif (\"enableSkillCommands\" in updates && typeof updates.enableSkillCommands === \"boolean\")\n\t\t\tsm.setEnableSkillCommands(updates.enableSkillCommands);\n\t\tif (\"transport\" in updates && typeof updates.transport === \"string\") sm.setTransport(updates.transport as any);\n\t\tif (\"httpIdleTimeoutMs\" in updates && typeof updates.httpIdleTimeoutMs === \"number\")\n\t\t\tsm.setHttpIdleTimeoutMs(updates.httpIdleTimeoutMs);\n\t\tif (\"theme\" in updates && typeof updates.theme === \"string\") sm.setTheme(updates.theme);\n\t\tif (\"hideThinkingBlock\" in updates && typeof updates.hideThinkingBlock === \"boolean\")\n\t\t\tsm.setHideThinkingBlock(updates.hideThinkingBlock);\n\t\tif (\"collapseChangelog\" in updates && typeof updates.collapseChangelog === \"boolean\")\n\t\t\tsm.setCollapseChangelog(updates.collapseChangelog);\n\t\tif (\"enableInstallTelemetry\" in updates && typeof updates.enableInstallTelemetry === \"boolean\")\n\t\t\tsm.setEnableInstallTelemetry(updates.enableInstallTelemetry);\n\t\tif (\"doubleEscapeAction\" in updates && typeof updates.doubleEscapeAction === \"string\")\n\t\t\tsm.setDoubleEscapeAction(updates.doubleEscapeAction as any);\n\t\tif (\"treeFilterMode\" in updates && typeof updates.treeFilterMode === \"string\")\n\t\t\tsm.setTreeFilterMode(updates.treeFilterMode as any);\n\t\tif (\"showHardwareCursor\" in updates && typeof updates.showHardwareCursor === \"boolean\")\n\t\t\tsm.setShowHardwareCursor(updates.showHardwareCursor);\n\t\tif (\"editorPaddingX\" in updates && typeof updates.editorPaddingX === \"number\")\n\t\t\tsm.setEditorPaddingX(updates.editorPaddingX);\n\t\tif (\"autocompleteMaxVisible\" in updates && typeof updates.autocompleteMaxVisible === \"number\")\n\t\t\tsm.setAutocompleteMaxVisible(updates.autocompleteMaxVisible);\n\t\tif (\"quietStartup\" in updates && typeof updates.quietStartup === \"boolean\")\n\t\t\tsm.setQuietStartup(updates.quietStartup);\n\t\tif (\"clearOnShrink\" in updates && typeof updates.clearOnShrink === \"boolean\")\n\t\t\tsm.setClearOnShrink(updates.clearOnShrink);\n\t\tif (\"showTerminalProgress\" in updates && typeof updates.showTerminalProgress === \"boolean\")\n\t\t\tsm.setShowTerminalProgress(updates.showTerminalProgress);\n\t\tif (\"warnings\" in updates && typeof updates.warnings === \"object\" && updates.warnings !== null)\n\t\t\tsm.setWarnings(updates.warnings as any);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.session.reload();\n\t}\n\n\tgetTree(): TreeNodeData[] {\n\t\tconst tree = this.session.sessionManager.getTree();\n\t\treturn tree.map((node) => this._convertTreeNode(node));\n\t}\n\n\tprivate _convertTreeNode(node: {\n\t\tentry: { id: string; type: string; parentId: string | null; timestamp: string };\n\t\tchildren: unknown[];\n\t\tlabel?: string;\n\t}): TreeNodeData {\n\t\tlet preview: string | undefined;\n\t\tconst entry = node.entry;\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msg = (\n\t\t\t\tentry as unknown as {\n\t\t\t\t\ttype: \"message\";\n\t\t\t\t\tmessage: { role: string; content: string | Array<{ type: string; text?: string }> };\n\t\t\t\t}\n\t\t\t).message;\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\tpreview =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content.slice(0, 80)\n\t\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t\t.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n\t\t\t\t\t\t\t\t.map((p) => p.text)\n\t\t\t\t\t\t\t\t.join(\" \")\n\t\t\t\t\t\t\t\t.slice(0, 80);\n\t\t\t} else if (msg.role === \"assistant\") {\n\t\t\t\tpreview = \"(assistant)\";\n\t\t\t}\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tpreview = \"(compaction)\";\n\t\t}\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\ttype: entry.type,\n\t\t\tparentId: entry.parentId,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlabel: node.label,\n\t\t\tpreview,\n\t\t\tchildren: (node.children as unknown[]).map((child) =>\n\t\t\t\tthis._convertTreeNode(child as Parameters<typeof this._convertTreeNode>[0]),\n\t\t\t),\n\t\t};\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\treturn this.session.getUserMessagesForForking().map((m) => ({ id: m.entryId, text: m.text }));\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\tconst { SessionManager } = await import(\"./session-manager.ts\");\n\t\tconst cwd = this.session.sessionManager.getCwd();\n\t\tconst sessions = await SessionManager.list(cwd);\n\t\treturn sessions.map((s) => ({\n\t\t\tpath: s.path,\n\t\t\tid: s.id,\n\t\t\tcwd: s.cwd,\n\t\t\tname: s.name,\n\t\t\tparentSessionPath: s.parentSessionPath,\n\t\t\tcreated: s.created.toISOString(),\n\t\t\tmodified: s.modified.toISOString(),\n\t\t\tmessageCount: s.messageCount,\n\t\t\tfirstMessage: s.firstMessage,\n\t\t}));\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this.getTree();\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this.getUserMessagesForForking();\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this.getCommands();\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tconst commands: ServeSlashCommand[] = [];\n\n\t\t// 1. Builtin commands\n\t\tfor (const cmd of BUILTIN_SLASH_COMMANDS) {\n\t\t\tcommands.push({ name: cmd.name, description: cmd.description, source: \"builtin\" });\n\t\t}\n\t\t// /model gets an argument hint\n\t\tconst modelCmd = commands.find((c) => c.name === \"model\");\n\t\tif (modelCmd) modelCmd.argumentHint = \"<provider/model-id>\";\n\n\t\t// 2. Prompt templates\n\t\tfor (const tmpl of this.session.promptTemplates) {\n\t\t\tcommands.push({\n\t\t\t\tname: tmpl.name,\n\t\t\t\tdescription: tmpl.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: tmpl.sourceInfo,\n\t\t\t});\n\t\t}\n\n\t\t// 3. Extension commands (exclude names that clash with builtins)\n\t\tconst builtinNames = new Set(BUILTIN_SLASH_COMMANDS.map((c) => c.name));\n\t\tfor (const cmd of this.session.extensionRunner.getRegisteredCommands()) {\n\t\t\tif (!builtinNames.has(cmd.name)) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: cmd.invocationName,\n\t\t\t\t\tdescription: cmd.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tsourceInfo: cmd.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// 4. Skill commands (gated by enableSkillCommands)\n\t\tif (this.session.settingsManager.getEnableSkillCommands()) {\n\t\t\tfor (const skill of this.session.resourceLoader.getSkills().skills) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\treturn this.session.modelRegistry.getAvailable().map((m) => ({\n\t\t\tid: m.id,\n\t\t\tname: m.name,\n\t\t\tprovider: m.provider,\n\t\t\tapi: m.api,\n\t\t\tbaseUrl: m.baseUrl,\n\t\t\tcost: {\n\t\t\t\tinput: m.cost.input,\n\t\t\t\toutput: m.cost.output,\n\t\t\t\tcacheRead: m.cost.cacheRead,\n\t\t\t\tcacheWrite: m.cost.cacheWrite,\n\t\t\t},\n\t\t\treasoning: m.reasoning,\n\t\t\tcontextWindow: m.contextWindow,\n\t\t\tmaxTokens: m.maxTokens,\n\t\t\tinput: m.input,\n\t\t}));\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this.getModels();\n\t}\n\n\t// =========================================================================\n\t// Lifecycle\n\t// =========================================================================\n\n\tdispose(): void {\n\t\t// Don't dispose runtime here — the mode that created it handles that\n\t}\n\n\t// =========================================================================\n\t// Extras (not in interface)\n\t// =========================================================================\n\n\t/** Expose runtime for modes that need direct access (e.g., rebindSession callbacks) */\n\tget runtime(): AgentSessionRuntime {\n\t\treturn this._runtime;\n\t}\n\n\t/** Snapshot for serve mode */\n\tgetSnapshot(): SessionStateSnapshot {\n\t\tconst session = this.session;\n\t\tconst model = session.model;\n\n\t\t// Compute cumulative token usage from all entries\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tconst usingSubscription = model ? session.modelRegistry.isUsingOAuth(model) : false;\n\t\tconst tokenUsage: TokenUsage = {\n\t\t\tinput: totalInput,\n\t\t\toutput: totalOutput,\n\t\t\tcacheRead: totalCacheRead,\n\t\t\tcacheWrite: totalCacheWrite,\n\t\t\tcost: totalCost,\n\t\t\tusingSubscription,\n\t\t};\n\n\t\t// Compute context usage\n\t\tconst rawContextUsage = session.getContextUsage();\n\t\tconst contextUsage: ContextUsageInfo = rawContextUsage\n\t\t\t? {\n\t\t\t\t\ttokens: rawContextUsage.tokens,\n\t\t\t\t\tcontextWindow: rawContextUsage.contextWindow,\n\t\t\t\t\tpercent: rawContextUsage.percent,\n\t\t\t\t}\n\t\t\t: { tokens: null, contextWindow: model?.contextWindow ?? 0, percent: null };\n\n\t\t// Extract model info\n\t\tconst modelInfo: ModelInfo = model\n\t\t\t? { id: model.id, provider: model.provider, reasoning: model.reasoning, contextWindow: model.contextWindow }\n\t\t\t: { id: \"\", provider: \"\", reasoning: false, contextWindow: 0 };\n\n\t\treturn {\n\t\t\tmodel: this.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tisStreaming: this.isStreaming,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tsteeringMessages: this.steeringMessages,\n\t\t\tfollowUpMessages: this.followUpMessages,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionName: this.sessionName,\n\t\t\tmessages: this.messages,\n\t\t\tbanner: this._banner,\n\t\t\ttokenUsage,\n\t\t\tcontextUsage,\n\t\t\tmodelInfo,\n\t\t\tautoCompactEnabled: session.autoCompactionEnabled,\n\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\tavailableProviderCount: session.modelRegistry.getAvailable().length,\n\t\t\tremoteSettings: {\n\t\t\t\tautoCompact: session.autoCompactionEnabled,\n\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: session.getAvailableThinkingLevels(),\n\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\tenableSkillCommands: session.settingsManager.getEnableSkillCommands(),\n\t\t\t\tdoubleEscapeAction: session.settingsManager.getDoubleEscapeAction(),\n\t\t\t\tshowImages: session.settingsManager.getShowImages(),\n\t\t\t\timageWidthCells: session.settingsManager.getImageWidthCells(),\n\t\t\t\tautoResizeImages: session.settingsManager.getImageAutoResize(),\n\t\t\t\tblockImages: session.settingsManager.getBlockImages(),\n\t\t\t\ttransport: session.settingsManager.getTransport(),\n\t\t\t\thttpIdleTimeoutMs: session.settingsManager.getHttpIdleTimeoutMs(),\n\t\t\t\tcurrentTheme: session.settingsManager.getTheme() ?? \"\",\n\t\t\t\tavailableThemes: session.resourceLoader.getThemes().themes.map((t) => t.name) as string[],\n\t\t\t\thideThinkingBlock: session.settingsManager.getHideThinkingBlock(),\n\t\t\t\tcollapseChangelog: session.settingsManager.getCollapseChangelog(),\n\t\t\t\tenableInstallTelemetry: session.settingsManager.getEnableInstallTelemetry(),\n\t\t\t\ttreeFilterMode: session.settingsManager.getTreeFilterMode(),\n\t\t\t\tshowHardwareCursor: session.settingsManager.getShowHardwareCursor(),\n\t\t\t\teditorPaddingX: session.settingsManager.getEditorPaddingX(),\n\t\t\t\tautocompleteMaxVisible: session.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\tquietStartup: session.settingsManager.getQuietStartup(),\n\t\t\t\tclearOnShrink: session.settingsManager.getClearOnShrink(),\n\t\t\t\tshowTerminalProgress: session.settingsManager.getShowTerminalProgress(),\n\t\t\t\twarnings: session.settingsManager.getWarnings() as unknown as Record<string, unknown>,\n\t\t\t},\n\t\t\tscopedModelIds:\n\t\t\t\tsession.scopedModels.length > 0\n\t\t\t\t\t? session.scopedModels.map((sm) => `${sm.model.provider}/${sm.model.id}`)\n\t\t\t\t\t: null,\n\t\t\tenabledModelPatterns: session.settingsManager.getEnabledModels(),\n\t\t\textensionPaths: session.extensionRunner.getExtensionPaths(),\n\t\t};\n\t}\n}\n"]}
|
|
@@ -19,6 +19,7 @@ export declare class RemoteAgentSessionProxy implements AgentSessionProxy {
|
|
|
19
19
|
private _updateState;
|
|
20
20
|
private _fetchState;
|
|
21
21
|
private _post;
|
|
22
|
+
private _getJson;
|
|
22
23
|
subscribe(listener: Listener): () => void;
|
|
23
24
|
prompt(text: string, options?: ProxyPromptOptions): Promise<void>;
|
|
24
25
|
steer(text: string, images?: Array<{
|