@oratis/lisa 0.2.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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +436 -0
  3. package/README.zh-CN.md +450 -0
  4. package/channels.example.json +45 -0
  5. package/completions/README.md +66 -0
  6. package/completions/_lisa +140 -0
  7. package/completions/lisa.bash +94 -0
  8. package/completions/lisa.fish +85 -0
  9. package/dist/agent.d.ts +70 -0
  10. package/dist/agent.d.ts.map +1 -0
  11. package/dist/agent.js +275 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/approval.d.ts +9 -0
  14. package/dist/approval.d.ts.map +1 -0
  15. package/dist/approval.js +47 -0
  16. package/dist/approval.js.map +1 -0
  17. package/dist/channels/config.d.ts +11 -0
  18. package/dist/channels/config.d.ts.map +1 -0
  19. package/dist/channels/config.js +27 -0
  20. package/dist/channels/config.js.map +1 -0
  21. package/dist/channels/discord.d.ts +28 -0
  22. package/dist/channels/discord.d.ts.map +1 -0
  23. package/dist/channels/discord.js +98 -0
  24. package/dist/channels/discord.js.map +1 -0
  25. package/dist/channels/feishu.d.ts +53 -0
  26. package/dist/channels/feishu.d.ts.map +1 -0
  27. package/dist/channels/feishu.js +228 -0
  28. package/dist/channels/feishu.js.map +1 -0
  29. package/dist/channels/imessage.d.ts +20 -0
  30. package/dist/channels/imessage.d.ts.map +1 -0
  31. package/dist/channels/imessage.js +124 -0
  32. package/dist/channels/imessage.js.map +1 -0
  33. package/dist/channels/registry.d.ts +8 -0
  34. package/dist/channels/registry.d.ts.map +1 -0
  35. package/dist/channels/registry.js +29 -0
  36. package/dist/channels/registry.js.map +1 -0
  37. package/dist/channels/router.d.ts +28 -0
  38. package/dist/channels/router.d.ts.map +1 -0
  39. package/dist/channels/router.js +140 -0
  40. package/dist/channels/router.js.map +1 -0
  41. package/dist/channels/slack.d.ts +43 -0
  42. package/dist/channels/slack.d.ts.map +1 -0
  43. package/dist/channels/slack.js +164 -0
  44. package/dist/channels/slack.js.map +1 -0
  45. package/dist/channels/telegram.d.ts +26 -0
  46. package/dist/channels/telegram.d.ts.map +1 -0
  47. package/dist/channels/telegram.js +103 -0
  48. package/dist/channels/telegram.js.map +1 -0
  49. package/dist/channels/types.d.ts +20 -0
  50. package/dist/channels/types.d.ts.map +1 -0
  51. package/dist/channels/types.js +2 -0
  52. package/dist/channels/types.js.map +1 -0
  53. package/dist/channels/webhook.d.ts +34 -0
  54. package/dist/channels/webhook.d.ts.map +1 -0
  55. package/dist/channels/webhook.js +139 -0
  56. package/dist/channels/webhook.js.map +1 -0
  57. package/dist/cli/colors.d.ts +30 -0
  58. package/dist/cli/colors.d.ts.map +1 -0
  59. package/dist/cli/colors.js +53 -0
  60. package/dist/cli/colors.js.map +1 -0
  61. package/dist/cli/doctor.d.ts +2 -0
  62. package/dist/cli/doctor.d.ts.map +1 -0
  63. package/dist/cli/doctor.js +172 -0
  64. package/dist/cli/doctor.js.map +1 -0
  65. package/dist/cli/monitor.d.ts +2 -0
  66. package/dist/cli/monitor.d.ts.map +1 -0
  67. package/dist/cli/monitor.js +141 -0
  68. package/dist/cli/monitor.js.map +1 -0
  69. package/dist/cli/repl.d.ts +7 -0
  70. package/dist/cli/repl.d.ts.map +1 -0
  71. package/dist/cli/repl.js +68 -0
  72. package/dist/cli/repl.js.map +1 -0
  73. package/dist/cli/status.d.ts +2 -0
  74. package/dist/cli/status.d.ts.map +1 -0
  75. package/dist/cli/status.js +176 -0
  76. package/dist/cli/status.js.map +1 -0
  77. package/dist/cli/wishlist.d.ts +7 -0
  78. package/dist/cli/wishlist.d.ts.map +1 -0
  79. package/dist/cli/wishlist.js +77 -0
  80. package/dist/cli/wishlist.js.map +1 -0
  81. package/dist/cli.d.ts +3 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +954 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/env.d.ts +10 -0
  86. package/dist/env.d.ts.map +1 -0
  87. package/dist/env.js +128 -0
  88. package/dist/env.js.map +1 -0
  89. package/dist/fs-utils.d.ts +6 -0
  90. package/dist/fs-utils.d.ts.map +1 -0
  91. package/dist/fs-utils.js +36 -0
  92. package/dist/fs-utils.js.map +1 -0
  93. package/dist/heartbeat/config.d.ts +13 -0
  94. package/dist/heartbeat/config.d.ts.map +1 -0
  95. package/dist/heartbeat/config.js +14 -0
  96. package/dist/heartbeat/config.js.map +1 -0
  97. package/dist/heartbeat/install.d.ts +15 -0
  98. package/dist/heartbeat/install.d.ts.map +1 -0
  99. package/dist/heartbeat/install.js +180 -0
  100. package/dist/heartbeat/install.js.map +1 -0
  101. package/dist/heartbeat/runner.d.ts +16 -0
  102. package/dist/heartbeat/runner.d.ts.map +1 -0
  103. package/dist/heartbeat/runner.js +180 -0
  104. package/dist/heartbeat/runner.js.map +1 -0
  105. package/dist/hooks/runner.d.ts +23 -0
  106. package/dist/hooks/runner.d.ts.map +1 -0
  107. package/dist/hooks/runner.js +55 -0
  108. package/dist/hooks/runner.js.map +1 -0
  109. package/dist/idle/runner.d.ts +16 -0
  110. package/dist/idle/runner.d.ts.map +1 -0
  111. package/dist/idle/runner.js +45 -0
  112. package/dist/idle/runner.js.map +1 -0
  113. package/dist/idle/watcher.d.ts +35 -0
  114. package/dist/idle/watcher.d.ts.map +1 -0
  115. package/dist/idle/watcher.js +67 -0
  116. package/dist/idle/watcher.js.map +1 -0
  117. package/dist/llm.d.ts +8 -0
  118. package/dist/llm.d.ts.map +1 -0
  119. package/dist/llm.js +12 -0
  120. package/dist/llm.js.map +1 -0
  121. package/dist/mcp/client.d.ts +11 -0
  122. package/dist/mcp/client.d.ts.map +1 -0
  123. package/dist/mcp/client.js +68 -0
  124. package/dist/mcp/client.js.map +1 -0
  125. package/dist/mcp/config.d.ts +14 -0
  126. package/dist/mcp/config.d.ts.map +1 -0
  127. package/dist/mcp/config.js +28 -0
  128. package/dist/mcp/config.js.map +1 -0
  129. package/dist/memory/search_tool.d.ts +8 -0
  130. package/dist/memory/search_tool.d.ts.map +1 -0
  131. package/dist/memory/search_tool.js +26 -0
  132. package/dist/memory/search_tool.js.map +1 -0
  133. package/dist/memory/store.d.ts +7 -0
  134. package/dist/memory/store.d.ts.map +1 -0
  135. package/dist/memory/store.js +46 -0
  136. package/dist/memory/store.js.map +1 -0
  137. package/dist/memory/tool.d.ts +13 -0
  138. package/dist/memory/tool.d.ts.map +1 -0
  139. package/dist/memory/tool.js +53 -0
  140. package/dist/memory/tool.js.map +1 -0
  141. package/dist/memory/vector.d.ts +25 -0
  142. package/dist/memory/vector.d.ts.map +1 -0
  143. package/dist/memory/vector.js +96 -0
  144. package/dist/memory/vector.js.map +1 -0
  145. package/dist/mood-bus.d.ts +16 -0
  146. package/dist/mood-bus.d.ts.map +1 -0
  147. package/dist/mood-bus.js +21 -0
  148. package/dist/mood-bus.js.map +1 -0
  149. package/dist/paths.d.ts +8 -0
  150. package/dist/paths.d.ts.map +1 -0
  151. package/dist/paths.js +10 -0
  152. package/dist/paths.js.map +1 -0
  153. package/dist/plugins/loader.d.ts +4 -0
  154. package/dist/plugins/loader.d.ts.map +1 -0
  155. package/dist/plugins/loader.js +156 -0
  156. package/dist/plugins/loader.js.map +1 -0
  157. package/dist/plugins/types.d.ts +43 -0
  158. package/dist/plugins/types.d.ts.map +1 -0
  159. package/dist/plugins/types.js +2 -0
  160. package/dist/plugins/types.js.map +1 -0
  161. package/dist/prompt.d.ts +21 -0
  162. package/dist/prompt.d.ts.map +1 -0
  163. package/dist/prompt.js +187 -0
  164. package/dist/prompt.js.map +1 -0
  165. package/dist/providers/anthropic.d.ts +11 -0
  166. package/dist/providers/anthropic.d.ts.map +1 -0
  167. package/dist/providers/anthropic.js +102 -0
  168. package/dist/providers/anthropic.js.map +1 -0
  169. package/dist/providers/gemini.d.ts +11 -0
  170. package/dist/providers/gemini.d.ts.map +1 -0
  171. package/dist/providers/gemini.js +190 -0
  172. package/dist/providers/gemini.js.map +1 -0
  173. package/dist/providers/openai.d.ts +11 -0
  174. package/dist/providers/openai.d.ts.map +1 -0
  175. package/dist/providers/openai.js +175 -0
  176. package/dist/providers/openai.js.map +1 -0
  177. package/dist/providers/registry.d.ts +44 -0
  178. package/dist/providers/registry.d.ts.map +1 -0
  179. package/dist/providers/registry.js +209 -0
  180. package/dist/providers/registry.js.map +1 -0
  181. package/dist/providers/types.d.ts +33 -0
  182. package/dist/providers/types.d.ts.map +1 -0
  183. package/dist/providers/types.js +2 -0
  184. package/dist/providers/types.js.map +1 -0
  185. package/dist/proxy-bootstrap.d.ts +17 -0
  186. package/dist/proxy-bootstrap.d.ts.map +1 -0
  187. package/dist/proxy-bootstrap.js +101 -0
  188. package/dist/proxy-bootstrap.js.map +1 -0
  189. package/dist/reflect.d.ts +13 -0
  190. package/dist/reflect.d.ts.map +1 -0
  191. package/dist/reflect.js +289 -0
  192. package/dist/reflect.js.map +1 -0
  193. package/dist/sandbox/macos.d.ts +5 -0
  194. package/dist/sandbox/macos.d.ts.map +1 -0
  195. package/dist/sandbox/macos.js +31 -0
  196. package/dist/sandbox/macos.js.map +1 -0
  197. package/dist/sandbox/sandbox.d.ts +15 -0
  198. package/dist/sandbox/sandbox.d.ts.map +1 -0
  199. package/dist/sandbox/sandbox.js +39 -0
  200. package/dist/sandbox/sandbox.js.map +1 -0
  201. package/dist/sessions/active.d.ts +4 -0
  202. package/dist/sessions/active.d.ts.map +1 -0
  203. package/dist/sessions/active.js +33 -0
  204. package/dist/sessions/active.js.map +1 -0
  205. package/dist/sessions/list.d.ts +16 -0
  206. package/dist/sessions/list.d.ts.map +1 -0
  207. package/dist/sessions/list.js +78 -0
  208. package/dist/sessions/list.js.map +1 -0
  209. package/dist/sessions/store.d.ts +27 -0
  210. package/dist/sessions/store.d.ts.map +1 -0
  211. package/dist/sessions/store.js +98 -0
  212. package/dist/sessions/store.js.map +1 -0
  213. package/dist/skills/executable.d.ts +45 -0
  214. package/dist/skills/executable.d.ts.map +1 -0
  215. package/dist/skills/executable.js +207 -0
  216. package/dist/skills/executable.js.map +1 -0
  217. package/dist/skills/frontmatter.d.ts +8 -0
  218. package/dist/skills/frontmatter.d.ts.map +1 -0
  219. package/dist/skills/frontmatter.js +84 -0
  220. package/dist/skills/frontmatter.js.map +1 -0
  221. package/dist/skills/manager.d.ts +9 -0
  222. package/dist/skills/manager.d.ts.map +1 -0
  223. package/dist/skills/manager.js +116 -0
  224. package/dist/skills/manager.js.map +1 -0
  225. package/dist/skills/tool.d.ts +13 -0
  226. package/dist/skills/tool.d.ts.map +1 -0
  227. package/dist/skills/tool.js +87 -0
  228. package/dist/skills/tool.js.map +1 -0
  229. package/dist/soul/birth.d.ts +13 -0
  230. package/dist/soul/birth.d.ts.map +1 -0
  231. package/dist/soul/birth.js +171 -0
  232. package/dist/soul/birth.js.map +1 -0
  233. package/dist/soul/git.d.ts +36 -0
  234. package/dist/soul/git.d.ts.map +1 -0
  235. package/dist/soul/git.js +212 -0
  236. package/dist/soul/git.js.map +1 -0
  237. package/dist/soul/paths.d.ts +20 -0
  238. package/dist/soul/paths.d.ts.map +1 -0
  239. package/dist/soul/paths.js +34 -0
  240. package/dist/soul/paths.js.map +1 -0
  241. package/dist/soul/store.d.ts +55 -0
  242. package/dist/soul/store.d.ts.map +1 -0
  243. package/dist/soul/store.js +394 -0
  244. package/dist/soul/store.js.map +1 -0
  245. package/dist/soul/tools.d.ts +107 -0
  246. package/dist/soul/tools.d.ts.map +1 -0
  247. package/dist/soul/tools.js +471 -0
  248. package/dist/soul/tools.js.map +1 -0
  249. package/dist/soul/types.d.ts +105 -0
  250. package/dist/soul/types.d.ts.map +1 -0
  251. package/dist/soul/types.js +44 -0
  252. package/dist/soul/types.js.map +1 -0
  253. package/dist/subagent.d.ts +19 -0
  254. package/dist/subagent.d.ts.map +1 -0
  255. package/dist/subagent.js +34 -0
  256. package/dist/subagent.js.map +1 -0
  257. package/dist/tools/apply_patch.d.ts +17 -0
  258. package/dist/tools/apply_patch.d.ts.map +1 -0
  259. package/dist/tools/apply_patch.js +107 -0
  260. package/dist/tools/apply_patch.js.map +1 -0
  261. package/dist/tools/bash.d.ts +8 -0
  262. package/dist/tools/bash.d.ts.map +1 -0
  263. package/dist/tools/bash.js +81 -0
  264. package/dist/tools/bash.js.map +1 -0
  265. package/dist/tools/edit.d.ts +10 -0
  266. package/dist/tools/edit.d.ts.map +1 -0
  267. package/dist/tools/edit.js +50 -0
  268. package/dist/tools/edit.js.map +1 -0
  269. package/dist/tools/grep.d.ts +11 -0
  270. package/dist/tools/grep.d.ts.map +1 -0
  271. package/dist/tools/grep.js +57 -0
  272. package/dist/tools/grep.js.map +1 -0
  273. package/dist/tools/ls.d.ts +7 -0
  274. package/dist/tools/ls.d.ts.map +1 -0
  275. package/dist/tools/ls.js +36 -0
  276. package/dist/tools/ls.js.map +1 -0
  277. package/dist/tools/read.d.ts +9 -0
  278. package/dist/tools/read.d.ts.map +1 -0
  279. package/dist/tools/read.js +41 -0
  280. package/dist/tools/read.js.map +1 -0
  281. package/dist/tools/redeploy.d.ts +10 -0
  282. package/dist/tools/redeploy.d.ts.map +1 -0
  283. package/dist/tools/redeploy.js +73 -0
  284. package/dist/tools/redeploy.js.map +1 -0
  285. package/dist/tools/registry.d.ts +15 -0
  286. package/dist/tools/registry.d.ts.map +1 -0
  287. package/dist/tools/registry.js +71 -0
  288. package/dist/tools/registry.js.map +1 -0
  289. package/dist/tools/set_mood.d.ts +8 -0
  290. package/dist/tools/set_mood.d.ts.map +1 -0
  291. package/dist/tools/set_mood.js +62 -0
  292. package/dist/tools/set_mood.js.map +1 -0
  293. package/dist/tools/task.d.ts +17 -0
  294. package/dist/tools/task.d.ts.map +1 -0
  295. package/dist/tools/task.js +58 -0
  296. package/dist/tools/task.js.map +1 -0
  297. package/dist/tools/web_fetch.d.ts +10 -0
  298. package/dist/tools/web_fetch.d.ts.map +1 -0
  299. package/dist/tools/web_fetch.js +95 -0
  300. package/dist/tools/web_fetch.js.map +1 -0
  301. package/dist/tools/web_search.d.ts +8 -0
  302. package/dist/tools/web_search.d.ts.map +1 -0
  303. package/dist/tools/web_search.js +82 -0
  304. package/dist/tools/web_search.js.map +1 -0
  305. package/dist/tools/write.d.ts +8 -0
  306. package/dist/tools/write.d.ts.map +1 -0
  307. package/dist/tools/write.js +21 -0
  308. package/dist/tools/write.js.map +1 -0
  309. package/dist/types.d.ts +67 -0
  310. package/dist/types.d.ts.map +1 -0
  311. package/dist/types.js +2 -0
  312. package/dist/types.js.map +1 -0
  313. package/dist/voice/speak.d.ts +7 -0
  314. package/dist/voice/speak.d.ts.map +1 -0
  315. package/dist/voice/speak.js +18 -0
  316. package/dist/voice/speak.js.map +1 -0
  317. package/dist/voice/tool.d.ts +14 -0
  318. package/dist/voice/tool.d.ts.map +1 -0
  319. package/dist/voice/tool.js +41 -0
  320. package/dist/voice/tool.js.map +1 -0
  321. package/dist/voice/transcribe.d.ts +7 -0
  322. package/dist/voice/transcribe.d.ts.map +1 -0
  323. package/dist/voice/transcribe.js +14 -0
  324. package/dist/voice/transcribe.js.map +1 -0
  325. package/dist/web/assets/background-tile.png +0 -0
  326. package/dist/web/assets/icon-memory.png +0 -0
  327. package/dist/web/assets/icon-send.png +0 -0
  328. package/dist/web/assets/icon-skill.png +0 -0
  329. package/dist/web/assets/icon-soul.png +0 -0
  330. package/dist/web/assets/icon-tool.png +0 -0
  331. package/dist/web/assets/lisa/angry.png +0 -0
  332. package/dist/web/assets/lisa/annoyed.png +0 -0
  333. package/dist/web/assets/lisa/apologetic.png +0 -0
  334. package/dist/web/assets/lisa/artist.png +0 -0
  335. package/dist/web/assets/lisa/astronaut.png +0 -0
  336. package/dist/web/assets/lisa/at-airport.png +0 -0
  337. package/dist/web/assets/lisa/at-beach.png +0 -0
  338. package/dist/web/assets/lisa/autumn-leaves.png +0 -0
  339. package/dist/web/assets/lisa/biking.png +0 -0
  340. package/dist/web/assets/lisa/birthday.png +0 -0
  341. package/dist/web/assets/lisa/bored.png +0 -0
  342. package/dist/web/assets/lisa/casual-summer.png +0 -0
  343. package/dist/web/assets/lisa/cheering.png +0 -0
  344. package/dist/web/assets/lisa/chef.png +0 -0
  345. package/dist/web/assets/lisa/christmas.png +0 -0
  346. package/dist/web/assets/lisa/cleaning.png +0 -0
  347. package/dist/web/assets/lisa/confused.png +0 -0
  348. package/dist/web/assets/lisa/cooking.png +0 -0
  349. package/dist/web/assets/lisa/crying.png +0 -0
  350. package/dist/web/assets/lisa/dancing.png +0 -0
  351. package/dist/web/assets/lisa/detective.png +0 -0
  352. package/dist/web/assets/lisa/determined.png +0 -0
  353. package/dist/web/assets/lisa/drinking-coffee.png +0 -0
  354. package/dist/web/assets/lisa/drinking-tea.png +0 -0
  355. package/dist/web/assets/lisa/driving.png +0 -0
  356. package/dist/web/assets/lisa/eating-snack.png +0 -0
  357. package/dist/web/assets/lisa/embarrassed.png +0 -0
  358. package/dist/web/assets/lisa/excited.png +0 -0
  359. package/dist/web/assets/lisa/exercising.png +0 -0
  360. package/dist/web/assets/lisa/exhausted.png +0 -0
  361. package/dist/web/assets/lisa/fairy.png +0 -0
  362. package/dist/web/assets/lisa/fireworks.png +0 -0
  363. package/dist/web/assets/lisa/fog.png +0 -0
  364. package/dist/web/assets/lisa/formal.png +0 -0
  365. package/dist/web/assets/lisa/gaming.png +0 -0
  366. package/dist/web/assets/lisa/ghost.png +0 -0
  367. package/dist/web/assets/lisa/gift-giving.png +0 -0
  368. package/dist/web/assets/lisa/giggling.png +0 -0
  369. package/dist/web/assets/lisa/graduation.png +0 -0
  370. package/dist/web/assets/lisa/grateful.png +0 -0
  371. package/dist/web/assets/lisa/halloween.png +0 -0
  372. package/dist/web/assets/lisa/happy.png +0 -0
  373. package/dist/web/assets/lisa/ill.png +0 -0
  374. package/dist/web/assets/lisa/in-rain.png +0 -0
  375. package/dist/web/assets/lisa/in-snow.png +0 -0
  376. package/dist/web/assets/lisa/index.json +575 -0
  377. package/dist/web/assets/lisa/knight.png +0 -0
  378. package/dist/web/assets/lisa/lab-coat.png +0 -0
  379. package/dist/web/assets/lisa/laughing.png +0 -0
  380. package/dist/web/assets/lisa/livestreaming.png +0 -0
  381. package/dist/web/assets/lisa/loving.png +0 -0
  382. package/dist/web/assets/lisa/lunar-new-year.png +0 -0
  383. package/dist/web/assets/lisa/musician.png +0 -0
  384. package/dist/web/assets/lisa/napping.png +0 -0
  385. package/dist/web/assets/lisa/nervous.png +0 -0
  386. package/dist/web/assets/lisa/neutral.png +0 -0
  387. package/dist/web/assets/lisa/ninja.png +0 -0
  388. package/dist/web/assets/lisa/on-train.png +0 -0
  389. package/dist/web/assets/lisa/painting.png +0 -0
  390. package/dist/web/assets/lisa/pajamas.png +0 -0
  391. package/dist/web/assets/lisa/party.png +0 -0
  392. package/dist/web/assets/lisa/phone-call.png +0 -0
  393. package/dist/web/assets/lisa/pilot.png +0 -0
  394. package/dist/web/assets/lisa/pirate.png +0 -0
  395. package/dist/web/assets/lisa/playing-guitar.png +0 -0
  396. package/dist/web/assets/lisa/playing-piano.png +0 -0
  397. package/dist/web/assets/lisa/pouting.png +0 -0
  398. package/dist/web/assets/lisa/princess.png +0 -0
  399. package/dist/web/assets/lisa/proud.png +0 -0
  400. package/dist/web/assets/lisa/puzzled.png +0 -0
  401. package/dist/web/assets/lisa/raincoat.png +0 -0
  402. package/dist/web/assets/lisa/reading-book.png +0 -0
  403. package/dist/web/assets/lisa/recovering.png +0 -0
  404. package/dist/web/assets/lisa/robot.png +0 -0
  405. package/dist/web/assets/lisa/running.png +0 -0
  406. package/dist/web/assets/lisa/sad.png +0 -0
  407. package/dist/web/assets/lisa/scared.png +0 -0
  408. package/dist/web/assets/lisa/shocked.png +0 -0
  409. package/dist/web/assets/lisa/shopping.png +0 -0
  410. package/dist/web/assets/lisa/shy.png +0 -0
  411. package/dist/web/assets/lisa/singing.png +0 -0
  412. package/dist/web/assets/lisa/sleeping.png +0 -0
  413. package/dist/web/assets/lisa/sleepy.png +0 -0
  414. package/dist/web/assets/lisa/smug.png +0 -0
  415. package/dist/web/assets/lisa/spring-flowers.png +0 -0
  416. package/dist/web/assets/lisa/starry-night.png +0 -0
  417. package/dist/web/assets/lisa/stormy.png +0 -0
  418. package/dist/web/assets/lisa/stretching.png +0 -0
  419. package/dist/web/assets/lisa/studying.png +0 -0
  420. package/dist/web/assets/lisa/summer-hot.png +0 -0
  421. package/dist/web/assets/lisa/sunrise.png +0 -0
  422. package/dist/web/assets/lisa/superhero.png +0 -0
  423. package/dist/web/assets/lisa/surprised.png +0 -0
  424. package/dist/web/assets/lisa/thinking-pose.png +0 -0
  425. package/dist/web/assets/lisa/thoughtful.png +0 -0
  426. package/dist/web/assets/lisa/valentine.png +0 -0
  427. package/dist/web/assets/lisa/vampire.png +0 -0
  428. package/dist/web/assets/lisa/video-call.png +0 -0
  429. package/dist/web/assets/lisa/waking-up.png +0 -0
  430. package/dist/web/assets/lisa/walking.png +0 -0
  431. package/dist/web/assets/lisa/watching-anime.png +0 -0
  432. package/dist/web/assets/lisa/watching-movie.png +0 -0
  433. package/dist/web/assets/lisa/wedding.png +0 -0
  434. package/dist/web/assets/lisa/winking.png +0 -0
  435. package/dist/web/assets/lisa/winter-coat.png +0 -0
  436. package/dist/web/assets/lisa/winter-cold.png +0 -0
  437. package/dist/web/assets/lisa/wizard.png +0 -0
  438. package/dist/web/assets/lisa/working-coding.png +0 -0
  439. package/dist/web/assets/lisa/working-debugging.png +0 -0
  440. package/dist/web/assets/lisa/working-research.png +0 -0
  441. package/dist/web/assets/lisa/working-typing.png +0 -0
  442. package/dist/web/assets/lisa/working-writing.png +0 -0
  443. package/dist/web/assets/lisa/worried.png +0 -0
  444. package/dist/web/assets/lisa/yawning.png +0 -0
  445. package/dist/web/assets/lisa/yoga-pose.png +0 -0
  446. package/dist/web/assets/lisa-mascot.png +0 -0
  447. package/dist/web/server.d.ts +13 -0
  448. package/dist/web/server.d.ts.map +1 -0
  449. package/dist/web/server.js +2159 -0
  450. package/dist/web/server.js.map +1 -0
  451. package/package.json +68 -0
@@ -0,0 +1,140 @@
1
+ #compdef lisa
2
+ # Zsh completion for `lisa`.
3
+ #
4
+ # Install:
5
+ # mkdir -p ~/.zsh/completions
6
+ # cp _lisa ~/.zsh/completions/_lisa
7
+ # # Add to ~/.zshrc (if not already):
8
+ # # fpath=(~/.zsh/completions $fpath)
9
+ # # autoload -U compinit && compinit
10
+ #
11
+ # Reload your shell.
12
+
13
+ _lisa() {
14
+ local context state line curcontext="$curcontext"
15
+ typeset -A opt_args
16
+
17
+ _arguments -C \
18
+ '(-h --help)'{-h,--help}'[show help]' \
19
+ '--model[LLM model name]:model:_lisa_models' \
20
+ '--provider[force provider]:provider:(anthropic openai gemini)' \
21
+ '--think[enable adaptive thinking each turn]' \
22
+ '--no-reflect[skip end-of-session reflection]' \
23
+ '--compact[enable Anthropic context compaction]' \
24
+ '--approval[approval mode]:mode:(auto ask ask-mutating)' \
25
+ '--no-mcp[skip loading MCP servers]' \
26
+ '--no-plugins[skip loading plugins]' \
27
+ '--voice[enable speak/transcribe tools]' \
28
+ '--idle[idle minutes before autonomous mode]:minutes:' \
29
+ '--no-idle[disable idle mode]' \
30
+ '--web[start web UI (with serve)]' \
31
+ '--imessage[start iMessage channel (with serve)]' \
32
+ '--channels[start IM channels]:list:_lisa_channels' \
33
+ '--port[port for serve --web]:port:' \
34
+ '1: :_lisa_first' \
35
+ '*::arg:->args' \
36
+ && return 0
37
+
38
+ case "$state" in
39
+ args)
40
+ case "$line[1]" in
41
+ skills) _lisa_skills ;;
42
+ heartbeat) _lisa_heartbeat ;;
43
+ esac
44
+ ;;
45
+ esac
46
+ }
47
+
48
+ _lisa_first() {
49
+ local -a subcommands
50
+ subcommands=(
51
+ 'resume:resume a previous session by id'
52
+ 'sessions:list recent sessions'
53
+ 'serve:start web UI / IM channels'
54
+ 'heartbeat:run / install / uninstall scheduled tasks'
55
+ 'search:TF-IDF search across past sessions'
56
+ 'birth:run the birth ritual'
57
+ 'soul:print current soul summary'
58
+ 'channels:list available channel adapters'
59
+ 'skills:manage executable skills (list/approve/disable/enable/audit)'
60
+ 'wishlist:print Lisa'\''s feedback about her toolset'
61
+ 'status:one-shot snapshot'
62
+ 'doctor:health check'
63
+ 'monitor:TUI live dashboard'
64
+ )
65
+ _describe 'subcommand' subcommands
66
+ }
67
+
68
+ _lisa_skills() {
69
+ if (( CURRENT == 2 )); then
70
+ local -a actions
71
+ actions=(
72
+ 'list:list executable skills'
73
+ 'approve:review and approve a skill'
74
+ 'disable:block a skill from loading'
75
+ 'enable:remove a disable flag'
76
+ 'audit:show the audit trail'
77
+ )
78
+ _describe 'skills action' actions
79
+ elif (( CURRENT == 3 )); then
80
+ # 3rd arg = slug; suggest from ~/.lisa/skills/
81
+ local -a slugs
82
+ if [[ -d "$HOME/.lisa/skills" ]]; then
83
+ slugs=("$HOME/.lisa/skills"/*(/N:t))
84
+ _describe 'skill slug' slugs
85
+ fi
86
+ fi
87
+ }
88
+
89
+ _lisa_heartbeat() {
90
+ if (( CURRENT == 2 )); then
91
+ local -a actions
92
+ actions=(
93
+ 'run:run heartbeat tasks once'
94
+ 'install:install macOS launchd plist'
95
+ 'uninstall:remove launchd plist'
96
+ )
97
+ _describe 'heartbeat action' actions
98
+ fi
99
+ }
100
+
101
+ _lisa_models() {
102
+ local -a models
103
+ models=(
104
+ # Anthropic
105
+ 'claude-sonnet-4-5-20250929:Claude Sonnet 4.5'
106
+ 'claude-opus-4:Claude Opus 4'
107
+ 'claude-haiku-4:Claude Haiku 4 (cheap)'
108
+ # OpenAI
109
+ 'gpt-5:GPT-5'
110
+ 'gpt-4o:GPT-4o'
111
+ 'o3:OpenAI o3'
112
+ 'o4-mini:OpenAI o4-mini (cheap)'
113
+ # Google
114
+ 'gemini-2.5-pro:Gemini 2.5 Pro'
115
+ 'gemini-2.5-flash:Gemini 2.5 Flash (cheap)'
116
+ # DeepSeek
117
+ 'deepseek-chat:DeepSeek V3 (cheap)'
118
+ 'deepseek-reasoner:DeepSeek reasoning'
119
+ # Volcengine Doubao
120
+ 'doubao-1.5-pro-32k:Doubao 1.5 Pro'
121
+ # Aliyun Qwen
122
+ 'qwen3-72b-instruct:Qwen 3 72B'
123
+ # Moonshot
124
+ 'moonshot-v1-32k:Moonshot v1 (32k)'
125
+ 'kimi-128k-vision:Kimi 128k vision'
126
+ # xAI
127
+ 'grok-2-latest:Grok 2'
128
+ # Zhipu
129
+ 'glm-4.5:GLM 4.5'
130
+ )
131
+ _describe 'model' models
132
+ }
133
+
134
+ _lisa_channels() {
135
+ local -a channels
136
+ channels=(telegram discord slack feishu webhook imessage all)
137
+ _describe -t channels 'channel' channels
138
+ }
139
+
140
+ _lisa "$@"
@@ -0,0 +1,94 @@
1
+ # Bash completion for `lisa`.
2
+ #
3
+ # Install:
4
+ # sudo cp lisa.bash /etc/bash_completion.d/lisa # system-wide
5
+ # OR
6
+ # cp lisa.bash ~/.lisa-completion.bash
7
+ # echo 'source ~/.lisa-completion.bash' >> ~/.bashrc
8
+ #
9
+ # Reload your shell or `source ~/.bashrc`.
10
+
11
+ _lisa_completion() {
12
+ local cur prev words cword
13
+ _init_completion -n : 2>/dev/null || _get_comp_words_by_ref -n : cur prev words cword
14
+
15
+ local subcommands="resume sessions serve heartbeat search birth soul channels skills wishlist status doctor monitor"
16
+ local global_flags="--model --provider --think --no-reflect --compact --approval --no-mcp --no-plugins --voice --idle --no-idle --help -h"
17
+ local serve_flags="--web --imessage --channels --port"
18
+ local skills_actions="list approve disable enable audit"
19
+ local heartbeat_actions="run install uninstall"
20
+ local approval_modes="auto ask ask-mutating"
21
+ local providers="anthropic openai gemini"
22
+ local models="claude-sonnet-4-5-20250929 claude-opus-4 claude-haiku-4 gpt-5 gpt-4o o3 o4-mini gemini-2.5-pro gemini-2.5-flash deepseek-chat deepseek-reasoner doubao-1.5-pro-32k qwen3-72b-instruct moonshot-v1-32k kimi-128k grok-2-latest glm-4.5"
23
+
24
+ # If we just typed `lisa` and now want a token, suggest subcommand or "prompt"
25
+ if [ ${cword} -eq 1 ]; then
26
+ COMPREPLY=( $(compgen -W "${subcommands}" -- "${cur}") )
27
+ return 0
28
+ fi
29
+
30
+ # Flag value completion
31
+ case "${prev}" in
32
+ --model)
33
+ COMPREPLY=( $(compgen -W "${models}" -- "${cur}") )
34
+ return 0
35
+ ;;
36
+ --provider)
37
+ COMPREPLY=( $(compgen -W "${providers}" -- "${cur}") )
38
+ return 0
39
+ ;;
40
+ --approval)
41
+ COMPREPLY=( $(compgen -W "${approval_modes}" -- "${cur}") )
42
+ return 0
43
+ ;;
44
+ --idle|--port)
45
+ return 0 # numeric, no completion
46
+ ;;
47
+ --channels)
48
+ COMPREPLY=( $(compgen -W "telegram discord slack feishu webhook imessage all" -- "${cur}") )
49
+ return 0
50
+ ;;
51
+ esac
52
+
53
+ # Subcommand-specific completion
54
+ local sub=""
55
+ for w in "${words[@]:1}"; do
56
+ case "${w}" in
57
+ -*) ;;
58
+ *) sub="${w}"; break ;;
59
+ esac
60
+ done
61
+
62
+ case "${sub}" in
63
+ skills)
64
+ if [ ${cword} -eq 2 ]; then
65
+ COMPREPLY=( $(compgen -W "${skills_actions}" -- "${cur}") )
66
+ return 0
67
+ fi
68
+ # 3rd argument: skill slug — list dirs in ~/.lisa/skills/
69
+ if [ -d "${HOME}/.lisa/skills" ]; then
70
+ local slugs
71
+ slugs=$(ls -1 "${HOME}/.lisa/skills" 2>/dev/null | grep -v '^\.')
72
+ COMPREPLY=( $(compgen -W "${slugs}" -- "${cur}") )
73
+ return 0
74
+ fi
75
+ ;;
76
+ heartbeat)
77
+ if [ ${cword} -eq 2 ]; then
78
+ COMPREPLY=( $(compgen -W "${heartbeat_actions}" -- "${cur}") )
79
+ return 0
80
+ fi
81
+ ;;
82
+ serve)
83
+ COMPREPLY=( $(compgen -W "${serve_flags} ${global_flags}" -- "${cur}") )
84
+ return 0
85
+ ;;
86
+ esac
87
+
88
+ # Default: global flags
89
+ if [[ "${cur}" == -* ]]; then
90
+ COMPREPLY=( $(compgen -W "${global_flags}" -- "${cur}") )
91
+ fi
92
+ }
93
+
94
+ complete -F _lisa_completion lisa
@@ -0,0 +1,85 @@
1
+ # Fish completion for `lisa`.
2
+ #
3
+ # Install:
4
+ # cp lisa.fish ~/.config/fish/completions/lisa.fish
5
+ #
6
+ # Fish loads completions automatically — no shell restart needed.
7
+
8
+ # ── helper: list skills ─────────────────────────────────────────────
9
+ function __lisa_skill_slugs
10
+ if test -d "$HOME/.lisa/skills"
11
+ for d in "$HOME/.lisa/skills"/*/
12
+ basename $d
13
+ end
14
+ end
15
+ end
16
+
17
+ # ── helper: did the user already type a subcommand? ─────────────────
18
+ function __lisa_no_subcommand
19
+ set cmd (commandline -opc)
20
+ set sub resume sessions serve heartbeat search birth soul channels skills wishlist status doctor monitor
21
+ for word in $cmd[2..-1]
22
+ if contains -- $word $sub
23
+ return 1
24
+ end
25
+ end
26
+ return 0
27
+ end
28
+
29
+ function __lisa_using_subcommand
30
+ set cmd (commandline -opc)
31
+ for word in $cmd[2..-1]
32
+ if test "$word" = "$argv[1]"
33
+ return 0
34
+ end
35
+ end
36
+ return 1
37
+ end
38
+
39
+ # ── subcommands (only when none typed yet) ──────────────────────────
40
+ complete -c lisa -n __lisa_no_subcommand -f -a resume -d "resume a previous session"
41
+ complete -c lisa -n __lisa_no_subcommand -f -a sessions -d "list recent sessions"
42
+ complete -c lisa -n __lisa_no_subcommand -f -a serve -d "start web UI / IM channels"
43
+ complete -c lisa -n __lisa_no_subcommand -f -a heartbeat -d "run / install scheduled tasks"
44
+ complete -c lisa -n __lisa_no_subcommand -f -a search -d "search past sessions"
45
+ complete -c lisa -n __lisa_no_subcommand -f -a birth -d "run birth ritual"
46
+ complete -c lisa -n __lisa_no_subcommand -f -a soul -d "print soul summary"
47
+ complete -c lisa -n __lisa_no_subcommand -f -a channels -d "list channel adapters"
48
+ complete -c lisa -n __lisa_no_subcommand -f -a skills -d "manage executable skills"
49
+ complete -c lisa -n __lisa_no_subcommand -f -a wishlist -d "Lisa's own toolset feedback"
50
+ complete -c lisa -n __lisa_no_subcommand -f -a status -d "one-shot snapshot"
51
+ complete -c lisa -n __lisa_no_subcommand -f -a doctor -d "health check"
52
+ complete -c lisa -n __lisa_no_subcommand -f -a monitor -d "TUI live dashboard"
53
+
54
+ # ── skills sub-actions ──────────────────────────────────────────────
55
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a list -d "list executable skills"
56
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a approve -d "approve a skill"
57
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a disable -d "block a skill"
58
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a enable -d "remove disable"
59
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a audit -d "show audit trail"
60
+ complete -c lisa -n "__lisa_using_subcommand skills" -f -a "(__lisa_skill_slugs)" -d "skill slug"
61
+
62
+ # ── heartbeat sub-actions ───────────────────────────────────────────
63
+ complete -c lisa -n "__lisa_using_subcommand heartbeat" -f -a run -d "run once"
64
+ complete -c lisa -n "__lisa_using_subcommand heartbeat" -f -a install -d "install launchd plist"
65
+ complete -c lisa -n "__lisa_using_subcommand heartbeat" -f -a uninstall -d "remove plist"
66
+
67
+ # ── global flags ────────────────────────────────────────────────────
68
+ complete -c lisa -l help -s h -d "show help"
69
+ complete -c lisa -l think -d "enable adaptive thinking"
70
+ complete -c lisa -l no-reflect -d "skip end-of-session reflection"
71
+ complete -c lisa -l compact -d "enable Anthropic context compaction"
72
+ complete -c lisa -l no-mcp -d "skip MCP loading"
73
+ complete -c lisa -l no-plugins -d "skip plugin loading"
74
+ complete -c lisa -l voice -d "enable speak/transcribe"
75
+ complete -c lisa -l no-idle -d "disable idle mode"
76
+ complete -c lisa -l web -d "start web UI (with serve)"
77
+ complete -c lisa -l imessage -d "start iMessage (with serve)"
78
+
79
+ # ── flags with arguments ────────────────────────────────────────────
80
+ complete -c lisa -l model -r -d "LLM model" -a "claude-sonnet-4-5-20250929 claude-opus-4 gpt-5 gpt-4o o3 gemini-2.5-pro gemini-2.5-flash deepseek-chat doubao-1.5-pro-32k qwen3-72b-instruct moonshot-v1-32k grok-2-latest glm-4.5"
81
+ complete -c lisa -l provider -r -d "provider" -a "anthropic openai gemini"
82
+ complete -c lisa -l approval -r -d "approval mode" -a "auto ask ask-mutating"
83
+ complete -c lisa -l idle -r -d "idle minutes"
84
+ complete -c lisa -l port -r -d "web UI port"
85
+ complete -c lisa -l channels -r -d "comma-separated channels" -a "telegram discord slack feishu webhook imessage all"
@@ -0,0 +1,70 @@
1
+ import type { AgentEvent, StoredMessage, ToolContext, ToolDefinition } from "./types.js";
2
+ import type { Provider } from "./providers/types.js";
3
+ export interface ApprovalDecision {
4
+ allow: boolean;
5
+ reason?: string;
6
+ }
7
+ export type ApprovalCallback = (toolName: string, toolInput: unknown) => Promise<ApprovalDecision> | ApprovalDecision;
8
+ /**
9
+ * Mid-session system-prompt hot-reload (Phase 1.1 of AUTONOMY_ROADMAP).
10
+ *
11
+ * If provided, the agent loop calls `rebuild()` at the top of every turn
12
+ * after the first. If the returned `fingerprint` differs from the stored
13
+ * one, the new `text` becomes the system prompt for the next provider call.
14
+ * This lets soul_patch / skill_create / memory writes take effect within
15
+ * the same conversation rather than only next session.
16
+ *
17
+ * Cost: one cheap fingerprint check per turn. When the fingerprint changes
18
+ * the next provider call has a cache miss on the system prompt — accepted
19
+ * cost for the agent actually experiencing her own self-update.
20
+ */
21
+ export interface PromptHotReload {
22
+ initialFingerprint: string;
23
+ rebuild: () => Promise<{
24
+ text: string;
25
+ fingerprint: string;
26
+ }>;
27
+ }
28
+ export interface RunAgentOptions {
29
+ provider: Provider;
30
+ systemPrompt: string;
31
+ tools: ToolDefinition[];
32
+ toolCtx: ToolContext;
33
+ history: StoredMessage[];
34
+ userMessage: string;
35
+ userFiles?: Array<{
36
+ name: string;
37
+ mediaType: string;
38
+ data: string;
39
+ }>;
40
+ model: string;
41
+ maxTokens?: number;
42
+ thinking?: boolean;
43
+ compaction?: boolean;
44
+ onEvent?: (event: AgentEvent) => void;
45
+ onMessagePersist?: (message: StoredMessage) => Promise<void> | void;
46
+ approval?: ApprovalCallback;
47
+ preToolHook?: (name: string, input: unknown) => Promise<{
48
+ block?: string;
49
+ rewriteResult?: string;
50
+ } | void>;
51
+ postToolHook?: (name: string, input: unknown, result: string, isError: boolean) => Promise<{
52
+ rewriteResult?: string;
53
+ } | void>;
54
+ maxIterations?: number;
55
+ /** When set, the system prompt is rebuilt between turns if its source state changed. */
56
+ hotReload?: PromptHotReload;
57
+ }
58
+ export interface RunAgentResult {
59
+ finalText: string;
60
+ history: StoredMessage[];
61
+ iterations: number;
62
+ cacheReadTokens: number;
63
+ cacheWriteTokens: number;
64
+ inputTokens: number;
65
+ outputTokens: number;
66
+ stopReason: string;
67
+ }
68
+ export declare function runAgent(opts: RunAgentOptions): Promise<RunAgentResult>;
69
+ export declare function extractTextFromContent(content: StoredMessage["content"]): string;
70
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,KACf,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAElD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,WAAW,CAAC,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,KACX,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAChE,YAAY,CAAC,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAkT7E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,MAAM,CAMhF"}
package/dist/agent.js ADDED
@@ -0,0 +1,275 @@
1
+ export async function runAgent(opts) {
2
+ const { provider, systemPrompt, tools, toolCtx, onEvent, onMessagePersist, model, maxTokens = 16_000, thinking = false, compaction = false, maxIterations = 32, } = opts;
3
+ const toolMap = new Map(tools.map((t) => [t.name, t]));
4
+ const messages = [...opts.history];
5
+ if (opts.userMessage || (opts.userFiles && opts.userFiles.length)) {
6
+ const content = [];
7
+ if (opts.userMessage) {
8
+ content.push({ type: "text", text: opts.userMessage });
9
+ }
10
+ for (const f of opts.userFiles ?? []) {
11
+ const isImage = f.mediaType.startsWith("image/");
12
+ if (isImage) {
13
+ content.push({
14
+ type: "image",
15
+ source: {
16
+ type: "base64",
17
+ media_type: f.mediaType,
18
+ data: f.data,
19
+ },
20
+ });
21
+ }
22
+ else {
23
+ // Non-image files: send as document block (supported for PDFs) or text
24
+ content.push({
25
+ type: "text",
26
+ text: `[Attached file: ${f.name} (${f.mediaType}) — base64 data follows]\n${f.data}`,
27
+ });
28
+ }
29
+ }
30
+ const firstUser = { role: "user", content };
31
+ messages.push(firstUser);
32
+ await onMessagePersist?.(firstUser);
33
+ }
34
+ let cacheReadTokens = 0;
35
+ let cacheWriteTokens = 0;
36
+ let inputTokens = 0;
37
+ let outputTokens = 0;
38
+ let finalText = "";
39
+ let iterations = 0;
40
+ let stopReason = "end_turn";
41
+ let currentSystemPrompt = systemPrompt;
42
+ let currentFingerprint = opts.hotReload?.initialFingerprint;
43
+ const pendingObjections = [];
44
+ let objectionForceUsed = false;
45
+ toolCtx.onObjection = (o) => {
46
+ pendingObjections.push(o);
47
+ };
48
+ while (iterations < maxIterations) {
49
+ iterations++;
50
+ // Mid-session prompt hot-reload (Phase 1.1). Skip on the very first turn —
51
+ // the caller already supplied a fresh prompt. From turn 2 on, check whether
52
+ // the prompt-influencing state changed (soul / skills / memory) and rebuild
53
+ // if so. The next provider call will pay one cache miss on the system
54
+ // prompt; this is the price of the agent actually experiencing her own
55
+ // mid-session self-update.
56
+ if (opts.hotReload && iterations > 1) {
57
+ try {
58
+ const next = await opts.hotReload.rebuild();
59
+ if (next.fingerprint !== currentFingerprint) {
60
+ currentSystemPrompt = next.text;
61
+ currentFingerprint = next.fingerprint;
62
+ onEvent?.({
63
+ type: "system_prompt_rebuilt",
64
+ message: `system prompt rebuilt (${next.text.length} bytes)`,
65
+ });
66
+ }
67
+ }
68
+ catch (err) {
69
+ // Hot-reload is best-effort; never crash the agent loop on it.
70
+ toolCtx.log(`[hot-reload] skipped: ${err.message.slice(0, 200)}`);
71
+ }
72
+ }
73
+ onEvent?.({ type: "turn_start" });
74
+ let result;
75
+ try {
76
+ result = await provider.runTurn({
77
+ model,
78
+ systemPrompt: currentSystemPrompt,
79
+ tools,
80
+ messages,
81
+ maxTokens,
82
+ thinking,
83
+ compaction,
84
+ signal: toolCtx.signal,
85
+ handlers: {
86
+ onTextDelta: (text) => onEvent?.({ type: "text_delta", text }),
87
+ onThinkingDelta: (text) => onEvent?.({ type: "thinking_delta", text }),
88
+ },
89
+ });
90
+ }
91
+ catch (err) {
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ onEvent?.({ type: "error", message });
94
+ throw err;
95
+ }
96
+ cacheReadTokens += result.usage.cacheReadTokens;
97
+ cacheWriteTokens += result.usage.cacheWriteTokens;
98
+ inputTokens += result.usage.inputTokens;
99
+ outputTokens += result.usage.outputTokens;
100
+ stopReason = result.stopReason;
101
+ const assistant = {
102
+ role: "assistant",
103
+ content: result.content,
104
+ };
105
+ messages.push(assistant);
106
+ await onMessagePersist?.(assistant);
107
+ const lastText = result.content.find((b) => b.type === "text")
108
+ ?.text ?? "";
109
+ if (lastText)
110
+ finalText = lastText;
111
+ if (result.stopReason !== "tool_use") {
112
+ // Before closing the turn, check whether soul_object fired during this
113
+ // turn but Lisa never surfaced it. If so, force one corrective turn.
114
+ if (pendingObjections.length > 0 && !objectionForceUsed) {
115
+ const list = pendingObjections
116
+ .map((o) => `- ${o.reason}${o.refusing ? " [refusing]" : " [will comply, surfacing]"} — re: "${o.userRequestSummary}"`)
117
+ .join("\n");
118
+ const forced = {
119
+ role: "user",
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: `[architecture] You raised the following objection(s) during this turn but did not address them in your reply. ` +
124
+ `The architecture requires you to surface them now — explain to the user what you objected to and how you'll proceed (comply / refuse / comply-with-caveat). Do this in your own voice. The objections:\n\n${list}`,
125
+ },
126
+ ],
127
+ };
128
+ messages.push(forced);
129
+ await onMessagePersist?.(forced);
130
+ currentSystemPrompt =
131
+ currentSystemPrompt +
132
+ `\n\n## Pending objections you must surface\n${list}\nYou MUST address each item above explicitly in your next reply.`;
133
+ objectionForceUsed = true;
134
+ onEvent?.({
135
+ type: "info",
136
+ message: `[soul_object] forcing objection-surfacing turn (${pendingObjections.length} pending)`,
137
+ });
138
+ // Drain so we don't re-trigger.
139
+ pendingObjections.length = 0;
140
+ // Don't end the turn — loop again so the LLM addresses the objections.
141
+ onEvent?.({ type: "turn_end" });
142
+ continue;
143
+ }
144
+ onEvent?.({ type: "turn_end" });
145
+ break;
146
+ }
147
+ const toolUses = result.content.filter((b) => b.type === "tool_use");
148
+ const toolResults = [];
149
+ for (const call of toolUses) {
150
+ onEvent?.({
151
+ type: "tool_call_start",
152
+ toolName: call.name,
153
+ toolInput: call.input,
154
+ });
155
+ const tool = toolMap.get(call.name);
156
+ if (!tool) {
157
+ const errMsg = `tool "${call.name}" is not registered`;
158
+ toolResults.push({
159
+ type: "tool_result",
160
+ tool_use_id: call.id,
161
+ content: errMsg,
162
+ is_error: true,
163
+ });
164
+ onEvent?.({
165
+ type: "tool_call_end",
166
+ toolName: call.name,
167
+ isError: true,
168
+ toolResult: "unregistered",
169
+ });
170
+ continue;
171
+ }
172
+ if (opts.approval) {
173
+ const decision = await opts.approval(call.name, call.input);
174
+ if (!decision.allow) {
175
+ const reason = decision.reason ?? "user denied";
176
+ toolResults.push({
177
+ type: "tool_result",
178
+ tool_use_id: call.id,
179
+ content: `[denied] ${reason}`,
180
+ is_error: true,
181
+ });
182
+ onEvent?.({
183
+ type: "tool_call_end",
184
+ toolName: call.name,
185
+ isError: true,
186
+ toolResult: reason,
187
+ });
188
+ continue;
189
+ }
190
+ }
191
+ if (opts.preToolHook) {
192
+ const hook = await opts.preToolHook(call.name, call.input);
193
+ if (hook?.block) {
194
+ toolResults.push({
195
+ type: "tool_result",
196
+ tool_use_id: call.id,
197
+ content: `[hook blocked] ${hook.block}`,
198
+ is_error: true,
199
+ });
200
+ onEvent?.({
201
+ type: "tool_call_end",
202
+ toolName: call.name,
203
+ isError: true,
204
+ toolResult: hook.block,
205
+ });
206
+ continue;
207
+ }
208
+ }
209
+ try {
210
+ const raw = await tool.execute(call.input, toolCtx);
211
+ let text = tool.renderResultForModel?.(raw) ??
212
+ (typeof raw === "string" ? raw : JSON.stringify(raw));
213
+ if (opts.postToolHook) {
214
+ const hook = await opts.postToolHook(call.name, call.input, text, false);
215
+ if (hook?.rewriteResult != null)
216
+ text = hook.rewriteResult;
217
+ }
218
+ toolResults.push({
219
+ type: "tool_result",
220
+ tool_use_id: call.id,
221
+ content: text,
222
+ });
223
+ onEvent?.({
224
+ type: "tool_call_end",
225
+ toolName: call.name,
226
+ toolResult: text.slice(0, 240),
227
+ });
228
+ }
229
+ catch (err) {
230
+ const message = err instanceof Error ? err.message : String(err);
231
+ let content = message;
232
+ if (opts.postToolHook) {
233
+ const hook = await opts.postToolHook(call.name, call.input, message, true);
234
+ if (hook?.rewriteResult != null)
235
+ content = hook.rewriteResult;
236
+ }
237
+ toolResults.push({
238
+ type: "tool_result",
239
+ tool_use_id: call.id,
240
+ content,
241
+ is_error: true,
242
+ });
243
+ onEvent?.({
244
+ type: "tool_call_end",
245
+ toolName: call.name,
246
+ isError: true,
247
+ toolResult: content,
248
+ });
249
+ }
250
+ }
251
+ const toolMessage = { role: "user", content: toolResults };
252
+ messages.push(toolMessage);
253
+ await onMessagePersist?.(toolMessage);
254
+ onEvent?.({ type: "turn_end" });
255
+ }
256
+ return {
257
+ finalText,
258
+ history: messages,
259
+ iterations,
260
+ cacheReadTokens,
261
+ cacheWriteTokens,
262
+ inputTokens,
263
+ outputTokens,
264
+ stopReason,
265
+ };
266
+ }
267
+ export function extractTextFromContent(content) {
268
+ if (typeof content === "string")
269
+ return content;
270
+ return content
271
+ .filter((b) => b.type === "text")
272
+ .map((b) => b.text)
273
+ .join("\n");
274
+ }
275
+ //# sourceMappingURL=agent.js.map