@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.
- package/dist/app-sidecar.js +158 -48
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/general.d.ts +7 -0
- package/dist/chat-agents/general.d.ts.map +1 -0
- package/dist/chat-agents/general.js +16 -0
- package/dist/chat-agents/general.js.map +1 -0
- package/dist/chat-agents/general.test.d.ts +2 -0
- package/dist/chat-agents/general.test.d.ts.map +1 -0
- package/dist/chat-agents/general.test.js +47 -0
- package/dist/chat-agents/general.test.js.map +1 -0
- package/dist/chat-agents/index.d.ts +11 -0
- package/dist/chat-agents/index.d.ts.map +1 -0
- package/dist/chat-agents/index.js +89 -0
- package/dist/chat-agents/index.js.map +1 -0
- package/dist/chat-agents/memory.d.ts +53 -0
- package/dist/chat-agents/memory.d.ts.map +1 -0
- package/dist/chat-agents/memory.js +362 -0
- package/dist/chat-agents/memory.js.map +1 -0
- package/dist/chat-agents/memory.test.d.ts +2 -0
- package/dist/chat-agents/memory.test.d.ts.map +1 -0
- package/dist/chat-agents/memory.test.js +155 -0
- package/dist/chat-agents/memory.test.js.map +1 -0
- package/dist/chat-agents/research.d.ts +7 -0
- package/dist/chat-agents/research.d.ts.map +1 -0
- package/dist/chat-agents/research.js +18 -0
- package/dist/chat-agents/research.js.map +1 -0
- package/dist/chat-agents/shared.d.ts +11 -0
- package/dist/chat-agents/shared.d.ts.map +1 -0
- package/dist/chat-agents/shared.js +48 -0
- package/dist/chat-agents/shared.js.map +1 -0
- package/dist/chat-agents/specialists.test.d.ts +2 -0
- package/dist/chat-agents/specialists.test.d.ts.map +1 -0
- package/dist/chat-agents/specialists.test.js +97 -0
- package/dist/chat-agents/specialists.test.js.map +1 -0
- package/dist/chat-agents/therapist.d.ts +7 -0
- package/dist/chat-agents/therapist.d.ts.map +1 -0
- package/dist/chat-agents/therapist.js +20 -0
- package/dist/chat-agents/therapist.js.map +1 -0
- package/dist/chat-agents/types.d.ts +4 -0
- package/dist/chat-agents/types.d.ts.map +1 -0
- package/dist/chat-agents/types.js +7 -0
- package/dist/chat-agents/types.js.map +1 -0
- package/dist/core/agent-session-memory-tail.test.d.ts +2 -0
- package/dist/core/agent-session-memory-tail.test.d.ts.map +1 -0
- package/dist/core/agent-session-memory-tail.test.js +122 -0
- package/dist/core/agent-session-memory-tail.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +25 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +128 -65
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +1 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +4 -2
- package/dist/core/agents.js.map +1 -1
- package/dist/core/progress/rebuild.d.ts +3 -3
- package/dist/core/progress/rebuild.d.ts.map +1 -1
- package/dist/core/progress/rebuild.js +33 -27
- package/dist/core/progress/rebuild.js.map +1 -1
- package/dist/core/progress/rebuild.test.js +15 -0
- package/dist/core/progress/rebuild.test.js.map +1 -1
- package/dist/core/project-discovery.d.ts +1 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +1 -2
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +14 -1
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-manager.test.js +18 -0
- package/dist/core/session-manager.test.js.map +1 -1
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +4 -0
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +5 -1
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/tools/generate-image.d.ts.map +1 -1
- package/dist/tools/generate-image.js +10 -3
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/generate-image.test.js +17 -0
- package/dist/tools/generate-image.test.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +1 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +112 -35
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +146 -1
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +10 -0
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +236 -28
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/web-search.test.js +77 -6
- package/dist/tools/web-search.test.js.map +1 -1
- 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":"
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
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.
|
|
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
|
-
//
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
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
|
-
|
|
421
|
-
const
|
|
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
|
-
//
|
|
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.
|
|
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
|
|
1180
|
+
this.messages[0] = { role: "system", content };
|
|
1136
1181
|
}
|
|
1137
1182
|
else {
|
|
1138
|
-
this.messages.unshift({ role: "system", content
|
|
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;
|