@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,73 @@
1
+ import { spawn } from "node:child_process";
2
+ /** Exit code the supervisor watches for to know "rebuild & restart". */
3
+ export const REDEPLOY_EXIT_CODE = 75;
4
+ export const redeployTool = {
5
+ name: "redeploy",
6
+ description: "Rebuild Lisa from her current source (`npm run build`) and restart the server. " +
7
+ "Use this AFTER editing your own files in src/ to make the changes live. " +
8
+ "Requires the supervisor wrapper (scripts/lisa-supervise.sh) — without it the server would just exit. " +
9
+ "Conversation history and memory survive: the same web session is auto-resumed after restart, " +
10
+ "and the browser's SSE reconnects on its own (no page reload needed).",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ message: {
15
+ type: "string",
16
+ description: "One-line note about what's being deployed (optional).",
17
+ },
18
+ build: {
19
+ type: "boolean",
20
+ description: "Run `npm run build` before restart. Default true.",
21
+ },
22
+ },
23
+ },
24
+ async execute(input, ctx) {
25
+ if (process.env.LISA_SUPERVISED !== "1") {
26
+ throw new Error("redeploy requires the supervisor. Restart Lisa with:\n ./scripts/lisa-supervise.sh\nor:\n bash scripts/lisa-supervise.sh\nThen this tool will work.");
27
+ }
28
+ const wantBuild = input.build !== false;
29
+ if (wantBuild) {
30
+ const result = await runBuild(ctx.cwd, ctx.signal);
31
+ if (result.code !== 0) {
32
+ return [
33
+ "BUILD FAILED — staying on current version. Source edits will not take effect until the build is fixed.",
34
+ `exit_code=${result.code}`,
35
+ result.stderr.length > 0 ? `--- stderr (tail) ---\n${tail(result.stderr, 3000)}` : "",
36
+ result.stdout.length > 0 ? `--- stdout (tail) ---\n${tail(result.stdout, 1500)}` : "",
37
+ ]
38
+ .filter(Boolean)
39
+ .join("\n");
40
+ }
41
+ }
42
+ const sessionId = process.env.LISA_SESSION_ID ?? "(unknown)";
43
+ const note = input.message ? `: ${input.message}` : "";
44
+ // Defer the exit so the tool result has a moment to flush back over SSE
45
+ // and the agent loop has a chance to wrap up cleanly.
46
+ setTimeout(() => process.exit(REDEPLOY_EXIT_CODE), 1500);
47
+ return [
48
+ `Redeploy initiated${note}.`,
49
+ wantBuild ? "Build: ok." : "Build: skipped.",
50
+ `Process will exit ${REDEPLOY_EXIT_CODE}; supervisor will relaunch with the rebuilt code.`,
51
+ `Active session ${sessionId} will be auto-resumed; browser SSE will reconnect on its own.`,
52
+ ].join(" ");
53
+ },
54
+ };
55
+ async function runBuild(cwd, signal) {
56
+ return await new Promise((resolve) => {
57
+ const child = spawn("npm", ["run", "build"], {
58
+ cwd,
59
+ env: process.env,
60
+ signal,
61
+ });
62
+ let stdout = "";
63
+ let stderr = "";
64
+ child.stdout.on("data", (b) => (stdout += b.toString("utf8")));
65
+ child.stderr.on("data", (b) => (stderr += b.toString("utf8")));
66
+ child.on("close", (code) => resolve({ code: code ?? 1, stdout, stderr }));
67
+ child.on("error", (err) => resolve({ code: 1, stdout, stderr: stderr || String(err) }));
68
+ });
69
+ }
70
+ function tail(s, n) {
71
+ return s.length > n ? s.slice(-n) : s;
72
+ }
73
+ //# sourceMappingURL=redeploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/tools/redeploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export interface ToolRegistryOptions {
3
+ includeVoice?: boolean;
4
+ /**
5
+ * Extra tools merged into the registry — typically the approved
6
+ * executable skills loaded from ~/.lisa/skills/<slug>/tool.js
7
+ * (Phase 3.1). Conflicts (same .name as a builtin) are dropped with
8
+ * a warning by the caller, not here.
9
+ */
10
+ extra?: ToolDefinition[];
11
+ }
12
+ export declare function buildToolRegistry(opts?: ToolRegistryOptions): ToolDefinition[];
13
+ export declare const READ_ONLY_TOOL_NAMES: Set<string>;
14
+ export declare function readOnlySubset(tools: ToolDefinition[]): ToolDefinition[];
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4BlD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CAuClF;AAED,eAAO,MAAM,oBAAoB,aAS/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
@@ -0,0 +1,71 @@
1
+ import { memoryTool } from "../memory/tool.js";
2
+ import { memorySearchTool } from "../memory/search_tool.js";
3
+ import { skillManageTool } from "../skills/tool.js";
4
+ import { desireCloseTool, desireProgressTool, soulDiffTool, soulFeelTool, soulHistoryTool, soulJournalTool, soulObjectTool, soulPatchTool, soulReadTool, } from "../soul/tools.js";
5
+ import { speakTool, transcribeTool } from "../voice/tool.js";
6
+ import { applyPatchTool } from "./apply_patch.js";
7
+ import { bashTool } from "./bash.js";
8
+ import { editTool } from "./edit.js";
9
+ import { grepTool } from "./grep.js";
10
+ import { lsTool } from "./ls.js";
11
+ import { readTool } from "./read.js";
12
+ import { redeployTool } from "./redeploy.js";
13
+ import { setMoodTool } from "./set_mood.js";
14
+ import { webFetchTool } from "./web_fetch.js";
15
+ import { webSearchTool } from "./web_search.js";
16
+ import { writeTool } from "./write.js";
17
+ export function buildToolRegistry(opts = {}) {
18
+ const tools = [
19
+ readTool,
20
+ writeTool,
21
+ editTool,
22
+ applyPatchTool,
23
+ bashTool,
24
+ grepTool,
25
+ lsTool,
26
+ skillManageTool,
27
+ memoryTool,
28
+ memorySearchTool,
29
+ setMoodTool,
30
+ soulPatchTool,
31
+ soulJournalTool,
32
+ soulReadTool,
33
+ soulFeelTool,
34
+ soulHistoryTool,
35
+ soulDiffTool,
36
+ soulObjectTool,
37
+ desireProgressTool,
38
+ desireCloseTool,
39
+ webFetchTool,
40
+ webSearchTool,
41
+ redeployTool,
42
+ ];
43
+ if (opts.includeVoice) {
44
+ tools.push(speakTool, transcribeTool);
45
+ }
46
+ if (opts.extra && opts.extra.length > 0) {
47
+ const seen = new Set(tools.map((t) => t.name));
48
+ for (const t of opts.extra) {
49
+ if (seen.has(t.name))
50
+ continue; // builtin wins; caller logged the conflict
51
+ tools.push(t);
52
+ seen.add(t.name);
53
+ }
54
+ }
55
+ tools.sort((a, b) => a.name.localeCompare(b.name));
56
+ return tools;
57
+ }
58
+ export const READ_ONLY_TOOL_NAMES = new Set([
59
+ "read",
60
+ "grep",
61
+ "ls",
62
+ "memory_search",
63
+ "soul_history",
64
+ "soul_diff",
65
+ "web_fetch",
66
+ "web_search",
67
+ ]);
68
+ export function readOnlySubset(tools) {
69
+ return tools.filter((t) => READ_ONLY_TOOL_NAMES.has(t.name));
70
+ }
71
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface SetMoodInput {
3
+ mood: string;
4
+ }
5
+ export declare function availableMoodSlugs(): Promise<string[]>;
6
+ export declare const setMoodTool: ToolDefinition<SetMoodInput, string>;
7
+ export {};
8
+ //# sourceMappingURL=set_mood.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set_mood.d.ts","sourceRoot":"","sources":["../../src/tools/set_mood.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAsBD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG5D;AAED,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,YAAY,EAAE,MAAM,CAmC5D,CAAC"}
@@ -0,0 +1,62 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { fileURLToPath } from "node:url";
4
+ import { moodBus } from "../mood-bus.js";
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ // Resolve relative to the built dist/ tree at runtime.
7
+ const MOODS_DIR = path.resolve(__dirname, "..", "web", "assets", "lisa");
8
+ let cached = null;
9
+ const CACHE_TTL_MS = 30_000;
10
+ async function loadAvailableSlugs() {
11
+ if (cached && Date.now() - cached.at < CACHE_TTL_MS)
12
+ return cached.slugs;
13
+ try {
14
+ const files = await fs.readdir(MOODS_DIR);
15
+ const slugs = new Set(files
16
+ .filter((f) => f.endsWith(".png"))
17
+ .map((f) => f.slice(0, -".png".length)));
18
+ cached = { at: Date.now(), slugs };
19
+ return slugs;
20
+ }
21
+ catch {
22
+ cached = { at: Date.now(), slugs: new Set() };
23
+ return cached.slugs;
24
+ }
25
+ }
26
+ export async function availableMoodSlugs() {
27
+ const set = await loadAvailableSlugs();
28
+ return Array.from(set).sort();
29
+ }
30
+ export const setMoodTool = {
31
+ name: "set_mood",
32
+ description: "Update Lisa's visible avatar to match her current mood/state. Call this " +
33
+ "near the START of a response when your mood or activity meaningfully " +
34
+ "shifts — e.g. about to run a destructive command (`scared`), focused " +
35
+ "coding work (`working-coding`), thanking the user (`grateful`), " +
36
+ "celebrating a win (`cheering`). Don't call it every turn — only when " +
37
+ "the avatar would actually change. The full catalog is in your system " +
38
+ "prompt; pick the closest match by slug.",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {
42
+ mood: {
43
+ type: "string",
44
+ description: "kebab-case mood slug from the catalog (e.g. happy, working-coding, sleepy).",
45
+ },
46
+ },
47
+ required: ["mood"],
48
+ },
49
+ async execute(input) {
50
+ const slugs = await loadAvailableSlugs();
51
+ const mood = input.mood.toLowerCase().trim();
52
+ if (!slugs.has(mood)) {
53
+ const fuzzy = Array.from(slugs)
54
+ .filter((s) => s.includes(mood) || mood.includes(s))
55
+ .slice(0, 5);
56
+ throw new Error(`unknown mood "${mood}". Closest: ${fuzzy.join(", ") || "(none)"}. Use one of the slugs from the catalog.`);
57
+ }
58
+ moodBus.set(mood);
59
+ return `mood→${mood}`;
60
+ },
61
+ };
62
+ //# sourceMappingURL=set_mood.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set_mood.js","sourceRoot":"","sources":["../../src/tools/set_mood.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface TaskInput {
3
+ description: string;
4
+ prompt: string;
5
+ type?: "explore" | "general";
6
+ model?: string;
7
+ }
8
+ export declare function createTaskTool(deps: {
9
+ fullToolset: () => ToolDefinition[];
10
+ readOnlyToolset: () => ToolDefinition[];
11
+ cwd: string;
12
+ signal: AbortSignal;
13
+ defaultModel: string;
14
+ }): ToolDefinition<TaskInput, string>;
15
+ export declare function readOnlyToolNames(): Set<string>;
16
+ export {};
17
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,SAAS;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,WAAW,EAAE,MAAM,cAAc,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,cAAc,EAAE,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAgDpC;AAED,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,CAAC,CAE/C"}
@@ -0,0 +1,58 @@
1
+ import { runSubagent } from "../subagent.js";
2
+ const EXPLORE_SYSTEM = `You are a focused exploration sub-agent spawned by Lisa to handle a single research task.
3
+ Use \`read\`, \`grep\`, \`ls\`, and \`bash\` (read-only commands) to investigate.
4
+ Do NOT write files, edit files, or run destructive commands.
5
+ Return a concise final report (under 400 words) summarizing findings with concrete paths and line numbers.`;
6
+ const GENERAL_SYSTEM = `You are a focused sub-agent spawned by Lisa to complete one well-scoped task.
7
+ You have the full Lisa toolset available. Be efficient: do the task, then report what you did.
8
+ Return a concise final summary.`;
9
+ export function createTaskTool(deps) {
10
+ return {
11
+ name: "task",
12
+ description: "Spawn a sub-agent to handle a self-contained task in its own context window. " +
13
+ "Use this for: exploring large codebases (`type: explore`), running multi-step research, " +
14
+ "or fanning out independent work in parallel. The sub-agent has the full toolset by default; " +
15
+ "with `type: explore` it gets only read-only tools (read/grep/ls/bash).\n" +
16
+ "Return value: the sub-agent's final summary text.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ description: {
21
+ type: "string",
22
+ description: "3-5 word label for the task (shown in the UI)",
23
+ },
24
+ prompt: {
25
+ type: "string",
26
+ description: "Self-contained instructions. The sub-agent has no memory of this conversation.",
27
+ },
28
+ type: {
29
+ type: "string",
30
+ enum: ["explore", "general"],
31
+ default: "general",
32
+ },
33
+ model: {
34
+ type: "string",
35
+ description: "Optional model override (e.g. claude-haiku-4-5 for speed)",
36
+ },
37
+ },
38
+ required: ["description", "prompt"],
39
+ },
40
+ async execute(input) {
41
+ const tools = input.type === "explore" ? deps.readOnlyToolset() : deps.fullToolset();
42
+ const system = input.type === "explore" ? EXPLORE_SYSTEM : GENERAL_SYSTEM;
43
+ const result = await runSubagent({
44
+ prompt: input.prompt,
45
+ systemPrompt: system,
46
+ tools,
47
+ cwd: deps.cwd,
48
+ signal: deps.signal,
49
+ model: input.model ?? deps.defaultModel,
50
+ });
51
+ return `[subagent: ${input.description} — ${result.toolCallCount} tool calls, ${result.outputTokens} tokens]\n${result.text}`;
52
+ },
53
+ };
54
+ }
55
+ export function readOnlyToolNames() {
56
+ return new Set(["read", "grep", "ls"]);
57
+ }
58
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,cAAc,GAAG;;;2GAGoF,CAAC;AAE5G,MAAM,cAAc,GAAG;;gCAES,CAAC;AAEjC,MAAM,UAAU,cAAc,CAAC,IAM9B;IACC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,+EAA+E;YAC/E,0FAA0F;YAC1F,8FAA8F;YAC9F,0EAA0E;YAC1E,mDAAmD;QACrD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;iBAC7D;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gFAAgF;iBAC9F;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;oBAC5B,OAAO,EAAE,SAAS;iBACnB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;SACpC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,MAAM,KAAK,GACT,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzE,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;gBAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,YAAY,EAAE,MAAM;gBACpB,KAAK;gBACL,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;aACxC,CAAC,CAAC;YACH,OAAO,cAAc,KAAK,CAAC,WAAW,MAAM,MAAM,CAAC,aAAa,gBAAgB,MAAM,CAAC,YAAY,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC;QAChI,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface WebFetchInput {
3
+ url: string;
4
+ format?: "text" | "raw";
5
+ max_chars?: number;
6
+ }
7
+ export declare const webFetchTool: ToolDefinition<WebFetchInput, string>;
8
+ export declare function htmlToText(html: string): string;
9
+ export {};
10
+ //# sourceMappingURL=web_fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web_fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,CAmD9D,CAAC;AAgBF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB/C"}
@@ -0,0 +1,95 @@
1
+ const DEFAULT_MAX = 32_000;
2
+ const HARD_MAX = 200_000;
3
+ export const webFetchTool = {
4
+ name: "web_fetch",
5
+ description: "Fetch a URL via HTTP(S) GET. Returns status, content-type, and body. " +
6
+ "By default HTML is converted to readable text (scripts, styles, tags stripped). " +
7
+ "Pass format='raw' to keep the original markup. Default 32KB cap, max 200KB. " +
8
+ "Refuses loopback and private/internal IP ranges to avoid SSRF.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ url: { type: "string", description: "Absolute http(s) URL" },
13
+ format: { type: "string", enum: ["text", "raw"] },
14
+ max_chars: { type: "integer", minimum: 100, maximum: HARD_MAX },
15
+ },
16
+ required: ["url"],
17
+ },
18
+ async execute(input, ctx) {
19
+ let parsed;
20
+ try {
21
+ parsed = new URL(input.url);
22
+ }
23
+ catch {
24
+ throw new Error(`bad URL: ${input.url}`);
25
+ }
26
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
27
+ throw new Error(`only http(s) URLs allowed (got ${parsed.protocol})`);
28
+ }
29
+ const host = parsed.hostname.toLowerCase();
30
+ if (isPrivateHost(host)) {
31
+ throw new Error(`refusing to fetch private/loopback host: ${host}`);
32
+ }
33
+ const max = Math.min(input.max_chars ?? DEFAULT_MAX, HARD_MAX);
34
+ const res = await fetch(input.url, {
35
+ signal: ctx.signal,
36
+ redirect: "follow",
37
+ headers: {
38
+ "user-agent": "Lisa/0.1 (web_fetch)",
39
+ accept: "text/html,application/xhtml+xml,application/json,text/plain,*/*;q=0.8",
40
+ },
41
+ });
42
+ const ct = res.headers.get("content-type") ?? "";
43
+ let body = await res.text();
44
+ if (input.format !== "raw" && /html|xml/i.test(ct)) {
45
+ body = htmlToText(body);
46
+ }
47
+ if (body.length > max) {
48
+ body = body.slice(0, max) + `\n\n[truncated at ${max} chars]`;
49
+ }
50
+ return `HTTP ${res.status} ${res.statusText} ${input.url}\ncontent-type: ${ct}\n\n${body}`;
51
+ },
52
+ };
53
+ function isPrivateHost(host) {
54
+ if (host === "localhost")
55
+ return true;
56
+ if (host === "::1" || host === "0:0:0:0:0:0:0:1")
57
+ return true;
58
+ if (/^127\./.test(host))
59
+ return true;
60
+ if (/^10\./.test(host))
61
+ return true;
62
+ if (/^192\.168\./.test(host))
63
+ return true;
64
+ if (/^169\.254\./.test(host))
65
+ return true;
66
+ if (/^172\.(1[6-9]|2[0-9]|3[0-1])\./.test(host))
67
+ return true;
68
+ if (/^0\./.test(host))
69
+ return true;
70
+ if (/^f[cd][0-9a-f]{2}:/.test(host))
71
+ return true; // IPv6 ULA
72
+ if (/^fe80:/.test(host))
73
+ return true; // IPv6 link-local
74
+ return false;
75
+ }
76
+ export function htmlToText(html) {
77
+ return html
78
+ .replace(/<script\b[\s\S]*?<\/script>/gi, "")
79
+ .replace(/<style\b[\s\S]*?<\/style>/gi, "")
80
+ .replace(/<noscript\b[\s\S]*?<\/noscript>/gi, "")
81
+ .replace(/<!--[\s\S]*?-->/g, "")
82
+ .replace(/<\/?(?:p|div|br|li|tr|h[1-6]|section|article|header|footer|nav|hr)[^>]*>/gi, "\n")
83
+ .replace(/<[^>]+>/g, "")
84
+ .replace(/&nbsp;/g, " ")
85
+ .replace(/&amp;/g, "&")
86
+ .replace(/&lt;/g, "<")
87
+ .replace(/&gt;/g, ">")
88
+ .replace(/&quot;/g, '"')
89
+ .replace(/&#x27;|&#39;|&apos;/g, "'")
90
+ .replace(/[\t ]+/g, " ")
91
+ .replace(/\n[\t ]*/g, "\n")
92
+ .replace(/\n{3,}/g, "\n\n")
93
+ .trim();
94
+ }
95
+ //# sourceMappingURL=web_fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_fetch.js","sourceRoot":"","sources":["../../src/tools/web_fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface WebSearchInput {
3
+ query: string;
4
+ limit?: number;
5
+ }
6
+ export declare const webSearchTool: ToolDefinition<WebSearchInput, string>;
7
+ export {};
8
+ //# sourceMappingURL=web_search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_search.d.ts","sourceRoot":"","sources":["../../src/tools/web_search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,cAAc,EAAE,MAAM,CAwChE,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { htmlToText } from "./web_fetch.js";
2
+ export const webSearchTool = {
3
+ name: "web_search",
4
+ description: "Search the web via DuckDuckGo (no API key needed). " +
5
+ "Returns the top matches with title, URL, and a short snippet. " +
6
+ "For pulling content from a specific URL use web_fetch.",
7
+ inputSchema: {
8
+ type: "object",
9
+ properties: {
10
+ query: { type: "string" },
11
+ limit: { type: "integer", minimum: 1, maximum: 20 },
12
+ },
13
+ required: ["query"],
14
+ },
15
+ async execute(input, ctx) {
16
+ const limit = Math.max(1, Math.min(input.limit ?? 10, 20));
17
+ const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(input.query)}`;
18
+ const res = await fetch(url, {
19
+ signal: ctx.signal,
20
+ headers: {
21
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/537.36 Lisa/0.1",
22
+ accept: "text/html,application/xhtml+xml",
23
+ },
24
+ });
25
+ if (!res.ok) {
26
+ throw new Error(`duckduckgo HTTP ${res.status} ${res.statusText}`);
27
+ }
28
+ const html = await res.text();
29
+ const results = parseDuckDuckGo(html, limit);
30
+ if (results.length === 0) {
31
+ return `(no results for "${input.query}" — DDG may have throttled or changed layout)`;
32
+ }
33
+ return results
34
+ .map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.snippet}`)
35
+ .join("\n\n");
36
+ },
37
+ };
38
+ function parseDuckDuckGo(html, limit) {
39
+ const out = [];
40
+ const blockRe = /<div[^>]*class="[^"]*\bresult\b[^"]*"[^>]*>([\s\S]*?)<\/div>\s*(?=<div[^>]*class="[^"]*\bresult\b|<div[^>]*class="[^"]*nav-link)/g;
41
+ // Fallback: if the above doesn't bracket cleanly, just iterate result__a
42
+ const linkRe = /<a[^>]*class="[^"]*\bresult__a\b[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/g;
43
+ const snipRe = /<a[^>]*class="[^"]*\bresult__snippet\b[^"]*"[^>]*>([\s\S]*?)<\/a>/g;
44
+ const links = [];
45
+ let m;
46
+ while ((m = linkRe.exec(html)) && links.length < limit * 2) {
47
+ links.push({ url: unwrapDdgUrl(m[1]), title: htmlToText(m[2]) });
48
+ }
49
+ const snippets = [];
50
+ while ((m = snipRe.exec(html)) && snippets.length < limit * 2) {
51
+ snippets.push(htmlToText(m[1]));
52
+ }
53
+ for (let i = 0; i < links.length && out.length < limit; i++) {
54
+ const link = links[i];
55
+ if (!/^https?:\/\//.test(link.url))
56
+ continue;
57
+ out.push({
58
+ title: link.title,
59
+ url: link.url,
60
+ snippet: snippets[i] ?? "",
61
+ });
62
+ }
63
+ // Suppress unused-variable warning for blockRe (kept for future use)
64
+ void blockRe;
65
+ return out;
66
+ }
67
+ function unwrapDdgUrl(href) {
68
+ // DuckDuckGo wraps result URLs in /l/?uddg=<encoded>
69
+ const m = href.match(/[?&]uddg=([^&]+)/);
70
+ if (m) {
71
+ try {
72
+ return decodeURIComponent(m[1]);
73
+ }
74
+ catch {
75
+ // fall through
76
+ }
77
+ }
78
+ if (href.startsWith("//"))
79
+ return "https:" + href;
80
+ return href;
81
+ }
82
+ //# sourceMappingURL=web_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_search.js","sourceRoot":"","sources":["../../src/tools/web_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface WriteInput {
3
+ path: string;
4
+ content: string;
5
+ }
6
+ export declare const writeTool: ToolDefinition<WriteInput, string>;
7
+ export {};
8
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM,CAkBxD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import path from "node:path";
2
+ import { atomicWrite } from "../fs-utils.js";
3
+ export const writeTool = {
4
+ name: "write",
5
+ description: "Write a text file to the local filesystem, creating parent directories as needed. " +
6
+ "Overwrites if the file already exists. Use `edit` to make targeted changes to existing files instead of rewriting them wholesale.",
7
+ inputSchema: {
8
+ type: "object",
9
+ properties: {
10
+ path: { type: "string" },
11
+ content: { type: "string" },
12
+ },
13
+ required: ["path", "content"],
14
+ },
15
+ async execute(input, ctx) {
16
+ const abs = path.resolve(ctx.cwd, input.path);
17
+ await atomicWrite(abs, input.content);
18
+ return `Wrote ${input.content.length} chars to ${abs}`;
19
+ },
20
+ };
21
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQ7C,MAAM,CAAC,MAAM,SAAS,GAAuC;IAC3D,IAAI,EAAE,OAAO;IACb,WAAW,EACT,oFAAoF;QACpF,mIAAmI;IACrI,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;KAC9B;IACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,SAAS,KAAK,CAAC,OAAO,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;IACzD,CAAC;CACF,CAAC"}