neoctl 0.2.36 → 0.2.38

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 (208) hide show
  1. package/dist/agents/agent-definition.d.ts +2 -0
  2. package/dist/agents/agent-definition.js +10 -0
  3. package/dist/agents/agent-definition.js.map +1 -1
  4. package/dist/agents/agent-report-security.test.d.ts +1 -0
  5. package/dist/agents/agent-report-security.test.js +301 -0
  6. package/dist/agents/agent-report-security.test.js.map +1 -0
  7. package/dist/agents/agent-tool-persistence.test.js +9 -3
  8. package/dist/agents/agent-tool-persistence.test.js.map +1 -1
  9. package/dist/agents/agent-tool.d.ts +3 -0
  10. package/dist/agents/agent-tool.js +131 -34
  11. package/dist/agents/agent-tool.js.map +1 -1
  12. package/dist/agents/coordination-boundary.test.d.ts +1 -0
  13. package/dist/agents/coordination-boundary.test.js +58 -0
  14. package/dist/agents/coordination-boundary.test.js.map +1 -0
  15. package/dist/agents/live-preview-redaction-security.test.d.ts +1 -0
  16. package/dist/agents/live-preview-redaction-security.test.js +286 -0
  17. package/dist/agents/live-preview-redaction-security.test.js.map +1 -0
  18. package/dist/agents/local-agent-task.d.ts +27 -1
  19. package/dist/agents/local-agent-task.js +75 -5
  20. package/dist/agents/local-agent-task.js.map +1 -1
  21. package/dist/agents/obs07-11-run-facts.test.d.ts +1 -0
  22. package/dist/agents/obs07-11-run-facts.test.js +459 -0
  23. package/dist/agents/obs07-11-run-facts.test.js.map +1 -0
  24. package/dist/agents/smoke-agent-lifecycle.js +8 -4
  25. package/dist/agents/smoke-agent-lifecycle.js.map +1 -1
  26. package/dist/agents/smoke-agents.js +7 -3
  27. package/dist/agents/smoke-agents.js.map +1 -1
  28. package/dist/context/context-manager.d.ts +5 -0
  29. package/dist/context/context-manager.js +14 -7
  30. package/dist/context/context-manager.js.map +1 -1
  31. package/dist/context/prompt-config.d.ts +35 -0
  32. package/dist/context/prompt-config.js +151 -0
  33. package/dist/context/prompt-config.js.map +1 -0
  34. package/dist/context/prompt-config.test.d.ts +1 -0
  35. package/dist/context/prompt-config.test.js +124 -0
  36. package/dist/context/prompt-config.test.js.map +1 -0
  37. package/dist/context/prompts.d.ts +1 -1
  38. package/dist/context/prompts.js +4 -27
  39. package/dist/context/prompts.js.map +1 -1
  40. package/dist/context/smoke-context.js +49 -4
  41. package/dist/context/smoke-context.js.map +1 -1
  42. package/dist/context/system.md +16 -0
  43. package/dist/core/image-registry.js +1 -1
  44. package/dist/core/image-registry.js.map +1 -1
  45. package/dist/core/obs04-visible-data.test.d.ts +1 -0
  46. package/dist/core/obs04-visible-data.test.js +147 -0
  47. package/dist/core/obs04-visible-data.test.js.map +1 -0
  48. package/dist/core/query-engine.d.ts +32 -1
  49. package/dist/core/query-engine.js +320 -95
  50. package/dist/core/query-engine.js.map +1 -1
  51. package/dist/core/query-session-settings.test.d.ts +1 -0
  52. package/dist/core/query-session-settings.test.js +252 -0
  53. package/dist/core/query-session-settings.test.js.map +1 -0
  54. package/dist/core/query.d.ts +18 -0
  55. package/dist/core/query.js +134 -15
  56. package/dist/core/query.js.map +1 -1
  57. package/dist/core/run-agent.d.ts +2 -0
  58. package/dist/core/run-agent.js +23 -15
  59. package/dist/core/run-agent.js.map +1 -1
  60. package/dist/core/session-settings-prompt.d.ts +35 -0
  61. package/dist/core/session-settings-prompt.js +61 -0
  62. package/dist/core/session-settings-prompt.js.map +1 -0
  63. package/dist/core/session-settings-prompt.test.d.ts +1 -0
  64. package/dist/core/session-settings-prompt.test.js +257 -0
  65. package/dist/core/session-settings-prompt.test.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.js +2 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/model/model-gateway.d.ts +1 -0
  70. package/dist/model/model-metadata.json +97 -99
  71. package/dist/model/openai-native-image-guard.test.d.ts +1 -0
  72. package/dist/model/openai-native-image-guard.test.js +101 -0
  73. package/dist/model/openai-native-image-guard.test.js.map +1 -0
  74. package/dist/model/openai-responses-instructions.test.d.ts +1 -0
  75. package/dist/model/openai-responses-instructions.test.js +64 -0
  76. package/dist/model/openai-responses-instructions.test.js.map +1 -0
  77. package/dist/model/openai-responses-mapper.js +96 -32
  78. package/dist/model/openai-responses-mapper.js.map +1 -1
  79. package/dist/model/smoke-responses-mapper.js +8 -5
  80. package/dist/model/smoke-responses-mapper.js.map +1 -1
  81. package/dist/plugins/smoke-plugin-system.js +14 -14
  82. package/dist/repl/index.js +2 -2
  83. package/dist/repl/index.js.map +1 -1
  84. package/dist/secrets/secret-redaction.d.ts +6 -5
  85. package/dist/secrets/secret-redaction.js +7 -79
  86. package/dist/secrets/secret-redaction.js.map +1 -1
  87. package/dist/secrets/secret-types.d.ts +4 -1
  88. package/dist/secrets/secret-types.js.map +1 -1
  89. package/dist/session/session-export.d.ts +6 -0
  90. package/dist/session/session-export.js.map +1 -1
  91. package/dist/session/session-store.d.ts +15 -1
  92. package/dist/session/session-store.js +30 -2
  93. package/dist/session/session-store.js.map +1 -1
  94. package/dist/tasks/subagent-tools.test.js +1 -0
  95. package/dist/tasks/subagent-tools.test.js.map +1 -1
  96. package/dist/tasks/task-ack-size.test.js +6 -5
  97. package/dist/tasks/task-ack-size.test.js.map +1 -1
  98. package/dist/tasks/task-persistence.d.ts +1 -0
  99. package/dist/tasks/task-persistence.js +31 -9
  100. package/dist/tasks/task-persistence.js.map +1 -1
  101. package/dist/tasks/task-store.d.ts +6 -4
  102. package/dist/tasks/task-store.js +46 -20
  103. package/dist/tasks/task-store.js.map +1 -1
  104. package/dist/tools/builtins/exec-process-manager.d.ts +97 -2
  105. package/dist/tools/builtins/exec-process-manager.js +221 -19
  106. package/dist/tools/builtins/exec-process-manager.js.map +1 -1
  107. package/dist/tools/builtins/exec-tool.js +14 -1
  108. package/dist/tools/builtins/exec-tool.js.map +1 -1
  109. package/dist/tools/builtins/image-generation-tool.js +24 -24
  110. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  111. package/dist/tools/smoke-exec-process.js +2 -1
  112. package/dist/tools/smoke-exec-process.js.map +1 -1
  113. package/dist/tools/smoke-terminal-output-chain.d.ts +1 -0
  114. package/dist/tools/smoke-terminal-output-chain.js +245 -0
  115. package/dist/tools/smoke-terminal-output-chain.js.map +1 -0
  116. package/dist/tools/smoke-tool-system.js +6 -6
  117. package/dist/tools/smoke-tool-system.js.map +1 -1
  118. package/dist/tools/terminal-background-history.test.d.ts +1 -0
  119. package/dist/tools/terminal-background-history.test.js +77 -0
  120. package/dist/tools/terminal-background-history.test.js.map +1 -0
  121. package/dist/tools/terminal-output-persistence.test.d.ts +1 -0
  122. package/dist/tools/terminal-output-persistence.test.js +50 -0
  123. package/dist/tools/terminal-output-persistence.test.js.map +1 -0
  124. package/dist/tools/terminal-output-store.d.ts +154 -0
  125. package/dist/tools/terminal-output-store.js +580 -0
  126. package/dist/tools/terminal-output-store.js.map +1 -0
  127. package/dist/tools/terminal-output-store.test.d.ts +1 -0
  128. package/dist/tools/terminal-output-store.test.js +364 -0
  129. package/dist/tools/terminal-output-store.test.js.map +1 -0
  130. package/dist/types/events.d.ts +1 -0
  131. package/dist/types/messages.d.ts +1 -0
  132. package/dist/web/agent-content-detail.d.ts +78 -0
  133. package/dist/web/agent-content-detail.js +495 -0
  134. package/dist/web/agent-content-detail.js.map +1 -0
  135. package/dist/web/agent-content-detail.test.d.ts +1 -0
  136. package/dist/web/agent-content-detail.test.js +307 -0
  137. package/dist/web/agent-content-detail.test.js.map +1 -0
  138. package/dist/web/agent-parent-messages.test.d.ts +1 -0
  139. package/dist/web/agent-parent-messages.test.js +58 -0
  140. package/dist/web/agent-parent-messages.test.js.map +1 -0
  141. package/dist/web/agent-tool-payload-security.test.d.ts +1 -0
  142. package/dist/web/agent-tool-payload-security.test.js +120 -0
  143. package/dist/web/agent-tool-payload-security.test.js.map +1 -0
  144. package/dist/web/index.d.ts +136 -4
  145. package/dist/web/index.js +303 -78
  146. package/dist/web/index.js.map +1 -1
  147. package/dist/web/prompt-config-protocol.d.ts +4 -0
  148. package/dist/web/prompt-config-protocol.js +57 -0
  149. package/dist/web/prompt-config-protocol.js.map +1 -0
  150. package/dist/web/prompt-config-protocol.test.d.ts +1 -0
  151. package/dist/web/prompt-config-protocol.test.js +78 -0
  152. package/dist/web/prompt-config-protocol.test.js.map +1 -0
  153. package/dist/web/runtime-context-protocol.d.ts +1 -0
  154. package/dist/web/runtime-context-protocol.js +1 -0
  155. package/dist/web/runtime-context-protocol.js.map +1 -1
  156. package/dist/web/session-prompt-integration.test.d.ts +1 -0
  157. package/dist/web/session-prompt-integration.test.js +57 -0
  158. package/dist/web/session-prompt-integration.test.js.map +1 -0
  159. package/dist/web/session-prompt-protocol.d.ts +8 -0
  160. package/dist/web/session-prompt-protocol.js +11 -0
  161. package/dist/web/session-prompt-protocol.js.map +1 -0
  162. package/dist/web/session-settings.test.d.ts +1 -0
  163. package/dist/web/session-settings.test.js +254 -0
  164. package/dist/web/session-settings.test.js.map +1 -0
  165. package/dist/web/smoke-agent-content-http.d.ts +1 -0
  166. package/dist/web/smoke-agent-content-http.js +446 -0
  167. package/dist/web/smoke-agent-content-http.js.map +1 -0
  168. package/dist/web/smoke-status-semantics.d.ts +1 -0
  169. package/dist/web/smoke-status-semantics.js +90 -0
  170. package/dist/web/smoke-status-semantics.js.map +1 -0
  171. package/dist/web/smoke-task-session-entrypoints.js +22 -1
  172. package/dist/web/smoke-task-session-entrypoints.js.map +1 -1
  173. package/dist/web/smoke-terminal-output-http.d.ts +1 -0
  174. package/dist/web/smoke-terminal-output-http.js +377 -0
  175. package/dist/web/smoke-terminal-output-http.js.map +1 -0
  176. package/dist/web/smoke-tool-call-detail.d.ts +1 -0
  177. package/dist/web/smoke-tool-call-detail.js +106 -0
  178. package/dist/web/smoke-tool-call-detail.js.map +1 -0
  179. package/dist/web/smoke-tool-call-http.d.ts +1 -0
  180. package/dist/web/smoke-tool-call-http.js +100 -0
  181. package/dist/web/smoke-tool-call-http.js.map +1 -0
  182. package/dist/web/smoke-tool-detail-fields-http.d.ts +1 -0
  183. package/dist/web/smoke-tool-detail-fields-http.js +121 -0
  184. package/dist/web/smoke-tool-detail-fields-http.js.map +1 -0
  185. package/dist/web/smoke-web-terminal-tasks.js +223 -76
  186. package/dist/web/smoke-web-terminal-tasks.js.map +1 -1
  187. package/dist/web/status-semantics.d.ts +11 -0
  188. package/dist/web/status-semantics.js +59 -0
  189. package/dist/web/status-semantics.js.map +1 -0
  190. package/dist/web/terminal-presentation.d.ts +15 -0
  191. package/dist/web/terminal-presentation.js +61 -0
  192. package/dist/web/terminal-presentation.js.map +1 -0
  193. package/dist/web/terminal-presentation.test.d.ts +1 -0
  194. package/dist/web/terminal-presentation.test.js +33 -0
  195. package/dist/web/terminal-presentation.test.js.map +1 -0
  196. package/dist/web/tool-call-detail.d.ts +40 -0
  197. package/dist/web/tool-call-detail.js +167 -0
  198. package/dist/web/tool-call-detail.js.map +1 -0
  199. package/dist/web/tool-detail-fields.d.ts +59 -0
  200. package/dist/web/tool-detail-fields.js +119 -0
  201. package/dist/web/tool-detail-fields.js.map +1 -0
  202. package/dist/web/tool-detail-fields.test.d.ts +1 -0
  203. package/dist/web/tool-detail-fields.test.js +121 -0
  204. package/dist/web/tool-detail-fields.test.js.map +1 -0
  205. package/docs/prompt-config.md +71 -0
  206. package/package.json +94 -93
  207. package/scripts/build-standalone.mjs +3 -0
  208. package/scripts/copy-prompt-resources.mjs +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obs04-visible-data.test.js","sourceRoot":"","sources":["../../src/core/obs04-visible-data.test.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,17 @@ import type { CompactionResult, Compactor, ContextBudgetOptions } from "../conte
5
5
  import type { ModelGateway, ReasoningConfig } from "../model/model-gateway.js";
6
6
  import { ToolRegistry } from "../tools/registry.js";
7
7
  import type { CanUseTool, ToolUseContext } from "../tools/tool.js";
8
- import type { QueryOptions, TaskNotificationSource } from "./query.js";
8
+ import type { QueryOptions, SessionSettingsPatch, TaskNotificationSource } from "./query.js";
9
9
  import type { AgentEvent, ContextMetrics } from "../types/events.js";
10
10
  import type { Message, MessageBlock } from "../types/messages.js";
11
11
  import type { TerminalReason } from "./state.js";
12
12
  import { type SessionDisplayEntry, type SessionStoreSnapshot, type SessionSummary } from "../session/session-store.js";
13
13
  import type { SessionPromptExportSnapshot } from "../session/session-export.js";
14
+ import { type SessionPromptSnapshot, type SessionPromptUpdate, type SessionPromptUpdateResult } from "./session-settings-prompt.js";
15
+ type PendingSessionSettings = SessionSettingsPatch & {
16
+ sessionPrompt?: string | null;
17
+ };
18
+ export type { SessionSettingsPatch } from "./query.js";
14
19
  export interface QueryEngineOptions {
15
20
  agentId?: string;
16
21
  cwd?: string;
@@ -61,19 +66,30 @@ export declare class QueryEngine {
61
66
  private currentModel?;
62
67
  private currentReasoning?;
63
68
  private currentFastMode;
69
+ private running;
70
+ private pendingSessionSettings;
71
+ private sessionPromptState?;
72
+ private activeSessionPrompt;
73
+ private readonly ephemeralSessionKey;
74
+ private settingsMutation;
64
75
  private currentContextWindowTokens?;
65
76
  private currentModelGateway;
66
77
  private sessionInitialized;
78
+ private sessionInitialization?;
67
79
  private titleSchedulerVersion;
68
80
  private titleAgentRun?;
69
81
  private readonly sessionTitleListeners;
70
82
  private readonly appPromptStore;
71
83
  private readonly contextManager;
84
+ private readonly baselineContextManager;
72
85
  private readonly additionalPromptContextManager;
73
86
  private pendingCwdTransitionPaths?;
87
+ private pendingRequestContext?;
88
+ private pendingRequestContextConsumed?;
74
89
  constructor(options: QueryEngineOptions);
75
90
  forkForSession(sessionId?: string, resume?: boolean): QueryEngine;
76
91
  onSessionTitleChange(listener: (snapshot: SessionStoreSnapshot | undefined) => void): () => void;
92
+ noteRecoverableSubagents(onConsumed?: () => void): void;
77
93
  initialize(): Promise<void>;
78
94
  newSession(): Promise<SessionStoreSnapshot>;
79
95
  listSessions(limit?: number): Promise<SessionSummary[]>;
@@ -84,6 +100,19 @@ export declare class QueryEngine {
84
100
  displayText?: string;
85
101
  stopAfterTurn?: QueryOptions["stopAfterTurn"];
86
102
  }): AsyncGenerator<AgentEvent>;
103
+ /** Queue instance-local settings; no prompt messages or provider-global mutation. */
104
+ updateSessionSettings(patch: SessionSettingsPatch): Promise<{
105
+ deferred: boolean;
106
+ compaction?: CompactionResult;
107
+ }>;
108
+ /** Editor state includes accepted queued changes; runtime exports still describe the active turn. */
109
+ getSessionPrompt(): Promise<SessionPromptSnapshot>;
110
+ updateSessionPrompt(input: SessionPromptUpdate): Promise<SessionPromptUpdateResult>;
111
+ private sessionPromptKey;
112
+ getPendingSessionSettings(): PendingSessionSettings;
113
+ private consumeSessionSettings;
114
+ private applySessionSettings;
115
+ private flushSessionSettings;
87
116
  setModel(model: string | undefined, reasoning?: ReasoningConfig | null, updateReasoning?: boolean): void;
88
117
  setModelProvider(settings: {
89
118
  modelGateway: ModelGateway;
@@ -120,6 +149,8 @@ export declare class QueryEngine {
120
149
  session?: SessionStoreSnapshot;
121
150
  };
122
151
  getHistoryMessages(): Message[];
152
+ /** User-facing read-only detail boundaries must also redact secrets registered at runtime. */
153
+ redactDisplayValue<T>(value: T): T;
123
154
  getDisplayEntries(): SessionDisplayEntry[];
124
155
  private applyCompactionResult;
125
156
  contextMetrics(): Promise<ContextMetrics>;
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { InMemoryAppState } from "../app/app-state.js";
2
3
  import { InMemoryAppPromptStore } from "../app/app-prompt.js";
3
4
  import { AppPromptContextManager, DefaultContextManager, readProjectMemoryDocuments } from "../context/context-manager.js";
@@ -14,6 +15,7 @@ import { GENERAL_PURPOSE_AGENT } from "../agents/agent-definition.js";
14
15
  import { SessionStore } from "../session/session-store.js";
15
16
  import { buildPromptCacheDiagnostics } from "./prompt-cache-telemetry.js";
16
17
  import { computeStaticTokens } from "./context-metrics.js";
18
+ import { applySessionPrompt, createSessionPromptSnapshot, parseSessionPromptUpdate, SessionPromptError } from "./session-settings-prompt.js";
17
19
  const DEFAULT_SESSION_TITLE_DELAY_MS = 5000;
18
20
  export class QueryEngine {
19
21
  options;
@@ -25,16 +27,27 @@ export class QueryEngine {
25
27
  currentModel;
26
28
  currentReasoning;
27
29
  currentFastMode = false;
30
+ running = false;
31
+ pendingSessionSettings = {};
32
+ sessionPromptState;
33
+ activeSessionPrompt = null;
34
+ ephemeralSessionKey = randomUUID();
35
+ // Idle mutations and the next generator share a barrier. Never compact alongside a request.
36
+ settingsMutation = Promise.resolve();
28
37
  currentContextWindowTokens;
29
38
  currentModelGateway;
30
39
  sessionInitialized = false;
40
+ sessionInitialization;
31
41
  titleSchedulerVersion = 0;
32
42
  titleAgentRun;
33
43
  sessionTitleListeners = new Set();
34
44
  appPromptStore;
35
45
  contextManager;
46
+ baselineContextManager;
36
47
  additionalPromptContextManager;
37
48
  pendingCwdTransitionPaths;
49
+ pendingRequestContext;
50
+ pendingRequestContextConsumed;
38
51
  constructor(options) {
39
52
  this.options = options;
40
53
  this.agentId = options.agentId ?? "main";
@@ -47,7 +60,12 @@ export class QueryEngine {
47
60
  ?? options.contextManager
48
61
  ?? new DefaultContextManager({ cwd: options.cwd });
49
62
  this.additionalPromptContextManager = new AdditionalPromptContextManager(baseContextManager, options.additionalPromptSections);
50
- this.contextManager = new AppPromptContextManager(this.additionalPromptContextManager, this.appPromptStore);
63
+ this.baselineContextManager = new AppPromptContextManager(this.additionalPromptContextManager, this.appPromptStore);
64
+ this.contextManager = { build: async (input) => {
65
+ // Capture before any asynchronous baseline work: an in-flight request never observes a later edit.
66
+ const content = this.activeSessionPrompt;
67
+ return applySessionPrompt(await this.baselineContextManager.build(input), content);
68
+ } };
51
69
  this.pendingCwdTransitionPaths = normalizeCwdTransitionPaths(options.cwdTransitionPaths);
52
70
  }
53
71
  forkForSession(sessionId, resume = true) {
@@ -66,26 +84,48 @@ export class QueryEngine {
66
84
  this.sessionTitleListeners.add(listener);
67
85
  return () => this.sessionTitleListeners.delete(listener);
68
86
  }
87
+ noteRecoverableSubagents(onConsumed) {
88
+ this.pendingRequestContext = {
89
+ ...this.pendingRequestContext,
90
+ recoveryHint: "Interrupted subagents can be resumed.",
91
+ };
92
+ if (onConsumed)
93
+ this.pendingRequestContextConsumed = onConsumed;
94
+ }
69
95
  async initialize() {
96
+ if (this.sessionInitialization)
97
+ return this.sessionInitialization;
70
98
  if (this.sessionInitialized)
71
99
  return;
72
- this.sessionInitialized = true;
73
- if (this.options.session?.enabled === false)
74
- return;
75
- if (!this.options.session)
76
- return;
77
- await this.openSession({
78
- sessionId: this.options.session.sessionId,
79
- resume: this.options.session.resume,
80
- });
100
+ const initialization = (async () => {
101
+ if (this.options.session?.enabled !== false && this.options.session) {
102
+ await this.openSession({ sessionId: this.options.session.sessionId, resume: this.options.session.resume });
103
+ }
104
+ this.sessionInitialized = true;
105
+ })();
106
+ this.sessionInitialization = initialization;
107
+ try {
108
+ await initialization;
109
+ }
110
+ finally {
111
+ this.sessionInitialization = undefined;
112
+ }
81
113
  }
82
114
  async newSession() {
83
- this.sessionInitialized = true;
84
- await this.openSession({ resume: false });
85
- const snapshot = this.sessionStore?.snapshot();
86
- if (!snapshot)
87
- throw new Error("session transcripts are disabled");
88
- return snapshot;
115
+ if (this.running)
116
+ throw new Error("cannot switch session while query engine is running");
117
+ const mutation = this.settingsMutation.then(async () => {
118
+ await this.sessionInitialization;
119
+ await this.openSession({ resume: false });
120
+ this.sessionInitialized = true;
121
+ const snapshot = this.sessionStore?.snapshot();
122
+ if (!snapshot)
123
+ throw new Error("session transcripts are disabled");
124
+ return snapshot;
125
+ });
126
+ // Session switches share the editor barrier: stale saves can never land in a new session.
127
+ this.settingsMutation = mutation.catch(() => undefined);
128
+ return mutation;
89
129
  }
90
130
  async listSessions(limit = 10) {
91
131
  if (this.options.session?.enabled === false || !this.options.session)
@@ -111,78 +151,241 @@ export class QueryEngine {
111
151
  });
112
152
  }
113
153
  async *sendUserText(text, options = {}) {
154
+ if (this.running)
155
+ throw new Error("query engine is already running");
156
+ this.running = true;
157
+ try {
158
+ await this.settingsMutation;
159
+ await this.initialize();
160
+ const cwdTransitionPaths = this.pendingCwdTransitionPaths;
161
+ const pendingRequestContext = this.pendingRequestContext;
162
+ const pendingRequestContextConsumed = this.pendingRequestContextConsumed;
163
+ this.pendingCwdTransitionPaths = undefined;
164
+ this.options.cwdTransitionPaths = undefined;
165
+ if (cwdTransitionPaths?.length)
166
+ void this.options.onCwdTransitionConsumed?.();
167
+ const userMessage = options.blocks
168
+ ? await this.persistMessageImages({
169
+ ...createTextMessage("user", options.displayText ?? text),
170
+ blocks: options.blocks,
171
+ })
172
+ : createTextMessage("user", text);
173
+ this.history.push(userMessage);
174
+ this.sessionStore?.recordMessage(userMessage);
175
+ this.scheduleSessionTitleCheck();
176
+ const initMessage = createSystemInitMessage({
177
+ agentId: this.agentId,
178
+ tools: this.options.tools.names(),
179
+ model: this.currentModel,
180
+ commands: [...(this.options.commands ?? [])],
181
+ agents: [...(this.options.agents ?? [])],
182
+ skills: [...(this.options.skills ?? [])],
183
+ plugins: [...(this.options.plugins ?? [])],
184
+ });
185
+ initMessage.metadata = {
186
+ ...initMessage.metadata,
187
+ reasoning: cloneReasoningConfig(this.currentReasoning),
188
+ };
189
+ yield {
190
+ type: "message",
191
+ message: initMessage,
192
+ };
193
+ this.sessionStore?.recordMessage(initMessage);
194
+ const queryOptions = {
195
+ agentId: this.agentId,
196
+ model: this.currentModel,
197
+ reasoning: cloneReasoningConfig(this.currentReasoning),
198
+ queryOrigin: this.options.queryOrigin ?? "repl",
199
+ serviceTier: this.currentFastMode ? "priority" : undefined,
200
+ maxOutputTokensOverride: this.options.maxOutputTokensOverride,
201
+ contextWindowTokensOverride: this.currentContextWindowTokens,
202
+ maxTurns: this.options.maxTurns,
203
+ workspaceCwd: this.options.cwd,
204
+ requestContext: pendingRequestContext || cwdTransitionPaths?.length
205
+ ? {
206
+ ...pendingRequestContext,
207
+ ...(cwdTransitionPaths?.length
208
+ ? { cwdTransition: { paths: cwdTransitionPaths, current: cwdTransitionPaths.at(-1) } }
209
+ : {}),
210
+ }
211
+ : undefined,
212
+ onRequestContextConsumed: pendingRequestContext ? () => {
213
+ pendingRequestContextConsumed?.();
214
+ if (this.pendingRequestContext === pendingRequestContext) {
215
+ this.pendingRequestContext = undefined;
216
+ this.pendingRequestContextConsumed = undefined;
217
+ }
218
+ } : undefined,
219
+ abortSignal: options.abortSignal,
220
+ stopAfterTurn: options.stopAfterTurn,
221
+ beforeTurn: (messages) => this.consumeSessionSettings(messages),
222
+ };
223
+ const stream = query(this.history, {
224
+ ...this.options,
225
+ contextManager: this.contextManager,
226
+ modelGateway: this.currentModelGateway,
227
+ taskNotificationSource: this.options.taskNotificationSource,
228
+ toolResultMemory: this.sessionStore?.toolResultMemory,
229
+ session: this.sessionStore ? { sessionId: this.sessionStore.sessionId, sessionDir: this.sessionStore.sessionDir, rootDir: this.options.session?.rootDir } : undefined,
230
+ recordContentReplacements: (records) => this.sessionStore?.recordContentReplacements(records),
231
+ exportToolCalls: (calls) => this.recordSyntheticToolCalls(calls),
232
+ applyCompaction: (result) => this.applyCompactionResult(result),
233
+ }, queryOptions);
234
+ for await (const event of stream) {
235
+ if (event.type === "message") {
236
+ const message = await this.persistMessageImages(event.message);
237
+ this.history.push(message);
238
+ this.sessionStore?.recordMessage(message);
239
+ yield { ...event, message };
240
+ continue;
241
+ }
242
+ if (event.type === "terminal") {
243
+ this.lastTerminalReason = event.reason;
244
+ // The final assistant/tool messages have already been recorded by this wrapper.
245
+ const hadPending = Object.keys(this.pendingSessionSettings).length > 0;
246
+ for (const result of await this.flushSessionSettings()) {
247
+ if (result.report)
248
+ yield { type: "context.compacted", compaction: result.report };
249
+ }
250
+ if (hadPending)
251
+ yield { type: "context.metrics", metrics: await this.contextMetrics() };
252
+ }
253
+ yield event;
254
+ }
255
+ }
256
+ finally {
257
+ // Covers initialization errors, aborts, exceptions and consumer generator.return().
258
+ // Do not yield in finally: a closing consumer may never resume the generator.
259
+ try {
260
+ do {
261
+ await this.flushSessionSettings();
262
+ } while (Object.keys(this.pendingSessionSettings).length);
263
+ }
264
+ finally {
265
+ this.running = false;
266
+ }
267
+ }
268
+ }
269
+ /** Queue instance-local settings; no prompt messages or provider-global mutation. */
270
+ async updateSessionSettings(patch) {
271
+ const normalized = {};
272
+ if (Object.hasOwn(patch, "model"))
273
+ normalized.model = patch.model?.trim() || undefined;
274
+ if (Object.hasOwn(patch, "reasoning"))
275
+ normalized.reasoning = cloneReasoningConfig(patch.reasoning);
276
+ if (Object.hasOwn(patch, "fastMode"))
277
+ normalized.fastMode = patch.fastMode === true;
278
+ if (Object.hasOwn(patch, "contextWindowTokens")) {
279
+ const tokens = normalizePositiveInteger(patch.contextWindowTokens);
280
+ if (!tokens)
281
+ throw new Error("context window tokens must be a positive integer");
282
+ normalized.contextWindowTokens = tokens;
283
+ }
284
+ if (patch.compact)
285
+ normalized.compact = true;
286
+ if (this.running) {
287
+ this.pendingSessionSettings = { ...this.pendingSessionSettings, ...normalized };
288
+ return { deferred: true };
289
+ }
290
+ const mutation = this.settingsMutation.then(async () => {
291
+ await this.initialize();
292
+ const update = await this.applySessionSettings(normalized, this.getHistoryMessages());
293
+ if (update?.compaction)
294
+ this.applyCompactionResult(update.compaction);
295
+ return { deferred: false, ...(update?.compaction ? { compaction: update.compaction } : {}) };
296
+ });
297
+ // A rejected mutation must not poison subsequent settings or user input.
298
+ this.settingsMutation = mutation.catch(() => undefined);
299
+ return mutation;
300
+ }
301
+ /** Editor state includes accepted queued changes; runtime exports still describe the active turn. */
302
+ async getSessionPrompt() {
303
+ await this.settingsMutation;
114
304
  await this.initialize();
115
- const cwdTransitionPaths = this.pendingCwdTransitionPaths;
116
- this.pendingCwdTransitionPaths = undefined;
117
- this.options.cwdTransitionPaths = undefined;
118
- if (cwdTransitionPaths?.length)
119
- void this.options.onCwdTransitionConsumed?.();
120
- const userMessage = options.blocks
121
- ? await this.persistMessageImages({
122
- ...createTextMessage("user", options.displayText ?? text),
123
- blocks: options.blocks,
124
- })
125
- : createTextMessage("user", text);
126
- this.history.push(userMessage);
127
- this.sessionStore?.recordMessage(userMessage);
128
- this.scheduleSessionTitleCheck();
129
- const initMessage = createSystemInitMessage({
130
- agentId: this.agentId,
131
- tools: this.options.tools.names(),
132
- model: this.currentModel,
133
- commands: [...(this.options.commands ?? [])],
134
- agents: [...(this.options.agents ?? [])],
135
- skills: [...(this.options.skills ?? [])],
136
- plugins: [...(this.options.plugins ?? [])],
305
+ const snapshot = await this.buildPromptExportSnapshot(this.getHistoryMessages());
306
+ return createSessionPromptSnapshot(this.sessionPromptKey(), this.sessionPromptState, snapshot.baseSystemPrompt ?? "");
307
+ }
308
+ async updateSessionPrompt(input) {
309
+ const update = parseSessionPromptUpdate(input);
310
+ const mutation = this.settingsMutation.then(async () => {
311
+ await this.initialize();
312
+ const key = this.sessionPromptKey();
313
+ const snapshot = await this.buildPromptExportSnapshot(this.getHistoryMessages());
314
+ const current = createSessionPromptSnapshot(key, this.sessionPromptState, snapshot.baseSystemPrompt ?? "");
315
+ if (key !== this.sessionPromptKey() || update.revision !== current.revision) {
316
+ throw new SessionPromptError("session prompt changed; reload before saving", 409);
317
+ }
318
+ const state = { content: update.reset ? null : update.content, revision: randomUUID() };
319
+ // Persist before accepting, including busy edits, so same-session resume cannot lose them.
320
+ this.sessionStore?.recordSessionPrompt(state);
321
+ this.sessionPromptState = state;
322
+ const deferred = this.running;
323
+ if (deferred)
324
+ this.pendingSessionSettings = { ...this.pendingSessionSettings, sessionPrompt: state.content };
325
+ else
326
+ this.activeSessionPrompt = state.content;
327
+ return { ok: true, ...createSessionPromptSnapshot(key, state, snapshot.baseSystemPrompt ?? ""), deferred };
137
328
  });
138
- initMessage.metadata = {
139
- ...initMessage.metadata,
140
- reasoning: cloneReasoningConfig(this.currentReasoning),
141
- };
142
- yield {
143
- type: "message",
144
- message: initMessage,
145
- };
146
- this.sessionStore?.recordMessage(initMessage);
147
- const queryOptions = {
148
- agentId: this.agentId,
149
- model: this.currentModel,
150
- reasoning: cloneReasoningConfig(this.currentReasoning),
151
- queryOrigin: this.options.queryOrigin ?? "repl",
152
- serviceTier: this.currentFastMode ? "priority" : undefined,
153
- maxOutputTokensOverride: this.options.maxOutputTokensOverride,
154
- contextWindowTokensOverride: this.currentContextWindowTokens,
155
- maxTurns: this.options.maxTurns,
156
- workspaceCwd: this.options.cwd,
157
- requestContext: cwdTransitionPaths?.length
158
- ? { cwdTransition: { paths: cwdTransitionPaths, current: cwdTransitionPaths.at(-1) } }
159
- : undefined,
160
- abortSignal: options.abortSignal,
161
- stopAfterTurn: options.stopAfterTurn,
162
- };
163
- const stream = query(this.history, {
164
- ...this.options,
165
- contextManager: this.contextManager,
166
- modelGateway: this.currentModelGateway,
167
- taskNotificationSource: this.options.taskNotificationSource,
168
- toolResultMemory: this.sessionStore?.toolResultMemory,
169
- session: this.sessionStore ? { sessionId: this.sessionStore.sessionId, sessionDir: this.sessionStore.sessionDir, rootDir: this.options.session?.rootDir } : undefined,
170
- recordContentReplacements: (records) => this.sessionStore?.recordContentReplacements(records),
171
- exportToolCalls: (calls) => this.recordSyntheticToolCalls(calls),
172
- applyCompaction: (result) => this.applyCompactionResult(result),
173
- }, queryOptions);
174
- for await (const event of stream) {
175
- if (event.type === "message") {
176
- const message = await this.persistMessageImages(event.message);
177
- this.history.push(message);
178
- this.sessionStore?.recordMessage(message);
179
- yield { ...event, message };
180
- continue;
329
+ this.settingsMutation = mutation.catch(() => undefined);
330
+ return mutation;
331
+ }
332
+ sessionPromptKey() {
333
+ return this.sessionStore ? `${this.sessionStore.sessionDir}:${this.agentId}` : this.ephemeralSessionKey;
334
+ }
335
+ getPendingSessionSettings() {
336
+ const patch = { ...this.pendingSessionSettings };
337
+ if (Object.hasOwn(patch, "reasoning"))
338
+ patch.reasoning = cloneReasoningConfig(patch.reasoning);
339
+ return patch;
340
+ }
341
+ async consumeSessionSettings(messages) {
342
+ const patch = this.pendingSessionSettings;
343
+ if (!Object.keys(patch).length)
344
+ return undefined;
345
+ this.pendingSessionSettings = {};
346
+ return this.applySessionSettings(patch, messages);
347
+ }
348
+ async applySessionSettings(patch, messages) {
349
+ const changed = {};
350
+ if (Object.hasOwn(patch, "sessionPrompt"))
351
+ this.activeSessionPrompt = patch.sessionPrompt ?? null;
352
+ if (Object.hasOwn(patch, "model") && patch.model !== this.currentModel) {
353
+ this.currentModel = patch.model;
354
+ changed.model = patch.model;
355
+ }
356
+ if (Object.hasOwn(patch, "reasoning") && !sameReasoningConfig(patch.reasoning, this.currentReasoning)) {
357
+ this.currentReasoning = cloneReasoningConfig(patch.reasoning);
358
+ changed.reasoning = cloneReasoningConfig(patch.reasoning);
359
+ }
360
+ if (Object.hasOwn(patch, "fastMode") && patch.fastMode !== this.currentFastMode) {
361
+ this.currentFastMode = patch.fastMode === true;
362
+ this.sessionStore?.recordFastMode(this.currentFastMode);
363
+ changed.fastMode = this.currentFastMode;
364
+ }
365
+ if (Object.hasOwn(patch, "contextWindowTokens") && patch.contextWindowTokens !== this.currentContextWindowTokens) {
366
+ this.currentContextWindowTokens = patch.contextWindowTokens;
367
+ this.sessionStore?.recordContextWindowTokens(this.currentContextWindowTokens);
368
+ changed.contextWindowTokens = this.currentContextWindowTokens;
369
+ }
370
+ let compaction;
371
+ if (patch.compact) {
372
+ const compactor = this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
373
+ const budget = { ...this.options.contextBudget, contextWindowTokens: this.currentContextWindowTokens ?? this.options.contextBudget?.contextWindowTokens };
374
+ compaction = withCompactionReport(await (compactor.manualCompact?.(messages, budget) ?? compactor.compact(messages, budget)), messages.length);
375
+ }
376
+ return Object.keys(changed).length || compaction ? { settings: changed, compaction } : undefined;
377
+ }
378
+ async flushSessionSettings() {
379
+ const results = [];
380
+ while (Object.keys(this.pendingSessionSettings).length) {
381
+ const update = await this.consumeSessionSettings(this.getHistoryMessages());
382
+ if (update?.compaction) {
383
+ this.applyCompactionResult(update.compaction);
384
+ if (update.compaction.changed)
385
+ results.push(update.compaction);
181
386
  }
182
- if (event.type === "terminal")
183
- this.lastTerminalReason = event.reason;
184
- yield event;
185
387
  }
388
+ return results;
186
389
  }
187
390
  setModel(model, reasoning, updateReasoning = false) {
188
391
  this.currentModel = model?.trim() || undefined;
@@ -240,6 +443,9 @@ export class QueryEngine {
240
443
  return this.appPromptStore.snapshot();
241
444
  }
242
445
  reset() {
446
+ if (this.running)
447
+ throw new Error("cannot reset while query engine is running");
448
+ this.pendingSessionSettings = {};
243
449
  this.history.length = 0;
244
450
  this.lastTerminalReason = undefined;
245
451
  this.cancelPendingTitleWork();
@@ -247,17 +453,10 @@ export class QueryEngine {
247
453
  this.notifySessionTitleChange(this.sessionStore?.snapshot());
248
454
  }
249
455
  async compact(options = {}) {
250
- await this.initialize();
251
456
  if (options.abortSignal?.aborted)
252
457
  return { messages: this.getHistoryMessages(), changed: false, reason: "none" };
253
- const compactor = this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
254
- const contextBudget = {
255
- ...this.options.contextBudget,
256
- contextWindowTokens: this.currentContextWindowTokens ?? this.options.contextBudget?.contextWindowTokens,
257
- };
258
- const result = withCompactionReport(await (compactor.manualCompact?.(this.history, contextBudget) ?? compactor.compact(this.history, contextBudget)), this.history.length);
259
- this.applyCompactionResult(result);
260
- return result;
458
+ const result = await this.updateSessionSettings({ compact: true });
459
+ return result.compaction ?? { messages: this.getHistoryMessages(), changed: false, reason: "none" };
261
460
  }
262
461
  async pureCompact(options = {}) {
263
462
  await this.initialize();
@@ -287,6 +486,10 @@ export class QueryEngine {
287
486
  getHistoryMessages() {
288
487
  return this.history.map(cloneMessage);
289
488
  }
489
+ /** User-facing read-only detail boundaries must also redact secrets registered at runtime. */
490
+ redactDisplayValue(value) {
491
+ return this.options.secretRedactions?.redact(value) ?? value;
492
+ }
290
493
  getDisplayEntries() {
291
494
  return this.sessionStore?.getDisplayEntries() ?? this.history.map((message) => ({ type: "message", message: cloneMessage(message) }));
292
495
  }
@@ -331,6 +534,11 @@ export class QueryEngine {
331
534
  tools: this.options.tools,
332
535
  appState: new InMemoryAppState(this.agentId, this.options.cwd),
333
536
  toolResultMemory: this.sessionStore?.toolResultMemory,
537
+ session: this.sessionStore ? {
538
+ sessionId: this.sessionStore.sessionId,
539
+ sessionDir: this.sessionStore.sessionDir,
540
+ rootDir: this.options.session?.rootDir,
541
+ } : undefined,
334
542
  secrets: this.options.secrets,
335
543
  secretRedactions: this.options.secretRedactions,
336
544
  recordContentReplacements: (records) => this.sessionStore?.recordContentReplacements(records),
@@ -343,12 +551,15 @@ export class QueryEngine {
343
551
  emit: () => undefined,
344
552
  };
345
553
  const initialToolDefinitions = this.options.tools.definitions(toolContext);
346
- const context = await this.contextManager.build({
554
+ const activePrompt = this.activeSessionPrompt;
555
+ const baseline = await this.baselineContextManager.build({
347
556
  agentId: this.agentId,
348
557
  messages,
349
558
  enabledTools: initialToolDefinitions.map((tool) => tool.name),
350
559
  toolUseContext: toolContext,
351
560
  });
561
+ const context = applySessionPrompt(baseline, activePrompt);
562
+ const desiredPrompt = createSessionPromptSnapshot(this.sessionPromptKey(), this.sessionPromptState, baseline.systemPrompt);
352
563
  const toolDefinitions = this.options.tools.definitions(toolContext);
353
564
  const messagesWithUserContext = applyRuntimeContextForPromptCache([], context.userContext, {});
354
565
  const userContextPrompt = messagesWithUserContext[0]?.blocks
@@ -359,7 +570,13 @@ export class QueryEngine {
359
570
  model: this.currentModel,
360
571
  reasoning: cloneReasoningConfig(this.currentReasoning),
361
572
  systemPrompt: context.systemPrompt,
362
- baseSystemPrompt: context.systemPrompt,
573
+ baseSystemPrompt: baseline.systemPrompt,
574
+ sessionPrompt: {
575
+ override: activePrompt !== null,
576
+ revision: desiredPrompt.revision,
577
+ deferred: Object.hasOwn(this.pendingSessionSettings, "sessionPrompt"),
578
+ pendingOverride: desiredPrompt.override,
579
+ },
363
580
  promptSections: context.promptSections,
364
581
  userContext: context.userContext,
365
582
  systemContext: context.systemContext,
@@ -416,6 +633,9 @@ export class QueryEngine {
416
633
  resume: options.resume,
417
634
  toolResultThresholdChars: this.options.session.toolResultThresholdChars,
418
635
  });
636
+ this.pendingSessionSettings = {};
637
+ this.sessionPromptState = this.sessionStore.getSessionPrompt();
638
+ this.activeSessionPrompt = this.sessionPromptState?.content ?? null;
419
639
  this.history.length = 0;
420
640
  if (options.resume)
421
641
  this.history.push(...this.sessionStore.getInitialMessages());
@@ -576,6 +796,11 @@ function resolveSessionTitleDelayMs() {
576
796
  }
577
797
  return DEFAULT_SESSION_TITLE_DELAY_MS;
578
798
  }
799
+ function sameReasoningConfig(a, b) {
800
+ if (a === null || b === null || a === undefined || b === undefined)
801
+ return a === b;
802
+ return a.effort === b.effort && a.summary === b.summary;
803
+ }
579
804
  function cloneReasoningConfig(reasoning) {
580
805
  if (reasoning === null)
581
806
  return null;