specrails-core 5.2.2 → 5.3.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 +3 -0
- package/bin/specrails-core.mjs +5 -0
- package/dist/agent-runtime/cli-executor.d.ts +34 -0
- package/dist/agent-runtime/cli-executor.js +335 -0
- package/dist/agent-runtime/cli-executor.js.map +1 -0
- package/dist/agent-runtime/cli-process.d.ts +32 -0
- package/dist/agent-runtime/cli-process.js +159 -0
- package/dist/agent-runtime/cli-process.js.map +1 -0
- package/dist/agent-runtime/cli.d.ts +38 -0
- package/dist/agent-runtime/cli.js +168 -0
- package/dist/agent-runtime/cli.js.map +1 -0
- package/dist/agent-runtime/config.d.ts +7 -0
- package/dist/agent-runtime/config.js +162 -0
- package/dist/agent-runtime/config.js.map +1 -0
- package/dist/agent-runtime/core-host.d.ts +33 -0
- package/dist/agent-runtime/core-host.js +97 -0
- package/dist/agent-runtime/core-host.js.map +1 -0
- package/dist/agent-runtime/durable-store.d.ts +22 -0
- package/dist/agent-runtime/durable-store.js +205 -0
- package/dist/agent-runtime/durable-store.js.map +1 -0
- package/dist/agent-runtime/executor-types.d.ts +92 -0
- package/dist/agent-runtime/executor-types.js +29 -0
- package/dist/agent-runtime/executor-types.js.map +1 -0
- package/dist/agent-runtime/executors.d.ts +22 -0
- package/dist/agent-runtime/executors.js +44 -0
- package/dist/agent-runtime/executors.js.map +1 -0
- package/dist/agent-runtime/gemini-policy.d.ts +8 -0
- package/dist/agent-runtime/gemini-policy.js +36 -0
- package/dist/agent-runtime/gemini-policy.js.map +1 -0
- package/dist/agent-runtime/graph/artifacts.d.ts +40 -0
- package/dist/agent-runtime/graph/artifacts.js +179 -0
- package/dist/agent-runtime/graph/artifacts.js.map +1 -0
- package/dist/agent-runtime/graph/nodes.d.ts +36 -0
- package/dist/agent-runtime/graph/nodes.js +274 -0
- package/dist/agent-runtime/graph/nodes.js.map +1 -0
- package/dist/agent-runtime/graph/review-policy.d.ts +18 -0
- package/dist/agent-runtime/graph/review-policy.js +32 -0
- package/dist/agent-runtime/graph/review-policy.js.map +1 -0
- package/dist/agent-runtime/graph/roles.d.ts +44 -0
- package/dist/agent-runtime/graph/roles.js +126 -0
- package/dist/agent-runtime/graph/roles.js.map +1 -0
- package/dist/agent-runtime/graph/state.d.ts +75 -0
- package/dist/agent-runtime/graph/state.js +23 -0
- package/dist/agent-runtime/graph/state.js.map +1 -0
- package/dist/agent-runtime/graph-checkpointer.d.ts +61 -0
- package/dist/agent-runtime/graph-checkpointer.js +137 -0
- package/dist/agent-runtime/graph-checkpointer.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +14 -0
- package/dist/agent-runtime/index.js +15 -0
- package/dist/agent-runtime/index.js.map +1 -0
- package/dist/agent-runtime/kimi-acp.d.ts +7 -0
- package/dist/agent-runtime/kimi-acp.js +179 -0
- package/dist/agent-runtime/kimi-acp.js.map +1 -0
- package/dist/agent-runtime/openai-executor.d.ts +18 -0
- package/dist/agent-runtime/openai-executor.js +174 -0
- package/dist/agent-runtime/openai-executor.js.map +1 -0
- package/dist/agent-runtime/prompts.d.ts +40 -0
- package/dist/agent-runtime/prompts.js +291 -0
- package/dist/agent-runtime/prompts.js.map +1 -0
- package/dist/agent-runtime/workflow-types.d.ts +210 -0
- package/dist/agent-runtime/workflow-types.js +2 -0
- package/dist/agent-runtime/workflow-types.js.map +1 -0
- package/dist/agent-runtime/workflow.d.ts +17 -0
- package/dist/agent-runtime/workflow.js +609 -0
- package/dist/agent-runtime/workflow.js.map +1 -0
- package/dist/agent-runtime/workspace-tools.d.ts +25 -0
- package/dist/agent-runtime/workspace-tools.js +120 -0
- package/dist/agent-runtime/workspace-tools.js.map +1 -0
- package/dist/installer/cli.d.ts +35 -0
- package/dist/installer/cli.js +3 -0
- package/dist/installer/cli.js.map +1 -1
- package/dist/installer/commands/doctor.d.ts +27 -0
- package/dist/installer/commands/framework.d.ts +85 -0
- package/dist/installer/commands/init.d.ts +147 -0
- package/dist/installer/commands/update.d.ts +56 -0
- package/dist/installer/commands/v5-migration.d.ts +32 -0
- package/dist/installer/phases/framework-lifecycle.d.ts +53 -0
- package/dist/installer/phases/install-config.d.ts +64 -0
- package/dist/installer/phases/manifest.d.ts +45 -0
- package/dist/installer/phases/prereqs.d.ts +51 -0
- package/dist/installer/phases/provider-detect.d.ts +89 -0
- package/dist/installer/phases/scaffold.d.ts +211 -0
- package/dist/installer/runtime/kimi.d.ts +84 -0
- package/dist/installer/runtime/pipeline-state.d.ts +210 -0
- package/dist/installer/runtime/pipeline-state.js +107 -38
- package/dist/installer/runtime/pipeline-state.js.map +1 -1
- package/dist/installer/util/errors.d.ts +46 -0
- package/dist/installer/util/exec.d.ts +41 -0
- package/dist/installer/util/fs.d.ts +153 -0
- package/dist/installer/util/git.d.ts +44 -0
- package/dist/installer/util/install-transaction.d.ts +29 -0
- package/dist/installer/util/logger.d.ts +31 -0
- package/dist/installer/util/paths.d.ts +34 -0
- package/dist/installer/util/prompts.d.ts +23 -0
- package/dist/installer/util/registry.d.ts +174 -0
- package/dist/installer/util/template.d.ts +23 -0
- package/docs/README.md +1 -0
- package/docs/agent-runtime.md +268 -0
- package/integration-contract.json +79 -7
- package/package.json +16 -1
- package/schemas/agent-runtime.schema.json +55 -0
- package/templates/runtime/provider-pipeline.md +16 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { checkArchive, pipelineStateDirectory, transitionPipeline, validateVerificationRequest, } from '../../installer/runtime/pipeline-state.js';
|
|
5
|
+
export const SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
6
|
+
export function object(value) {
|
|
7
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
8
|
+
throw new Error('Expected a structured JSON object from agent');
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function markdown(value, name) {
|
|
12
|
+
if (typeof value !== 'string' || !value.trim() || value.length > 500_000)
|
|
13
|
+
throw new Error('Invalid agent field: ' + name);
|
|
14
|
+
return value.trim() + '\n';
|
|
15
|
+
}
|
|
16
|
+
/** Accepts the object wherever the model put it: bare, fenced, or surrounded by commentary. */
|
|
17
|
+
export function parseAgentObject(text) {
|
|
18
|
+
if (text.length > 2_000_000)
|
|
19
|
+
throw new Error('Structured agent response is too large');
|
|
20
|
+
const trimmed = text.trim();
|
|
21
|
+
const candidates = [trimmed, trimmed.replace(/^```(?:json)?\s*\n([\s\S]*?)\n```$/, '$1')];
|
|
22
|
+
const fenced = /```(?:json)?\s*\n([\s\S]*?)\n```/.exec(trimmed);
|
|
23
|
+
if (fenced)
|
|
24
|
+
candidates.push(fenced[1]);
|
|
25
|
+
const first = trimmed.indexOf('{'), last = trimmed.lastIndexOf('}');
|
|
26
|
+
if (first >= 0 && last > first)
|
|
27
|
+
candidates.push(trimmed.slice(first, last + 1));
|
|
28
|
+
let failure;
|
|
29
|
+
for (const candidate of candidates) {
|
|
30
|
+
try {
|
|
31
|
+
return object(JSON.parse(candidate));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
failure = error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw failure instanceof Error ? failure : new Error('Expected a structured JSON object from agent');
|
|
38
|
+
}
|
|
39
|
+
/** All generated paths are relative and reject symlink ancestors, including
|
|
40
|
+
* already-existing archive/spec directories. */
|
|
41
|
+
export function child(root, relative) {
|
|
42
|
+
const target = path.resolve(root, relative);
|
|
43
|
+
const rel = path.relative(root, target);
|
|
44
|
+
if (!rel || rel === '..' || rel.startsWith('..' + path.sep) || path.isAbsolute(rel))
|
|
45
|
+
throw new Error('Artifact path escapes repository');
|
|
46
|
+
let cursor = root;
|
|
47
|
+
for (const part of rel.split(path.sep)) {
|
|
48
|
+
cursor = path.join(cursor, part);
|
|
49
|
+
if (existsSync(cursor) && lstatSync(cursor).isSymbolicLink())
|
|
50
|
+
throw new Error('Refusing symlink artifact path: ' + relative);
|
|
51
|
+
}
|
|
52
|
+
return target;
|
|
53
|
+
}
|
|
54
|
+
export function write(file, content) {
|
|
55
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
56
|
+
const temp = file + '.' + randomUUID() + '.tmp';
|
|
57
|
+
try {
|
|
58
|
+
writeFileSync(temp, content, { flag: 'wx', mode: 0o600 });
|
|
59
|
+
renameSync(temp, file);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
rmSync(temp, { force: true });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function journal(context) {
|
|
66
|
+
return JSON.parse(readFileSync(path.join(pipelineStateDirectory(context), 'state.json'), 'utf8'));
|
|
67
|
+
}
|
|
68
|
+
/** Validates the architect's structured reply; throws `Invalid …` so the role gets one repair turn. */
|
|
69
|
+
export function parseArchitecture(raw) {
|
|
70
|
+
const proposal = markdown(raw.proposal, 'proposal');
|
|
71
|
+
const design = markdown(raw.design, 'design');
|
|
72
|
+
if (!['high', 'medium', 'low'].includes(String(raw.confidence)))
|
|
73
|
+
throw new Error('Invalid design confidence');
|
|
74
|
+
if (!Array.isArray(raw.tasks) || !raw.tasks.length || raw.tasks.length > 200)
|
|
75
|
+
throw new Error('Architecture requires 1–200 tasks');
|
|
76
|
+
const tasks = raw.tasks.map(task => {
|
|
77
|
+
const title = object(task).title;
|
|
78
|
+
if (typeof title !== 'string' || !title.trim() || /[\r\n]/.test(title) || title.length > 1000)
|
|
79
|
+
throw new Error('Invalid task title');
|
|
80
|
+
return title.trim();
|
|
81
|
+
});
|
|
82
|
+
if (!Array.isArray(raw.specs) || !raw.specs.length || raw.specs.length > 100)
|
|
83
|
+
throw new Error('Architecture requires 1–100 specifications');
|
|
84
|
+
const specs = raw.specs.map((item) => {
|
|
85
|
+
const spec = object(item);
|
|
86
|
+
if (typeof spec.name !== 'string' || !SLUG.test(spec.name) || spec.name.length > 100)
|
|
87
|
+
throw new Error('Invalid specification name');
|
|
88
|
+
return { name: spec.name, content: markdown(spec.content, 'spec.content') };
|
|
89
|
+
});
|
|
90
|
+
if (new Set(specs.map(s => s.name)).size !== specs.length)
|
|
91
|
+
throw new Error('Duplicate specification names');
|
|
92
|
+
if (raw.question !== undefined && raw.question !== null && (typeof raw.question !== 'string' || raw.question.length > 4000))
|
|
93
|
+
throw new Error('Invalid architect question');
|
|
94
|
+
const question = typeof raw.question === 'string' && raw.question.trim() ? raw.question.trim() : undefined;
|
|
95
|
+
return { proposal, design, tasks, specs, confidence: raw.confidence, ...(question ? { question } : {}), verification: raw.verification };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Writes the reviewed architecture artifacts. A low-confidence design that the
|
|
99
|
+
* project chose to proceed with is recorded as `medium` (the contract for a
|
|
100
|
+
* design resting on one named assumption) with its provenance kept alongside,
|
|
101
|
+
* because Core's design gate admits only high or medium confidence.
|
|
102
|
+
*/
|
|
103
|
+
export function writeArchitecture(context, change, architecture, options = {}) {
|
|
104
|
+
const tasks = architecture.tasks.map((title, i) => '- [ ] ' + (i + 1) + '. ' + title).join('\n') + '\n';
|
|
105
|
+
const prefix = 'openspec/changes/' + change + '/';
|
|
106
|
+
const confidence = options.assumed && architecture.confidence === 'low'
|
|
107
|
+
? { confidence: 'medium', assumed: true, reportedConfidence: 'low', ...(architecture.question ? { question: architecture.question } : {}) }
|
|
108
|
+
: { confidence: architecture.confidence, ...(architecture.question ? { question: architecture.question } : {}) };
|
|
109
|
+
const files = [
|
|
110
|
+
['proposal.md', architecture.proposal], ['design.md', architecture.design], ['tasks.md', tasks],
|
|
111
|
+
['design-confidence.json', JSON.stringify(confidence, null, 2) + '\n'],
|
|
112
|
+
...architecture.specs.map(s => ['specs/' + s.name + '/spec.md', s.content]),
|
|
113
|
+
];
|
|
114
|
+
// Validate every destination before the first write.
|
|
115
|
+
const targets = files.map(([name, content]) => [child(context.artifactRoot, prefix + name), content]);
|
|
116
|
+
for (const [target, content] of targets)
|
|
117
|
+
write(target, content);
|
|
118
|
+
}
|
|
119
|
+
/** Commands the architect proposed for repositories the configuration leaves uncovered. */
|
|
120
|
+
export function proposedVerification(context, configured, verification) {
|
|
121
|
+
if (verification === undefined || verification === null)
|
|
122
|
+
return [];
|
|
123
|
+
if (!Array.isArray(verification) || verification.length > 100)
|
|
124
|
+
throw new Error('Invalid proposed verification commands');
|
|
125
|
+
const covered = new Set(configured.map(command => command.repositoryId));
|
|
126
|
+
const proposed = verification.map(item => {
|
|
127
|
+
const command = object(item);
|
|
128
|
+
if (typeof command.repositoryId !== 'string' || typeof command.command !== 'string' || !command.command.trim() || !Array.isArray(command.args) || !command.args.every(arg => typeof arg === 'string'))
|
|
129
|
+
throw new Error('Invalid proposed verification command');
|
|
130
|
+
return { repositoryId: command.repositoryId, command: command.command, args: command.args, ...(typeof command.cwd === 'string' && command.cwd ? { cwd: command.cwd } : {}) };
|
|
131
|
+
}).filter(command => !covered.has(command.repositoryId) && context.repositories.some(repository => repository.id === command.repositoryId));
|
|
132
|
+
if (proposed.length)
|
|
133
|
+
validateVerificationRequest(context, { kind: 'scoped', commands: proposed });
|
|
134
|
+
return proposed;
|
|
135
|
+
}
|
|
136
|
+
export function openTasks(context, change) {
|
|
137
|
+
const file = child(context.artifactRoot, 'openspec/changes/' + change + '/tasks.md');
|
|
138
|
+
if (!existsSync(file))
|
|
139
|
+
return [];
|
|
140
|
+
return readFileSync(file, 'utf8').split(/\r?\n/).filter(line => /^\s*-\s+\[ \]/.test(line)).map(line => line.replace(/^\s*-\s+\[ \]\s*/, '').trim()).slice(0, 50);
|
|
141
|
+
}
|
|
142
|
+
/** Archive is deterministic and replayable only with explicit write recovery.
|
|
143
|
+
* The reviewed specification documents are complete replacements, not deltas. */
|
|
144
|
+
export function archive(context, change) {
|
|
145
|
+
const state = journal(context);
|
|
146
|
+
if (state.phases.archive.status !== 'done') {
|
|
147
|
+
const active = child(context.artifactRoot, 'openspec/changes/' + change);
|
|
148
|
+
if (existsSync(active)) {
|
|
149
|
+
checkArchive(context);
|
|
150
|
+
transitionPipeline(context, 'archive', 'running');
|
|
151
|
+
const specsDir = child(context.artifactRoot, 'openspec/changes/' + change + '/specs');
|
|
152
|
+
const specs = readdirSync(specsDir, { withFileTypes: true }).filter(item => item.isDirectory());
|
|
153
|
+
const writes = specs.map(spec => {
|
|
154
|
+
if (!SLUG.test(spec.name))
|
|
155
|
+
throw new Error('Invalid archived specification name');
|
|
156
|
+
return [child(context.artifactRoot, 'openspec/specs/' + spec.name + '/spec.md'), readFileSync(child(context.artifactRoot, 'openspec/changes/' + change + '/specs/' + spec.name + '/spec.md'), 'utf8')];
|
|
157
|
+
});
|
|
158
|
+
const destination = child(context.artifactRoot, 'openspec/changes/archive/' + state.createdAt.slice(0, 10) + '-' + change);
|
|
159
|
+
if (existsSync(destination))
|
|
160
|
+
throw new Error('Archive destination already exists');
|
|
161
|
+
for (const [file, content] of writes)
|
|
162
|
+
write(file, content);
|
|
163
|
+
mkdirSync(path.dirname(destination), { recursive: true });
|
|
164
|
+
renameSync(active, destination);
|
|
165
|
+
}
|
|
166
|
+
// If the process died after rename, Core rechecks the saved archive approval.
|
|
167
|
+
transitionPipeline(context, 'archive', 'done');
|
|
168
|
+
}
|
|
169
|
+
// A crash can also occur after Core's archive receipt but before these host
|
|
170
|
+
// ownership markers. Reconcile them when repeating the interrupted step.
|
|
171
|
+
if (context.ownership.git === 'host') {
|
|
172
|
+
const current = journal(context);
|
|
173
|
+
if (current.phases.ship.status !== 'skipped')
|
|
174
|
+
transitionPipeline(context, 'ship', 'skipped');
|
|
175
|
+
if (current.phases.ci.status !== 'skipped')
|
|
176
|
+
transitionPipeline(context, 'ci', 'skipped');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AcceptanceReport, type PipelineContext } from '../../installer/runtime/pipeline-state.js';
|
|
2
|
+
import type { AgentResult, AgentRole, RuntimeConfig } from '../executor-types.js';
|
|
3
|
+
import { type FrozenCriterion } from '../prompts.js';
|
|
4
|
+
import type { WorkflowNode, WorkflowState } from '../workflow-types.js';
|
|
5
|
+
import { type ReviewPolicy } from './review-policy.js';
|
|
6
|
+
import type { RoleInvoker } from './roles.js';
|
|
7
|
+
import type { CoreNodeId, CoreStateType, DeveloperRecord, VerificationRecord } from './state.js';
|
|
8
|
+
/** Autonomous investigation passes before a low-confidence design asks or proceeds. */
|
|
9
|
+
export declare const MAX_DEEPEN_PASSES = 1;
|
|
10
|
+
export interface CoreNodeDeps {
|
|
11
|
+
context: PipelineContext;
|
|
12
|
+
config: RuntimeConfig;
|
|
13
|
+
change: string;
|
|
14
|
+
/** Development visits allowed per invocation, including correction cycles. */
|
|
15
|
+
attempts: number;
|
|
16
|
+
policy: ReviewPolicy;
|
|
17
|
+
invoke: RoleInvoker;
|
|
18
|
+
/** Host-facing narration of what the runtime did with a role's reply. */
|
|
19
|
+
note(role: AgentRole, text: string): void;
|
|
20
|
+
onVerificationOutput?: (text: string) => void;
|
|
21
|
+
}
|
|
22
|
+
type CoreNode = WorkflowNode<CoreStateType>;
|
|
23
|
+
/** Attempts count from the latest explicit resume: a human continuing a blocked run grants a fresh budget. */
|
|
24
|
+
export declare function developerVisitsSinceResume(checkpoint: WorkflowState): number;
|
|
25
|
+
/** The developer's structured summary, or an honest prose record when the provider returned text. */
|
|
26
|
+
export declare function developerRecord(output: Record<string, unknown> | undefined, text: string, result: AgentResult, provider: string): DeveloperRecord;
|
|
27
|
+
/**
|
|
28
|
+
* The acceptance report Core records for the reviewer: the frozen criteria the
|
|
29
|
+
* reviewer certified by coordinates, the verification commands Core actually ran
|
|
30
|
+
* as required checks, repositories admitted without a check as unavailable ones,
|
|
31
|
+
* and the reviewer's own inspections as supplementary evidence.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildAcceptanceReport(criteria: FrozenCriterion[], verification: VerificationRecord | null, raw: unknown): AcceptanceReport;
|
|
34
|
+
/** The five Core phases as LangGraph nodes. Declaration order defines "downstream" for invalidation. */
|
|
35
|
+
export declare function coreNodes(deps: CoreNodeDeps): Record<CoreNodeId, CoreNode>;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { fingerprintCandidate, frozenAcceptanceCriteria, recordAcceptance, transitionPipeline, validateAcceptanceReport, verifyPipeline, } from '../../installer/runtime/pipeline-state.js';
|
|
2
|
+
import { ARCHITECT_OUTPUT_SCHEMA, DEVELOPER_OUTPUT_SCHEMA, REVIEW_OUTPUT_SCHEMA, correctionInstructions, deepenInstructions, roleInstructions } from '../prompts.js';
|
|
3
|
+
import { archive, child, journal, object, openTasks, parseArchitecture, proposedVerification, write, writeArchitecture } from './artifacts.js';
|
|
4
|
+
import { evaluateReview } from './review-policy.js';
|
|
5
|
+
/** Autonomous investigation passes before a low-confidence design asks or proceeds. */
|
|
6
|
+
export const MAX_DEEPEN_PASSES = 1;
|
|
7
|
+
const DEVELOPER_SUMMARY_LIMIT = 32_000;
|
|
8
|
+
/** Deterministic steps spend nothing; provider spend is reported by the role invoker as it happens. */
|
|
9
|
+
const NO_SPEND = { costUsd: 0, inputTokens: 0, outputTokens: 0 };
|
|
10
|
+
function failed(error) { return { status: 'failed', error }; }
|
|
11
|
+
function plural(count, noun) { return `${count} ${noun}${count === 1 ? '' : 's'}`; }
|
|
12
|
+
function feedbackFor(state) {
|
|
13
|
+
return { verification: state.verifyResult, review: state.review };
|
|
14
|
+
}
|
|
15
|
+
/** Attempts count from the latest explicit resume: a human continuing a blocked run grants a fresh budget. */
|
|
16
|
+
export function developerVisitsSinceResume(checkpoint) {
|
|
17
|
+
const resumed = [...checkpoint.events].reverse().find(event => event.type === 'workflow_resumed');
|
|
18
|
+
return checkpoint.history.filter(attempt => attempt.stepId === 'developer' && (!resumed || attempt.startedAt >= resumed.timestamp)).length;
|
|
19
|
+
}
|
|
20
|
+
function uncoveredRepositories(context, plan) {
|
|
21
|
+
return context.repositories.filter(repository => !plan.some(command => command.repositoryId === repository.id)).map(repository => repository.id);
|
|
22
|
+
}
|
|
23
|
+
function strings(value, limit) {
|
|
24
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string' && item.trim().length > 0).map(item => item.trim().slice(0, 1000)).slice(0, limit) : [];
|
|
25
|
+
}
|
|
26
|
+
/** The developer's structured summary, or an honest prose record when the provider returned text. */
|
|
27
|
+
export function developerRecord(output, text, result, provider) {
|
|
28
|
+
const base = { provider, ...(result.sessionId ? { sessionId: result.sessionId } : {}) };
|
|
29
|
+
if (!output || typeof output.summary !== 'string' || !output.summary.trim()) {
|
|
30
|
+
return { ...base, summary: text.slice(-DEVELOPER_SUMMARY_LIMIT), files: [], tests: [], incomplete: [], structured: false };
|
|
31
|
+
}
|
|
32
|
+
const incomplete = Array.isArray(output.incomplete) ? output.incomplete.flatMap(item => {
|
|
33
|
+
const entry = item && typeof item === 'object' && !Array.isArray(item) ? item : undefined;
|
|
34
|
+
return entry && typeof entry.task === 'string' && entry.task.trim() ? [{ task: entry.task.trim().slice(0, 1000), reason: typeof entry.reason === 'string' ? entry.reason.trim().slice(0, 2000) : '' }] : [];
|
|
35
|
+
}).slice(0, 200) : [];
|
|
36
|
+
return {
|
|
37
|
+
...base, structured: true,
|
|
38
|
+
summary: output.summary.trim().slice(-DEVELOPER_SUMMARY_LIMIT),
|
|
39
|
+
files: strings(output.files, 500), tests: strings(output.tests, 500),
|
|
40
|
+
...(typeof output.verification === 'string' && output.verification.trim() ? { verification: output.verification.trim().slice(0, 4000) } : {}),
|
|
41
|
+
incomplete,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function architectNode(deps) {
|
|
45
|
+
const { context, config, change, invoke, note } = deps;
|
|
46
|
+
const accept = (output) => {
|
|
47
|
+
const architecture = parseArchitecture(object(output));
|
|
48
|
+
// Malformed proposals are repaired inside the same session, like any other structural defect.
|
|
49
|
+
proposedVerification(context, config.verification, architecture.verification);
|
|
50
|
+
return architecture;
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
effect: 'write', ends: ['developer'],
|
|
54
|
+
async run(state, step) {
|
|
55
|
+
transitionPipeline(context, 'architect', 'running');
|
|
56
|
+
// A resumed node collects the requester's answer first, so the pass that
|
|
57
|
+
// asked the question is never repeated.
|
|
58
|
+
const answers = [...state.answers];
|
|
59
|
+
const fresh = [];
|
|
60
|
+
if (step.pending?.kind === 'question') {
|
|
61
|
+
const reply = step.interrupt(step.pending);
|
|
62
|
+
answers.push(reply.answer);
|
|
63
|
+
fresh.push(reply.answer);
|
|
64
|
+
note('architect', 'Continuing the architecture with the answer to the blocking question.');
|
|
65
|
+
}
|
|
66
|
+
const prompt = roleInstructions('architect', context, change, { verification: config.verification, answers });
|
|
67
|
+
const first = await invoke('architect', step, { prompt, structured: true, outputSchema: ARCHITECT_OUTPUT_SCHEMA }, accept);
|
|
68
|
+
if (!first.ok)
|
|
69
|
+
return failed(first.error);
|
|
70
|
+
let architecture = first.value;
|
|
71
|
+
let passes = state.deepenPasses;
|
|
72
|
+
if (architecture.confidence === 'low' && passes < MAX_DEEPEN_PASSES && first.result.sessionId) {
|
|
73
|
+
passes += 1;
|
|
74
|
+
note('architect', `Design confidence is low${architecture.question ? ` (${architecture.question})` : ''}; asking the architect to investigate the code further before deciding.`);
|
|
75
|
+
const second = await invoke('architect', step, { prompt: deepenInstructions(architecture.question), structured: true, outputSchema: ARCHITECT_OUTPUT_SCHEMA, resumeSessionId: first.result.sessionId }, accept);
|
|
76
|
+
if (second.ok)
|
|
77
|
+
architecture = second.value;
|
|
78
|
+
else
|
|
79
|
+
note('architect', `The investigation pass could not be used (${second.error}); keeping the first design.`);
|
|
80
|
+
}
|
|
81
|
+
let assumed = false;
|
|
82
|
+
if (architecture.confidence === 'low') {
|
|
83
|
+
const question = architecture.question ?? 'The architect could not choose between several plausible designs; inspect proposal.md and state the intended behavior.';
|
|
84
|
+
if ((config.architect?.onLowConfidence ?? 'ask') === 'ask') {
|
|
85
|
+
// The draft artifacts are written first so the requester can read the
|
|
86
|
+
// proposal while answering; the resumed pass replaces them.
|
|
87
|
+
writeArchitecture(context, change, architecture);
|
|
88
|
+
transitionPipeline(context, 'architect', 'blocked', 'Design confidence is low');
|
|
89
|
+
note('architect', 'Design confidence is still low; pausing until the blocking question is answered.');
|
|
90
|
+
step.interrupt({ kind: 'question', question });
|
|
91
|
+
}
|
|
92
|
+
assumed = true;
|
|
93
|
+
note('architect', 'Design confidence is still low; proceeding on the stated assumptions because architect.onLowConfidence is "proceed".');
|
|
94
|
+
}
|
|
95
|
+
const proposed = proposedVerification(context, config.verification, architecture.verification);
|
|
96
|
+
writeArchitecture(context, change, architecture, { assumed });
|
|
97
|
+
const plan = [...config.verification, ...proposed];
|
|
98
|
+
const uncovered = uncoveredRepositories(context, plan);
|
|
99
|
+
transitionPipeline(context, 'architect', 'done');
|
|
100
|
+
note('architect', `Architecture written: ${plural(architecture.tasks.length, 'task')}, spec${architecture.specs.length === 1 ? '' : 's'} ${architecture.specs.map(spec => spec.name).join(', ')}, confidence ${architecture.confidence}.`
|
|
101
|
+
+ (proposed.length ? ` Verification proposed by the architect: ${proposed.map(command => [command.command, ...command.args].join(' ')).join('; ')}.` : '')
|
|
102
|
+
+ (uncovered.length ? ` No verification command for ${uncovered.join(', ')}; the reviewer will inspect that work without automated checks.` : ''));
|
|
103
|
+
const record = {
|
|
104
|
+
change, tasks: architecture.tasks.length, specs: architecture.specs.map(spec => spec.name), confidence: architecture.confidence,
|
|
105
|
+
...(architecture.question ? { question: architecture.question } : {}), ...(assumed ? { assumed: true } : {}),
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
status: 'succeeded', next: 'developer',
|
|
109
|
+
update: { plan, unverifiedRepositories: uncovered, architecture: record, answers: fresh, deepenPasses: passes },
|
|
110
|
+
output: { change, verification: plan, unverifiedRepositories: uncovered, confidence: architecture.confidence, assumed, deepenPasses: passes },
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function developerNode(deps) {
|
|
116
|
+
const { context, config, change, invoke, note } = deps;
|
|
117
|
+
return {
|
|
118
|
+
effect: 'write', ends: ['verify'],
|
|
119
|
+
async run(state, step) {
|
|
120
|
+
if (developerVisitsSinceResume(step.checkpoint) > deps.attempts) {
|
|
121
|
+
return { status: 'blocked', error: 'Implementation correction limit reached; inspect the feedback in the log and resume to grant more attempts', usage: NO_SPEND };
|
|
122
|
+
}
|
|
123
|
+
transitionPipeline(context, 'developer', 'running');
|
|
124
|
+
const feedback = feedbackFor(state);
|
|
125
|
+
const provider = config.agents.developer.provider;
|
|
126
|
+
const full = roleInstructions('developer', context, change, { feedback, verification: state.plan });
|
|
127
|
+
const previous = state.development;
|
|
128
|
+
const resumable = previous?.sessionId !== undefined && previous.provider === provider && developerVisitsSinceResume(step.checkpoint) > 1;
|
|
129
|
+
const outcome = await invoke('developer', step, {
|
|
130
|
+
...(resumable
|
|
131
|
+
? { prompt: correctionInstructions('developer', feedback), resumeSessionId: previous.sessionId, fallbackPrompt: full }
|
|
132
|
+
: { prompt: full }),
|
|
133
|
+
structured: true, lenient: true, outputSchema: DEVELOPER_OUTPUT_SCHEMA,
|
|
134
|
+
}, (output, text, result) => developerRecord(output, text, result, provider));
|
|
135
|
+
if (!outcome.ok)
|
|
136
|
+
return failed(outcome.error);
|
|
137
|
+
const record = outcome.value;
|
|
138
|
+
note('developer', record.structured
|
|
139
|
+
? `Developer finished: ${plural(record.files.length, 'file')} changed, ${plural(record.tests.length, 'test file')} touched${record.incomplete.length ? `, ${plural(record.incomplete.length, 'task')} left incomplete` : ''}.`
|
|
140
|
+
: 'Developer finished without the structured summary; the prose summary is recorded instead.');
|
|
141
|
+
return {
|
|
142
|
+
status: 'succeeded', next: 'verify', update: { development: record },
|
|
143
|
+
output: { summary: record.summary, provider, ...(record.sessionId ? { sessionId: record.sessionId } : {}), files: record.files, tests: record.tests, incomplete: record.incomplete, structured: record.structured },
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function verifyNode(deps) {
|
|
149
|
+
const { context, change, note } = deps;
|
|
150
|
+
return {
|
|
151
|
+
effect: 'write', ends: ['reviewer', 'developer'],
|
|
152
|
+
async run(state, step) {
|
|
153
|
+
// Unchecked tasks are developer feedback, not a workflow failure: the
|
|
154
|
+
// developer sees exactly which tasks remain and continues its session.
|
|
155
|
+
const open = openTasks(context, change);
|
|
156
|
+
if (open.length) {
|
|
157
|
+
note('developer', `Verification skipped: ${plural(open.length, 'task')} still unchecked in tasks.md; returning to the developer.`);
|
|
158
|
+
const evidence = { valid: false, reason: 'Required implementation tasks remain unchecked in tasks.md', incompleteTasks: open, unverifiedRepositories: [], commands: [] };
|
|
159
|
+
return { status: 'succeeded', next: 'developer', update: { verifyResult: evidence }, output: evidence, usage: NO_SPEND };
|
|
160
|
+
}
|
|
161
|
+
const plan = state.plan;
|
|
162
|
+
const uncovered = uncoveredRepositories(context, plan);
|
|
163
|
+
const receipt = await verifyPipeline(context, { kind: 'full', commands: plan, ...(uncovered.length ? { unverified: true } : {}) }, deps.onVerificationOutput, step.signal);
|
|
164
|
+
const evidence = {
|
|
165
|
+
valid: receipt.valid, ...(receipt.reason ? { reason: receipt.reason } : {}), receiptId: receipt.id, unverifiedRepositories: uncovered,
|
|
166
|
+
commands: receipt.commands.map(({ repositoryId, command, args, exitCode, output }) => ({ repositoryId, command, args, exitCode, output })),
|
|
167
|
+
};
|
|
168
|
+
if (!receipt.valid) {
|
|
169
|
+
note('developer', `Verification failed (${receipt.reason ?? 'a command failed'}); returning to the developer with the exact output.`);
|
|
170
|
+
return { status: 'succeeded', next: 'developer', update: { verifyResult: evidence }, output: evidence, usage: NO_SPEND };
|
|
171
|
+
}
|
|
172
|
+
transitionPipeline(context, 'developer', 'done');
|
|
173
|
+
note('developer', plan.length ? `Verification passed: ${plural(plan.length, 'command')} exited 0.` : 'No verification commands available; relying on task completion and review.');
|
|
174
|
+
return { status: 'succeeded', next: 'reviewer', update: { verifyResult: evidence }, output: evidence, usage: NO_SPEND };
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The acceptance report Core records for the reviewer: the frozen criteria the
|
|
180
|
+
* reviewer certified by coordinates, the verification commands Core actually ran
|
|
181
|
+
* as required checks, repositories admitted without a check as unavailable ones,
|
|
182
|
+
* and the reviewer's own inspections as supplementary evidence.
|
|
183
|
+
*/
|
|
184
|
+
export function buildAcceptanceReport(criteria, verification, raw) {
|
|
185
|
+
const input = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
186
|
+
const rows = Array.isArray(input.criteria) ? input.criteria.map(item => object(item)) : [];
|
|
187
|
+
const certified = criteria.map((item) => {
|
|
188
|
+
const row = rows.find(candidate => String(candidate.specId) === item.specId && candidate.criterionIndex === item.criterionIndex);
|
|
189
|
+
if (!row)
|
|
190
|
+
throw new Error(`Invalid acceptance report: criterion ${item.specId}#${item.criterionIndex} was not certified`);
|
|
191
|
+
return { ...item, status: row.status, evidence: row.evidence, ...(row.exception !== undefined ? { exception: row.exception } : {}) };
|
|
192
|
+
});
|
|
193
|
+
const checks = [];
|
|
194
|
+
for (const command of verification?.commands ?? []) {
|
|
195
|
+
checks.push({
|
|
196
|
+
name: `${command.repositoryId}: ${[command.command, ...command.args].join(' ')}`,
|
|
197
|
+
status: command.exitCode === 0 ? 'passed' : 'failed', required: true,
|
|
198
|
+
evidence: [`Verification receipt ${verification?.receiptId ?? 'unknown'}: exit code ${String(command.exitCode)}`],
|
|
199
|
+
scope: `Core ran the repository's own verification command in ${command.repositoryId} after the developer finished.`,
|
|
200
|
+
limitations: 'Proves only what this command exercises; behavior outside its tests, other repositories and manual scenarios are not covered.',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
for (const repositoryId of verification?.unverifiedRepositories ?? []) {
|
|
204
|
+
checks.push({
|
|
205
|
+
name: `automated verification for ${repositoryId}`, status: 'unavailable', required: false,
|
|
206
|
+
evidence: ['No verification command was configured by the host or proposed by the architect for this repository.'],
|
|
207
|
+
scope: 'No automated check ran for this repository.', limitations: 'Acceptance relies on reviewer inspection alone for this repository.',
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Reviewer inspections are evidence, never gates: only Core's own subprocess receipts are required checks.
|
|
211
|
+
for (const item of Array.isArray(input.checks) ? input.checks : [])
|
|
212
|
+
checks.push({ ...object(item), required: false });
|
|
213
|
+
return { criteria: certified, checks, findings: (Array.isArray(input.findings) ? input.findings : []) };
|
|
214
|
+
}
|
|
215
|
+
function reviewerNode(deps) {
|
|
216
|
+
const { context, change, invoke, note, policy } = deps;
|
|
217
|
+
const criteria = frozenAcceptanceCriteria(context);
|
|
218
|
+
return {
|
|
219
|
+
effect: 'write', ends: ['archive', 'developer'],
|
|
220
|
+
async run(state, step) {
|
|
221
|
+
transitionPipeline(context, 'reviewer', 'running');
|
|
222
|
+
const prompt = roleInstructions('reviewer', context, change, { feedback: feedbackFor(state), verification: state.plan, policy, criteria, developer: state.development });
|
|
223
|
+
const outcome = await invoke('reviewer', step, { prompt, structured: true, outputSchema: REVIEW_OUTPUT_SCHEMA }, output => {
|
|
224
|
+
const raw = object(output);
|
|
225
|
+
const review = evaluateReview(raw, policy);
|
|
226
|
+
const report = buildAcceptanceReport(criteria, state.verifyResult, raw.acceptance);
|
|
227
|
+
try {
|
|
228
|
+
validateAcceptanceReport(context, report);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
throw new Error('Invalid acceptance report: ' + (error instanceof Error ? error.message : String(error)));
|
|
232
|
+
}
|
|
233
|
+
return { ...review, report };
|
|
234
|
+
});
|
|
235
|
+
if (!outcome.ok)
|
|
236
|
+
return failed(outcome.error);
|
|
237
|
+
const { record, approved, report } = outcome.value;
|
|
238
|
+
// Acceptance evidence is bound to the exact candidate before the reviewer verdict is recorded.
|
|
239
|
+
recordAcceptance(context, report);
|
|
240
|
+
if (!approved) {
|
|
241
|
+
transitionPipeline(context, 'reviewer', 'blocked', 'Review requests corrections');
|
|
242
|
+
note('reviewer', `Review requested corrections (score ${record.score}, ${plural(record.issues.length, 'issue')}); returning to the developer.`);
|
|
243
|
+
return { status: 'succeeded', next: 'developer', update: { review: record }, output: record };
|
|
244
|
+
}
|
|
245
|
+
write(child(context.artifactRoot, 'openspec/changes/' + change + '/confidence-score.json'), JSON.stringify({ change, overall: record.score, aspects: record.aspects, summary: record.summary }, null, 2) + '\n');
|
|
246
|
+
transitionPipeline(context, 'reviewer', 'done');
|
|
247
|
+
note('reviewer', `Review approved with score ${record.score}: ${record.summary}`);
|
|
248
|
+
const reviewed = { ...record, candidateHash: fingerprintCandidate(journal(context)) };
|
|
249
|
+
return { status: 'succeeded', next: 'archive', update: { review: reviewed }, output: reviewed };
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function archiveNode(deps) {
|
|
254
|
+
const { context, config, change } = deps;
|
|
255
|
+
return {
|
|
256
|
+
effect: 'write', ends: [],
|
|
257
|
+
async run(_state, step) {
|
|
258
|
+
if (journal(context).phases.archive.status !== 'done' && config.approvalBeforeArchive) {
|
|
259
|
+
// Pauses until the host grants the approval; a resumed node passes straight
|
|
260
|
+
// through. The pause itself spends nothing, and says so.
|
|
261
|
+
step.reportUsage(NO_SPEND);
|
|
262
|
+
step.interrupt({ kind: 'approval', reason: 'Approve archive after inspecting the verified implementation' });
|
|
263
|
+
}
|
|
264
|
+
archive(context, change);
|
|
265
|
+
const record = { archivePath: journal(context).archivePath, deliveryOwner: context.ownership.git };
|
|
266
|
+
return { status: 'succeeded', next: null, update: { archived: record }, output: record, usage: NO_SPEND };
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/** The five Core phases as LangGraph nodes. Declaration order defines "downstream" for invalidation. */
|
|
271
|
+
export function coreNodes(deps) {
|
|
272
|
+
return { architect: architectNode(deps), developer: developerNode(deps), verify: verifyNode(deps), reviewer: reviewerNode(deps), archive: archiveNode(deps) };
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RuntimeConfig } from '../executor-types.js';
|
|
2
|
+
import type { ReviewRecord } from './state.js';
|
|
3
|
+
export declare const REVIEW_ASPECTS: readonly ["type_correctness", "pattern_adherence", "test_coverage", "security", "architectural_alignment"];
|
|
4
|
+
export type ReviewAspect = typeof REVIEW_ASPECTS[number];
|
|
5
|
+
export interface ReviewPolicy {
|
|
6
|
+
/** Minimum overall score for approval, 0–100. */
|
|
7
|
+
minScore: number;
|
|
8
|
+
/** Minimum per-aspect score for approval, 0–100. */
|
|
9
|
+
aspects: Record<ReviewAspect, number>;
|
|
10
|
+
}
|
|
11
|
+
export declare const DEFAULT_REVIEW_POLICY: ReviewPolicy;
|
|
12
|
+
/** Project thresholds override the defaults per field; unset fields keep the default gate. */
|
|
13
|
+
export declare function resolveReviewPolicy(config: Pick<RuntimeConfig, 'review'>): ReviewPolicy;
|
|
14
|
+
/** Validates the reviewer's structured reply and applies the gate. Throws `Invalid …` for a malformed reply. */
|
|
15
|
+
export declare function evaluateReview(raw: Record<string, unknown>, policy: ReviewPolicy): {
|
|
16
|
+
record: ReviewRecord;
|
|
17
|
+
approved: boolean;
|
|
18
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { object } from './artifacts.js';
|
|
2
|
+
export const REVIEW_ASPECTS = ['type_correctness', 'pattern_adherence', 'test_coverage', 'security', 'architectural_alignment'];
|
|
3
|
+
export const DEFAULT_REVIEW_POLICY = {
|
|
4
|
+
minScore: 70,
|
|
5
|
+
aspects: { type_correctness: 60, pattern_adherence: 60, test_coverage: 60, security: 75, architectural_alignment: 60 },
|
|
6
|
+
};
|
|
7
|
+
/** Project thresholds override the defaults per field; unset fields keep the default gate. */
|
|
8
|
+
export function resolveReviewPolicy(config) {
|
|
9
|
+
return {
|
|
10
|
+
minScore: config.review?.minScore ?? DEFAULT_REVIEW_POLICY.minScore,
|
|
11
|
+
aspects: { ...DEFAULT_REVIEW_POLICY.aspects, ...(config.review?.aspects ?? {}) },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Validates the reviewer's structured reply and applies the gate. Throws `Invalid …` for a malformed reply. */
|
|
15
|
+
export function evaluateReview(raw, policy) {
|
|
16
|
+
if (typeof raw.approved !== 'boolean' || typeof raw.summary !== 'string'
|
|
17
|
+
|| !Array.isArray(raw.issues) || !raw.issues.every(item => typeof item === 'string')
|
|
18
|
+
|| typeof raw.score !== 'number' || !Number.isFinite(raw.score) || raw.score < 0 || raw.score > 100)
|
|
19
|
+
throw new Error('Invalid structured review');
|
|
20
|
+
const aspects = object(raw.aspects);
|
|
21
|
+
const scored = {};
|
|
22
|
+
for (const name of REVIEW_ASPECTS) {
|
|
23
|
+
const value = aspects[name];
|
|
24
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 100)
|
|
25
|
+
throw new Error('Invalid review aspect: ' + name);
|
|
26
|
+
scored[name] = value;
|
|
27
|
+
}
|
|
28
|
+
const approved = raw.approved && raw.issues.length === 0 && raw.score >= policy.minScore
|
|
29
|
+
&& REVIEW_ASPECTS.every(name => scored[name] >= policy.aspects[name]);
|
|
30
|
+
return { record: { approved: raw.approved, summary: raw.summary, issues: raw.issues, score: raw.score, aspects: scored }, approved };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=review-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-policy.js","sourceRoot":"","sources":["../../../src/agent-runtime/graph/review-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAGvC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,yBAAyB,CAAU,CAAA;AAQxI,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,uBAAuB,EAAE,EAAE,EAAE;CACvH,CAAA;AAED,8FAA8F;AAC9F,MAAM,UAAU,mBAAmB,CAAC,MAAqC;IACvE,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,qBAAqB,CAAC,QAAQ;QACnE,OAAO,EAAE,EAAE,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE;KACjF,CAAA;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,cAAc,CAAC,GAA4B,EAAE,MAAoB;IAC/E,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;WACnE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;WACjF,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACnJ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;QACvI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IACtB,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ;WACnF,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACxE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAA;AAClJ,CAAC"}
|