@kenkaiiii/ggcoder 5.13.3 → 5.15.0

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 (95) hide show
  1. package/dist/app-sidecar.js +158 -48
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/chat-agents/general.d.ts +7 -0
  4. package/dist/chat-agents/general.d.ts.map +1 -0
  5. package/dist/chat-agents/general.js +16 -0
  6. package/dist/chat-agents/general.js.map +1 -0
  7. package/dist/chat-agents/general.test.d.ts +2 -0
  8. package/dist/chat-agents/general.test.d.ts.map +1 -0
  9. package/dist/chat-agents/general.test.js +47 -0
  10. package/dist/chat-agents/general.test.js.map +1 -0
  11. package/dist/chat-agents/index.d.ts +11 -0
  12. package/dist/chat-agents/index.d.ts.map +1 -0
  13. package/dist/chat-agents/index.js +89 -0
  14. package/dist/chat-agents/index.js.map +1 -0
  15. package/dist/chat-agents/memory.d.ts +53 -0
  16. package/dist/chat-agents/memory.d.ts.map +1 -0
  17. package/dist/chat-agents/memory.js +362 -0
  18. package/dist/chat-agents/memory.js.map +1 -0
  19. package/dist/chat-agents/memory.test.d.ts +2 -0
  20. package/dist/chat-agents/memory.test.d.ts.map +1 -0
  21. package/dist/chat-agents/memory.test.js +155 -0
  22. package/dist/chat-agents/memory.test.js.map +1 -0
  23. package/dist/chat-agents/research.d.ts +7 -0
  24. package/dist/chat-agents/research.d.ts.map +1 -0
  25. package/dist/chat-agents/research.js +18 -0
  26. package/dist/chat-agents/research.js.map +1 -0
  27. package/dist/chat-agents/shared.d.ts +11 -0
  28. package/dist/chat-agents/shared.d.ts.map +1 -0
  29. package/dist/chat-agents/shared.js +48 -0
  30. package/dist/chat-agents/shared.js.map +1 -0
  31. package/dist/chat-agents/specialists.test.d.ts +2 -0
  32. package/dist/chat-agents/specialists.test.d.ts.map +1 -0
  33. package/dist/chat-agents/specialists.test.js +97 -0
  34. package/dist/chat-agents/specialists.test.js.map +1 -0
  35. package/dist/chat-agents/therapist.d.ts +7 -0
  36. package/dist/chat-agents/therapist.d.ts.map +1 -0
  37. package/dist/chat-agents/therapist.js +20 -0
  38. package/dist/chat-agents/therapist.js.map +1 -0
  39. package/dist/chat-agents/types.d.ts +4 -0
  40. package/dist/chat-agents/types.d.ts.map +1 -0
  41. package/dist/chat-agents/types.js +7 -0
  42. package/dist/chat-agents/types.js.map +1 -0
  43. package/dist/core/agent-session-memory-tail.test.d.ts +2 -0
  44. package/dist/core/agent-session-memory-tail.test.d.ts.map +1 -0
  45. package/dist/core/agent-session-memory-tail.test.js +122 -0
  46. package/dist/core/agent-session-memory-tail.test.js.map +1 -0
  47. package/dist/core/agent-session.d.ts +25 -0
  48. package/dist/core/agent-session.d.ts.map +1 -1
  49. package/dist/core/agent-session.js +128 -65
  50. package/dist/core/agent-session.js.map +1 -1
  51. package/dist/core/agents.d.ts +1 -1
  52. package/dist/core/agents.d.ts.map +1 -1
  53. package/dist/core/agents.js +4 -2
  54. package/dist/core/agents.js.map +1 -1
  55. package/dist/core/progress/rebuild.d.ts +3 -3
  56. package/dist/core/progress/rebuild.d.ts.map +1 -1
  57. package/dist/core/progress/rebuild.js +33 -27
  58. package/dist/core/progress/rebuild.js.map +1 -1
  59. package/dist/core/progress/rebuild.test.js +15 -0
  60. package/dist/core/progress/rebuild.test.js.map +1 -1
  61. package/dist/core/project-discovery.d.ts +1 -1
  62. package/dist/core/project-discovery.d.ts.map +1 -1
  63. package/dist/core/project-discovery.js +1 -2
  64. package/dist/core/project-discovery.js.map +1 -1
  65. package/dist/core/project-discovery.test.js +14 -1
  66. package/dist/core/project-discovery.test.js.map +1 -1
  67. package/dist/core/session-manager.d.ts +1 -1
  68. package/dist/core/session-manager.d.ts.map +1 -1
  69. package/dist/core/session-manager.js +2 -1
  70. package/dist/core/session-manager.js.map +1 -1
  71. package/dist/core/session-manager.test.js +18 -0
  72. package/dist/core/session-manager.test.js.map +1 -1
  73. package/dist/core/subagent-manager.d.ts.map +1 -1
  74. package/dist/core/subagent-manager.js +4 -0
  75. package/dist/core/subagent-manager.js.map +1 -1
  76. package/dist/core/subagent-manager.test.js +5 -1
  77. package/dist/core/subagent-manager.test.js.map +1 -1
  78. package/dist/tools/generate-image.d.ts.map +1 -1
  79. package/dist/tools/generate-image.js +10 -3
  80. package/dist/tools/generate-image.js.map +1 -1
  81. package/dist/tools/generate-image.test.js +17 -0
  82. package/dist/tools/generate-image.test.js.map +1 -1
  83. package/dist/tools/web-fetch.d.ts +1 -0
  84. package/dist/tools/web-fetch.d.ts.map +1 -1
  85. package/dist/tools/web-fetch.js +112 -35
  86. package/dist/tools/web-fetch.js.map +1 -1
  87. package/dist/tools/web-fetch.test.js +146 -1
  88. package/dist/tools/web-fetch.test.js.map +1 -1
  89. package/dist/tools/web-search.d.ts +10 -0
  90. package/dist/tools/web-search.d.ts.map +1 -1
  91. package/dist/tools/web-search.js +236 -28
  92. package/dist/tools/web-search.js.map +1 -1
  93. package/dist/tools/web-search.test.js +77 -6
  94. package/dist/tools/web-search.test.js.map +1 -1
  95. package/package.json +4 -4
@@ -1,3 +1,4 @@
1
+ import { type AgentTool } from "@kenkaiiii/gg-agent";
1
2
  import { type Message, type Provider, type ThinkingLevel } from "@kenkaiiii/gg-ai";
2
3
  import { EventBus } from "./event-bus.js";
3
4
  import { SlashCommandRegistry } from "./slash-commands.js";
@@ -20,6 +21,8 @@ export interface AgentSessionOptions {
20
21
  cwd: string;
21
22
  baseUrl?: string;
22
23
  systemPrompt?: string;
24
+ /** Synchronous volatile prompt suffix, refreshed immediately before every run. */
25
+ getSystemPromptTail?: () => string;
23
26
  sessionId?: string;
24
27
  continueRecent?: boolean;
25
28
  maxTokens?: number;
@@ -92,6 +95,22 @@ export interface AgentSessionOptions {
92
95
  forceLongCacheRetention?: boolean;
93
96
  /** Hidden persistent subagent workers omit the async orchestration tool suite. */
94
97
  subagentWorker?: boolean;
98
+ /** Session storage root override. Chat agents use a dedicated namespace. */
99
+ sessionRootDir?: string;
100
+ /** Register GG Coder built-in/prompt/custom slash commands. Defaults to true. */
101
+ coderSlashCommands?: boolean;
102
+ /** Enable loop-break, re-grounding, and Ideal review hooks. Defaults to true. */
103
+ selfCorrectionHooks?: boolean;
104
+ /** Load project skills/agents and create local .gg directories. Defaults to true. */
105
+ projectCustomization?: boolean;
106
+ /** Register global + bundled subagents without loading project customization. */
107
+ globalSubagents?: boolean;
108
+ /** Load GG Coder extensions. Defaults to true. */
109
+ loadExtensions?: boolean;
110
+ /** Inject GG Coder's model-specific subagent orchestration prompt. Defaults to true. */
111
+ orchestrationPrompt?: boolean;
112
+ /** Host-provided tools appended to this session only (for example, chat delegation). */
113
+ additionalTools?: AgentTool[];
95
114
  }
96
115
  export interface AgentSessionState {
97
116
  provider: Provider;
@@ -158,6 +177,8 @@ export declare class AgentSession {
158
177
  private maxTokens;
159
178
  private thinkingLevel?;
160
179
  private customSystemPrompt?;
180
+ /** Stable prompt prefix retained separately from the volatile uncached tail. */
181
+ private baseSystemPrompt;
161
182
  /** Shared with the tool layer so plan-mode restrictions read live state. */
162
183
  private planModeRef;
163
184
  /** Path of the approved plan currently being implemented, or undefined. When
@@ -304,6 +325,8 @@ export declare class AgentSession {
304
325
  listBackgroundProcesses(): BackgroundProcess[];
305
326
  /** Stop a background process by id. Returns a human-readable status string. */
306
327
  killBackgroundProcess(id: string): Promise<string>;
328
+ /** Replace a host-owned system prompt in place without resetting conversation history. */
329
+ setCustomSystemPrompt(systemPrompt: string, promptCacheKeyPrefix?: string): void;
307
330
  /**
308
331
  * Toggle plan mode: flips the shared ref (so tools enforce read-only
309
332
  * restrictions) and rebuilds the system prompt in place so the model is told
@@ -320,6 +343,8 @@ export declare class AgentSession {
320
343
  setApprovedPlan(approvedPlanPath: string | undefined): Promise<void>;
321
344
  /** Rebuild messages[0] from current plan-mode + approved-plan state. */
322
345
  private rebuildSystemPromptInPlace;
346
+ private withSystemPromptTail;
347
+ private refreshSystemPromptTail;
323
348
  getMessages(): Message[];
324
349
  /** Ken Kai (mentor) turns recorded against this session, in record order. Used
325
350
  * by the host to interleave Ken's advisory exchanges back into the transcript
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
@@ -117,6 +117,8 @@ export class AgentSession {
117
117
  maxTokens;
118
118
  thinkingLevel;
119
119
  customSystemPrompt;
120
+ /** Stable prompt prefix retained separately from the volatile uncached tail. */
121
+ baseSystemPrompt = "";
120
122
  /** Shared with the tool layer so plan-mode restrictions read live state. */
121
123
  planModeRef = { current: false };
122
124
  /** Path of the approved plan currently being implemented, or undefined. When
@@ -168,24 +170,34 @@ export class AgentSession {
168
170
  await this.settingsManager.load();
169
171
  this.authStorage = new AuthStorage(paths.authFile);
170
172
  await this.authStorage.load();
171
- // Session manager
172
- this.sessionManager = new SessionManager(paths.sessionsDir);
173
- // Ensure project-local .gg directories exist
174
- const localGGDir = path.join(this.cwd, ".gg");
175
- await fs.mkdir(path.join(localGGDir, "skills"), { recursive: true });
176
- await fs.mkdir(path.join(localGGDir, "commands"), { recursive: true });
177
- await fs.mkdir(path.join(localGGDir, "agents"), { recursive: true });
178
- // Discover skills
179
- this.skills = await discoverSkills({
180
- globalSkillsDir: paths.skillsDir,
181
- projectDir: this.cwd,
182
- });
183
- // Discover agents and create tools (with sub-agent support)
184
- const agents = await discoverAgents({
185
- globalAgentsDir: paths.agentsDir,
186
- projectDir: this.cwd,
187
- });
188
- const { tools, processManager, rebuildReadTool, lspManager, subAgentManager } = await createTools(this.cwd, {
173
+ // Session manager. Agent-specific roots keep chat and coder histories isolated.
174
+ this.sessionManager = new SessionManager(this.opts.sessionRootDir ?? paths.sessionsDir);
175
+ const projectCustomization = this.opts.projectCustomization !== false;
176
+ if (projectCustomization) {
177
+ // Ensure project-local .gg directories exist.
178
+ const localGGDir = path.join(this.cwd, ".gg");
179
+ await fs.mkdir(path.join(localGGDir, "skills"), { recursive: true });
180
+ await fs.mkdir(path.join(localGGDir, "commands"), { recursive: true });
181
+ await fs.mkdir(path.join(localGGDir, "agents"), { recursive: true });
182
+ this.skills = await discoverSkills({
183
+ globalSkillsDir: paths.skillsDir,
184
+ projectDir: this.cwd,
185
+ });
186
+ }
187
+ else {
188
+ this.skills = [];
189
+ }
190
+ // Discover agents and create tools (with sub-agent support). Chat sessions
191
+ // can retain bundled workers without loading project/global customization.
192
+ const agents = projectCustomization
193
+ ? await discoverAgents({
194
+ globalAgentsDir: paths.agentsDir,
195
+ projectDir: this.cwd,
196
+ })
197
+ : this.opts.globalSubagents
198
+ ? await discoverAgents({ globalAgentsDir: paths.agentsDir })
199
+ : [];
200
+ const { tools: builtInTools, processManager, rebuildReadTool, lspManager, subAgentManager, } = await createTools(this.cwd, {
189
201
  agents,
190
202
  skills: this.skills,
191
203
  provider: this.provider,
@@ -211,6 +223,7 @@ export class AgentSession {
211
223
  }
212
224
  : {}),
213
225
  });
226
+ const tools = [...builtInTools, ...(this.opts.additionalTools ?? [])];
214
227
  // Apply the optional tool allow-list (read-only advisory sessions). Filtering
215
228
  // here means the excluded tools are never registered with the agent loop, so
216
229
  // a hallucinated call can't mutate the repo — and buildSystemPrompt below is
@@ -237,7 +250,8 @@ export class AgentSession {
237
250
  }
238
251
  const basePrompt = this.customSystemPrompt ??
239
252
  (await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider));
240
- this.messages = [{ role: "system", content: basePrompt }];
253
+ this.baseSystemPrompt = basePrompt;
254
+ this.messages = [{ role: "system", content: this.withSystemPromptTail(basePrompt) }];
241
255
  this.syncUltraOrchestrationPrompt();
242
256
  // Load or create session. Transient sessions (subagent spawns) never
243
257
  // touch the session store — sessionPath stays empty and persistMessage
@@ -260,48 +274,46 @@ export class AgentSession {
260
274
  else {
261
275
  await this.createNewSession();
262
276
  }
263
- // Register slash commands
264
- const builtins = createBuiltinCommands();
265
- for (const cmd of builtins) {
266
- this.slashCommands.register(cmd);
267
- }
268
- // Wire up /help to show all registered + prompt + custom commands
269
- const helpCmd = this.slashCommands.get("help");
270
- if (helpCmd) {
271
- const registry = this.slashCommands;
272
- const cwd = this.cwd;
273
- helpCmd.execute = async () => {
274
- const all = registry.getAll();
275
- const lines = all.map((c) => ` /${c.name}${c.aliases.length ? ` (${c.aliases.map((a) => "/" + a).join(", ")})` : ""} — ${c.description}`);
276
- // Add prompt-template commands
277
- if (PROMPT_COMMANDS.length > 0) {
278
- lines.push("");
279
- lines.push("Prompt commands:");
280
- for (const cmd of PROMPT_COMMANDS) {
281
- lines.push(` /${cmd.name}${cmd.aliases.length ? ` (${cmd.aliases.map((a) => "/" + a).join(", ")})` : ""} — ${cmd.description}`);
277
+ // GG Coder owns its command registry. Other agents start with an isolated
278
+ // empty registry and can register their own commands in their own file.
279
+ if (this.opts.coderSlashCommands !== false) {
280
+ const builtins = createBuiltinCommands();
281
+ for (const cmd of builtins)
282
+ this.slashCommands.register(cmd);
283
+ // Wire up /help to show all registered + prompt + custom commands.
284
+ const helpCmd = this.slashCommands.get("help");
285
+ if (helpCmd) {
286
+ const registry = this.slashCommands;
287
+ const cwd = this.cwd;
288
+ helpCmd.execute = async () => {
289
+ const all = registry.getAll();
290
+ const lines = all.map((c) => ` /${c.name}${c.aliases.length ? ` (${c.aliases.map((a) => "/" + a).join(", ")})` : ""} — ${c.description}`);
291
+ if (PROMPT_COMMANDS.length > 0) {
292
+ lines.push("", "Prompt commands:");
293
+ for (const cmd of PROMPT_COMMANDS) {
294
+ lines.push(` /${cmd.name}${cmd.aliases.length ? ` (${cmd.aliases.map((a) => "/" + a).join(", ")})` : ""} — ${cmd.description}`);
295
+ }
282
296
  }
283
- }
284
- // Add custom commands from .gg/commands/
285
- const customCmds = await loadCustomCommands(cwd);
286
- if (customCmds.length > 0) {
287
- lines.push("");
288
- lines.push("Custom commands:");
289
- for (const cmd of customCmds) {
290
- lines.push(` /${cmd.name} — ${cmd.description}`);
297
+ const customCmds = await loadCustomCommands(cwd);
298
+ if (customCmds.length > 0) {
299
+ lines.push("", "Custom commands:");
300
+ for (const cmd of customCmds)
301
+ lines.push(` /${cmd.name} — ${cmd.description}`);
291
302
  }
292
- }
293
- return "Available commands:\n" + lines.join("\n");
303
+ return "Available commands:\n" + lines.join("\n");
304
+ };
305
+ }
306
+ }
307
+ if (this.opts.loadExtensions !== false) {
308
+ const extContext = {
309
+ eventBus: this.eventBus,
310
+ registerTool: (tool) => this.tools.push(tool),
311
+ registerSlashCommand: (cmd) => this.slashCommands.register(cmd),
312
+ cwd: this.cwd,
313
+ settingsManager: this.settingsManager,
294
314
  };
315
+ await this.extensionLoader.loadAll(paths.extensionsDir, extContext);
295
316
  }
296
- // Load extensions
297
- const extContext = {
298
- eventBus: this.eventBus,
299
- registerTool: (tool) => this.tools.push(tool),
300
- registerSlashCommand: (cmd) => this.slashCommands.register(cmd),
301
- cwd: this.cwd,
302
- settingsManager: this.settingsManager,
303
- };
304
- await this.extensionLoader.loadAll(paths.extensionsDir, extContext);
305
317
  this.eventBus.emit("session_start", { sessionId: this.sessionId });
306
318
  }
307
319
  /**
@@ -417,12 +429,17 @@ export class AgentSession {
417
429
  * Process user input. Handles slash commands or runs agent loop.
418
430
  */
419
431
  async prompt(content) {
420
- // Check for slash commands
421
- const parsed = this.slashCommands.parse(content);
432
+ const parsedInput = this.slashCommands.parse(content);
433
+ const coderCommands = this.opts.coderSlashCommands !== false;
434
+ // Non-coder agents only intercept commands registered in their own registry.
435
+ // Unknown `/text` stays a normal conversational prompt.
436
+ const parsed = parsedInput && (coderCommands || this.slashCommands.get(parsedInput.name))
437
+ ? parsedInput
438
+ : null;
422
439
  if (parsed) {
423
- // Check prompt-template commands first (built-in + custom)
424
- const builtinPromptCmd = getPromptCommand(parsed.name);
425
- const customCmds = await loadCustomCommands(this.cwd);
440
+ // GG Coder alone can resolve its prompt-template and project commands.
441
+ const builtinPromptCmd = coderCommands ? getPromptCommand(parsed.name) : undefined;
442
+ const customCmds = coderCommands ? await loadCustomCommands(this.cwd) : [];
426
443
  const customPromptCmd = !builtinPromptCmd
427
444
  ? customCmds.find((c) => c.name === parsed.name)
428
445
  : undefined;
@@ -641,6 +658,8 @@ export class AgentSession {
641
658
  return { role: "user", content: parts };
642
659
  });
643
660
  }
661
+ if (this.opts.selfCorrectionHooks === false)
662
+ return null;
644
663
  if (!this.settingsManager.get("idealReviewEnabled"))
645
664
  return null;
646
665
  if (!this.loopBreakInjected) {
@@ -668,6 +687,8 @@ export class AgentSession {
668
687
  * otherwise finish and the change set is substantial enough to warrant it.
669
688
  */
670
689
  getHookFollowUpMessages() {
690
+ if (this.opts.selfCorrectionHooks === false)
691
+ return null;
671
692
  if (!this.settingsManager.get("idealReviewEnabled"))
672
693
  return null;
673
694
  if (this.idealReviewInjected)
@@ -684,6 +705,7 @@ export class AgentSession {
684
705
  }
685
706
  /** Auto-compact if needed, run agent loop with auth retry, and persist messages. */
686
707
  async runLoop() {
708
+ this.refreshSystemPromptTail();
687
709
  // One-shot cache-key marker per session so turn_end cacheRead numbers
688
710
  // in the log can be traced back to a specific routing namespace —
689
711
  // particularly useful when sub-agents inherit `parentKey:subagent`.
@@ -842,6 +864,10 @@ export class AgentSession {
842
864
  if (provider)
843
865
  this.provider = provider;
844
866
  this.model = model;
867
+ // Keep host-provided option closures (notably chat delegation) aligned with
868
+ // the live selection after an in-session model switch.
869
+ this.opts.provider = this.provider;
870
+ this.opts.model = this.model;
845
871
  this.syncUltraOrchestrationPrompt();
846
872
  setEstimatorModel(model);
847
873
  // maxTokens must follow the active model — it was frozen at the boot
@@ -986,7 +1012,8 @@ export class AgentSession {
986
1012
  this.appMarkers = [];
987
1013
  const basePrompt = this.customSystemPrompt ??
988
1014
  (await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider));
989
- this.messages = [{ role: "system", content: basePrompt }];
1015
+ this.baseSystemPrompt = basePrompt;
1016
+ this.messages = [{ role: "system", content: this.withSystemPromptTail(basePrompt) }];
990
1017
  this.syncUltraOrchestrationPrompt();
991
1018
  // Fresh conversation — new entries must not chain onto the old DAG's leaf.
992
1019
  this.currentLeafId = null;
@@ -1102,6 +1129,22 @@ export class AgentSession {
1102
1129
  return `No background process with id "${id}"`;
1103
1130
  return this.processManager.stop(id);
1104
1131
  }
1132
+ /** Replace a host-owned system prompt in place without resetting conversation history. */
1133
+ setCustomSystemPrompt(systemPrompt, promptCacheKeyPrefix) {
1134
+ this.customSystemPrompt = systemPrompt;
1135
+ this.baseSystemPrompt = systemPrompt;
1136
+ this.opts.systemPrompt = systemPrompt;
1137
+ if (promptCacheKeyPrefix)
1138
+ this.opts.promptCacheKeyPrefix = promptCacheKeyPrefix;
1139
+ const content = this.withSystemPromptTail(systemPrompt);
1140
+ if (this.messages[0]?.role === "system") {
1141
+ this.messages[0] = { role: "system", content };
1142
+ }
1143
+ else {
1144
+ this.messages.unshift({ role: "system", content });
1145
+ }
1146
+ this.syncUltraOrchestrationPrompt();
1147
+ }
1105
1148
  /**
1106
1149
  * Toggle plan mode: flips the shared ref (so tools enforce read-only
1107
1150
  * restrictions) and rebuilds the system prompt in place so the model is told
@@ -1131,14 +1174,32 @@ export class AgentSession {
1131
1174
  if (this.customSystemPrompt)
1132
1175
  return;
1133
1176
  const rebuilt = await buildSystemPrompt(this.cwd, this.skills, this.planModeRef.current, this.approvedPlanPath, this.tools.map((tool) => tool.name), undefined, this.provider);
1177
+ this.baseSystemPrompt = rebuilt;
1178
+ const content = this.withSystemPromptTail(rebuilt);
1134
1179
  if (this.messages[0]?.role === "system") {
1135
- this.messages[0] = { role: "system", content: rebuilt };
1180
+ this.messages[0] = { role: "system", content };
1136
1181
  }
1137
1182
  else {
1138
- this.messages.unshift({ role: "system", content: rebuilt });
1183
+ this.messages.unshift({ role: "system", content });
1139
1184
  }
1140
1185
  this.syncUltraOrchestrationPrompt();
1141
1186
  }
1187
+ withSystemPromptTail(basePrompt) {
1188
+ if (!this.opts.getSystemPromptTail)
1189
+ return basePrompt;
1190
+ return `${basePrompt}\n\n<!-- uncached -->\n${this.opts.getSystemPromptTail()}`;
1191
+ }
1192
+ refreshSystemPromptTail() {
1193
+ if (!this.opts.getSystemPromptTail)
1194
+ return;
1195
+ const content = this.withSystemPromptTail(this.baseSystemPrompt);
1196
+ if (this.messages[0]?.role === "system") {
1197
+ this.messages[0] = { role: "system", content };
1198
+ }
1199
+ else {
1200
+ this.messages.unshift({ role: "system", content });
1201
+ }
1202
+ }
1142
1203
  getMessages() {
1143
1204
  return this.messages;
1144
1205
  }
@@ -1375,6 +1436,8 @@ export class AgentSession {
1375
1436
  }
1376
1437
  /** Sol/Terra Ultra delegates proactively; lower levels require an explicit request. */
1377
1438
  syncUltraOrchestrationPrompt() {
1439
+ if (this.opts.orchestrationPrompt === false)
1440
+ return;
1378
1441
  const systemMessage = this.messages[0];
1379
1442
  if (systemMessage?.role !== "system" || typeof systemMessage.content !== "string")
1380
1443
  return;