@voybio/ace-swarm 2.4.8 → 2.4.10
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/CHANGELOG.md +52 -14
- package/README.md +14 -10
- package/assets/.agents/ACE/ACE_coders/AGENTS.md +23 -30
- package/assets/.agents/ACE/ACE_coders/INSTRUCTIONS.md +21 -30
- package/assets/.agents/skills/landing-review-watcher/SKILL.md +1 -1
- package/assets/.agents/skills/learn-from-work/SKILL.md +41 -0
- package/assets/agent-state/ACE_WORKFLOW.md +25 -2
- package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +143 -2
- package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +2 -2
- package/assets/agent-state/MODULES/schemas/SWARM_HANDOFF.schema.json +10 -0
- package/assets/eval-battery/battery.json +1 -1
- package/assets/instructions/ACE_Coder.instructions.md +9 -13
- package/assets/scripts/ace-hook-dispatch.mjs +16 -411
- package/assets/tasks/SWARM_HANDOFF.example_ui_to_coders.json +1 -2
- package/assets/vendor/README.md +9 -0
- package/assets/vendor/vericify-reader.mjs +272 -0
- package/assets/vendor/vericify-reader.provenance.json +10 -0
- package/dist/ace-autonomy.d.ts +58 -0
- package/dist/ace-autonomy.js +211 -6
- package/dist/ace-internal-tools.d.ts +1 -0
- package/dist/ace-internal-tools.js +3 -3
- package/dist/ace-server-instructions.d.ts +3 -3
- package/dist/ace-server-instructions.js +46 -192
- package/dist/cli.js +44 -6
- package/dist/experience-reflector.d.ts +7 -0
- package/dist/experience-reflector.js +39 -0
- package/dist/goal-engine.d.ts +64 -7
- package/dist/goal-engine.js +197 -41
- package/dist/handoff-registry.d.ts +10 -0
- package/dist/handoff-registry.js +59 -0
- package/dist/helpers/artifacts.d.ts +6 -2
- package/dist/helpers/artifacts.js +8 -6
- package/dist/helpers/bootstrap.js +13 -20
- package/dist/helpers/path-utils.js +2 -0
- package/dist/helpers/store-resolution.js +18 -3
- package/dist/helpers/workspace-root.d.ts +2 -0
- package/dist/helpers/workspace-root.js +9 -0
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js +1 -0
- package/dist/hermes/bridge-protocol.d.ts +1 -1
- package/dist/hermes/session-manager.d.ts +17 -0
- package/dist/hermes/session-manager.js +67 -14
- package/dist/host-goal-engine.d.ts +138 -0
- package/dist/host-goal-engine.js +793 -0
- package/dist/host-goal-status.d.ts +113 -0
- package/dist/host-goal-status.js +175 -0
- package/dist/host-learning.d.ts +68 -0
- package/dist/host-learning.js +115 -0
- package/dist/host-observation.d.ts +12 -0
- package/dist/host-observation.js +91 -0
- package/dist/host-plan-revision.d.ts +14 -0
- package/dist/host-plan-revision.js +101 -0
- package/dist/host-verification-job.d.ts +12 -0
- package/dist/host-verification-job.js +183 -0
- package/dist/host-work-context.d.ts +12 -0
- package/dist/host-work-context.js +8 -0
- package/dist/job-scheduler.d.ts +58 -13
- package/dist/job-scheduler.js +298 -48
- package/dist/job-worker.d.ts +3 -1
- package/dist/job-worker.js +10 -3
- package/dist/kanban.d.ts +4 -1
- package/dist/kanban.js +44 -16
- package/dist/learned-artifacts.d.ts +64 -0
- package/dist/learned-artifacts.js +321 -0
- package/dist/learning-controls.d.ts +142 -0
- package/dist/learning-controls.js +135 -0
- package/dist/learning-input-context.d.ts +9 -0
- package/dist/learning-input-context.js +62 -0
- package/dist/learning-lifecycle.d.ts +10 -0
- package/dist/learning-lifecycle.js +11 -0
- package/dist/learning-overlays.d.ts +3 -0
- package/dist/learning-overlays.js +17 -0
- package/dist/learning-policy.d.ts +40 -0
- package/dist/learning-policy.js +38 -0
- package/dist/learning-records.d.ts +35 -0
- package/dist/learning-records.js +17 -0
- package/dist/learning-scorecard.d.ts +82 -0
- package/dist/learning-scorecard.js +86 -0
- package/dist/learning-serving.d.ts +29 -0
- package/dist/learning-serving.js +134 -0
- package/dist/linked-work.d.ts +9 -0
- package/dist/linked-work.js +28 -0
- package/dist/local-model-runtime.js +1 -1
- package/dist/mcp-command-progress.d.ts +16 -0
- package/dist/mcp-command-progress.js +70 -0
- package/dist/model-bridge.d.ts +14 -13
- package/dist/model-bridge.js +73 -41
- package/dist/orchestrator-supervisor.d.ts +111 -6
- package/dist/orchestrator-supervisor.js +67 -43
- package/dist/plan-proposal.js +3 -3
- package/dist/playbook-curator.d.ts +1 -0
- package/dist/playbook-curator.js +11 -9
- package/dist/process-identity.d.ts +8 -0
- package/dist/process-identity.js +38 -0
- package/dist/progress-command.d.ts +34 -0
- package/dist/progress-command.js +153 -0
- package/dist/prompts.js +15 -15
- package/dist/resources.js +2 -2
- package/dist/runtime-command.d.ts +8 -1
- package/dist/runtime-command.js +48 -7
- package/dist/runtime-executor.js +33 -11
- package/dist/runtime-profile-syntax.d.ts +6 -0
- package/dist/runtime-profile-syntax.js +121 -0
- package/dist/runtime-profile.d.ts +37 -5
- package/dist/runtime-profile.js +36 -129
- package/dist/runtime-tool-specs.js +1 -1
- package/dist/safe-edit.d.ts +7 -3
- package/dist/safe-edit.js +40 -47
- package/dist/schemas.js +4 -2
- package/dist/server.d.ts +2 -16
- package/dist/server.js +14 -20
- package/dist/shared.d.ts +2 -0
- package/dist/shared.js +2 -0
- package/dist/skill-auditor.d.ts +19 -0
- package/dist/skill-auditor.js +32 -2
- package/dist/skill-catalog.d.ts +4 -1
- package/dist/skill-catalog.js +6 -5
- package/dist/store/ace-packed-store.d.ts +5 -1
- package/dist/store/ace-packed-store.js +33 -1
- package/dist/store/bootstrap-store.js +19 -12
- package/dist/store/cache-workspace.d.ts +8 -0
- package/dist/store/cache-workspace.js +94 -27
- package/dist/store/importer.js +11 -20
- package/dist/store/knowledge-bake.d.ts +3 -1
- package/dist/store/knowledge-bake.js +10 -1
- package/dist/store/legacy-vericify-posts.d.ts +8 -0
- package/dist/store/legacy-vericify-posts.js +76 -0
- package/dist/store/materializers/hook-context-materializer.d.ts +2 -1
- package/dist/store/materializers/hook-context-materializer.js +6 -2
- package/dist/store/materializers/host-file-materializer.js +2 -2
- package/dist/store/materializers/projection-manager.d.ts +4 -1
- package/dist/store/materializers/projection-manager.js +10 -3
- package/dist/store/materializers/todo-syncer.d.ts +39 -20
- package/dist/store/materializers/todo-syncer.js +208 -110
- package/dist/store/materializers/vericify-projector.js +15 -26
- package/dist/store/repositories/goal-repository.d.ts +51 -2
- package/dist/store/repositories/goal-repository.js +114 -48
- package/dist/store/repositories/playbook-repository.d.ts +41 -3
- package/dist/store/repositories/playbook-repository.js +61 -5
- package/dist/store/repositories/todo-repository.d.ts +8 -2
- package/dist/store/repositories/todo-repository.js +1 -1
- package/dist/store/repositories/vericify-repository.d.ts +4 -0
- package/dist/store/repositories/vericify-repository.js +46 -0
- package/dist/store/skills-install.d.ts +1 -0
- package/dist/store/skills-install.js +20 -16
- package/dist/store/source-preservation.d.ts +24 -0
- package/dist/store/source-preservation.js +79 -0
- package/dist/store/store-artifacts.js +8 -1
- package/dist/store/test-write-boundary.d.ts +16 -0
- package/dist/store/test-write-boundary.js +175 -0
- package/dist/store/types.d.ts +5 -1
- package/dist/store/write-coordinator.js +16 -0
- package/dist/task-plan-context.d.ts +11 -0
- package/dist/task-plan-context.js +59 -0
- package/dist/todo-state.d.ts +19 -9
- package/dist/todo-state.js +204 -321
- package/dist/tools-agent.d.ts +1 -1
- package/dist/tools-agent.js +38 -62
- package/dist/tools-files.d.ts +0 -3
- package/dist/tools-files.js +21 -11
- package/dist/tools-framework.js +16 -25
- package/dist/tools-goal.d.ts +2 -4
- package/dist/tools-goal.js +119 -16
- package/dist/tools-handoff.d.ts +3 -2
- package/dist/tools-handoff.js +53 -23
- package/dist/tools-lifecycle.js +1 -1
- package/dist/tools-memory.d.ts +0 -3
- package/dist/tools-memory.js +51 -6
- package/dist/tools-scheduler.js +20 -17
- package/dist/tools-todo.js +160 -148
- package/dist/vericify-bridge.d.ts +8 -0
- package/dist/vericify-bridge.js +18 -0
- package/dist/vericify-context.d.ts +4 -0
- package/dist/vericify-context.js +26 -5
- package/dist/vericify-native.d.ts +101 -0
- package/dist/vericify-native.js +221 -0
- package/dist/verification-worker.d.ts +2 -0
- package/dist/verification-worker.js +31 -0
- package/docs/mcp-tool-reference.md +50 -10
- package/docs/troubleshooting.md +29 -0
- package/package.json +19 -6
- package/scripts/dev/run-tests-isolated.mjs +165 -0
- package/scripts/dev/run_hermes_crispr_live.mjs +1 -0
- package/scripts/dev/test-isolation-guard.mjs +20 -0
- package/scripts/dev/test-preload.mjs +153 -0
- package/scripts/dev/test-source-inventory.mjs +31 -0
- package/docs/development.md +0 -46
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Shared ACE_WORKFLOW frontmatter parser; kept independent of runtime/event owners.
|
|
2
|
+
function stripInlineComment(value) {
|
|
3
|
+
let inSingle = false;
|
|
4
|
+
let inDouble = false;
|
|
5
|
+
for (let idx = 0; idx < value.length; idx += 1) {
|
|
6
|
+
const char = value[idx];
|
|
7
|
+
const prev = idx > 0 ? value[idx - 1] : "";
|
|
8
|
+
if (char === "'" && !inDouble)
|
|
9
|
+
inSingle = !inSingle;
|
|
10
|
+
if (char === '"' && !inSingle && prev !== "\\")
|
|
11
|
+
inDouble = !inDouble;
|
|
12
|
+
if (char === "#" && !inSingle && !inDouble) {
|
|
13
|
+
const before = idx > 0 ? value[idx - 1] : "";
|
|
14
|
+
if (!before || /\s/.test(before)) {
|
|
15
|
+
return value.slice(0, idx).trimEnd();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return value.trimEnd();
|
|
20
|
+
}
|
|
21
|
+
function parseYamlScalar(rawValue, lineNumber) {
|
|
22
|
+
const value = stripInlineComment(rawValue.trim());
|
|
23
|
+
if (value === "null" || value === "~")
|
|
24
|
+
return null;
|
|
25
|
+
if (value === "true")
|
|
26
|
+
return true;
|
|
27
|
+
if (value === "false")
|
|
28
|
+
return false;
|
|
29
|
+
if (value === "{}")
|
|
30
|
+
return {};
|
|
31
|
+
if (value === "[]")
|
|
32
|
+
return [];
|
|
33
|
+
if (/^-?\d+$/.test(value))
|
|
34
|
+
return Number(value);
|
|
35
|
+
if ((value.startsWith("[") && value.endsWith("]")) ||
|
|
36
|
+
(value.startsWith("{") && value.endsWith("}"))) {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(value);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new Error(`line ${lineNumber}: invalid JSON-style scalar (${error instanceof Error ? error.message : String(error)})`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
45
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
46
|
+
const quote = value[0];
|
|
47
|
+
const inner = value.slice(1, -1);
|
|
48
|
+
if (quote === '"') {
|
|
49
|
+
return inner
|
|
50
|
+
.replace(/\\"/g, '"')
|
|
51
|
+
.replace(/\\n/g, "\n")
|
|
52
|
+
.replace(/\\r/g, "\r")
|
|
53
|
+
.replace(/\\t/g, "\t")
|
|
54
|
+
.replace(/\\\\/g, "\\");
|
|
55
|
+
}
|
|
56
|
+
return inner.replace(/''/g, "'");
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
export function parseYamlFrontMatter(raw) {
|
|
61
|
+
const root = {};
|
|
62
|
+
const stack = [
|
|
63
|
+
{ indent: -1, value: root },
|
|
64
|
+
];
|
|
65
|
+
const lines = raw.split(/\r?\n/);
|
|
66
|
+
lines.forEach((line, index) => {
|
|
67
|
+
const lineNumber = index + 1;
|
|
68
|
+
if (!line.trim() || line.trimStart().startsWith("#"))
|
|
69
|
+
return;
|
|
70
|
+
if (line.includes("\t")) {
|
|
71
|
+
throw new Error(`line ${lineNumber}: tabs are not allowed in ACE runtime front matter`);
|
|
72
|
+
}
|
|
73
|
+
const indentMatch = line.match(/^ */);
|
|
74
|
+
const indent = indentMatch ? indentMatch[0].length : 0;
|
|
75
|
+
if (indent % 2 !== 0) {
|
|
76
|
+
throw new Error(`line ${lineNumber}: indentation must use multiples of two spaces`);
|
|
77
|
+
}
|
|
78
|
+
const trimmed = line.trim();
|
|
79
|
+
if (trimmed.startsWith("- ")) {
|
|
80
|
+
throw new Error(`line ${lineNumber}: arrays are not supported in ACE runtime front matter`);
|
|
81
|
+
}
|
|
82
|
+
const colonIndex = trimmed.indexOf(":");
|
|
83
|
+
if (colonIndex <= 0) {
|
|
84
|
+
throw new Error(`line ${lineNumber}: expected "key: value" mapping`);
|
|
85
|
+
}
|
|
86
|
+
const key = trimmed.slice(0, colonIndex).trim();
|
|
87
|
+
const valuePart = trimmed.slice(colonIndex + 1).trim();
|
|
88
|
+
if (!/^[A-Za-z0-9_-]+$/.test(key)) {
|
|
89
|
+
throw new Error(`line ${lineNumber}: invalid key "${key}"`);
|
|
90
|
+
}
|
|
91
|
+
while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
|
|
92
|
+
stack.pop();
|
|
93
|
+
}
|
|
94
|
+
const parent = stack[stack.length - 1];
|
|
95
|
+
const expectedIndent = parent.indent < 0 ? 0 : parent.indent + 2;
|
|
96
|
+
if (indent > expectedIndent) {
|
|
97
|
+
throw new Error(`line ${lineNumber}: indentation jumps from ${parent.indent} to ${indent}`);
|
|
98
|
+
}
|
|
99
|
+
if (Object.prototype.hasOwnProperty.call(parent.value, key)) {
|
|
100
|
+
throw new Error(`line ${lineNumber}: duplicate key "${key}"`);
|
|
101
|
+
}
|
|
102
|
+
if (!valuePart) {
|
|
103
|
+
const child = {};
|
|
104
|
+
parent.value[key] = child;
|
|
105
|
+
stack.push({ indent, value: child });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
parent.value[key] = parseYamlScalar(valuePart, lineNumber);
|
|
109
|
+
});
|
|
110
|
+
return root;
|
|
111
|
+
}
|
|
112
|
+
export function extractFrontMatter(raw) {
|
|
113
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/);
|
|
114
|
+
if (!match) {
|
|
115
|
+
throw new Error("ACE_WORKFLOW.md must start with YAML front matter delimited by leading and trailing --- lines");
|
|
116
|
+
}
|
|
117
|
+
const frontMatter = match[1];
|
|
118
|
+
const body = raw.slice(match[0].length);
|
|
119
|
+
return { front_matter: frontMatter, body };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=runtime-profile-syntax.js.map
|
|
@@ -5,18 +5,20 @@ export declare const RUNTIME_PROFILE_REL_PATH = "agent-state/ACE_WORKFLOW.md";
|
|
|
5
5
|
export declare const RUNTIME_PROFILE_SCHEMA_REL_PATH = "agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json";
|
|
6
6
|
export declare const RUNTIME_PROFILE_SCHEMA_NAME = "ace-runtime-profile@1.0.0";
|
|
7
7
|
export declare const DEFAULT_RUNTIME_TOOL_REGISTRY_REL_PATH = "agent-state/runtime-tool-specs.json";
|
|
8
|
-
export declare const DEFAULT_EXECUTOR_MAX_TURNS =
|
|
9
|
-
export declare const DEFAULT_EXECUTOR_TURN_TIMEOUT_MS =
|
|
8
|
+
export declare const DEFAULT_EXECUTOR_MAX_TURNS = 0;
|
|
9
|
+
export declare const DEFAULT_EXECUTOR_TURN_TIMEOUT_MS = 0;
|
|
10
10
|
export declare const DEFAULT_VERICIFY_BRIDGE_REL_PATH = "agent-state/vericify/ace-bridge.json";
|
|
11
11
|
export type RuntimeModelClass = "frontier" | "mid" | "small_local";
|
|
12
|
-
export declare const DEFAULT_STALL_WINDOW_MS =
|
|
13
|
-
export declare const
|
|
12
|
+
export declare const DEFAULT_STALL_WINDOW_MS = 3600000;
|
|
13
|
+
export declare const DEFAULT_STALL_WARNING_MS = 600000;
|
|
14
|
+
export declare const DEFAULT_TURN_BUDGET_MS = 0;
|
|
14
15
|
export declare const DEFAULT_MAX_STALL_RESTARTS = 3;
|
|
15
16
|
export declare const DEFAULT_INITIAL_BACKOFF_MS = 5000;
|
|
16
17
|
export declare const DEFAULT_MAX_RETRY_BACKOFF_MS = 300000;
|
|
17
18
|
export interface ModelClassLivenessDefaults {
|
|
18
19
|
turn_budget_ms: number;
|
|
19
20
|
stall_window_ms: number;
|
|
21
|
+
stall_warning_ms: number;
|
|
20
22
|
max_stall_restarts: number;
|
|
21
23
|
initial_backoff_ms: number;
|
|
22
24
|
max_retry_backoff_ms: number;
|
|
@@ -36,6 +38,19 @@ export declare function resolveEffectiveSurgicalReadBudget(profile: RuntimeProfi
|
|
|
36
38
|
export declare const DEFAULT_VERICIFY_PROCESS_POST_LOG_REL_PATH = "agent-state/vericify/process-posts.json";
|
|
37
39
|
declare const runtimeProfileSchema: z.ZodObject<{
|
|
38
40
|
ace_runtime_version: z.ZodLiteral<"1.0.0">;
|
|
41
|
+
learning: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
42
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
43
|
+
distill_min_items: z.ZodDefault<z.ZodNumber>;
|
|
44
|
+
distill_min_goals: z.ZodDefault<z.ZodNumber>;
|
|
45
|
+
max_open_learning_steps: z.ZodDefault<z.ZodLiteral<1>>;
|
|
46
|
+
distill_cooldown_days: z.ZodDefault<z.ZodNumber>;
|
|
47
|
+
max_learned_skills: z.ZodDefault<z.ZodNumber>;
|
|
48
|
+
serve_max_lessons: z.ZodDefault<z.ZodNumber>;
|
|
49
|
+
serve_max_skills: z.ZodDefault<z.ZodNumber>;
|
|
50
|
+
serve_max_tokens: z.ZodDefault<z.ZodNumber>;
|
|
51
|
+
retire_unhelpful_after_serves: z.ZodDefault<z.ZodNumber>;
|
|
52
|
+
instructions_require_approval: z.ZodDefault<z.ZodLiteral<true>>;
|
|
53
|
+
}, z.core.$strict>>>;
|
|
39
54
|
runtime: z.ZodObject<{
|
|
40
55
|
mode: z.ZodEnum<{
|
|
41
56
|
interactive: "interactive";
|
|
@@ -63,6 +78,8 @@ declare const runtimeProfileSchema: z.ZodObject<{
|
|
|
63
78
|
turn_sandbox_policy: z.ZodNullable<z.ZodObject<{}, z.core.$catchall<z.ZodUnknown>>>;
|
|
64
79
|
max_turns: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
65
80
|
turn_timeout_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
81
|
+
stall_window_ms: z.ZodOptional<z.ZodNumber>;
|
|
82
|
+
stall_warning_ms: z.ZodOptional<z.ZodNumber>;
|
|
66
83
|
}, z.core.$strict>;
|
|
67
84
|
tools: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
68
85
|
registry_path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
@@ -93,8 +110,8 @@ declare const runtimeProfileSchema: z.ZodObject<{
|
|
|
93
110
|
tracker: z.ZodObject<{
|
|
94
111
|
kind: z.ZodEnum<{
|
|
95
112
|
memory: "memory";
|
|
96
|
-
none: "none";
|
|
97
113
|
external: "external";
|
|
114
|
+
none: "none";
|
|
98
115
|
}>;
|
|
99
116
|
config: z.ZodObject<{}, z.core.$catchall<z.ZodUnknown>>;
|
|
100
117
|
}, z.core.$strict>;
|
|
@@ -103,6 +120,21 @@ declare const runtimeProfileSchema: z.ZodObject<{
|
|
|
103
120
|
http_port: z.ZodNullable<z.ZodNumber>;
|
|
104
121
|
vericify_bridge: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
105
122
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
123
|
+
legacy_auto_posts: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
124
|
+
api_path: z.ZodOptional<z.ZodString>;
|
|
125
|
+
native: z.ZodOptional<z.ZodObject<{
|
|
126
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
127
|
+
executable: z.ZodOptional<z.ZodString>;
|
|
128
|
+
data_dir: z.ZodOptional<z.ZodString>;
|
|
129
|
+
workspace_root: z.ZodOptional<z.ZodString>;
|
|
130
|
+
workspace_id: z.ZodOptional<z.ZodString>;
|
|
131
|
+
incarnation: z.ZodOptional<z.ZodString>;
|
|
132
|
+
query_timeout_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
133
|
+
max_pages: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
134
|
+
max_bytes: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
135
|
+
retries: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
136
|
+
acceptance_wait_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
137
|
+
}, z.core.$strict>>;
|
|
106
138
|
bridge_path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
107
139
|
process_post_path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
108
140
|
}, z.core.$strict>>>;
|
package/dist/runtime-profile.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { parseYamlFrontMatter, extractFrontMatter } from './runtime-profile-syntax.js';
|
|
2
|
+
import { learningPolicySchema, DEFAULT_LEARNING_POLICY } from './learning-policy.js';
|
|
1
3
|
import { createHash } from "node:crypto";
|
|
2
4
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
5
|
import { resolve } from "node:path";
|
|
@@ -10,12 +12,13 @@ export const RUNTIME_PROFILE_REL_PATH = "agent-state/ACE_WORKFLOW.md";
|
|
|
10
12
|
export const RUNTIME_PROFILE_SCHEMA_REL_PATH = "agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json";
|
|
11
13
|
export const RUNTIME_PROFILE_SCHEMA_NAME = "ace-runtime-profile@1.0.0";
|
|
12
14
|
export const DEFAULT_RUNTIME_TOOL_REGISTRY_REL_PATH = "agent-state/runtime-tool-specs.json";
|
|
13
|
-
export const DEFAULT_EXECUTOR_MAX_TURNS =
|
|
14
|
-
export const DEFAULT_EXECUTOR_TURN_TIMEOUT_MS =
|
|
15
|
+
export const DEFAULT_EXECUTOR_MAX_TURNS = 0;
|
|
16
|
+
export const DEFAULT_EXECUTOR_TURN_TIMEOUT_MS = 0;
|
|
15
17
|
export const DEFAULT_VERICIFY_BRIDGE_REL_PATH = "agent-state/vericify/ace-bridge.json";
|
|
16
18
|
// Liveness defaults per model class
|
|
17
|
-
export const DEFAULT_STALL_WINDOW_MS =
|
|
18
|
-
export const
|
|
19
|
+
export const DEFAULT_STALL_WINDOW_MS = 3_600_000; // 60 minutes of silence before termination
|
|
20
|
+
export const DEFAULT_STALL_WARNING_MS = 600_000; // Warn after 10 minutes of silence
|
|
21
|
+
export const DEFAULT_TURN_BUDGET_MS = 0; // No implicit total turn deadline
|
|
19
22
|
export const DEFAULT_MAX_STALL_RESTARTS = 3;
|
|
20
23
|
export const DEFAULT_INITIAL_BACKOFF_MS = 5_000;
|
|
21
24
|
export const DEFAULT_MAX_RETRY_BACKOFF_MS = 300_000;
|
|
@@ -28,16 +31,18 @@ export function getLivenessDefaults(modelClass) {
|
|
|
28
31
|
switch (modelClass) {
|
|
29
32
|
case "small_local":
|
|
30
33
|
return {
|
|
31
|
-
turn_budget_ms:
|
|
32
|
-
stall_window_ms:
|
|
34
|
+
turn_budget_ms: DEFAULT_TURN_BUDGET_MS,
|
|
35
|
+
stall_window_ms: DEFAULT_STALL_WINDOW_MS,
|
|
36
|
+
stall_warning_ms: DEFAULT_STALL_WARNING_MS,
|
|
33
37
|
max_stall_restarts: 3,
|
|
34
38
|
initial_backoff_ms: 10_000,
|
|
35
39
|
max_retry_backoff_ms: 300_000,
|
|
36
40
|
};
|
|
37
41
|
case "mid":
|
|
38
42
|
return {
|
|
39
|
-
turn_budget_ms:
|
|
40
|
-
stall_window_ms:
|
|
43
|
+
turn_budget_ms: DEFAULT_TURN_BUDGET_MS,
|
|
44
|
+
stall_window_ms: DEFAULT_STALL_WINDOW_MS,
|
|
45
|
+
stall_warning_ms: DEFAULT_STALL_WARNING_MS,
|
|
41
46
|
max_stall_restarts: 3,
|
|
42
47
|
initial_backoff_ms: 5_000,
|
|
43
48
|
max_retry_backoff_ms: 180_000,
|
|
@@ -47,6 +52,7 @@ export function getLivenessDefaults(modelClass) {
|
|
|
47
52
|
return {
|
|
48
53
|
turn_budget_ms: DEFAULT_TURN_BUDGET_MS,
|
|
49
54
|
stall_window_ms: DEFAULT_STALL_WINDOW_MS,
|
|
55
|
+
stall_warning_ms: DEFAULT_STALL_WARNING_MS,
|
|
50
56
|
max_stall_restarts: DEFAULT_MAX_STALL_RESTARTS,
|
|
51
57
|
initial_backoff_ms: DEFAULT_INITIAL_BACKOFF_MS,
|
|
52
58
|
max_retry_backoff_ms: DEFAULT_MAX_RETRY_BACKOFF_MS,
|
|
@@ -72,6 +78,7 @@ const STRING_LIST = z.array(z.string().min(1));
|
|
|
72
78
|
const runtimeProfileSchema = z
|
|
73
79
|
.object({
|
|
74
80
|
ace_runtime_version: z.literal("1.0.0"),
|
|
81
|
+
learning: learningPolicySchema.optional().default(DEFAULT_LEARNING_POLICY),
|
|
75
82
|
runtime: z
|
|
76
83
|
.object({
|
|
77
84
|
mode: z.enum(["interactive", "unattended"]),
|
|
@@ -98,13 +105,15 @@ const runtimeProfileSchema = z
|
|
|
98
105
|
approval_policy: z.union([z.string(), ANY_OBJECT]),
|
|
99
106
|
thread_sandbox: z.string().min(1),
|
|
100
107
|
turn_sandbox_policy: ANY_OBJECT.nullable(),
|
|
101
|
-
max_turns: z.number().int().
|
|
108
|
+
max_turns: z.number().int().nonnegative().optional().default(DEFAULT_EXECUTOR_MAX_TURNS),
|
|
102
109
|
turn_timeout_ms: z
|
|
103
110
|
.number()
|
|
104
111
|
.int()
|
|
105
|
-
.
|
|
112
|
+
.nonnegative()
|
|
106
113
|
.optional()
|
|
107
114
|
.default(DEFAULT_EXECUTOR_TURN_TIMEOUT_MS),
|
|
115
|
+
stall_window_ms: z.number().int().nonnegative().optional(),
|
|
116
|
+
stall_warning_ms: z.number().int().nonnegative().optional(),
|
|
108
117
|
})
|
|
109
118
|
.strict(),
|
|
110
119
|
tools: z
|
|
@@ -169,6 +178,22 @@ const runtimeProfileSchema = z
|
|
|
169
178
|
vericify_bridge: z
|
|
170
179
|
.object({
|
|
171
180
|
enabled: z.boolean().optional().default(false),
|
|
181
|
+
// Additive opt-ins: old profiles retain their paths and require no migration.
|
|
182
|
+
legacy_auto_posts: z.boolean().optional().default(false),
|
|
183
|
+
api_path: z.string().min(1).optional(),
|
|
184
|
+
native: z.object({
|
|
185
|
+
enabled: z.boolean().optional().default(false),
|
|
186
|
+
executable: z.string().min(1).optional(),
|
|
187
|
+
data_dir: z.string().min(1).optional(),
|
|
188
|
+
workspace_root: z.string().min(1).optional(),
|
|
189
|
+
workspace_id: z.string().min(1).optional(),
|
|
190
|
+
incarnation: z.string().min(1).optional(),
|
|
191
|
+
query_timeout_ms: z.number().int().min(1000).max(60000).optional().default(15000),
|
|
192
|
+
max_pages: z.number().int().min(1).max(64).optional().default(8),
|
|
193
|
+
max_bytes: z.number().int().min(4096).max(1048576).optional().default(262144),
|
|
194
|
+
retries: z.number().int().min(0).max(3).optional().default(1),
|
|
195
|
+
acceptance_wait_ms: z.number().int().min(0).max(120000).optional().default(15000),
|
|
196
|
+
}).strict().optional(),
|
|
172
197
|
bridge_path: z
|
|
173
198
|
.string()
|
|
174
199
|
.min(1)
|
|
@@ -184,6 +209,7 @@ const runtimeProfileSchema = z
|
|
|
184
209
|
.optional()
|
|
185
210
|
.default({
|
|
186
211
|
enabled: false,
|
|
212
|
+
legacy_auto_posts: false,
|
|
187
213
|
bridge_path: DEFAULT_VERICIFY_BRIDGE_REL_PATH,
|
|
188
214
|
process_post_path: DEFAULT_VERICIFY_PROCESS_POST_LOG_REL_PATH,
|
|
189
215
|
}),
|
|
@@ -263,125 +289,6 @@ function computeSignature(path, content) {
|
|
|
263
289
|
content_sha256: hashContent(content),
|
|
264
290
|
};
|
|
265
291
|
}
|
|
266
|
-
function stripInlineComment(value) {
|
|
267
|
-
let inSingle = false;
|
|
268
|
-
let inDouble = false;
|
|
269
|
-
for (let idx = 0; idx < value.length; idx += 1) {
|
|
270
|
-
const char = value[idx];
|
|
271
|
-
const prev = idx > 0 ? value[idx - 1] : "";
|
|
272
|
-
if (char === "'" && !inDouble)
|
|
273
|
-
inSingle = !inSingle;
|
|
274
|
-
if (char === '"' && !inSingle && prev !== "\\")
|
|
275
|
-
inDouble = !inDouble;
|
|
276
|
-
if (char === "#" && !inSingle && !inDouble) {
|
|
277
|
-
const before = idx > 0 ? value[idx - 1] : "";
|
|
278
|
-
if (!before || /\s/.test(before)) {
|
|
279
|
-
return value.slice(0, idx).trimEnd();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
return value.trimEnd();
|
|
284
|
-
}
|
|
285
|
-
function parseYamlScalar(rawValue, lineNumber) {
|
|
286
|
-
const value = stripInlineComment(rawValue.trim());
|
|
287
|
-
if (value === "null" || value === "~")
|
|
288
|
-
return null;
|
|
289
|
-
if (value === "true")
|
|
290
|
-
return true;
|
|
291
|
-
if (value === "false")
|
|
292
|
-
return false;
|
|
293
|
-
if (value === "{}")
|
|
294
|
-
return {};
|
|
295
|
-
if (value === "[]")
|
|
296
|
-
return [];
|
|
297
|
-
if (/^-?\d+$/.test(value))
|
|
298
|
-
return Number(value);
|
|
299
|
-
if ((value.startsWith("[") && value.endsWith("]")) ||
|
|
300
|
-
(value.startsWith("{") && value.endsWith("}"))) {
|
|
301
|
-
try {
|
|
302
|
-
return JSON.parse(value);
|
|
303
|
-
}
|
|
304
|
-
catch (error) {
|
|
305
|
-
throw new Error(`line ${lineNumber}: invalid JSON-style scalar (${error instanceof Error ? error.message : String(error)})`);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
309
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
310
|
-
const quote = value[0];
|
|
311
|
-
const inner = value.slice(1, -1);
|
|
312
|
-
if (quote === '"') {
|
|
313
|
-
return inner
|
|
314
|
-
.replace(/\\"/g, '"')
|
|
315
|
-
.replace(/\\n/g, "\n")
|
|
316
|
-
.replace(/\\r/g, "\r")
|
|
317
|
-
.replace(/\\t/g, "\t")
|
|
318
|
-
.replace(/\\\\/g, "\\");
|
|
319
|
-
}
|
|
320
|
-
return inner.replace(/''/g, "'");
|
|
321
|
-
}
|
|
322
|
-
return value;
|
|
323
|
-
}
|
|
324
|
-
function parseYamlFrontMatter(raw) {
|
|
325
|
-
const root = {};
|
|
326
|
-
const stack = [
|
|
327
|
-
{ indent: -1, value: root },
|
|
328
|
-
];
|
|
329
|
-
const lines = raw.split(/\r?\n/);
|
|
330
|
-
lines.forEach((line, index) => {
|
|
331
|
-
const lineNumber = index + 1;
|
|
332
|
-
if (!line.trim() || line.trimStart().startsWith("#"))
|
|
333
|
-
return;
|
|
334
|
-
if (line.includes("\t")) {
|
|
335
|
-
throw new Error(`line ${lineNumber}: tabs are not allowed in ACE runtime front matter`);
|
|
336
|
-
}
|
|
337
|
-
const indentMatch = line.match(/^ */);
|
|
338
|
-
const indent = indentMatch ? indentMatch[0].length : 0;
|
|
339
|
-
if (indent % 2 !== 0) {
|
|
340
|
-
throw new Error(`line ${lineNumber}: indentation must use multiples of two spaces`);
|
|
341
|
-
}
|
|
342
|
-
const trimmed = line.trim();
|
|
343
|
-
if (trimmed.startsWith("- ")) {
|
|
344
|
-
throw new Error(`line ${lineNumber}: arrays are not supported in ACE runtime front matter`);
|
|
345
|
-
}
|
|
346
|
-
const colonIndex = trimmed.indexOf(":");
|
|
347
|
-
if (colonIndex <= 0) {
|
|
348
|
-
throw new Error(`line ${lineNumber}: expected "key: value" mapping`);
|
|
349
|
-
}
|
|
350
|
-
const key = trimmed.slice(0, colonIndex).trim();
|
|
351
|
-
const valuePart = trimmed.slice(colonIndex + 1).trim();
|
|
352
|
-
if (!/^[A-Za-z0-9_-]+$/.test(key)) {
|
|
353
|
-
throw new Error(`line ${lineNumber}: invalid key "${key}"`);
|
|
354
|
-
}
|
|
355
|
-
while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
|
|
356
|
-
stack.pop();
|
|
357
|
-
}
|
|
358
|
-
const parent = stack[stack.length - 1];
|
|
359
|
-
const expectedIndent = parent.indent < 0 ? 0 : parent.indent + 2;
|
|
360
|
-
if (indent > expectedIndent) {
|
|
361
|
-
throw new Error(`line ${lineNumber}: indentation jumps from ${parent.indent} to ${indent}`);
|
|
362
|
-
}
|
|
363
|
-
if (Object.prototype.hasOwnProperty.call(parent.value, key)) {
|
|
364
|
-
throw new Error(`line ${lineNumber}: duplicate key "${key}"`);
|
|
365
|
-
}
|
|
366
|
-
if (!valuePart) {
|
|
367
|
-
const child = {};
|
|
368
|
-
parent.value[key] = child;
|
|
369
|
-
stack.push({ indent, value: child });
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
parent.value[key] = parseYamlScalar(valuePart, lineNumber);
|
|
373
|
-
});
|
|
374
|
-
return root;
|
|
375
|
-
}
|
|
376
|
-
function extractFrontMatter(raw) {
|
|
377
|
-
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/);
|
|
378
|
-
if (!match) {
|
|
379
|
-
throw new Error("ACE_WORKFLOW.md must start with YAML front matter delimited by leading and trailing --- lines");
|
|
380
|
-
}
|
|
381
|
-
const frontMatter = match[1];
|
|
382
|
-
const body = raw.slice(match[0].length);
|
|
383
|
-
return { front_matter: frontMatter, body };
|
|
384
|
-
}
|
|
385
292
|
function parseRuntimeProfileContent(raw) {
|
|
386
293
|
const { front_matter, body } = extractFrontMatter(raw);
|
|
387
294
|
if (body.length === 0) {
|
|
@@ -416,7 +416,7 @@ export async function executeRuntimeTool(name, input, context = {}) {
|
|
|
416
416
|
ACE_RUNTIME_WORKSPACE_PATH: workspacePath,
|
|
417
417
|
},
|
|
418
418
|
}),
|
|
419
|
-
timeout_ms: spec.executor.timeout_ms
|
|
419
|
+
timeout_ms: spec.executor.timeout_ms,
|
|
420
420
|
});
|
|
421
421
|
let responseRaw;
|
|
422
422
|
if (existsSync(tempPaths.responsePath)) {
|
package/dist/safe-edit.d.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* Safe-edit module: copy → modify → validate → swap pattern.
|
|
3
3
|
* Prevents bricking by never leaving core files in a broken state.
|
|
4
4
|
*/
|
|
5
|
+
import { type CommandOptions } from "./progress-command.js";
|
|
5
6
|
export interface SafeEditInput {
|
|
7
|
+
command_policy?: CommandOptions;
|
|
6
8
|
/** Workspace-relative path to edit. */
|
|
7
9
|
path: string;
|
|
8
10
|
/** New file content. */
|
|
@@ -41,6 +43,7 @@ export interface TestSuiteResult {
|
|
|
41
43
|
output: string;
|
|
42
44
|
command: string;
|
|
43
45
|
duration_ms: number;
|
|
46
|
+
reason_code?: string;
|
|
44
47
|
}
|
|
45
48
|
export interface DiffResult {
|
|
46
49
|
has_diff: boolean;
|
|
@@ -62,18 +65,19 @@ export interface GcStagingResult {
|
|
|
62
65
|
errors: string[];
|
|
63
66
|
}
|
|
64
67
|
export declare function gcStaging(input?: GcStagingInput): GcStagingResult;
|
|
65
|
-
export declare function safeEditFile(input: SafeEditInput): SafeEditResult
|
|
66
|
-
export declare function runTestSuite(command?: string): TestSuiteResult
|
|
68
|
+
export declare function safeEditFile(input: SafeEditInput): Promise<SafeEditResult>;
|
|
69
|
+
export declare function runTestSuite(command?: string, options?: CommandOptions): Promise<TestSuiteResult>;
|
|
67
70
|
export declare function diffContents(original: string, updated: string): DiffResult;
|
|
68
71
|
export declare function diffFiles(pathA: string, pathB: string): DiffResult & {
|
|
69
72
|
error?: string;
|
|
70
73
|
};
|
|
71
74
|
export interface ApplyPatchInput {
|
|
75
|
+
command_policy?: CommandOptions;
|
|
72
76
|
path: string;
|
|
73
77
|
patch: string;
|
|
74
78
|
expected_base_hash?: string;
|
|
75
79
|
validation_command?: string;
|
|
76
80
|
test_command?: string;
|
|
77
81
|
}
|
|
78
|
-
export declare function applyPatch(input: ApplyPatchInput): SafeEditResult
|
|
82
|
+
export declare function applyPatch(input: ApplyPatchInput): Promise<SafeEditResult>;
|
|
79
83
|
//# sourceMappingURL=safe-edit.d.ts.map
|