background-agents 0.1.2 → 1.0.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 (235) hide show
  1. package/README.md +46 -297
  2. package/app/assets/icon.png +0 -0
  3. package/app/assets/tray-icon.png +0 -0
  4. package/app/assets/tray-icon.svg +4 -0
  5. package/app/dist/main.js +932 -0
  6. package/app/dist/preload.cjs +70 -0
  7. package/bin/background-agents.js +298 -0
  8. package/lib/ui.js +110 -0
  9. package/package.json +31 -57
  10. package/dist/agents/claude/index.d.ts +0 -11
  11. package/dist/agents/claude/index.d.ts.map +0 -1
  12. package/dist/agents/claude/index.js +0 -78
  13. package/dist/agents/claude/index.js.map +0 -1
  14. package/dist/agents/claude/parser.d.ts +0 -16
  15. package/dist/agents/claude/parser.d.ts.map +0 -1
  16. package/dist/agents/claude/parser.js +0 -87
  17. package/dist/agents/claude/parser.js.map +0 -1
  18. package/dist/agents/claude/tools.d.ts +0 -7
  19. package/dist/agents/claude/tools.d.ts.map +0 -1
  20. package/dist/agents/claude/tools.js +0 -15
  21. package/dist/agents/claude/tools.js.map +0 -1
  22. package/dist/agents/codex/index.d.ts +0 -11
  23. package/dist/agents/codex/index.d.ts.map +0 -1
  24. package/dist/agents/codex/index.js +0 -60
  25. package/dist/agents/codex/index.js.map +0 -1
  26. package/dist/agents/codex/parser.d.ts +0 -12
  27. package/dist/agents/codex/parser.d.ts.map +0 -1
  28. package/dist/agents/codex/parser.js +0 -108
  29. package/dist/agents/codex/parser.js.map +0 -1
  30. package/dist/agents/codex/tools.d.ts +0 -11
  31. package/dist/agents/codex/tools.d.ts.map +0 -1
  32. package/dist/agents/codex/tools.js +0 -40
  33. package/dist/agents/codex/tools.js.map +0 -1
  34. package/dist/agents/eliza/bundle-content.d.ts +0 -6
  35. package/dist/agents/eliza/bundle-content.d.ts.map +0 -1
  36. package/dist/agents/eliza/bundle-content.js +0 -7
  37. package/dist/agents/eliza/bundle-content.js.map +0 -1
  38. package/dist/agents/eliza/cli.bundle.js +0 -579
  39. package/dist/agents/eliza/cli.d.ts +0 -10
  40. package/dist/agents/eliza/cli.d.ts.map +0 -1
  41. package/dist/agents/eliza/cli.js +0 -342
  42. package/dist/agents/eliza/cli.js.map +0 -1
  43. package/dist/agents/eliza/index.d.ts +0 -22
  44. package/dist/agents/eliza/index.d.ts.map +0 -1
  45. package/dist/agents/eliza/index.js +0 -54
  46. package/dist/agents/eliza/index.js.map +0 -1
  47. package/dist/agents/eliza/parser.d.ts +0 -16
  48. package/dist/agents/eliza/parser.d.ts.map +0 -1
  49. package/dist/agents/eliza/parser.js +0 -67
  50. package/dist/agents/eliza/parser.js.map +0 -1
  51. package/dist/agents/eliza/patterns.d.ts +0 -41
  52. package/dist/agents/eliza/patterns.d.ts.map +0 -1
  53. package/dist/agents/eliza/patterns.js +0 -259
  54. package/dist/agents/eliza/patterns.js.map +0 -1
  55. package/dist/agents/eliza/tools.d.ts +0 -7
  56. package/dist/agents/eliza/tools.d.ts.map +0 -1
  57. package/dist/agents/eliza/tools.js +0 -14
  58. package/dist/agents/eliza/tools.js.map +0 -1
  59. package/dist/agents/gemini/index.d.ts +0 -11
  60. package/dist/agents/gemini/index.d.ts.map +0 -1
  61. package/dist/agents/gemini/index.js +0 -46
  62. package/dist/agents/gemini/index.js.map +0 -1
  63. package/dist/agents/gemini/parser.d.ts +0 -31
  64. package/dist/agents/gemini/parser.d.ts.map +0 -1
  65. package/dist/agents/gemini/parser.js +0 -106
  66. package/dist/agents/gemini/parser.js.map +0 -1
  67. package/dist/agents/gemini/tools.d.ts +0 -7
  68. package/dist/agents/gemini/tools.d.ts.map +0 -1
  69. package/dist/agents/gemini/tools.js +0 -23
  70. package/dist/agents/gemini/tools.js.map +0 -1
  71. package/dist/agents/goose/index.d.ts +0 -11
  72. package/dist/agents/goose/index.d.ts.map +0 -1
  73. package/dist/agents/goose/index.js +0 -73
  74. package/dist/agents/goose/index.js.map +0 -1
  75. package/dist/agents/goose/parser.d.ts +0 -24
  76. package/dist/agents/goose/parser.d.ts.map +0 -1
  77. package/dist/agents/goose/parser.js +0 -86
  78. package/dist/agents/goose/parser.js.map +0 -1
  79. package/dist/agents/goose/tools.d.ts +0 -10
  80. package/dist/agents/goose/tools.d.ts.map +0 -1
  81. package/dist/agents/goose/tools.js +0 -30
  82. package/dist/agents/goose/tools.js.map +0 -1
  83. package/dist/agents/index.d.ts +0 -27
  84. package/dist/agents/index.d.ts.map +0 -1
  85. package/dist/agents/index.js +0 -46
  86. package/dist/agents/index.js.map +0 -1
  87. package/dist/agents/opencode/index.d.ts +0 -12
  88. package/dist/agents/opencode/index.d.ts.map +0 -1
  89. package/dist/agents/opencode/index.js +0 -53
  90. package/dist/agents/opencode/index.js.map +0 -1
  91. package/dist/agents/opencode/parser.d.ts +0 -15
  92. package/dist/agents/opencode/parser.d.ts.map +0 -1
  93. package/dist/agents/opencode/parser.js +0 -71
  94. package/dist/agents/opencode/parser.js.map +0 -1
  95. package/dist/agents/opencode/tools.d.ts +0 -7
  96. package/dist/agents/opencode/tools.d.ts.map +0 -1
  97. package/dist/agents/opencode/tools.js +0 -10
  98. package/dist/agents/opencode/tools.js.map +0 -1
  99. package/dist/agents/openhands/index.d.ts +0 -17
  100. package/dist/agents/openhands/index.d.ts.map +0 -1
  101. package/dist/agents/openhands/index.js +0 -67
  102. package/dist/agents/openhands/index.js.map +0 -1
  103. package/dist/agents/openhands/parser.d.ts +0 -16
  104. package/dist/agents/openhands/parser.d.ts.map +0 -1
  105. package/dist/agents/openhands/parser.js +0 -93
  106. package/dist/agents/openhands/parser.js.map +0 -1
  107. package/dist/agents/openhands/tools.d.ts +0 -7
  108. package/dist/agents/openhands/tools.d.ts.map +0 -1
  109. package/dist/agents/openhands/tools.js +0 -24
  110. package/dist/agents/openhands/tools.js.map +0 -1
  111. package/dist/agents/pi/index.d.ts +0 -14
  112. package/dist/agents/pi/index.d.ts.map +0 -1
  113. package/dist/agents/pi/index.js +0 -54
  114. package/dist/agents/pi/index.js.map +0 -1
  115. package/dist/agents/pi/parser.d.ts +0 -21
  116. package/dist/agents/pi/parser.d.ts.map +0 -1
  117. package/dist/agents/pi/parser.js +0 -91
  118. package/dist/agents/pi/parser.js.map +0 -1
  119. package/dist/agents/pi/tools.d.ts +0 -8
  120. package/dist/agents/pi/tools.d.ts.map +0 -1
  121. package/dist/agents/pi/tools.js +0 -16
  122. package/dist/agents/pi/tools.js.map +0 -1
  123. package/dist/agents/picocode/index.d.ts +0 -18
  124. package/dist/agents/picocode/index.d.ts.map +0 -1
  125. package/dist/agents/picocode/index.js +0 -68
  126. package/dist/agents/picocode/index.js.map +0 -1
  127. package/dist/agents/picocode/parser.d.ts +0 -19
  128. package/dist/agents/picocode/parser.d.ts.map +0 -1
  129. package/dist/agents/picocode/parser.js +0 -104
  130. package/dist/agents/picocode/parser.js.map +0 -1
  131. package/dist/agents/picocode/tools.d.ts +0 -9
  132. package/dist/agents/picocode/tools.d.ts.map +0 -1
  133. package/dist/agents/picocode/tools.js +0 -27
  134. package/dist/agents/picocode/tools.js.map +0 -1
  135. package/dist/background/index.d.ts +0 -6
  136. package/dist/background/index.d.ts.map +0 -1
  137. package/dist/background/index.js +0 -5
  138. package/dist/background/index.js.map +0 -1
  139. package/dist/background/session.d.ts +0 -47
  140. package/dist/background/session.d.ts.map +0 -1
  141. package/dist/background/session.js +0 -481
  142. package/dist/background/session.js.map +0 -1
  143. package/dist/background/types.d.ts +0 -55
  144. package/dist/background/types.d.ts.map +0 -1
  145. package/dist/background/types.js +0 -5
  146. package/dist/background/types.js.map +0 -1
  147. package/dist/core/agent.d.ts +0 -95
  148. package/dist/core/agent.d.ts.map +0 -1
  149. package/dist/core/agent.js +0 -8
  150. package/dist/core/agent.js.map +0 -1
  151. package/dist/core/index.d.ts +0 -7
  152. package/dist/core/index.d.ts.map +0 -1
  153. package/dist/core/index.js +0 -6
  154. package/dist/core/index.js.map +0 -1
  155. package/dist/core/registry.d.ts +0 -48
  156. package/dist/core/registry.d.ts.map +0 -1
  157. package/dist/core/registry.js +0 -68
  158. package/dist/core/registry.js.map +0 -1
  159. package/dist/core/tools.d.ts +0 -31
  160. package/dist/core/tools.d.ts.map +0 -1
  161. package/dist/core/tools.js +0 -82
  162. package/dist/core/tools.js.map +0 -1
  163. package/dist/debug.d.ts +0 -7
  164. package/dist/debug.d.ts.map +0 -1
  165. package/dist/debug.js +0 -19
  166. package/dist/debug.js.map +0 -1
  167. package/dist/factory.d.ts +0 -28
  168. package/dist/factory.d.ts.map +0 -1
  169. package/dist/factory.js +0 -44
  170. package/dist/factory.js.map +0 -1
  171. package/dist/index.d.ts +0 -48
  172. package/dist/index.d.ts.map +0 -1
  173. package/dist/index.js +0 -62
  174. package/dist/index.js.map +0 -1
  175. package/dist/providers/base.d.ts +0 -187
  176. package/dist/providers/base.d.ts.map +0 -1
  177. package/dist/providers/base.js +0 -619
  178. package/dist/providers/base.js.map +0 -1
  179. package/dist/providers/claude.d.ts +0 -14
  180. package/dist/providers/claude.d.ts.map +0 -1
  181. package/dist/providers/claude.js +0 -122
  182. package/dist/providers/claude.js.map +0 -1
  183. package/dist/providers/codex.d.ts +0 -14
  184. package/dist/providers/codex.d.ts.map +0 -1
  185. package/dist/providers/codex.js +0 -160
  186. package/dist/providers/codex.js.map +0 -1
  187. package/dist/providers/gemini.d.ts +0 -16
  188. package/dist/providers/gemini.d.ts.map +0 -1
  189. package/dist/providers/gemini.js +0 -101
  190. package/dist/providers/gemini.js.map +0 -1
  191. package/dist/providers/index.d.ts +0 -6
  192. package/dist/providers/index.d.ts.map +0 -1
  193. package/dist/providers/index.js +0 -6
  194. package/dist/providers/index.js.map +0 -1
  195. package/dist/providers/opencode.d.ts +0 -14
  196. package/dist/providers/opencode.d.ts.map +0 -1
  197. package/dist/providers/opencode.js +0 -100
  198. package/dist/providers/opencode.js.map +0 -1
  199. package/dist/sandbox/daytona.d.ts +0 -8
  200. package/dist/sandbox/daytona.d.ts.map +0 -1
  201. package/dist/sandbox/daytona.js +0 -181
  202. package/dist/sandbox/daytona.js.map +0 -1
  203. package/dist/sandbox/index.d.ts +0 -14
  204. package/dist/sandbox/index.d.ts.map +0 -1
  205. package/dist/sandbox/index.js +0 -15
  206. package/dist/sandbox/index.js.map +0 -1
  207. package/dist/session.d.ts +0 -75
  208. package/dist/session.d.ts.map +0 -1
  209. package/dist/session.js +0 -117
  210. package/dist/session.js.map +0 -1
  211. package/dist/types/events.d.ts +0 -114
  212. package/dist/types/events.d.ts.map +0 -1
  213. package/dist/types/events.js +0 -50
  214. package/dist/types/events.js.map +0 -1
  215. package/dist/types/index.d.ts +0 -3
  216. package/dist/types/index.d.ts.map +0 -1
  217. package/dist/types/index.js +0 -3
  218. package/dist/types/index.js.map +0 -1
  219. package/dist/types/provider.d.ts +0 -67
  220. package/dist/types/provider.d.ts.map +0 -1
  221. package/dist/types/provider.js +0 -5
  222. package/dist/types/provider.js.map +0 -1
  223. package/dist/utils/index.d.ts +0 -3
  224. package/dist/utils/index.d.ts.map +0 -1
  225. package/dist/utils/index.js +0 -3
  226. package/dist/utils/index.js.map +0 -1
  227. package/dist/utils/install.d.ts +0 -37
  228. package/dist/utils/install.d.ts.map +0 -1
  229. package/dist/utils/install.js +0 -122
  230. package/dist/utils/install.js.map +0 -1
  231. package/dist/utils/json.d.ts +0 -8
  232. package/dist/utils/json.d.ts.map +0 -1
  233. package/dist/utils/json.js +0 -15
  234. package/dist/utils/json.js.map +0 -1
  235. package/src/index.ts +0 -156
@@ -1,619 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { debugLog } from "../debug.js";
3
- import { adaptSandbox } from "../sandbox/index.js";
4
- /** After {@link readSandboxMeta} `startedAt`, ignore "done but no output" briefly (race with wrapper). */
5
- const BACKGROUND_STARTUP_GRACE_MS = 4000;
6
- function withinStartupGrace(meta) {
7
- if (!meta.startedAt)
8
- return false;
9
- const t = Date.parse(meta.startedAt);
10
- if (Number.isNaN(t))
11
- return false;
12
- return Date.now() - t < BACKGROUND_STARTUP_GRACE_MS;
13
- }
14
- function hasObservableBackgroundProgress(result) {
15
- for (const e of result.events) {
16
- if (e.type === "token" || e.type === "tool_start" || e.type === "tool_end" || e.type === "end") {
17
- return true;
18
- }
19
- }
20
- const raw = (result.rawOutput ?? "").trim();
21
- const nonJsonLines = raw.split("\n").filter((l) => {
22
- const t = l.trim();
23
- return t && !(t.startsWith("{") && t.endsWith("}"));
24
- });
25
- return nonJsonLines.some((l) => l.trim().length > 0);
26
- }
27
- /**
28
- * Abstract base class for AI coding agent providers
29
- */
30
- export class Provider {
31
- sessionId = null;
32
- getSessionId() {
33
- return this.sessionId;
34
- }
35
- /** Sandbox for secure execution */
36
- sandboxManager;
37
- /** Resolves when initial setup (install + env) has completed. */
38
- _readyPromise = null;
39
- /** Defaults merged into every run (model, timeout, sessionId, env). Set by createSession. */
40
- _runDefaults = {};
41
- /** Tracks whether session-level env has been applied */
42
- _sessionEnvApplied = false;
43
- /** Tracks whether we've already applied a synthetic system prompt for this session. */
44
- _systemPromptApplied = false;
45
- get ready() {
46
- return this._readyPromise ?? Promise.resolve();
47
- }
48
- constructor(options) {
49
- this._runDefaults = options.runDefaults ?? {};
50
- this.sandboxManager = adaptSandbox(options.sandbox, { env: options.env });
51
- if (!options.skipInstall) {
52
- this._readyPromise = new Promise((resolve, reject) => {
53
- queueMicrotask(() => this._doSetup().then(resolve).catch(reject));
54
- });
55
- }
56
- }
57
- /**
58
- * Apply a synthetic system prompt for providers without native support by
59
- * prepending it to the first user prompt in the session. Claude uses its
60
- * native CLI flag instead, so we leave the prompt unchanged there.
61
- */
62
- _applySystemPrompt(options) {
63
- if (options.systemPrompt && !this._systemPromptApplied) {
64
- const supportsNativeSystemPrompt = this.name === "claude";
65
- if (!supportsNativeSystemPrompt) {
66
- const basePrompt = options.prompt ?? "";
67
- options.prompt = basePrompt
68
- ? `${options.systemPrompt}\n\n${basePrompt}`
69
- : options.systemPrompt;
70
- }
71
- this._systemPromptApplied = true;
72
- }
73
- return options;
74
- }
75
- /**
76
- * Run the provider and yield events. Pass a prompt string or full RunOptions.
77
- * When created via createSession, runDefaults are merged in (e.g. model, timeout).
78
- */
79
- async *run(promptOrOptions = {}) {
80
- let options = typeof promptOrOptions === "string"
81
- ? { ...this._runDefaults, prompt: promptOrOptions }
82
- : { ...this._runDefaults, ...promptOrOptions };
83
- options = this._applySystemPrompt(options);
84
- debugLog(`run start provider=${this.name} promptLength=${options.prompt?.length ?? 0}`, this.sessionId);
85
- yield* this.runSandbox(options);
86
- debugLog(`run end provider=${this.name}`, this.sessionId);
87
- }
88
- async _codexLoginIfNeeded(env) {
89
- if (this.name !== "codex" ||
90
- !env?.OPENAI_API_KEY ||
91
- !this.sandboxManager?.executeCommand)
92
- return;
93
- const safeKey = env.OPENAI_API_KEY.replace(/'/g, "'\\''");
94
- await this.sandboxManager.executeCommand(`echo '${safeKey}' | codex login --with-api-key 2>&1`, 30);
95
- }
96
- /** One-time setup: install CLI and set session-level env. Run in microtask so subclass name is set. */
97
- async _doSetup() {
98
- const t = Date.now();
99
- await this.sandboxManager.ensureProvider(this.name);
100
- console.log(`[timing] ensureProvider(${this.name}) took ${Date.now() - t}ms`);
101
- // Apply session-level env from runDefaults (set by createSession)
102
- const sessionEnv = this._runDefaults.env;
103
- if (sessionEnv && !this._sessionEnvApplied) {
104
- if (this.sandboxManager.setSessionEnvVars) {
105
- this.sandboxManager.setSessionEnvVars(sessionEnv);
106
- }
107
- else {
108
- // Fallback for backwards compatibility
109
- this.sandboxManager.setEnvVars(sessionEnv);
110
- }
111
- this._sessionEnvApplied = true;
112
- }
113
- }
114
- /** Per-run: clear previous run-level env, set new run-level env, and handle Codex login. */
115
- async _applyRunEnv(options) {
116
- // Ensure session-level env is applied (idempotent)
117
- const sessionEnv = this._runDefaults.env;
118
- if (sessionEnv && !this._sessionEnvApplied) {
119
- if (this.sandboxManager.setSessionEnvVars) {
120
- this.sandboxManager.setSessionEnvVars(sessionEnv);
121
- }
122
- else {
123
- this.sandboxManager.setEnvVars(sessionEnv);
124
- }
125
- this._sessionEnvApplied = true;
126
- }
127
- // Clear previous run-level env
128
- if (this.sandboxManager.clearRunEnvVars) {
129
- this.sandboxManager.clearRunEnvVars();
130
- }
131
- // Apply new run-level env (if provided)
132
- const runEnv = options.env;
133
- if (runEnv) {
134
- if (this.sandboxManager.setRunEnvVars) {
135
- this.sandboxManager.setRunEnvVars(runEnv);
136
- }
137
- else {
138
- // Fallback for backwards compatibility
139
- this.sandboxManager.setEnvVars(runEnv);
140
- }
141
- }
142
- await this._codexLoginIfNeeded(runEnv ?? sessionEnv);
143
- }
144
- /**
145
- * Run in a secure Daytona sandbox
146
- */
147
- async *runSandbox(options) {
148
- await (this._readyPromise ?? Promise.resolve());
149
- await this._applyRunEnv(options);
150
- // Build the command
151
- const { cmd, args, env: cmdEnv } = this.getCommand(options);
152
- // Set command-specific env vars
153
- if (cmdEnv) {
154
- this.sandboxManager.setEnvVars(cmdEnv);
155
- }
156
- // Build full command string
157
- const fullCommand = [cmd, ...args.map(arg => arg.includes(" ") || arg.includes('"') || arg.includes("'")
158
- ? `'${arg.replace(/'/g, "'\\''")}'`
159
- : arg)].join(" ");
160
- const timeout = options.timeout ?? 120;
161
- debugLog(`runSandbox command start provider=${this.name} timeout=${timeout}`, this.sessionId);
162
- debugLog("runSandbox cli", this.sessionId, fullCommand);
163
- let pendingToolEnd = false;
164
- for await (const line of this.sandboxManager.executeCommandStream(fullCommand, timeout)) {
165
- debugLog(`raw line (sandbox): ${line.length > 300 ? line.slice(0, 300) + "…" : line}`, this.sessionId);
166
- const raw = this.parse(line);
167
- if (raw === null) {
168
- debugLog(`unparsed line (sandbox):`, this.sessionId, line);
169
- }
170
- const events = raw === null ? [] : Array.isArray(raw) ? raw : [raw];
171
- for (const event of events) {
172
- if (event.type === "session") {
173
- this.sessionId = event.id;
174
- }
175
- if (event.type === "tool_start")
176
- pendingToolEnd = true;
177
- if (event.type === "tool_end")
178
- pendingToolEnd = false;
179
- if (event.type === "end" && pendingToolEnd) {
180
- yield { type: "tool_end" };
181
- pendingToolEnd = false;
182
- }
183
- if (event.type === "end") {
184
- debugLog("session end", this.sessionId, event.error ? `reason=error ${event.error}` : "reason=completed");
185
- }
186
- else if (event.type === "agent_crashed") {
187
- debugLog("session end", this.sessionId, "reason=crashed", event.message ?? event.output ?? "");
188
- }
189
- yield event;
190
- }
191
- }
192
- debugLog(`runSandbox stream ended provider=${this.name}`, this.sessionId);
193
- }
194
- /** Meta stored in sandbox for background session (one log per turn, cursor in meta). */
195
- async readSandboxMeta(sessionDir) {
196
- if (!this.sandboxManager?.executeCommand)
197
- return null;
198
- const result = await this.sandboxManager.executeCommand(`cat "${sessionDir}/meta.json" 2>/dev/null || true`, 10);
199
- const raw = (result.output ?? "").trim();
200
- if (!raw)
201
- return null;
202
- try {
203
- const o = JSON.parse(raw);
204
- if (typeof o.currentTurn !== "number" || typeof o.cursor !== "number")
205
- return null;
206
- return {
207
- currentTurn: o.currentTurn,
208
- cursor: o.cursor,
209
- rawCursor: o.rawCursor,
210
- pid: o.pid,
211
- runId: o.runId,
212
- outputFile: o.outputFile,
213
- sawEnd: o.sawEnd,
214
- startedAt: o.startedAt,
215
- provider: o.provider,
216
- sessionId: o.sessionId ?? null,
217
- };
218
- }
219
- catch {
220
- return null;
221
- }
222
- }
223
- /** Write initial session meta at creation so getBackgroundSession can reattach before first start(). */
224
- async writeInitialSessionMeta(sessionDir) {
225
- if (!this.sandboxManager?.executeCommand)
226
- return;
227
- await this.writeSandboxMeta(sessionDir, {
228
- currentTurn: 0,
229
- cursor: 0,
230
- provider: this.name,
231
- sessionId: this.sessionId ?? null,
232
- });
233
- }
234
- async writeSandboxMeta(sessionDir, meta) {
235
- if (!this.sandboxManager?.executeCommand) {
236
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
237
- }
238
- const json = JSON.stringify(meta);
239
- const b64 = Buffer.from(json, "utf8").toString("base64");
240
- await this.sandboxManager.executeCommand(`mkdir -p "${sessionDir}" && echo '${b64}' | base64 -d > "${sessionDir}/meta.json"`, 10);
241
- }
242
- /**
243
- * Best-effort no-op write guard for polling paths. Skips writing meta when no
244
- * relevant fields changed to reduce sandbox file writes on every poll.
245
- */
246
- async writeSandboxMetaIfChanged(sessionDir, next, prev) {
247
- if (prev) {
248
- const unchanged = prev.currentTurn === next.currentTurn &&
249
- prev.cursor === next.cursor &&
250
- (prev.rawCursor ?? 0) === (next.rawCursor ?? 0) &&
251
- prev.pid === next.pid &&
252
- prev.runId === next.runId &&
253
- prev.outputFile === next.outputFile &&
254
- (prev.sawEnd ?? false) === (next.sawEnd ?? false) &&
255
- prev.startedAt === next.startedAt &&
256
- prev.provider === next.provider &&
257
- (prev.sessionId ?? null) === (next.sessionId ?? null);
258
- if (unchanged)
259
- return;
260
- }
261
- await this.writeSandboxMeta(sessionDir, next);
262
- }
263
- /**
264
- * Start a new turn in a session directory: one log file per turn, meta in sandbox.
265
- * Uses currentTurn for this run; currentTurn is incremented when the turn ends (in getEvents).
266
- * Writes meta with runId/outputFile before starting so reattaching clients see "running" immediately.
267
- */
268
- async startSandboxBackgroundTurn(sessionDir, options) {
269
- const t0 = Date.now();
270
- if (!this.sandboxManager?.executeCommand) {
271
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
272
- }
273
- await this.sandboxManager.executeCommand(`mkdir -p "${sessionDir}"`, 10);
274
- console.log(`[timing] mkdir took ${Date.now() - t0}ms (elapsed ${Date.now() - t0}ms)`);
275
- let t = Date.now();
276
- const meta = await this.readSandboxMeta(sessionDir);
277
- console.log(`[timing] readSandboxMeta took ${Date.now() - t}ms (elapsed ${Date.now() - t0}ms)`);
278
- const currentTurn = meta?.currentTurn ?? 0;
279
- const outputFile = `${sessionDir}/${currentTurn}.jsonl`;
280
- const runId = randomUUID().slice(0, 8);
281
- debugLog(`background turn start provider=${this.name} sessionDir=${sessionDir} turn=${currentTurn} outputFile=${outputFile}`, this.sessionId);
282
- t = Date.now();
283
- await this.writeSandboxMeta(sessionDir, {
284
- currentTurn,
285
- cursor: 0,
286
- runId,
287
- outputFile,
288
- startedAt: new Date().toISOString(),
289
- provider: this.name,
290
- sessionId: this.sessionId ?? options.sessionId ?? meta?.sessionId ?? null,
291
- });
292
- console.log(`[timing] writeSandboxMeta(1) took ${Date.now() - t}ms (elapsed ${Date.now() - t0}ms)`);
293
- t = Date.now();
294
- const result = await this.startSandboxBackground({ ...options, outputFile, runId });
295
- console.log(`[timing] startSandboxBackground took ${Date.now() - t}ms (elapsed ${Date.now() - t0}ms)`);
296
- debugLog(`background turn started provider=${this.name} pid=${result.pid} executionId=${result.executionId}`, this.sessionId);
297
- t = Date.now();
298
- await this.writeSandboxMeta(sessionDir, {
299
- currentTurn,
300
- cursor: 0,
301
- pid: result.pid,
302
- runId: result.runId,
303
- outputFile,
304
- startedAt: new Date().toISOString(),
305
- provider: this.name,
306
- sessionId: this.sessionId ?? options.sessionId ?? meta?.sessionId ?? null,
307
- });
308
- console.log(`[timing] writeSandboxMeta(2) took ${Date.now() - t}ms (elapsed ${Date.now() - t0}ms)`);
309
- return { executionId: result.executionId, pid: result.pid, outputFile };
310
- }
311
- /**
312
- * Get the current turn's process id from sandbox meta, or null if no run in progress.
313
- */
314
- async getSandboxBackgroundPid(sessionDir) {
315
- const meta = await this.readSandboxMeta(sessionDir);
316
- if (meta?.pid == null || meta.pid < 1)
317
- return null;
318
- return meta.pid;
319
- }
320
- /**
321
- * Cancel the current turn's process in the sandbox (kill pid from meta).
322
- * Uses robust multi-step kill: SIGTERM -> SIGKILL -> pkill fallback.
323
- * Writes the done file after kill so isRunning() becomes false.
324
- */
325
- async cancelSandboxBackground(sessionDir) {
326
- const meta = await this.readSandboxMeta(sessionDir);
327
- if (meta?.pid == null)
328
- return;
329
- const mgr = this.sandboxManager;
330
- if (mgr?.killBackgroundProcess) {
331
- // Use the robust kill implementation (includes TERM -> KILL -> pkill)
332
- await mgr.killBackgroundProcess(meta.pid, this.name);
333
- }
334
- else if (mgr?.executeCommand) {
335
- // Fallback: manual multi-step kill
336
- await mgr.executeCommand(`kill -TERM ${meta.pid} 2>/dev/null || true`, 10);
337
- await new Promise(r => setTimeout(r, 500));
338
- await mgr.executeCommand(`kill -9 ${meta.pid} 2>/dev/null || true`, 10);
339
- await mgr.executeCommand(`pkill -9 -f "${this.name}" 2>/dev/null || true`, 10);
340
- }
341
- // Write done file so isRunning() returns false
342
- if (meta.outputFile && mgr?.executeCommand) {
343
- const donePath = meta.outputFile + ".done";
344
- const escaped = donePath.replace(/'/g, "'\\''");
345
- await mgr.executeCommand(`echo 1 > '${escaped}' 2>/dev/null || true`, 10);
346
- }
347
- }
348
- /**
349
- * Check if the current turn's process is still running in the sandbox.
350
- * True only while a turn is in progress; false until the next turn starts.
351
- * Uses the done file (outputFile.done): the wrapper writes it when the command exits.
352
- * We don't use kill -0 / ps here because the process is started over SSH; the process API
353
- * runs in a different context and can't see that pid. Kill would only work over the same SSH.
354
- */
355
- async isSandboxBackgroundProcessRunning(sessionDir) {
356
- const meta = await this.readSandboxMeta(sessionDir);
357
- if (!meta?.runId || !meta.outputFile || !this.sandboxManager?.executeCommand) {
358
- debugLog(`isRunning false (no run) sessionDir=${sessionDir}`, this.sessionId);
359
- return false;
360
- }
361
- const running = await this.isSandboxBackgroundOutputRunning(meta.outputFile);
362
- debugLog(`isRunning ${running} (done file ${running ? "missing" : "exists"}) sessionDir=${sessionDir}`, this.sessionId);
363
- return running;
364
- }
365
- async isSandboxBackgroundOutputRunning(outputFile) {
366
- if (!this.sandboxManager?.executeCommand)
367
- return false;
368
- const donePath = outputFile + ".done";
369
- const escaped = donePath.replace(/'/g, "'\\''");
370
- const r = await this.sandboxManager.executeCommand(`test -f '${escaped}' 2>/dev/null; echo $?`, 10);
371
- const doneExists = Number((r.output ?? "").trim().split(/\s+/).pop()) === 0;
372
- return !doneExists;
373
- }
374
- /**
375
- * Get new events for the current turn; reads and updates cursor in sandbox meta.
376
- * Uses optimized polling when available (2 round trips instead of 4).
377
- */
378
- async getEventsSandboxBackgroundFromMeta(sessionDir) {
379
- // Optimized path: read meta + output + done status together
380
- let meta = null;
381
- let outputContent = null;
382
- let stillRunning;
383
- if (this.sandboxManager?.pollBackgroundState) {
384
- const state = await this.sandboxManager.pollBackgroundState(sessionDir);
385
- if (state?.meta) {
386
- try {
387
- const parsed = JSON.parse(state.meta);
388
- if (typeof parsed.currentTurn === "number" && typeof parsed.cursor === "number") {
389
- meta = parsed;
390
- }
391
- }
392
- catch { /* invalid JSON */ }
393
- }
394
- outputContent = state?.output ?? null;
395
- stillRunning = !state?.done;
396
- }
397
- else {
398
- // Legacy path: separate calls
399
- meta = await this.readSandboxMeta(sessionDir);
400
- stillRunning = meta?.outputFile ? await this.isSandboxBackgroundOutputRunning(meta.outputFile) : false;
401
- }
402
- if (!meta?.runId || !meta.outputFile) {
403
- debugLog(`getEventsSandboxBackgroundFromMeta provider=${this.name} sessionDir=${sessionDir} (no turn in progress)`, this.sessionId);
404
- return {
405
- sessionId: meta?.sessionId ?? this.sessionId ?? null,
406
- events: [],
407
- cursor: String(meta?.cursor ?? 0),
408
- running: false,
409
- runPhase: "idle",
410
- };
411
- }
412
- const cursor = String(meta.cursor);
413
- debugLog(`getEventsSandboxBackgroundFromMeta provider=${this.name} sessionDir=${sessionDir} turn=${meta.currentTurn} cursor=${cursor}`, this.sessionId);
414
- // Poll output (uses pre-fetched content if available)
415
- const result = await this.pollSandboxBackground(meta.outputFile, cursor, meta.rawCursor != null ? String(meta.rawCursor) : null, outputContent);
416
- const sawEnd = meta.sawEnd || result.events.some((e) => e.type === "end");
417
- // Handle completion states and update meta
418
- return this._handlePollResult(sessionDir, meta, result, stillRunning, sawEnd);
419
- }
420
- /** Process poll result and update meta. Shared by all polling paths. */
421
- async _handlePollResult(sessionDir, meta, result, stillRunning, sawEnd) {
422
- const baseMeta = {
423
- cursor: Number(result.cursor) || 0,
424
- rawCursor: Number(result.rawCursor) || meta.rawCursor || 0,
425
- provider: this.name,
426
- sessionId: this.sessionId ?? meta.sessionId ?? null,
427
- };
428
- // Early poll / wrapper race: done file appears before any JSONL output — stay "active" until grace elapses.
429
- if (!stillRunning &&
430
- !sawEnd &&
431
- withinStartupGrace(meta) &&
432
- !hasObservableBackgroundProgress(result)) {
433
- await this.writeSandboxMetaIfChanged(sessionDir, {
434
- currentTurn: meta.currentTurn,
435
- ...baseMeta,
436
- sawEnd: false,
437
- pid: meta.pid,
438
- runId: meta.runId,
439
- outputFile: meta.outputFile,
440
- startedAt: meta.startedAt,
441
- }, meta);
442
- return {
443
- sessionId: result.sessionId,
444
- events: result.events,
445
- cursor: result.cursor,
446
- running: true,
447
- runPhase: "starting",
448
- };
449
- }
450
- if (!stillRunning || sawEnd) {
451
- const nextTurn = (meta.currentTurn ?? 0) + 1;
452
- await this.writeSandboxMetaIfChanged(sessionDir, {
453
- currentTurn: nextTurn, ...baseMeta, sawEnd,
454
- ...(sawEnd ? {} : { outputFile: meta.outputFile, runId: meta.runId }),
455
- }, meta);
456
- }
457
- else {
458
- await this.writeSandboxMetaIfChanged(sessionDir, {
459
- currentTurn: meta.currentTurn, ...baseMeta, sawEnd,
460
- pid: meta.pid, runId: meta.runId, outputFile: meta.outputFile, startedAt: meta.startedAt,
461
- }, meta);
462
- }
463
- // Crashed: process exited without end event
464
- if (!stillRunning && !sawEnd) {
465
- const raw = (result.rawOutput ?? "").trim();
466
- const nonJsonLines = raw.split("\n").filter((l) => { const t = l.trim(); return t && !(t.startsWith("{") && t.endsWith("}")); });
467
- const output = nonJsonLines.join("\n").trim().slice(-4096) || undefined;
468
- const crashEvent = { type: "agent_crashed", message: "Agent process exited without completing (crashed or killed)", output };
469
- debugLog("session end", this.sessionId ?? meta.sessionId, "reason=crashed", crashEvent.message);
470
- await this.writeSandboxMetaIfChanged(sessionDir, { currentTurn: (meta.currentTurn ?? 0) + 1, ...baseMeta, sawEnd: true }, meta);
471
- return {
472
- sessionId: result.sessionId,
473
- events: [...result.events, crashEvent],
474
- cursor: result.cursor,
475
- running: false,
476
- runPhase: "stopped",
477
- };
478
- }
479
- const active = stillRunning && !sawEnd;
480
- return {
481
- sessionId: result.sessionId,
482
- events: result.events,
483
- cursor: result.cursor,
484
- running: active,
485
- runPhase: active ? "running" : "stopped",
486
- };
487
- }
488
- /**
489
- * Start a background run inside the sandbox.
490
- * The CLI is run with stdout redirected to an append-only JSONL log file.
491
- * Later you can call pollSandboxBackground(outputFile, cursor) to consume new events.
492
- * If options.runId is provided (e.g. from startSandboxBackgroundTurn), it is used so meta can be written before this returns.
493
- */
494
- async startSandboxBackground(options) {
495
- if (!this.sandboxManager || !this.sandboxManager.executeCommand) {
496
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
497
- }
498
- const t0 = Date.now();
499
- let t = Date.now();
500
- await (this._readyPromise ?? Promise.resolve());
501
- console.log(`[timing] _readyPromise took ${Date.now() - t}ms`);
502
- t = Date.now();
503
- const optsWithSystem = this._applySystemPrompt(options);
504
- await this._applyRunEnv(optsWithSystem);
505
- console.log(`[timing] _applyRunEnv took ${Date.now() - t}ms`);
506
- const { cmd, args, env: cmdEnv } = this.getCommand(optsWithSystem);
507
- if (cmdEnv) {
508
- this.sandboxManager.setEnvVars(cmdEnv);
509
- }
510
- const fullCommand = [cmd, ...args.map(arg => arg.includes(" ") || arg.includes('"') || arg.includes("'")
511
- ? `'${arg.replace(/'/g, "'\\''")}'`
512
- : arg)].join(" ");
513
- const runId = options.runId ?? randomUUID().slice(0, 8);
514
- const timeout = options.timeout ?? 30;
515
- if (typeof this.sandboxManager.executeBackground !== "function") {
516
- throw new Error("Background sessions require a sandbox with executeBackground (e.g. Daytona sandbox with createSshAccess()).");
517
- }
518
- debugLog(`startSandboxBackground executing provider=${this.name} outputFile=${options.outputFile} runId=${runId}`, this.sessionId);
519
- debugLog("startSandboxBackground cli", this.sessionId, fullCommand);
520
- t = Date.now();
521
- const result = await this.sandboxManager.executeBackground({
522
- command: fullCommand,
523
- outputFile: options.outputFile,
524
- runId,
525
- timeout,
526
- });
527
- console.log(`[timing] executeBackground took ${Date.now() - t}ms (total startSandboxBackground ${Date.now() - t0}ms)`);
528
- const pid = result.pid;
529
- debugLog(`startSandboxBackground done provider=${this.name} pid=${pid}`, this.sessionId);
530
- const executionId = randomUUID();
531
- return {
532
- executionId,
533
- pid,
534
- runId,
535
- outputFile: options.outputFile,
536
- cursor: "0",
537
- };
538
- }
539
- /**
540
- * Poll a background sandbox run by reading the JSONL log file.
541
- * If prefetchedContent is provided, uses that instead of fetching from sandbox.
542
- */
543
- async pollSandboxBackground(outputFile, cursor, rawCursor, prefetchedContent) {
544
- // Get content: use prefetched if available, otherwise fetch
545
- let rawOutput;
546
- if (prefetchedContent != null) {
547
- rawOutput = prefetchedContent;
548
- }
549
- else {
550
- if (!this.sandboxManager?.executeCommand) {
551
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
552
- }
553
- const result = await this.sandboxManager.executeCommand(`cat ${outputFile}`, 30);
554
- rawOutput = result.output ?? "";
555
- }
556
- const startIndex = cursor ? Number(cursor) || 0 : 0;
557
- void rawCursor; // used for tracking but not filtering in simplified version
558
- const rawLines = rawOutput.split("\n");
559
- const lines = [];
560
- const isJson = (s) => s.startsWith("{") && s.endsWith("}");
561
- for (let i = 0; i < rawLines.length; i++) {
562
- const trimmed = rawLines[i].trim();
563
- if (!trimmed)
564
- continue;
565
- if (!isJson(trimmed) && i === rawLines.length - 1)
566
- continue; // skip partial last line
567
- if (isJson(trimmed))
568
- lines.push(trimmed);
569
- }
570
- if (startIndex >= lines.length) {
571
- return { status: "running", sessionId: this.sessionId, events: [], cursor: String(lines.length), rawCursor: String(rawLines.length), rawOutput };
572
- }
573
- const eventsOut = [];
574
- let status = "running";
575
- for (const line of lines.slice(startIndex)) {
576
- const raw = this.parse(line);
577
- const events = raw === null ? [] : Array.isArray(raw) ? raw : [raw];
578
- for (const event of events) {
579
- if (event.type === "session")
580
- this.sessionId = event.id;
581
- if (event.type === "end")
582
- status = "completed";
583
- eventsOut.push(event);
584
- }
585
- }
586
- return { status, sessionId: this.sessionId, events: eventsOut, cursor: String(lines.length), rawCursor: String(rawLines.length), rawOutput };
587
- }
588
- /**
589
- * Run the provider with a callback for each event
590
- */
591
- async runWithCallback(callback, promptOrOptions = {}) {
592
- for await (const event of this.run(promptOrOptions)) {
593
- await callback(event);
594
- }
595
- }
596
- /**
597
- * Collect all events from a run into an array
598
- */
599
- async collectEvents(promptOrOptions = {}) {
600
- const events = [];
601
- for await (const event of this.run(promptOrOptions)) {
602
- events.push(event);
603
- }
604
- return events;
605
- }
606
- /**
607
- * Collect the full text response from a run
608
- */
609
- async collectText(promptOrOptions = {}) {
610
- let text = "";
611
- for await (const event of this.run(promptOrOptions)) {
612
- if (event.type === "token") {
613
- text += event.text;
614
- }
615
- }
616
- return text;
617
- }
618
- }
619
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}