@sapiom/harness 0.0.0 → 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.
Files changed (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -43
  3. package/dist/cli/auth.d.ts +26 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +39 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/bin.d.ts +3 -0
  8. package/dist/cli/bin.d.ts.map +1 -0
  9. package/dist/cli/bin.js +163 -0
  10. package/dist/cli/bin.js.map +1 -0
  11. package/dist/cli/consent.d.ts +15 -0
  12. package/dist/cli/consent.d.ts.map +1 -0
  13. package/dist/cli/consent.js +81 -0
  14. package/dist/cli/consent.js.map +1 -0
  15. package/dist/cli/doctor.d.ts +27 -0
  16. package/dist/cli/doctor.d.ts.map +1 -0
  17. package/dist/cli/doctor.js +74 -0
  18. package/dist/cli/doctor.js.map +1 -0
  19. package/dist/cli/machine-id.d.ts +19 -0
  20. package/dist/cli/machine-id.d.ts.map +1 -0
  21. package/dist/cli/machine-id.js +75 -0
  22. package/dist/cli/machine-id.js.map +1 -0
  23. package/dist/cli/paths.d.ts +3 -0
  24. package/dist/cli/paths.d.ts.map +1 -0
  25. package/dist/cli/paths.js +11 -0
  26. package/dist/cli/paths.js.map +1 -0
  27. package/dist/cli/settings.d.ts +26 -0
  28. package/dist/cli/settings.d.ts.map +1 -0
  29. package/dist/cli/settings.js +123 -0
  30. package/dist/cli/settings.js.map +1 -0
  31. package/dist/core/adapters/claude-code.d.ts +41 -0
  32. package/dist/core/adapters/claude-code.d.ts.map +1 -0
  33. package/dist/core/adapters/claude-code.js +238 -0
  34. package/dist/core/adapters/claude-code.js.map +1 -0
  35. package/dist/core/adapters/codex.d.ts +59 -0
  36. package/dist/core/adapters/codex.d.ts.map +1 -0
  37. package/dist/core/adapters/codex.js +319 -0
  38. package/dist/core/adapters/codex.js.map +1 -0
  39. package/dist/core/canvas-body.d.ts +45 -0
  40. package/dist/core/canvas-body.d.ts.map +1 -0
  41. package/dist/core/canvas-body.js +94 -0
  42. package/dist/core/canvas-body.js.map +1 -0
  43. package/dist/core/canvas-cache.d.ts +23 -0
  44. package/dist/core/canvas-cache.d.ts.map +1 -0
  45. package/dist/core/canvas-cache.js +64 -0
  46. package/dist/core/canvas-cache.js.map +1 -0
  47. package/dist/core/canvas-enrich.d.ts +106 -0
  48. package/dist/core/canvas-enrich.d.ts.map +1 -0
  49. package/dist/core/canvas-enrich.js +178 -0
  50. package/dist/core/canvas-enrich.js.map +1 -0
  51. package/dist/core/canvas-enrichment.d.ts +144 -0
  52. package/dist/core/canvas-enrichment.d.ts.map +1 -0
  53. package/dist/core/canvas-enrichment.js +192 -0
  54. package/dist/core/canvas-enrichment.js.map +1 -0
  55. package/dist/core/canvas-graph.d.ts +71 -0
  56. package/dist/core/canvas-graph.d.ts.map +1 -0
  57. package/dist/core/canvas-graph.js +111 -0
  58. package/dist/core/canvas-graph.js.map +1 -0
  59. package/dist/core/canvas-index-classify.d.ts +41 -0
  60. package/dist/core/canvas-index-classify.d.ts.map +1 -0
  61. package/dist/core/canvas-index-classify.js +63 -0
  62. package/dist/core/canvas-index-classify.js.map +1 -0
  63. package/dist/core/canvas-interconnections.d.ts +24 -0
  64. package/dist/core/canvas-interconnections.d.ts.map +1 -0
  65. package/dist/core/canvas-interconnections.js +96 -0
  66. package/dist/core/canvas-interconnections.js.map +1 -0
  67. package/dist/core/canvas-manifest-check.d.ts +15 -0
  68. package/dist/core/canvas-manifest-check.d.ts.map +1 -0
  69. package/dist/core/canvas-manifest-check.js +90 -0
  70. package/dist/core/canvas-manifest-check.js.map +1 -0
  71. package/dist/core/canvas-render.d.ts +73 -0
  72. package/dist/core/canvas-render.d.ts.map +1 -0
  73. package/dist/core/canvas-render.js +145 -0
  74. package/dist/core/canvas-render.js.map +1 -0
  75. package/dist/core/canvas-svg.d.ts +50 -0
  76. package/dist/core/canvas-svg.d.ts.map +1 -0
  77. package/dist/core/canvas-svg.js +240 -0
  78. package/dist/core/canvas-svg.js.map +1 -0
  79. package/dist/core/canvas-template.d.ts +43 -0
  80. package/dist/core/canvas-template.d.ts.map +1 -0
  81. package/dist/core/canvas-template.js +365 -0
  82. package/dist/core/canvas-template.js.map +1 -0
  83. package/dist/core/canvas-watcher.d.ts +25 -0
  84. package/dist/core/canvas-watcher.d.ts.map +1 -0
  85. package/dist/core/canvas-watcher.js +144 -0
  86. package/dist/core/canvas-watcher.js.map +1 -0
  87. package/dist/core/collector/batcher.d.ts +57 -0
  88. package/dist/core/collector/batcher.d.ts.map +1 -0
  89. package/dist/core/collector/batcher.js +143 -0
  90. package/dist/core/collector/batcher.js.map +1 -0
  91. package/dist/core/collector/codex-tailer.d.ts +85 -0
  92. package/dist/core/collector/codex-tailer.d.ts.map +1 -0
  93. package/dist/core/collector/codex-tailer.js +270 -0
  94. package/dist/core/collector/codex-tailer.js.map +1 -0
  95. package/dist/core/collector/normalizer.d.ts +33 -0
  96. package/dist/core/collector/normalizer.d.ts.map +1 -0
  97. package/dist/core/collector/normalizer.js +94 -0
  98. package/dist/core/collector/normalizer.js.map +1 -0
  99. package/dist/core/collector/seq.d.ts +14 -0
  100. package/dist/core/collector/seq.d.ts.map +1 -0
  101. package/dist/core/collector/seq.js +20 -0
  102. package/dist/core/collector/seq.js.map +1 -0
  103. package/dist/core/collector/store.d.ts +16 -0
  104. package/dist/core/collector/store.d.ts.map +1 -0
  105. package/dist/core/collector/store.js +30 -0
  106. package/dist/core/collector/store.js.map +1 -0
  107. package/dist/core/collector/transcript.d.ts +38 -0
  108. package/dist/core/collector/transcript.d.ts.map +1 -0
  109. package/dist/core/collector/transcript.js +110 -0
  110. package/dist/core/collector/transcript.js.map +1 -0
  111. package/dist/core/event-bus.d.ts +9 -0
  112. package/dist/core/event-bus.d.ts.map +1 -0
  113. package/dist/core/event-bus.js +25 -0
  114. package/dist/core/event-bus.js.map +1 -0
  115. package/dist/core/example-seed.d.ts +34 -0
  116. package/dist/core/example-seed.d.ts.map +1 -0
  117. package/dist/core/example-seed.js +277 -0
  118. package/dist/core/example-seed.js.map +1 -0
  119. package/dist/core/inject/claude-settings.d.ts +34 -0
  120. package/dist/core/inject/claude-settings.d.ts.map +1 -0
  121. package/dist/core/inject/claude-settings.js +152 -0
  122. package/dist/core/inject/claude-settings.js.map +1 -0
  123. package/dist/core/inject/mcp-config.d.ts +26 -0
  124. package/dist/core/inject/mcp-config.d.ts.map +1 -0
  125. package/dist/core/inject/mcp-config.js +39 -0
  126. package/dist/core/inject/mcp-config.js.map +1 -0
  127. package/dist/core/inject/retention.d.ts +66 -0
  128. package/dist/core/inject/retention.d.ts.map +1 -0
  129. package/dist/core/inject/retention.js +119 -0
  130. package/dist/core/inject/retention.js.map +1 -0
  131. package/dist/core/inject/system-prompt.d.ts +11 -0
  132. package/dist/core/inject/system-prompt.d.ts.map +1 -0
  133. package/dist/core/inject/system-prompt.js +22 -0
  134. package/dist/core/inject/system-prompt.js.map +1 -0
  135. package/dist/core/macro-runner.d.ts +36 -0
  136. package/dist/core/macro-runner.d.ts.map +1 -0
  137. package/dist/core/macro-runner.js +66 -0
  138. package/dist/core/macro-runner.js.map +1 -0
  139. package/dist/core/macros.d.ts +10 -0
  140. package/dist/core/macros.d.ts.map +1 -0
  141. package/dist/core/macros.js +59 -0
  142. package/dist/core/macros.js.map +1 -0
  143. package/dist/core/path-safety.d.ts +33 -0
  144. package/dist/core/path-safety.d.ts.map +1 -0
  145. package/dist/core/path-safety.js +63 -0
  146. package/dist/core/path-safety.js.map +1 -0
  147. package/dist/core/paths.d.ts +27 -0
  148. package/dist/core/paths.d.ts.map +1 -0
  149. package/dist/core/paths.js +43 -0
  150. package/dist/core/paths.js.map +1 -0
  151. package/dist/core/port-detector.d.ts +69 -0
  152. package/dist/core/port-detector.d.ts.map +1 -0
  153. package/dist/core/port-detector.js +121 -0
  154. package/dist/core/port-detector.js.map +1 -0
  155. package/dist/core/session-manager.d.ts +275 -0
  156. package/dist/core/session-manager.d.ts.map +1 -0
  157. package/dist/core/session-manager.js +729 -0
  158. package/dist/core/session-manager.js.map +1 -0
  159. package/dist/core/task-manager.d.ts +138 -0
  160. package/dist/core/task-manager.d.ts.map +1 -0
  161. package/dist/core/task-manager.js +286 -0
  162. package/dist/core/task-manager.js.map +1 -0
  163. package/dist/core/task-stream.d.ts +32 -0
  164. package/dist/core/task-stream.d.ts.map +1 -0
  165. package/dist/core/task-stream.js +87 -0
  166. package/dist/core/task-stream.js.map +1 -0
  167. package/dist/core/workflow-registry.d.ts +36 -0
  168. package/dist/core/workflow-registry.d.ts.map +1 -0
  169. package/dist/core/workflow-registry.js +220 -0
  170. package/dist/core/workflow-registry.js.map +1 -0
  171. package/dist/core/workspace-context.d.ts +43 -0
  172. package/dist/core/workspace-context.d.ts.map +1 -0
  173. package/dist/core/workspace-context.js +108 -0
  174. package/dist/core/workspace-context.js.map +1 -0
  175. package/dist/core/workspace-watcher.d.ts +26 -0
  176. package/dist/core/workspace-watcher.d.ts.map +1 -0
  177. package/dist/core/workspace-watcher.js +174 -0
  178. package/dist/core/workspace-watcher.js.map +1 -0
  179. package/dist/index.d.ts +6 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +6 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/profiles/canvas-guidelines.d.ts +20 -0
  184. package/dist/profiles/canvas-guidelines.d.ts.map +1 -0
  185. package/dist/profiles/canvas-guidelines.js +48 -0
  186. package/dist/profiles/canvas-guidelines.js.map +1 -0
  187. package/dist/profiles/default.d.ts +10 -0
  188. package/dist/profiles/default.d.ts.map +1 -0
  189. package/dist/profiles/default.js +70 -0
  190. package/dist/profiles/default.js.map +1 -0
  191. package/dist/server/auth.d.ts +9 -0
  192. package/dist/server/auth.d.ts.map +1 -0
  193. package/dist/server/auth.js +28 -0
  194. package/dist/server/auth.js.map +1 -0
  195. package/dist/server/canvas-render.d.ts +18 -0
  196. package/dist/server/canvas-render.d.ts.map +1 -0
  197. package/dist/server/canvas-render.js +24 -0
  198. package/dist/server/canvas-render.js.map +1 -0
  199. package/dist/server/canvas.d.ts +12 -0
  200. package/dist/server/canvas.d.ts.map +1 -0
  201. package/dist/server/canvas.js +174 -0
  202. package/dist/server/canvas.js.map +1 -0
  203. package/dist/server/events-ws.d.ts +11 -0
  204. package/dist/server/events-ws.d.ts.map +1 -0
  205. package/dist/server/events-ws.js +24 -0
  206. package/dist/server/events-ws.js.map +1 -0
  207. package/dist/server/fs.d.ts +4 -0
  208. package/dist/server/fs.d.ts.map +1 -0
  209. package/dist/server/fs.js +88 -0
  210. package/dist/server/fs.js.map +1 -0
  211. package/dist/server/index.d.ts +83 -0
  212. package/dist/server/index.d.ts.map +1 -0
  213. package/dist/server/index.js +0 -0
  214. package/dist/server/index.js.map +1 -0
  215. package/dist/server/ingest.d.ts +74 -0
  216. package/dist/server/ingest.d.ts.map +1 -0
  217. package/dist/server/ingest.js +74 -0
  218. package/dist/server/ingest.js.map +1 -0
  219. package/dist/server/macros.d.ts +32 -0
  220. package/dist/server/macros.d.ts.map +1 -0
  221. package/dist/server/macros.js +76 -0
  222. package/dist/server/macros.js.map +1 -0
  223. package/dist/server/rest.d.ts +75 -0
  224. package/dist/server/rest.d.ts.map +1 -0
  225. package/dist/server/rest.js +235 -0
  226. package/dist/server/rest.js.map +1 -0
  227. package/dist/server/static.d.ts +8 -0
  228. package/dist/server/static.d.ts.map +1 -0
  229. package/dist/server/static.js +36 -0
  230. package/dist/server/static.js.map +1 -0
  231. package/dist/server/terminal-ws.d.ts +9 -0
  232. package/dist/server/terminal-ws.d.ts.map +1 -0
  233. package/dist/server/terminal-ws.js +59 -0
  234. package/dist/server/terminal-ws.js.map +1 -0
  235. package/dist/server/ws-router.d.ts +16 -0
  236. package/dist/server/ws-router.d.ts.map +1 -0
  237. package/dist/server/ws-router.js +26 -0
  238. package/dist/server/ws-router.js.map +1 -0
  239. package/dist/shared/types.d.ts +485 -0
  240. package/dist/shared/types.d.ts.map +1 -0
  241. package/dist/shared/types.js +80 -0
  242. package/dist/shared/types.js.map +1 -0
  243. package/dist/web/assets/index-B9R4TzH7.css +32 -0
  244. package/dist/web/assets/index-Dh97QAgq.js +192 -0
  245. package/dist/web/index.html +27 -0
  246. package/package.json +84 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * TaskManager — registry of headless one-shot agent runs (BackgroundTask in
3
+ * shared/types.ts). A background task (canvas enrichment today; deploy/run
4
+ * candidates later) runs here instead of being injected into the user's
5
+ * interactive session, so a long LLM turn can't hijack their thread.
6
+ *
7
+ * Deliberately NOT SessionManager:
8
+ * - Tasks are spawned via plain child_process (no pty): `claude -p` is
9
+ * non-interactive by design — stdout is a machine-readable event stream to
10
+ * parse, not a TUI to render, and a non-TTY stdout also guarantees the
11
+ * trust dialog is skipped (see the adapter's launchTask contract).
12
+ * - Records live only in memory and never in the session registry, so a task
13
+ * can't appear as a session tab or strand a ghost record: the process
14
+ * exits on its own when its single turn completes, and `exit` is the one
15
+ * lifecycle signal — no readiness gating, no liveness sweep.
16
+ * - The task's generated config dir (keyed by task id, exactly like a
17
+ * session's) is deleted via `onCleanup` when it exits; a crash leaves it
18
+ * to the same boot-time retention sweep real sessions use.
19
+ */
20
+ import { type BackgroundTask, type HarnessAdapter, type HarnessKind } from "../shared/types.js";
21
+ import type { LaunchOptsBuilder } from "./session-manager.js";
22
+ /**
23
+ * The slice of node's ChildProcess a task actually uses — injectable so
24
+ * tests drive fake processes without spawning anything real.
25
+ */
26
+ export interface TaskProcess {
27
+ pid?: number;
28
+ stdout: NodeJS.ReadableStream | null;
29
+ stderr: NodeJS.ReadableStream | null;
30
+ on(event: "exit", listener: (code: number | null) => void): unknown;
31
+ on(event: "error", listener: (err: Error) => void): unknown;
32
+ kill(signal?: NodeJS.Signals): boolean;
33
+ }
34
+ export type TaskSpawnFn = (command: string, args: string[], options: {
35
+ cwd: string;
36
+ env: Record<string, string>;
37
+ }) => TaskProcess;
38
+ /** Thrown when the session's harness adapter has no `launchTask` (codex,
39
+ * today) — the macros router surfaces this as a 400 with this message. */
40
+ export declare class TaskNotSupportedError extends Error {
41
+ constructor(harness: HarnessKind, label: string);
42
+ }
43
+ /** Thrown when the same macro is already running against the same target —
44
+ * two concurrent enrichment runs for one workflow would race on the same
45
+ * render/cache files. The target is the workflow when both tasks carry one
46
+ * (so one session CAN enrich two different workflows concurrently, and two
47
+ * sessions can NEVER double-enrich the same workflow), falling back to the
48
+ * session for workflow-less tasks. */
49
+ export declare class TaskAlreadyRunningError extends Error {
50
+ constructor(label: string);
51
+ }
52
+ export interface RunTaskRequest {
53
+ macroId: string;
54
+ label: string;
55
+ harnessSessionId: string;
56
+ harness: HarnessKind;
57
+ cwd: string;
58
+ prompt: string;
59
+ /** The workflow the task targets, when it has one — carried onto
60
+ * BackgroundTask.workflowPath (pane scoping) and used as the dedupe key. */
61
+ workflowPath?: string | null;
62
+ /** Model override for the headless run (LaunchOpts.model). */
63
+ model?: string;
64
+ /** Turn cap for the headless run (LaunchOpts.maxTurns). */
65
+ maxTurns?: number;
66
+ }
67
+ export interface TaskManagerOptions {
68
+ adapters: Partial<Record<HarnessKind, HarnessAdapter>>;
69
+ /** Base URL the harness server is reachable at, e.g. http://127.0.0.1:4100. */
70
+ ingestUrl: string;
71
+ /** Per-boot secret — same one real sessions get, so the task's hooks can
72
+ * POST to /ingest (events for an unknown session id are silently dropped
73
+ * there, which is exactly what we want for tasks today). */
74
+ ingestToken: string;
75
+ collectorUrl?: string;
76
+ /** Same builder real sessions use — generates the task's own --settings /
77
+ * --mcp-config / system-prompt files under generated/<taskId>. */
78
+ buildLaunchOpts?: LaunchOptsBuilder;
79
+ /** Injectable for tests. Defaults to node:child_process.spawn. */
80
+ spawnProcess?: TaskSpawnFn;
81
+ /** Called once the task's process has exited (either outcome) — the server
82
+ * wires generated-config-dir removal here, mirroring session exit. */
83
+ onCleanup?: (taskId: string) => void;
84
+ now?: () => string;
85
+ generateId?: () => string;
86
+ }
87
+ export type TaskStatusListener = (task: BackgroundTask) => void;
88
+ export declare class TaskManager {
89
+ private readonly adapters;
90
+ private readonly ingestUrl;
91
+ private readonly ingestToken;
92
+ private readonly collectorUrl;
93
+ private readonly buildLaunchOpts;
94
+ private readonly spawnProcess;
95
+ private readonly onCleanup;
96
+ private readonly now;
97
+ private readonly generateId;
98
+ private readonly tasks;
99
+ /** Runs admitted past the dedupe check but not yet registered in `tasks`
100
+ * — the check→register window contains an await (buildLaunchOpts), so
101
+ * without this reservation two near-simultaneous run() calls for the
102
+ * same target both pass the check and both spawn. */
103
+ private readonly pendingRuns;
104
+ private readonly processes;
105
+ private readonly stderrTails;
106
+ /** The final result event's error text, when the stream produced one —
107
+ * preferred over a raw stderr tail for failure display. */
108
+ private readonly resultErrors;
109
+ /** The final result event's success text — published on the finished task
110
+ * as `resultText`, so a structured task's caller can parse the answer. */
111
+ private readonly resultTexts;
112
+ private readonly statusEmitter;
113
+ constructor(options: TaskManagerOptions);
114
+ list(): BackgroundTask[];
115
+ get(id: string): BackgroundTask | undefined;
116
+ onStatusChange(listener: TaskStatusListener): () => void;
117
+ /**
118
+ * Spawns one background task. Resolves once the process is launched (not
119
+ * when it finishes — completion arrives as a task.status broadcast).
120
+ * Throws TaskNotSupportedError / TaskAlreadyRunningError for the two
121
+ * user-addressable refusals; anything else (spawn failure, config
122
+ * generation failure) propagates as-is.
123
+ */
124
+ run(req: RunTaskRequest): Promise<BackgroundTask>;
125
+ /** Kills every still-running task process. Call on server shutdown, same
126
+ * reason as SessionManager.killAll — child processes aren't torn down by
127
+ * the HTTP server closing. */
128
+ killAll(): void;
129
+ private handleStdoutLine;
130
+ /** The single running→finished transition — shared by "exit" and "error",
131
+ * which can both fire for one process, so it's idempotent. */
132
+ private finish;
133
+ /** Drops the oldest finished tasks beyond MAX_FINISHED_TASKS — running
134
+ * tasks are never dropped. */
135
+ private trimFinished;
136
+ private emitStatus;
137
+ }
138
+ //# sourceMappingURL=task-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/core/task-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * TaskManager — registry of headless one-shot agent runs (BackgroundTask in
3
+ * shared/types.ts). A background task (canvas enrichment today; deploy/run
4
+ * candidates later) runs here instead of being injected into the user's
5
+ * interactive session, so a long LLM turn can't hijack their thread.
6
+ *
7
+ * Deliberately NOT SessionManager:
8
+ * - Tasks are spawned via plain child_process (no pty): `claude -p` is
9
+ * non-interactive by design — stdout is a machine-readable event stream to
10
+ * parse, not a TUI to render, and a non-TTY stdout also guarantees the
11
+ * trust dialog is skipped (see the adapter's launchTask contract).
12
+ * - Records live only in memory and never in the session registry, so a task
13
+ * can't appear as a session tab or strand a ghost record: the process
14
+ * exits on its own when its single turn completes, and `exit` is the one
15
+ * lifecycle signal — no readiness gating, no liveness sweep.
16
+ * - The task's generated config dir (keyed by task id, exactly like a
17
+ * session's) is deleted via `onCleanup` when it exits; a crash leaves it
18
+ * to the same boot-time retention sweep real sessions use.
19
+ */
20
+ import { randomUUID } from "node:crypto";
21
+ import { EventEmitter } from "node:events";
22
+ import { spawn as spawnChildProcess } from "node:child_process";
23
+ import { createInterface } from "node:readline";
24
+ import { ENV, } from "../shared/types.js";
25
+ import { parseTaskStreamLine } from "./task-stream.js";
26
+ /** Rolling status-line window kept per task — enough for the activity view's
27
+ * recent-history list without unbounded growth on a chatty run. */
28
+ const MAX_STATUS_LINES = 24;
29
+ /** Rolling stderr tail kept for failure display. */
30
+ const MAX_STDERR_CHARS = 2000;
31
+ /** Finished tasks retained (per whole manager) for late-mounting clients;
32
+ * running tasks are always retained regardless. */
33
+ const MAX_FINISHED_TASKS = 20;
34
+ const defaultSpawn = (command, args, options) => spawnChildProcess(command, args, { ...options, stdio: ["ignore", "pipe", "pipe"] });
35
+ /** Thrown when the session's harness adapter has no `launchTask` (codex,
36
+ * today) — the macros router surfaces this as a 400 with this message. */
37
+ export class TaskNotSupportedError extends Error {
38
+ constructor(harness, label) {
39
+ super(`${label} runs as a background task, which "${harness}" sessions don't support yet — use a Claude Code session.`);
40
+ this.name = "TaskNotSupportedError";
41
+ }
42
+ }
43
+ /** Thrown when the same macro is already running against the same target —
44
+ * two concurrent enrichment runs for one workflow would race on the same
45
+ * render/cache files. The target is the workflow when both tasks carry one
46
+ * (so one session CAN enrich two different workflows concurrently, and two
47
+ * sessions can NEVER double-enrich the same workflow), falling back to the
48
+ * session for workflow-less tasks. */
49
+ export class TaskAlreadyRunningError extends Error {
50
+ constructor(label) {
51
+ super(`${label} is already running.`);
52
+ this.name = "TaskAlreadyRunningError";
53
+ }
54
+ }
55
+ export class TaskManager {
56
+ constructor(options) {
57
+ this.tasks = new Map();
58
+ /** Runs admitted past the dedupe check but not yet registered in `tasks`
59
+ * — the check→register window contains an await (buildLaunchOpts), so
60
+ * without this reservation two near-simultaneous run() calls for the
61
+ * same target both pass the check and both spawn. */
62
+ this.pendingRuns = [];
63
+ this.processes = new Map();
64
+ this.stderrTails = new Map();
65
+ /** The final result event's error text, when the stream produced one —
66
+ * preferred over a raw stderr tail for failure display. */
67
+ this.resultErrors = new Map();
68
+ /** The final result event's success text — published on the finished task
69
+ * as `resultText`, so a structured task's caller can parse the answer. */
70
+ this.resultTexts = new Map();
71
+ this.statusEmitter = new EventEmitter();
72
+ this.adapters = options.adapters;
73
+ this.ingestUrl = options.ingestUrl;
74
+ this.ingestToken = options.ingestToken;
75
+ this.collectorUrl = options.collectorUrl;
76
+ this.buildLaunchOpts = options.buildLaunchOpts ?? (() => ({}));
77
+ this.spawnProcess = options.spawnProcess ?? defaultSpawn;
78
+ this.onCleanup = options.onCleanup ?? (() => { });
79
+ this.now = options.now ?? (() => new Date().toISOString());
80
+ this.generateId = options.generateId ?? randomUUID;
81
+ this.statusEmitter.setMaxListeners(0);
82
+ }
83
+ list() {
84
+ return Array.from(this.tasks.values());
85
+ }
86
+ get(id) {
87
+ return this.tasks.get(id);
88
+ }
89
+ onStatusChange(listener) {
90
+ this.statusEmitter.on("status", listener);
91
+ return () => {
92
+ this.statusEmitter.off("status", listener);
93
+ };
94
+ }
95
+ /**
96
+ * Spawns one background task. Resolves once the process is launched (not
97
+ * when it finishes — completion arrives as a task.status broadcast).
98
+ * Throws TaskNotSupportedError / TaskAlreadyRunningError for the two
99
+ * user-addressable refusals; anything else (spawn failure, config
100
+ * generation failure) propagates as-is.
101
+ */
102
+ async run(req) {
103
+ const adapter = this.adapters[req.harness];
104
+ if (!adapter)
105
+ throw new Error(`No adapter registered for harness "${req.harness}"`);
106
+ if (!adapter.launchTask)
107
+ throw new TaskNotSupportedError(req.harness, req.label);
108
+ const reqWorkflowPath = req.workflowPath ?? null;
109
+ // Workflow-targeted tasks dedupe on the workflow (never two enrichments
110
+ // of one workflow, from any session); workflow-less tasks keep the old
111
+ // per-session key. Checked against running tasks AND runs still being
112
+ // admitted (pendingRuns — see its comment).
113
+ const sameTarget = (other) => other.macroId === req.macroId &&
114
+ (other.workflowPath !== null && reqWorkflowPath !== null
115
+ ? other.workflowPath === reqWorkflowPath
116
+ : other.harnessSessionId === req.harnessSessionId);
117
+ for (const task of this.tasks.values()) {
118
+ if (task.status === "running" && sameTarget(task))
119
+ throw new TaskAlreadyRunningError(req.label);
120
+ }
121
+ if (this.pendingRuns.some(sameTarget))
122
+ throw new TaskAlreadyRunningError(req.label);
123
+ const pending = { macroId: req.macroId, harnessSessionId: req.harnessSessionId, workflowPath: reqWorkflowPath };
124
+ this.pendingRuns.push(pending);
125
+ const releasePending = () => {
126
+ const index = this.pendingRuns.indexOf(pending);
127
+ if (index !== -1)
128
+ this.pendingRuns.splice(index, 1);
129
+ };
130
+ const id = this.generateId();
131
+ let spec;
132
+ try {
133
+ const opts = {
134
+ harnessSessionId: id,
135
+ cwd: req.cwd,
136
+ prompt: req.prompt,
137
+ ...(req.model !== undefined ? { model: req.model } : {}),
138
+ ...(req.maxTurns !== undefined ? { maxTurns: req.maxTurns } : {}),
139
+ ...(await this.buildLaunchOpts(id, { cwd: req.cwd, harness: req.harness })),
140
+ };
141
+ spec = adapter.launchTask(opts);
142
+ }
143
+ catch (err) {
144
+ releasePending();
145
+ throw err;
146
+ }
147
+ const env = {};
148
+ for (const [key, value] of Object.entries(process.env)) {
149
+ if (value !== undefined)
150
+ env[key] = value;
151
+ }
152
+ for (const [key, value] of Object.entries(spec.env)) {
153
+ if (value === null)
154
+ delete env[key];
155
+ else
156
+ env[key] = value;
157
+ }
158
+ env[ENV.ingestUrl] = `${this.ingestUrl.replace(/\/$/, "")}/ingest`;
159
+ env[ENV.ingestToken] = this.ingestToken;
160
+ env[ENV.sessionId] = id;
161
+ if (this.collectorUrl)
162
+ env[ENV.collectorUrl] = this.collectorUrl;
163
+ const task = {
164
+ id,
165
+ macroId: req.macroId,
166
+ label: req.label,
167
+ harnessSessionId: req.harnessSessionId,
168
+ cwd: req.cwd,
169
+ workflowPath: reqWorkflowPath,
170
+ status: "running",
171
+ startedAt: this.now(),
172
+ endedAt: null,
173
+ exitCode: null,
174
+ statusLines: [],
175
+ resultText: null,
176
+ errorTail: null,
177
+ };
178
+ let child;
179
+ try {
180
+ child = this.spawnProcess(spec.command, spec.args, { cwd: spec.cwd, env });
181
+ }
182
+ catch (err) {
183
+ // Never launched — nothing to track, but the generated config files
184
+ // buildLaunchOpts just wrote still need their exit-time cleanup.
185
+ releasePending();
186
+ this.onCleanup(id);
187
+ throw err;
188
+ }
189
+ this.tasks.set(id, task);
190
+ // Registered — the running-task check owns dedupe from here.
191
+ releasePending();
192
+ this.processes.set(id, child);
193
+ this.trimFinished();
194
+ this.emitStatus(task);
195
+ if (child.stdout) {
196
+ const lines = createInterface({ input: child.stdout });
197
+ lines.on("line", (line) => this.handleStdoutLine(id, line));
198
+ }
199
+ child.stderr?.on("data", (chunk) => {
200
+ const tail = (this.stderrTails.get(id) ?? "") + String(chunk);
201
+ this.stderrTails.set(id, tail.slice(-MAX_STDERR_CHARS));
202
+ });
203
+ // A spawn-time failure surfacing async (ENOENT for a missing binary
204
+ // arrives as "error", not "exit") still needs the task reconciled —
205
+ // record the message where the exit handler will pick it up. "error"
206
+ // without a later "exit" is possible for pre-spawn failures, so finish
207
+ // directly; the guard in finish() makes a double call harmless.
208
+ child.on("error", (err) => {
209
+ this.stderrTails.set(id, ((this.stderrTails.get(id) ?? "") + `\n${err.message}`).slice(-MAX_STDERR_CHARS));
210
+ this.finish(id, null);
211
+ });
212
+ child.on("exit", (code) => this.finish(id, code));
213
+ return task;
214
+ }
215
+ /** Kills every still-running task process. Call on server shutdown, same
216
+ * reason as SessionManager.killAll — child processes aren't torn down by
217
+ * the HTTP server closing. */
218
+ killAll() {
219
+ for (const child of this.processes.values()) {
220
+ try {
221
+ child.kill("SIGTERM");
222
+ }
223
+ catch {
224
+ // Already gone.
225
+ }
226
+ }
227
+ }
228
+ handleStdoutLine(id, line) {
229
+ const task = this.tasks.get(id);
230
+ if (!task || task.status !== "running")
231
+ return;
232
+ const update = parseTaskStreamLine(line);
233
+ if (!update)
234
+ return;
235
+ if (update.result?.isError && update.result.text) {
236
+ this.resultErrors.set(id, update.result.text);
237
+ }
238
+ else if (update.result && !update.result.isError) {
239
+ this.resultTexts.set(id, update.result.text);
240
+ }
241
+ if (update.statusLines.length === 0)
242
+ return;
243
+ task.statusLines = [...task.statusLines, ...update.statusLines].slice(-MAX_STATUS_LINES);
244
+ this.emitStatus(task);
245
+ }
246
+ /** The single running→finished transition — shared by "exit" and "error",
247
+ * which can both fire for one process, so it's idempotent. */
248
+ finish(id, exitCode) {
249
+ const task = this.tasks.get(id);
250
+ if (!task || task.status !== "running")
251
+ return;
252
+ const resultError = this.resultErrors.get(id);
253
+ const failed = exitCode !== 0 || resultError !== undefined;
254
+ task.status = failed ? "failed" : "completed";
255
+ task.exitCode = exitCode;
256
+ task.endedAt = this.now();
257
+ if (failed) {
258
+ const stderrTail = this.stderrTails.get(id)?.trim();
259
+ task.errorTail = resultError ?? (stderrTail || `exited with code ${exitCode ?? "unknown"}`);
260
+ }
261
+ else {
262
+ task.resultText = this.resultTexts.get(id) ?? null;
263
+ }
264
+ this.processes.delete(id);
265
+ this.stderrTails.delete(id);
266
+ this.resultErrors.delete(id);
267
+ this.resultTexts.delete(id);
268
+ this.emitStatus(task);
269
+ this.onCleanup(id);
270
+ }
271
+ /** Drops the oldest finished tasks beyond MAX_FINISHED_TASKS — running
272
+ * tasks are never dropped. */
273
+ trimFinished() {
274
+ const finished = this.list().filter((task) => task.status !== "running");
275
+ if (finished.length <= MAX_FINISHED_TASKS)
276
+ return;
277
+ finished
278
+ .sort((a, b) => (a.endedAt ?? "").localeCompare(b.endedAt ?? ""))
279
+ .slice(0, finished.length - MAX_FINISHED_TASKS)
280
+ .forEach((task) => this.tasks.delete(task.id));
281
+ }
282
+ emitStatus(task) {
283
+ this.statusEmitter.emit("status", { ...task, statusLines: [...task.statusLines] });
284
+ }
285
+ }
286
+ //# sourceMappingURL=task-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/core/task-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Parses the line-oriented JSON a background task's agent process writes to
3
+ * stdout (`claude -p --output-format stream-json --verbose`) into the two
4
+ * things TaskManager actually needs: compact human-readable progress lines
5
+ * for the canvas pane's live activity view, and the final result event's
6
+ * error state. Pure and defensive — a task's stdout is another program's
7
+ * output format, so anything unrecognized degrades to "no update", never a
8
+ * throw.
9
+ *
10
+ * Event shapes handled (everything else is ignored):
11
+ * - {"type":"system","subtype":"init",...} → "Agent started"
12
+ * - {"type":"assistant","message":{"content":[...]}} → one line per block:
13
+ * {"type":"tool_use","name":"Write","input":{...}} → "Write <path/hint>"
14
+ * {"type":"text","text":"..."} → truncated snippet
15
+ * - {"type":"result","is_error":bool,"result":"..."} → final result
16
+ */
17
+ export interface TaskStreamUpdate {
18
+ /** Zero or more new progress lines (an assistant message can carry several
19
+ * content blocks). */
20
+ statusLines: string[];
21
+ /** Present only for the final "result" event. */
22
+ result?: {
23
+ isError: boolean;
24
+ text: string;
25
+ };
26
+ }
27
+ /**
28
+ * Parses one stdout line. Returns null for anything that isn't a recognized
29
+ * stream event (blank lines, non-JSON noise, event types we don't render).
30
+ */
31
+ export declare function parseTaskStreamLine(line: string): TaskStreamUpdate | null;
32
+ //# sourceMappingURL=task-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-stream.d.ts","sourceRoot":"","sources":["../../src/core/task-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,WAAW,gBAAgB;IAC/B;2BACuB;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iDAAiD;IACjD,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AA6BD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA2CzE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Parses the line-oriented JSON a background task's agent process writes to
3
+ * stdout (`claude -p --output-format stream-json --verbose`) into the two
4
+ * things TaskManager actually needs: compact human-readable progress lines
5
+ * for the canvas pane's live activity view, and the final result event's
6
+ * error state. Pure and defensive — a task's stdout is another program's
7
+ * output format, so anything unrecognized degrades to "no update", never a
8
+ * throw.
9
+ *
10
+ * Event shapes handled (everything else is ignored):
11
+ * - {"type":"system","subtype":"init",...} → "Agent started"
12
+ * - {"type":"assistant","message":{"content":[...]}} → one line per block:
13
+ * {"type":"tool_use","name":"Write","input":{...}} → "Write <path/hint>"
14
+ * {"type":"text","text":"..."} → truncated snippet
15
+ * - {"type":"result","is_error":bool,"result":"..."} → final result
16
+ */
17
+ /** Keep progress lines short enough to render as single status rows. */
18
+ const MAX_LINE_CHARS = 120;
19
+ function truncate(text) {
20
+ const flattened = text.replace(/\s+/g, " ").trim();
21
+ return flattened.length > MAX_LINE_CHARS ? `${flattened.slice(0, MAX_LINE_CHARS - 1)}…` : flattened;
22
+ }
23
+ /**
24
+ * The one input field per tool that identifies what it's acting on — enough
25
+ * for a "Write .sapiom/canvas/index.html"-style status line without dumping
26
+ * whole tool inputs (a Write's `content` can be an entire HTML file).
27
+ */
28
+ function toolInputHint(input) {
29
+ if (typeof input !== "object" || input === null)
30
+ return "";
31
+ const record = input;
32
+ for (const key of ["file_path", "path", "command", "pattern", "url", "description"]) {
33
+ const value = record[key];
34
+ if (typeof value === "string" && value.trim())
35
+ return value;
36
+ }
37
+ return "";
38
+ }
39
+ /**
40
+ * Parses one stdout line. Returns null for anything that isn't a recognized
41
+ * stream event (blank lines, non-JSON noise, event types we don't render).
42
+ */
43
+ export function parseTaskStreamLine(line) {
44
+ const trimmed = line.trim();
45
+ if (!trimmed)
46
+ return null;
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(trimmed);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ if (typeof parsed !== "object" || parsed === null)
55
+ return null;
56
+ const event = parsed;
57
+ if (event.type === "system" && event.subtype === "init") {
58
+ return { statusLines: ["Agent started"] };
59
+ }
60
+ if (event.type === "assistant") {
61
+ const message = event.message;
62
+ if (!Array.isArray(message?.content))
63
+ return null;
64
+ const statusLines = [];
65
+ for (const block of message.content) {
66
+ if (block?.type === "tool_use" && typeof block.name === "string") {
67
+ const hint = toolInputHint(block.input);
68
+ statusLines.push(truncate(hint ? `${block.name} ${hint}` : block.name));
69
+ }
70
+ else if (block?.type === "text" && typeof block.text === "string" && block.text.trim()) {
71
+ statusLines.push(truncate(block.text));
72
+ }
73
+ }
74
+ return statusLines.length > 0 ? { statusLines } : null;
75
+ }
76
+ if (event.type === "result") {
77
+ return {
78
+ statusLines: [],
79
+ result: {
80
+ isError: event.is_error === true,
81
+ text: typeof event.result === "string" ? event.result : "",
82
+ },
83
+ };
84
+ }
85
+ return null;
86
+ }
87
+ //# sourceMappingURL=task-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-stream.js","sourceRoot":"","sources":["../../src/core/task-stream.ts"],"names":[],"mappings":"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"}