@code-yeongyu/senpi 2026.8.27 → 2026.8.28-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.
Files changed (181) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/cli/args.d.ts +2 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +4 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +2 -0
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +5 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +1 -0
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auth-storage.d.ts +1 -0
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +3 -0
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/credential-accounts.d.ts +31 -0
  18. package/dist/core/credential-accounts.d.ts.map +1 -0
  19. package/dist/core/credential-accounts.js +135 -0
  20. package/dist/core/credential-accounts.js.map +1 -0
  21. package/dist/core/credential-pool/classify.d.ts +6 -1
  22. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  23. package/dist/core/credential-pool/classify.js +22 -5
  24. package/dist/core/credential-pool/classify.js.map +1 -1
  25. package/dist/core/credential-pool/failover.d.ts +8 -0
  26. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  27. package/dist/core/credential-pool/failover.js +24 -6
  28. package/dist/core/credential-pool/failover.js.map +1 -1
  29. package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
  30. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
  31. package/dist/core/credential-pool/rotation-stream.js +97 -10
  32. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  33. package/dist/core/extensions/builtin/account/index.d.ts +9 -0
  34. package/dist/core/extensions/builtin/account/index.d.ts.map +1 -0
  35. package/dist/core/extensions/builtin/account/index.js +69 -0
  36. package/dist/core/extensions/builtin/account/index.js.map +1 -0
  37. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/goal/index.js +7 -0
  39. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  40. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/imagegen/index.js +10 -3
  42. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
  43. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/index.js +4 -0
  45. package/dist/core/extensions/builtin/index.js.map +1 -1
  46. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/service-tier.js +13 -0
  48. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  49. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/terminal/extension.js +4 -2
  51. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  52. package/dist/core/model-config-schema.d.ts +4 -4
  53. package/dist/core/model-runtime.d.ts +2 -0
  54. package/dist/core/model-runtime.d.ts.map +1 -1
  55. package/dist/core/model-runtime.js +74 -37
  56. package/dist/core/model-runtime.js.map +1 -1
  57. package/dist/core/retry-fallback/chains.d.ts +23 -1
  58. package/dist/core/retry-fallback/chains.d.ts.map +1 -1
  59. package/dist/core/retry-fallback/chains.js +59 -3
  60. package/dist/core/retry-fallback/chains.js.map +1 -1
  61. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  62. package/dist/core/retry-fallback/controller.js +9 -2
  63. package/dist/core/retry-fallback/controller.js.map +1 -1
  64. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  65. package/dist/core/retry-fallback/settings.js +9 -0
  66. package/dist/core/retry-fallback/settings.js.map +1 -1
  67. package/dist/core/retry-fallback/validate.js +1 -1
  68. package/dist/core/retry-fallback/validate.js.map +1 -1
  69. package/dist/core/sdk.js +1 -1
  70. package/dist/core/sdk.js.map +1 -1
  71. package/dist/core/session-manager.d.ts +9 -0
  72. package/dist/core/session-manager.d.ts.map +1 -1
  73. package/dist/core/session-manager.js +31 -0
  74. package/dist/core/session-manager.js.map +1 -1
  75. package/dist/main.d.ts +7 -0
  76. package/dist/main.d.ts.map +1 -1
  77. package/dist/main.js +22 -2
  78. package/dist/main.js.map +1 -1
  79. package/dist/modes/app-server/server/account.d.ts.map +1 -1
  80. package/dist/modes/app-server/server/account.js +5 -5
  81. package/dist/modes/app-server/server/account.js.map +1 -1
  82. package/dist/modes/interactive/components/footer.d.ts +11 -3
  83. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  84. package/dist/modes/interactive/components/footer.js +31 -1
  85. package/dist/modes/interactive/components/footer.js.map +1 -1
  86. package/dist/modes/interactive/grok/chrome.d.ts +4 -4
  87. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  88. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  89. package/dist/modes/interactive/grok/footer.d.ts +3 -3
  90. package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
  91. package/dist/modes/interactive/grok/footer.js.map +1 -1
  92. package/dist/modes/interactive/interactive-host-runtime.d.ts +16 -1
  93. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-host-runtime.js +321 -36
  95. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  96. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  97. package/dist/modes/interactive/interactive-mode.js +295 -250
  98. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  99. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  100. package/dist/modes/rpc/connection-handler.js +144 -29
  101. package/dist/modes/rpc/connection-handler.js.map +1 -1
  102. package/dist/modes/rpc/multi-session-host.js +14 -4
  103. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  104. package/dist/modes/rpc/rpc-client.d.ts +90 -8
  105. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  106. package/dist/modes/rpc/rpc-client.js +118 -23
  107. package/dist/modes/rpc/rpc-client.js.map +1 -1
  108. package/dist/modes/rpc/rpc-mode.d.ts +3 -1
  109. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  110. package/dist/modes/rpc/rpc-mode.js +3 -1
  111. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  112. package/dist/modes/rpc/rpc-types.d.ts +164 -2
  113. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  114. package/dist/modes/rpc/rpc-types.js.map +1 -1
  115. package/dist/modes/rpc/session-command-router.d.ts +22 -0
  116. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  117. package/dist/modes/rpc/session-command-router.js +153 -14
  118. package/dist/modes/rpc/session-command-router.js.map +1 -1
  119. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  120. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  121. package/dist/modes/rpc/session-event-writer.js +4 -0
  122. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  123. package/dist/modes/rpc/session-registry.d.ts +16 -0
  124. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  125. package/dist/modes/rpc/session-registry.js +40 -3
  126. package/dist/modes/rpc/session-registry.js.map +1 -1
  127. package/docs/providers.md +48 -0
  128. package/docs/rpc.md +43 -4
  129. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  130. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  131. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +13 -1
  132. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +15 -1
  133. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +14 -1
  134. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +20 -4
  136. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +1 -1
  138. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -1
  140. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts +21 -0
  141. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts.map +1 -0
  142. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js +27 -0
  143. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js.map +1 -0
  144. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +24 -0
  145. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -1
  146. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +7 -2
  149. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  151. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +2 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +3 -2
  156. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  177. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  178. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  179. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  180. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  181. package/package.json +7 -7
@@ -1,3 +1,6 @@
1
+ import { executeBashWithOperations } from "../../core/bash-executor.js";
2
+ import { SessionManager } from "../../core/session-manager.js";
3
+ import { SettingsManager } from "../../core/settings-manager.js";
1
4
  import { ensureHost } from "../rpc/host-ensure.js";
2
5
  import { RpcClient } from "../rpc/rpc-client.js";
3
6
  export const INTERACTIVE_HOST_FALLBACK_WARNING = "Warning: shared interactive host unavailable; continuing locally";
@@ -23,7 +26,7 @@ export async function createInteractiveHostRuntime(localRuntime, options) {
23
26
  modelId: localRuntime.session.model?.id,
24
27
  thinkingLevel: localRuntime.session.thinkingLevel,
25
28
  });
26
- const remoteSession = createRemoteSessionProxy(localRuntime.session, client, opened.state);
29
+ const remoteSession = createRemoteSessionProxy(localRuntime.session, localRuntime.services.agentDir, client, opened.state, options.onWarning);
27
30
  return new RemoteInteractiveRuntime(localRuntime, remoteSession, client);
28
31
  }
29
32
  catch (cause) {
@@ -38,23 +41,23 @@ export async function createInteractiveHostRuntime(localRuntime, options) {
38
41
  }
39
42
  class RemoteInteractiveRuntime {
40
43
  #local;
41
- #session;
44
+ #remoteSession;
42
45
  #client;
43
46
  #rebindSession;
44
47
  #beforeSessionInvalidate;
45
- constructor(local, session, client) {
48
+ constructor(local, remoteSession, client) {
46
49
  this.#local = local;
47
- this.#session = session;
50
+ this.#remoteSession = remoteSession;
48
51
  this.#client = client;
49
52
  }
50
53
  get session() {
51
- return this.#session;
54
+ return this.#remoteSession.session;
52
55
  }
53
56
  get services() {
54
57
  return this.#local.services;
55
58
  }
56
59
  get cwd() {
57
- return this.#local.cwd;
60
+ return this.#remoteSession.session.sessionManager.getCwd();
58
61
  }
59
62
  get diagnostics() {
60
63
  return this.#local.diagnostics;
@@ -76,45 +79,140 @@ class RemoteInteractiveRuntime {
76
79
  await this.#client.stop();
77
80
  await this.#local.dispose();
78
81
  }
79
- async newSession() {
80
- this.#beforeSessionInvalidate?.();
81
- const result = await this.#client.newSession();
82
- if (!result.cancelled)
82
+ async newSession(options) {
83
+ const result = await this.#client.newSession(options?.parentSession);
84
+ if (!result.cancelled) {
85
+ this.#beforeSessionInvalidate?.();
86
+ this.#remoteSession.abortLocalBash();
87
+ await this.#remoteSession.refresh();
88
+ if (options?.setup) {
89
+ const capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());
90
+ await options.setup(capture);
91
+ for (const entry of capture.getEntries())
92
+ await this.#client.appendSessionEntry(entry);
93
+ await this.#remoteSession.refresh();
94
+ }
83
95
  await this.#rebindSession?.();
96
+ if (options?.withSession)
97
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
98
+ }
84
99
  return result;
85
100
  }
86
- async switchSession(sessionPath) {
87
- this.#beforeSessionInvalidate?.();
88
- const result = await this.#client.switchSession(sessionPath);
89
- if (!result.cancelled)
101
+ async switchSession(sessionPath, options) {
102
+ const result = await this.#client.switchSession(sessionPath, options);
103
+ if (!result.cancelled) {
104
+ this.#beforeSessionInvalidate?.();
105
+ this.#remoteSession.abortLocalBash();
106
+ await this.#remoteSession.refresh();
90
107
  await this.#rebindSession?.();
108
+ // The shared host already resolved trust; this callback is retained for
109
+ // compatibility, but its result cannot override host-authoritative state.
110
+ options?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());
111
+ if (options?.withSession)
112
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
113
+ }
91
114
  return result;
92
115
  }
93
- async fork(entryId) {
94
- this.#beforeSessionInvalidate?.();
95
- const result = await this.#client.fork(entryId);
96
- if (!result.cancelled)
97
- await this.#rebindSession?.();
116
+ async fork(entryId, options) {
117
+ const result = await this.#client.fork(entryId, options);
118
+ if (!result.cancelled) {
119
+ this.#beforeSessionInvalidate?.();
120
+ this.#remoteSession.abortLocalBash();
121
+ await this.#refreshAndRebind();
122
+ if (options?.withSession)
123
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
124
+ }
98
125
  return { cancelled: result.cancelled, selectedText: result.text };
99
126
  }
100
- async importFromJsonl() {
101
- throw new Error("Session import is not available while connected to the shared host");
127
+ async importFromJsonl(inputPath, cwdOverride) {
128
+ const result = await this.#client.importJsonl(inputPath, cwdOverride);
129
+ if (!result.cancelled) {
130
+ this.#beforeSessionInvalidate?.();
131
+ this.#remoteSession.abortLocalBash();
132
+ await this.#refreshAndRebind();
133
+ }
134
+ return result;
135
+ }
136
+ async #refreshAndRebind() {
137
+ await this.#remoteSession.refresh();
138
+ await this.#rebindSession?.();
102
139
  }
103
140
  }
104
- function createRemoteSessionProxy(local, client, initialState) {
105
- let state = initialState;
141
+ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarning) {
142
+ // Fire-and-forget setters keep the sync AgentSession signature, but their RPC
143
+ // failures must not vanish: the matching *_changed wire event confirms success,
144
+ // and a rejection here is the only signal of failure.
145
+ const reportActionFailure = (action) => (error) => {
146
+ onWarning?.({
147
+ type: "interactive_host_action_failed",
148
+ message: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,
149
+ cause: error,
150
+ });
151
+ };
152
+ let state = { ...initialState };
153
+ let bashChunk;
154
+ let localBashAbortController;
155
+ let localBashRunning = false;
156
+ let hostBashRunning = initialState.isBashRunning;
157
+ let sessionManager = local.sessionManager;
158
+ let settingsManager = SettingsManager.create(initialState.cwd, agentDir, {
159
+ projectTrusted: initialState.projectTrusted,
160
+ });
161
+ const updateBashState = () => {
162
+ state = { ...state, isBashRunning: localBashRunning || hostBashRunning };
163
+ };
164
+ const remoteSessionManager = new Proxy({}, {
165
+ get(_target, property, _receiver) {
166
+ if (property === "appendLabelChange") {
167
+ return (entryId, label) => void client.setLabel(entryId, label);
168
+ }
169
+ if (property === "getSessionName")
170
+ return () => state.sessionName;
171
+ const value = Reflect.get(sessionManager, property, sessionManager);
172
+ return typeof value === "function" ? value.bind(sessionManager) : value;
173
+ },
174
+ });
106
175
  let streamingAssistant;
107
176
  const listeners = new Set();
108
177
  client.onEvent((wireEvent) => {
109
178
  if (wireEvent.type === "agent_settled")
110
- state = { ...state, isStreaming: false };
179
+ state = { ...state, isStreaming: false, retryAttempt: 0 };
180
+ if (wireEvent.type === "bash_start") {
181
+ hostBashRunning = true;
182
+ updateBashState();
183
+ }
184
+ if (wireEvent.type === "bash_end") {
185
+ hostBashRunning = false;
186
+ updateBashState();
187
+ }
188
+ if (wireEvent.type === "bash_execution_update")
189
+ bashChunk?.(wireEvent.delta);
111
190
  if (wireEvent.type === "agent_start")
112
191
  state = { ...state, isStreaming: true };
192
+ if (wireEvent.type === "compaction_start")
193
+ state = { ...state, isCompacting: true };
194
+ if (wireEvent.type === "compaction_end")
195
+ state = { ...state, isCompacting: false };
196
+ if (wireEvent.type === "auto_retry_start")
197
+ state = { ...state, retryAttempt: wireEvent.attempt };
198
+ if (wireEvent.type === "auto_retry_end")
199
+ state = { ...state, retryAttempt: 0 };
200
+ if (wireEvent.type === "queue_update") {
201
+ state = {
202
+ ...state,
203
+ steering: [...wireEvent.steering],
204
+ followUp: [...wireEvent.followUp],
205
+ ordered: [...wireEvent.ordered],
206
+ pendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,
207
+ };
208
+ }
113
209
  if (wireEvent.type === "model_changed") {
114
210
  state = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };
115
211
  }
116
212
  if (wireEvent.type === "thinking_level_changed")
117
213
  state = { ...state, thinkingLevel: wireEvent.level };
214
+ if (wireEvent.type === "session_info_changed")
215
+ state = { ...state, sessionName: wireEvent.name };
118
216
  if (wireEvent.type === "message_start") {
119
217
  if (wireEvent.message.role === "assistant")
120
218
  streamingAssistant = structuredClone(wireEvent.message);
@@ -128,54 +226,157 @@ function createRemoteSessionProxy(local, client, initialState) {
128
226
  if (previous?.role === wireEvent.message.role)
129
227
  messages[messages.length - 1] = structuredClone(wireEvent.message);
130
228
  }
229
+ if (wireEvent.type === "compaction_end" && wireEvent.accepted && !wireEvent.aborted) {
230
+ try {
231
+ sessionManager.reloadFromDisk?.();
232
+ local.agent.state.messages = sessionManager.buildSessionContext().messages;
233
+ }
234
+ catch {
235
+ // Non-fatal if session file is transiently locked or unavailable
236
+ }
237
+ }
131
238
  const event = hydrateMessageUpdate(wireEvent, streamingAssistant);
132
239
  for (const listener of listeners)
133
240
  listener(event);
134
241
  });
242
+ const refresh = async () => {
243
+ const nextState = await client.getState();
244
+ state = { ...stateFromRpc(nextState) };
245
+ let messages;
246
+ settingsManager = SettingsManager.create(nextState.cwd, agentDir, {
247
+ projectTrusted: nextState.projectTrusted,
248
+ });
249
+ if (nextState.sessionFile) {
250
+ // SessionManager.open retains the explicit path even when the host has
251
+ // deferred creating the file for a setup-only session.
252
+ sessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);
253
+ if (nextState.entries?.length && !sessionManager.getEntries().length) {
254
+ for (const entry of nextState.entries)
255
+ sessionManager.appendEntry(entry);
256
+ }
257
+ messages = sessionManager.buildSessionContext().messages;
258
+ }
259
+ else {
260
+ messages = await client.getMessages();
261
+ }
262
+ local.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));
263
+ streamingAssistant = undefined;
264
+ };
135
265
  const session = new Proxy(local, {
136
266
  get(target, property, receiver) {
137
267
  if (property === "prompt")
138
- return (message, options) => client.prompt(message, options?.images);
268
+ return (message, options) => client.prompt(message, {
269
+ ...(options?.images ? { images: options.images } : {}),
270
+ ...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),
271
+ ...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),
272
+ ...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),
273
+ ...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),
274
+ });
139
275
  if (property === "abort")
140
276
  return () => client.abort();
277
+ if (property === "abortCompaction")
278
+ return () => void client.abortCompaction();
141
279
  if (property === "steer")
142
- return (message, images) => client.steer(message, images);
280
+ return (message, images, recovery) => {
281
+ const enqueueOrder = recovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;
282
+ state = {
283
+ ...state,
284
+ steering: [...state.steering, message],
285
+ ordered: [...state.ordered, { text: message, mode: "steer", enqueueOrder }],
286
+ pendingMessageCount: state.pendingMessageCount + 1,
287
+ };
288
+ return client.steer(message, images, { ...recovery, enqueueOrder });
289
+ };
143
290
  if (property === "followUp")
144
- return (message, images) => client.followUp(message, images);
291
+ return (message, images, recovery) => {
292
+ const enqueueOrder = recovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;
293
+ state = {
294
+ ...state,
295
+ followUp: [...state.followUp, message],
296
+ ordered: [...state.ordered, { text: message, mode: "followUp", enqueueOrder }],
297
+ pendingMessageCount: state.pendingMessageCount + 1,
298
+ };
299
+ return client.followUp(message, images, { ...recovery, enqueueOrder });
300
+ };
145
301
  if (property === "waitForIdle")
146
302
  return () => client.waitForIdle();
147
303
  if (property === "getLastAssistantText")
148
304
  return () => target.getLastAssistantText();
149
305
  if (property === "setModel")
150
306
  return async (model) => {
151
- await client.setModel(model.provider, model.id);
307
+ const next = await client.setModel(model.provider, model.id);
308
+ return { systemPromptName: next.systemPromptName, model: next };
152
309
  };
153
310
  if (property === "cycleModel")
154
311
  return () => client.cycleModel();
155
312
  if (property === "setThinkingLevel")
156
- return (level) => void client.setThinkingLevel(level);
313
+ return (level) => void client.setThinkingLevel(level).catch(reportActionFailure("setThinkingLevel"));
157
314
  if (property === "cycleThinkingLevel")
158
315
  return () => client.cycleThinkingLevel().then((result) => result?.level);
159
316
  if (property === "getAvailableThinkingLevels")
160
317
  return () => client.getAvailableThinkingLevels();
161
318
  if (property === "setSteeringMode")
162
- return (mode) => void client.setSteeringMode(mode);
319
+ return (mode) => void client.setSteeringMode(mode).catch(reportActionFailure("setSteeringMode"));
163
320
  if (property === "setFollowUpMode")
164
- return (mode) => void client.setFollowUpMode(mode);
321
+ return (mode) => void client.setFollowUpMode(mode).catch(reportActionFailure("setFollowUpMode"));
165
322
  if (property === "compact")
166
323
  return (instructions) => client.compact(instructions);
167
324
  if (property === "setAutoCompactionEnabled")
168
- return (enabled) => void client.setAutoCompaction(enabled);
325
+ return (enabled) => void client.setAutoCompaction(enabled).catch(reportActionFailure("setAutoCompaction"));
169
326
  if (property === "executeBash")
170
- return (command) => client.bash(command);
327
+ return async (command, onChunk, options) => {
328
+ if (options?.operations && typeof options.operations.exec === "function") {
329
+ const abortController = new AbortController();
330
+ localBashAbortController = abortController;
331
+ localBashRunning = true;
332
+ updateBashState();
333
+ const sessionAtStart = state.sessionId;
334
+ const prefix = settingsManager.getShellCommandPrefix();
335
+ const resolvedCommand = prefix ? `${prefix}\n${command}` : command;
336
+ try {
337
+ const result = await executeBashWithOperations(resolvedCommand, state.cwd, options.operations, { onChunk, signal: abortController.signal });
338
+ if (state.sessionId === sessionAtStart) {
339
+ await client.recordBashResult(command, result, options.excludeFromContext);
340
+ }
341
+ return result;
342
+ }
343
+ finally {
344
+ localBashAbortController = undefined;
345
+ localBashRunning = false;
346
+ updateBashState();
347
+ }
348
+ }
349
+ bashChunk = onChunk;
350
+ try {
351
+ return await client.bash(command, {
352
+ excludeFromContext: options?.excludeFromContext,
353
+ operations: options?.operations,
354
+ });
355
+ }
356
+ finally {
357
+ bashChunk = undefined;
358
+ }
359
+ };
171
360
  if (property === "abortBash")
172
- return () => void client.abortBash();
361
+ return () => {
362
+ if (localBashAbortController)
363
+ localBashAbortController.abort();
364
+ else
365
+ void client.abortBash().catch(reportActionFailure("abortBash"));
366
+ };
173
367
  if (property === "getSessionStats")
174
368
  return () => client.getSessionStats();
175
369
  if (property === "exportToHtml")
176
370
  return (outputPath) => client.exportHtml(outputPath).then((result) => result.path);
177
371
  if (property === "setSessionName")
178
- return (name) => void client.setSessionName(name);
372
+ return (name) => client.setSessionName(name).catch(reportActionFailure("setSessionName"));
373
+ if (property === "navigateTree")
374
+ return async (targetId, options) => {
375
+ const result = await client.navigateTree(targetId, options);
376
+ if (!result.cancelled)
377
+ await refresh();
378
+ return result;
379
+ };
179
380
  if (property === "getUserMessagesForForking")
180
381
  return () => client.getForkMessages();
181
382
  if (property === "subscribe")
@@ -189,10 +390,63 @@ function createRemoteSessionProxy(local, client, initialState) {
189
390
  };
190
391
  if (property === "isStreaming")
191
392
  return state.isStreaming;
393
+ if (property === "isCompacting")
394
+ return state.isCompacting;
395
+ if (property === "pendingMessageCount")
396
+ return state.pendingMessageCount;
397
+ if (property === "getSteeringMessages")
398
+ return () => state.steering;
399
+ if (property === "getFollowUpMessages")
400
+ return () => state.followUp;
401
+ if (property === "clearQueue")
402
+ return (options) => {
403
+ const result = {
404
+ steering: [...state.steering],
405
+ followUp: [...state.followUp],
406
+ ordered: [...state.ordered],
407
+ };
408
+ Object.defineProperty(result, "ordered", { value: result.ordered, enumerable: false });
409
+ void client.clearQueue(options).catch(reportActionFailure("clearQueue"));
410
+ return result;
411
+ };
412
+ if (property === "abortBranchSummary")
413
+ return () => void client.abortBranchSummary().catch(reportActionFailure("abortBranchSummary"));
414
+ if (property === "recordBashResult")
415
+ return (command, result, options) => void client
416
+ .recordBashResult(command, result, options?.excludeFromContext)
417
+ .catch(reportActionFailure("recordBashResult"));
418
+ if (property === "set_label")
419
+ return undefined;
420
+ if (property === "retryAttempt")
421
+ return state.retryAttempt;
422
+ if (property === "isBashRunning")
423
+ return state.isBashRunning;
424
+ if (property === "reload")
425
+ return (_options) => client.reload();
426
+ if (property === "checkReloadVeto")
427
+ return () => client.checkReloadVeto();
428
+ if (property === "exportToJsonl")
429
+ return (outputPath) => client.exportJsonl(outputPath).then((result) => result.path);
430
+ // The footer and other renderers read session.state.*; surface the
431
+ // host-authoritative fields there too, not only via the direct getters.
432
+ if (property === "state") {
433
+ const localState = target.state;
434
+ return {
435
+ ...localState,
436
+ model: state.model ?? localState.model,
437
+ thinkingLevel: state.thinkingLevel,
438
+ isStreaming: state.isStreaming,
439
+ isCompacting: state.isCompacting,
440
+ };
441
+ }
192
442
  if (property === "sessionFile")
193
443
  return state.sessionFile;
194
444
  if (property === "sessionId")
195
445
  return state.sessionId;
446
+ if (property === "sessionName")
447
+ return state.sessionName;
448
+ if (property === "sessionManager")
449
+ return remoteSessionManager;
196
450
  if (property === "messages")
197
451
  return target.messages;
198
452
  if (property === "model")
@@ -202,7 +456,38 @@ function createRemoteSessionProxy(local, client, initialState) {
202
456
  return Reflect.get(target, property, receiver);
203
457
  },
204
458
  });
205
- return session;
459
+ return {
460
+ session,
461
+ refresh,
462
+ abortLocalBash: () => localBashAbortController?.abort(),
463
+ createReplacedSessionContext: () => {
464
+ const context = local.createReplacedSessionContext();
465
+ Object.defineProperty(context, "cwd", { value: state.cwd });
466
+ Object.defineProperty(context, "sessionManager", { value: remoteSessionManager });
467
+ context.sendMessage = (message, options) => client.sendCustomMessage(message, {
468
+ triggerTurn: options?.triggerTurn,
469
+ deliverAs: options?.deliverAs,
470
+ });
471
+ context.sendUserMessage = (content, options) => {
472
+ if (typeof content === "string")
473
+ return client.prompt(content, {
474
+ streamingBehavior: options?.deliverAs,
475
+ expandPromptTemplates: options?.expandPromptTemplates,
476
+ });
477
+ const text = content
478
+ .filter((part) => part.type === "text")
479
+ .map((part) => part.text)
480
+ .join("\n");
481
+ const images = content.filter((part) => part.type === "image");
482
+ return client.prompt(text, {
483
+ images,
484
+ streamingBehavior: options?.deliverAs,
485
+ expandPromptTemplates: options?.expandPromptTemplates,
486
+ });
487
+ };
488
+ return context;
489
+ },
490
+ };
206
491
  }
207
492
  function hydrateMessageUpdate(event, streamingAssistant) {
208
493
  if (event.type !== "message_update" || !streamingAssistant)
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-host-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSession, AgentSessionEvent, AgentSessionEventListener } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSessionRuntimeDiagnostic } from \"../../core/agent-session-services.ts\";\nimport { type EnsuredHost, ensureHost } from \"../rpc/host-ensure.ts\";\nimport { RpcClient, type RpcClientEvent } from \"../rpc/rpc-client.ts\";\n\nexport const INTERACTIVE_HOST_FALLBACK_WARNING = \"Warning: shared interactive host unavailable; continuing locally\";\n\nexport interface InteractiveHostWarning {\n\treadonly type: \"interactive_host_fallback\";\n\treadonly message: string;\n\treadonly cause: unknown;\n}\n\nexport interface InteractiveHostRuntimeOptions {\n\treadonly socket: string;\n\treadonly agentDir?: string;\n\treadonly ensureHost?: (options: { socket: string; agentDir?: string }) => Promise<EnsuredHost | undefined>;\n\tonWarning?: (warning: InteractiveHostWarning) => void;\n}\n\n/**\n * Replace only the transport-facing session operations. The object returned is\n * deliberately still an AgentSessionRuntime: InteractiveMode and extensions\n * retain their existing runtime seam, while the authoritative prompt/session\n * state is hosted by the shared RPC process.\n */\nexport async function createInteractiveHostRuntime(\n\tlocalRuntime: AgentSessionRuntime,\n\toptions: InteractiveHostRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\tconst sessionPath = localRuntime.session.sessionFile;\n\tif (!sessionPath) return localRuntime;\n\tconst startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));\n\tconst client = new RpcClient({ socketPath: options.socket });\n\ttry {\n\t\tawait startHost({ socket: options.socket, agentDir: options.agentDir });\n\t\tawait client.start();\n\t\tconst opened = await client.openSession({\n\t\t\tsessionPath,\n\t\t\tcwd: localRuntime.cwd,\n\t\t\tprovider: localRuntime.session.model?.provider,\n\t\t\tmodelId: localRuntime.session.model?.id,\n\t\t\tthinkingLevel: localRuntime.session.thinkingLevel,\n\t\t});\n\t\tconst remoteSession = createRemoteSessionProxy(localRuntime.session, client, opened.state);\n\t\treturn new RemoteInteractiveRuntime(localRuntime, remoteSession, client) as unknown as AgentSessionRuntime;\n\t} catch (cause) {\n\t\tawait client.stop().catch(() => {});\n\t\toptions.onWarning?.({\n\t\t\ttype: \"interactive_host_fallback\",\n\t\t\tmessage: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\tcause,\n\t\t});\n\t\treturn localRuntime;\n\t}\n}\n\nclass RemoteInteractiveRuntime {\n\treadonly #local: AgentSessionRuntime;\n\treadonly #session: AgentSession;\n\treadonly #client: RpcClient;\n\t#rebindSession: (() => Promise<void>) | undefined;\n\t#beforeSessionInvalidate: (() => void) | undefined;\n\n\tconstructor(local: AgentSessionRuntime, session: AgentSession, client: RpcClient) {\n\t\tthis.#local = local;\n\t\tthis.#session = session;\n\t\tthis.#client = client;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this.#session;\n\t}\n\tget services(): AgentSessionRuntime[\"services\"] {\n\t\treturn this.#local.services;\n\t}\n\tget cwd(): string {\n\t\treturn this.#local.cwd;\n\t}\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this.#local.diagnostics;\n\t}\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this.#local.modelFallbackMessage;\n\t}\n\tget launchProfile(): AgentSessionRuntime[\"launchProfile\"] {\n\t\treturn this.#local.launchProfile;\n\t}\n\tsetBeforeSessionInvalidate(callback?: () => void): void {\n\t\tthis.#beforeSessionInvalidate = callback;\n\t}\n\tsetRebindSession(callback?: () => Promise<void>): void {\n\t\tthis.#rebindSession = callback;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tawait this.#client.closeSession();\n\t\tawait this.#client.stop();\n\t\tawait this.#local.dispose();\n\t}\n\tasync newSession(): Promise<{ cancelled: boolean }> {\n\t\tthis.#beforeSessionInvalidate?.();\n\t\tconst result = await this.#client.newSession();\n\t\tif (!result.cancelled) await this.#rebindSession?.();\n\t\treturn result;\n\t}\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tthis.#beforeSessionInvalidate?.();\n\t\tconst result = await this.#client.switchSession(sessionPath);\n\t\tif (!result.cancelled) await this.#rebindSession?.();\n\t\treturn result;\n\t}\n\tasync fork(entryId: string): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tthis.#beforeSessionInvalidate?.();\n\t\tconst result = await this.#client.fork(entryId);\n\t\tif (!result.cancelled) await this.#rebindSession?.();\n\t\treturn { cancelled: result.cancelled, selectedText: result.text };\n\t}\n\tasync importFromJsonl(): Promise<{ cancelled: boolean }> {\n\t\tthrow new Error(\"Session import is not available while connected to the shared host\");\n\t}\n}\n\nfunction createRemoteSessionProxy(\n\tlocal: AgentSession,\n\tclient: RpcClient,\n\tinitialState: ReturnType<typeof stateFromRpc>,\n): AgentSession {\n\tlet state = initialState;\n\tlet streamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined;\n\tconst listeners = new Set<AgentSessionEventListener>();\n\tclient.onEvent((wireEvent) => {\n\t\tif (wireEvent.type === \"agent_settled\") state = { ...state, isStreaming: false };\n\t\tif (wireEvent.type === \"agent_start\") state = { ...state, isStreaming: true };\n\t\tif (wireEvent.type === \"model_changed\") {\n\t\t\tstate = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };\n\t\t}\n\t\tif (wireEvent.type === \"thinking_level_changed\") state = { ...state, thinkingLevel: wireEvent.level };\n\t\tif (wireEvent.type === \"message_start\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tlocal.agent.state.messages.push(structuredClone(wireEvent.message));\n\t\t}\n\t\tif (wireEvent.type === \"message_end\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tconst messages = local.agent.state.messages;\n\t\t\tconst previous = messages.at(-1);\n\t\t\tif (previous?.role === wireEvent.message.role)\n\t\t\t\tmessages[messages.length - 1] = structuredClone(wireEvent.message);\n\t\t}\n\t\tconst event = hydrateMessageUpdate(wireEvent, streamingAssistant);\n\t\tfor (const listener of listeners) listener(event);\n\t});\n\tconst session = new Proxy(local, {\n\t\tget(target, property, receiver) {\n\t\t\tif (property === \"prompt\")\n\t\t\t\treturn (message: string, options?: Parameters<AgentSession[\"prompt\"]>[1]) =>\n\t\t\t\t\tclient.prompt(message, options?.images);\n\t\t\tif (property === \"abort\") return () => client.abort();\n\t\t\tif (property === \"steer\")\n\t\t\t\treturn (message: string, images?: Parameters<AgentSession[\"steer\"]>[1]) => client.steer(message, images);\n\t\t\tif (property === \"followUp\")\n\t\t\t\treturn (message: string, images?: Parameters<AgentSession[\"followUp\"]>[1]) =>\n\t\t\t\t\tclient.followUp(message, images);\n\t\t\tif (property === \"waitForIdle\") return () => client.waitForIdle();\n\t\t\tif (property === \"getLastAssistantText\") return () => target.getLastAssistantText();\n\t\t\tif (property === \"setModel\")\n\t\t\t\treturn async (model: NonNullable<AgentSession[\"model\"]>) => {\n\t\t\t\t\tawait client.setModel(model.provider, model.id);\n\t\t\t\t};\n\t\t\tif (property === \"cycleModel\") return () => client.cycleModel();\n\t\t\tif (property === \"setThinkingLevel\")\n\t\t\t\treturn (level: AgentSession[\"thinkingLevel\"]) => void client.setThinkingLevel(level);\n\t\t\tif (property === \"cycleThinkingLevel\")\n\t\t\t\treturn () => client.cycleThinkingLevel().then((result) => result?.level);\n\t\t\tif (property === \"getAvailableThinkingLevels\") return () => client.getAvailableThinkingLevels();\n\t\t\tif (property === \"setSteeringMode\")\n\t\t\t\treturn (mode: AgentSession[\"steeringMode\"]) => void client.setSteeringMode(mode);\n\t\t\tif (property === \"setFollowUpMode\")\n\t\t\t\treturn (mode: AgentSession[\"followUpMode\"]) => void client.setFollowUpMode(mode);\n\t\t\tif (property === \"compact\") return (instructions?: string) => client.compact(instructions);\n\t\t\tif (property === \"setAutoCompactionEnabled\")\n\t\t\t\treturn (enabled: boolean) => void client.setAutoCompaction(enabled);\n\t\t\tif (property === \"executeBash\") return (command: string) => client.bash(command);\n\t\t\tif (property === \"abortBash\") return () => void client.abortBash();\n\t\t\tif (property === \"getSessionStats\") return () => client.getSessionStats();\n\t\t\tif (property === \"exportToHtml\")\n\t\t\t\treturn (outputPath?: string) => client.exportHtml(outputPath).then((result) => result.path);\n\t\t\tif (property === \"setSessionName\") return (name: string) => void client.setSessionName(name);\n\t\t\tif (property === \"getUserMessagesForForking\") return () => client.getForkMessages();\n\t\t\tif (property === \"subscribe\")\n\t\t\t\treturn (listener: AgentSessionEventListener) => {\n\t\t\t\t\tlisteners.add(listener);\n\t\t\t\t\tconst localUnsubscribe = target.subscribe(listener);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\t\tlocalUnsubscribe();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tif (property === \"isStreaming\") return state.isStreaming;\n\t\t\tif (property === \"sessionFile\") return state.sessionFile;\n\t\t\tif (property === \"sessionId\") return state.sessionId;\n\t\t\tif (property === \"messages\") return target.messages;\n\t\t\tif (property === \"model\") return state.model ?? target.model;\n\t\t\tif (property === \"thinkingLevel\") return state.thinkingLevel;\n\t\t\treturn Reflect.get(target, property, receiver);\n\t\t},\n\t});\n\treturn session;\n}\n\nfunction hydrateMessageUpdate(\n\tevent: RpcClientEvent,\n\tstreamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined,\n): AgentSessionEvent {\n\tif (event.type !== \"message_update\" || !streamingAssistant) return event as unknown as AgentSessionEvent;\n\tconst update = event.assistantMessageEvent;\n\tif (update.type !== \"text_delta\" && update.type !== \"thinking_delta\" && update.type !== \"toolcall_delta\") {\n\t\treturn event as unknown as AgentSessionEvent;\n\t}\n\tconst content = streamingAssistant.content[update.contentIndex];\n\tif (update.type === \"text_delta\" && content?.type === \"text\") content.text += update.delta;\n\tif (update.type === \"thinking_delta\" && content?.type === \"thinking\") content.thinking += update.delta;\n\tif (update.type === \"toolcall_delta\" && content?.type === \"toolCall\") {\n\t\tconst raw = JSON.stringify(content.arguments) + update.delta;\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\tcontent.arguments = parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the last valid arguments until the next complete update.\n\t\t}\n\t}\n\tstreamingAssistant.usage = event.usage;\n\treturn {\n\t\ttype: \"message_update\",\n\t\tmessage: structuredClone(streamingAssistant),\n\t\tassistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },\n\t} as AgentSessionEvent;\n}\n\nfunction stateFromRpc(state: {\n\tmodel?: AgentSession[\"model\"];\n\tthinkingLevel: AgentSession[\"thinkingLevel\"];\n\tisStreaming: boolean;\n\tsessionFile?: string;\n\tsessionId: string;\n}) {\n\treturn state;\n}\n\nexport function isInteractiveHostEvent(event: RpcClientEvent): event is Extract<RpcClientEvent, { type: string }> {\n\treturn typeof event === \"object\" && event !== null && \"type\" in event;\n}\n"]}
1
+ {"version":3,"file":"interactive-host-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSession, AgentSessionEvent, AgentSessionEventListener } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSessionRuntimeDiagnostic } from \"../../core/agent-session-services.ts\";\nimport { executeBashWithOperations } from \"../../core/bash-executor.ts\";\nimport type { ProjectTrustContext, ReplacedSessionContext } from \"../../core/extensions/index.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport type { BashOperations } from \"../../core/tools/bash.ts\";\nimport { type EnsuredHost, ensureHost } from \"../rpc/host-ensure.ts\";\nimport { RpcClient, type RpcClientEvent } from \"../rpc/rpc-client.ts\";\n\nexport const INTERACTIVE_HOST_FALLBACK_WARNING = \"Warning: shared interactive host unavailable; continuing locally\";\n\nexport interface InteractiveHostWarning {\n\treadonly type: \"interactive_host_fallback\" | \"interactive_host_action_failed\";\n\treadonly message: string;\n\treadonly cause: unknown;\n}\n\n/**\n * The session contract InteractiveMode actually runs against. The local\n * AgentSession answers these reads synchronously; the shared-host proxy answers\n * them over RPC. Declaring the union here keeps the proxy honest (no more\n * `as unknown as` lie at the boundary) and lets the compiler find every TUI\n * call site that must await.\n */\nexport type InteractiveSession = Omit<\n\tAgentSession,\n\t\"cycleThinkingLevel\" | \"getAvailableThinkingLevels\" | \"getSessionStats\" | \"getUserMessagesForForking\"\n> & {\n\tcycleThinkingLevel(): ThinkingLevel | undefined | Promise<ThinkingLevel | undefined>;\n\tgetAvailableThinkingLevels(): ThinkingLevel[] | Promise<ThinkingLevel[]>;\n\tgetSessionStats():\n\t\t| ReturnType<AgentSession[\"getSessionStats\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getSessionStats\"]>>;\n\tgetUserMessagesForForking():\n\t\t| ReturnType<AgentSession[\"getUserMessagesForForking\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getUserMessagesForForking\"]>>;\n};\n\nexport interface InteractiveHostRuntimeOptions {\n\treadonly socket: string;\n\treadonly agentDir?: string;\n\treadonly ensureHost?: (options: { socket: string; agentDir?: string }) => Promise<EnsuredHost | undefined>;\n\tonWarning?: (warning: InteractiveHostWarning) => void;\n}\n\n/**\n * Replace only the transport-facing session operations. The object returned is\n * deliberately still an AgentSessionRuntime: InteractiveMode and extensions\n * retain their existing runtime seam, while the authoritative prompt/session\n * state is hosted by the shared RPC process.\n */\nexport async function createInteractiveHostRuntime(\n\tlocalRuntime: AgentSessionRuntime,\n\toptions: InteractiveHostRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\tconst sessionPath = localRuntime.session.sessionFile;\n\tif (!sessionPath) return localRuntime;\n\tconst startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));\n\tconst client = new RpcClient({ socketPath: options.socket });\n\ttry {\n\t\tawait startHost({ socket: options.socket, agentDir: options.agentDir });\n\t\tawait client.start();\n\t\tconst opened = await client.openSession({\n\t\t\tsessionPath,\n\t\t\tcwd: localRuntime.cwd,\n\t\t\tprovider: localRuntime.session.model?.provider,\n\t\t\tmodelId: localRuntime.session.model?.id,\n\t\t\tthinkingLevel: localRuntime.session.thinkingLevel,\n\t\t});\n\t\tconst remoteSession = createRemoteSessionProxy(\n\t\t\tlocalRuntime.session,\n\t\t\tlocalRuntime.services.agentDir,\n\t\t\tclient,\n\t\t\topened.state,\n\t\t\toptions.onWarning,\n\t\t);\n\t\treturn new RemoteInteractiveRuntime(localRuntime, remoteSession, client) as unknown as AgentSessionRuntime;\n\t} catch (cause) {\n\t\tawait client.stop().catch(() => {});\n\t\toptions.onWarning?.({\n\t\t\ttype: \"interactive_host_fallback\",\n\t\t\tmessage: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\tcause,\n\t\t});\n\t\treturn localRuntime;\n\t}\n}\n\nclass RemoteInteractiveRuntime {\n\treadonly #local: AgentSessionRuntime;\n\treadonly #remoteSession: RemoteSessionProxy;\n\treadonly #client: RpcClient;\n\t#rebindSession: (() => Promise<void>) | undefined;\n\t#beforeSessionInvalidate: (() => void) | undefined;\n\n\tconstructor(local: AgentSessionRuntime, remoteSession: RemoteSessionProxy, client: RpcClient) {\n\t\tthis.#local = local;\n\t\tthis.#remoteSession = remoteSession;\n\t\tthis.#client = client;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this.#remoteSession.session;\n\t}\n\tget services(): AgentSessionRuntime[\"services\"] {\n\t\treturn this.#local.services;\n\t}\n\tget cwd(): string {\n\t\treturn this.#remoteSession.session.sessionManager.getCwd();\n\t}\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this.#local.diagnostics;\n\t}\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this.#local.modelFallbackMessage;\n\t}\n\tget launchProfile(): AgentSessionRuntime[\"launchProfile\"] {\n\t\treturn this.#local.launchProfile;\n\t}\n\tsetBeforeSessionInvalidate(callback?: () => void): void {\n\t\tthis.#beforeSessionInvalidate = callback;\n\t}\n\tsetRebindSession(callback?: () => Promise<void>): void {\n\t\tthis.#rebindSession = callback;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tawait this.#client.closeSession();\n\t\tawait this.#client.stop();\n\t\tawait this.#local.dispose();\n\t}\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.newSession(options?.parentSession);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tif (options?.setup) {\n\t\t\t\tconst capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\t\tawait options.setup(capture);\n\t\t\t\tfor (const entry of capture.getEntries()) await this.#client.appendSessionEntry(entry);\n\t\t\t\tawait this.#remoteSession.refresh();\n\t\t\t}\n\t\t\tawait this.#rebindSession?.();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.switchSession(sessionPath, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tawait this.#rebindSession?.();\n\t\t\t// The shared host already resolved trust; this callback is retained for\n\t\t\t// compatibility, but its result cannot override host-authoritative state.\n\t\t\toptions?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst result = await this.#client.fork(entryId, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn { cancelled: result.cancelled, selectedText: result.text };\n\t}\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.importJsonl(inputPath, cwdOverride);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync #refreshAndRebind(): Promise<void> {\n\t\tawait this.#remoteSession.refresh();\n\t\tawait this.#rebindSession?.();\n\t}\n}\n\ninterface RemoteSessionProxy {\n\treadonly session: AgentSession;\n\trefresh(): Promise<void>;\n\tabortLocalBash(): void;\n\tcreateReplacedSessionContext(): ReplacedSessionContext;\n}\n\nfunction createRemoteSessionProxy(\n\tlocal: AgentSession,\n\tagentDir: string,\n\tclient: RpcClient,\n\tinitialState: ReturnType<typeof stateFromRpc>,\n\tonWarning?: (warning: InteractiveHostWarning) => void,\n): RemoteSessionProxy {\n\t// Fire-and-forget setters keep the sync AgentSession signature, but their RPC\n\t// failures must not vanish: the matching *_changed wire event confirms success,\n\t// and a rejection here is the only signal of failure.\n\tconst reportActionFailure = (action: string) => (error: unknown) => {\n\t\tonWarning?.({\n\t\t\ttype: \"interactive_host_action_failed\",\n\t\t\tmessage: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\tcause: error,\n\t\t});\n\t};\n\tlet state = { ...initialState };\n\tlet bashChunk: ((chunk: string) => void) | undefined;\n\tlet localBashAbortController: AbortController | undefined;\n\tlet localBashRunning = false;\n\tlet hostBashRunning = initialState.isBashRunning;\n\tlet sessionManager = local.sessionManager;\n\tlet settingsManager = SettingsManager.create(initialState.cwd, agentDir, {\n\t\tprojectTrusted: initialState.projectTrusted,\n\t});\n\tconst updateBashState = () => {\n\t\tstate = { ...state, isBashRunning: localBashRunning || hostBashRunning };\n\t};\n\tconst remoteSessionManager = new Proxy({} as SessionManager, {\n\t\tget(_target, property, _receiver) {\n\t\t\tif (property === \"appendLabelChange\") {\n\t\t\t\treturn (entryId: string, label?: string) => void client.setLabel(entryId, label);\n\t\t\t}\n\t\t\tif (property === \"getSessionName\") return () => state.sessionName;\n\t\t\tconst value = Reflect.get(sessionManager, property, sessionManager);\n\t\t\treturn typeof value === \"function\" ? value.bind(sessionManager) : value;\n\t\t},\n\t});\n\tlet streamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined;\n\tconst listeners = new Set<AgentSessionEventListener>();\n\tclient.onEvent((wireEvent) => {\n\t\tif (wireEvent.type === \"agent_settled\") state = { ...state, isStreaming: false, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"bash_start\") {\n\t\t\thostBashRunning = true;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_end\") {\n\t\t\thostBashRunning = false;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_execution_update\") bashChunk?.(wireEvent.delta);\n\t\tif (wireEvent.type === \"agent_start\") state = { ...state, isStreaming: true };\n\t\tif (wireEvent.type === \"compaction_start\") state = { ...state, isCompacting: true };\n\t\tif (wireEvent.type === \"compaction_end\") state = { ...state, isCompacting: false };\n\t\tif (wireEvent.type === \"auto_retry_start\") state = { ...state, retryAttempt: wireEvent.attempt };\n\t\tif (wireEvent.type === \"auto_retry_end\") state = { ...state, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"queue_update\") {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tsteering: [...wireEvent.steering],\n\t\t\t\tfollowUp: [...wireEvent.followUp],\n\t\t\t\tordered: [...wireEvent.ordered],\n\t\t\t\tpendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,\n\t\t\t};\n\t\t}\n\t\tif (wireEvent.type === \"model_changed\") {\n\t\t\tstate = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };\n\t\t}\n\t\tif (wireEvent.type === \"thinking_level_changed\") state = { ...state, thinkingLevel: wireEvent.level };\n\t\tif (wireEvent.type === \"session_info_changed\") state = { ...state, sessionName: wireEvent.name };\n\t\tif (wireEvent.type === \"message_start\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tlocal.agent.state.messages.push(structuredClone(wireEvent.message));\n\t\t}\n\t\tif (wireEvent.type === \"message_end\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tconst messages = local.agent.state.messages;\n\t\t\tconst previous = messages.at(-1);\n\t\t\tif (previous?.role === wireEvent.message.role)\n\t\t\t\tmessages[messages.length - 1] = structuredClone(wireEvent.message);\n\t\t}\n\t\tif (wireEvent.type === \"compaction_end\" && wireEvent.accepted && !wireEvent.aborted) {\n\t\t\ttry {\n\t\t\t\tsessionManager.reloadFromDisk?.();\n\t\t\t\tlocal.agent.state.messages = sessionManager.buildSessionContext().messages;\n\t\t\t} catch {\n\t\t\t\t// Non-fatal if session file is transiently locked or unavailable\n\t\t\t}\n\t\t}\n\t\tconst event = hydrateMessageUpdate(wireEvent, streamingAssistant);\n\t\tfor (const listener of listeners) listener(event);\n\t});\n\tconst refresh = async (): Promise<void> => {\n\t\tconst nextState = await client.getState();\n\t\tstate = { ...stateFromRpc(nextState) };\n\t\tlet messages: AgentSession[\"messages\"];\n\t\tsettingsManager = SettingsManager.create(nextState.cwd, agentDir, {\n\t\t\tprojectTrusted: nextState.projectTrusted,\n\t\t});\n\t\tif (nextState.sessionFile) {\n\t\t\t// SessionManager.open retains the explicit path even when the host has\n\t\t\t// deferred creating the file for a setup-only session.\n\t\t\tsessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);\n\t\t\tif (nextState.entries?.length && !sessionManager.getEntries().length) {\n\t\t\t\tfor (const entry of nextState.entries) sessionManager.appendEntry(entry);\n\t\t\t}\n\t\t\tmessages = sessionManager.buildSessionContext().messages;\n\t\t} else {\n\t\t\tmessages = await client.getMessages();\n\t\t}\n\t\tlocal.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));\n\t\tstreamingAssistant = undefined;\n\t};\n\tconst session = new Proxy(local, {\n\t\tget(target, property, receiver) {\n\t\t\tif (property === \"prompt\")\n\t\t\t\treturn (message: string, options?: Parameters<AgentSession[\"prompt\"]>[1]) =>\n\t\t\t\t\tclient.prompt(message, {\n\t\t\t\t\t\t...(options?.images ? { images: options.images } : {}),\n\t\t\t\t\t\t...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t\t\t...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t\t\t...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),\n\t\t\t\t\t\t...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),\n\t\t\t\t\t});\n\t\t\tif (property === \"abort\") return () => client.abort();\n\t\t\tif (property === \"abortCompaction\") return () => void client.abortCompaction();\n\t\t\tif (property === \"steer\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"steer\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tsteering: [...state.steering, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"steer\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.steer(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"followUp\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"followUp\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tfollowUp: [...state.followUp, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"followUp\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.followUp(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"waitForIdle\") return () => client.waitForIdle();\n\t\t\tif (property === \"getLastAssistantText\") return () => target.getLastAssistantText();\n\t\t\tif (property === \"setModel\")\n\t\t\t\treturn async (model: NonNullable<AgentSession[\"model\"]>) => {\n\t\t\t\t\tconst next = await client.setModel(model.provider, model.id);\n\t\t\t\t\treturn { systemPromptName: next.systemPromptName, model: next };\n\t\t\t\t};\n\t\t\tif (property === \"cycleModel\") return () => client.cycleModel();\n\t\t\tif (property === \"setThinkingLevel\")\n\t\t\t\treturn (level: AgentSession[\"thinkingLevel\"]) =>\n\t\t\t\t\tvoid client.setThinkingLevel(level).catch(reportActionFailure(\"setThinkingLevel\"));\n\t\t\tif (property === \"cycleThinkingLevel\")\n\t\t\t\treturn () => client.cycleThinkingLevel().then((result) => result?.level);\n\t\t\tif (property === \"getAvailableThinkingLevels\") return () => client.getAvailableThinkingLevels();\n\t\t\tif (property === \"setSteeringMode\")\n\t\t\t\treturn (mode: AgentSession[\"steeringMode\"]) =>\n\t\t\t\t\tvoid client.setSteeringMode(mode).catch(reportActionFailure(\"setSteeringMode\"));\n\t\t\tif (property === \"setFollowUpMode\")\n\t\t\t\treturn (mode: AgentSession[\"followUpMode\"]) =>\n\t\t\t\t\tvoid client.setFollowUpMode(mode).catch(reportActionFailure(\"setFollowUpMode\"));\n\t\t\tif (property === \"compact\") return (instructions?: string) => client.compact(instructions);\n\t\t\tif (property === \"setAutoCompactionEnabled\")\n\t\t\t\treturn (enabled: boolean) =>\n\t\t\t\t\tvoid client.setAutoCompaction(enabled).catch(reportActionFailure(\"setAutoCompaction\"));\n\t\t\tif (property === \"executeBash\")\n\t\t\t\treturn async (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tonChunk?: (chunk: string) => void,\n\t\t\t\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations | Record<string, unknown> },\n\t\t\t\t) => {\n\t\t\t\t\tif (options?.operations && typeof options.operations.exec === \"function\") {\n\t\t\t\t\t\tconst abortController = new AbortController();\n\t\t\t\t\t\tlocalBashAbortController = abortController;\n\t\t\t\t\t\tlocalBashRunning = true;\n\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\tconst sessionAtStart = state.sessionId;\n\t\t\t\t\t\tconst prefix = settingsManager.getShellCommandPrefix();\n\t\t\t\t\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\t\t\tstate.cwd,\n\t\t\t\t\t\t\t\toptions.operations as BashOperations,\n\t\t\t\t\t\t\t\t{ onChunk, signal: abortController.signal },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (state.sessionId === sessionAtStart) {\n\t\t\t\t\t\t\t\tawait client.recordBashResult(command, result, options.excludeFromContext);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tlocalBashAbortController = undefined;\n\t\t\t\t\t\t\tlocalBashRunning = false;\n\t\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbashChunk = onChunk;\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await client.bash(command, {\n\t\t\t\t\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\t\t\t\t\toperations: options?.operations as Record<string, unknown> | undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tbashChunk = undefined;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\tif (property === \"abortBash\")\n\t\t\t\treturn () => {\n\t\t\t\t\tif (localBashAbortController) localBashAbortController.abort();\n\t\t\t\t\telse void client.abortBash().catch(reportActionFailure(\"abortBash\"));\n\t\t\t\t};\n\t\t\tif (property === \"getSessionStats\") return () => client.getSessionStats();\n\t\t\tif (property === \"exportToHtml\")\n\t\t\t\treturn (outputPath?: string) => client.exportHtml(outputPath).then((result) => result.path);\n\t\t\tif (property === \"setSessionName\")\n\t\t\t\treturn (name: string) => client.setSessionName(name).catch(reportActionFailure(\"setSessionName\"));\n\t\t\tif (property === \"navigateTree\")\n\t\t\t\treturn async (targetId: string, options?: Parameters<AgentSession[\"navigateTree\"]>[1]) => {\n\t\t\t\t\tconst result = await client.navigateTree(targetId, options);\n\t\t\t\t\tif (!result.cancelled) await refresh();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"getUserMessagesForForking\") return () => client.getForkMessages();\n\t\t\tif (property === \"subscribe\")\n\t\t\t\treturn (listener: AgentSessionEventListener) => {\n\t\t\t\t\tlisteners.add(listener);\n\t\t\t\t\tconst localUnsubscribe = target.subscribe(listener);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\t\tlocalUnsubscribe();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tif (property === \"isStreaming\") return state.isStreaming;\n\t\t\tif (property === \"isCompacting\") return state.isCompacting;\n\t\t\tif (property === \"pendingMessageCount\") return state.pendingMessageCount;\n\t\t\tif (property === \"getSteeringMessages\") return () => state.steering;\n\t\t\tif (property === \"getFollowUpMessages\") return () => state.followUp;\n\t\t\tif (property === \"clearQueue\")\n\t\t\t\treturn (options?: { abortWillFollow: boolean }) => {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tsteering: [...state.steering],\n\t\t\t\t\t\tfollowUp: [...state.followUp],\n\t\t\t\t\t\tordered: [...state.ordered],\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(result, \"ordered\", { value: result.ordered, enumerable: false });\n\t\t\t\t\tvoid client.clearQueue(options).catch(reportActionFailure(\"clearQueue\"));\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"abortBranchSummary\")\n\t\t\t\treturn () => void client.abortBranchSummary().catch(reportActionFailure(\"abortBranchSummary\"));\n\t\t\tif (property === \"recordBashResult\")\n\t\t\t\treturn (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tresult: Parameters<AgentSession[\"recordBashResult\"]>[1],\n\t\t\t\t\toptions?: { excludeFromContext?: boolean },\n\t\t\t\t) =>\n\t\t\t\t\tvoid client\n\t\t\t\t\t\t.recordBashResult(command, result, options?.excludeFromContext)\n\t\t\t\t\t\t.catch(reportActionFailure(\"recordBashResult\"));\n\t\t\tif (property === \"set_label\") return undefined;\n\t\t\tif (property === \"retryAttempt\") return state.retryAttempt;\n\t\t\tif (property === \"isBashRunning\") return state.isBashRunning;\n\t\t\tif (property === \"reload\") return (_options?: Parameters<AgentSession[\"reload\"]>[0]) => client.reload();\n\t\t\tif (property === \"checkReloadVeto\") return () => client.checkReloadVeto();\n\t\t\tif (property === \"exportToJsonl\")\n\t\t\t\treturn (outputPath?: string) => client.exportJsonl(outputPath).then((result) => result.path);\n\t\t\t// The footer and other renderers read session.state.*; surface the\n\t\t\t// host-authoritative fields there too, not only via the direct getters.\n\t\t\tif (property === \"state\") {\n\t\t\t\tconst localState = target.state;\n\t\t\t\treturn {\n\t\t\t\t\t...localState,\n\t\t\t\t\tmodel: state.model ?? localState.model,\n\t\t\t\t\tthinkingLevel: state.thinkingLevel,\n\t\t\t\t\tisStreaming: state.isStreaming,\n\t\t\t\t\tisCompacting: state.isCompacting,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (property === \"sessionFile\") return state.sessionFile;\n\t\t\tif (property === \"sessionId\") return state.sessionId;\n\t\t\tif (property === \"sessionName\") return state.sessionName;\n\t\t\tif (property === \"sessionManager\") return remoteSessionManager;\n\t\t\tif (property === \"messages\") return target.messages;\n\t\t\tif (property === \"model\") return state.model ?? target.model;\n\t\t\tif (property === \"thinkingLevel\") return state.thinkingLevel;\n\t\t\treturn Reflect.get(target, property, receiver);\n\t\t},\n\t});\n\treturn {\n\t\tsession,\n\t\trefresh,\n\t\tabortLocalBash: () => localBashAbortController?.abort(),\n\t\tcreateReplacedSessionContext: () => {\n\t\t\tconst context = local.createReplacedSessionContext();\n\t\t\tObject.defineProperty(context, \"cwd\", { value: state.cwd });\n\t\t\tObject.defineProperty(context, \"sessionManager\", { value: remoteSessionManager });\n\t\t\tcontext.sendMessage = (message, options) =>\n\t\t\t\tclient.sendCustomMessage(message, {\n\t\t\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t\t\t\tdeliverAs: options?.deliverAs,\n\t\t\t\t});\n\t\t\tcontext.sendUserMessage = (content, options) => {\n\t\t\t\tif (typeof content === \"string\")\n\t\t\t\t\treturn client.prompt(content, {\n\t\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t\t});\n\t\t\t\tconst text = content\n\t\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst images = content.filter((part) => part.type === \"image\");\n\t\t\t\treturn client.prompt(text, {\n\t\t\t\t\timages,\n\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn context;\n\t\t},\n\t};\n}\n\nfunction hydrateMessageUpdate(\n\tevent: RpcClientEvent,\n\tstreamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined,\n): AgentSessionEvent {\n\tif (event.type !== \"message_update\" || !streamingAssistant) return event as unknown as AgentSessionEvent;\n\tconst update = event.assistantMessageEvent;\n\tif (update.type !== \"text_delta\" && update.type !== \"thinking_delta\" && update.type !== \"toolcall_delta\") {\n\t\treturn event as unknown as AgentSessionEvent;\n\t}\n\tconst content = streamingAssistant.content[update.contentIndex];\n\tif (update.type === \"text_delta\" && content?.type === \"text\") content.text += update.delta;\n\tif (update.type === \"thinking_delta\" && content?.type === \"thinking\") content.thinking += update.delta;\n\tif (update.type === \"toolcall_delta\" && content?.type === \"toolCall\") {\n\t\tconst raw = JSON.stringify(content.arguments) + update.delta;\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\tcontent.arguments = parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the last valid arguments until the next complete update.\n\t\t}\n\t}\n\tstreamingAssistant.usage = event.usage;\n\treturn {\n\t\ttype: \"message_update\",\n\t\tmessage: structuredClone(streamingAssistant),\n\t\tassistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },\n\t} as AgentSessionEvent;\n}\n\nfunction stateFromRpc(state: {\n\tmodel?: AgentSession[\"model\"];\n\tthinkingLevel: AgentSession[\"thinkingLevel\"];\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tpendingMessageCount: number;\n\tretryAttempt: number;\n\tisBashRunning: boolean;\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tcwd: string;\n\tprojectTrusted: boolean;\n\tentries?: import(\"../../core/session-manager.ts\").SessionEntry[];\n\tsteering: string[];\n\tfollowUp: string[];\n\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n}) {\n\treturn state;\n}\n\nexport function isInteractiveHostEvent(event: RpcClientEvent): event is Extract<RpcClientEvent, { type: string }> {\n\treturn typeof event === \"object\" && event !== null && \"type\" in event;\n}\n"]}