background-agents 0.1.2 → 1.0.2

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 (236) 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/app/package.json +6 -0
  8. package/bin/background-agents.js +298 -0
  9. package/lib/ui.js +110 -0
  10. package/package.json +33 -57
  11. package/dist/agents/claude/index.d.ts +0 -11
  12. package/dist/agents/claude/index.d.ts.map +0 -1
  13. package/dist/agents/claude/index.js +0 -78
  14. package/dist/agents/claude/index.js.map +0 -1
  15. package/dist/agents/claude/parser.d.ts +0 -16
  16. package/dist/agents/claude/parser.d.ts.map +0 -1
  17. package/dist/agents/claude/parser.js +0 -87
  18. package/dist/agents/claude/parser.js.map +0 -1
  19. package/dist/agents/claude/tools.d.ts +0 -7
  20. package/dist/agents/claude/tools.d.ts.map +0 -1
  21. package/dist/agents/claude/tools.js +0 -15
  22. package/dist/agents/claude/tools.js.map +0 -1
  23. package/dist/agents/codex/index.d.ts +0 -11
  24. package/dist/agents/codex/index.d.ts.map +0 -1
  25. package/dist/agents/codex/index.js +0 -60
  26. package/dist/agents/codex/index.js.map +0 -1
  27. package/dist/agents/codex/parser.d.ts +0 -12
  28. package/dist/agents/codex/parser.d.ts.map +0 -1
  29. package/dist/agents/codex/parser.js +0 -108
  30. package/dist/agents/codex/parser.js.map +0 -1
  31. package/dist/agents/codex/tools.d.ts +0 -11
  32. package/dist/agents/codex/tools.d.ts.map +0 -1
  33. package/dist/agents/codex/tools.js +0 -40
  34. package/dist/agents/codex/tools.js.map +0 -1
  35. package/dist/agents/eliza/bundle-content.d.ts +0 -6
  36. package/dist/agents/eliza/bundle-content.d.ts.map +0 -1
  37. package/dist/agents/eliza/bundle-content.js +0 -7
  38. package/dist/agents/eliza/bundle-content.js.map +0 -1
  39. package/dist/agents/eliza/cli.bundle.js +0 -579
  40. package/dist/agents/eliza/cli.d.ts +0 -10
  41. package/dist/agents/eliza/cli.d.ts.map +0 -1
  42. package/dist/agents/eliza/cli.js +0 -342
  43. package/dist/agents/eliza/cli.js.map +0 -1
  44. package/dist/agents/eliza/index.d.ts +0 -22
  45. package/dist/agents/eliza/index.d.ts.map +0 -1
  46. package/dist/agents/eliza/index.js +0 -54
  47. package/dist/agents/eliza/index.js.map +0 -1
  48. package/dist/agents/eliza/parser.d.ts +0 -16
  49. package/dist/agents/eliza/parser.d.ts.map +0 -1
  50. package/dist/agents/eliza/parser.js +0 -67
  51. package/dist/agents/eliza/parser.js.map +0 -1
  52. package/dist/agents/eliza/patterns.d.ts +0 -41
  53. package/dist/agents/eliza/patterns.d.ts.map +0 -1
  54. package/dist/agents/eliza/patterns.js +0 -259
  55. package/dist/agents/eliza/patterns.js.map +0 -1
  56. package/dist/agents/eliza/tools.d.ts +0 -7
  57. package/dist/agents/eliza/tools.d.ts.map +0 -1
  58. package/dist/agents/eliza/tools.js +0 -14
  59. package/dist/agents/eliza/tools.js.map +0 -1
  60. package/dist/agents/gemini/index.d.ts +0 -11
  61. package/dist/agents/gemini/index.d.ts.map +0 -1
  62. package/dist/agents/gemini/index.js +0 -46
  63. package/dist/agents/gemini/index.js.map +0 -1
  64. package/dist/agents/gemini/parser.d.ts +0 -31
  65. package/dist/agents/gemini/parser.d.ts.map +0 -1
  66. package/dist/agents/gemini/parser.js +0 -106
  67. package/dist/agents/gemini/parser.js.map +0 -1
  68. package/dist/agents/gemini/tools.d.ts +0 -7
  69. package/dist/agents/gemini/tools.d.ts.map +0 -1
  70. package/dist/agents/gemini/tools.js +0 -23
  71. package/dist/agents/gemini/tools.js.map +0 -1
  72. package/dist/agents/goose/index.d.ts +0 -11
  73. package/dist/agents/goose/index.d.ts.map +0 -1
  74. package/dist/agents/goose/index.js +0 -73
  75. package/dist/agents/goose/index.js.map +0 -1
  76. package/dist/agents/goose/parser.d.ts +0 -24
  77. package/dist/agents/goose/parser.d.ts.map +0 -1
  78. package/dist/agents/goose/parser.js +0 -86
  79. package/dist/agents/goose/parser.js.map +0 -1
  80. package/dist/agents/goose/tools.d.ts +0 -10
  81. package/dist/agents/goose/tools.d.ts.map +0 -1
  82. package/dist/agents/goose/tools.js +0 -30
  83. package/dist/agents/goose/tools.js.map +0 -1
  84. package/dist/agents/index.d.ts +0 -27
  85. package/dist/agents/index.d.ts.map +0 -1
  86. package/dist/agents/index.js +0 -46
  87. package/dist/agents/index.js.map +0 -1
  88. package/dist/agents/opencode/index.d.ts +0 -12
  89. package/dist/agents/opencode/index.d.ts.map +0 -1
  90. package/dist/agents/opencode/index.js +0 -53
  91. package/dist/agents/opencode/index.js.map +0 -1
  92. package/dist/agents/opencode/parser.d.ts +0 -15
  93. package/dist/agents/opencode/parser.d.ts.map +0 -1
  94. package/dist/agents/opencode/parser.js +0 -71
  95. package/dist/agents/opencode/parser.js.map +0 -1
  96. package/dist/agents/opencode/tools.d.ts +0 -7
  97. package/dist/agents/opencode/tools.d.ts.map +0 -1
  98. package/dist/agents/opencode/tools.js +0 -10
  99. package/dist/agents/opencode/tools.js.map +0 -1
  100. package/dist/agents/openhands/index.d.ts +0 -17
  101. package/dist/agents/openhands/index.d.ts.map +0 -1
  102. package/dist/agents/openhands/index.js +0 -67
  103. package/dist/agents/openhands/index.js.map +0 -1
  104. package/dist/agents/openhands/parser.d.ts +0 -16
  105. package/dist/agents/openhands/parser.d.ts.map +0 -1
  106. package/dist/agents/openhands/parser.js +0 -93
  107. package/dist/agents/openhands/parser.js.map +0 -1
  108. package/dist/agents/openhands/tools.d.ts +0 -7
  109. package/dist/agents/openhands/tools.d.ts.map +0 -1
  110. package/dist/agents/openhands/tools.js +0 -24
  111. package/dist/agents/openhands/tools.js.map +0 -1
  112. package/dist/agents/pi/index.d.ts +0 -14
  113. package/dist/agents/pi/index.d.ts.map +0 -1
  114. package/dist/agents/pi/index.js +0 -54
  115. package/dist/agents/pi/index.js.map +0 -1
  116. package/dist/agents/pi/parser.d.ts +0 -21
  117. package/dist/agents/pi/parser.d.ts.map +0 -1
  118. package/dist/agents/pi/parser.js +0 -91
  119. package/dist/agents/pi/parser.js.map +0 -1
  120. package/dist/agents/pi/tools.d.ts +0 -8
  121. package/dist/agents/pi/tools.d.ts.map +0 -1
  122. package/dist/agents/pi/tools.js +0 -16
  123. package/dist/agents/pi/tools.js.map +0 -1
  124. package/dist/agents/picocode/index.d.ts +0 -18
  125. package/dist/agents/picocode/index.d.ts.map +0 -1
  126. package/dist/agents/picocode/index.js +0 -68
  127. package/dist/agents/picocode/index.js.map +0 -1
  128. package/dist/agents/picocode/parser.d.ts +0 -19
  129. package/dist/agents/picocode/parser.d.ts.map +0 -1
  130. package/dist/agents/picocode/parser.js +0 -104
  131. package/dist/agents/picocode/parser.js.map +0 -1
  132. package/dist/agents/picocode/tools.d.ts +0 -9
  133. package/dist/agents/picocode/tools.d.ts.map +0 -1
  134. package/dist/agents/picocode/tools.js +0 -27
  135. package/dist/agents/picocode/tools.js.map +0 -1
  136. package/dist/background/index.d.ts +0 -6
  137. package/dist/background/index.d.ts.map +0 -1
  138. package/dist/background/index.js +0 -5
  139. package/dist/background/index.js.map +0 -1
  140. package/dist/background/session.d.ts +0 -47
  141. package/dist/background/session.d.ts.map +0 -1
  142. package/dist/background/session.js +0 -481
  143. package/dist/background/session.js.map +0 -1
  144. package/dist/background/types.d.ts +0 -55
  145. package/dist/background/types.d.ts.map +0 -1
  146. package/dist/background/types.js +0 -5
  147. package/dist/background/types.js.map +0 -1
  148. package/dist/core/agent.d.ts +0 -95
  149. package/dist/core/agent.d.ts.map +0 -1
  150. package/dist/core/agent.js +0 -8
  151. package/dist/core/agent.js.map +0 -1
  152. package/dist/core/index.d.ts +0 -7
  153. package/dist/core/index.d.ts.map +0 -1
  154. package/dist/core/index.js +0 -6
  155. package/dist/core/index.js.map +0 -1
  156. package/dist/core/registry.d.ts +0 -48
  157. package/dist/core/registry.d.ts.map +0 -1
  158. package/dist/core/registry.js +0 -68
  159. package/dist/core/registry.js.map +0 -1
  160. package/dist/core/tools.d.ts +0 -31
  161. package/dist/core/tools.d.ts.map +0 -1
  162. package/dist/core/tools.js +0 -82
  163. package/dist/core/tools.js.map +0 -1
  164. package/dist/debug.d.ts +0 -7
  165. package/dist/debug.d.ts.map +0 -1
  166. package/dist/debug.js +0 -19
  167. package/dist/debug.js.map +0 -1
  168. package/dist/factory.d.ts +0 -28
  169. package/dist/factory.d.ts.map +0 -1
  170. package/dist/factory.js +0 -44
  171. package/dist/factory.js.map +0 -1
  172. package/dist/index.d.ts +0 -48
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/index.js +0 -62
  175. package/dist/index.js.map +0 -1
  176. package/dist/providers/base.d.ts +0 -187
  177. package/dist/providers/base.d.ts.map +0 -1
  178. package/dist/providers/base.js +0 -619
  179. package/dist/providers/base.js.map +0 -1
  180. package/dist/providers/claude.d.ts +0 -14
  181. package/dist/providers/claude.d.ts.map +0 -1
  182. package/dist/providers/claude.js +0 -122
  183. package/dist/providers/claude.js.map +0 -1
  184. package/dist/providers/codex.d.ts +0 -14
  185. package/dist/providers/codex.d.ts.map +0 -1
  186. package/dist/providers/codex.js +0 -160
  187. package/dist/providers/codex.js.map +0 -1
  188. package/dist/providers/gemini.d.ts +0 -16
  189. package/dist/providers/gemini.d.ts.map +0 -1
  190. package/dist/providers/gemini.js +0 -101
  191. package/dist/providers/gemini.js.map +0 -1
  192. package/dist/providers/index.d.ts +0 -6
  193. package/dist/providers/index.d.ts.map +0 -1
  194. package/dist/providers/index.js +0 -6
  195. package/dist/providers/index.js.map +0 -1
  196. package/dist/providers/opencode.d.ts +0 -14
  197. package/dist/providers/opencode.d.ts.map +0 -1
  198. package/dist/providers/opencode.js +0 -100
  199. package/dist/providers/opencode.js.map +0 -1
  200. package/dist/sandbox/daytona.d.ts +0 -8
  201. package/dist/sandbox/daytona.d.ts.map +0 -1
  202. package/dist/sandbox/daytona.js +0 -181
  203. package/dist/sandbox/daytona.js.map +0 -1
  204. package/dist/sandbox/index.d.ts +0 -14
  205. package/dist/sandbox/index.d.ts.map +0 -1
  206. package/dist/sandbox/index.js +0 -15
  207. package/dist/sandbox/index.js.map +0 -1
  208. package/dist/session.d.ts +0 -75
  209. package/dist/session.d.ts.map +0 -1
  210. package/dist/session.js +0 -117
  211. package/dist/session.js.map +0 -1
  212. package/dist/types/events.d.ts +0 -114
  213. package/dist/types/events.d.ts.map +0 -1
  214. package/dist/types/events.js +0 -50
  215. package/dist/types/events.js.map +0 -1
  216. package/dist/types/index.d.ts +0 -3
  217. package/dist/types/index.d.ts.map +0 -1
  218. package/dist/types/index.js +0 -3
  219. package/dist/types/index.js.map +0 -1
  220. package/dist/types/provider.d.ts +0 -67
  221. package/dist/types/provider.d.ts.map +0 -1
  222. package/dist/types/provider.js +0 -5
  223. package/dist/types/provider.js.map +0 -1
  224. package/dist/utils/index.d.ts +0 -3
  225. package/dist/utils/index.d.ts.map +0 -1
  226. package/dist/utils/index.js +0 -3
  227. package/dist/utils/index.js.map +0 -1
  228. package/dist/utils/install.d.ts +0 -37
  229. package/dist/utils/install.d.ts.map +0 -1
  230. package/dist/utils/install.js +0 -122
  231. package/dist/utils/install.js.map +0 -1
  232. package/dist/utils/json.d.ts +0 -8
  233. package/dist/utils/json.d.ts.map +0 -1
  234. package/dist/utils/json.js +0 -15
  235. package/dist/utils/json.js.map +0 -1
  236. package/src/index.ts +0 -156
@@ -1,27 +0,0 @@
1
- /**
2
- * Picocode tool name mappings
3
- *
4
- * Maps Picocode tool names to canonical tool names.
5
- * Picocode tool names (from tools.rs): read_file, write_file, edit_file,
6
- * copy_file, move_file, list_dir, make_dir, remove, glob_files, grep_text, bash, agent_browser
7
- */
8
- export const PICOCODE_TOOL_MAPPINGS = {
9
- // File operations
10
- read_file: "read",
11
- write_file: "write",
12
- edit_file: "edit",
13
- copy_file: "write", // maps to write since it creates/copies files
14
- move_file: "write", // maps to write since it modifies filesystem
15
- // Directory operations
16
- list_dir: "glob",
17
- make_dir: "shell", // directory creation is a shell-like operation
18
- remove: "shell", // file/dir removal is a shell-like operation
19
- // Search operations
20
- glob_files: "glob",
21
- grep_text: "grep",
22
- // Shell/command execution
23
- bash: "shell",
24
- // Browser automation (no direct canonical mapping, keep as-is)
25
- agent_browser: "agent_browser",
26
- };
27
- //# sourceMappingURL=tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/agents/picocode/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC5D,kBAAkB;IAClB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,OAAO;IACnB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,OAAO,EAAE,8CAA8C;IAClE,SAAS,EAAE,OAAO,EAAE,6CAA6C;IAEjE,uBAAuB;IACvB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO,EAAE,+CAA+C;IAClE,MAAM,EAAE,OAAO,EAAE,6CAA6C;IAE9D,oBAAoB;IACpB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IAEjB,0BAA0B;IAC1B,IAAI,EAAE,OAAO;IAEb,+DAA+D;IAC/D,aAAa,EAAE,eAAe;CAC/B,CAAA"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Background module exports
3
- */
4
- export type { BackgroundRunPhase, PollResult, SessionMeta, StartOptions, TurnHandle, } from "./types";
5
- export { createBackgroundSession, writeInitialSessionMeta, readProviderFromMeta, type BackgroundSession, } from "./session";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAA"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Background module exports
3
- */
4
- export { createBackgroundSession, writeInitialSessionMeta, readProviderFromMeta, } from "./session";
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GAErB,MAAM,WAAW,CAAA"}
@@ -1,47 +0,0 @@
1
- /**
2
- * Background Session Manager
3
- *
4
- * Extracted from the monolithic Provider base class.
5
- * Handles all background execution logic independently.
6
- */
7
- import type { AgentDefinition } from "../core/agent";
8
- import type { CodeAgentSandbox } from "../types/provider";
9
- import type { PollResult, StartOptions, TurnHandle } from "./types";
10
- export type { BackgroundRunPhase } from "./types";
11
- /**
12
- * Background session interface
13
- */
14
- export interface BackgroundSession {
15
- /** Unique session ID */
16
- readonly id: string;
17
- /** Session directory in sandbox */
18
- readonly sessionDir: string;
19
- /** Agent definition */
20
- readonly agent: AgentDefinition;
21
- /** Start a new turn with the given prompt */
22
- start(prompt: string, options?: Omit<StartOptions, "prompt">): Promise<TurnHandle>;
23
- /** Poll for new events */
24
- getEvents(): Promise<PollResult>;
25
- /** Check if a turn is currently running */
26
- isRunning(): Promise<boolean>;
27
- /** Get current turn's PID */
28
- getPid(): Promise<number | null>;
29
- /** Cancel the current turn */
30
- cancel(): Promise<void>;
31
- }
32
- /**
33
- * Create a background session.
34
- */
35
- export declare function createBackgroundSession(agent: AgentDefinition, sandbox: CodeAgentSandbox, sessionDir: string, defaults?: Omit<StartOptions, "prompt">): BackgroundSession;
36
- /**
37
- * Write initial session metadata for reattachment.
38
- */
39
- export declare function writeInitialSessionMeta(sandbox: CodeAgentSandbox, sessionDir: string, agentName: string, sessionId: string | null): Promise<void>;
40
- /**
41
- * Read provider name from session metadata.
42
- */
43
- export declare function readProviderFromMeta(sandbox: CodeAgentSandbox, sessionDir: string): Promise<{
44
- provider: string | null;
45
- sessionId: string | null;
46
- } | null>;
47
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/background/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,eAAe,CAAA;AAE9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EACV,UAAU,EAEV,YAAY,EACZ,UAAU,EACX,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAmCjD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAE/B,6CAA6C;IAC7C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAElF,0BAA0B;IAC1B,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;IAEhC,2CAA2C;IAC3C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAE7B,6BAA6B;IAC7B,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAEhC,8BAA8B;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAM,GAC1C,iBAAiB,CAEnB;AAwhBD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAiBvE"}
@@ -1,481 +0,0 @@
1
- /**
2
- * Background Session Manager
3
- *
4
- * Extracted from the monolithic Provider base class.
5
- * Handles all background execution logic independently.
6
- */
7
- import { randomUUID } from "node:crypto";
8
- import { debugLog } from "../debug";
9
- /** After startedAt, ignore "done but no output" briefly (race with wrapper). */
10
- const BACKGROUND_STARTUP_GRACE_MS = 4000;
11
- function withinStartupGrace(meta) {
12
- if (!meta.startedAt)
13
- return false;
14
- const t = Date.parse(meta.startedAt);
15
- if (Number.isNaN(t))
16
- return false;
17
- return Date.now() - t < BACKGROUND_STARTUP_GRACE_MS;
18
- }
19
- function hasObservableBackgroundProgress(result) {
20
- for (const e of result.events) {
21
- if (e.type === "token" ||
22
- e.type === "tool_start" ||
23
- e.type === "tool_end" ||
24
- e.type === "end") {
25
- return true;
26
- }
27
- }
28
- const raw = (result.rawOutput ?? "").trim();
29
- const nonJsonLines = raw.split("\n").filter((l) => {
30
- const t = l.trim();
31
- return t && !(t.startsWith("{") && t.endsWith("}"));
32
- });
33
- return nonJsonLines.some((l) => l.trim().length > 0);
34
- }
35
- /**
36
- * Create a background session.
37
- */
38
- export function createBackgroundSession(agent, sandbox, sessionDir, defaults = {}) {
39
- return new BackgroundSessionImpl(agent, sandbox, sessionDir, defaults);
40
- }
41
- /**
42
- * Background session implementation
43
- */
44
- class BackgroundSessionImpl {
45
- agent;
46
- sandbox;
47
- sessionDir;
48
- defaults;
49
- id;
50
- parseContext = { state: {}, sessionId: null };
51
- constructor(agent, sandbox, sessionDir, defaults) {
52
- this.agent = agent;
53
- this.sandbox = sandbox;
54
- this.sessionDir = sessionDir;
55
- this.defaults = defaults;
56
- // Extract ID from session dir
57
- this.id = sessionDir.replace(/.*codeagent-/, "");
58
- }
59
- async start(prompt, options = {}) {
60
- const opts = {
61
- ...this.defaults,
62
- ...options,
63
- prompt,
64
- };
65
- // Handle system prompt for agents without native support
66
- if (opts.systemPrompt && !this.agent.capabilities?.supportsSystemPrompt) {
67
- opts.prompt = opts.systemPrompt + "\n\n" + (opts.prompt ?? "");
68
- }
69
- if (!this.sandbox.executeCommand) {
70
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
71
- }
72
- // Ensure session directory exists
73
- await this.sandbox.executeCommand(`mkdir -p "${this.sessionDir}"`, 10);
74
- // Read current meta
75
- const meta = await this.readMeta();
76
- const currentTurn = meta?.currentTurn ?? 0;
77
- const outputFile = `${this.sessionDir}/${currentTurn}.jsonl`;
78
- const runId = randomUUID().slice(0, 8);
79
- debugLog(`background turn start agent=${this.agent.name} sessionDir=${this.sessionDir} turn=${currentTurn}`, this.parseContext.sessionId);
80
- // Write initial meta before starting
81
- await this.writeMeta({
82
- currentTurn,
83
- cursor: 0,
84
- runId,
85
- outputFile,
86
- startedAt: new Date().toISOString(),
87
- provider: this.agent.name,
88
- sessionId: this.parseContext.sessionId ?? opts.sessionId ?? meta?.sessionId ?? null,
89
- });
90
- // Build and execute command
91
- const commandSpec = this.agent.buildCommand(opts);
92
- // Set cwd from options if not already set by agent
93
- if (opts.cwd && !commandSpec.cwd) {
94
- commandSpec.cwd = opts.cwd;
95
- }
96
- // Set env vars
97
- if (commandSpec.env) {
98
- this.sandbox.setEnvVars(commandSpec.env);
99
- }
100
- // Build full command string
101
- const fullCommand = this.buildFullCommand(commandSpec);
102
- if (typeof this.sandbox.executeBackground !== "function") {
103
- throw new Error("Background sessions require a sandbox with executeBackground support");
104
- }
105
- debugLog("startSandboxBackground cli", this.parseContext.sessionId, fullCommand);
106
- const result = await this.sandbox.executeBackground({
107
- command: fullCommand,
108
- outputFile,
109
- runId,
110
- timeout: opts.timeout ?? 30,
111
- });
112
- // Update meta with PID
113
- await this.writeMeta({
114
- currentTurn,
115
- cursor: 0,
116
- pid: result.pid,
117
- runId,
118
- outputFile,
119
- startedAt: new Date().toISOString(),
120
- provider: this.agent.name,
121
- sessionId: this.parseContext.sessionId ?? opts.sessionId ?? meta?.sessionId ?? null,
122
- });
123
- debugLog(`background turn started agent=${this.agent.name} pid=${result.pid}`, this.parseContext.sessionId);
124
- return {
125
- executionId: randomUUID(),
126
- pid: result.pid,
127
- outputFile,
128
- };
129
- }
130
- async getEvents() {
131
- // Use optimized polling if available
132
- let meta = null;
133
- let outputContent = null;
134
- let stillRunning;
135
- if (this.sandbox.pollBackgroundState) {
136
- const state = await this.sandbox.pollBackgroundState(this.sessionDir);
137
- if (state?.meta) {
138
- try {
139
- const parsed = JSON.parse(state.meta);
140
- if (typeof parsed.currentTurn === "number" &&
141
- typeof parsed.cursor === "number") {
142
- meta = parsed;
143
- }
144
- }
145
- catch {
146
- /* invalid JSON */
147
- }
148
- }
149
- outputContent = state?.output ?? null;
150
- stillRunning = !state?.done;
151
- }
152
- else {
153
- // Legacy path
154
- meta = await this.readMeta();
155
- stillRunning = meta?.outputFile
156
- ? await this.isOutputRunning(meta.outputFile)
157
- : false;
158
- }
159
- if (!meta?.runId || !meta.outputFile) {
160
- debugLog(`getEvents (no turn in progress) sessionDir=${this.sessionDir}`, this.parseContext.sessionId);
161
- return {
162
- sessionId: meta?.sessionId ?? this.parseContext.sessionId ?? null,
163
- events: [],
164
- cursor: String(meta?.cursor ?? 0),
165
- running: false,
166
- runPhase: "idle",
167
- };
168
- }
169
- const cursor = String(meta.cursor);
170
- debugLog(`getEvents agent=${this.agent.name} turn=${meta.currentTurn} cursor=${cursor}`, this.parseContext.sessionId);
171
- // Poll output
172
- const result = await this.pollOutput(meta.outputFile, cursor, meta.rawCursor != null ? String(meta.rawCursor) : null, outputContent);
173
- const sawEnd = meta.sawEnd || result.events.some((e) => e.type === "end");
174
- // Handle completion states
175
- return this.handlePollResult(meta, result, stillRunning, sawEnd);
176
- }
177
- async isRunning() {
178
- const meta = await this.readMeta();
179
- if (!meta?.runId || !meta.outputFile || !this.sandbox.executeCommand) {
180
- return false;
181
- }
182
- return this.isOutputRunning(meta.outputFile, meta.pid);
183
- }
184
- async getPid() {
185
- const meta = await this.readMeta();
186
- if (meta?.pid == null || meta.pid < 1)
187
- return null;
188
- return meta.pid;
189
- }
190
- async cancel() {
191
- const meta = await this.readMeta();
192
- if (meta?.pid == null)
193
- return;
194
- if (this.sandbox.killBackgroundProcess) {
195
- await this.sandbox.killBackgroundProcess(meta.pid, this.agent.name);
196
- }
197
- else if (this.sandbox.executeCommand) {
198
- await this.sandbox.executeCommand(`kill -TERM ${meta.pid} 2>/dev/null || true`, 10);
199
- await new Promise((r) => setTimeout(r, 500));
200
- await this.sandbox.executeCommand(`kill -9 ${meta.pid} 2>/dev/null || true`, 10);
201
- await this.sandbox.executeCommand(`pkill -9 -f "${this.agent.name}" 2>/dev/null || true`, 10);
202
- }
203
- // Write done file
204
- if (meta.outputFile && this.sandbox.executeCommand) {
205
- const donePath = meta.outputFile + ".done";
206
- const escaped = donePath.replace(/'/g, "'\\''");
207
- await this.sandbox.executeCommand(`echo 1 > '${escaped}' 2>/dev/null || true`, 10);
208
- }
209
- }
210
- // ─────────────────────────────────────────────────────────────────────────
211
- // Private helpers
212
- // ─────────────────────────────────────────────────────────────────────────
213
- async readMeta() {
214
- if (!this.sandbox.executeCommand)
215
- return null;
216
- const result = await this.sandbox.executeCommand(`cat "${this.sessionDir}/meta.json" 2>/dev/null || true`, 10);
217
- const raw = (result.output ?? "").trim();
218
- if (!raw)
219
- return null;
220
- try {
221
- const o = JSON.parse(raw);
222
- if (typeof o.currentTurn !== "number" || typeof o.cursor !== "number")
223
- return null;
224
- return o;
225
- }
226
- catch {
227
- return null;
228
- }
229
- }
230
- async writeMeta(meta) {
231
- if (!this.sandbox.executeCommand) {
232
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
233
- }
234
- const json = JSON.stringify(meta);
235
- const b64 = Buffer.from(json, "utf8").toString("base64");
236
- await this.sandbox.executeCommand(`mkdir -p "${this.sessionDir}" && echo '${b64}' | base64 -d > "${this.sessionDir}/meta.json"`, 10);
237
- }
238
- async writeMetaIfChanged(next, prev) {
239
- if (prev) {
240
- const unchanged = prev.currentTurn === next.currentTurn &&
241
- prev.cursor === next.cursor &&
242
- (prev.rawCursor ?? 0) === (next.rawCursor ?? 0) &&
243
- prev.pid === next.pid &&
244
- prev.runId === next.runId &&
245
- prev.outputFile === next.outputFile &&
246
- (prev.sawEnd ?? false) === (next.sawEnd ?? false) &&
247
- prev.startedAt === next.startedAt &&
248
- prev.provider === next.provider &&
249
- (prev.sessionId ?? null) === (next.sessionId ?? null);
250
- if (unchanged)
251
- return;
252
- }
253
- await this.writeMeta(next);
254
- }
255
- async isOutputRunning(outputFile, pid) {
256
- if (!this.sandbox.executeCommand)
257
- return false;
258
- const donePath = outputFile + ".done";
259
- const escaped = donePath.replace(/'/g, "'\\''");
260
- // Check both the .done file AND whether the process is still alive.
261
- // The .done file indicates normal completion, but if the process was killed
262
- // externally (e.g., kill -9), we need to check if the PID is still running.
263
- // Note: We check process state instead of using kill -0 because kill -0 succeeds
264
- // on zombie processes (state Z). A running process has state R, S, or D.
265
- const checkDone = `test -f '${escaped}' 2>/dev/null; echo "DONE:$?"`;
266
- // Check if process is alive and not a zombie - get process state
267
- // State: R=running, S=sleeping, D=disk sleep, Z=zombie, T=stopped
268
- const checkPid = pid
269
- ? `STATE=$(ps -p ${pid} -o state= 2>/dev/null); if [ -n "$STATE" ] && [ "$STATE" != "Z" ]; then echo "PID:0"; else echo "PID:1"; fi`
270
- : 'echo "PID:1"';
271
- const r = await this.sandbox.executeCommand(`${checkDone}; ${checkPid}`, 10);
272
- const output = (r.output ?? "").trim();
273
- // Parse results: DONE:0 means .done file exists, PID:0 means process is alive (not zombie)
274
- const doneMatch = output.match(/DONE:(\d+)/);
275
- const pidMatch = output.match(/PID:(\d+)/);
276
- const doneExists = doneMatch ? doneMatch[1] === "0" : false;
277
- const processAlive = pidMatch ? pidMatch[1] === "0" : false;
278
- // Running if: .done doesn't exist AND process is still alive (if we have a PID to check)
279
- // If we have a PID and the process is dead/zombie, consider it not running even without .done
280
- if (pid && !processAlive) {
281
- return false;
282
- }
283
- return !doneExists;
284
- }
285
- async pollOutput(outputFile, cursor, rawCursor, prefetchedContent) {
286
- let rawOutput;
287
- if (prefetchedContent != null) {
288
- rawOutput = prefetchedContent;
289
- }
290
- else {
291
- if (!this.sandbox.executeCommand) {
292
- throw new Error("Sandbox background mode requires a sandbox with executeCommand support");
293
- }
294
- const result = await this.sandbox.executeCommand(`cat ${outputFile}`, 30);
295
- rawOutput = result.output ?? "";
296
- }
297
- const startIndex = cursor ? Number(cursor) || 0 : 0;
298
- void rawCursor;
299
- const rawLines = rawOutput.split("\n");
300
- const lines = [];
301
- const isJson = (s) => s.startsWith("{") && s.endsWith("}");
302
- for (let i = 0; i < rawLines.length; i++) {
303
- const trimmed = rawLines[i].trim();
304
- if (!trimmed)
305
- continue;
306
- if (!isJson(trimmed) && i === rawLines.length - 1)
307
- continue;
308
- if (isJson(trimmed))
309
- lines.push(trimmed);
310
- }
311
- if (startIndex >= lines.length) {
312
- return {
313
- status: "running",
314
- sessionId: this.parseContext.sessionId,
315
- events: [],
316
- cursor: String(lines.length),
317
- rawCursor: String(rawLines.length),
318
- rawOutput,
319
- };
320
- }
321
- const eventsOut = [];
322
- let status = "running";
323
- for (const line of lines.slice(startIndex)) {
324
- const raw = this.agent.parse(line, this.parseContext);
325
- const events = raw === null ? [] : Array.isArray(raw) ? raw : [raw];
326
- for (const event of events) {
327
- if (event.type === "session") {
328
- this.parseContext.sessionId = event.id;
329
- }
330
- if (event.type === "end")
331
- status = "completed";
332
- eventsOut.push(event);
333
- }
334
- }
335
- return {
336
- status,
337
- sessionId: this.parseContext.sessionId,
338
- events: eventsOut,
339
- cursor: String(lines.length),
340
- rawCursor: String(rawLines.length),
341
- rawOutput,
342
- };
343
- }
344
- async handlePollResult(meta, result, stillRunning, sawEnd) {
345
- const baseMeta = {
346
- currentTurn: meta.currentTurn,
347
- cursor: Number(result.cursor) || 0,
348
- rawCursor: Number(result.rawCursor) || meta.rawCursor || 0,
349
- provider: this.agent.name,
350
- sessionId: this.parseContext.sessionId ?? meta.sessionId ?? null,
351
- };
352
- // Early poll / wrapper race
353
- if (!stillRunning &&
354
- !sawEnd &&
355
- withinStartupGrace(meta) &&
356
- !hasObservableBackgroundProgress(result)) {
357
- await this.writeMetaIfChanged({
358
- ...baseMeta,
359
- sawEnd: false,
360
- pid: meta.pid,
361
- runId: meta.runId,
362
- outputFile: meta.outputFile,
363
- startedAt: meta.startedAt,
364
- }, meta);
365
- return {
366
- sessionId: result.sessionId,
367
- events: result.events,
368
- cursor: result.cursor,
369
- running: true,
370
- runPhase: "starting",
371
- };
372
- }
373
- if (!stillRunning || sawEnd) {
374
- const nextTurn = (meta.currentTurn ?? 0) + 1;
375
- await this.writeMetaIfChanged({
376
- ...baseMeta,
377
- currentTurn: nextTurn,
378
- sawEnd,
379
- ...(sawEnd
380
- ? {}
381
- : { outputFile: meta.outputFile, runId: meta.runId }),
382
- }, meta);
383
- }
384
- else {
385
- await this.writeMetaIfChanged({
386
- ...baseMeta,
387
- sawEnd,
388
- pid: meta.pid,
389
- runId: meta.runId,
390
- outputFile: meta.outputFile,
391
- startedAt: meta.startedAt,
392
- }, meta);
393
- }
394
- // Crashed: process exited without end event
395
- if (!stillRunning && !sawEnd) {
396
- const raw = (result.rawOutput ?? "").trim();
397
- const nonJsonLines = raw.split("\n").filter((l) => {
398
- const t = l.trim();
399
- return t && !(t.startsWith("{") && t.endsWith("}"));
400
- });
401
- const output = nonJsonLines.join("\n").trim().slice(-4096) || undefined;
402
- const crashEvent = {
403
- type: "agent_crashed",
404
- message: "Agent process exited without completing (crashed or killed)",
405
- output,
406
- };
407
- debugLog("session end", this.parseContext.sessionId ?? meta.sessionId, "reason=crashed", crashEvent.message);
408
- await this.writeMetaIfChanged({
409
- ...baseMeta,
410
- currentTurn: (meta.currentTurn ?? 0) + 1,
411
- sawEnd: true,
412
- }, meta);
413
- return {
414
- sessionId: result.sessionId,
415
- events: [...result.events, crashEvent],
416
- cursor: result.cursor,
417
- running: false,
418
- runPhase: "stopped",
419
- };
420
- }
421
- const active = stillRunning && !sawEnd;
422
- return {
423
- sessionId: result.sessionId,
424
- events: result.events,
425
- cursor: result.cursor,
426
- running: active,
427
- runPhase: active ? "running" : "stopped",
428
- };
429
- }
430
- buildFullCommand(spec) {
431
- const quotedArgs = spec.args.map((arg) => this.quoteArg(arg));
432
- const command = [spec.cmd, ...quotedArgs].join(" ");
433
- // If cwd is specified, prepend a cd command
434
- if (spec.cwd) {
435
- const safeCwd = spec.cwd.replace(/'/g, "'\\''");
436
- return `cd '${safeCwd}' && ${command}`;
437
- }
438
- return command;
439
- }
440
- quoteArg(arg) {
441
- return `'${arg.replace(/'/g, "'\\''")}'`;
442
- }
443
- }
444
- /**
445
- * Write initial session metadata for reattachment.
446
- */
447
- export async function writeInitialSessionMeta(sandbox, sessionDir, agentName, sessionId) {
448
- if (!sandbox.executeCommand)
449
- return;
450
- const meta = {
451
- currentTurn: 0,
452
- cursor: 0,
453
- provider: agentName,
454
- sessionId,
455
- };
456
- const json = JSON.stringify(meta);
457
- const b64 = Buffer.from(json, "utf8").toString("base64");
458
- await sandbox.executeCommand(`mkdir -p "${sessionDir}" && echo '${b64}' | base64 -d > "${sessionDir}/meta.json"`, 10);
459
- }
460
- /**
461
- * Read provider name from session metadata.
462
- */
463
- export async function readProviderFromMeta(sandbox, sessionDir) {
464
- if (!sandbox.executeCommand)
465
- return null;
466
- const result = await sandbox.executeCommand(`cat "${sessionDir}/meta.json" 2>/dev/null || true`, 10);
467
- const raw = (result.output ?? "").trim();
468
- if (!raw)
469
- return null;
470
- try {
471
- const o = JSON.parse(raw);
472
- return {
473
- provider: o.provider ?? null,
474
- sessionId: o.sessionId ?? null,
475
- };
476
- }
477
- catch {
478
- return { provider: null, sessionId: null };
479
- }
480
- }
481
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/background/session.ts"],"names":[],"mappings":"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"}