@oratis/lisa 0.8.0 → 0.11.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 (320) hide show
  1. package/README.md +123 -16
  2. package/README.zh-CN.md +101 -15
  3. package/completions/_lisa +56 -0
  4. package/completions/lisa.bash +35 -1
  5. package/completions/lisa.fish +18 -1
  6. package/dist/advisor/engine.d.ts +7 -0
  7. package/dist/advisor/engine.d.ts.map +1 -1
  8. package/dist/advisor/engine.js +12 -0
  9. package/dist/advisor/engine.js.map +1 -1
  10. package/dist/agent.d.ts +14 -0
  11. package/dist/agent.d.ts.map +1 -1
  12. package/dist/agent.js +58 -7
  13. package/dist/agent.js.map +1 -1
  14. package/dist/agents/managed.d.ts +108 -0
  15. package/dist/agents/managed.d.ts.map +1 -0
  16. package/dist/agents/managed.js +241 -0
  17. package/dist/agents/managed.js.map +1 -0
  18. package/dist/agents/pty.d.ts +155 -0
  19. package/dist/agents/pty.d.ts.map +1 -0
  20. package/dist/agents/pty.js +299 -0
  21. package/dist/agents/pty.js.map +1 -0
  22. package/dist/approval.d.ts +13 -0
  23. package/dist/approval.d.ts.map +1 -1
  24. package/dist/approval.js +25 -2
  25. package/dist/approval.js.map +1 -1
  26. package/dist/autonomy/runs.d.ts +33 -0
  27. package/dist/autonomy/runs.d.ts.map +1 -0
  28. package/dist/autonomy/runs.js +106 -0
  29. package/dist/autonomy/runs.js.map +1 -0
  30. package/dist/channels/feishu.d.ts.map +1 -1
  31. package/dist/channels/feishu.js +65 -0
  32. package/dist/channels/feishu.js.map +1 -1
  33. package/dist/channels/router.d.ts +7 -0
  34. package/dist/channels/router.d.ts.map +1 -1
  35. package/dist/channels/router.js +1 -1
  36. package/dist/channels/router.js.map +1 -1
  37. package/dist/cli/agents-pty.d.ts +18 -0
  38. package/dist/cli/agents-pty.d.ts.map +1 -0
  39. package/dist/cli/agents-pty.js +182 -0
  40. package/dist/cli/agents-pty.js.map +1 -0
  41. package/dist/cli/agents.d.ts +2 -0
  42. package/dist/cli/agents.d.ts.map +1 -0
  43. package/dist/cli/agents.js +65 -0
  44. package/dist/cli/agents.js.map +1 -0
  45. package/dist/cli/consent.d.ts +2 -0
  46. package/dist/cli/consent.d.ts.map +1 -0
  47. package/dist/cli/consent.js +57 -0
  48. package/dist/cli/consent.js.map +1 -0
  49. package/dist/cli/model.d.ts +2 -0
  50. package/dist/cli/model.d.ts.map +1 -0
  51. package/dist/cli/model.js +121 -0
  52. package/dist/cli/model.js.map +1 -0
  53. package/dist/cli/sense.d.ts +2 -0
  54. package/dist/cli/sense.d.ts.map +1 -0
  55. package/dist/cli/sense.js +36 -0
  56. package/dist/cli/sense.js.map +1 -0
  57. package/dist/cli.js +117 -12
  58. package/dist/cli.js.map +1 -1
  59. package/dist/consent/blacklist.d.ts +28 -0
  60. package/dist/consent/blacklist.d.ts.map +1 -0
  61. package/dist/consent/blacklist.js +78 -0
  62. package/dist/consent/blacklist.js.map +1 -0
  63. package/dist/consent/store.d.ts +45 -0
  64. package/dist/consent/store.d.ts.map +1 -0
  65. package/dist/consent/store.js +126 -0
  66. package/dist/consent/store.js.map +1 -0
  67. package/dist/control/policy.d.ts +13 -0
  68. package/dist/control/policy.d.ts.map +1 -0
  69. package/dist/control/policy.js +57 -0
  70. package/dist/control/policy.js.map +1 -0
  71. package/dist/heartbeat/runner.d.ts.map +1 -1
  72. package/dist/heartbeat/runner.js +70 -14
  73. package/dist/heartbeat/runner.js.map +1 -1
  74. package/dist/idle/runner.d.ts.map +1 -1
  75. package/dist/idle/runner.js +87 -17
  76. package/dist/idle/runner.js.map +1 -1
  77. package/dist/integrations/aider/observer.d.ts +21 -1
  78. package/dist/integrations/aider/observer.d.ts.map +1 -1
  79. package/dist/integrations/aider/observer.js +110 -1
  80. package/dist/integrations/aider/observer.js.map +1 -1
  81. package/dist/integrations/claude-code/liveness.d.ts +10 -0
  82. package/dist/integrations/claude-code/liveness.d.ts.map +1 -0
  83. package/dist/integrations/claude-code/liveness.js +62 -0
  84. package/dist/integrations/claude-code/liveness.js.map +1 -0
  85. package/dist/integrations/claude-code/watcher.d.ts +39 -4
  86. package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
  87. package/dist/integrations/claude-code/watcher.js +94 -57
  88. package/dist/integrations/claude-code/watcher.js.map +1 -1
  89. package/dist/integrations/codex/observer.d.ts +19 -6
  90. package/dist/integrations/codex/observer.d.ts.map +1 -1
  91. package/dist/integrations/codex/observer.js +228 -4
  92. package/dist/integrations/codex/observer.js.map +1 -1
  93. package/dist/integrations/dispatch-ledger.d.ts +30 -1
  94. package/dist/integrations/dispatch-ledger.d.ts.map +1 -1
  95. package/dist/integrations/dispatch-ledger.js +75 -9
  96. package/dist/integrations/dispatch-ledger.js.map +1 -1
  97. package/dist/integrations/git/branch.d.ts +11 -0
  98. package/dist/integrations/git/branch.d.ts.map +1 -0
  99. package/dist/integrations/git/branch.js +49 -0
  100. package/dist/integrations/git/branch.js.map +1 -0
  101. package/dist/integrations/git/observer.d.ts +39 -0
  102. package/dist/integrations/git/observer.d.ts.map +1 -0
  103. package/dist/integrations/git/observer.js +252 -0
  104. package/dist/integrations/git/observer.js.map +1 -0
  105. package/dist/integrations/github-pr/observer.d.ts.map +1 -1
  106. package/dist/integrations/github-pr/observer.js +7 -2
  107. package/dist/integrations/github-pr/observer.js.map +1 -1
  108. package/dist/integrations/hub.d.ts +8 -0
  109. package/dist/integrations/hub.d.ts.map +1 -1
  110. package/dist/integrations/hub.js +39 -1
  111. package/dist/integrations/hub.js.map +1 -1
  112. package/dist/integrations/managed/observer.d.ts +17 -0
  113. package/dist/integrations/managed/observer.d.ts.map +1 -0
  114. package/dist/integrations/managed/observer.js +46 -0
  115. package/dist/integrations/managed/observer.js.map +1 -0
  116. package/dist/integrations/opencode/observer.d.ts +53 -5
  117. package/dist/integrations/opencode/observer.d.ts.map +1 -1
  118. package/dist/integrations/opencode/observer.js +242 -20
  119. package/dist/integrations/opencode/observer.js.map +1 -1
  120. package/dist/integrations/pty/observer.d.ts +25 -0
  121. package/dist/integrations/pty/observer.d.ts.map +1 -0
  122. package/dist/integrations/pty/observer.js +48 -0
  123. package/dist/integrations/pty/observer.js.map +1 -0
  124. package/dist/integrations/registry.d.ts.map +1 -1
  125. package/dist/integrations/registry.js +5 -0
  126. package/dist/integrations/registry.js.map +1 -1
  127. package/dist/integrations/shell/observer.d.ts +33 -0
  128. package/dist/integrations/shell/observer.d.ts.map +1 -0
  129. package/dist/integrations/shell/observer.js +223 -0
  130. package/dist/integrations/shell/observer.js.map +1 -0
  131. package/dist/integrations/takoapi/a2a.d.ts +38 -0
  132. package/dist/integrations/takoapi/a2a.d.ts.map +1 -0
  133. package/dist/integrations/takoapi/a2a.js +70 -0
  134. package/dist/integrations/takoapi/a2a.js.map +1 -0
  135. package/dist/integrations/takoapi/ledger.d.ts +32 -0
  136. package/dist/integrations/takoapi/ledger.d.ts.map +1 -0
  137. package/dist/integrations/takoapi/ledger.js +96 -0
  138. package/dist/integrations/takoapi/ledger.js.map +1 -0
  139. package/dist/integrations/takoapi/observer.d.ts +39 -0
  140. package/dist/integrations/takoapi/observer.d.ts.map +1 -0
  141. package/dist/integrations/takoapi/observer.js +102 -0
  142. package/dist/integrations/takoapi/observer.js.map +1 -0
  143. package/dist/integrations/types.d.ts +17 -0
  144. package/dist/integrations/types.d.ts.map +1 -1
  145. package/dist/mcp/client.d.ts +5 -0
  146. package/dist/mcp/client.d.ts.map +1 -1
  147. package/dist/mcp/client.js +1 -1
  148. package/dist/mcp/client.js.map +1 -1
  149. package/dist/mcp/config.d.ts +4 -0
  150. package/dist/mcp/config.d.ts.map +1 -1
  151. package/dist/mcp/config.js +34 -0
  152. package/dist/mcp/config.js.map +1 -1
  153. package/dist/memory/embedding.d.ts +45 -0
  154. package/dist/memory/embedding.d.ts.map +1 -0
  155. package/dist/memory/embedding.js +139 -0
  156. package/dist/memory/embedding.js.map +1 -0
  157. package/dist/memory/search_tool.d.ts.map +1 -1
  158. package/dist/memory/search_tool.js +6 -2
  159. package/dist/memory/search_tool.js.map +1 -1
  160. package/dist/memory/vector.d.ts +14 -3
  161. package/dist/memory/vector.d.ts.map +1 -1
  162. package/dist/memory/vector.js +50 -0
  163. package/dist/memory/vector.js.map +1 -1
  164. package/dist/model/local.d.ts +43 -0
  165. package/dist/model/local.d.ts.map +1 -0
  166. package/dist/model/local.js +118 -0
  167. package/dist/model/local.js.map +1 -0
  168. package/dist/model/plan-usage.d.ts +41 -0
  169. package/dist/model/plan-usage.d.ts.map +1 -0
  170. package/dist/model/plan-usage.js +168 -0
  171. package/dist/model/plan-usage.js.map +1 -0
  172. package/dist/model/plans.d.ts +73 -0
  173. package/dist/model/plans.d.ts.map +1 -0
  174. package/dist/model/plans.js +246 -0
  175. package/dist/model/plans.js.map +1 -0
  176. package/dist/orchestrator/recent-recap.d.ts +2 -0
  177. package/dist/orchestrator/recent-recap.d.ts.map +1 -0
  178. package/dist/orchestrator/recent-recap.js +20 -0
  179. package/dist/orchestrator/recent-recap.js.map +1 -0
  180. package/dist/providers/anthropic.d.ts +1 -0
  181. package/dist/providers/anthropic.d.ts.map +1 -1
  182. package/dist/providers/anthropic.js +10 -2
  183. package/dist/providers/anthropic.js.map +1 -1
  184. package/dist/providers/fallback.d.ts +23 -0
  185. package/dist/providers/fallback.d.ts.map +1 -0
  186. package/dist/providers/fallback.js +29 -0
  187. package/dist/providers/fallback.js.map +1 -0
  188. package/dist/providers/gemini.d.ts +2 -0
  189. package/dist/providers/gemini.d.ts.map +1 -1
  190. package/dist/providers/gemini.js +24 -10
  191. package/dist/providers/gemini.js.map +1 -1
  192. package/dist/providers/openai.d.ts.map +1 -1
  193. package/dist/providers/openai.js +4 -1
  194. package/dist/providers/openai.js.map +1 -1
  195. package/dist/providers/registry.d.ts +18 -2
  196. package/dist/providers/registry.d.ts.map +1 -1
  197. package/dist/providers/registry.js +56 -9
  198. package/dist/providers/registry.js.map +1 -1
  199. package/dist/reflect.d.ts +55 -0
  200. package/dist/reflect.d.ts.map +1 -1
  201. package/dist/reflect.js +148 -54
  202. package/dist/reflect.js.map +1 -1
  203. package/dist/sense/log.d.ts +9 -0
  204. package/dist/sense/log.d.ts.map +1 -0
  205. package/dist/sense/log.js +63 -0
  206. package/dist/sense/log.js.map +1 -0
  207. package/dist/sense/screen.d.ts +43 -0
  208. package/dist/sense/screen.d.ts.map +1 -0
  209. package/dist/sense/screen.js +107 -0
  210. package/dist/sense/screen.js.map +1 -0
  211. package/dist/sense/service.d.ts +16 -0
  212. package/dist/sense/service.d.ts.map +1 -0
  213. package/dist/sense/service.js +33 -0
  214. package/dist/sense/service.js.map +1 -0
  215. package/dist/sense/types.d.ts +35 -0
  216. package/dist/sense/types.d.ts.map +1 -0
  217. package/dist/sense/types.js +11 -0
  218. package/dist/sense/types.js.map +1 -0
  219. package/dist/sense/voice.d.ts +28 -0
  220. package/dist/sense/voice.d.ts.map +1 -0
  221. package/dist/sense/voice.js +64 -0
  222. package/dist/sense/voice.js.map +1 -0
  223. package/dist/soul/git.d.ts.map +1 -1
  224. package/dist/soul/git.js +35 -16
  225. package/dist/soul/git.js.map +1 -1
  226. package/dist/soul/store.d.ts +22 -0
  227. package/dist/soul/store.d.ts.map +1 -1
  228. package/dist/soul/store.js +69 -14
  229. package/dist/soul/store.js.map +1 -1
  230. package/dist/soul/summary.d.ts +10 -0
  231. package/dist/soul/summary.d.ts.map +1 -0
  232. package/dist/soul/summary.js +57 -0
  233. package/dist/soul/summary.js.map +1 -0
  234. package/dist/soul/tools.d.ts.map +1 -1
  235. package/dist/soul/tools.js +13 -24
  236. package/dist/soul/tools.js.map +1 -1
  237. package/dist/soul/types.d.ts +9 -0
  238. package/dist/soul/types.d.ts.map +1 -1
  239. package/dist/soul/types.js.map +1 -1
  240. package/dist/subagent.d.ts +7 -0
  241. package/dist/subagent.d.ts.map +1 -1
  242. package/dist/subagent.js +3 -1
  243. package/dist/subagent.js.map +1 -1
  244. package/dist/tools/dispatch_agent.d.ts +13 -1
  245. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  246. package/dist/tools/dispatch_agent.js +56 -12
  247. package/dist/tools/dispatch_agent.js.map +1 -1
  248. package/dist/tools/dispatch_status.d.ts +22 -0
  249. package/dist/tools/dispatch_status.d.ts.map +1 -0
  250. package/dist/tools/dispatch_status.js +57 -0
  251. package/dist/tools/dispatch_status.js.map +1 -0
  252. package/dist/tools/github.d.ts +34 -0
  253. package/dist/tools/github.d.ts.map +1 -0
  254. package/dist/tools/github.js +140 -0
  255. package/dist/tools/github.js.map +1 -0
  256. package/dist/tools/github_link.d.ts +36 -0
  257. package/dist/tools/github_link.d.ts.map +1 -0
  258. package/dist/tools/github_link.js +127 -0
  259. package/dist/tools/github_link.js.map +1 -0
  260. package/dist/tools/mcp.d.ts +28 -0
  261. package/dist/tools/mcp.d.ts.map +1 -0
  262. package/dist/tools/mcp.js +55 -0
  263. package/dist/tools/mcp.js.map +1 -0
  264. package/dist/tools/npm_info.d.ts +21 -0
  265. package/dist/tools/npm_info.d.ts.map +1 -0
  266. package/dist/tools/npm_info.js +102 -0
  267. package/dist/tools/npm_info.js.map +1 -0
  268. package/dist/tools/registry.d.ts +29 -0
  269. package/dist/tools/registry.d.ts.map +1 -1
  270. package/dist/tools/registry.js +75 -0
  271. package/dist/tools/registry.js.map +1 -1
  272. package/dist/tools/run_on_plan.d.ts +46 -0
  273. package/dist/tools/run_on_plan.d.ts.map +1 -0
  274. package/dist/tools/run_on_plan.js +89 -0
  275. package/dist/tools/run_on_plan.js.map +1 -0
  276. package/dist/tools/takoapi.d.ts +60 -0
  277. package/dist/tools/takoapi.d.ts.map +1 -0
  278. package/dist/tools/takoapi.js +181 -0
  279. package/dist/tools/takoapi.js.map +1 -0
  280. package/dist/tools/validate.d.ts +22 -0
  281. package/dist/tools/validate.d.ts.map +1 -0
  282. package/dist/tools/validate.js +50 -0
  283. package/dist/tools/validate.js.map +1 -0
  284. package/dist/voice/dictation.d.ts +51 -0
  285. package/dist/voice/dictation.d.ts.map +1 -0
  286. package/dist/voice/dictation.js +70 -0
  287. package/dist/voice/dictation.js.map +1 -0
  288. package/dist/web/agent-roster.d.ts +56 -0
  289. package/dist/web/agent-roster.d.ts.map +1 -0
  290. package/dist/web/agent-roster.js +109 -0
  291. package/dist/web/agent-roster.js.map +1 -0
  292. package/dist/web/devices.d.ts +27 -0
  293. package/dist/web/devices.d.ts.map +1 -0
  294. package/dist/web/devices.js +113 -0
  295. package/dist/web/devices.js.map +1 -0
  296. package/dist/web/island.d.ts +5 -1
  297. package/dist/web/island.d.ts.map +1 -1
  298. package/dist/web/island.js +427 -67
  299. package/dist/web/island.js.map +1 -1
  300. package/dist/web/lisa-client.d.ts +20 -0
  301. package/dist/web/lisa-client.d.ts.map +1 -0
  302. package/dist/web/lisa-client.js +1323 -0
  303. package/dist/web/lisa-client.js.map +1 -0
  304. package/dist/web/lisa-css.d.ts +13 -0
  305. package/dist/web/lisa-css.d.ts.map +1 -0
  306. package/dist/web/lisa-css.js +1163 -0
  307. package/dist/web/lisa-css.js.map +1 -0
  308. package/dist/web/lisa-html.d.ts +1 -1
  309. package/dist/web/lisa-html.d.ts.map +1 -1
  310. package/dist/web/lisa-html.js +16 -2091
  311. package/dist/web/lisa-html.js.map +1 -1
  312. package/dist/web/push.d.ts +76 -0
  313. package/dist/web/push.d.ts.map +1 -0
  314. package/dist/web/push.js +163 -0
  315. package/dist/web/push.js.map +1 -0
  316. package/dist/web/server.d.ts +19 -0
  317. package/dist/web/server.d.ts.map +1 -1
  318. package/dist/web/server.js +898 -65
  319. package/dist/web/server.js.map +1 -1
  320. package/package.json +5 -2
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Managed agents — the controllable unit of the agent control plane.
3
+ *
4
+ * Unlike an externally-started CLI (observe + cancel only — different identity
5
+ * space, no control channel), a managed agent is one LISA runs itself by looping
6
+ * `runAgent`: it has a stable id, streams live progress, takes follow-up
7
+ * commands, pauses on every mutating tool for the user's approve/deny, and
8
+ * cancels cleanly. This is how the user "sends commands to a running agent."
9
+ *
10
+ * Tool policy (per product decision): FULL tools, but every mutating call
11
+ * (DEFAULT_MUTATING_TOOLS / DEFAULT_MUTATING_ACTIONS) blocks on a UI decision —
12
+ * so an unattended managed agent can't write/exec without explicit approval.
13
+ */
14
+ import { EventEmitter } from "node:events";
15
+ import { runAgent } from "../agent.js";
16
+ import { DEFAULT_MODEL } from "../llm.js";
17
+ import { providerForModel } from "../providers/registry.js";
18
+ import { isMutatingCall, DEFAULT_MUTATING_TOOLS, DEFAULT_MUTATING_ACTIONS, } from "../approval.js";
19
+ const MAX_TOOLS = 6;
20
+ const MAX_FILES = 10;
21
+ const APPROVAL_CFG = {
22
+ mode: "ask-mutating",
23
+ mutatingTools: DEFAULT_MUTATING_TOOLS,
24
+ mutatingActions: DEFAULT_MUTATING_ACTIONS,
25
+ };
26
+ let counter = 0;
27
+ export class ManagedAgent {
28
+ id;
29
+ cwd;
30
+ project;
31
+ model;
32
+ state = "working";
33
+ stateReason = "starting";
34
+ lastMtime;
35
+ turnCount = 0;
36
+ tokensIn = 0;
37
+ tokensOut = 0;
38
+ lastTools = [];
39
+ filesTouched = [];
40
+ lastText = "";
41
+ pending;
42
+ /** Set by the registry to broadcast snapshots. */
43
+ onChange = () => { };
44
+ history = [];
45
+ tools;
46
+ systemPrompt;
47
+ provider;
48
+ ac = new AbortController();
49
+ now;
50
+ queue = [];
51
+ wake;
52
+ constructor(opts) {
53
+ this.id = "m" + (++counter).toString(36) + "-" + this.now0().toString(36).slice(-4);
54
+ this.cwd = opts.cwd;
55
+ this.project = opts.cwd.split("/").filter(Boolean).pop() || opts.cwd;
56
+ this.model = opts.model ?? DEFAULT_MODEL;
57
+ this.provider = opts.provider ?? providerForModel(this.model);
58
+ this.tools = opts.tools;
59
+ this.systemPrompt = opts.systemPrompt;
60
+ this.now = opts.now ?? Date.now;
61
+ this.lastMtime = this.now();
62
+ this.queue.push(opts.task);
63
+ void this.runLoop();
64
+ }
65
+ // Date.now indirection only for the id seed (constructor runs before this.now set).
66
+ now0() {
67
+ return Date.now();
68
+ }
69
+ /** Queue a follow-up command; wakes the loop if it's idle. */
70
+ send(text) {
71
+ if (this.ac.signal.aborted)
72
+ return;
73
+ this.queue.push(text);
74
+ this.wake?.();
75
+ }
76
+ /** Resolve a pending approve/deny. Returns false if nothing is pending. */
77
+ decide(allow) {
78
+ if (!this.pending)
79
+ return false;
80
+ const p = this.pending;
81
+ this.setState("working", "running");
82
+ p.resolve(allow);
83
+ return true;
84
+ }
85
+ /** Abort the run; unblocks any pending tool/input. */
86
+ cancel() {
87
+ if (this.ac.signal.aborted)
88
+ return;
89
+ this.ac.abort();
90
+ this.pending?.resolve(false);
91
+ this.wake?.();
92
+ this.setState("done", "cancelled");
93
+ }
94
+ view() {
95
+ return {
96
+ id: this.id,
97
+ project: this.project,
98
+ cwd: this.cwd,
99
+ model: this.model,
100
+ state: this.state,
101
+ stateReason: this.stateReason,
102
+ lastMtime: this.lastMtime,
103
+ turnCount: this.turnCount,
104
+ tokens: { input: this.tokensIn, output: this.tokensOut },
105
+ lastTools: [...this.lastTools],
106
+ filesTouched: [...this.filesTouched],
107
+ lastText: this.lastText,
108
+ ...(this.pending ? { pending: { tool: this.pending.tool } } : {}),
109
+ };
110
+ }
111
+ // ── internals ──
112
+ async runLoop() {
113
+ while (!this.ac.signal.aborted) {
114
+ const message = await this.nextInput();
115
+ if (message === null)
116
+ break;
117
+ this.setState("working", "running");
118
+ try {
119
+ const result = await runAgent({
120
+ provider: this.provider,
121
+ systemPrompt: this.systemPrompt,
122
+ tools: this.tools,
123
+ toolCtx: { cwd: this.cwd, signal: this.ac.signal, log: () => { } },
124
+ history: this.history,
125
+ userMessage: message,
126
+ model: this.model,
127
+ maxIterations: 64,
128
+ onEvent: (e) => this.onAgentEvent(e),
129
+ approval: (tool, input) => this.approve(tool, input),
130
+ });
131
+ this.history = result.history;
132
+ this.tokensIn += result.inputTokens;
133
+ this.tokensOut += result.outputTokens;
134
+ if (result.finalText)
135
+ this.lastText = result.finalText;
136
+ this.setState("waiting", result.stopReason);
137
+ }
138
+ catch (err) {
139
+ if (this.ac.signal.aborted)
140
+ break;
141
+ this.setState("error", err.message.slice(0, 80));
142
+ }
143
+ }
144
+ if (this.state !== "done")
145
+ this.setState("done", "done");
146
+ }
147
+ /** Resolve with the next queued command, or null when cancelled. */
148
+ nextInput() {
149
+ if (this.ac.signal.aborted)
150
+ return Promise.resolve(null);
151
+ if (this.queue.length)
152
+ return Promise.resolve(this.queue.shift());
153
+ return new Promise((resolve) => {
154
+ this.wake = () => {
155
+ this.wake = undefined;
156
+ resolve(this.ac.signal.aborted ? null : this.queue.shift() ?? null);
157
+ };
158
+ });
159
+ }
160
+ /** Approval callback: auto-allow safe tools; block mutating ones on a UI decision. */
161
+ approve(tool, input) {
162
+ if (!isMutatingCall(APPROVAL_CFG, tool, input))
163
+ return Promise.resolve({ allow: true });
164
+ return new Promise((resolve) => {
165
+ this.pending = {
166
+ tool,
167
+ resolve: (allow) => {
168
+ this.pending = undefined;
169
+ resolve(allow ? { allow: true } : { allow: false, reason: "denied in Lisa" });
170
+ },
171
+ };
172
+ this.setState("waiting", "permission");
173
+ });
174
+ }
175
+ onAgentEvent(e) {
176
+ if (e.type === "turn_start")
177
+ this.turnCount++;
178
+ if (e.type === "tool_call_start") {
179
+ if (e.toolName) {
180
+ this.lastTools.push(e.toolName);
181
+ if (this.lastTools.length > MAX_TOOLS)
182
+ this.lastTools.shift();
183
+ }
184
+ const input = e.toolInput;
185
+ const p = input && (input.file_path ?? input.path ?? input.filename);
186
+ if (typeof p === "string" && p) {
187
+ this.filesTouched.push(p);
188
+ if (this.filesTouched.length > MAX_FILES)
189
+ this.filesTouched.shift();
190
+ }
191
+ }
192
+ if (e.type === "text_delta" && e.text)
193
+ this.lastText = (this.lastText + e.text).slice(-2000);
194
+ this.touch();
195
+ }
196
+ setState(s, reason) {
197
+ this.state = s;
198
+ this.stateReason = reason;
199
+ this.touch();
200
+ }
201
+ touch() {
202
+ this.lastMtime = this.now();
203
+ this.onChange();
204
+ }
205
+ }
206
+ /** Process-wide registry of managed agents; emits "update" with a ManagedView. */
207
+ export class ManagedRegistry extends EventEmitter {
208
+ agents = new Map();
209
+ start(opts) {
210
+ const a = new ManagedAgent(opts);
211
+ a.onChange = () => this.emit("update", a.view());
212
+ this.agents.set(a.id, a);
213
+ this.emit("update", a.view());
214
+ return a.view();
215
+ }
216
+ send(id, text) {
217
+ const a = this.agents.get(id);
218
+ if (!a)
219
+ return false;
220
+ a.send(text);
221
+ return true;
222
+ }
223
+ decide(id, allow) {
224
+ return this.agents.get(id)?.decide(allow) ?? false;
225
+ }
226
+ cancel(id) {
227
+ const a = this.agents.get(id);
228
+ if (!a)
229
+ return false;
230
+ a.cancel();
231
+ return true;
232
+ }
233
+ get(id) {
234
+ return this.agents.get(id);
235
+ }
236
+ list() {
237
+ return [...this.agents.values()].map((a) => a.view());
238
+ }
239
+ }
240
+ export const managedRegistry = new ManagedRegistry();
241
+ //# sourceMappingURL=managed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed.js","sourceRoot":"","sources":["../../src/agents/managed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * PTY-backed agents — EXPERIMENTAL spike (Stage C), OFF BY DEFAULT.
3
+ *
4
+ * Phase-3 managed agents run LISA's OWN agent loop (its tools, its provider).
5
+ * A PTY agent instead spawns the REAL `claude` / `codex` CLI inside a
6
+ * pseudo-terminal, so you get that tool's full configuration — its skills, MCP
7
+ * servers, hooks, model — while LISA owns stdin/stdout: it types your task and
8
+ * follow-ups, can answer prompts, and reads the stream for a coarse live status.
9
+ *
10
+ * HONEST LIMITS (why this is a flagged spike, not a shipped feature):
11
+ * - Native dep: needs `node-pty` (an *optional* dependency). If it isn't built,
12
+ * PTY agents are simply unavailable — nothing else in LISA changes.
13
+ * - Off by default: set `LISA_PTY_AGENTS=1` to enable.
14
+ * - Controls only CLIs LISA SPAWNS — NOT sessions you already opened in your
15
+ * own terminal (those have no control channel; they stay observe-only).
16
+ * - Output parsing is best-effort: the CLI's TUI is ANSI / box-drawn and
17
+ * version-sensitive, so "state" is inferred from output quiescence, not from
18
+ * parsed intent. The captured tail is shown to you (your own terminal), never
19
+ * folded into the structural cross-agent roster.
20
+ */
21
+ import { EventEmitter } from "node:events";
22
+ export type PtyState = "working" | "waiting" | "error" | "done";
23
+ /** Public, serializable snapshot of a PTY agent (structural — no output text). */
24
+ export interface PtyView {
25
+ id: string;
26
+ /** Normalized roster kind, e.g. "claude-code" | "codex". */
27
+ agent: string;
28
+ /** The spawned binary, e.g. "claude". */
29
+ cli: string;
30
+ project: string;
31
+ cwd: string;
32
+ state: PtyState;
33
+ stateReason: string;
34
+ lastMtime: number;
35
+ /** Bytes of terminal output seen so far — a rough liveness signal. */
36
+ bytesOut: number;
37
+ /** When this PTY is a resume-adopt, the real claude session id it continues
38
+ * (so the roster can drop the observe-only duplicate of the same session). */
39
+ adoptedSessionId?: string;
40
+ }
41
+ export interface PtyStartOpts {
42
+ /** "claude" | "claude-code" | "codex" | … */
43
+ agent: string;
44
+ task: string;
45
+ cwd: string;
46
+ /**
47
+ * Adopt an EXISTING claude session by id — spawns `claude --resume <id>` so
48
+ * LISA drives a continuation of a session the user started elsewhere. The
49
+ * caller MUST ensure the session is idle (see liveClaudeSessionIds) — resuming
50
+ * a live one corrupts its transcript.
51
+ */
52
+ resumeSessionId?: string;
53
+ /** Override the binary (else resolved from `agent`). */
54
+ cli?: string;
55
+ /** Override argv (else interactive: []). */
56
+ args?: string[];
57
+ cols?: number;
58
+ rows?: number;
59
+ /** Clock override (tests). */
60
+ now?: () => number;
61
+ /** Injected pty module (tests) — avoids spawning a real process. */
62
+ ptyModule?: PtyModuleLike;
63
+ }
64
+ export interface IPtyLike {
65
+ onData(cb: (data: string) => void): void;
66
+ onExit(cb: (e: {
67
+ exitCode: number;
68
+ signal?: number;
69
+ }) => void): void;
70
+ write(data: string): void;
71
+ kill(signal?: string): void;
72
+ }
73
+ export interface PtyModuleLike {
74
+ spawn(file: string, args: string[], opts: {
75
+ name?: string;
76
+ cols?: number;
77
+ rows?: number;
78
+ cwd?: string;
79
+ env?: Record<string, string | undefined>;
80
+ }): IPtyLike;
81
+ }
82
+ /** Is the PTY-agent spike enabled? Off unless LISA_PTY_AGENTS=1. */
83
+ export declare function ptyEnabled(): boolean;
84
+ /** Map a roster agent-kind to its CLI binary (env-overridable). */
85
+ export declare function resolveCli(agent: string): string;
86
+ /** Normalize a loose agent label to a roster AgentKind. */
87
+ export declare function normalizeAgentKind(agent: string): string;
88
+ /**
89
+ * Best binary to drive a claude session: env override → the newest app-bundled
90
+ * claude (matches the version that wrote the sessions, best for --resume) → the
91
+ * PATH `claude`. The app-bundle probe is macOS-specific and silently no-ops
92
+ * elsewhere. Falls back to resolveCli for non-claude agents.
93
+ */
94
+ export declare function detectClaudeBinary(): string;
95
+ /** Strip ANSI escape sequences + common bare control bytes (CR/backspace). Pure. */
96
+ export declare function stripAnsi(s: string): string;
97
+ /**
98
+ * Coarse live state from output quiescence: actively streaming ⇒ "working";
99
+ * quiet longer than idleMs ⇒ "waiting" (likely awaiting input or a prompt).
100
+ * `done`/`error` are decided by lifecycle flags, not here. Pure.
101
+ */
102
+ export declare function derivePtyState(lastChunkAtMs: number, nowMs: number, idleMs: number): PtyState;
103
+ /** One real CLI running under a pseudo-terminal that LISA drives. */
104
+ export declare class PtyAgent {
105
+ readonly id: string;
106
+ readonly agent: string;
107
+ readonly cli: string;
108
+ readonly cwd: string;
109
+ readonly project: string;
110
+ /** Real claude session id, when this agent is a resume-adopt (claude only). */
111
+ readonly adoptedSessionId?: string;
112
+ onChange: () => void;
113
+ /** Called with each ANSI-stripped output chunk — drives the live attach stream
114
+ * (GET /api/agents/pty/<id>/stream). Distinct from onChange (state snapshots). */
115
+ onOutput: (chunk: string) => void;
116
+ private readonly proc;
117
+ private readonly now;
118
+ private ring;
119
+ private bytesOut;
120
+ private aborted;
121
+ private exited;
122
+ private exitReason;
123
+ private lastChunkAt;
124
+ private lastMtime;
125
+ private constructor();
126
+ /** Spawn a real CLI under a PTY and type the initial task. */
127
+ static start(opts: PtyStartOpts): Promise<PtyAgent>;
128
+ /** Type a line into the CLI (initial task or a follow-up). */
129
+ send(text: string): void;
130
+ /** Kill the CLI. Idempotent. */
131
+ cancel(): void;
132
+ /**
133
+ * ANSI-stripped tail of the terminal — the user's window into THEIR agent.
134
+ * Exposed only via an explicit endpoint, never folded into the structural
135
+ * cross-agent roster (which stays metadata-only).
136
+ */
137
+ output(): string;
138
+ view(): PtyView;
139
+ private onData;
140
+ private onExit;
141
+ private touch;
142
+ }
143
+ /** Process-wide registry of PTY agents; emits "update" with a PtyView. */
144
+ export declare class PtyRegistry extends EventEmitter {
145
+ private agents;
146
+ start(opts: PtyStartOpts): Promise<PtyView>;
147
+ send(id: string, text: string): boolean;
148
+ cancel(id: string): boolean;
149
+ /** ANSI-stripped tail of a PTY agent's terminal, or null if unknown. */
150
+ output(id: string): string | null;
151
+ get(id: string): PtyAgent | undefined;
152
+ list(): PtyView[];
153
+ }
154
+ export declare const ptyRegistry: PtyRegistry;
155
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/agents/pty.ts"],"names":[],"mappings":"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"}