infinity-harness 2.8.9 → 2.8.11
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 +18 -0
- package/dist/extensions/infinity-harness/index.js +3614 -0
- package/dist/extensions/infinity-harness/index.js.map +1 -0
- package/dist/src/approval.js +154 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/core/brief.js +309 -0
- package/dist/src/core/brief.js.map +1 -0
- package/dist/src/core/config.js +539 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/exec.js +106 -0
- package/dist/src/core/exec.js.map +1 -0
- package/dist/src/core/featureList.js +365 -0
- package/dist/src/core/featureList.js.map +1 -0
- package/dist/src/core/fsx.js +123 -0
- package/dist/src/core/fsx.js.map +1 -0
- package/dist/src/core/gates.js +490 -0
- package/dist/src/core/gates.js.map +1 -0
- package/dist/src/core/init.js +480 -0
- package/dist/src/core/init.js.map +1 -0
- package/dist/src/core/lock.js +183 -0
- package/dist/src/core/lock.js.map +1 -0
- package/dist/src/core/modelRouter.js +185 -0
- package/dist/src/core/modelRouter.js.map +1 -0
- package/dist/src/core/paths.js +129 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/phases.js +254 -0
- package/dist/src/core/phases.js.map +1 -0
- package/dist/src/core/plan.js +15 -0
- package/dist/src/core/plan.js.map +1 -0
- package/dist/src/core/runState.js +126 -0
- package/dist/src/core/runState.js.map +1 -0
- package/dist/src/core/settings.js +877 -0
- package/dist/src/core/settings.js.map +1 -0
- package/dist/src/core/skills.js +319 -0
- package/dist/src/core/skills.js.map +1 -0
- package/dist/src/core/skillsAudit.js +194 -0
- package/dist/src/core/skillsAudit.js.map +1 -0
- package/dist/src/core/types.js +77 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/daemon/budget.js +85 -0
- package/dist/src/daemon/budget.js.map +1 -0
- package/dist/src/daemon/guard.js +122 -0
- package/dist/src/daemon/guard.js.map +1 -0
- package/dist/src/daemon/index.js +461 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/isolation.js +84 -0
- package/dist/src/daemon/isolation.js.map +1 -0
- package/dist/src/daemon/preflight.js +131 -0
- package/dist/src/daemon/preflight.js.map +1 -0
- package/dist/src/daemon/server.js +174 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/supervisorState.js +42 -0
- package/dist/src/daemon/supervisorState.js.map +1 -0
- package/dist/src/daemon/worker.js +239 -0
- package/dist/src/daemon/worker.js.map +1 -0
- package/dist/src/daemon/worktree.js +102 -0
- package/dist/src/daemon/worktree.js.map +1 -0
- package/dist/src/escalate.js +312 -0
- package/dist/src/escalate.js.map +1 -0
- package/dist/src/exec/piWorker.js +630 -0
- package/dist/src/exec/piWorker.js.map +1 -0
- package/dist/src/goal.js +317 -0
- package/dist/src/goal.js.map +1 -0
- package/dist/src/goalLoop.js +374 -0
- package/dist/src/goalLoop.js.map +1 -0
- package/dist/src/goalSpec.js +397 -0
- package/dist/src/goalSpec.js.map +1 -0
- package/dist/src/goalState.js +255 -0
- package/dist/src/goalState.js.map +1 -0
- package/dist/src/handoff.js +205 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/intake.js +203 -0
- package/dist/src/intake.js.map +1 -0
- package/dist/src/loop.js +592 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/modelRouter.js +216 -0
- package/dist/src/modelRouter.js.map +1 -0
- package/dist/src/remote.js +246 -0
- package/dist/src/remote.js.map +1 -0
- package/dist/src/replan.js +262 -0
- package/dist/src/replan.js.map +1 -0
- package/dist/src/review.js +54 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rework.js +241 -0
- package/dist/src/rework.js.map +1 -0
- package/dist/src/runState.js +4 -0
- package/dist/src/runState.js.map +1 -0
- package/dist/src/scheduler.js +270 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/supervisor.js +787 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/taskList.js +430 -0
- package/dist/src/taskList.js.map +1 -0
- package/dist/src/ui/config.js +268 -0
- package/dist/src/ui/config.js.map +1 -0
- package/dist/src/ui/dashboard.js +1288 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/display.js +229 -0
- package/dist/src/ui/display.js.map +1 -0
- package/dist/src/ui/planTree.js +219 -0
- package/dist/src/ui/planTree.js.map +1 -0
- package/dist/src/ui/theme.js +298 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/viewState.js +65 -0
- package/dist/src/ui/viewState.js.map +1 -0
- package/dist/src/ui/widget.js +721 -0
- package/dist/src/ui/widget.js.map +1 -0
- package/dist/src/ui/wizard.js +540 -0
- package/dist/src/ui/wizard.js.map +1 -0
- package/dist/src/unstuck.js +210 -0
- package/dist/src/unstuck.js.map +1 -0
- package/dist/src/worker.js +267 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workflow.js +250 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/tests/approval.test.js +144 -0
- package/dist/tests/approval.test.js.map +1 -0
- package/dist/tests/brief.test.js +271 -0
- package/dist/tests/brief.test.js.map +1 -0
- package/dist/tests/config.test.js +320 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/dashboard.test.js +277 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/display.test.js +229 -0
- package/dist/tests/display.test.js.map +1 -0
- package/dist/tests/escalate.test.js +272 -0
- package/dist/tests/escalate.test.js.map +1 -0
- package/dist/tests/featureList.test.js +429 -0
- package/dist/tests/featureList.test.js.map +1 -0
- package/dist/tests/gates.test.js +333 -0
- package/dist/tests/gates.test.js.map +1 -0
- package/dist/tests/goal.test.js +229 -0
- package/dist/tests/goal.test.js.map +1 -0
- package/dist/tests/goalLoop.test.js +170 -0
- package/dist/tests/goalLoop.test.js.map +1 -0
- package/dist/tests/goalSpec.test.js +146 -0
- package/dist/tests/goalSpec.test.js.map +1 -0
- package/dist/tests/goalState.test.js +202 -0
- package/dist/tests/goalState.test.js.map +1 -0
- package/dist/tests/handoff.test.js +127 -0
- package/dist/tests/handoff.test.js.map +1 -0
- package/dist/tests/init.test.js +264 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/intake.test.js +288 -0
- package/dist/tests/intake.test.js.map +1 -0
- package/dist/tests/loop.test.js +453 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/modelRouter.test.js +131 -0
- package/dist/tests/modelRouter.test.js.map +1 -0
- package/dist/tests/phases.test.js +244 -0
- package/dist/tests/phases.test.js.map +1 -0
- package/dist/tests/planTree.test.js +190 -0
- package/dist/tests/planTree.test.js.map +1 -0
- package/dist/tests/remote.test.js +380 -0
- package/dist/tests/remote.test.js.map +1 -0
- package/dist/tests/replan.test.js +113 -0
- package/dist/tests/replan.test.js.map +1 -0
- package/dist/tests/review.test.js +77 -0
- package/dist/tests/review.test.js.map +1 -0
- package/dist/tests/rework.test.js +109 -0
- package/dist/tests/rework.test.js.map +1 -0
- package/dist/tests/routing-live.test.js +121 -0
- package/dist/tests/routing-live.test.js.map +1 -0
- package/dist/tests/runState.test.js +73 -0
- package/dist/tests/runState.test.js.map +1 -0
- package/dist/tests/settings.test.js +311 -0
- package/dist/tests/settings.test.js.map +1 -0
- package/dist/tests/skills.test.js +387 -0
- package/dist/tests/skills.test.js.map +1 -0
- package/dist/tests/supervisor.test.js +437 -0
- package/dist/tests/supervisor.test.js.map +1 -0
- package/dist/tests/surface.test.js +203 -0
- package/dist/tests/surface.test.js.map +1 -0
- package/dist/tests/taskList.test.js +376 -0
- package/dist/tests/taskList.test.js.map +1 -0
- package/dist/tests/theme.test.js +149 -0
- package/dist/tests/theme.test.js.map +1 -0
- package/dist/tests/unstuck.test.js +268 -0
- package/dist/tests/unstuck.test.js.map +1 -0
- package/dist/tests/widget.test.js +424 -0
- package/dist/tests/widget.test.js.map +1 -0
- package/dist/tests/worker.test.js +306 -0
- package/dist/tests/worker.test.js.map +1 -0
- package/dist/tests/workflow.test.js +187 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/extensions/infinity-harness/index.ts +39 -12
- package/package.json +5 -2
- package/src/core/modelRouter.ts +23 -1
- package/src/daemon/index.ts +3 -3
- package/src/daemon/worker.ts +28 -5
- package/src/ui/config.ts +25 -1
- package/src/ui/wizard.ts +10 -5
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — daemon/preflight.ts
|
|
3
|
+
*
|
|
4
|
+
* Tier preflight: at arm time, prove each configured tier A/B/C/D/X can serve.
|
|
5
|
+
* getModel() and getAvailable() are registry checks, not auth checks. Only a
|
|
6
|
+
* real call proves a tier serves. A tier that fails preflight blocks arming
|
|
7
|
+
* (naming the tier and reason) — not a warning buried in a log.
|
|
8
|
+
*
|
|
9
|
+
* Distinct tiers are probed once. Probe uses SessionManager.inMemory() + a
|
|
10
|
+
* one-token prompt on a throwaway session with noTools.
|
|
11
|
+
*/
|
|
12
|
+
import { loadConfig } from "../core/config.js";
|
|
13
|
+
function tiersFromConfig(config) {
|
|
14
|
+
const t = config.tiers;
|
|
15
|
+
return t && typeof t === "object" && !Array.isArray(t) ? t : {};
|
|
16
|
+
}
|
|
17
|
+
function dedupeSpecs(tiers) {
|
|
18
|
+
const byKey = new Map();
|
|
19
|
+
for (const [tier, spec] of Object.entries(tiers)) {
|
|
20
|
+
if (!spec?.provider || !spec?.id)
|
|
21
|
+
continue;
|
|
22
|
+
const key = `${spec.provider}/${spec.id}`;
|
|
23
|
+
const entry = byKey.get(key);
|
|
24
|
+
if (entry)
|
|
25
|
+
entry.tiers.push(tier);
|
|
26
|
+
else
|
|
27
|
+
byKey.set(key, { tiers: [tier], spec });
|
|
28
|
+
}
|
|
29
|
+
return byKey;
|
|
30
|
+
}
|
|
31
|
+
export async function runPreflight(opts) {
|
|
32
|
+
const configTiers = opts.tiers ?? tiersFromConfig(loadConfig(opts.targetDir).config);
|
|
33
|
+
const unique = dedupeSpecs(configTiers);
|
|
34
|
+
const results = [];
|
|
35
|
+
const tierResults = {};
|
|
36
|
+
if (unique.size === 0) {
|
|
37
|
+
return { results: [], tierResults: {}, blocked: null };
|
|
38
|
+
}
|
|
39
|
+
for (const [key, entry] of unique) {
|
|
40
|
+
let ok = false;
|
|
41
|
+
let servedModel;
|
|
42
|
+
let reason;
|
|
43
|
+
try {
|
|
44
|
+
if (opts.probe) {
|
|
45
|
+
const r = await opts.probe(entry.spec);
|
|
46
|
+
servedModel = r.served || key;
|
|
47
|
+
ok = true;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Real probe (SDK).
|
|
51
|
+
const { ModelRuntime, SessionManager, createAgentSession, DefaultResourceLoader, SettingsManager } = await import("@earendil-works/pi-coding-agent");
|
|
52
|
+
const runtime = await ModelRuntime.create();
|
|
53
|
+
// getModel is a registry lookup; hasConfiguredAuth guards the credential existence.
|
|
54
|
+
const model = runtime.getModel(entry.spec.provider, entry.spec.id);
|
|
55
|
+
if (!model)
|
|
56
|
+
throw new Error(`unknown model ${key}`);
|
|
57
|
+
const hasAuth = typeof runtime.hasConfiguredAuth === "function" ? runtime.hasConfiguredAuth(entry.spec.provider) : true;
|
|
58
|
+
if (!hasAuth) {
|
|
59
|
+
let check = undefined;
|
|
60
|
+
try {
|
|
61
|
+
check = typeof runtime.checkAuth === "function" ? await runtime.checkAuth(entry.spec.provider) : hasAuth;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
check = undefined;
|
|
65
|
+
}
|
|
66
|
+
if (!check)
|
|
67
|
+
throw new Error(`no credential for provider ${entry.spec.provider}`);
|
|
68
|
+
}
|
|
69
|
+
// Minimal prompt on an in-memory session.
|
|
70
|
+
const { resolve } = await import("node:path");
|
|
71
|
+
const cwd = opts.targetDir;
|
|
72
|
+
const agentDir = "";
|
|
73
|
+
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
74
|
+
const loader = new DefaultResourceLoader({
|
|
75
|
+
cwd,
|
|
76
|
+
agentDir,
|
|
77
|
+
settingsManager,
|
|
78
|
+
noExtensions: true,
|
|
79
|
+
noSkills: true,
|
|
80
|
+
noContextFiles: true,
|
|
81
|
+
});
|
|
82
|
+
await loader.reload();
|
|
83
|
+
const { session } = await createAgentSession({
|
|
84
|
+
model,
|
|
85
|
+
modelRuntime: runtime,
|
|
86
|
+
cwd,
|
|
87
|
+
resourceLoader: loader,
|
|
88
|
+
sessionManager: SessionManager.inMemory(cwd),
|
|
89
|
+
noTools: "all",
|
|
90
|
+
thinkingLevel: "minimal",
|
|
91
|
+
});
|
|
92
|
+
try {
|
|
93
|
+
// One-token probe — the only thing that proves the tier serves.
|
|
94
|
+
await session.prompt("Reply with the single word: ok");
|
|
95
|
+
servedModel = `${session.model?.provider ?? entry.spec.provider}/${session.model?.id ?? entry.spec.id}`;
|
|
96
|
+
ok = true;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
try {
|
|
100
|
+
session.dispose?.();
|
|
101
|
+
}
|
|
102
|
+
catch { }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
ok = false;
|
|
108
|
+
reason = e instanceof Error ? e.message : String(e);
|
|
109
|
+
servedModel = undefined;
|
|
110
|
+
}
|
|
111
|
+
for (const tier of entry.tiers) {
|
|
112
|
+
const res = { tier, ok, ...(servedModel ? { servedModel } : {}), ...(reason ? { reason } : {}) };
|
|
113
|
+
results.push(res);
|
|
114
|
+
tierResults[tier] = {
|
|
115
|
+
provider: entry.spec.provider,
|
|
116
|
+
id: entry.spec.id,
|
|
117
|
+
preflight: ok ? "ok" : "fail",
|
|
118
|
+
...(servedModel ? { servedModel } : {}),
|
|
119
|
+
...(reason ? { reason } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const blocked = results.find(r => !r.ok) ?? null;
|
|
124
|
+
return { results, tierResults, blocked };
|
|
125
|
+
}
|
|
126
|
+
export function formatPreflightResults(results) {
|
|
127
|
+
if (!results.length)
|
|
128
|
+
return "no tiers configured";
|
|
129
|
+
return results.map(r => `${r.tier}:${r.ok ? "ok" : `fail(${r.reason ?? "unknown"})`}${r.servedModel ? `:${r.servedModel}` : ""}`).join(" | ");
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/daemon/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — daemon/server.ts
|
|
3
|
+
*
|
|
4
|
+
* Tiny localhost HTTP for Interfaces -> Daemon control. Daemon binds port 0,
|
|
5
|
+
* OS picks free, daemon.json records the port+token.
|
|
6
|
+
*
|
|
7
|
+
* GET /status (open) → state
|
|
8
|
+
* POST /run | /halt | /pause | /resume | /approve | /replan | /rework (token-checked)
|
|
9
|
+
* GET /dashboard → dashboard.ts HTML
|
|
10
|
+
*/
|
|
11
|
+
import { createServer } from "node:http";
|
|
12
|
+
import { runStatePath, supervisorPath, activityPath } from "../core/paths.js";
|
|
13
|
+
import { readJsonSafe } from "../core/fsx.js";
|
|
14
|
+
import { isDaemonAlive, loadDaemon } from "./guard.js";
|
|
15
|
+
export function startServer(opts) {
|
|
16
|
+
const targetDir = opts.targetDir;
|
|
17
|
+
// token comes from daemon.json if running, or fresh for a new Daemon — caller should supply.
|
|
18
|
+
const expectedToken = opts.token ?? loadDaemon(targetDir)?.token ?? null;
|
|
19
|
+
const server = createServer(async (req, res) => {
|
|
20
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "127.0.0.1"}`);
|
|
21
|
+
const path = url.pathname;
|
|
22
|
+
const writeJson = (code, body) => {
|
|
23
|
+
res.writeHead(code, { "Content-Type": "application/json" });
|
|
24
|
+
res.end(JSON.stringify(body));
|
|
25
|
+
};
|
|
26
|
+
const requireToken = () => {
|
|
27
|
+
if (!expectedToken)
|
|
28
|
+
return true;
|
|
29
|
+
const auth = req.headers.authorization ?? "";
|
|
30
|
+
const queryToken = url.searchParams.get("token") ?? "";
|
|
31
|
+
const headerToken = auth.startsWith("Bearer ") ? auth.slice(7) : "";
|
|
32
|
+
const bodyToken = "";
|
|
33
|
+
// Token is in daemon.json; client reads it and sends via header or query.
|
|
34
|
+
if (headerToken === expectedToken || queryToken === expectedToken)
|
|
35
|
+
return true;
|
|
36
|
+
return false;
|
|
37
|
+
};
|
|
38
|
+
if (req.method === "GET" && (path === "/status" || path === "/api/status")) {
|
|
39
|
+
const daemon = loadDaemon(targetDir);
|
|
40
|
+
const alive = isDaemonAlive(daemon);
|
|
41
|
+
const run = readJsonSafe(runStatePath(targetDir), null);
|
|
42
|
+
const supervisor = readJsonSafe(supervisorPath(targetDir), null);
|
|
43
|
+
const activity = readJsonSafe(activityPath(targetDir), null);
|
|
44
|
+
writeJson(200, { ok: true, alive, daemon, run, supervisor, activity: Array.isArray(activity) ? activity.slice(-20) : [] });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (req.method === "GET" && (path === "/dashboard" || path === "/" || path === "/api/harness")) {
|
|
48
|
+
// /api/harness is the JSON shape; dashboard / path serves the dashboard HTML.
|
|
49
|
+
if (path === "/api/harness") {
|
|
50
|
+
const { loadFeatureList } = await import("../core/featureList.js");
|
|
51
|
+
const { list } = loadFeatureList(targetDir);
|
|
52
|
+
writeJson(200, { baseRevision: list.baseRevision, features: list.features, goals: list.goals, sprints: list.sprints });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const { loadFeatureList } = await import("../core/featureList.js");
|
|
57
|
+
const { loadConfig } = await import("../core/config.js");
|
|
58
|
+
const { renderDashboard } = await import("../ui/dashboard.js");
|
|
59
|
+
const { normalizeDisplay } = await import("../ui/display.js");
|
|
60
|
+
const { readJsonSafe: rjs } = await import("../core/fsx.js");
|
|
61
|
+
const { list } = loadFeatureList(targetDir);
|
|
62
|
+
const cfg = loadConfig(targetDir).config;
|
|
63
|
+
const daemon = loadDaemon(targetDir);
|
|
64
|
+
// dashboard derives viewState same way widget does, but via server data
|
|
65
|
+
const run = rjs(runStatePath(targetDir), null);
|
|
66
|
+
const sup = rjs(supervisorPath(targetDir), null);
|
|
67
|
+
const act = rjs(activityPath(targetDir), []);
|
|
68
|
+
const html = renderDashboard({
|
|
69
|
+
list,
|
|
70
|
+
phase: cfg.currentPhase ?? null,
|
|
71
|
+
enabledPhases: cfg.phases?.enabled ?? null,
|
|
72
|
+
paused: Boolean(cfg.paused),
|
|
73
|
+
gate: null,
|
|
74
|
+
baseRevision: list.baseRevision,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
dashboardUrl: daemon ? `http://127.0.0.1:${daemon.port ?? 0}/dashboard` : null,
|
|
77
|
+
handoffModelNote: null,
|
|
78
|
+
awaitingApproval: cfg.awaitingApproval ?? null,
|
|
79
|
+
display: normalizeDisplay(cfg.display),
|
|
80
|
+
engine: "background",
|
|
81
|
+
workers: sup && typeof sup.name === "string" ? [sup] : [],
|
|
82
|
+
activity: Array.isArray(act) ? act.slice(-40) : [],
|
|
83
|
+
});
|
|
84
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
85
|
+
res.end(html);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
// If dashboard render throws, fall back to minimal page — never 500 the only way to see the run.
|
|
90
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
91
|
+
res.end(`<!doctype html><title>infinity-harness</title>< meta name="viewport" content="width=device-width"><h1>infinity-harness</h1><p>Daemon at ${targetDir}</p><p><a href="/status">/status</a> <a href="/api/harness">/api/harness</a></p><p style="color:#c33">dashboard render error: ${String(e.message ?? e).replace(/[&<>"']/g, c => ({ "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" }[c] ?? c))}</p>`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (req.method === "POST") {
|
|
96
|
+
if (!requireToken()) {
|
|
97
|
+
writeJson(401, { ok: false, error: "invalid token" });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
let body = "";
|
|
101
|
+
req.on("data", chunk => { body += String(chunk); if (body.length > 1_000_000)
|
|
102
|
+
req.destroy(); });
|
|
103
|
+
req.on("end", async () => {
|
|
104
|
+
let parsed = null;
|
|
105
|
+
try {
|
|
106
|
+
parsed = body ? JSON.parse(body) : {};
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
parsed = {};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
if (path === "/run" && opts.onRun) {
|
|
113
|
+
const r = await opts.onRun(parsed);
|
|
114
|
+
writeJson(200, r ?? { ok: true });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (path === "/halt" && opts.onHalt) {
|
|
118
|
+
const r = await opts.onHalt(parsed);
|
|
119
|
+
writeJson(200, r ?? { ok: true });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (path === "/pause" && opts.onPause) {
|
|
123
|
+
const r = await opts.onPause(parsed);
|
|
124
|
+
writeJson(200, r ?? { ok: true });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (path === "/resume" && opts.onResume) {
|
|
128
|
+
const r = await opts.onResume(parsed);
|
|
129
|
+
writeJson(200, r ?? { ok: true });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (path === "/approve" && opts.onApprove) {
|
|
133
|
+
const r = await opts.onApprove(parsed);
|
|
134
|
+
writeJson(200, r ?? { ok: true });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (path === "/replan" && opts.onReplan) {
|
|
138
|
+
const r = await opts.onReplan(parsed);
|
|
139
|
+
writeJson(200, r ?? { ok: true });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (path === "/rework" && opts.onRework) {
|
|
143
|
+
const r = await opts.onRework(parsed);
|
|
144
|
+
writeJson(200, r ?? { ok: true });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (path === "/pilot" && opts.onPilot) {
|
|
148
|
+
const r = await opts.onPilot(parsed);
|
|
149
|
+
writeJson(200, r ?? { ok: true });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
writeJson(404, { ok: false, error: `unknown POST ${path}` });
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
writeJson(500, { ok: false, error: e instanceof Error ? e.message : String(e) });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
writeJson(404, { ok: false, error: `unknown ${req.method} ${path}` });
|
|
161
|
+
});
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
server.once("error", reject);
|
|
164
|
+
server.listen(opts.port ?? 0, "127.0.0.1", () => {
|
|
165
|
+
const addr = server.address();
|
|
166
|
+
const port = addr?.port ?? (opts.port ?? 0);
|
|
167
|
+
resolve({ server, port, token: expectedToken ?? "" });
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
export function stopServer(server) {
|
|
172
|
+
return new Promise((resolve) => server.close(() => resolve()));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — daemon/supervisorState.ts
|
|
3
|
+
*
|
|
4
|
+
* Daemon-owned files: harness/supervisor.json (live worker) and harness/activity.json
|
|
5
|
+
* (last ~400 lines). Only the Daemon writes them; Interfaces only read.
|
|
6
|
+
*
|
|
7
|
+
* SupervisorView captures askedModel vs servedModel per worker — the proof of
|
|
8
|
+
* routing that v2.7 lacked.
|
|
9
|
+
*/
|
|
10
|
+
import { supervisorPath, activityPath } from "../core/paths.js";
|
|
11
|
+
import { readJsonSafe, writeJsonAtomic, ensureDir } from "../core/fsx.js";
|
|
12
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
13
|
+
import { dirname } from "node:path";
|
|
14
|
+
export const ACTIVITY_LIMIT = 400;
|
|
15
|
+
export function loadSupervisor(targetDir) {
|
|
16
|
+
return readJsonSafe(supervisorPath(targetDir), null);
|
|
17
|
+
}
|
|
18
|
+
export function saveSupervisor(targetDir, state) {
|
|
19
|
+
ensureDir(dirname(supervisorPath(targetDir)));
|
|
20
|
+
writeJsonAtomic(supervisorPath(targetDir), { ...state, updatedAt: new Date().toISOString() });
|
|
21
|
+
}
|
|
22
|
+
export function loadActivity(targetDir) {
|
|
23
|
+
const raw = readJsonSafe(activityPath(targetDir), null);
|
|
24
|
+
return Array.isArray(raw) ? raw : [];
|
|
25
|
+
}
|
|
26
|
+
export function appendActivity(targetDir, line) {
|
|
27
|
+
const entry = { at: line.at ?? new Date().toISOString(), level: line.level, worker: line.worker ?? null, text: line.text };
|
|
28
|
+
const cur = loadActivity(targetDir);
|
|
29
|
+
const next = [...cur, entry].slice(-ACTIVITY_LIMIT);
|
|
30
|
+
ensureDir(dirname(activityPath(targetDir)));
|
|
31
|
+
writeJsonAtomic(activityPath(targetDir), next);
|
|
32
|
+
return entry;
|
|
33
|
+
}
|
|
34
|
+
export function clearSupervisor(targetDir) {
|
|
35
|
+
try {
|
|
36
|
+
const p = supervisorPath(targetDir);
|
|
37
|
+
if (existsSync(p))
|
|
38
|
+
unlinkSync(p);
|
|
39
|
+
}
|
|
40
|
+
catch { }
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=supervisorState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisorState.js","sourceRoot":"","sources":["../../../src/daemon/supervisorState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAuClC,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,YAAY,CAAyB,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAsB;IACtE,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9C,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,GAAG,GAAG,YAAY,CAAwB,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAgD;IAChG,MAAM,KAAK,GAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACzI,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IACpD,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5C,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — daemon/worker.ts
|
|
3
|
+
*
|
|
4
|
+
* One AgentSession: create → prompt → settle → dispose, plus the
|
|
5
|
+
* events->TurnResult adapter. prompt() returns void in the SDK, so every
|
|
6
|
+
* turn field (servedModel, usage, tools, summary, contextRatio, compacted)
|
|
7
|
+
* comes via subscribe().
|
|
8
|
+
*
|
|
9
|
+
* v2.7's WorkerSession.prompt returned TurnResult; the SDK's prompt returns void.
|
|
10
|
+
* This file rebuilds the same shape by accumulating events.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Create one SDK AgentSession with harness-free loader + customTools.
|
|
14
|
+
* Returns session + unsubscribe + dispose handles.
|
|
15
|
+
*/
|
|
16
|
+
export async function createWorker(opts) {
|
|
17
|
+
const mod = await import("@earendil-works/pi-coding-agent");
|
|
18
|
+
const { createAgentSession, ModelRuntime, SessionManager, DefaultResourceLoader, SettingsManager } = mod;
|
|
19
|
+
const runtime = await ModelRuntime.create();
|
|
20
|
+
const model = runtime.getModel(opts.modelSpec.provider, opts.modelSpec.id);
|
|
21
|
+
if (!model)
|
|
22
|
+
throw new Error(`unknown model ${opts.modelSpec.provider}/${opts.modelSpec.id}`);
|
|
23
|
+
let loader = opts.resourceLoader;
|
|
24
|
+
if (!loader && !opts.isolationBypassForTest) {
|
|
25
|
+
const sm = SettingsManager.create(opts.cwd, opts.agentDir);
|
|
26
|
+
const l = new DefaultResourceLoader({
|
|
27
|
+
cwd: opts.cwd,
|
|
28
|
+
agentDir: opts.agentDir ?? "",
|
|
29
|
+
settingsManager: sm,
|
|
30
|
+
noExtensions: true,
|
|
31
|
+
noSkills: true,
|
|
32
|
+
noPromptTemplates: true,
|
|
33
|
+
noThemes: true,
|
|
34
|
+
noContextFiles: true,
|
|
35
|
+
});
|
|
36
|
+
await l.reload();
|
|
37
|
+
loader = l;
|
|
38
|
+
}
|
|
39
|
+
// Verify isolation: if loader discovery includes harness, fail fast (unless bypassed for test).
|
|
40
|
+
if (!opts.isolationBypassForTest && loader && typeof loader.getExtensions === "function") {
|
|
41
|
+
try {
|
|
42
|
+
const ext = loader.getExtensions();
|
|
43
|
+
const found = (ext?.extensions ?? []).filter(e => String(e?.id ?? "").includes("infinity-harness"));
|
|
44
|
+
if (found.length)
|
|
45
|
+
throw new Error(`isolation violated: loader has ${found.length} harness extension(s)`);
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
if (e instanceof Error && e.message.includes("isolation violated"))
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const sessionManager = opts.sessionManagerDir
|
|
53
|
+
? SessionManager.create(opts.cwd, opts.sessionManagerDir)
|
|
54
|
+
: SessionManager.inMemory(opts.cwd);
|
|
55
|
+
// inherit means inherit — don't force medium. Only clamp when explicitly set.
|
|
56
|
+
let thinkingLevel = (opts.thinkingLevel ?? opts.modelSpec.thinkingLevel ?? undefined);
|
|
57
|
+
// capability-aware clamp: use pi-default supported levels for the actual model, not provider string
|
|
58
|
+
try {
|
|
59
|
+
const mod = model;
|
|
60
|
+
if (thinkingLevel) {
|
|
61
|
+
// inline getSupportedThinkingLevels semantics
|
|
62
|
+
if (mod && typeof mod.reasoning === "boolean" && mod.reasoning === false) {
|
|
63
|
+
if (thinkingLevel !== "off")
|
|
64
|
+
thinkingLevel = "off";
|
|
65
|
+
}
|
|
66
|
+
else if (mod && mod.reasoning === true) {
|
|
67
|
+
const map = mod.thinkingLevelMap ?? {};
|
|
68
|
+
const all = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
69
|
+
const supported = all.filter(l => {
|
|
70
|
+
const v = map[l];
|
|
71
|
+
if (v === null)
|
|
72
|
+
return false;
|
|
73
|
+
if ((l === "xhigh" || l === "max") && v === undefined)
|
|
74
|
+
return false;
|
|
75
|
+
return true;
|
|
76
|
+
});
|
|
77
|
+
if (!supported.includes(thinkingLevel)) {
|
|
78
|
+
const idx = all.indexOf(thinkingLevel);
|
|
79
|
+
let found = null;
|
|
80
|
+
for (let i = idx; i >= 0; i--)
|
|
81
|
+
if (supported.includes(all[i])) {
|
|
82
|
+
found = all[i];
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (!found)
|
|
86
|
+
for (let i = idx + 1; i < all.length; i++)
|
|
87
|
+
if (supported.includes(all[i])) {
|
|
88
|
+
found = all[i];
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
thinkingLevel = found ?? supported[0] ?? "off";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (thinkingLevel === undefined) {
|
|
96
|
+
// inherit (undefined) — leave undefined so createAgentSession uses pi-default for that model
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch { }
|
|
100
|
+
// B: debug trace of routed model/thinking (readable in harness/daemon.log)
|
|
101
|
+
try {
|
|
102
|
+
console.log("[worker] model=" + opts.modelSpec.provider + "/" + opts.modelSpec.id + " thinking=" + thinkingLevel + " askedModel=" + opts.askedModel);
|
|
103
|
+
}
|
|
104
|
+
catch { }
|
|
105
|
+
const agentTools = opts.customTools;
|
|
106
|
+
const created = await createAgentSession({
|
|
107
|
+
model: model,
|
|
108
|
+
modelRuntime: runtime,
|
|
109
|
+
cwd: opts.cwd,
|
|
110
|
+
thinkingLevel: thinkingLevel,
|
|
111
|
+
resourceLoader: loader,
|
|
112
|
+
customTools: agentTools,
|
|
113
|
+
sessionManager: sessionManager,
|
|
114
|
+
});
|
|
115
|
+
const session = created.session;
|
|
116
|
+
if (created.modelFallbackMessage)
|
|
117
|
+
throw new Error(`modelFallbackMessage: ${created.modelFallbackMessage}`);
|
|
118
|
+
const state = { servedModel: null, usage: null, tools: [], summary: "", compacted: false };
|
|
119
|
+
const unsubscribe = session.subscribe((ev) => {
|
|
120
|
+
if (ev.type === "message_start") {
|
|
121
|
+
// message_start carries provider/model in some SDK versions
|
|
122
|
+
const prov = ev.provider ?? ev.model?.provider;
|
|
123
|
+
const mid = ev.modelId ?? ev.model?.id;
|
|
124
|
+
if (prov || mid)
|
|
125
|
+
state.servedModel = `${prov ?? "?"}:${mid ?? "?"}`;
|
|
126
|
+
}
|
|
127
|
+
else if (ev.type === "message_end") {
|
|
128
|
+
// usage is cumulative per session
|
|
129
|
+
const usage = ev.usage;
|
|
130
|
+
if (usage)
|
|
131
|
+
state.usage = usage;
|
|
132
|
+
const text = ev.content ?? ev.text;
|
|
133
|
+
if (typeof text === "string" && text)
|
|
134
|
+
state.summary = text;
|
|
135
|
+
else if (Array.isArray(ev.content)) {
|
|
136
|
+
const c = ev.content;
|
|
137
|
+
const t = c.filter(x => x?.type === "text").map(x => x.text ?? "").join("\n");
|
|
138
|
+
if (t)
|
|
139
|
+
state.summary = t;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (ev.type === "tool_execution_start" || ev.type === "tool_execution_end") {
|
|
143
|
+
const name = String(ev.toolName ?? ev.name ?? "tool");
|
|
144
|
+
const ok = ev.type === "tool_execution_end" ? (ev.ok ?? true) : true;
|
|
145
|
+
// dedupe: keep last ok per name per end event
|
|
146
|
+
if (ev.type === "tool_execution_end")
|
|
147
|
+
state.tools.push({ name, ok: Boolean(ok) });
|
|
148
|
+
else if (ev.type === "tool_execution_start")
|
|
149
|
+
state.tools.push({ name, ok: true });
|
|
150
|
+
}
|
|
151
|
+
else if (ev.type === "compaction_start") {
|
|
152
|
+
state.compacted = true;
|
|
153
|
+
}
|
|
154
|
+
else if (ev.type === "entry_appended") {
|
|
155
|
+
// session entries include model_change and compaction; capture compaction usage
|
|
156
|
+
const entry = ev.entry;
|
|
157
|
+
if (entry?.type === "compaction" && entry.usage)
|
|
158
|
+
state.compacted = true;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
session,
|
|
163
|
+
unsubscribe,
|
|
164
|
+
dispose: () => { try {
|
|
165
|
+
unsubscribe();
|
|
166
|
+
}
|
|
167
|
+
catch { } try {
|
|
168
|
+
session.dispose();
|
|
169
|
+
}
|
|
170
|
+
catch { } },
|
|
171
|
+
modelFallbackMessage: created.modelFallbackMessage ?? null,
|
|
172
|
+
events: state,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export async function promptWorker(worker, opts) {
|
|
176
|
+
// We need the askedModel — fall back to events.servedModel if not known.
|
|
177
|
+
const askedModel = "asked";
|
|
178
|
+
const startedUsage = worker.events.usage;
|
|
179
|
+
try {
|
|
180
|
+
const timeoutMs = opts.timeoutMs ?? 30 * 60 * 1000;
|
|
181
|
+
let settled = false;
|
|
182
|
+
const timer = timeoutMs > 0 ? setTimeout(() => { if (!settled)
|
|
183
|
+
try {
|
|
184
|
+
worker.session.abort?.();
|
|
185
|
+
}
|
|
186
|
+
catch { } }, timeoutMs) : null;
|
|
187
|
+
try {
|
|
188
|
+
await worker.session.prompt(opts.text);
|
|
189
|
+
settled = true;
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
if (timer)
|
|
193
|
+
clearTimeout(timer);
|
|
194
|
+
settled = true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
199
|
+
// CredentialSynchronizationError is handled by caller; bubble it.
|
|
200
|
+
if (msg.includes("CredentialSynchronizationError") || e?.name === "CredentialSynchronizationError")
|
|
201
|
+
throw e;
|
|
202
|
+
return {
|
|
203
|
+
summary: worker.events.summary,
|
|
204
|
+
tools: worker.events.tools,
|
|
205
|
+
usage: toUsageTotals(worker.events.usage, startedUsage),
|
|
206
|
+
contextRatio: null,
|
|
207
|
+
servedModel: worker.events.servedModel,
|
|
208
|
+
askedModel,
|
|
209
|
+
compacted: worker.events.compacted,
|
|
210
|
+
aborted: msg.toLowerCase().includes("abort"),
|
|
211
|
+
error: msg,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
summary: worker.events.summary,
|
|
216
|
+
tools: worker.events.tools,
|
|
217
|
+
usage: toUsageTotals(worker.events.usage, startedUsage),
|
|
218
|
+
contextRatio: null,
|
|
219
|
+
servedModel: worker.events.servedModel,
|
|
220
|
+
askedModel,
|
|
221
|
+
compacted: worker.events.compacted,
|
|
222
|
+
aborted: false,
|
|
223
|
+
error: null,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function toUsageTotals(cur, _prev) {
|
|
227
|
+
if (!cur)
|
|
228
|
+
return { input: 0, output: 0 };
|
|
229
|
+
// pi usage is cumulative per session; the last reading IS the total.
|
|
230
|
+
const input = typeof cur.input === "number" ? cur.input
|
|
231
|
+
: typeof cur.inputTokens === "number" ? cur.inputTokens : 0;
|
|
232
|
+
const output = typeof cur.output === "number" ? cur.output
|
|
233
|
+
: typeof cur.outputTokens === "number" ? cur.outputTokens : 0;
|
|
234
|
+
const cacheRead = cur.cacheRead ?? 0;
|
|
235
|
+
const cacheWrite = cur.cacheWrite ?? 0;
|
|
236
|
+
const cost = cur.cost ?? 0;
|
|
237
|
+
return { input, output, cacheRead, cacheWrite, cost };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/daemon/worker.ts"],"names":[],"mappings":"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"}
|