praxis-agent 0.13.0 → 0.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/README.md +9 -5
- package/dist/application/session-service.d.ts +12 -0
- package/dist/application/session-service.js +118 -38
- package/dist/application/subagent-service.d.ts +7 -1
- package/dist/application/subagent-service.js +238 -53
- package/dist/cli/interactive.d.ts +1 -0
- package/dist/cli/interactive.js +23 -2
- package/dist/cli/tui/slash-commands.d.ts +1 -0
- package/dist/cli/tui/slash-commands.js +5 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +40 -8
- package/dist/extensions/claude-extensions.d.ts +23 -1
- package/dist/extensions/claude-extensions.js +150 -2
- package/dist/extensions/claude-init-command.d.ts +4 -0
- package/dist/extensions/claude-init-command.js +72 -0
- package/dist/hooks/claude-hooks.d.ts +3 -1
- package/dist/hooks/claude-hooks.js +14 -0
- package/dist/mcp/claude-mcp-tools.d.ts +18 -0
- package/dist/mcp/claude-mcp-tools.js +46 -0
- package/dist/tools/claude-interactive-tools.d.ts +1 -0
- package/dist/tools/claude-interactive-tools.js +3 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -94,8 +94,9 @@ troubleshooting. Run `praxis --help` for the authoritative command surface.
|
|
|
94
94
|
`/background` terminal handoff, unified `/status`/`/config`/`/usage` settings
|
|
95
95
|
tabs, `/sandbox` mode/dependency/override/config controls, local cached
|
|
96
96
|
`/release-notes`, Claude-compatible `/statusline` command execution and setup
|
|
97
|
-
agent,
|
|
98
|
-
|
|
97
|
+
agent, source-aligned `/init` project-instruction onboarding with its enhanced
|
|
98
|
+
skills/hooks flow, `/mcp`, `/memory` shared instruction and auto-memory
|
|
99
|
+
access, and live extension-reload controls,
|
|
99
100
|
cursor/history composer, per-session model/effort/permission controls,
|
|
100
101
|
context/status/skill/task dashboards, prompt stash and continuation shortcuts,
|
|
101
102
|
filterable `@` file and agent references, composer undo, `Ctrl+G` external
|
|
@@ -136,7 +137,9 @@ troubleshooting. Run `praxis --help` for the authoritative command surface.
|
|
|
136
137
|
workspace-directory add/remove controls, path confinement, credential
|
|
137
138
|
redaction, and sanitized child processes.
|
|
138
139
|
- **Durable local work** — resumable sessions, full-history forks, file
|
|
139
|
-
checkpoints, tasks, foreground/background subagents,
|
|
140
|
+
checkpoints, tasks, foreground/background subagents, top-level agents, and
|
|
141
|
+
Claude-compatible main-thread agent definitions with native prompt, model,
|
|
142
|
+
tool, memory, first-turn, and resume behavior.
|
|
140
143
|
- **Claude-compatible ecosystem** — shared instructions with recursive `@`
|
|
141
144
|
imports, memory, skills, commands, agents, hooks, settings, MCP servers,
|
|
142
145
|
plugins, and transcript data.
|
|
@@ -184,8 +187,9 @@ for exact shared data, version boundaries, exclusions, and verification gates.
|
|
|
184
187
|
|
|
185
188
|
Praxis targets one local OS user working across multiple repositories and
|
|
186
189
|
sessions. It is CLI-only and provider-capability-aware. Organization, tenant,
|
|
187
|
-
RBAC, billing, enterprise gateway,
|
|
188
|
-
|
|
190
|
+
RBAC, subscription authentication and billing, enterprise gateway,
|
|
191
|
+
IDE/Desktop/mobile clients, Remote Control, Claude Desktop import, and hosted
|
|
192
|
+
review-product surfaces are permanent non-goals.
|
|
189
193
|
|
|
190
194
|
## Security and support
|
|
191
195
|
|
|
@@ -24,6 +24,7 @@ export interface ClaudeSessionServiceOptions {
|
|
|
24
24
|
tools?: ToolRegistry;
|
|
25
25
|
permissions?: PermissionResolver;
|
|
26
26
|
permissionResolverForMode?: (mode: AgentPermissionMode) => PermissionResolver;
|
|
27
|
+
permissionMode?: ClaudePermissionMode;
|
|
27
28
|
persistPermissionUpdates?: (updates: readonly PermissionUpdate[]) => void | Promise<void>;
|
|
28
29
|
approveTool?: (call: ModelToolCall, originalCall?: ModelToolCall, decision?: PermissionDecision) => PermissionApproval | Promise<PermissionApproval>;
|
|
29
30
|
approveRecovery?: (call: ModelToolCall) => boolean | Promise<boolean>;
|
|
@@ -43,6 +44,11 @@ export interface ClaudeSessionServiceOptions {
|
|
|
43
44
|
enableDynamicWakeups?: boolean;
|
|
44
45
|
enableWorkflows?: boolean;
|
|
45
46
|
providerForModel?: (model: string) => ModelProvider;
|
|
47
|
+
providerForMainModel?: (model: string) => ModelProvider;
|
|
48
|
+
explicitModel?: boolean;
|
|
49
|
+
explicitSystemPrompt?: boolean;
|
|
50
|
+
agentInitialPromptHandledExternally?: boolean;
|
|
51
|
+
agentSystemPromptOverridesExplicit?: boolean;
|
|
46
52
|
effort?: string;
|
|
47
53
|
maxModelTurns?: number;
|
|
48
54
|
betas?: readonly string[];
|
|
@@ -149,6 +155,7 @@ export declare class ClaudeSessionService {
|
|
|
149
155
|
private readonly hostedSubagentsByRegistry;
|
|
150
156
|
private readonly backgroundNotificationWrites;
|
|
151
157
|
private readonly downloadedFileResourceSessions;
|
|
158
|
+
private activeProvider;
|
|
152
159
|
private mcpClosePromise;
|
|
153
160
|
private runtimeCwd;
|
|
154
161
|
constructor(options: ClaudeSessionServiceOptions);
|
|
@@ -221,6 +228,11 @@ export declare class ClaudeSessionService {
|
|
|
221
228
|
private assertWritable;
|
|
222
229
|
private sessionStatus;
|
|
223
230
|
private provider;
|
|
231
|
+
model(): string | undefined;
|
|
232
|
+
private providerForAgent;
|
|
233
|
+
private resolveAgent;
|
|
234
|
+
private mainAgentSystemPrompt;
|
|
235
|
+
private assembledSystemMessages;
|
|
224
236
|
private contextBudget;
|
|
225
237
|
private append;
|
|
226
238
|
private logicalTailUuid;
|
|
@@ -22,7 +22,7 @@ import { ClaudeHookToolCoordinator } from '../hooks/claude-hook-tools.js';
|
|
|
22
22
|
import { ClaudeTranscriptStore, } from '../persistence/claude-transcript-store.js';
|
|
23
23
|
import { InMemoryTranscriptStore } from '../persistence/in-memory-transcript-store.js';
|
|
24
24
|
import { ModelCompactor } from './model-compactor.js';
|
|
25
|
-
import { ClaudeSubagentExecutor, StructuredOutputRegistry, } from './subagent-service.js';
|
|
25
|
+
import { agentMemoryPrompt, ClaudeSubagentExecutor, StructuredOutputRegistry, } from './subagent-service.js';
|
|
26
26
|
import { ScheduledPromptManager } from './scheduled-prompt-manager.js';
|
|
27
27
|
import { ClaudeScheduledToolRegistry } from '../tools/claude-scheduled-tools.js';
|
|
28
28
|
import { ClaudeTaskToolRegistry } from '../tools/claude-task-tools.js';
|
|
@@ -30,8 +30,29 @@ import { ClaudeWorkflowToolRegistry } from '../tools/claude-workflow-tools.js';
|
|
|
30
30
|
import { WorkflowManager, } from './workflow-manager.js';
|
|
31
31
|
import { SessionWorktreeManager } from './session-worktree.js';
|
|
32
32
|
import { ClaudeWorktreeToolRegistry } from '../tools/claude-worktree-tools.js';
|
|
33
|
+
import { FilteredToolRegistry } from '../tools/filtered-tool-registry.js';
|
|
33
34
|
import { generateToolUseSummary } from './tool-use-summary.js';
|
|
34
35
|
import { ClaudeUserMessageToolRegistry, CLAUDE_USER_MESSAGE_PROMPT, } from '../tools/claude-user-message.js';
|
|
36
|
+
function agentPermissionMode(mode) {
|
|
37
|
+
return mode === undefined || mode === 'manual' ? 'default' : mode;
|
|
38
|
+
}
|
|
39
|
+
function agentToolName(rule) {
|
|
40
|
+
const opening = rule.indexOf('(');
|
|
41
|
+
return (opening < 0 ? rule : rule.slice(0, opening)).trim();
|
|
42
|
+
}
|
|
43
|
+
function mainAgentToolNames(tools, agent) {
|
|
44
|
+
const requested = agent.tools ? new Set(agent.tools.map(agentToolName)) : null;
|
|
45
|
+
if (requested && agent.memory) {
|
|
46
|
+
requested.add('Read');
|
|
47
|
+
requested.add('Edit');
|
|
48
|
+
requested.add('Write');
|
|
49
|
+
}
|
|
50
|
+
const disallowed = new Set(agent.disallowedTools?.map(agentToolName) ?? []);
|
|
51
|
+
return tools
|
|
52
|
+
.definitions()
|
|
53
|
+
.map(({ name }) => name)
|
|
54
|
+
.filter((name) => (!requested || requested.has(name)) && !disallowed.has(name));
|
|
55
|
+
}
|
|
35
56
|
const emptyToolRegistry = {
|
|
36
57
|
definitions: () => [],
|
|
37
58
|
prepare: async (call) => call,
|
|
@@ -97,6 +118,7 @@ export class ClaudeSessionService {
|
|
|
97
118
|
hostedSubagentsByRegistry = new WeakMap();
|
|
98
119
|
backgroundNotificationWrites = new Map();
|
|
99
120
|
downloadedFileResourceSessions = new Set();
|
|
121
|
+
activeProvider;
|
|
100
122
|
mcpClosePromise;
|
|
101
123
|
runtimeCwd;
|
|
102
124
|
constructor(options) {
|
|
@@ -127,6 +149,12 @@ export class ClaudeSessionService {
|
|
|
127
149
|
: {}),
|
|
128
150
|
})
|
|
129
151
|
: null;
|
|
152
|
+
const configuredAgent = options.agent
|
|
153
|
+
? (options.extensions?.agent(options.agent) ?? null)
|
|
154
|
+
: null;
|
|
155
|
+
if (configuredAgent && options.provider) {
|
|
156
|
+
this.activeProvider = this.providerForAgent(configuredAgent);
|
|
157
|
+
}
|
|
130
158
|
}
|
|
131
159
|
nextScheduledPrompt(signal) {
|
|
132
160
|
return this.scheduledPrompts?.next(signal) ?? Promise.resolve(null);
|
|
@@ -240,12 +268,15 @@ export class ClaudeSessionService {
|
|
|
240
268
|
permissionResolverForMode: this.options.permissionResolverForMode,
|
|
241
269
|
}
|
|
242
270
|
: {}),
|
|
271
|
+
parentPermissionMode: () => agentPermissionMode(this.options.interactiveTools?.mode(sessionId) ??
|
|
272
|
+
this.options.permissionMode),
|
|
243
273
|
...(this.options.subagentToolNames
|
|
244
274
|
? { toolNames: this.options.subagentToolNames }
|
|
245
275
|
: {}),
|
|
246
276
|
...(this.options.extensions
|
|
247
277
|
? { extensions: this.options.extensions }
|
|
248
278
|
: {}),
|
|
279
|
+
...(this.options.mcp ? { mcp: this.options.mcp } : {}),
|
|
249
280
|
...(this.options.hooks ? { hooks: this.options.hooks } : {}),
|
|
250
281
|
...(this.options.contextAssembler
|
|
251
282
|
? { contextAssembler: this.options.contextAssembler }
|
|
@@ -501,7 +532,6 @@ export class ClaudeSessionService {
|
|
|
501
532
|
return { agentId, name };
|
|
502
533
|
}
|
|
503
534
|
async promptSuggestion(sessionId, signal) {
|
|
504
|
-
const provider = this.provider();
|
|
505
535
|
const loaded = this.options.sessionPersistence === false
|
|
506
536
|
? await this.turnStore(sessionId).withLease((lease) => lease.load())
|
|
507
537
|
: {
|
|
@@ -513,20 +543,19 @@ export class ClaudeSessionService {
|
|
|
513
543
|
const entries = loaded.value;
|
|
514
544
|
this.restoreWorktree(entries.entries);
|
|
515
545
|
const agentName = this.options.agent ?? getClaudeAgentSetting(entries.entries);
|
|
516
|
-
const agent =
|
|
546
|
+
const agent = this.resolveAgent(agentName);
|
|
547
|
+
const provider = this.providerForAgent(agent);
|
|
548
|
+
this.activeProvider = provider;
|
|
517
549
|
const assembledContext = await this.options.contextAssembler?.assemble({
|
|
518
550
|
cwd: this.activeCwd(),
|
|
519
551
|
});
|
|
552
|
+
const agentSystem = await this.mainAgentSystemPrompt(agent);
|
|
553
|
+
const assembledSystemMessages = this.assembledSystemMessages(agent, assembledContext?.systemMessages ?? []);
|
|
520
554
|
const contextMessages = [
|
|
521
|
-
...(
|
|
522
|
-
|
|
523
|
-
? [
|
|
524
|
-
{
|
|
525
|
-
role: 'system',
|
|
526
|
-
content: `# Agent definition: ${agent.name}\n\n${agent.body}`,
|
|
527
|
-
},
|
|
528
|
-
]
|
|
555
|
+
...(agentSystem
|
|
556
|
+
? [{ role: 'system', content: agentSystem }]
|
|
529
557
|
: []),
|
|
558
|
+
...assembledSystemMessages,
|
|
530
559
|
];
|
|
531
560
|
const messages = [
|
|
532
561
|
...contextMessages,
|
|
@@ -535,11 +564,16 @@ export class ClaudeSessionService {
|
|
|
535
564
|
{ role: 'user', content: PROMPT_SUGGESTION_INSTRUCTION },
|
|
536
565
|
], assembledContext?.firstUserMessageContext),
|
|
537
566
|
];
|
|
567
|
+
const suggestionTools = agent && this.options.tools
|
|
568
|
+
? new FilteredToolRegistry(this.options.tools, {
|
|
569
|
+
tools: mainAgentToolNames(this.options.tools, agent),
|
|
570
|
+
})
|
|
571
|
+
: this.options.tools;
|
|
538
572
|
let suggestion = '';
|
|
539
573
|
for await (const event of provider.complete({
|
|
540
574
|
messages,
|
|
541
575
|
...(provider.capabilities.tools
|
|
542
|
-
? { tools:
|
|
576
|
+
? { tools: suggestionTools?.definitions() ?? [] }
|
|
543
577
|
: {}),
|
|
544
578
|
...(this.options.effort ? { effort: this.options.effort } : {}),
|
|
545
579
|
...(signal ? { signal } : {}),
|
|
@@ -1332,7 +1366,17 @@ export class ClaudeSessionService {
|
|
|
1332
1366
|
tail: appendResult.tail,
|
|
1333
1367
|
};
|
|
1334
1368
|
}
|
|
1335
|
-
const
|
|
1369
|
+
const agentName = this.options.agent ?? getClaudeAgentSetting(snapshot.entries);
|
|
1370
|
+
const agent = this.resolveAgent(agentName);
|
|
1371
|
+
const provider = this.providerForAgent(agent);
|
|
1372
|
+
this.activeProvider = provider;
|
|
1373
|
+
const effectivePrompt = !requireExisting &&
|
|
1374
|
+
!skipUserPrompt &&
|
|
1375
|
+
!this.options.agentInitialPromptHandledExternally &&
|
|
1376
|
+
shellCommand === undefined &&
|
|
1377
|
+
agent?.initialPrompt
|
|
1378
|
+
? `${agent.initialPrompt}\n\n${prompt}`
|
|
1379
|
+
: prompt;
|
|
1336
1380
|
const initialPricing = this.options.pricing?.resolve(provider.model ?? 'praxis/provider');
|
|
1337
1381
|
if (this.options.maxBudgetUsd !== undefined && !initialPricing) {
|
|
1338
1382
|
throw new Error(`Cannot enforce --max-budget-usd: no pricing is configured for model ${provider.model ?? 'praxis/provider'}`);
|
|
@@ -1450,12 +1494,15 @@ export class ClaudeSessionService {
|
|
|
1450
1494
|
permissionResolverForMode: this.options.permissionResolverForMode,
|
|
1451
1495
|
}
|
|
1452
1496
|
: {}),
|
|
1497
|
+
parentPermissionMode: () => agentPermissionMode(this.options.interactiveTools?.mode(sessionId) ??
|
|
1498
|
+
this.options.permissionMode),
|
|
1453
1499
|
...(this.options.subagentToolNames
|
|
1454
1500
|
? { toolNames: this.options.subagentToolNames }
|
|
1455
1501
|
: {}),
|
|
1456
1502
|
...(this.options.extensions
|
|
1457
1503
|
? { extensions: this.options.extensions }
|
|
1458
1504
|
: {}),
|
|
1505
|
+
...(this.options.mcp ? { mcp: this.options.mcp } : {}),
|
|
1459
1506
|
...(this.options.hooks ? { hooks: this.options.hooks } : {}),
|
|
1460
1507
|
...(this.options.contextAssembler
|
|
1461
1508
|
? { contextAssembler: this.options.contextAssembler }
|
|
@@ -1498,7 +1545,7 @@ export class ClaudeSessionService {
|
|
|
1498
1545
|
promptIdForCall: (callId) => currentPromptId ??
|
|
1499
1546
|
this.promptIdForToolCall(snapshot.entries, callId),
|
|
1500
1547
|
defaultModel: provider.model ?? 'praxis/provider',
|
|
1501
|
-
tokenBudget: workflowTokenTarget(
|
|
1548
|
+
tokenBudget: workflowTokenTarget(effectivePrompt),
|
|
1502
1549
|
enabled: true,
|
|
1503
1550
|
})
|
|
1504
1551
|
: agentTools;
|
|
@@ -1575,9 +1622,14 @@ export class ClaudeSessionService {
|
|
|
1575
1622
|
const structuredCapture = this.options.structuredOutputSchema
|
|
1576
1623
|
? { calls: 0, value: undefined }
|
|
1577
1624
|
: undefined;
|
|
1578
|
-
const
|
|
1579
|
-
? new
|
|
1625
|
+
const agentScopedTools = agent && fileHistoryTools
|
|
1626
|
+
? new FilteredToolRegistry(fileHistoryTools, {
|
|
1627
|
+
tools: mainAgentToolNames(fileHistoryTools, agent),
|
|
1628
|
+
})
|
|
1580
1629
|
: fileHistoryTools;
|
|
1630
|
+
const structuredTools = this.options.structuredOutputSchema && structuredCapture
|
|
1631
|
+
? new StructuredOutputRegistry(agentScopedTools ?? this.options.tools ?? emptyToolRegistry, this.options.structuredOutputSchema, structuredCapture)
|
|
1632
|
+
: agentScopedTools;
|
|
1581
1633
|
const hookTools = this.options.hooks && structuredTools && turnPermissions
|
|
1582
1634
|
? new ClaudeHookToolCoordinator({
|
|
1583
1635
|
tools: structuredTools,
|
|
@@ -1768,14 +1820,8 @@ export class ClaudeSessionService {
|
|
|
1768
1820
|
inputTokens: usage.inputTokens + (result.usage?.inputTokens ?? 0),
|
|
1769
1821
|
outputTokens: usage.outputTokens + (result.usage?.outputTokens ?? 0),
|
|
1770
1822
|
}), { inputTokens: 0, outputTokens: 0 });
|
|
1771
|
-
const agentName = this.options.agent ?? getClaudeAgentSetting(snapshot.entries);
|
|
1772
|
-
const agent = agentName
|
|
1773
|
-
? this.options.extensions?.agent(agentName)
|
|
1774
|
-
: null;
|
|
1775
|
-
if (agentName && !agent) {
|
|
1776
|
-
throw new Error(`Unknown Claude agent ${agentName}`);
|
|
1777
|
-
}
|
|
1778
1823
|
if (this.options.agent &&
|
|
1824
|
+
agent &&
|
|
1779
1825
|
getClaudeAgentSetting(snapshot.entries) !== this.options.agent) {
|
|
1780
1826
|
const agentSetting = createClaudeAgentSettingEntry(sessionId, this.options.agent);
|
|
1781
1827
|
const settingTail = await this.append(lease, snapshot.tail, agentSetting);
|
|
@@ -1787,9 +1833,14 @@ export class ClaudeSessionService {
|
|
|
1787
1833
|
const assembledContext = await this.options.contextAssembler?.assemble({
|
|
1788
1834
|
cwd: this.activeCwd(),
|
|
1789
1835
|
});
|
|
1836
|
+
const agentSystem = await this.mainAgentSystemPrompt(agent);
|
|
1837
|
+
const assembledSystemMessages = this.assembledSystemMessages(agent, assembledContext?.systemMessages ?? []);
|
|
1790
1838
|
const planModeMessage = this.options.interactiveTools?.contextMessage(sessionId);
|
|
1791
1839
|
const contextMessages = [
|
|
1792
|
-
...(
|
|
1840
|
+
...(agentSystem
|
|
1841
|
+
? [{ role: 'system', content: agentSystem }]
|
|
1842
|
+
: []),
|
|
1843
|
+
...assembledSystemMessages,
|
|
1793
1844
|
...(planModeMessage
|
|
1794
1845
|
? [{ role: 'system', content: planModeMessage }]
|
|
1795
1846
|
: []),
|
|
@@ -1801,14 +1852,6 @@ export class ClaudeSessionService {
|
|
|
1801
1852
|
},
|
|
1802
1853
|
]
|
|
1803
1854
|
: []),
|
|
1804
|
-
...(agent
|
|
1805
|
-
? [
|
|
1806
|
-
{
|
|
1807
|
-
role: 'system',
|
|
1808
|
-
content: `# Agent definition: ${agent.name}\n\n${agent.body}`,
|
|
1809
|
-
},
|
|
1810
|
-
]
|
|
1811
|
-
: []),
|
|
1812
1855
|
...(this.options.structuredOutputSchema
|
|
1813
1856
|
? [
|
|
1814
1857
|
{
|
|
@@ -1822,8 +1865,8 @@ export class ClaudeSessionService {
|
|
|
1822
1865
|
? { userMessages: [] }
|
|
1823
1866
|
: shellCommand === undefined
|
|
1824
1867
|
? this.options.extensions
|
|
1825
|
-
? await this.options.extensions.expandPromptAsync(
|
|
1826
|
-
: { userMessages: [
|
|
1868
|
+
? await this.options.extensions.expandPromptAsync(effectivePrompt, signal, toolResultDirectory)
|
|
1869
|
+
: { userMessages: [effectivePrompt] }
|
|
1827
1870
|
: {
|
|
1828
1871
|
userMessages: [`<bash-input>${shellCommand}</bash-input>`],
|
|
1829
1872
|
};
|
|
@@ -1864,7 +1907,8 @@ export class ClaudeSessionService {
|
|
|
1864
1907
|
: {}),
|
|
1865
1908
|
}));
|
|
1866
1909
|
const agentMentionMessages = shellCommand === undefined && !skipUserPrompt
|
|
1867
|
-
? (this.options.extensions?.agentMentionMessages(
|
|
1910
|
+
? (this.options.extensions?.agentMentionMessages(effectivePrompt) ??
|
|
1911
|
+
[])
|
|
1868
1912
|
: [];
|
|
1869
1913
|
const injectAgentMentionContext = (messages) => {
|
|
1870
1914
|
if (agentMentionMessages.length === 0)
|
|
@@ -1875,7 +1919,7 @@ export class ClaudeSessionService {
|
|
|
1875
1919
|
const message = messages[index];
|
|
1876
1920
|
if (message?.role === 'user' &&
|
|
1877
1921
|
typeof message.content === 'string' &&
|
|
1878
|
-
message.content.endsWith(
|
|
1922
|
+
message.content.endsWith(effectivePrompt)) {
|
|
1879
1923
|
insertionIndex = index;
|
|
1880
1924
|
foundPrompt = true;
|
|
1881
1925
|
break;
|
|
@@ -2073,7 +2117,7 @@ export class ClaudeSessionService {
|
|
|
2073
2117
|
...hookSession,
|
|
2074
2118
|
hook_event_name: 'UserPromptSubmit',
|
|
2075
2119
|
prompt_id: currentPromptId ?? randomUUID(),
|
|
2076
|
-
prompt,
|
|
2120
|
+
prompt: effectivePrompt,
|
|
2077
2121
|
}, undefined, signal);
|
|
2078
2122
|
await recordHookOutcome(outcome);
|
|
2079
2123
|
if (outcome.blockedReason) {
|
|
@@ -2252,7 +2296,7 @@ export class ClaudeSessionService {
|
|
|
2252
2296
|
if (!skipUserPrompt) {
|
|
2253
2297
|
await this.append(lease, snapshot.tail, createClaudeLastPromptEntry({
|
|
2254
2298
|
sessionId,
|
|
2255
|
-
lastPrompt:
|
|
2299
|
+
lastPrompt: effectivePrompt,
|
|
2256
2300
|
leafUuid: finalLeafUuid,
|
|
2257
2301
|
}));
|
|
2258
2302
|
}
|
|
@@ -2865,6 +2909,42 @@ export class ClaudeSessionService {
|
|
|
2865
2909
|
}
|
|
2866
2910
|
return this.options.provider;
|
|
2867
2911
|
}
|
|
2912
|
+
model() {
|
|
2913
|
+
return this.activeProvider?.model ?? this.options.provider?.model;
|
|
2914
|
+
}
|
|
2915
|
+
providerForAgent(agent) {
|
|
2916
|
+
const inherited = this.provider();
|
|
2917
|
+
const selectProvider = this.options.providerForMainModel ?? this.options.providerForModel;
|
|
2918
|
+
if (this.options.explicitModel ||
|
|
2919
|
+
!agent?.model ||
|
|
2920
|
+
agent.model === 'inherit' ||
|
|
2921
|
+
!selectProvider) {
|
|
2922
|
+
return inherited;
|
|
2923
|
+
}
|
|
2924
|
+
return selectProvider(agent.model);
|
|
2925
|
+
}
|
|
2926
|
+
resolveAgent(name) {
|
|
2927
|
+
if (!name)
|
|
2928
|
+
return null;
|
|
2929
|
+
return this.options.extensions?.agent(name) ?? null;
|
|
2930
|
+
}
|
|
2931
|
+
async mainAgentSystemPrompt(agent) {
|
|
2932
|
+
if (!agent ||
|
|
2933
|
+
(this.options.explicitSystemPrompt &&
|
|
2934
|
+
!this.options.agentSystemPromptOverridesExplicit)) {
|
|
2935
|
+
return null;
|
|
2936
|
+
}
|
|
2937
|
+
const memory = await agentMemoryPrompt(this.options.configRoot, this.activeCwd(), agent);
|
|
2938
|
+
const system = memory ? `${agent.body}\n\n${memory}` : agent.body;
|
|
2939
|
+
return system.trim() ? system : null;
|
|
2940
|
+
}
|
|
2941
|
+
assembledSystemMessages(agent, messages) {
|
|
2942
|
+
return agent &&
|
|
2943
|
+
this.options.explicitSystemPrompt &&
|
|
2944
|
+
this.options.agentSystemPromptOverridesExplicit
|
|
2945
|
+
? messages.slice(1)
|
|
2946
|
+
: messages;
|
|
2947
|
+
}
|
|
2868
2948
|
contextBudget(provider) {
|
|
2869
2949
|
if (this.options.contextBudget)
|
|
2870
2950
|
return this.options.contextBudget;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type ClaudeSidechainPermissionMode } from '../compatibility/claude/sidechain.js';
|
|
2
2
|
import { type ContextAssembler } from '../core/context.js';
|
|
3
3
|
import { type ModelProvider, type ModelToolCall, type ModelToolDefinition, type ModelUsage, type PermissionResolver, type PermissionApproval, type PermissionDecision, type PermissionUpdate, type RuntimeEventSink, type ToolExecutionContext, type ToolExecutionResult, type ToolRegistry } from '../core/runtime.js';
|
|
4
|
-
import { type ClaudeExtensionCatalog } from '../extensions/claude-extensions.js';
|
|
4
|
+
import { type ClaudeAgentRuntimeDefinition, type ClaudeExtensionCatalog } from '../extensions/claude-extensions.js';
|
|
5
5
|
import type { ClaudeHookRunner } from '../hooks/claude-hooks.js';
|
|
6
|
+
import type { ClaudeMcpRuntime } from '../mcp/claude-mcp-tools.js';
|
|
6
7
|
import { type BackgroundAgentSnapshot } from './background-agent-manager.js';
|
|
7
8
|
export interface WorkflowAgentRunOptions {
|
|
8
9
|
sessionId: string;
|
|
@@ -43,6 +44,7 @@ export declare class StructuredOutputRegistry implements ToolRegistry {
|
|
|
43
44
|
prepare(call: ModelToolCall, context: ToolExecutionContext): Promise<ModelToolCall>;
|
|
44
45
|
execute(call: ModelToolCall, context: ToolExecutionContext): Promise<ToolExecutionResult>;
|
|
45
46
|
}
|
|
47
|
+
export declare function agentMemoryPrompt(configRoot: string, cwd: string, definition: ClaudeAgentRuntimeDefinition | null): Promise<string | null>;
|
|
46
48
|
export interface ClaudeSubagentExecutorOptions {
|
|
47
49
|
configRoot: string;
|
|
48
50
|
cwd: string;
|
|
@@ -52,7 +54,9 @@ export interface ClaudeSubagentExecutorOptions {
|
|
|
52
54
|
baseTools: ToolRegistry;
|
|
53
55
|
permissions: PermissionResolver;
|
|
54
56
|
permissionResolverForMode?: (mode: AgentPermissionMode) => PermissionResolver;
|
|
57
|
+
parentPermissionMode?: () => AgentPermissionMode;
|
|
55
58
|
extensions?: ClaudeExtensionCatalog;
|
|
59
|
+
mcp?: ClaudeMcpRuntime;
|
|
56
60
|
hooks?: ClaudeHookRunner;
|
|
57
61
|
contextAssembler?: ContextAssembler;
|
|
58
62
|
contextReserveTokens?: number;
|
|
@@ -80,6 +84,8 @@ export declare class ClaudeSubagentExecutor {
|
|
|
80
84
|
backgroundSnapshots(): readonly BackgroundAgentSnapshot[];
|
|
81
85
|
stopBackgroundTask(taskId: string): string;
|
|
82
86
|
private cwd;
|
|
87
|
+
private agentDefinition;
|
|
88
|
+
private resolveAgentInput;
|
|
83
89
|
registry(sessionId: string, depth: number, promptIdForCall: (callId: string) => string | null): ToolRegistry;
|
|
84
90
|
definitions(): ModelToolDefinition;
|
|
85
91
|
managementDefinitions(): readonly ModelToolDefinition[];
|