specrails-core 5.3.0 → 5.5.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 +2 -0
- package/dist/agent-runtime/capabilities.d.ts +28 -0
- package/dist/agent-runtime/capabilities.js +81 -0
- package/dist/agent-runtime/capabilities.js.map +1 -0
- package/dist/agent-runtime/cli-executor.d.ts +9 -0
- package/dist/agent-runtime/cli-executor.js +109 -34
- package/dist/agent-runtime/cli-executor.js.map +1 -1
- package/dist/agent-runtime/cli-process.d.ts +1 -0
- package/dist/agent-runtime/cli-process.js +13 -2
- package/dist/agent-runtime/cli-process.js.map +1 -1
- package/dist/agent-runtime/cli.d.ts +1 -0
- package/dist/agent-runtime/cli.js +60 -11
- package/dist/agent-runtime/cli.js.map +1 -1
- package/dist/agent-runtime/codex-schema.d.ts +4 -0
- package/dist/agent-runtime/codex-schema.js +31 -0
- package/dist/agent-runtime/codex-schema.js.map +1 -0
- package/dist/agent-runtime/compact/architect.d.ts +349 -0
- package/dist/agent-runtime/compact/architect.js +371 -0
- package/dist/agent-runtime/compact/architect.js.map +1 -0
- package/dist/agent-runtime/compact/chat-client.d.ts +83 -0
- package/dist/agent-runtime/compact/chat-client.js +307 -0
- package/dist/agent-runtime/compact/chat-client.js.map +1 -0
- package/dist/agent-runtime/compact/developer.d.ts +160 -0
- package/dist/agent-runtime/compact/developer.js +823 -0
- package/dist/agent-runtime/compact/developer.js.map +1 -0
- package/dist/agent-runtime/compact/environment.d.ts +62 -0
- package/dist/agent-runtime/compact/environment.js +213 -0
- package/dist/agent-runtime/compact/environment.js.map +1 -0
- package/dist/agent-runtime/compact/exit-code-honesty.d.ts +8 -0
- package/dist/agent-runtime/compact/exit-code-honesty.js +28 -0
- package/dist/agent-runtime/compact/exit-code-honesty.js.map +1 -0
- package/dist/agent-runtime/compact/guarded-loop.d.ts +73 -0
- package/dist/agent-runtime/compact/guarded-loop.js +320 -0
- package/dist/agent-runtime/compact/guarded-loop.js.map +1 -0
- package/dist/agent-runtime/compact/prompt-inputs.d.ts +42 -0
- package/dist/agent-runtime/compact/prompt-inputs.js +59 -0
- package/dist/agent-runtime/compact/prompt-inputs.js.map +1 -0
- package/dist/agent-runtime/compact/reviewer.d.ts +24 -0
- package/dist/agent-runtime/compact/reviewer.js +178 -0
- package/dist/agent-runtime/compact/reviewer.js.map +1 -0
- package/dist/agent-runtime/compact/step.d.ts +70 -0
- package/dist/agent-runtime/compact/step.js +136 -0
- package/dist/agent-runtime/compact/step.js.map +1 -0
- package/dist/agent-runtime/compact/test-reachability.d.ts +30 -0
- package/dist/agent-runtime/compact/test-reachability.js +147 -0
- package/dist/agent-runtime/compact/test-reachability.js.map +1 -0
- package/dist/agent-runtime/config.d.ts +4 -0
- package/dist/agent-runtime/config.js +146 -15
- package/dist/agent-runtime/config.js.map +1 -1
- package/dist/agent-runtime/core-host.d.ts +12 -4
- package/dist/agent-runtime/core-host.js +61 -21
- package/dist/agent-runtime/core-host.js.map +1 -1
- package/dist/agent-runtime/efficiency-summary.d.ts +67 -0
- package/dist/agent-runtime/efficiency-summary.js +52 -0
- package/dist/agent-runtime/efficiency-summary.js.map +1 -0
- package/dist/agent-runtime/efficiency-types.d.ts +60 -0
- package/dist/agent-runtime/efficiency-types.js +8 -0
- package/dist/agent-runtime/efficiency-types.js.map +1 -0
- package/dist/agent-runtime/efficiency.d.ts +5 -0
- package/dist/agent-runtime/efficiency.js +35 -0
- package/dist/agent-runtime/efficiency.js.map +1 -0
- package/dist/agent-runtime/evaluation-corpus.d.ts +13 -0
- package/dist/agent-runtime/evaluation-corpus.js +8 -0
- package/dist/agent-runtime/evaluation-corpus.js.map +1 -0
- package/dist/agent-runtime/evaluation.d.ts +43 -0
- package/dist/agent-runtime/evaluation.js +171 -0
- package/dist/agent-runtime/evaluation.js.map +1 -0
- package/dist/agent-runtime/executor-types.d.ts +71 -4
- package/dist/agent-runtime/executor-types.js +7 -2
- package/dist/agent-runtime/executor-types.js.map +1 -1
- package/dist/agent-runtime/executors.d.ts +1 -0
- package/dist/agent-runtime/executors.js +4 -0
- package/dist/agent-runtime/executors.js.map +1 -1
- package/dist/agent-runtime/graph/artifacts.d.ts +8 -22
- package/dist/agent-runtime/graph/artifacts.js +99 -73
- package/dist/agent-runtime/graph/artifacts.js.map +1 -1
- package/dist/agent-runtime/graph/nodes.d.ts +7 -2
- package/dist/agent-runtime/graph/nodes.js +207 -53
- package/dist/agent-runtime/graph/nodes.js.map +1 -1
- package/dist/agent-runtime/graph/roles.d.ts +11 -3
- package/dist/agent-runtime/graph/roles.js +109 -37
- package/dist/agent-runtime/graph/roles.js.map +1 -1
- package/dist/agent-runtime/graph/state.d.ts +10 -1
- package/dist/agent-runtime/graph/state.js +2 -1
- package/dist/agent-runtime/graph/state.js.map +1 -1
- package/dist/agent-runtime/guardrails.d.ts +15 -0
- package/dist/agent-runtime/guardrails.js +76 -0
- package/dist/agent-runtime/guardrails.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +7 -1
- package/dist/agent-runtime/index.js +7 -1
- package/dist/agent-runtime/index.js.map +1 -1
- package/dist/agent-runtime/kimi-acp.d.ts +4 -0
- package/dist/agent-runtime/kimi-acp.js +20 -9
- package/dist/agent-runtime/kimi-acp.js.map +1 -1
- package/dist/agent-runtime/openai-executor.d.ts +33 -1
- package/dist/agent-runtime/openai-executor.js +76 -113
- package/dist/agent-runtime/openai-executor.js.map +1 -1
- package/dist/agent-runtime/openspec-tool-server.d.ts +1 -0
- package/dist/agent-runtime/openspec-tool-server.js +37 -0
- package/dist/agent-runtime/openspec-tool-server.js.map +1 -0
- package/dist/agent-runtime/openspec.d.ts +198 -0
- package/dist/agent-runtime/openspec.js +329 -0
- package/dist/agent-runtime/openspec.js.map +1 -0
- package/dist/agent-runtime/prompts.d.ts +24 -1
- package/dist/agent-runtime/prompts.js +112 -43
- package/dist/agent-runtime/prompts.js.map +1 -1
- package/dist/agent-runtime/provider-diagnostic.d.ts +2 -0
- package/dist/agent-runtime/provider-diagnostic.js +25 -0
- package/dist/agent-runtime/provider-diagnostic.js.map +1 -0
- package/dist/agent-runtime/repository-context.d.ts +25 -0
- package/dist/agent-runtime/repository-context.js +127 -0
- package/dist/agent-runtime/repository-context.js.map +1 -0
- package/dist/agent-runtime/review-context.d.ts +14 -0
- package/dist/agent-runtime/review-context.js +41 -0
- package/dist/agent-runtime/review-context.js.map +1 -0
- package/dist/agent-runtime/role-routing.d.ts +10 -0
- package/dist/agent-runtime/role-routing.js +30 -0
- package/dist/agent-runtime/role-routing.js.map +1 -0
- package/dist/agent-runtime/role-state.d.ts +19 -0
- package/dist/agent-runtime/role-state.js +24 -0
- package/dist/agent-runtime/role-state.js.map +1 -0
- package/dist/agent-runtime/runtime-identity.d.ts +11 -0
- package/dist/agent-runtime/runtime-identity.js +33 -0
- package/dist/agent-runtime/runtime-identity.js.map +1 -0
- package/dist/agent-runtime/tool-event.d.ts +3 -0
- package/dist/agent-runtime/tool-event.js +24 -0
- package/dist/agent-runtime/tool-event.js.map +1 -0
- package/dist/agent-runtime/verification-plan.d.ts +55 -0
- package/dist/agent-runtime/verification-plan.js +206 -0
- package/dist/agent-runtime/verification-plan.js.map +1 -0
- package/dist/agent-runtime/workflow-types.d.ts +19 -1
- package/dist/agent-runtime/workflow.js +29 -2
- package/dist/agent-runtime/workflow.js.map +1 -1
- package/dist/agent-runtime/workspace-tools.d.ts +4 -0
- package/dist/agent-runtime/workspace-tools.js +182 -20
- package/dist/agent-runtime/workspace-tools.js.map +1 -1
- package/dist/installer/phases/scaffold.js +39 -109
- package/dist/installer/phases/scaffold.js.map +1 -1
- package/dist/installer/runtime/pipeline-state.d.ts +143 -1
- package/dist/installer/runtime/pipeline-state.js +510 -30
- package/dist/installer/runtime/pipeline-state.js.map +1 -1
- package/docs/agent-runtime-efficiency.md +65 -0
- package/docs/agent-runtime.md +86 -15
- package/integration-contract.json +2 -1
- package/package.json +5 -2
- package/schemas/agent-runtime.schema.json +34 -4
- package/schemas/fixtures/runtime-efficiency-summary.v1.json +790 -0
- package/templates/codex-skills/batch-implement/SKILL.md +33 -58
- package/templates/codex-skills/implement/SKILL.md +21 -124
- package/templates/codex-skills/retry/SKILL.md +8 -34
- package/templates/commands/specrails/batch-implement.md +21 -16
- package/templates/commands/specrails/implement.md +17 -276
- package/templates/commands/specrails/retry.md +6 -34
- package/templates/gemini-commands/batch-implement.toml +34 -28
- package/templates/gemini-commands/implement.toml +34 -55
- package/templates/gemini-commands/retry.toml +10 -16
|
@@ -1,13 +1,21 @@
|
|
|
1
|
+
import { repositoryContextSnapshot, renderRepositoryContext } from '../repository-context.js';
|
|
2
|
+
import { readRoleState, writeRoleState } from '../role-state.js';
|
|
3
|
+
import { fingerprint } from '../durable-store.js';
|
|
4
|
+
import { selectRoleRoute } from '../role-routing.js';
|
|
5
|
+
import { ROLE_SKILLS, OPENSPEC_VERSION, OpenSpecTools, OpenSpecParticipationError, openSpecRepairPrompt } from '../openspec.js';
|
|
1
6
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
7
|
+
import { performance } from 'node:perf_hooks';
|
|
8
|
+
import { frozenAcceptanceCriteria, pipelineStateDirectory } from '../../installer/runtime/pipeline-state.js';
|
|
9
|
+
import { AgentExecutionError, unknownUsage } from '../executor-types.js';
|
|
10
|
+
import { sumCacheUsage } from '../efficiency-types.js';
|
|
11
|
+
import { ROLE_INSTRUCTIONS_VERSION, repairInstructions } from '../prompts.js';
|
|
4
12
|
import { parseAgentObject } from './artifacts.js';
|
|
5
13
|
/** Executor failures that mean "this session cannot be continued", not "the role failed". */
|
|
6
|
-
export const SESSION_FALLBACK_CODES = new Set(['
|
|
14
|
+
export const SESSION_FALLBACK_CODES = new Set(['session_not_found', 'session_expired', 'session_unsupported']);
|
|
7
15
|
const REPAIRABLE = /Invalid|Expected|requires|Duplicate|malformed/i;
|
|
8
16
|
export function sumUsage(a, b) {
|
|
9
17
|
const add = (x, y) => x === null || y === null ? null : x + y;
|
|
10
|
-
return { inputTokens: add(a.inputTokens, b.inputTokens), outputTokens: add(a.outputTokens, b.outputTokens), costUsd: add(a.costUsd, b.costUsd) };
|
|
18
|
+
return { inputTokens: add(a.inputTokens, b.inputTokens), outputTokens: add(a.outputTokens, b.outputTokens), costUsd: add(a.costUsd, b.costUsd), ...sumCacheUsage([a, b]) };
|
|
11
19
|
}
|
|
12
20
|
/**
|
|
13
21
|
* One role turn against the configured executor: budget-aware request, live
|
|
@@ -45,81 +53,145 @@ export function createRoleInvoker(deps) {
|
|
|
45
53
|
}
|
|
46
54
|
catch { /* Observer cannot replay agent effects. */ } };
|
|
47
55
|
const execute = async (role, step, prompt, structured, extra) => {
|
|
48
|
-
const
|
|
56
|
+
const directory = deps.openspec?.[role].stateDirectory ?? path.join(pipelineStateDirectory(context), 'agent-workflow');
|
|
57
|
+
const saved = readRoleState(directory);
|
|
49
58
|
const budget = step.remainingBudget();
|
|
59
|
+
if (budget.maxTokens === 0 || budget.maxCostUsd === 0 || step.signal.aborted)
|
|
60
|
+
throw new AgentExecutionError('No budget remains for another role invocation', step.signal.aborted ? 'aborted' : 'budget_exhausted', { inputTokens: 0, outputTokens: 0, costUsd: 0 });
|
|
61
|
+
const kind = extra.kind ?? (extra.resumeSessionId ? 'correction' : 'initial');
|
|
62
|
+
const route = selectRoleRoute(role, extra.agentOverride ?? config.agents[role], kind, step.checkpoint, extra.agentOverride ? undefined : saved.routes[role]);
|
|
63
|
+
const selected = route.selection;
|
|
64
|
+
const capabilities = await registry.capabilities(selected.provider, selected.model);
|
|
65
|
+
const identity = fingerprint({ role, selected, transport: capabilities.transport, instructionsVersion: ROLE_INSTRUCTIONS_VERSION, provider: config.providers.find(provider => provider.id === selected.provider) ?? selected.provider, definition: (extra.agentOverride ? config.rolePrompts?.fixer : config.rolePrompts?.[role]) ?? null, openspec: deps.openspec?.[role] ?? null, context });
|
|
66
|
+
const previous = saved.sessions[role];
|
|
67
|
+
const resumeSessionId = capabilities.continuation === 'supported' && previous?.identity === identity && previous.sessionId === extra.resumeSessionId ? extra.resumeSessionId : undefined;
|
|
68
|
+
const snapshot = repositoryContextSnapshot(context);
|
|
69
|
+
const incremental = Boolean(resumeSessionId && config.efficiency?.contextMode !== 'full');
|
|
70
|
+
const packet = renderRepositoryContext(snapshot, incremental ? previous?.context : undefined);
|
|
71
|
+
const rolePrompt = !resumeSessionId && extra.fallbackPrompt ? extra.fallbackPrompt : prompt;
|
|
72
|
+
const obligations = '\nCurrent frozen acceptance obligations (all remain required):\n' + JSON.stringify(frozenAcceptanceCriteria(context));
|
|
73
|
+
const fullPrompt = rolePrompt + obligations + '\n\n' + packet;
|
|
74
|
+
if (extra.agentOverride)
|
|
75
|
+
note(role, `Fixer route: ${selected.provider}/${selected.model ?? 'provider default'} — correction round on the fixer engine`);
|
|
76
|
+
else if (saved.routes[role]?.tier !== route.tier)
|
|
77
|
+
note(role, `Role route: ${selected.provider}/${selected.model ?? 'provider default'} — ${route.reason}`);
|
|
78
|
+
if (!extra.agentOverride) {
|
|
79
|
+
saved.routes[role] = { tier: route.tier, reason: route.reason, attemptId: step.attemptId };
|
|
80
|
+
writeRoleState(directory, saved);
|
|
81
|
+
}
|
|
82
|
+
const measurement = { provider: selected.provider, ...(selected.model ? { model: selected.model } : {}),
|
|
83
|
+
contextMode: incremental ? 'incremental' : 'full', promptBytes: Buffer.byteLength(fullPrompt), contextBytes: Buffer.byteLength(packet), handoffBytes: Buffer.byteLength(rolePrompt), requestedEffort: selected.effort ?? null,
|
|
84
|
+
kind, tier: route.tier, routeReason: route.reason };
|
|
85
|
+
const invocationIdentity = await step.reportInvocationStarted?.(measurement);
|
|
86
|
+
const started = performance.now();
|
|
87
|
+
let toolCalls = 0, succeeded = false, usageReported = false, usage = unknownUsage();
|
|
88
|
+
// Tool calls and notes of a correction round are attributed to the FIXER so
|
|
89
|
+
// the log reads `[fixer] read_file …`, not as another developer pass.
|
|
90
|
+
const onEvent = forward(extra.stance === 'fixer' ? 'fixer' : role, structured);
|
|
50
91
|
try {
|
|
92
|
+
if (deps.openspec?.[role])
|
|
93
|
+
note(role, `OpenSpec ${OPENSPEC_VERSION}: ${ROLE_SKILLS[role]} (official skill document through scoped tools).`);
|
|
51
94
|
const result = await registry.execute(selected.provider, {
|
|
52
|
-
role, prompt, cwd: context.artifactRoot, allowedRoots: context.repositories.map(repo => repo.path),
|
|
53
|
-
model: selected.model, maxTurns: selected.maxTurns, signal: step.signal,
|
|
95
|
+
role, prompt: fullPrompt, openspec: deps.openspec?.[role] ? { ...deps.openspec[role], ...(role === 'architect' ? {} : { evidenceScope: { backlogRoot: context.backlogRoot, runId: context.runId } }) } : undefined, cwd: context.artifactRoot, allowedRoots: context.repositories.map(repo => repo.path),
|
|
96
|
+
model: selected.model, effort: selected.effort, ...(selected.thinking ? { thinking: selected.thinking } : {}), maxTurns: selected.maxTurns, signal: step.signal,
|
|
54
97
|
timeoutMs: config.limits?.timeoutMs,
|
|
55
98
|
maxTokens: budget.maxTokens, maxCostUsd: budget.maxCostUsd,
|
|
56
|
-
...
|
|
99
|
+
...(config.guardrails ? { guardrails: config.guardrails } : {}),
|
|
100
|
+
...(extra.stance ? { stance: extra.stance } : {}),
|
|
101
|
+
resumeSessionId, outputSchema: extra.outputSchema, onEvent: event => { if (event.kind === 'tool-start')
|
|
102
|
+
toolCalls++; onEvent(event); },
|
|
57
103
|
});
|
|
104
|
+
usage = result.usage;
|
|
58
105
|
step.reportUsage(result.usage);
|
|
106
|
+
usageReported = true;
|
|
107
|
+
if (result.sessionId && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/.test(result.sessionId))
|
|
108
|
+
saved.sessions[role] = { identity, sessionId: result.sessionId, context: snapshot };
|
|
109
|
+
else
|
|
110
|
+
delete saved.sessions[role];
|
|
111
|
+
writeRoleState(directory, saved);
|
|
112
|
+
succeeded = true;
|
|
59
113
|
return result;
|
|
60
114
|
}
|
|
61
115
|
catch (error) {
|
|
62
|
-
if (
|
|
63
|
-
|
|
116
|
+
if (!usageReported) {
|
|
117
|
+
usage = error instanceof AgentExecutionError ? error.usage : unknownUsage();
|
|
118
|
+
step.reportUsage(usage);
|
|
119
|
+
}
|
|
64
120
|
throw error;
|
|
65
121
|
}
|
|
122
|
+
finally {
|
|
123
|
+
await step.reportInvocation?.({ ...measurement, ...invocationIdentity, status: succeeded ? 'succeeded' : 'failed', durationMs: Math.max(0, performance.now() - started), toolCalls, usage });
|
|
124
|
+
}
|
|
66
125
|
};
|
|
67
126
|
return async (role, step, options, accept) => {
|
|
68
127
|
const structured = options.structured === true;
|
|
128
|
+
const workflow = deps.openspec?.[role] ? new OpenSpecTools(deps.openspec[role]) : undefined;
|
|
129
|
+
const cursor = workflow?.participationCursor() ?? 0;
|
|
130
|
+
const evaluate = (result) => {
|
|
131
|
+
let output, parseError;
|
|
132
|
+
if (structured) {
|
|
133
|
+
try {
|
|
134
|
+
output = result.structured ?? parseAgentObject(result.text);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
parseError = error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// A genuine architect question can precede artifact creation. Completed
|
|
141
|
+
// role results must prove this invocation used the workflow, not an old visit.
|
|
142
|
+
if (!(role === 'architect' && output?.confidence === 'low'))
|
|
143
|
+
workflow?.assertParticipation(cursor);
|
|
144
|
+
if (structured && !output && !options.lenient)
|
|
145
|
+
throw new Error('Invalid structured role response: ' + (parseError instanceof Error ? parseError.message : 'missing object'));
|
|
146
|
+
return { ok: true, value: accept(output, result.text, result), text: result.text, result };
|
|
147
|
+
};
|
|
69
148
|
try {
|
|
70
149
|
let result;
|
|
71
150
|
if (options.resumeSessionId && options.fallbackPrompt) {
|
|
72
151
|
// A correction pass continues the role's own session: the work it did and
|
|
73
152
|
// the reasons behind it are already in context.
|
|
74
153
|
try {
|
|
75
|
-
result = await execute(role, step, options.prompt, structured, { resumeSessionId: options.resumeSessionId, outputSchema: options.outputSchema });
|
|
154
|
+
result = await execute(role, step, options.prompt, structured, { kind: options.kind, resumeSessionId: options.resumeSessionId, outputSchema: options.outputSchema, fallbackPrompt: options.fallbackPrompt, agentOverride: options.agentOverride, stance: options.stance });
|
|
76
155
|
}
|
|
77
156
|
catch (error) {
|
|
78
157
|
if (!(error instanceof AgentExecutionError) || !SESSION_FALLBACK_CODES.has(error.code))
|
|
79
158
|
throw error;
|
|
80
159
|
note(role, `Previous ${role} session is unavailable; starting a fresh ${role} turn with the same instructions.`);
|
|
81
|
-
result = await execute(role, step, options.fallbackPrompt, structured, { outputSchema: options.outputSchema });
|
|
160
|
+
result = await execute(role, step, options.fallbackPrompt, structured, { kind: 'session-fallback', outputSchema: options.outputSchema, agentOverride: options.agentOverride, stance: options.stance });
|
|
82
161
|
}
|
|
83
162
|
}
|
|
84
163
|
else {
|
|
85
|
-
result = await execute(role, step, options.prompt, structured, { resumeSessionId: options.resumeSessionId, outputSchema: options.outputSchema });
|
|
164
|
+
result = await execute(role, step, options.prompt, structured, { kind: options.kind, resumeSessionId: options.resumeSessionId, outputSchema: options.outputSchema, fallbackPrompt: options.fallbackPrompt, agentOverride: options.agentOverride, stance: options.stance });
|
|
86
165
|
}
|
|
87
|
-
|
|
88
|
-
return { ok: true, value: accept(undefined, result.text, result), text: result.text, result };
|
|
89
|
-
let output, problem;
|
|
166
|
+
let problem, omittedWorkflow = false;
|
|
90
167
|
try {
|
|
91
|
-
|
|
168
|
+
return evaluate(result);
|
|
92
169
|
}
|
|
93
170
|
catch (error) {
|
|
94
171
|
problem = error instanceof Error ? error.message : String(error);
|
|
172
|
+
omittedWorkflow = error instanceof OpenSpecParticipationError;
|
|
173
|
+
if (!omittedWorkflow && !REPAIRABLE.test(problem))
|
|
174
|
+
return { ok: false, error: problem };
|
|
95
175
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// One bounded repair turn inside the same session: the role keeps its work
|
|
109
|
-
// and only resends the object. Without a session the role starts over once.
|
|
110
|
-
if (!result.sessionId)
|
|
111
|
-
return { ok: false, error: problem ?? 'Unusable structured reply' };
|
|
112
|
-
note(role, `The ${role} reply was not a valid result (${problem}); asking the same session to resend it.`);
|
|
113
|
-
const repaired = await execute(role, step, repairInstructions(role, problem), structured, { resumeSessionId: result.sessionId, outputSchema: options.outputSchema });
|
|
176
|
+
// A single repair budget covers protocol omissions and malformed output.
|
|
177
|
+
// Use the same provider session when possible; sessionless APIs receive the
|
|
178
|
+
// complete original role prompt and existing artifacts, never another role.
|
|
179
|
+
const repair = omittedWorkflow ? openSpecRepairPrompt(workflow.context) : repairInstructions(role, problem);
|
|
180
|
+
note(role, omittedWorkflow
|
|
181
|
+
? `The ${role} omitted its required OpenSpec workflow; requesting one correction in the same role before accepting the result.`
|
|
182
|
+
: `The ${role} reply was not a valid result (${problem}); asking the same session to resend it.`);
|
|
183
|
+
const repaired = await execute(role, step, result.sessionId ? repair : (options.fallbackPrompt ?? options.prompt) + '\n' + repair, structured, { kind: 'repair', resumeSessionId: result.sessionId, outputSchema: options.outputSchema,
|
|
184
|
+
fallbackPrompt: (options.fallbackPrompt ?? options.prompt) + '\nPrevious response (bounded):\n' + result.text.slice(-32_000) + '\n' + repair,
|
|
185
|
+
});
|
|
114
186
|
try {
|
|
115
|
-
return
|
|
187
|
+
return evaluate(repaired);
|
|
116
188
|
}
|
|
117
189
|
catch (error) {
|
|
118
190
|
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
119
191
|
}
|
|
120
192
|
}
|
|
121
193
|
catch (error) {
|
|
122
|
-
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
194
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error), ...(error instanceof AgentExecutionError ? { code: error.code } : {}) };
|
|
123
195
|
}
|
|
124
196
|
};
|
|
125
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/roles.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAC7F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC/H,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAwB,MAAM,2CAA2C,CAAA;AAElI,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAwI,MAAM,sBAAsB,CAAA;AAC9M,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,CAAA;AAiC9G,MAAM,UAAU,GAAG,gDAAgD,CAAA;AAEnE,MAAM,UAAU,QAAQ,CAAC,CAAa,EAAE,CAAa;IACnD,MAAM,GAAG,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAiB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC1G,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5K,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IAClG,MAAM,UAAU,GAAG,CAAC,MAAc,EAAU,EAAE;QAC5C,2FAA2F;QAC3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YACvF,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxJ,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAE,UAAmB,EAAE,EAAE,CAAC,CAAC,KAAiB,EAAQ,EAAE;QACzF,8EAA8E;QAC9E,kEAAkE;QAClE,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,OAAM;QACxF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;QACnH,IAAI,CAAC;YAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,2CAA2C,CAAC,CAAC;IACjG,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,CAAC,IAAoB,EAAE,IAAY,EAAQ,EAAE,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9K,MAAM,OAAO,GAAG,KAAK,EAAE,IAAe,EAAE,IAAyB,EAAE,MAAc,EAAE,UAAmB,EAAE,KAAiL,EAAwB,EAAE;QACjT,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAA;QACtH,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACrC,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,mBAAmB,CAAC,+CAA+C,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QACnQ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC7E,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5J,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAA;QAChC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnF,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9X,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,eAAe,GAAG,YAAY,CAAC,YAAY,KAAK,WAAW,IAAI,QAAQ,EAAE,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QACxL,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,WAAW,KAAK,MAAM,CAAC,CAAA;QACzF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC7F,MAAM,UAAU,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAA;QAC3F,MAAM,WAAW,GAAG,kEAAkE,GAAG,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAA;QAC1I,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;QAC7D,IAAI,KAAK,CAAC,aAAa;YAAE,IAAI,CAAC,IAAI,EAAE,gBAAgB,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,kBAAkB,yCAAyC,CAAC,CAAA;aAClJ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,EAAE,eAAe,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,kBAAkB,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1J,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAAC,CAAC;QAC1J,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,aAAsB,CAAC,CAAC,CAAC,MAAe,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;YAC/O,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;QACrD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC,WAAW,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACjC,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,aAAa,GAAG,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,CAAA;QACnF,4EAA4E;QAC5E,sEAAsE;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC9E,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,EAAE,YAAY,gBAAgB,KAAK,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;YAC3I,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBACvD,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxS,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;gBAC/J,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;gBACnC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC1D,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;oBAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;aACtI,CAAC,CAAA;YACF,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;YACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9B,aAAa,GAAG,IAAI,CAAA;YACpB,IAAI,MAAM,CAAC,SAAS,IAAI,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;;gBACpK,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAChC,SAAS,GAAG,IAAI,CAAA;YAChB,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,KAAK,GAAG,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAA;gBAC3E,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,kBAAkB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9L,CAAC;IACH,CAAC,CAAA;IAED,OAAO,KAAK,EAAK,IAAe,EAAE,IAAyB,EAAE,OAAsB,EAAE,MAAiB,EAA6B,EAAE;QACnI,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAA;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3F,MAAM,MAAM,GAAG,QAAQ,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAoB,EAAE;YACzD,IAAI,MAA2C,EAAE,UAAmB,CAAA;YACpE,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC;oBAAC,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAAC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,UAAU,GAAG,KAAK,CAAA;gBAAC,CAAC;YAC1G,CAAC;YACD,wEAAwE;YACxE,+EAA+E;YAC/E,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,EAAE,UAAU,KAAK,KAAK,CAAC;gBAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAA;YAClG,IAAI,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAA;YAC5K,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;QAC5F,CAAC,CAAA;QACD,IAAI,CAAC;YACH,IAAI,MAAmB,CAAA;YACvB,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBACtD,0EAA0E;gBAC1E,gDAAgD;gBAChD,IAAI,CAAC;oBAAC,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAAC,CAAC;gBAClR,OAAO,KAAK,EAAE,CAAC;oBACb,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAmB,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;wBAAE,MAAM,KAAK,CAAA;oBACnG,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,6CAA6C,IAAI,mCAAmC,CAAC,CAAA;oBAChH,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBACxM,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5Q,CAAC;YACD,IAAI,OAAe,EAAE,eAAe,GAAG,KAAK,CAAA;YAC5C,IAAI,CAAC;gBAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAA;YAAC,CAAC;YAC/B,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAChE,eAAe,GAAG,KAAK,YAAY,0BAA0B,CAAA;gBAC7D,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;YACzF,CAAC;YACD,yEAAyE;YACzE,4EAA4E;YAC5E,4EAA4E;YAC5E,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAC5G,IAAI,CAAC,IAAI,EAAE,eAAe;gBACxB,CAAC,CAAC,OAAO,IAAI,kHAAkH;gBAC/H,CAAC,CAAC,OAAO,IAAI,kCAAkC,OAAO,0CAA0C,CAAC,CAAA;YACnG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,EACtF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;gBACjG,cAAc,EAAE,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,kCAAkC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;aAC7I,CAAC,CAAA;YACJ,IAAI,CAAC;gBAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAAC,CAAC;YACjC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;YAAC,CAAC;QAEvG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAC5J,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { VerificationCommand } from '../../installer/runtime/pipeline-state.js';
|
|
2
2
|
export type DesignConfidence = 'high' | 'medium' | 'low';
|
|
3
3
|
export interface ArchitectureRecord {
|
|
4
|
+
planningDepth?: 'focused' | 'full';
|
|
5
|
+
planningReason?: string;
|
|
6
|
+
referencePatterns?: string[];
|
|
7
|
+
riskFlags?: string[];
|
|
4
8
|
change: string;
|
|
5
9
|
tasks: number;
|
|
6
10
|
specs: string[];
|
|
@@ -16,6 +20,7 @@ export interface DeveloperRecord {
|
|
|
16
20
|
sessionId?: string;
|
|
17
21
|
files: string[];
|
|
18
22
|
tests: string[];
|
|
23
|
+
verificationChecks?: import('../verification-plan.js').ProposedCheck[];
|
|
19
24
|
verification?: string;
|
|
20
25
|
incomplete: Array<{
|
|
21
26
|
task: string;
|
|
@@ -31,6 +36,7 @@ export interface VerificationRecord {
|
|
|
31
36
|
incompleteTasks?: string[];
|
|
32
37
|
unverifiedRepositories: string[];
|
|
33
38
|
commands: Array<{
|
|
39
|
+
evidenceId?: string;
|
|
34
40
|
repositoryId: string;
|
|
35
41
|
command: string;
|
|
36
42
|
args: string[];
|
|
@@ -39,6 +45,8 @@ export interface VerificationRecord {
|
|
|
39
45
|
}>;
|
|
40
46
|
}
|
|
41
47
|
export interface ReviewRecord {
|
|
48
|
+
sessionId?: string;
|
|
49
|
+
manifest?: import('../review-context.js').ReviewManifest;
|
|
42
50
|
approved: boolean;
|
|
43
51
|
summary: string;
|
|
44
52
|
issues: string[];
|
|
@@ -71,5 +79,6 @@ export declare const CoreState: import("@langchain/langgraph").AnnotationRoot<{
|
|
|
71
79
|
}>;
|
|
72
80
|
export type CoreStateType = typeof CoreState.State;
|
|
73
81
|
export type CoreStateUpdate = typeof CoreState.Update;
|
|
74
|
-
export type CoreNodeId = 'architect' | 'developer' | 'verify' | 'reviewer' | 'archive';
|
|
82
|
+
export type CoreNodeId = 'architect' | 'developer' | 'fixer' | 'verify' | 'reviewer' | 'archive';
|
|
83
|
+
/** Graph order. `fixer` is the correction node: verify (failed, tasks ticked) and reviewer (rejected) route there; it hands back to verify. */
|
|
75
84
|
export declare const CORE_NODE_ORDER: readonly CoreNodeId[];
|
|
@@ -19,5 +19,6 @@ export const CoreState = Annotation.Root({
|
|
|
19
19
|
deepenPasses: Annotation({ ...replace(), default: () => 0 }),
|
|
20
20
|
archived: Annotation({ ...replace(), default: () => null }),
|
|
21
21
|
});
|
|
22
|
-
|
|
22
|
+
/** Graph order. `fixer` is the correction node: verify (failed, tasks ticked) and reviewer (rejected) route there; it hands back to verify. */
|
|
23
|
+
export const CORE_NODE_ORDER = ['architect', 'developer', 'fixer', 'verify', 'reviewer', 'archive'];
|
|
23
24
|
//# sourceMappingURL=state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAkDjD,MAAM,OAAO,GAAG,GAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,SAAY,EAAE,IAAO,EAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;AAE1E;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;IACvC,wFAAwF;IACxF,IAAI,EAAE,UAAU,CAAwB,EAAE,GAAG,OAAO,EAAyB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACnG,sBAAsB,EAAE,UAAU,CAAW,EAAE,GAAG,OAAO,EAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC3F,YAAY,EAAE,UAAU,CAA4B,EAAE,GAAG,OAAO,EAA6B,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACrH,WAAW,EAAE,UAAU,CAAyB,EAAE,GAAG,OAAO,EAA0B,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9G,YAAY,EAAE,UAAU,CAA4B,EAAE,GAAG,OAAO,EAA6B,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACrH,MAAM,EAAE,UAAU,CAAsB,EAAE,GAAG,OAAO,EAAuB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACnG,uEAAuE;IACvE,OAAO,EAAE,UAAU,CAAW,EAAE,OAAO,EAAE,CAAC,QAAkB,EAAE,IAAc,EAAY,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACvI,8FAA8F;IAC9F,YAAY,EAAE,UAAU,CAAS,EAAE,GAAG,OAAO,EAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5E,QAAQ,EAAE,UAAU,CAAuB,EAAE,GAAG,OAAO,EAAwB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;CACxG,CAAC,CAAA;AAIF,+IAA+I;AAC/I,MAAM,CAAC,MAAM,eAAe,GAA0B,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const GUARDRAIL_IDS: readonly ["plan-validation", "genuine-blocking-question", "plan-language-hint", "frozen-plan-writes", "primary-language", "duplicate-sibling", "one-test-per-module", "empty-write", "evidence-gated-ticking", "inventory-retry", "synthetic-corrections", "silent-group-closure", "verify-per-group", "test-reachability", "exit-code-honesty", "environment-repair", "lockfile-repair", "verify-idle-timeout"];
|
|
2
|
+
export type GuardrailId = (typeof GUARDRAIL_IDS)[number];
|
|
3
|
+
export type GuardrailPhase = 'architect' | 'developer' | 'host';
|
|
4
|
+
export interface GuardrailDescriptor {
|
|
5
|
+
id: GuardrailId;
|
|
6
|
+
phase: GuardrailPhase;
|
|
7
|
+
}
|
|
8
|
+
export type GuardrailSettings = Partial<Record<GuardrailId, boolean>>;
|
|
9
|
+
/** Stable catalog (phase order = pipeline order); labels/descriptions live in the host UI so they can be localized. */
|
|
10
|
+
export declare const GUARDRAIL_CATALOG: readonly GuardrailDescriptor[];
|
|
11
|
+
export declare function isGuardrailId(value: unknown): value is GuardrailId;
|
|
12
|
+
/** A guardrail is on unless the settings say `false` explicitly. */
|
|
13
|
+
export declare function guardrailEnabled(settings: GuardrailSettings | undefined, id: GuardrailId): boolean;
|
|
14
|
+
/** Validates a raw `guardrails` object: only known ids, only booleans. Returns the normalized settings (unset ⇒ omitted). */
|
|
15
|
+
export declare function validateGuardrailSettings(value: unknown, path?: string): GuardrailSettings;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Configurable guardrails of the small-model (compact) runtime.
|
|
2
|
+
//
|
|
3
|
+
// Every entry is a process rule the host applies around a local model so a
|
|
4
|
+
// 7–30B developer does not derail: a validated plan, frozen planning
|
|
5
|
+
// artifacts, one test file per module, evidence before a task is ticked, an
|
|
6
|
+
// environment repaired by the host instead of the model, a hanging test
|
|
7
|
+
// stopped by silence, a test file the verify command never runs, a runner
|
|
8
|
+
// that prints failures but exits 0. All are ON by default; a project may switch one off in
|
|
9
|
+
// its runtime configuration (`guardrails: { <id>: false }`) to tune the
|
|
10
|
+
// process. Pure bug fixes (candidate fingerprint, correction counter, argument
|
|
11
|
+
// repair) are deliberately NOT here: they are correctness, not tuning.
|
|
12
|
+
//
|
|
13
|
+
// CLI providers never see these: the compact loop is local-engine only.
|
|
14
|
+
export const GUARDRAIL_IDS = [
|
|
15
|
+
'plan-validation',
|
|
16
|
+
'genuine-blocking-question',
|
|
17
|
+
'plan-language-hint',
|
|
18
|
+
'frozen-plan-writes',
|
|
19
|
+
'primary-language',
|
|
20
|
+
'duplicate-sibling',
|
|
21
|
+
'one-test-per-module',
|
|
22
|
+
'empty-write',
|
|
23
|
+
'evidence-gated-ticking',
|
|
24
|
+
'inventory-retry',
|
|
25
|
+
'synthetic-corrections',
|
|
26
|
+
'silent-group-closure',
|
|
27
|
+
'verify-per-group',
|
|
28
|
+
'test-reachability',
|
|
29
|
+
'exit-code-honesty',
|
|
30
|
+
'environment-repair',
|
|
31
|
+
'lockfile-repair',
|
|
32
|
+
'verify-idle-timeout',
|
|
33
|
+
];
|
|
34
|
+
/** Stable catalog (phase order = pipeline order); labels/descriptions live in the host UI so they can be localized. */
|
|
35
|
+
export const GUARDRAIL_CATALOG = [
|
|
36
|
+
{ id: 'plan-validation', phase: 'architect' },
|
|
37
|
+
{ id: 'genuine-blocking-question', phase: 'architect' },
|
|
38
|
+
{ id: 'plan-language-hint', phase: 'architect' },
|
|
39
|
+
{ id: 'frozen-plan-writes', phase: 'developer' },
|
|
40
|
+
{ id: 'primary-language', phase: 'developer' },
|
|
41
|
+
{ id: 'duplicate-sibling', phase: 'developer' },
|
|
42
|
+
{ id: 'one-test-per-module', phase: 'developer' },
|
|
43
|
+
{ id: 'empty-write', phase: 'developer' },
|
|
44
|
+
{ id: 'evidence-gated-ticking', phase: 'developer' },
|
|
45
|
+
{ id: 'inventory-retry', phase: 'developer' },
|
|
46
|
+
{ id: 'synthetic-corrections', phase: 'developer' },
|
|
47
|
+
{ id: 'silent-group-closure', phase: 'developer' },
|
|
48
|
+
{ id: 'verify-per-group', phase: 'developer' },
|
|
49
|
+
{ id: 'test-reachability', phase: 'host' },
|
|
50
|
+
{ id: 'exit-code-honesty', phase: 'host' },
|
|
51
|
+
{ id: 'environment-repair', phase: 'host' },
|
|
52
|
+
{ id: 'lockfile-repair', phase: 'host' },
|
|
53
|
+
{ id: 'verify-idle-timeout', phase: 'host' },
|
|
54
|
+
];
|
|
55
|
+
export function isGuardrailId(value) {
|
|
56
|
+
return typeof value === 'string' && GUARDRAIL_IDS.includes(value);
|
|
57
|
+
}
|
|
58
|
+
/** A guardrail is on unless the settings say `false` explicitly. */
|
|
59
|
+
export function guardrailEnabled(settings, id) {
|
|
60
|
+
return settings?.[id] !== false;
|
|
61
|
+
}
|
|
62
|
+
/** Validates a raw `guardrails` object: only known ids, only booleans. Returns the normalized settings (unset ⇒ omitted). */
|
|
63
|
+
export function validateGuardrailSettings(value, path = 'guardrails') {
|
|
64
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
65
|
+
throw new Error(`${path}: expected an object`);
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const [key, flag] of Object.entries(value)) {
|
|
68
|
+
if (!isGuardrailId(key))
|
|
69
|
+
throw new Error(`${path}.${key}: unknown guardrail`);
|
|
70
|
+
if (typeof flag !== 'boolean')
|
|
71
|
+
throw new Error(`${path}.${key}: expected a boolean`);
|
|
72
|
+
out[key] = flag;
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/agent-runtime/guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/** Hosts define graph state with LangGraph's Annotation without a direct LangGraph dependency. */
|
|
2
2
|
export { Annotation } from '@langchain/langgraph';
|
|
3
3
|
export * from './executor-types.js';
|
|
4
|
+
export * from './efficiency.js';
|
|
4
5
|
export * from './config.js';
|
|
6
|
+
export * from './capabilities.js';
|
|
7
|
+
export * from './runtime-identity.js';
|
|
5
8
|
export * from './executors.js';
|
|
6
9
|
export * from './workflow.js';
|
|
7
10
|
export * from './core-host.js';
|
|
@@ -11,4 +14,7 @@ export { DEFAULT_REVIEW_POLICY, REVIEW_ASPECTS, evaluateReview, resolveReviewPol
|
|
|
11
14
|
export { createRoleInvoker, type Accept, type InvokeOptions, type InvokeOutcome, type RoleInvoker, type RoleInvokerDeps } from './graph/roles.js';
|
|
12
15
|
export { parseAgentObject } from './graph/artifacts.js';
|
|
13
16
|
export { FileCheckpointSaver, type GraphStoreIO, type SerializedGraphStore } from './graph-checkpointer.js';
|
|
14
|
-
export { ARCHITECT_OUTPUT_SCHEMA, DEVELOPER_OUTPUT_SCHEMA, REVIEW_OUTPUT_SCHEMA, ROLE_INSTRUCTIONS_VERSION, correctionInstructions, deepenInstructions, repairInstructions, roleInstructions, type FrozenCriterion, type RoleFeedback, type RoleInstructionOptions, } from './prompts.js';
|
|
17
|
+
export { ARCHITECT_OUTPUT_SCHEMA, DEVELOPER_OUTPUT_SCHEMA, REVIEW_OUTPUT_SCHEMA, ROLE_INSTRUCTIONS_VERSION, rolePromptDefaults, correctionInstructions, deepenInstructions, repairInstructions, roleInstructions, type FrozenCriterion, type RoleFeedback, type RoleInstructionOptions, } from './prompts.js';
|
|
18
|
+
export { OPENSPEC_VERSION, ROLE_SKILLS, type OpenSpecRoleContext } from './openspec.js';
|
|
19
|
+
export * from './efficiency-summary.js';
|
|
20
|
+
export { readVerificationEvidence, type VerificationEvidenceQuery } from '../installer/runtime/pipeline-state.js';
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/** Hosts define graph state with LangGraph's Annotation without a direct LangGraph dependency. */
|
|
2
2
|
export { Annotation } from '@langchain/langgraph';
|
|
3
3
|
export * from './executor-types.js';
|
|
4
|
+
export * from './efficiency.js';
|
|
4
5
|
export * from './config.js';
|
|
6
|
+
export * from './capabilities.js';
|
|
7
|
+
export * from './runtime-identity.js';
|
|
5
8
|
export * from './executors.js';
|
|
6
9
|
export * from './workflow.js';
|
|
7
10
|
export * from './core-host.js';
|
|
@@ -11,5 +14,8 @@ export { DEFAULT_REVIEW_POLICY, REVIEW_ASPECTS, evaluateReview, resolveReviewPol
|
|
|
11
14
|
export { createRoleInvoker } from './graph/roles.js';
|
|
12
15
|
export { parseAgentObject } from './graph/artifacts.js';
|
|
13
16
|
export { FileCheckpointSaver } from './graph-checkpointer.js';
|
|
14
|
-
export { ARCHITECT_OUTPUT_SCHEMA, DEVELOPER_OUTPUT_SCHEMA, REVIEW_OUTPUT_SCHEMA, ROLE_INSTRUCTIONS_VERSION, correctionInstructions, deepenInstructions, repairInstructions, roleInstructions, } from './prompts.js';
|
|
17
|
+
export { ARCHITECT_OUTPUT_SCHEMA, DEVELOPER_OUTPUT_SCHEMA, REVIEW_OUTPUT_SCHEMA, ROLE_INSTRUCTIONS_VERSION, rolePromptDefaults, correctionInstructions, deepenInstructions, repairInstructions, roleInstructions, } from './prompts.js';
|
|
18
|
+
export { OPENSPEC_VERSION, ROLE_SKILLS } from './openspec.js';
|
|
19
|
+
export * from './efficiency-summary.js';
|
|
20
|
+
export { readVerificationEvidence } from '../installer/runtime/pipeline-state.js';
|
|
15
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent-runtime/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAqB,MAAM,kBAAkB,CAAA;AAC1H,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAwC,MAAM,0BAA0B,CAAA;AAC3J,OAAO,EAAE,iBAAiB,EAA+F,MAAM,kBAAkB,CAAA;AACjJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAgD,MAAM,yBAAyB,CAAA;AAC3G,OAAO,EACL,uBAAuB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,yBAAyB,EACjG,sBAAsB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent-runtime/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAqB,MAAM,kBAAkB,CAAA;AAC1H,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAwC,MAAM,0BAA0B,CAAA;AAC3J,OAAO,EAAE,iBAAiB,EAA+F,MAAM,kBAAkB,CAAA;AACjJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAgD,MAAM,yBAAyB,CAAA;AAC3G,OAAO,EACL,uBAAuB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,yBAAyB,EACjG,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,GACrG,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAA4B,MAAM,eAAe,CAAA;AAEvF,cAAc,yBAAyB,CAAA;AACvC,OAAO,EAAE,wBAAwB,EAAkC,MAAM,wCAAwC,CAAA"}
|
|
@@ -4,4 +4,8 @@ import { type CliProcessRunner } from './cli-process.js';
|
|
|
4
4
|
export declare function executeKimiReadonlyAcp(request: AgentRequest, options?: {
|
|
5
5
|
runProcess?: CliProcessRunner;
|
|
6
6
|
env?: NodeJS.ProcessEnv;
|
|
7
|
+
openspecBridge?: {
|
|
8
|
+
command: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
};
|
|
7
11
|
}): Promise<AgentResult>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toolEvent } from './tool-event.js';
|
|
1
2
|
import { normalizeKimiCliModel } from '../installer/runtime/kimi.js';
|
|
2
3
|
import { AgentExecutionError, unknownUsage, validateAgentRequest } from './executor-types.js';
|
|
3
4
|
import { runCliProcess } from './cli-process.js';
|
|
@@ -7,12 +8,14 @@ function record(value) { return value && typeof value === 'object' && !Array.isA
|
|
|
7
8
|
/** Native ACP v1 keeps Kimi 0.27 read-only roles usable without a platform skill or a model call during capability negotiation. */
|
|
8
9
|
export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
9
10
|
validateAgentRequest(request);
|
|
10
|
-
if (request.role === 'developer')
|
|
11
|
+
if (request.role === 'developer' && !options.openspecBridge)
|
|
11
12
|
throw new AgentExecutionError('Read-only ACP transport cannot execute developer roles', 'invalid_request');
|
|
12
13
|
if (request.maxCostUsd !== undefined)
|
|
13
14
|
throw new AgentExecutionError('Kimi cannot enforce a strict USD cap', 'cost_limit_unsupported');
|
|
14
15
|
if (request.maxTokens !== undefined)
|
|
15
16
|
throw new AgentExecutionError('Kimi 0.27 ACP does not report authoritative token usage. Remove the token cap or choose another provider for this role.', 'usage_unavailable');
|
|
17
|
+
const readOnly = request.role !== 'developer';
|
|
18
|
+
const mode = readOnly ? 'plan' : 'auto';
|
|
16
19
|
const tools = new WorkspaceTools(request.cwd, request.allowedRoots, request.role);
|
|
17
20
|
let transport, nextId = 0, sessionId, text = '', completed = false, turns = 0, permissionDenied = false;
|
|
18
21
|
const calls = new Map();
|
|
@@ -32,7 +35,7 @@ export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
|
32
35
|
});
|
|
33
36
|
};
|
|
34
37
|
const selectMode = () => {
|
|
35
|
-
send('session/set_mode', { sessionId, modeId:
|
|
38
|
+
send('session/set_mode', { sessionId, modeId: mode }, () => {
|
|
36
39
|
if (request.model)
|
|
37
40
|
send('session/set_config_option', { sessionId, configId: 'model', value: normalizeKimiCliModel(request.model) }, prompt);
|
|
38
41
|
else
|
|
@@ -67,15 +70,15 @@ export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
|
67
70
|
// the assistant turn after the last tool invocation.
|
|
68
71
|
text = '';
|
|
69
72
|
turns++;
|
|
70
|
-
if (turns > (request.maxTurns ??
|
|
73
|
+
if (turns > (request.maxTurns ?? 100))
|
|
71
74
|
throw new AgentExecutionError('Kimi ACP exceeded its tool limit', 'max_turns');
|
|
72
|
-
request.onEvent?.(
|
|
75
|
+
request.onEvent?.(toolEvent(typeof update.title === 'string' ? update.title : 'kimi-tool', { ...record(update.rawInput), paths: Array.isArray(update.locations) ? update.locations.map(location => record(location).path) : [] }));
|
|
73
76
|
}
|
|
74
|
-
if (update.sessionUpdate === 'current_mode_update' && update.currentModeId !==
|
|
77
|
+
if (update.sessionUpdate === 'current_mode_update' && update.currentModeId !== mode)
|
|
75
78
|
throw new AgentExecutionError('Kimi left its read-only mode', 'tool_policy_violation');
|
|
76
79
|
if (update.sessionUpdate === 'config_option_update' && Array.isArray(update.configOptions)) {
|
|
77
80
|
const mode = update.configOptions.map(record).find(option => option.id === 'mode');
|
|
78
|
-
if (mode && mode.currentValue !== 'plan')
|
|
81
|
+
if (mode && mode.currentValue !== (readOnly ? 'plan' : 'auto'))
|
|
79
82
|
throw new AgentExecutionError('Kimi left its read-only mode', 'tool_policy_violation');
|
|
80
83
|
}
|
|
81
84
|
return;
|
|
@@ -117,6 +120,14 @@ export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
|
117
120
|
const file = input.path ?? input.file_path;
|
|
118
121
|
const choices = Array.isArray(params.options) ? params.options.map(record) : [];
|
|
119
122
|
const allow = choices.find(option => option.kind === 'allow_once');
|
|
123
|
+
if (options.openspecBridge && ['mcp__specrails_openspec__workflow', 'mcp__specrails_openspec__read_verification_evidence'].includes(typeof tool.title === 'string' ? tool.title : '') && typeof allow?.optionId === 'string') {
|
|
124
|
+
respond({ outcome: { outcome: 'selected', optionId: allow.optionId } });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!readOnly && typeof allow?.optionId === 'string') {
|
|
128
|
+
respond({ outcome: { outcome: 'selected', optionId: allow.optionId } });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
120
131
|
if (['read', 'search'].includes(String(tool.kind)) && typeof file === 'string' && typeof allow?.optionId === 'string') {
|
|
121
132
|
try {
|
|
122
133
|
tools.execute(tool.kind === 'read' ? 'read_file' : 'list_files', { path: file });
|
|
@@ -149,13 +160,13 @@ export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
|
149
160
|
cwd: tools.cwd, signal: request.signal, timeoutMs: request.timeoutMs ?? 15 * 60_000, env: options.env, onLine: onMessage,
|
|
150
161
|
duplex: control => {
|
|
151
162
|
transport = control;
|
|
152
|
-
send('initialize', { protocolVersion: 1, clientInfo: { name: 'specrails-core', version: '1' }, clientCapabilities: { fs: { readTextFile:
|
|
163
|
+
send('initialize', { protocolVersion: 1, clientInfo: { name: 'specrails-core', version: '1' }, clientCapabilities: { fs: { readTextFile: readOnly, writeTextFile: readOnly }, terminal: readOnly } }, initialized => {
|
|
153
164
|
if (initialized.protocolVersion !== 1)
|
|
154
165
|
throw new AgentExecutionError('Kimi ACP protocol version is unsupported', 'provider_capability_unsupported');
|
|
155
166
|
const capabilities = record(record(initialized.agentCapabilities).sessionCapabilities);
|
|
156
167
|
if (tools.roots.length > 1 && capabilities.additionalDirectories === undefined)
|
|
157
168
|
throw new AgentExecutionError('This Kimi ACP version cannot expose multiple repositories. Upgrade Kimi or use another provider for this read-only role.', 'provider_capability_unsupported');
|
|
158
|
-
send('session/new', { cwd: tools.cwd, mcpServers: [], ...(tools.roots.length > 1 ? { additionalDirectories: tools.roots.filter(root => root !== tools.cwd) } : {}) }, session => {
|
|
169
|
+
send('session/new', { cwd: tools.cwd, mcpServers: options.openspecBridge ? [{ name: 'specrails_openspec', ...options.openspecBridge, env: [] }] : [], ...(tools.roots.length > 1 ? { additionalDirectories: tools.roots.filter(root => root !== tools.cwd) } : {}) }, session => {
|
|
159
170
|
if (typeof session.sessionId !== 'string' || !session.sessionId)
|
|
160
171
|
throw new AgentExecutionError('Kimi ACP returned no session id', 'invalid_response');
|
|
161
172
|
sessionId = session.sessionId;
|
|
@@ -163,7 +174,7 @@ export async function executeKimiReadonlyAcp(request, options = {}) {
|
|
|
163
174
|
const modeOption = Array.isArray(session.configOptions) ? session.configOptions.map(record).find(option => option.id === 'mode') : undefined;
|
|
164
175
|
const available = Array.isArray(modes.availableModes) ? modes.availableModes.map(record) : [];
|
|
165
176
|
const modeValues = Array.isArray(modeOption?.options) ? modeOption.options.map(record) : [];
|
|
166
|
-
if (!available.some(
|
|
177
|
+
if (!available.some(item => item.id === mode) && !modeValues.some(item => item.value === mode))
|
|
167
178
|
throw new AgentExecutionError('Kimi ACP does not expose enforced plan mode; upgrade Kimi Code before using a read-only role', 'provider_capability_unsupported');
|
|
168
179
|
selectMode();
|
|
169
180
|
});
|