specrails-core 5.2.3 → 5.4.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/capabilities.d.ts +27 -0
- package/dist/agent-runtime/capabilities.js +73 -0
- package/dist/agent-runtime/capabilities.js.map +1 -0
- package/dist/agent-runtime/cli-executor.d.ts +43 -0
- package/dist/agent-runtime/cli-executor.js +405 -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 +39 -0
- package/dist/agent-runtime/cli.js +216 -0
- package/dist/agent-runtime/cli.js.map +1 -0
- 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/config.d.ts +11 -0
- package/dist/agent-runtime/config.js +263 -0
- package/dist/agent-runtime/config.js.map +1 -0
- package/dist/agent-runtime/core-host.d.ts +41 -0
- package/dist/agent-runtime/core-host.js +132 -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/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 +125 -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 +23 -0
- package/dist/agent-runtime/executors.js +48 -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 +26 -0
- package/dist/agent-runtime/graph/artifacts.js +205 -0
- package/dist/agent-runtime/graph/artifacts.js.map +1 -0
- package/dist/agent-runtime/graph/nodes.d.ts +39 -0
- package/dist/agent-runtime/graph/nodes.js +321 -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 +47 -0
- package/dist/agent-runtime/graph/roles.js +190 -0
- package/dist/agent-runtime/graph/roles.js.map +1 -0
- package/dist/agent-runtime/graph/state.d.ts +83 -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 +20 -0
- package/dist/agent-runtime/index.js +21 -0
- package/dist/agent-runtime/index.js.map +1 -0
- package/dist/agent-runtime/kimi-acp.d.ts +11 -0
- package/dist/agent-runtime/kimi-acp.js +190 -0
- package/dist/agent-runtime/kimi-acp.js.map +1 -0
- package/dist/agent-runtime/openai-executor.d.ts +26 -0
- package/dist/agent-runtime/openai-executor.js +192 -0
- package/dist/agent-runtime/openai-executor.js.map +1 -0
- 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 +123 -0
- package/dist/agent-runtime/openspec.js +263 -0
- package/dist/agent-runtime/openspec.js.map +1 -0
- package/dist/agent-runtime/prompts.d.ts +44 -0
- package/dist/agent-runtime/prompts.js +310 -0
- package/dist/agent-runtime/prompts.js.map +1 -0
- 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 +100 -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 +29 -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 +226 -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 +636 -0
- package/dist/agent-runtime/workflow.js.map +1 -0
- package/dist/agent-runtime/workspace-tools.d.ts +29 -0
- package/dist/agent-runtime/workspace-tools.js +282 -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/phases/scaffold.js +39 -109
- package/dist/installer/phases/scaffold.js.map +1 -1
- package/dist/installer/runtime/kimi.d.ts +84 -0
- package/dist/installer/runtime/pipeline-state.d.ts +351 -0
- package/dist/installer/runtime/pipeline-state.js +514 -41
- 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-efficiency.md +65 -0
- package/docs/agent-runtime.md +339 -0
- package/integration-contract.json +80 -7
- package/package.json +20 -2
- package/schemas/agent-runtime.schema.json +77 -0
- 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
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { DEFAULT_REVIEW_POLICY, REVIEW_ASPECTS } from './graph/review-policy.js';
|
|
3
|
+
const ROLES = ['architect', 'developer', 'reviewer'];
|
|
4
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
5
|
+
function fail(field, why) { throw new Error(`Invalid runtime config ${field}: ${why}`); }
|
|
6
|
+
function object(value, field) {
|
|
7
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
8
|
+
fail(field, 'expected an object');
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function keys(value, allowed, field) {
|
|
12
|
+
for (const key of Object.keys(value))
|
|
13
|
+
if (!allowed.includes(key))
|
|
14
|
+
fail(`${field}.${key}`, 'unknown field');
|
|
15
|
+
}
|
|
16
|
+
function string(value, field) {
|
|
17
|
+
if (typeof value !== 'string' || !value.trim() || value.includes('\0'))
|
|
18
|
+
fail(field, 'expected a nonempty string');
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function identifier(value, field) {
|
|
22
|
+
const result = string(value, field);
|
|
23
|
+
if (!ID.test(result))
|
|
24
|
+
fail(field, 'expected a safe provider identifier');
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
function model(value, field) {
|
|
28
|
+
const result = string(value, field);
|
|
29
|
+
if (result.length > 256 || /[\r\n]/.test(result) || result.startsWith('-'))
|
|
30
|
+
fail(field, 'invalid model identifier');
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
function effort(value, field) {
|
|
34
|
+
const result = string(value, field);
|
|
35
|
+
if (!/^[a-z][a-z0-9_-]{0,31}$/.test(result))
|
|
36
|
+
fail(field, 'invalid effort identifier');
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function boolean(value, field) {
|
|
40
|
+
if (typeof value !== 'boolean')
|
|
41
|
+
fail(field, 'expected boolean');
|
|
42
|
+
}
|
|
43
|
+
function choices(value, allowed, field) {
|
|
44
|
+
if (!allowed.includes(String(value)) || typeof value !== 'string')
|
|
45
|
+
fail(field, `expected ${allowed.join(' or ')}`);
|
|
46
|
+
}
|
|
47
|
+
function positive(value, field, integer = true) {
|
|
48
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || (integer && !Number.isSafeInteger(value)))
|
|
49
|
+
fail(field, 'expected a positive finite number' + (integer ? ' (integer)' : ''));
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
/** Review thresholds may only tighten Core's own gate; the pipeline journal enforces the floor regardless of configuration. */
|
|
53
|
+
function score(value, field, floor) {
|
|
54
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 100)
|
|
55
|
+
fail(field, 'expected a number from 0 to 100');
|
|
56
|
+
if (value < floor)
|
|
57
|
+
fail(field, `must be at least ${floor}, Core's own review gate`);
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
export function validateRuntimeConfig(input, options = {}) {
|
|
61
|
+
const config = object(input, '$');
|
|
62
|
+
keys(config, ['schemaVersion', 'enabled', 'providers', 'agents', 'limits', 'verification', 'approvalBeforeArchive', 'review', 'architect', 'rolePrompts', 'efficiency'], '$');
|
|
63
|
+
if (config.schemaVersion !== 1)
|
|
64
|
+
fail('schemaVersion', 'expected 1');
|
|
65
|
+
if (config.enabled !== undefined && typeof config.enabled !== 'boolean')
|
|
66
|
+
fail('enabled', 'expected boolean');
|
|
67
|
+
if (!Array.isArray(config.providers))
|
|
68
|
+
fail('providers', 'expected an array');
|
|
69
|
+
const providers = config.providers.map((item, i) => {
|
|
70
|
+
const field = `providers[${i}]`, provider = object(item, field);
|
|
71
|
+
const id = identifier(provider.id, `${field}.id`);
|
|
72
|
+
if (provider.kind === 'cli') {
|
|
73
|
+
keys(provider, ['id', 'kind', 'cli'], field);
|
|
74
|
+
if (!['claude', 'codex', 'gemini', 'kimi'].includes(String(provider.cli)))
|
|
75
|
+
fail(`${field}.cli`, 'unsupported CLI');
|
|
76
|
+
return { id, kind: 'cli', cli: provider.cli };
|
|
77
|
+
}
|
|
78
|
+
if (provider.kind !== 'openai-compatible')
|
|
79
|
+
fail(`${field}.kind`, 'unsupported executor kind');
|
|
80
|
+
keys(provider, ['id', 'kind', 'baseUrl', 'apiKeyEnv'], field);
|
|
81
|
+
const baseUrl = string(provider.baseUrl, `${field}.baseUrl`);
|
|
82
|
+
let url;
|
|
83
|
+
try {
|
|
84
|
+
url = new URL(baseUrl);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
fail(`${field}.baseUrl`, 'expected an absolute HTTP(S) URL');
|
|
88
|
+
}
|
|
89
|
+
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
90
|
+
fail(`${field}.baseUrl`, 'use HTTP(S) without credentials, query or fragment');
|
|
91
|
+
if (provider.apiKeyEnv !== undefined && (typeof provider.apiKeyEnv !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(provider.apiKeyEnv)))
|
|
92
|
+
fail(`${field}.apiKeyEnv`, 'expected an environment variable name, never a credential value');
|
|
93
|
+
return { id, kind: 'openai-compatible', baseUrl, ...(provider.apiKeyEnv === undefined ? {} : { apiKeyEnv: provider.apiKeyEnv }) };
|
|
94
|
+
});
|
|
95
|
+
if (new Set(providers.map(p => p.id)).size !== providers.length)
|
|
96
|
+
fail('providers', 'duplicate provider id');
|
|
97
|
+
const known = new Set([...providers.map(p => p.id), ...options.registeredProviderIds ?? []]);
|
|
98
|
+
const rawAgents = object(config.agents, 'agents');
|
|
99
|
+
keys(rawAgents, ROLES, 'agents');
|
|
100
|
+
const agents = Object.fromEntries(ROLES.map(role => {
|
|
101
|
+
const field = `agents.${role}`, agent = object(rawAgents[role], field);
|
|
102
|
+
keys(agent, ['provider', 'model', 'maxTurns', 'effort', 'escalation'], field);
|
|
103
|
+
const provider = identifier(agent.provider, `${field}.provider`);
|
|
104
|
+
if (!known.has(provider))
|
|
105
|
+
fail(`${field}.provider`, `provider '${provider}' is not configured or registered`);
|
|
106
|
+
if (agent.model !== undefined) {
|
|
107
|
+
model(agent.model, `${field}.model`);
|
|
108
|
+
}
|
|
109
|
+
if (providers.find(p => p.id === provider)?.kind === 'openai-compatible' && agent.model === undefined)
|
|
110
|
+
fail(`${field}.model`, 'required for an OpenAI-compatible provider');
|
|
111
|
+
if (agent.maxTurns !== undefined)
|
|
112
|
+
positive(agent.maxTurns, `${field}.maxTurns`);
|
|
113
|
+
if (agent.effort !== undefined)
|
|
114
|
+
effort(agent.effort, `${field}.effort`);
|
|
115
|
+
if (agent.escalation !== undefined) {
|
|
116
|
+
const escalation = object(agent.escalation, `${field}.escalation`);
|
|
117
|
+
keys(escalation, ['model', 'effort'], `${field}.escalation`);
|
|
118
|
+
if (agent.model === undefined)
|
|
119
|
+
fail(`${field}.model`, 'an explicit base model is required for escalation');
|
|
120
|
+
model(escalation.model, `${field}.escalation.model`);
|
|
121
|
+
if (escalation.effort !== undefined)
|
|
122
|
+
effort(escalation.effort, `${field}.escalation.effort`);
|
|
123
|
+
if (escalation.model === agent.model && escalation.effort === agent.effort)
|
|
124
|
+
fail(`${field}.escalation`, 'must select a different model or effort');
|
|
125
|
+
}
|
|
126
|
+
return [role, structuredClone(agent)];
|
|
127
|
+
}));
|
|
128
|
+
if (config.limits !== undefined) {
|
|
129
|
+
const limits = object(config.limits, 'limits');
|
|
130
|
+
keys(limits, ['maxAttempts', 'maxTokens', 'maxCostUsd', 'timeoutMs'], 'limits');
|
|
131
|
+
for (const [key, value] of Object.entries(limits))
|
|
132
|
+
positive(value, `limits.${key}`, key !== 'maxCostUsd');
|
|
133
|
+
}
|
|
134
|
+
if (!Array.isArray(config.verification))
|
|
135
|
+
fail('verification', 'expected an array of verification commands');
|
|
136
|
+
const verification = config.verification.map((item, i) => {
|
|
137
|
+
const field = `verification[${i}]`, command = object(item, field);
|
|
138
|
+
keys(command, ['repositoryId', 'command', 'args', 'cwd', 'env', 'timeoutMs', 'key', 'label', 'policy'], field);
|
|
139
|
+
if (command.key !== undefined)
|
|
140
|
+
identifier(command.key, `${field}.key`);
|
|
141
|
+
if (command.label !== undefined && string(command.label, `${field}.label`).length > 256)
|
|
142
|
+
fail(`${field}.label`, 'maximum 256 characters');
|
|
143
|
+
if (command.policy !== undefined) {
|
|
144
|
+
const policy = object(command.policy, `${field}.policy`);
|
|
145
|
+
keys(policy, ['reuse', 'inputs', 'deterministic', 'readOnly', 'toolchainInputs', 'independentGroup', 'resources'], `${field}.policy`);
|
|
146
|
+
if (policy.reuse !== undefined)
|
|
147
|
+
choices(policy.reuse, ['never', 'snapshot-local'], `${field}.policy.reuse`);
|
|
148
|
+
for (const key of ['deterministic', 'readOnly'])
|
|
149
|
+
if (policy[key] !== undefined)
|
|
150
|
+
boolean(policy[key], `${field}.policy.${key}`);
|
|
151
|
+
if (policy.independentGroup !== undefined)
|
|
152
|
+
identifier(policy.independentGroup, `${field}.policy.independentGroup`);
|
|
153
|
+
for (const key of ['inputs', 'toolchainInputs', 'resources']) {
|
|
154
|
+
const values = policy[key];
|
|
155
|
+
if (values === undefined)
|
|
156
|
+
continue;
|
|
157
|
+
if (!Array.isArray(values) || values.length > 256)
|
|
158
|
+
fail(`${field}.policy.${key}`, 'expected at most 256 entries');
|
|
159
|
+
for (const value of values)
|
|
160
|
+
if (string(value, `${field}.policy.${key}`).length > 4096)
|
|
161
|
+
fail(`${field}.policy.${key}`, 'entry exceeds 4096 characters');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
identifier(command.repositoryId, `${field}.repositoryId`);
|
|
165
|
+
string(command.command, `${field}.command`);
|
|
166
|
+
if (!Array.isArray(command.args) || !command.args.every(arg => typeof arg === 'string' && !arg.includes('\0')))
|
|
167
|
+
fail(`${field}.args`, 'expected a string array');
|
|
168
|
+
if (command.cwd !== undefined)
|
|
169
|
+
string(command.cwd, `${field}.cwd`);
|
|
170
|
+
if (command.timeoutMs !== undefined)
|
|
171
|
+
positive(command.timeoutMs, `${field}.timeoutMs`);
|
|
172
|
+
if (command.env !== undefined) {
|
|
173
|
+
const env = object(command.env, `${field}.env`);
|
|
174
|
+
for (const [key, value] of Object.entries(env)) {
|
|
175
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) || typeof value !== 'string' || value.includes('\0'))
|
|
176
|
+
fail(`${field}.env`, 'expected environment names and string values');
|
|
177
|
+
if (/(?:token|secret|password|api_?key|credential)/i.test(key))
|
|
178
|
+
fail(`${field}.env.${key}`, 'credentials must be inherited from the process environment, never saved');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return structuredClone(command);
|
|
182
|
+
});
|
|
183
|
+
const checkKeys = verification.flatMap(check => check.key ? [check.key] : []);
|
|
184
|
+
if (new Set(checkKeys).size !== checkKeys.length)
|
|
185
|
+
fail('verification', 'duplicate check key');
|
|
186
|
+
if (config.efficiency !== undefined) {
|
|
187
|
+
const policy = object(config.efficiency, 'efficiency');
|
|
188
|
+
keys(policy, ['schemaVersion', 'contextMode', 'reviewMode', 'planning', 'acceptDeveloperChecks', 'verification'], 'efficiency');
|
|
189
|
+
if (policy.schemaVersion !== 1)
|
|
190
|
+
fail('efficiency.schemaVersion', 'expected 1');
|
|
191
|
+
for (const key of ['contextMode', 'reviewMode'])
|
|
192
|
+
if (policy[key] !== undefined)
|
|
193
|
+
choices(policy[key], ['full', 'incremental'], `efficiency.${key}`);
|
|
194
|
+
if (policy.planning !== undefined)
|
|
195
|
+
choices(policy.planning, ['full', 'proportional'], 'efficiency.planning');
|
|
196
|
+
if (policy.acceptDeveloperChecks !== undefined)
|
|
197
|
+
boolean(policy.acceptDeveloperChecks, 'efficiency.acceptDeveloperChecks');
|
|
198
|
+
if (policy.verification !== undefined) {
|
|
199
|
+
const verification = object(policy.verification, 'efficiency.verification');
|
|
200
|
+
keys(verification, ['maxConcurrency'], 'efficiency.verification');
|
|
201
|
+
if (verification.maxConcurrency !== undefined && positive(verification.maxConcurrency, 'efficiency.verification.maxConcurrency') > 4)
|
|
202
|
+
fail('efficiency.verification.maxConcurrency', 'maximum 4');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (config.approvalBeforeArchive !== undefined && typeof config.approvalBeforeArchive !== 'boolean')
|
|
206
|
+
fail('approvalBeforeArchive', 'expected boolean');
|
|
207
|
+
let review;
|
|
208
|
+
if (config.review !== undefined) {
|
|
209
|
+
const raw = object(config.review, 'review');
|
|
210
|
+
keys(raw, ['minScore', 'aspects'], 'review');
|
|
211
|
+
review = {};
|
|
212
|
+
if (raw.minScore !== undefined)
|
|
213
|
+
review.minScore = score(raw.minScore, 'review.minScore', DEFAULT_REVIEW_POLICY.minScore);
|
|
214
|
+
if (raw.aspects !== undefined) {
|
|
215
|
+
const aspects = object(raw.aspects, 'review.aspects');
|
|
216
|
+
keys(aspects, [...REVIEW_ASPECTS], 'review.aspects');
|
|
217
|
+
review.aspects = Object.fromEntries(Object.entries(aspects).map(([name, value]) => [name, score(value, `review.aspects.${name}`, DEFAULT_REVIEW_POLICY.aspects[name])]));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
let architect;
|
|
221
|
+
if (config.architect !== undefined) {
|
|
222
|
+
const raw = object(config.architect, 'architect');
|
|
223
|
+
keys(raw, ['onLowConfidence'], 'architect');
|
|
224
|
+
architect = {};
|
|
225
|
+
if (raw.onLowConfidence !== undefined) {
|
|
226
|
+
if (raw.onLowConfidence !== 'ask' && raw.onLowConfidence !== 'proceed')
|
|
227
|
+
fail('architect.onLowConfidence', 'expected "ask" or "proceed"');
|
|
228
|
+
architect.onLowConfidence = raw.onLowConfidence;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
let rolePrompts;
|
|
232
|
+
if (config.rolePrompts !== undefined) {
|
|
233
|
+
const raw = object(config.rolePrompts, 'rolePrompts');
|
|
234
|
+
keys(raw, ROLES, 'rolePrompts');
|
|
235
|
+
rolePrompts = {};
|
|
236
|
+
for (const [role, value] of Object.entries(raw)) {
|
|
237
|
+
const text = string(value, `rolePrompts.${role}`);
|
|
238
|
+
if (text.length > 20000)
|
|
239
|
+
fail(`rolePrompts.${role}`, 'maximum 20000 characters');
|
|
240
|
+
rolePrompts[role] = text;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return { schemaVersion: 1, enabled: true, providers, agents, verification,
|
|
244
|
+
...(config.efficiency === undefined ? {} : { efficiency: structuredClone(config.efficiency) }),
|
|
245
|
+
...(rolePrompts === undefined ? {} : { rolePrompts }),
|
|
246
|
+
...(config.limits === undefined ? {} : { limits: { ...config.limits } }),
|
|
247
|
+
...(config.approvalBeforeArchive === undefined ? {} : { approvalBeforeArchive: config.approvalBeforeArchive }),
|
|
248
|
+
...(review === undefined ? {} : { review }),
|
|
249
|
+
...(architect === undefined ? {} : { architect }), };
|
|
250
|
+
}
|
|
251
|
+
export function loadRuntimeConfig(file, options) {
|
|
252
|
+
return validateRuntimeConfig(JSON.parse(readFileSync(file, 'utf8')), options);
|
|
253
|
+
}
|
|
254
|
+
/** New admissions normalize once; validation of a saved document is lossless. */
|
|
255
|
+
export function normalizeRuntimeConfig(input, options) {
|
|
256
|
+
const config = JSON.parse(JSON.stringify(validateRuntimeConfig(input, options)));
|
|
257
|
+
config.efficiency = {
|
|
258
|
+
schemaVersion: 1, contextMode: 'incremental', reviewMode: 'incremental', planning: 'proportional', acceptDeveloperChecks: true,
|
|
259
|
+
...config.efficiency, verification: { maxConcurrency: 1, ...config.efficiency?.verification },
|
|
260
|
+
};
|
|
261
|
+
return config;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent-runtime/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type PipelineContext } from '../installer/runtime/pipeline-state.js';
|
|
2
|
+
import { type ExecutorRegistry } from './executors.js';
|
|
3
|
+
import type { AgentEvent, AgentRole, RuntimeConfig } from './executor-types.js';
|
|
4
|
+
import { parseAgentObject } from './graph/artifacts.js';
|
|
5
|
+
import { type RuntimeIdentity } from './runtime-identity.js';
|
|
6
|
+
import type { WorkflowEvent, WorkflowSpan, WorkflowState } from './workflow-types.js';
|
|
7
|
+
export declare const RUNTIME_API_VERSION = 1;
|
|
8
|
+
export declare const CORE_WORKFLOW_VERSION = "5";
|
|
9
|
+
export declare const CORE_PACKAGE_VERSION: string;
|
|
10
|
+
export declare function coreRuntimeIdentity(): RuntimeIdentity;
|
|
11
|
+
export { parseAgentObject };
|
|
12
|
+
export interface CoreWorkflowOptions {
|
|
13
|
+
context: PipelineContext | unknown;
|
|
14
|
+
change: string;
|
|
15
|
+
config: RuntimeConfig | unknown;
|
|
16
|
+
registry?: ExecutorRegistry;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
resume?: boolean;
|
|
19
|
+
approve?: string[];
|
|
20
|
+
/** Answer to the architect's pending question; resumes the paused run. */
|
|
21
|
+
answer?: string;
|
|
22
|
+
recoverInterrupted?: string[];
|
|
23
|
+
invalidate?: string[];
|
|
24
|
+
onEvent?: (event: WorkflowEvent) => void | Promise<void>;
|
|
25
|
+
onSpan?: (span: WorkflowSpan) => void | Promise<void>;
|
|
26
|
+
onAgentEvent?: (role: AgentRole, event: AgentEvent) => void;
|
|
27
|
+
onVerificationOutput?: (text: string) => void;
|
|
28
|
+
}
|
|
29
|
+
/** Read-only admission: validate scope, limits and actual effort support before freezing a request. */
|
|
30
|
+
export declare function preflightCoreWorkflow(options: Pick<CoreWorkflowOptions, 'context' | 'config' | 'change' | 'registry'>): Promise<{
|
|
31
|
+
context: PipelineContext;
|
|
32
|
+
config: RuntimeConfig;
|
|
33
|
+
registry: ExecutorRegistry;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Runs the Core implementation graph: architect → developer → verify → reviewer → archive,
|
|
37
|
+
* with bounded corrections routed back to the developer, an autonomous investigation pass
|
|
38
|
+
* before a low-confidence design asks the requester, real verification receipts, acceptance
|
|
39
|
+
* evidence bound to the exact candidate, and an optional approval before archive.
|
|
40
|
+
*/
|
|
41
|
+
export declare function runCoreWorkflow(options: CoreWorkflowOptions): Promise<WorkflowState>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { fingerprint } from './durable-store.js';
|
|
2
|
+
import { prepareOpenSpec, roleOpenSpecContext } from './openspec.js';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fingerprintCandidate, initializePipeline, inspectPipeline, pipelineStateDirectory, validatePipelineContext, validateVerificationRequest, } from '../installer/runtime/pipeline-state.js';
|
|
6
|
+
import { normalizeRuntimeConfig } from './config.js';
|
|
7
|
+
import { createExecutorRegistry } from './executors.js';
|
|
8
|
+
import { archive, child, journal, parseAgentObject, SLUG } from './graph/artifacts.js';
|
|
9
|
+
import { coreNodes } from './graph/nodes.js';
|
|
10
|
+
import { resolveReviewPolicy } from './graph/review-policy.js';
|
|
11
|
+
import { createRoleInvoker } from './graph/roles.js';
|
|
12
|
+
import { CORE_NODE_ORDER, CoreState } from './graph/state.js';
|
|
13
|
+
import { ROLE_INSTRUCTIONS_VERSION } from './prompts.js';
|
|
14
|
+
import { assertEffortSupported } from './capabilities.js';
|
|
15
|
+
import { runtimePackageIntegrity } from './runtime-identity.js';
|
|
16
|
+
import { readWorkflowState, runWorkflow } from './workflow.js';
|
|
17
|
+
export const RUNTIME_API_VERSION = 1;
|
|
18
|
+
export const CORE_WORKFLOW_VERSION = '5';
|
|
19
|
+
export const CORE_PACKAGE_VERSION = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
|
|
20
|
+
export function coreRuntimeIdentity() {
|
|
21
|
+
return { packageVersion: CORE_PACKAGE_VERSION, workflowVersion: CORE_WORKFLOW_VERSION, instructionsVersion: String(ROLE_INSTRUCTIONS_VERSION), packageIntegrity: runtimePackageIntegrity(), apiVersion: 1 };
|
|
22
|
+
}
|
|
23
|
+
export { parseAgentObject };
|
|
24
|
+
/** Read-only admission: validate scope, limits and actual effort support before freezing a request. */
|
|
25
|
+
export async function preflightCoreWorkflow(options) {
|
|
26
|
+
const context = validatePipelineContext(options.context);
|
|
27
|
+
const config = normalizeRuntimeConfig(options.config, { registeredProviderIds: options.registry?.ids() });
|
|
28
|
+
if (context.ownership.git !== 'host')
|
|
29
|
+
throw new Error('Programmatic runtime requires host-owned delivery; Core shipping is not implemented by this workflow');
|
|
30
|
+
if (!SLUG.test(options.change) || options.change.length > 100)
|
|
31
|
+
throw new Error('Invalid workflow change name');
|
|
32
|
+
if (!context.specs.length)
|
|
33
|
+
throw new Error('Programmatic implementation requires a frozen spec or goal');
|
|
34
|
+
// Configured commands are validated against the frozen scope up front; coverage
|
|
35
|
+
// is completed by the architect (or left explicitly unverified) at run time.
|
|
36
|
+
if (config.verification.length)
|
|
37
|
+
validateVerificationRequest(context, { kind: 'scoped', commands: config.verification });
|
|
38
|
+
const registry = options.registry ?? createExecutorRegistry(config);
|
|
39
|
+
for (const selected of Object.values(config.agents)) {
|
|
40
|
+
registry.validateLimits(selected.provider, config.limits ?? {});
|
|
41
|
+
for (const tier of [selected, ...(selected.escalation ? [selected.escalation] : [])]) {
|
|
42
|
+
if (tier.effort !== undefined)
|
|
43
|
+
assertEffortSupported(tier, await registry.capabilities(selected.provider, tier.model));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { context, config, registry };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Runs the Core implementation graph: architect → developer → verify → reviewer → archive,
|
|
50
|
+
* with bounded corrections routed back to the developer, an autonomous investigation pass
|
|
51
|
+
* before a low-confidence design asks the requester, real verification receipts, acceptance
|
|
52
|
+
* evidence bound to the exact candidate, and an optional approval before archive.
|
|
53
|
+
*/
|
|
54
|
+
export async function runCoreWorkflow(options) {
|
|
55
|
+
const { context, config, registry } = await preflightCoreWorkflow(options);
|
|
56
|
+
const directory = path.join(pipelineStateDirectory(context), 'agent-workflow');
|
|
57
|
+
const previous = await readWorkflowState(directory, context.runId);
|
|
58
|
+
if (previous && previous.workflowVersion !== CORE_WORKFLOW_VERSION)
|
|
59
|
+
throw new Error('This saved run requires its original runtime package. Restore the retained original Core runtime; its checkpoint has not been migrated.');
|
|
60
|
+
const state = initializePipeline(context, options.change);
|
|
61
|
+
if (!previous && existsSync(path.join(context.artifactRoot, 'openspec/changes', options.change))) {
|
|
62
|
+
throw new Error('Change already exists without a programmatic checkpoint; use a new change name');
|
|
63
|
+
}
|
|
64
|
+
if (state.phases.archive.status === 'done') {
|
|
65
|
+
const checked = inspectPipeline(context);
|
|
66
|
+
if (!checked.verification.valid || (checked.resumePhase && !['ship', 'ci'].includes(checked.resumePhase))) {
|
|
67
|
+
throw new Error('Archived run evidence changed; start a new run for the changed candidate or environment');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const prepared = prepareOpenSpec(context.artifactRoot, options.change, directory);
|
|
71
|
+
const openspec = Object.fromEntries(['architect', 'developer', 'reviewer'].map(role => {
|
|
72
|
+
const provider = config.providers.find(item => item.id === config.agents[role].provider);
|
|
73
|
+
return [role, roleOpenSpecContext(prepared, context.artifactRoot, options.change, directory, role, provider?.kind === 'cli' ? provider.cli : 'claude')];
|
|
74
|
+
}));
|
|
75
|
+
for (const role of ['architect', 'developer', 'reviewer'])
|
|
76
|
+
await registry.get(config.agents[role].provider).validateOpenSpec?.(openspec[role]);
|
|
77
|
+
const attempts = config.limits?.maxAttempts ?? 3;
|
|
78
|
+
const note = (role, text) => { try {
|
|
79
|
+
options.onAgentEvent?.(role, { kind: 'text', text });
|
|
80
|
+
}
|
|
81
|
+
catch { /* Observer cannot replay agent effects. */ } };
|
|
82
|
+
const invoke = createRoleInvoker({ context, config, registry, openspec, onAgentEvent: options.onAgentEvent });
|
|
83
|
+
let grantedArchiveScope;
|
|
84
|
+
const archiveConsent = () => {
|
|
85
|
+
const pipeline = journal(context);
|
|
86
|
+
return fingerprint({ candidate: fingerprintCandidate(pipeline), plan: pipeline.verificationPlan?.hash ?? null,
|
|
87
|
+
criteria: pipeline.acceptance?.criteria.map(({ evidence: _evidence, ...criterion }) => criterion) ?? null,
|
|
88
|
+
checks: pipeline.acceptance?.checks.map(({ evidence: _evidence, ...check }) => check) ?? null });
|
|
89
|
+
};
|
|
90
|
+
const nodes = coreNodes({ archiveApproved: () => grantedArchiveScope !== undefined && grantedArchiveScope === archiveConsent(), context, config, openspec, change: options.change, attempts, policy: resolveReviewPolicy(config), invoke, note, onVerificationOutput: options.onVerificationOutput });
|
|
91
|
+
return runWorkflow({
|
|
92
|
+
directory, runId: context.runId,
|
|
93
|
+
input: JSON.parse(JSON.stringify({ context, config, change: options.change, coreVersion: CORE_PACKAGE_VERSION, runtimeIdentity: coreRuntimeIdentity(), instructionsVersion: ROLE_INSTRUCTIONS_VERSION, openspec: prepared.identity })),
|
|
94
|
+
resume: options.resume, signal: options.signal, approve: options.approve, answer: options.answer, recoverInterrupted: options.recoverInterrupted, invalidate: options.invalidate,
|
|
95
|
+
budget: { maxCostUsd: config.limits?.maxCostUsd, maxTokens: config.limits?.maxTokens, maxDurationMs: config.limits?.timeoutMs },
|
|
96
|
+
onEvent: options.onEvent, onSpan: options.onSpan,
|
|
97
|
+
validateCompleted: async (stepId, _record, checkpoint) => {
|
|
98
|
+
// The engine invokes this only after acquiring its run lease and accepting
|
|
99
|
+
// an explicit interrupted-write recovery. A crash after the archive rename
|
|
100
|
+
// leaves Core's active artifact path temporarily absent. Reconcile that
|
|
101
|
+
// one deterministic operation before checking earlier phase fingerprints;
|
|
102
|
+
// transitionPipeline still verifies the saved exact-candidate approval.
|
|
103
|
+
if (stepId === 'architect' && checkpoint.nextStep === 'archive'
|
|
104
|
+
&& checkpoint.steps.archive?.status === 'interrupted'
|
|
105
|
+
&& options.recoverInterrupted?.includes('archive')
|
|
106
|
+
&& journal(context).phases.archive.status === 'running'
|
|
107
|
+
&& !existsSync(child(context.artifactRoot, 'openspec/changes/' + options.change))) {
|
|
108
|
+
await archive(context, options.change);
|
|
109
|
+
}
|
|
110
|
+
const inspection = inspectPipeline(context);
|
|
111
|
+
if (stepId === 'architect' && checkpoint.pendingApproval?.stepId === 'archive' && options.approve?.includes('archive') && inspection.verification.valid && inspection.acceptance.valid && inspection.phases.reviewer.status === 'done')
|
|
112
|
+
grantedArchiveScope = archiveConsent();
|
|
113
|
+
if (stepId === 'architect')
|
|
114
|
+
return inspection.phases.architect.status === 'done' && inspection.resumePhase !== 'architect';
|
|
115
|
+
if (stepId === 'verify' && checkpoint.status !== 'succeeded' && inspection.phases.archive.status !== 'done' && !(checkpoint.pendingApproval?.stepId === 'archive' && !options.approve?.includes('archive') && !checkpoint.pendingApproval.grantedAt))
|
|
116
|
+
return false;
|
|
117
|
+
if (stepId === 'verify')
|
|
118
|
+
return _record.output?.valid !== false && inspection.verification.valid;
|
|
119
|
+
if (stepId === 'reviewer')
|
|
120
|
+
return inspection.phases.reviewer.status === 'done' && inspection.verification.valid && !['architect', 'developer', 'reviewer'].includes(inspection.resumePhase ?? '');
|
|
121
|
+
if (stepId === 'archive')
|
|
122
|
+
return inspection.phases.archive.status === 'done';
|
|
123
|
+
return true;
|
|
124
|
+
},
|
|
125
|
+
workflow: {
|
|
126
|
+
id: 'specrails-implementation', version: CORE_WORKFLOW_VERSION, schema: CoreState, entry: 'architect',
|
|
127
|
+
maxTransitions: attempts * 3 + 3,
|
|
128
|
+
nodes: Object.fromEntries(CORE_NODE_ORDER.map(id => [id, nodes[id]])),
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=core-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-host.js","sourceRoot":"","sources":["../../src/agent-runtime/core-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SerializedGraphStore } from './graph-checkpointer.js';
|
|
2
|
+
import type { WorkflowState } from './workflow-types.js';
|
|
3
|
+
export declare class WorkflowStoreError extends Error {
|
|
4
|
+
readonly code: 'INVALID_ID' | 'LOCKED' | 'CORRUPT_STATE';
|
|
5
|
+
constructor(code: 'INVALID_ID' | 'LOCKED' | 'CORRUPT_STATE', message: string);
|
|
6
|
+
}
|
|
7
|
+
/** The durable run: the host ledger plus the LangGraph checkpoint history, written together. */
|
|
8
|
+
export interface WorkflowEnvelope {
|
|
9
|
+
state: WorkflowState;
|
|
10
|
+
graph?: SerializedGraphStore;
|
|
11
|
+
}
|
|
12
|
+
export declare const ENVELOPE_FORMAT = 2;
|
|
13
|
+
/** Reject non-JSON data instead of silently changing the fingerprint on serialization. */
|
|
14
|
+
export declare function fingerprint(value: unknown): string;
|
|
15
|
+
export declare function readWorkflowEnvelope(directory: string, runId: string): Promise<WorkflowEnvelope | null>;
|
|
16
|
+
/** Read-only view of the host ledger. */
|
|
17
|
+
export declare function readWorkflowState(directory: string, runId: string): Promise<WorkflowState | null>;
|
|
18
|
+
/** Publish a complete checkpoint, receipt, usage, event ledger and graph history in one atomic rename. */
|
|
19
|
+
export declare function writeWorkflowEnvelope(directory: string, envelope: WorkflowEnvelope): Promise<void>;
|
|
20
|
+
export declare function writeWorkflowState(directory: string, state: WorkflowState, graph?: SerializedGraphStore): Promise<void>;
|
|
21
|
+
/** Atomic directory leases avoid platform-specific flock and native dependencies. */
|
|
22
|
+
export declare function acquireWorkflowLease(directory: string, runId: string): Promise<() => Promise<void>>;
|