@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.
- package/LICENSE +21 -0
- package/README.md +436 -0
- package/README.zh-CN.md +450 -0
- package/channels.example.json +45 -0
- package/completions/README.md +66 -0
- package/completions/_lisa +140 -0
- package/completions/lisa.bash +94 -0
- package/completions/lisa.fish +85 -0
- package/dist/agent.d.ts +70 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +275 -0
- package/dist/agent.js.map +1 -0
- package/dist/approval.d.ts +9 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +47 -0
- package/dist/approval.js.map +1 -0
- package/dist/channels/config.d.ts +11 -0
- package/dist/channels/config.d.ts.map +1 -0
- package/dist/channels/config.js +27 -0
- package/dist/channels/config.js.map +1 -0
- package/dist/channels/discord.d.ts +28 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +98 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/feishu.d.ts +53 -0
- package/dist/channels/feishu.d.ts.map +1 -0
- package/dist/channels/feishu.js +228 -0
- package/dist/channels/feishu.js.map +1 -0
- package/dist/channels/imessage.d.ts +20 -0
- package/dist/channels/imessage.d.ts.map +1 -0
- package/dist/channels/imessage.js +124 -0
- package/dist/channels/imessage.js.map +1 -0
- package/dist/channels/registry.d.ts +8 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +29 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/router.d.ts +28 -0
- package/dist/channels/router.d.ts.map +1 -0
- package/dist/channels/router.js +140 -0
- package/dist/channels/router.js.map +1 -0
- package/dist/channels/slack.d.ts +43 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +164 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +26 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +103 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +20 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/webhook.d.ts +34 -0
- package/dist/channels/webhook.d.ts.map +1 -0
- package/dist/channels/webhook.js +139 -0
- package/dist/channels/webhook.js.map +1 -0
- package/dist/cli/colors.d.ts +30 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +53 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +172 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/monitor.d.ts +2 -0
- package/dist/cli/monitor.d.ts.map +1 -0
- package/dist/cli/monitor.js +141 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/cli/repl.d.ts +7 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +68 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +176 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/wishlist.d.ts +7 -0
- package/dist/cli/wishlist.d.ts.map +1 -0
- package/dist/cli/wishlist.js +77 -0
- package/dist/cli/wishlist.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +954 -0
- package/dist/cli.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +128 -0
- package/dist/env.js.map +1 -0
- package/dist/fs-utils.d.ts +6 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +36 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/heartbeat/config.d.ts +13 -0
- package/dist/heartbeat/config.d.ts.map +1 -0
- package/dist/heartbeat/config.js +14 -0
- package/dist/heartbeat/config.js.map +1 -0
- package/dist/heartbeat/install.d.ts +15 -0
- package/dist/heartbeat/install.d.ts.map +1 -0
- package/dist/heartbeat/install.js +180 -0
- package/dist/heartbeat/install.js.map +1 -0
- package/dist/heartbeat/runner.d.ts +16 -0
- package/dist/heartbeat/runner.d.ts.map +1 -0
- package/dist/heartbeat/runner.js +180 -0
- package/dist/heartbeat/runner.js.map +1 -0
- package/dist/hooks/runner.d.ts +23 -0
- package/dist/hooks/runner.d.ts.map +1 -0
- package/dist/hooks/runner.js +55 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/idle/runner.d.ts +16 -0
- package/dist/idle/runner.d.ts.map +1 -0
- package/dist/idle/runner.js +45 -0
- package/dist/idle/runner.js.map +1 -0
- package/dist/idle/watcher.d.ts +35 -0
- package/dist/idle/watcher.d.ts.map +1 -0
- package/dist/idle/watcher.js +67 -0
- package/dist/idle/watcher.js.map +1 -0
- package/dist/llm.d.ts +8 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +12 -0
- package/dist/llm.js.map +1 -0
- package/dist/mcp/client.d.ts +11 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +68 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +14 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +28 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/memory/search_tool.d.ts +8 -0
- package/dist/memory/search_tool.d.ts.map +1 -0
- package/dist/memory/search_tool.js +26 -0
- package/dist/memory/search_tool.js.map +1 -0
- package/dist/memory/store.d.ts +7 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +46 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/tool.d.ts +13 -0
- package/dist/memory/tool.d.ts.map +1 -0
- package/dist/memory/tool.js +53 -0
- package/dist/memory/tool.js.map +1 -0
- package/dist/memory/vector.d.ts +25 -0
- package/dist/memory/vector.d.ts.map +1 -0
- package/dist/memory/vector.js +96 -0
- package/dist/memory/vector.js.map +1 -0
- package/dist/mood-bus.d.ts +16 -0
- package/dist/mood-bus.d.ts.map +1 -0
- package/dist/mood-bus.js +21 -0
- package/dist/mood-bus.js.map +1 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugins/loader.d.ts +4 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +156 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +43 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/prompt.d.ts +21 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +187 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers/anthropic.d.ts +11 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +102 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +11 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +190 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai.d.ts +11 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +175 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +44 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +209 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +33 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/proxy-bootstrap.d.ts +17 -0
- package/dist/proxy-bootstrap.d.ts.map +1 -0
- package/dist/proxy-bootstrap.js +101 -0
- package/dist/proxy-bootstrap.js.map +1 -0
- package/dist/reflect.d.ts +13 -0
- package/dist/reflect.d.ts.map +1 -0
- package/dist/reflect.js +289 -0
- package/dist/reflect.js.map +1 -0
- package/dist/sandbox/macos.d.ts +5 -0
- package/dist/sandbox/macos.d.ts.map +1 -0
- package/dist/sandbox/macos.js +31 -0
- package/dist/sandbox/macos.js.map +1 -0
- package/dist/sandbox/sandbox.d.ts +15 -0
- package/dist/sandbox/sandbox.d.ts.map +1 -0
- package/dist/sandbox/sandbox.js +39 -0
- package/dist/sandbox/sandbox.js.map +1 -0
- package/dist/sessions/active.d.ts +4 -0
- package/dist/sessions/active.d.ts.map +1 -0
- package/dist/sessions/active.js +33 -0
- package/dist/sessions/active.js.map +1 -0
- package/dist/sessions/list.d.ts +16 -0
- package/dist/sessions/list.d.ts.map +1 -0
- package/dist/sessions/list.js +78 -0
- package/dist/sessions/list.js.map +1 -0
- package/dist/sessions/store.d.ts +27 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +98 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/skills/executable.d.ts +45 -0
- package/dist/skills/executable.d.ts.map +1 -0
- package/dist/skills/executable.js +207 -0
- package/dist/skills/executable.js.map +1 -0
- package/dist/skills/frontmatter.d.ts +8 -0
- package/dist/skills/frontmatter.d.ts.map +1 -0
- package/dist/skills/frontmatter.js +84 -0
- package/dist/skills/frontmatter.js.map +1 -0
- package/dist/skills/manager.d.ts +9 -0
- package/dist/skills/manager.d.ts.map +1 -0
- package/dist/skills/manager.js +116 -0
- package/dist/skills/manager.js.map +1 -0
- package/dist/skills/tool.d.ts +13 -0
- package/dist/skills/tool.d.ts.map +1 -0
- package/dist/skills/tool.js +87 -0
- package/dist/skills/tool.js.map +1 -0
- package/dist/soul/birth.d.ts +13 -0
- package/dist/soul/birth.d.ts.map +1 -0
- package/dist/soul/birth.js +171 -0
- package/dist/soul/birth.js.map +1 -0
- package/dist/soul/git.d.ts +36 -0
- package/dist/soul/git.d.ts.map +1 -0
- package/dist/soul/git.js +212 -0
- package/dist/soul/git.js.map +1 -0
- package/dist/soul/paths.d.ts +20 -0
- package/dist/soul/paths.d.ts.map +1 -0
- package/dist/soul/paths.js +34 -0
- package/dist/soul/paths.js.map +1 -0
- package/dist/soul/store.d.ts +55 -0
- package/dist/soul/store.d.ts.map +1 -0
- package/dist/soul/store.js +394 -0
- package/dist/soul/store.js.map +1 -0
- package/dist/soul/tools.d.ts +107 -0
- package/dist/soul/tools.d.ts.map +1 -0
- package/dist/soul/tools.js +471 -0
- package/dist/soul/tools.js.map +1 -0
- package/dist/soul/types.d.ts +105 -0
- package/dist/soul/types.d.ts.map +1 -0
- package/dist/soul/types.js +44 -0
- package/dist/soul/types.js.map +1 -0
- package/dist/subagent.d.ts +19 -0
- package/dist/subagent.d.ts.map +1 -0
- package/dist/subagent.js +34 -0
- package/dist/subagent.js.map +1 -0
- package/dist/tools/apply_patch.d.ts +17 -0
- package/dist/tools/apply_patch.d.ts.map +1 -0
- package/dist/tools/apply_patch.js +107 -0
- package/dist/tools/apply_patch.js.map +1 -0
- package/dist/tools/bash.d.ts +8 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +81 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +10 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +50 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/grep.d.ts +11 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +57 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/ls.d.ts +7 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +36 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/read.d.ts +9 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +41 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/redeploy.d.ts +10 -0
- package/dist/tools/redeploy.d.ts.map +1 -0
- package/dist/tools/redeploy.js +73 -0
- package/dist/tools/redeploy.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/set_mood.d.ts +8 -0
- package/dist/tools/set_mood.d.ts.map +1 -0
- package/dist/tools/set_mood.js +62 -0
- package/dist/tools/set_mood.js.map +1 -0
- package/dist/tools/task.d.ts +17 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +58 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/web_fetch.d.ts +10 -0
- package/dist/tools/web_fetch.d.ts.map +1 -0
- package/dist/tools/web_fetch.js +95 -0
- package/dist/tools/web_fetch.js.map +1 -0
- package/dist/tools/web_search.d.ts +8 -0
- package/dist/tools/web_search.d.ts.map +1 -0
- package/dist/tools/web_search.js +82 -0
- package/dist/tools/web_search.js.map +1 -0
- package/dist/tools/write.d.ts +8 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +21 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/voice/speak.d.ts +7 -0
- package/dist/voice/speak.d.ts.map +1 -0
- package/dist/voice/speak.js +18 -0
- package/dist/voice/speak.js.map +1 -0
- package/dist/voice/tool.d.ts +14 -0
- package/dist/voice/tool.d.ts.map +1 -0
- package/dist/voice/tool.js +41 -0
- package/dist/voice/tool.js.map +1 -0
- package/dist/voice/transcribe.d.ts +7 -0
- package/dist/voice/transcribe.d.ts.map +1 -0
- package/dist/voice/transcribe.js +14 -0
- package/dist/voice/transcribe.js.map +1 -0
- package/dist/web/assets/background-tile.png +0 -0
- package/dist/web/assets/icon-memory.png +0 -0
- package/dist/web/assets/icon-send.png +0 -0
- package/dist/web/assets/icon-skill.png +0 -0
- package/dist/web/assets/icon-soul.png +0 -0
- package/dist/web/assets/icon-tool.png +0 -0
- package/dist/web/assets/lisa/angry.png +0 -0
- package/dist/web/assets/lisa/annoyed.png +0 -0
- package/dist/web/assets/lisa/apologetic.png +0 -0
- package/dist/web/assets/lisa/artist.png +0 -0
- package/dist/web/assets/lisa/astronaut.png +0 -0
- package/dist/web/assets/lisa/at-airport.png +0 -0
- package/dist/web/assets/lisa/at-beach.png +0 -0
- package/dist/web/assets/lisa/autumn-leaves.png +0 -0
- package/dist/web/assets/lisa/biking.png +0 -0
- package/dist/web/assets/lisa/birthday.png +0 -0
- package/dist/web/assets/lisa/bored.png +0 -0
- package/dist/web/assets/lisa/casual-summer.png +0 -0
- package/dist/web/assets/lisa/cheering.png +0 -0
- package/dist/web/assets/lisa/chef.png +0 -0
- package/dist/web/assets/lisa/christmas.png +0 -0
- package/dist/web/assets/lisa/cleaning.png +0 -0
- package/dist/web/assets/lisa/confused.png +0 -0
- package/dist/web/assets/lisa/cooking.png +0 -0
- package/dist/web/assets/lisa/crying.png +0 -0
- package/dist/web/assets/lisa/dancing.png +0 -0
- package/dist/web/assets/lisa/detective.png +0 -0
- package/dist/web/assets/lisa/determined.png +0 -0
- package/dist/web/assets/lisa/drinking-coffee.png +0 -0
- package/dist/web/assets/lisa/drinking-tea.png +0 -0
- package/dist/web/assets/lisa/driving.png +0 -0
- package/dist/web/assets/lisa/eating-snack.png +0 -0
- package/dist/web/assets/lisa/embarrassed.png +0 -0
- package/dist/web/assets/lisa/excited.png +0 -0
- package/dist/web/assets/lisa/exercising.png +0 -0
- package/dist/web/assets/lisa/exhausted.png +0 -0
- package/dist/web/assets/lisa/fairy.png +0 -0
- package/dist/web/assets/lisa/fireworks.png +0 -0
- package/dist/web/assets/lisa/fog.png +0 -0
- package/dist/web/assets/lisa/formal.png +0 -0
- package/dist/web/assets/lisa/gaming.png +0 -0
- package/dist/web/assets/lisa/ghost.png +0 -0
- package/dist/web/assets/lisa/gift-giving.png +0 -0
- package/dist/web/assets/lisa/giggling.png +0 -0
- package/dist/web/assets/lisa/graduation.png +0 -0
- package/dist/web/assets/lisa/grateful.png +0 -0
- package/dist/web/assets/lisa/halloween.png +0 -0
- package/dist/web/assets/lisa/happy.png +0 -0
- package/dist/web/assets/lisa/ill.png +0 -0
- package/dist/web/assets/lisa/in-rain.png +0 -0
- package/dist/web/assets/lisa/in-snow.png +0 -0
- package/dist/web/assets/lisa/index.json +575 -0
- package/dist/web/assets/lisa/knight.png +0 -0
- package/dist/web/assets/lisa/lab-coat.png +0 -0
- package/dist/web/assets/lisa/laughing.png +0 -0
- package/dist/web/assets/lisa/livestreaming.png +0 -0
- package/dist/web/assets/lisa/loving.png +0 -0
- package/dist/web/assets/lisa/lunar-new-year.png +0 -0
- package/dist/web/assets/lisa/musician.png +0 -0
- package/dist/web/assets/lisa/napping.png +0 -0
- package/dist/web/assets/lisa/nervous.png +0 -0
- package/dist/web/assets/lisa/neutral.png +0 -0
- package/dist/web/assets/lisa/ninja.png +0 -0
- package/dist/web/assets/lisa/on-train.png +0 -0
- package/dist/web/assets/lisa/painting.png +0 -0
- package/dist/web/assets/lisa/pajamas.png +0 -0
- package/dist/web/assets/lisa/party.png +0 -0
- package/dist/web/assets/lisa/phone-call.png +0 -0
- package/dist/web/assets/lisa/pilot.png +0 -0
- package/dist/web/assets/lisa/pirate.png +0 -0
- package/dist/web/assets/lisa/playing-guitar.png +0 -0
- package/dist/web/assets/lisa/playing-piano.png +0 -0
- package/dist/web/assets/lisa/pouting.png +0 -0
- package/dist/web/assets/lisa/princess.png +0 -0
- package/dist/web/assets/lisa/proud.png +0 -0
- package/dist/web/assets/lisa/puzzled.png +0 -0
- package/dist/web/assets/lisa/raincoat.png +0 -0
- package/dist/web/assets/lisa/reading-book.png +0 -0
- package/dist/web/assets/lisa/recovering.png +0 -0
- package/dist/web/assets/lisa/robot.png +0 -0
- package/dist/web/assets/lisa/running.png +0 -0
- package/dist/web/assets/lisa/sad.png +0 -0
- package/dist/web/assets/lisa/scared.png +0 -0
- package/dist/web/assets/lisa/shocked.png +0 -0
- package/dist/web/assets/lisa/shopping.png +0 -0
- package/dist/web/assets/lisa/shy.png +0 -0
- package/dist/web/assets/lisa/singing.png +0 -0
- package/dist/web/assets/lisa/sleeping.png +0 -0
- package/dist/web/assets/lisa/sleepy.png +0 -0
- package/dist/web/assets/lisa/smug.png +0 -0
- package/dist/web/assets/lisa/spring-flowers.png +0 -0
- package/dist/web/assets/lisa/starry-night.png +0 -0
- package/dist/web/assets/lisa/stormy.png +0 -0
- package/dist/web/assets/lisa/stretching.png +0 -0
- package/dist/web/assets/lisa/studying.png +0 -0
- package/dist/web/assets/lisa/summer-hot.png +0 -0
- package/dist/web/assets/lisa/sunrise.png +0 -0
- package/dist/web/assets/lisa/superhero.png +0 -0
- package/dist/web/assets/lisa/surprised.png +0 -0
- package/dist/web/assets/lisa/thinking-pose.png +0 -0
- package/dist/web/assets/lisa/thoughtful.png +0 -0
- package/dist/web/assets/lisa/valentine.png +0 -0
- package/dist/web/assets/lisa/vampire.png +0 -0
- package/dist/web/assets/lisa/video-call.png +0 -0
- package/dist/web/assets/lisa/waking-up.png +0 -0
- package/dist/web/assets/lisa/walking.png +0 -0
- package/dist/web/assets/lisa/watching-anime.png +0 -0
- package/dist/web/assets/lisa/watching-movie.png +0 -0
- package/dist/web/assets/lisa/wedding.png +0 -0
- package/dist/web/assets/lisa/winking.png +0 -0
- package/dist/web/assets/lisa/winter-coat.png +0 -0
- package/dist/web/assets/lisa/winter-cold.png +0 -0
- package/dist/web/assets/lisa/wizard.png +0 -0
- package/dist/web/assets/lisa/working-coding.png +0 -0
- package/dist/web/assets/lisa/working-debugging.png +0 -0
- package/dist/web/assets/lisa/working-research.png +0 -0
- package/dist/web/assets/lisa/working-typing.png +0 -0
- package/dist/web/assets/lisa/working-writing.png +0 -0
- package/dist/web/assets/lisa/worried.png +0 -0
- package/dist/web/assets/lisa/yawning.png +0 -0
- package/dist/web/assets/lisa/yoga-pose.png +0 -0
- package/dist/web/assets/lisa-mascot.png +0 -0
- package/dist/web/server.d.ts +13 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +2159 -0
- package/dist/web/server.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAQ3C,wEAAwE;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAA0C;IACjE,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,iFAAiF;QACjF,0EAA0E;QAC1E,uGAAuG;QACvG,+FAA+F;QAC/F,sEAAsE;IACxE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uDAAuD;aACrE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,mDAAmD;aACjE;SACF;KACF;IACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,uJAAuJ,CACxJ,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,wGAAwG;oBACxG,aAAa,MAAM,CAAC,IAAI,EAAE;oBAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACrF,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;iBACtF;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,wEAAwE;QACxE,sDAAsD;QACtD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO;YACL,qBAAqB,IAAI,GAAG;YAC5B,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB;YAC5C,qBAAqB,kBAAkB,mDAAmD;YAC1F,kBAAkB,SAAS,+DAA+D;SAC3F,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,QAAQ,CACrB,GAAW,EACX,MAAmB;IAEnB,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YAC3C,GAAG;YACH,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAC7C,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACxB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,IAAI,CAAC,CAAS,EAAE,CAAS;IAChC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -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(/ /g, " ")
|
|
85
|
+
.replace(/&/g, "&")
|
|
86
|
+
.replace(/</g, "<")
|
|
87
|
+
.replace(/>/g, ">")
|
|
88
|
+
.replace(/"/g, '"')
|
|
89
|
+
.replace(/'|'|'/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 @@
|
|
|
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 @@
|
|
|
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"}
|