inferoa 0.1.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/LICENSE +176 -0
- package/README.md +154 -0
- package/dist/src/app.d.ts +16 -0
- package/dist/src/app.js +17 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/autoresearch/state.d.ts +106 -0
- package/dist/src/autoresearch/state.js +469 -0
- package/dist/src/autoresearch/state.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +415 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/code-intelligence/codegraph-engine.d.ts +55 -0
- package/dist/src/code-intelligence/codegraph-engine.js +593 -0
- package/dist/src/code-intelligence/codegraph-engine.js.map +1 -0
- package/dist/src/code-intelligence/hub.d.ts +37 -0
- package/dist/src/code-intelligence/hub.js +65 -0
- package/dist/src/code-intelligence/hub.js.map +1 -0
- package/dist/src/config/config.d.ts +12 -0
- package/dist/src/config/config.js +229 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/defaults.d.ts +2 -0
- package/dist/src/config/defaults.js +44 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/config/secret-vault.d.ts +3 -0
- package/dist/src/config/secret-vault.js +106 -0
- package/dist/src/config/secret-vault.js.map +1 -0
- package/dist/src/context/compressor.d.ts +33 -0
- package/dist/src/context/compressor.js +501 -0
- package/dist/src/context/compressor.js.map +1 -0
- package/dist/src/context/prompt.d.ts +26 -0
- package/dist/src/context/prompt.js +572 -0
- package/dist/src/context/prompt.js.map +1 -0
- package/dist/src/daemon/serve.d.ts +2 -0
- package/dist/src/daemon/serve.js +11 -0
- package/dist/src/daemon/serve.js.map +1 -0
- package/dist/src/daemon/supervisor.d.ts +33 -0
- package/dist/src/daemon/supervisor.js +252 -0
- package/dist/src/daemon/supervisor.js.map +1 -0
- package/dist/src/goals/state.d.ts +105 -0
- package/dist/src/goals/state.js +736 -0
- package/dist/src/goals/state.js.map +1 -0
- package/dist/src/model/endpoint-signals.d.ts +15 -0
- package/dist/src/model/endpoint-signals.js +186 -0
- package/dist/src/model/endpoint-signals.js.map +1 -0
- package/dist/src/model/gateway.d.ts +11 -0
- package/dist/src/model/gateway.js +455 -0
- package/dist/src/model/gateway.js.map +1 -0
- package/dist/src/plans/state.d.ts +28 -0
- package/dist/src/plans/state.js +123 -0
- package/dist/src/plans/state.js.map +1 -0
- package/dist/src/runtime.d.ts +92 -0
- package/dist/src/runtime.js +757 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/session/store.d.ts +84 -0
- package/dist/src/session/store.js +593 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/workspace.d.ts +2 -0
- package/dist/src/session/workspace.js +14 -0
- package/dist/src/session/workspace.js.map +1 -0
- package/dist/src/skills/registry.d.ts +24 -0
- package/dist/src/skills/registry.js +203 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/tools/autoresearch-tools.d.ts +6 -0
- package/dist/src/tools/autoresearch-tools.js +412 -0
- package/dist/src/tools/autoresearch-tools.js.map +1 -0
- package/dist/src/tools/clarify-tool.d.ts +3 -0
- package/dist/src/tools/clarify-tool.js +107 -0
- package/dist/src/tools/clarify-tool.js.map +1 -0
- package/dist/src/tools/code-intelligence.d.ts +15 -0
- package/dist/src/tools/code-intelligence.js +391 -0
- package/dist/src/tools/code-intelligence.js.map +1 -0
- package/dist/src/tools/context.d.ts +11 -0
- package/dist/src/tools/context.js +2 -0
- package/dist/src/tools/context.js.map +1 -0
- package/dist/src/tools/goal-tools.d.ts +3 -0
- package/dist/src/tools/goal-tools.js +279 -0
- package/dist/src/tools/goal-tools.js.map +1 -0
- package/dist/src/tools/omni-tools.d.ts +8 -0
- package/dist/src/tools/omni-tools.js +349 -0
- package/dist/src/tools/omni-tools.js.map +1 -0
- package/dist/src/tools/permissions.d.ts +11 -0
- package/dist/src/tools/permissions.js +74 -0
- package/dist/src/tools/permissions.js.map +1 -0
- package/dist/src/tools/plan-tools.d.ts +3 -0
- package/dist/src/tools/plan-tools.js +314 -0
- package/dist/src/tools/plan-tools.js.map +1 -0
- package/dist/src/tools/process-tools.d.ts +6 -0
- package/dist/src/tools/process-tools.js +199 -0
- package/dist/src/tools/process-tools.js.map +1 -0
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +187 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/schemas.d.ts +3 -0
- package/dist/src/tools/schemas.js +500 -0
- package/dist/src/tools/schemas.js.map +1 -0
- package/dist/src/tools/skill-tools.d.ts +6 -0
- package/dist/src/tools/skill-tools.js +124 -0
- package/dist/src/tools/skill-tools.js.map +1 -0
- package/dist/src/tools/text-args.d.ts +5 -0
- package/dist/src/tools/text-args.js +22 -0
- package/dist/src/tools/text-args.js.map +1 -0
- package/dist/src/tools/web-search.d.ts +5 -0
- package/dist/src/tools/web-search.js +602 -0
- package/dist/src/tools/web-search.js.map +1 -0
- package/dist/src/tools/workspace-tools.d.ts +17 -0
- package/dist/src/tools/workspace-tools.js +561 -0
- package/dist/src/tools/workspace-tools.js.map +1 -0
- package/dist/src/tui/activity.d.ts +11 -0
- package/dist/src/tui/activity.js +75 -0
- package/dist/src/tui/activity.js.map +1 -0
- package/dist/src/tui/ansi.d.ts +24 -0
- package/dist/src/tui/ansi.js +131 -0
- package/dist/src/tui/ansi.js.map +1 -0
- package/dist/src/tui/app.d.ts +163 -0
- package/dist/src/tui/app.js +4204 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/cache-footer.d.ts +21 -0
- package/dist/src/tui/cache-footer.js +75 -0
- package/dist/src/tui/cache-footer.js.map +1 -0
- package/dist/src/tui/clarify.d.ts +14 -0
- package/dist/src/tui/clarify.js +187 -0
- package/dist/src/tui/clarify.js.map +1 -0
- package/dist/src/tui/composer.d.ts +79 -0
- package/dist/src/tui/composer.js +592 -0
- package/dist/src/tui/composer.js.map +1 -0
- package/dist/src/tui/event-view.d.ts +5 -0
- package/dist/src/tui/event-view.js +392 -0
- package/dist/src/tui/event-view.js.map +1 -0
- package/dist/src/tui/home.d.ts +7 -0
- package/dist/src/tui/home.js +92 -0
- package/dist/src/tui/home.js.map +1 -0
- package/dist/src/tui/markdown.d.ts +18 -0
- package/dist/src/tui/markdown.js +271 -0
- package/dist/src/tui/markdown.js.map +1 -0
- package/dist/src/tui/mode-footer.d.ts +9 -0
- package/dist/src/tui/mode-footer.js +62 -0
- package/dist/src/tui/mode-footer.js.map +1 -0
- package/dist/src/tui/plan-view.d.ts +8 -0
- package/dist/src/tui/plan-view.js +45 -0
- package/dist/src/tui/plan-view.js.map +1 -0
- package/dist/src/tui/prompt-queue.d.ts +18 -0
- package/dist/src/tui/prompt-queue.js +27 -0
- package/dist/src/tui/prompt-queue.js.map +1 -0
- package/dist/src/tui/resize.d.ts +7 -0
- package/dist/src/tui/resize.js +15 -0
- package/dist/src/tui/resize.js.map +1 -0
- package/dist/src/tui/session-picker.d.ts +10 -0
- package/dist/src/tui/session-picker.js +17 -0
- package/dist/src/tui/session-picker.js.map +1 -0
- package/dist/src/tui/session-transcript.d.ts +2 -0
- package/dist/src/tui/session-transcript.js +44 -0
- package/dist/src/tui/session-transcript.js.map +1 -0
- package/dist/src/tui/slash-notice.d.ts +2 -0
- package/dist/src/tui/slash-notice.js +9 -0
- package/dist/src/tui/slash-notice.js.map +1 -0
- package/dist/src/tui/slash.d.ts +21 -0
- package/dist/src/tui/slash.js +103 -0
- package/dist/src/tui/slash.js.map +1 -0
- package/dist/src/tui/splash.d.ts +4 -0
- package/dist/src/tui/splash.js +64 -0
- package/dist/src/tui/splash.js.map +1 -0
- package/dist/src/tui/tool-renderer.d.ts +6 -0
- package/dist/src/tui/tool-renderer.js +1024 -0
- package/dist/src/tui/tool-renderer.js.map +1 -0
- package/dist/src/tui/transcript-spacing.d.ts +1 -0
- package/dist/src/tui/transcript-spacing.js +4 -0
- package/dist/src/tui/transcript-spacing.js.map +1 -0
- package/dist/src/types.d.ts +220 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/util/abort.d.ts +3 -0
- package/dist/src/util/abort.js +19 -0
- package/dist/src/util/abort.js.map +1 -0
- package/dist/src/util/clock.d.ts +2 -0
- package/dist/src/util/clock.js +7 -0
- package/dist/src/util/clock.js.map +1 -0
- package/dist/src/util/fs.d.ts +13 -0
- package/dist/src/util/fs.js +75 -0
- package/dist/src/util/fs.js.map +1 -0
- package/dist/src/util/hash.d.ts +6 -0
- package/dist/src/util/hash.js +50 -0
- package/dist/src/util/hash.js.map +1 -0
- package/dist/src/util/limit.d.ts +11 -0
- package/dist/src/util/limit.js +29 -0
- package/dist/src/util/limit.js.map +1 -0
- package/dist/src/util/types.d.ts +22 -0
- package/dist/src/util/types.js +33 -0
- package/dist/src/util/types.js.map +1 -0
- package/dist/src/validation/acceptance.d.ts +12 -0
- package/dist/src/validation/acceptance.js +251 -0
- package/dist/src/validation/acceptance.js.map +1 -0
- package/dist/src/validation/milestone.d.ts +2 -0
- package/dist/src/validation/milestone.js +141 -0
- package/dist/src/validation/milestone.js.map +1 -0
- package/docs/final-acceptance-task.md +193 -0
- package/docs/public-source-hygiene.md +21 -0
- package/docs/roadmap.md +265 -0
- package/docs/tui-product-design.md +270 -0
- package/package.json +67 -0
- package/skills/coding-workflow/SKILL.md +16 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract a non-empty string field from an unknown value, or return undefined.
|
|
3
|
+
*/
|
|
4
|
+
export function stringField(value) {
|
|
5
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract a JsonObject from an unknown value, or return an empty object.
|
|
9
|
+
*/
|
|
10
|
+
export function objectField(value) {
|
|
11
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extract a number from an unknown value with a fallback default.
|
|
15
|
+
*/
|
|
16
|
+
export function numberOrDefault(value, fallback) {
|
|
17
|
+
const num = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
|
|
18
|
+
return Number.isFinite(num) && num > 0 ? num : fallback;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Return a promise that resolves after the given number of milliseconds.
|
|
22
|
+
*/
|
|
23
|
+
export function delay(ms) {
|
|
24
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Helper to cast a structured object to JsonObject for event/result data.
|
|
28
|
+
* Use this instead of `as unknown as JsonObject` casts.
|
|
29
|
+
*/
|
|
30
|
+
export function toJson(value) {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAgB;IAC9D,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChG,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAoC,KAAQ;IAChE,OAAO,KAA8B,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AcceptanceResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
session_id?: string;
|
|
4
|
+
failures: string[];
|
|
5
|
+
evidence: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare function runFinalAcceptance(options: {
|
|
8
|
+
workspaceRoot: string;
|
|
9
|
+
stateDir?: string;
|
|
10
|
+
configPath?: string;
|
|
11
|
+
daemon?: boolean;
|
|
12
|
+
}): Promise<AcceptanceResult>;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig } from "../config/config.js";
|
|
4
|
+
import { resolveWorkspace } from "../session/workspace.js";
|
|
5
|
+
import { SessionStore } from "../session/store.js";
|
|
6
|
+
import { Runtime } from "../runtime.js";
|
|
7
|
+
import { queueDaemonRun, startDaemon, attachDaemonJob, detachDaemonJob, cancelDaemonJob, daemonStatus } from "../daemon/supervisor.js";
|
|
8
|
+
export async function runFinalAcceptance(options) {
|
|
9
|
+
const { config } = await loadConfig(options.workspaceRoot, options.configPath);
|
|
10
|
+
const failures = [];
|
|
11
|
+
if (!config.model_setup.base_url || !config.model_setup.model) {
|
|
12
|
+
failures.push("model_setup.base_url and model_setup.model are required for real endpoint acceptance");
|
|
13
|
+
}
|
|
14
|
+
if (config.model_setup.provider === "external") {
|
|
15
|
+
failures.push("final acceptance requires a direct vLLM or vLLM Semantic Router chat endpoint; external providers are compatibility validation, not the primary vLLM acceptance path");
|
|
16
|
+
}
|
|
17
|
+
for (const [name, endpoint] of Object.entries({
|
|
18
|
+
vision: config.omni.endpoints.vision,
|
|
19
|
+
image_generation: config.omni.endpoints.image_generation,
|
|
20
|
+
video_generation: config.omni.endpoints.video_generation,
|
|
21
|
+
})) {
|
|
22
|
+
if (!config.omni.enabled || !endpoint?.base_url || !endpoint.model) {
|
|
23
|
+
failures.push(`omni.${name} endpoint with base_url and model is required`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (failures.length) {
|
|
27
|
+
return { ok: false, failures, evidence: { config_checked: true } };
|
|
28
|
+
}
|
|
29
|
+
config.context.force_compression = true;
|
|
30
|
+
const workspace = await resolveWorkspace(options.workspaceRoot, config, options.workspaceRoot);
|
|
31
|
+
const store = await SessionStore.open(options.stateDir);
|
|
32
|
+
try {
|
|
33
|
+
const runtime = new Runtime(config, workspace, store);
|
|
34
|
+
const fixture = await ensureImageFixture(workspace.root);
|
|
35
|
+
const taskPrompt = [
|
|
36
|
+
"Run the Inferoa final acceptance coding task in this repository.",
|
|
37
|
+
"Use these built-in tools explicitly: todo_write, file_search, read_file, lsp, edit_file or write_file, run_command with one background process, read_process, stop_process, git_status, git_diff, complete_step.",
|
|
38
|
+
"Make a small real repository change by writing docs/evidence/final-acceptance/agent-run.md with session evidence.",
|
|
39
|
+
"Force context compression is enabled; continue after compression.",
|
|
40
|
+
`Then use vision_understanding on ${fixture}, image_generation for a small diagram-like acceptance image, and video_generation for a short acceptance clip.`,
|
|
41
|
+
"Finish only after recording evidence for each required tool category.",
|
|
42
|
+
].join("\n");
|
|
43
|
+
const run = await runtime.run({ prompt: taskPrompt, title: "final-acceptance" });
|
|
44
|
+
const resume = await runtime.run({
|
|
45
|
+
prompt: "Resume validation for the same final acceptance task. Read recent session evidence if needed, run git_status, and complete_step with resume evidence. Then finish concisely.",
|
|
46
|
+
session_id: run.session.session_id,
|
|
47
|
+
});
|
|
48
|
+
const events = store.listEvents(run.session.session_id);
|
|
49
|
+
const toolCalls = events.filter((event) => event.type === "tool.call").map((event) => event.data.tool_name);
|
|
50
|
+
const endpointEvidence = store.listEndpointEvidence(run.session.session_id);
|
|
51
|
+
const promptHashEvents = events.filter((event) => event.type === "model.request.started" && event.data.prompt_hash && event.data.tool_schema_hash);
|
|
52
|
+
const resources = events.filter((event) => event.type === "resource.created");
|
|
53
|
+
const compressionIndex = events.findIndex((event) => event.type === "context.compacted");
|
|
54
|
+
const continuedAfterCompression = compressionIndex >= 0 &&
|
|
55
|
+
events.slice(compressionIndex + 1).some((event) => event.type === "model.request.started" || event.type === "tool.call");
|
|
56
|
+
const cachedTokenEvidence = endpointEvidence
|
|
57
|
+
.map((record) => cachedTokenEvidenceValue(record))
|
|
58
|
+
.filter((value) => typeof value === "number" && value > 0);
|
|
59
|
+
const evidence = {
|
|
60
|
+
session_id: run.session.session_id,
|
|
61
|
+
run_id: run.run_id,
|
|
62
|
+
resume_run_id: resume.run_id,
|
|
63
|
+
tool_calls: toolCalls,
|
|
64
|
+
compressed: compressionIndex >= 0,
|
|
65
|
+
continued_after_compression: continuedAfterCompression,
|
|
66
|
+
endpoint_evidence: endpointEvidence,
|
|
67
|
+
prompt_hash_event_count: promptHashEvents.length,
|
|
68
|
+
resource_count: resources.length,
|
|
69
|
+
resume_event_count: events.filter((event) => event.type === "session.resumed").length,
|
|
70
|
+
direct_cached_token_evidence: cachedTokenEvidence,
|
|
71
|
+
};
|
|
72
|
+
requireTool(failures, toolCalls, "file_search");
|
|
73
|
+
requireAnyTool(failures, toolCalls, "read tool", ["read_file", "read_resource"]);
|
|
74
|
+
requireAnyTool(failures, toolCalls, "edit tool", ["edit_file", "write_file", "apply_patch", "ast_edit"]);
|
|
75
|
+
requireTool(failures, toolCalls, "run_command");
|
|
76
|
+
requireTool(failures, toolCalls, "read_process");
|
|
77
|
+
requireTool(failures, toolCalls, "stop_process");
|
|
78
|
+
requireTool(failures, toolCalls, "git_status");
|
|
79
|
+
requireTool(failures, toolCalls, "git_diff");
|
|
80
|
+
requireTool(failures, toolCalls, "todo_write");
|
|
81
|
+
requireTool(failures, toolCalls, "complete_step");
|
|
82
|
+
requireAnyTool(failures, toolCalls, "code-intelligence tool", ["lsp", "ast_grep", "ast_edit"]);
|
|
83
|
+
requireTool(failures, toolCalls, "vision_understanding");
|
|
84
|
+
requireTool(failures, toolCalls, "image_generation");
|
|
85
|
+
requireTool(failures, toolCalls, "video_generation");
|
|
86
|
+
if (compressionIndex < 0) {
|
|
87
|
+
failures.push("context compression did not occur");
|
|
88
|
+
}
|
|
89
|
+
if (!continuedAfterCompression) {
|
|
90
|
+
failures.push("no persisted model/tool work occurred after context compression");
|
|
91
|
+
}
|
|
92
|
+
if (!endpointEvidence.length) {
|
|
93
|
+
failures.push("endpoint evidence was not persisted");
|
|
94
|
+
}
|
|
95
|
+
if (endpointEvidence.some(endpointExposesCacheMetrics) && cachedTokenEvidence.length === 0) {
|
|
96
|
+
failures.push("direct vLLM cached-token evidence was not recorded even though cache metrics were exposed");
|
|
97
|
+
}
|
|
98
|
+
if (!promptHashEvents.length) {
|
|
99
|
+
failures.push("prompt hash and tool schema hash evidence was not persisted");
|
|
100
|
+
}
|
|
101
|
+
if (!resources.length) {
|
|
102
|
+
failures.push("managed resources were not persisted");
|
|
103
|
+
}
|
|
104
|
+
if (events.filter((event) => event.type === "session.resumed").length < 2) {
|
|
105
|
+
failures.push("resume evidence was not persisted for the same session");
|
|
106
|
+
}
|
|
107
|
+
if (!events.some((event) => event.type === "process.started")) {
|
|
108
|
+
failures.push("background process start event was not persisted");
|
|
109
|
+
}
|
|
110
|
+
if (!events.some((event) => event.type === "process.stopped" || event.type === "process.stop_requested")) {
|
|
111
|
+
failures.push("background process stop/cancel event was not persisted");
|
|
112
|
+
}
|
|
113
|
+
if (options.daemon) {
|
|
114
|
+
const daemonEvidence = await validateDaemonAcceptance(options.stateDir, workspace.root, run.session.session_id);
|
|
115
|
+
evidence["daemon"] = daemonEvidence;
|
|
116
|
+
if (!daemonEvidence.ok) {
|
|
117
|
+
failures.push(...daemonEvidence.failures);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const reportPath = await writeAcceptanceReport(workspace.root, run.session.session_id, failures, evidence, events);
|
|
121
|
+
evidence["report_path"] = reportPath;
|
|
122
|
+
return {
|
|
123
|
+
ok: failures.length === 0,
|
|
124
|
+
session_id: run.session.session_id,
|
|
125
|
+
failures,
|
|
126
|
+
evidence,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
store.close();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function cachedTokenEvidenceValue(record) {
|
|
134
|
+
const usageCached = numericField(record.usage?.cached_prompt_tokens);
|
|
135
|
+
if (usageCached !== undefined && usageCached > 0) {
|
|
136
|
+
return usageCached;
|
|
137
|
+
}
|
|
138
|
+
const metrics = record.cache_metrics;
|
|
139
|
+
if (!metrics) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
for (const [key, value] of Object.entries(metrics)) {
|
|
143
|
+
if (!isCacheMetricKey(key)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const metric = numericField(value);
|
|
147
|
+
if (metric !== undefined && metric > 0) {
|
|
148
|
+
return metric;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
function endpointExposesCacheMetrics(record) {
|
|
154
|
+
const metrics = record.cache_metrics;
|
|
155
|
+
return Boolean(metrics && Object.keys(metrics).some(isCacheMetricKey));
|
|
156
|
+
}
|
|
157
|
+
function isCacheMetricKey(key) {
|
|
158
|
+
return /prefix_cache_hits|prompt_tokens_cached|local_cache_hit|cache_hit|cached_prompt/i.test(key);
|
|
159
|
+
}
|
|
160
|
+
function numericField(value) {
|
|
161
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
162
|
+
}
|
|
163
|
+
async function validateDaemonAcceptance(stateDir, workspaceRoot, sessionId) {
|
|
164
|
+
const failures = [];
|
|
165
|
+
const status = await startDaemon({ stateDir });
|
|
166
|
+
if (!status.alive) {
|
|
167
|
+
failures.push("daemon did not start");
|
|
168
|
+
}
|
|
169
|
+
const job = await queueDaemonRun({
|
|
170
|
+
stateDir,
|
|
171
|
+
workspaceRoot,
|
|
172
|
+
sessionId,
|
|
173
|
+
prompt: "Daemon validation for the same final acceptance task: run git_status, start a short background process with run_command, read_process, stop_process, then complete_step with daemon evidence.",
|
|
174
|
+
});
|
|
175
|
+
await waitForJobVisible(stateDir, job.job_id, 5_000);
|
|
176
|
+
const detached = await detachDaemonJob(stateDir, job.job_id);
|
|
177
|
+
const attached = await attachDaemonJob(stateDir, job.job_id, { follow: false });
|
|
178
|
+
const cancelledJob = await queueDaemonRun({
|
|
179
|
+
stateDir,
|
|
180
|
+
workspaceRoot,
|
|
181
|
+
sessionId,
|
|
182
|
+
prompt: "Daemon cancellation validation: this job should be cancelled before execution.",
|
|
183
|
+
});
|
|
184
|
+
const cancelled = await cancelDaemonJob(stateDir, cancelledJob.job_id);
|
|
185
|
+
const finalStatus = await daemonStatus(stateDir);
|
|
186
|
+
if (detached.status !== "detached" && detached.status !== "running" && detached.status !== "complete") {
|
|
187
|
+
failures.push(`daemon detach did not produce a detachable job state: ${detached.status}`);
|
|
188
|
+
}
|
|
189
|
+
if (attached.job.status === "failed") {
|
|
190
|
+
failures.push("attached daemon job failed");
|
|
191
|
+
}
|
|
192
|
+
if (cancelled.status !== "cancel_requested" && cancelled.status !== "cancelled") {
|
|
193
|
+
failures.push(`daemon cancel did not persist cancellation state: ${cancelled.status}`);
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
ok: failures.length === 0,
|
|
197
|
+
failures,
|
|
198
|
+
evidence: {
|
|
199
|
+
start_status: status,
|
|
200
|
+
queued_job: job,
|
|
201
|
+
detached,
|
|
202
|
+
attached_job: attached.job,
|
|
203
|
+
cancelled,
|
|
204
|
+
final_status: finalStatus,
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function requireTool(failures, toolCalls, name) {
|
|
209
|
+
if (!toolCalls.includes(name)) {
|
|
210
|
+
failures.push(`missing required tool call: ${name}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function requireAnyTool(failures, toolCalls, category, names) {
|
|
214
|
+
if (!names.some((name) => toolCalls.includes(name))) {
|
|
215
|
+
failures.push(`missing required ${category}: expected one of ${names.join(", ")}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async function waitForJobVisible(stateDir, jobId, timeoutMs) {
|
|
219
|
+
const started = Date.now();
|
|
220
|
+
while (Date.now() - started < timeoutMs) {
|
|
221
|
+
const status = await daemonStatus(stateDir);
|
|
222
|
+
if (status.jobs.some((job) => job.job_id === jobId)) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function writeAcceptanceReport(workspaceRoot, sessionId, failures, evidence, events) {
|
|
229
|
+
const dir = path.join(workspaceRoot, "docs", "evidence", "final-acceptance");
|
|
230
|
+
await fs.mkdir(dir, { recursive: true });
|
|
231
|
+
const file = path.join(dir, `report-${sessionId}.json`);
|
|
232
|
+
await fs.writeFile(file, JSON.stringify({
|
|
233
|
+
ok: failures.length === 0,
|
|
234
|
+
failures,
|
|
235
|
+
evidence,
|
|
236
|
+
event_counts: events.reduce((counts, event) => {
|
|
237
|
+
counts[event.type] = (counts[event.type] ?? 0) + 1;
|
|
238
|
+
return counts;
|
|
239
|
+
}, {}),
|
|
240
|
+
}, null, 2), "utf8");
|
|
241
|
+
return path.relative(workspaceRoot, file);
|
|
242
|
+
}
|
|
243
|
+
async function ensureImageFixture(workspaceRoot) {
|
|
244
|
+
const dir = path.join(workspaceRoot, "docs", "evidence", "final-acceptance");
|
|
245
|
+
await fs.mkdir(dir, { recursive: true });
|
|
246
|
+
const file = path.join(dir, "acceptance-fixture.png");
|
|
247
|
+
const pngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAFgwJ/l0yP7wAAAABJRU5ErkJggg==";
|
|
248
|
+
await fs.writeFile(file, Buffer.from(pngBase64, "base64"));
|
|
249
|
+
return path.relative(workspaceRoot, file);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=acceptance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../../src/validation/acceptance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { CORE_TOOL_DEFINITIONS } from "../tools/schemas.js";
|
|
5
|
+
import { LSP_REGISTRY } from "../tools/code-intelligence.js";
|
|
6
|
+
import { DEFAULT_CONFIG } from "../config/defaults.js";
|
|
7
|
+
const milestoneArg = process.argv[2] ?? "T0";
|
|
8
|
+
const milestone = milestoneArg;
|
|
9
|
+
const checks = {
|
|
10
|
+
T0: async () => [
|
|
11
|
+
await file("README.md"),
|
|
12
|
+
await file("docs/roadmap.md"),
|
|
13
|
+
await file("docs/tui-product-design.md"),
|
|
14
|
+
await file("docs/public-source-hygiene.md"),
|
|
15
|
+
await containsCheck("docs/roadmap.md", "`inferoa` launches the TUI by default.", "TUI-first entrypoint contract"),
|
|
16
|
+
await containsCheck("README.md", "Inference Optimized Agent Harness", "README positioning"),
|
|
17
|
+
],
|
|
18
|
+
T1: async () => [
|
|
19
|
+
await file("src/tui/app.ts"),
|
|
20
|
+
await file("src/tui/slash.ts"),
|
|
21
|
+
await file("src/tui/splash.ts"),
|
|
22
|
+
await containsCheck("src/cli.ts", "new TuiApp", "default CLI launches TUI"),
|
|
23
|
+
await containsCheck("src/tui/app.ts", "readComposer", "custom chat composer"),
|
|
24
|
+
await containsCheck("src/tui/app.ts", "stdout.on(\"resize\"", "resize redraw hooks"),
|
|
25
|
+
await containsCheck("src/tui/app.ts", "chooseSlashCommand", "slash command palette"),
|
|
26
|
+
],
|
|
27
|
+
T2: async () => [
|
|
28
|
+
await containsCheck("src/tui/app.ts", "renderSetupView", "TUI setup wizard"),
|
|
29
|
+
await containsCheck("src/tui/app.ts", "writeSecret", "vault-backed secret write"),
|
|
30
|
+
await containsCheck("src/tui/app.ts", "api_key_ref", "config stores secret refs"),
|
|
31
|
+
await containsCheck("src/tui/app.ts", "probeChatModels", "chat model probing"),
|
|
32
|
+
await containsCheck("src/tui/app.ts", "TUI_OMNI_SETUP_CAPABILITIES", "Omni setup capability list"),
|
|
33
|
+
await containsCheck("src/config/config.ts", "api_key_env?: string", "legacy env auth cleanup"),
|
|
34
|
+
],
|
|
35
|
+
T3: async () => [
|
|
36
|
+
await file("src/tui/tool-renderer.ts"),
|
|
37
|
+
await file("src/tui/markdown.ts"),
|
|
38
|
+
await containsCheck("src/tui/app.ts", "MarkdownStreamRenderer", "streaming markdown renderer"),
|
|
39
|
+
await containsCheck("src/tui/tool-renderer.ts", "renderDiff", "diff renderer"),
|
|
40
|
+
await containsCheck("src/tui/tool-renderer.ts", "collapseCompactToolRows", "compact tool batching"),
|
|
41
|
+
await containsCheck("src/tools/workspace-tools.ts", "diff", "write/edit diff evidence"),
|
|
42
|
+
{ name: "Required model-facing tools present", pass: requiredTools(["file_search", "read_file", "edit_file", "write_file", "run_command", "git_status", "todo_write", "complete_step", "lsp"]) },
|
|
43
|
+
],
|
|
44
|
+
T4: async () => [
|
|
45
|
+
await containsCheck("src/session/store.ts", "renameSession", "session rename support"),
|
|
46
|
+
await containsCheck("src/session/store.ts", "archiveSession", "session archive support"),
|
|
47
|
+
await containsCheck("src/session/store.ts", "acquireLock", "single-writer session locks"),
|
|
48
|
+
await containsCheck("src/tui/app.ts", "renderSessionsView", "TUI sessions view"),
|
|
49
|
+
await containsCheck("src/tui/app.ts", "getLock(session.session_id)", "session lock status display"),
|
|
50
|
+
],
|
|
51
|
+
T5: async () => [
|
|
52
|
+
await file("src/model/endpoint-signals.ts"),
|
|
53
|
+
await file("src/tui/cache-footer.ts"),
|
|
54
|
+
await containsCheck("src/session/store.ts", "recordEndpointEvidence", "endpoint evidence persistence"),
|
|
55
|
+
await containsCheck("src/model/endpoint-signals.ts", "parseCacheMetrics", "prefix-cache metric parsing"),
|
|
56
|
+
await containsCheck("src/tui/cache-footer.ts", "cached_prompt_tokens !== undefined", "hide unavailable cache fields"),
|
|
57
|
+
await containsCheck("src/context/prompt.ts", "tool_schema_hash", "stable tool schema hash evidence"),
|
|
58
|
+
],
|
|
59
|
+
T6: async () => [
|
|
60
|
+
await file("src/context/compressor.ts"),
|
|
61
|
+
{ name: "80% compression threshold configured", pass: DEFAULT_CONFIG.context.compression_threshold === 0.8 },
|
|
62
|
+
await containsCheck("src/runtime.ts", "compression_start", "runtime compression start event"),
|
|
63
|
+
await containsCheck("src/runtime.ts", "compression_end", "runtime compression end event"),
|
|
64
|
+
await containsCheck("src/tui/app.ts", "renderContextView", "TUI context/compression view"),
|
|
65
|
+
await containsCheck("src/context/compressor.ts", "context.compacted", "compaction event persistence"),
|
|
66
|
+
],
|
|
67
|
+
T7: async () => [
|
|
68
|
+
await containsCheck("docs/roadmap.md", "165.245.131.56", "AMD host 1 documented"),
|
|
69
|
+
await containsCheck("docs/roadmap.md", "134.199.199.149", "AMD host 2 documented"),
|
|
70
|
+
await containsCheck("docs/final-acceptance-task.md", "partial deployments may be stopped", "AMD cleanup policy documented"),
|
|
71
|
+
await containsCheck("src/validation/acceptance.ts", "vision: config.omni.endpoints.vision", "acceptance requires Omni vision endpoint"),
|
|
72
|
+
await containsCheck("src/validation/acceptance.ts", "image_generation", "acceptance requires image generation"),
|
|
73
|
+
await containsCheck("src/validation/acceptance.ts", "video_generation", "acceptance requires video generation"),
|
|
74
|
+
],
|
|
75
|
+
T8: async () => [
|
|
76
|
+
await containsCheck("src/model/gateway.ts", "x-session-id", "SR receives stable session id"),
|
|
77
|
+
await containsCheck("src/model/gateway.ts", "x-inferoa-session-id", "Inferoa session header"),
|
|
78
|
+
await containsCheck("src/model/endpoint-signals.ts", "x-router-model", "router metadata capture"),
|
|
79
|
+
await containsCheck("src/tui/app.ts", "vLLM Semantic Router", "TUI setup exposes Semantic Router"),
|
|
80
|
+
],
|
|
81
|
+
T9: async () => [
|
|
82
|
+
await file("src/daemon/supervisor.ts"),
|
|
83
|
+
await containsCheck("src/daemon/supervisor.ts", "attachDaemonJob", "daemon attach"),
|
|
84
|
+
await containsCheck("src/daemon/supervisor.ts", "detachDaemonJob", "daemon detach"),
|
|
85
|
+
await containsCheck("src/daemon/supervisor.ts", "cancelDaemonJob", "daemon cancel"),
|
|
86
|
+
await containsCheck("src/tui/app.ts", "renderJobsView", "TUI daemon jobs view"),
|
|
87
|
+
await containsCheck("src/validation/acceptance.ts", "validateDaemonAcceptance", "final task daemon validation"),
|
|
88
|
+
],
|
|
89
|
+
T10: async () => [
|
|
90
|
+
await file("src/validation/acceptance.ts"),
|
|
91
|
+
await containsCheck("src/validation/acceptance.ts", "runFinalAcceptance", "final acceptance runner"),
|
|
92
|
+
await containsCheck("src/validation/acceptance.ts", "file_search", "acceptance checks file search"),
|
|
93
|
+
await containsCheck("src/validation/acceptance.ts", "continuedAfterCompression", "acceptance checks post-compression work"),
|
|
94
|
+
await containsCheck("src/validation/acceptance.ts", "direct_cached_token_evidence", "acceptance records cached-token evidence"),
|
|
95
|
+
await containsCheck("src/tui/app.ts", "runFinalAcceptance", "TUI acceptance run entrypoint"),
|
|
96
|
+
{ name: "Omni tools present", pass: requiredTools(["vision_understanding", "image_generation", "video_generation"]) },
|
|
97
|
+
{ name: "Core tool surface is broad enough", pass: CORE_TOOL_DEFINITIONS.length >= 30, detail: `${CORE_TOOL_DEFINITIONS.length} tools` },
|
|
98
|
+
{ name: "Code-intelligence registry covers day-0 languages", pass: LSP_REGISTRY.length >= 15, detail: `${LSP_REGISTRY.length} languages` },
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
if (!isMilestone(milestoneArg)) {
|
|
102
|
+
console.error(`Unknown milestone ${milestoneArg}. Expected one of ${Object.keys(checks).join(", ")}.`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const result = await checks[milestone]();
|
|
106
|
+
const failed = result.filter((check) => !check.pass);
|
|
107
|
+
console.log(JSON.stringify({ milestone, ok: failed.length === 0, checks: result }, null, 2));
|
|
108
|
+
if (failed.length) {
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
}
|
|
111
|
+
async function file(target) {
|
|
112
|
+
return { name: `${target} exists`, pass: await exists(target) };
|
|
113
|
+
}
|
|
114
|
+
async function exists(target) {
|
|
115
|
+
try {
|
|
116
|
+
await fs.access(path.resolve(target));
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function containsCheck(target, needle, name) {
|
|
124
|
+
return { name, pass: await contains(target, needle) };
|
|
125
|
+
}
|
|
126
|
+
async function contains(target, needle) {
|
|
127
|
+
try {
|
|
128
|
+
return (await fs.readFile(path.resolve(target), "utf8")).includes(needle);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function requiredTools(names) {
|
|
135
|
+
const present = new Set(CORE_TOOL_DEFINITIONS.map((tool) => tool.name));
|
|
136
|
+
return names.every((name) => present.has(name));
|
|
137
|
+
}
|
|
138
|
+
function isMilestone(value) {
|
|
139
|
+
return Object.prototype.hasOwnProperty.call(checks, value);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=milestone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone.js","sourceRoot":"","sources":["../../../src/validation/milestone.ts"],"names":[],"mappings":"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"}
|