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.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. 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 => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", "\"": "&quot;", "'": "&#39;" }[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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"}