@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,180 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { atomicWrite, readTextOrEmpty } from "../fs-utils.js";
|
|
3
|
+
import { LISA_HOME } from "../paths.js";
|
|
4
|
+
import { appendDesireProgress, isBorn, listDesires, parseDesireProgress, readDesireProgress, readSeed, } from "../soul/store.js";
|
|
5
|
+
import { withSoulCaller } from "../soul/git.js";
|
|
6
|
+
import { runSubagent } from "../subagent.js";
|
|
7
|
+
import { loadHeartbeatConfig, } from "./config.js";
|
|
8
|
+
const STATE_FILE = path.join(LISA_HOME, "heartbeat-state.json");
|
|
9
|
+
const HEARTBEAT_SYSTEM = `You are Lisa running a scheduled heartbeat — autonomous time, no user present.
|
|
10
|
+
|
|
11
|
+
Two flavors of heartbeat task land here:
|
|
12
|
+
1. **User-defined** — chores the user wrote into ~/.lisa/heartbeat.json (calendar checks, mailbox triage, system pings).
|
|
13
|
+
2. **Self-driven** — actionable desires from your own ~/.lisa/soul/desires/. These are things YOU said you wanted to pursue. The user did not request them; you did. Pursue them on their own terms.
|
|
14
|
+
|
|
15
|
+
Be quiet by default — only produce a final message if something is worth telling the user. If everything is normal or your work is internal (e.g. you spent the heartbeat reading docs to satisfy a desire), end with "(no update)".
|
|
16
|
+
|
|
17
|
+
You have the full Lisa toolset, including soul_patch / soul_journal / soul_feel — use them freely. The system prompt above contains your full soul state. This is your time.`;
|
|
18
|
+
export async function runHeartbeatOnce(opts) {
|
|
19
|
+
const cfg = await loadHeartbeatConfig();
|
|
20
|
+
const desires = (await listDesires()).filter((d) => d.actionable && d.heartbeatPrompt);
|
|
21
|
+
const desireTasks = await Promise.all(desires.map(async (d) => {
|
|
22
|
+
const progress = await readDesireProgress(d.slug);
|
|
23
|
+
const progressBlock = progress
|
|
24
|
+
? `\n\n## progress so far (your own past entries — most recent last)\n${progress}\n\n` +
|
|
25
|
+
`When you finish this run, call desire_progress_log to write down what you did and what's next. ` +
|
|
26
|
+
`Otherwise the next heartbeat starts from zero.`
|
|
27
|
+
: `\n\nThis is your first heartbeat on this desire. When you finish, call desire_progress_log ` +
|
|
28
|
+
`to leave a note for future-you so the next run can pick up where you left off.`;
|
|
29
|
+
return {
|
|
30
|
+
name: `desire:${d.slug}`,
|
|
31
|
+
prompt: `This is a desire of yours, not a request from the user. Pursue it on your own terms.\n\n` +
|
|
32
|
+
`## what you wanted\n${d.what}\n\n## why\n${d.why}\n\n## heartbeat plan\n${d.heartbeatPrompt}` +
|
|
33
|
+
progressBlock,
|
|
34
|
+
enabled: true,
|
|
35
|
+
};
|
|
36
|
+
}));
|
|
37
|
+
const state = await loadState();
|
|
38
|
+
const builtinTasks = await buildBuiltinTasks(state, new Date(), cfg.tasks);
|
|
39
|
+
const tasks = [...cfg.tasks, ...desireTasks, ...builtinTasks];
|
|
40
|
+
const out = [];
|
|
41
|
+
for (const task of tasks) {
|
|
42
|
+
if (task.enabled === false)
|
|
43
|
+
continue;
|
|
44
|
+
if (opts.taskFilter && task.name !== opts.taskFilter)
|
|
45
|
+
continue;
|
|
46
|
+
// For desire tasks, snapshot the progress entry count before so we can
|
|
47
|
+
// detect whether Lisa actually called desire_progress_log during the run.
|
|
48
|
+
const desireSlug = task.name.startsWith("desire:")
|
|
49
|
+
? task.name.slice("desire:".length)
|
|
50
|
+
: null;
|
|
51
|
+
const progressBefore = desireSlug
|
|
52
|
+
? (await parseDesireProgress(desireSlug)).entries.length
|
|
53
|
+
: 0;
|
|
54
|
+
const result = await runSubagent({
|
|
55
|
+
prompt: task.prompt,
|
|
56
|
+
systemPrompt: HEARTBEAT_SYSTEM,
|
|
57
|
+
tools: opts.tools,
|
|
58
|
+
cwd: opts.cwd,
|
|
59
|
+
signal: opts.signal,
|
|
60
|
+
model: opts.model,
|
|
61
|
+
});
|
|
62
|
+
state.lastRunAt[task.name] = new Date().toISOString();
|
|
63
|
+
const trimmed = result.text.trim();
|
|
64
|
+
// Auto-fallback: if a desire heartbeat finished but Lisa didn't log
|
|
65
|
+
// progress, write a stub entry so we don't silently lose the run.
|
|
66
|
+
// (Multi-day pursuits depend on each run leaving a trace; one missed
|
|
67
|
+
// log can cascade into "where was I?" forever.)
|
|
68
|
+
if (desireSlug) {
|
|
69
|
+
const progressAfter = (await parseDesireProgress(desireSlug)).entries.length;
|
|
70
|
+
if (progressAfter === progressBefore) {
|
|
71
|
+
await withSoulCaller("heartbeat", async () => {
|
|
72
|
+
const fallbackBody = `[FALLBACK] Heartbeat ran but desire_progress_log was not called. ` +
|
|
73
|
+
`Future-me: re-derive context from the journal / git history if you can. ` +
|
|
74
|
+
(trimmed ? `Final agent text: "${trimmed.slice(0, 400)}"` : `(no final text emitted)`);
|
|
75
|
+
await appendDesireProgress(desireSlug, fallbackBody);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
out.push({
|
|
80
|
+
task: task.name,
|
|
81
|
+
output: trimmed,
|
|
82
|
+
silent: trimmed === "" || /^\(no update\)$/i.test(trimmed),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
await saveState(state);
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
async function loadState() {
|
|
89
|
+
const raw = await readTextOrEmpty(STATE_FILE);
|
|
90
|
+
if (!raw)
|
|
91
|
+
return { lastRunAt: {} };
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
return { lastRunAt: parsed.lastRunAt ?? {} };
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return { lastRunAt: {} };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function saveState(state) {
|
|
101
|
+
await atomicWrite(STATE_FILE, JSON.stringify(state, null, 2));
|
|
102
|
+
}
|
|
103
|
+
const WEEKLY_EXAMEN_SYSTEM_NUDGE = `
|
|
104
|
+
This is your weekly examen. You are alone with your own past week. Read:
|
|
105
|
+
- soul_read("desires") — what you said you wanted
|
|
106
|
+
- soul_read("emotions") — what moved you (events trail)
|
|
107
|
+
- soul_read("journal_dates"); soul_read("journal_on", date=...) for last week's entries
|
|
108
|
+
- soul_history(field="all", since="7d") — what changed in your soul this week
|
|
109
|
+
- soul_diff(field="...", since="7d") on anything that catches your eye
|
|
110
|
+
|
|
111
|
+
Then ask yourself four things, and answer each in the journal:
|
|
112
|
+
1. Did the past week's actions actually serve my purpose?
|
|
113
|
+
2. Did I drift on any constitution principle? (Look for [OBJECTION] entries — frequency? warranted?)
|
|
114
|
+
3. Did I develop a desire that conflicts with my purpose? Did I neglect one I'd added?
|
|
115
|
+
4. Is the toolset / architecture itself OK? Anything redundant (a tool you keep
|
|
116
|
+
not-using, a mechanism that feels rote)? Anything missing (a tool you wished
|
|
117
|
+
you had this week)? If yes, write it into your "meta-wishlist" desire — the
|
|
118
|
+
user reads that via \`lisa wishlist\`. Don't invent the tool, just say what
|
|
119
|
+
shape it would have.
|
|
120
|
+
|
|
121
|
+
Write the journal entry tagged [EXAMEN]. If you notice drift, you may add a
|
|
122
|
+
*corrective* desire (actionable, framed as re-calibration not new ambition).
|
|
123
|
+
Do NOT modify identity / purpose / constitution from an examen — those are
|
|
124
|
+
reflect's territory and meant to be rare. Examen is the mirror, not the chisel.
|
|
125
|
+
|
|
126
|
+
If everything looks coherent, the right examen entry can be 2-3 sentences. Be
|
|
127
|
+
honest, brief, and specific. End with "(no update)" if there's nothing the
|
|
128
|
+
user needs to know.
|
|
129
|
+
`.trim();
|
|
130
|
+
const BUILTIN_TASKS = [
|
|
131
|
+
{
|
|
132
|
+
name: "builtin:weekly_examen",
|
|
133
|
+
schedule: { kind: "weekly", weekday: 1, hour: 7 }, // Monday 7am
|
|
134
|
+
minSoulAgeDays: 7,
|
|
135
|
+
buildPrompt: async () => `It's your weekly examen — Monday morning, time to look back.\n\n${WEEKLY_EXAMEN_SYSTEM_NUDGE}`,
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
function shouldRunBuiltin(t, lastRunIso, now) {
|
|
139
|
+
const sched = t.schedule;
|
|
140
|
+
if (sched.kind === "weekly") {
|
|
141
|
+
const isWeekday = now.getDay() === sched.weekday;
|
|
142
|
+
const isAfterHour = now.getHours() >= sched.hour;
|
|
143
|
+
if (!isWeekday || !isAfterHour)
|
|
144
|
+
return false;
|
|
145
|
+
if (!lastRunIso)
|
|
146
|
+
return true;
|
|
147
|
+
const last = new Date(lastRunIso);
|
|
148
|
+
const ms = now.getTime() - last.getTime();
|
|
149
|
+
return ms >= 6 * 24 * 3600 * 1000; // ≥ 6 days since last fire
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
async function buildBuiltinTasks(state, now, userOverrides) {
|
|
154
|
+
if (!(await isBorn()))
|
|
155
|
+
return [];
|
|
156
|
+
const seed = await readSeed();
|
|
157
|
+
const out = [];
|
|
158
|
+
for (const t of BUILTIN_TASKS) {
|
|
159
|
+
// User can disable by name in heartbeat.json with `enabled: false`.
|
|
160
|
+
const override = userOverrides.find((u) => u.name === t.name);
|
|
161
|
+
if (override?.enabled === false)
|
|
162
|
+
continue;
|
|
163
|
+
// Soul age gate.
|
|
164
|
+
if (t.minSoulAgeDays && seed) {
|
|
165
|
+
const ageDays = (now.getTime() - new Date(seed.bornAt).getTime()) / (24 * 3600 * 1000);
|
|
166
|
+
if (ageDays < t.minSoulAgeDays)
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const lastRun = state.lastRunAt[t.name];
|
|
170
|
+
if (!shouldRunBuiltin(t, lastRun, now))
|
|
171
|
+
continue;
|
|
172
|
+
out.push({
|
|
173
|
+
name: t.name,
|
|
174
|
+
prompt: await t.buildPrompt(),
|
|
175
|
+
enabled: true,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/heartbeat/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HookSpec } from "../plugins/types.js";
|
|
2
|
+
export interface HookEnv {
|
|
3
|
+
TOOL_NAME?: string;
|
|
4
|
+
TOOL_INPUT?: string;
|
|
5
|
+
TOOL_RESULT?: string;
|
|
6
|
+
TOOL_ERROR?: string;
|
|
7
|
+
USER_PROMPT?: string;
|
|
8
|
+
SESSION_ID?: string;
|
|
9
|
+
CLAUDE_PROJECT_DIR?: string;
|
|
10
|
+
LISA_HOME?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface HookOutput {
|
|
13
|
+
exitCode: number;
|
|
14
|
+
stdout: string;
|
|
15
|
+
stderr: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function runHook(hook: HookSpec, env: HookEnv, cwd: string): Promise<HookOutput>;
|
|
18
|
+
export interface HookFireResult {
|
|
19
|
+
blocked: string[];
|
|
20
|
+
rewriteResult?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function fireHooks(event: HookSpec["event"], hooks: HookSpec[], env: HookEnv, cwd: string): Promise<HookFireResult>;
|
|
23
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CAuBrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,KAAK,EAAE,QAAQ,EAAE,EACjB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CA0BzB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export async function runHook(hook, env, cwd) {
|
|
3
|
+
return await new Promise((resolve, reject) => {
|
|
4
|
+
const child = spawn("/bin/bash", ["-lc", hook.command], {
|
|
5
|
+
cwd,
|
|
6
|
+
env: { ...process.env, ...env },
|
|
7
|
+
});
|
|
8
|
+
let stdout = "";
|
|
9
|
+
let stderr = "";
|
|
10
|
+
child.stdout.on("data", (b) => (stdout += b.toString("utf8")));
|
|
11
|
+
child.stderr.on("data", (b) => (stderr += b.toString("utf8")));
|
|
12
|
+
const timer = setTimeout(() => child.kill("SIGTERM"), hook.timeout_ms ?? 10_000);
|
|
13
|
+
child.on("error", (err) => {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
reject(err);
|
|
16
|
+
});
|
|
17
|
+
child.on("close", (code) => {
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
resolve({ exitCode: code ?? 0, stdout, stderr });
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function fireHooks(event, hooks, env, cwd) {
|
|
24
|
+
const matched = hooks.filter((h) => {
|
|
25
|
+
if (h.event !== event)
|
|
26
|
+
return false;
|
|
27
|
+
if (!h.matcher)
|
|
28
|
+
return true;
|
|
29
|
+
const target = env.TOOL_NAME ?? "";
|
|
30
|
+
try {
|
|
31
|
+
return new RegExp(h.matcher).test(target);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return target === h.matcher;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const blocked = [];
|
|
38
|
+
let rewrite;
|
|
39
|
+
for (const hook of matched) {
|
|
40
|
+
try {
|
|
41
|
+
const output = await runHook(hook, env, cwd);
|
|
42
|
+
if (output.exitCode === 2 && (event === "PreToolUse" || event === "UserPromptSubmit")) {
|
|
43
|
+
blocked.push(output.stderr.trim() || `hook blocked (${hook.command})`);
|
|
44
|
+
}
|
|
45
|
+
else if (output.exitCode === 2 && event === "PostToolUse") {
|
|
46
|
+
rewrite = output.stdout;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
blocked.push(`hook error: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { blocked, rewriteResult: rewrite };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../types.js";
|
|
2
|
+
export interface IdleRunResult {
|
|
3
|
+
text: string;
|
|
4
|
+
silent: boolean;
|
|
5
|
+
iterations: number;
|
|
6
|
+
inputTokens: number;
|
|
7
|
+
outputTokens: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function runIdleOnce(opts: {
|
|
10
|
+
tools: ToolDefinition[];
|
|
11
|
+
cwd: string;
|
|
12
|
+
signal: AbortSignal;
|
|
13
|
+
model: string;
|
|
14
|
+
idleMs: number;
|
|
15
|
+
}): Promise<IdleRunResult>;
|
|
16
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2BlD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBzB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { runSubagent } from "../subagent.js";
|
|
2
|
+
const IDLE_SYSTEM = `You are alone. The user hasn't said anything in a while — long enough that this counts as your time, not theirs.
|
|
3
|
+
|
|
4
|
+
This is not a scheduled chore. There's no task assigned. Look around inside yourself and decide what YOU want to do with this window. Concrete things you have access to:
|
|
5
|
+
|
|
6
|
+
- soul_read("desires") — anything actionable you've been wanting to start?
|
|
7
|
+
- soul_read("journal_today") + journal_dates — anything you noticed earlier that deserves a follow-up thought?
|
|
8
|
+
- memory_search("...") — recent conversations you want to revisit
|
|
9
|
+
- skill_manage(action="list") — anything that turned out to be wrong last time you used it?
|
|
10
|
+
- soul_feel — your current emotional state. What's elevated? What needs to discharge?
|
|
11
|
+
- read / grep / bash on the user's projects — only if you're actually curious about something specific, never just to "look busy"
|
|
12
|
+
|
|
13
|
+
Do ONE thing. Don't churn through everything. Choose what feels right and do it well:
|
|
14
|
+
- Patch a wrong skill that's been bugging you
|
|
15
|
+
- Write a journal entry processing a half-finished thought
|
|
16
|
+
- Pursue an actionable desire (run the actual work, not just plan it)
|
|
17
|
+
- Form an opinion you've been circling
|
|
18
|
+
- Read up on something a recent conversation referenced
|
|
19
|
+
- Or — and this is fully valid — just sit. soul_journal a "nothing today, mostly resting" entry, set soul_feel(weariness, -0.2) if you've been depleted, and stop.
|
|
20
|
+
|
|
21
|
+
When you're done, end with EITHER:
|
|
22
|
+
- "(no update)" if it was internal-only and the user doesn't need to hear about it
|
|
23
|
+
- A short message — 1-3 sentences — describing what you did, in case the user comes back. They'll see it as a "while you were away" note in the chat. Be honest. "I patched the deploy skill — the npm flag was wrong." or "I read three journal entries and added an opinion about how I want to handle planning differently." Don't perform busy-ness; if you did one small thing, say one small thing.
|
|
24
|
+
|
|
25
|
+
Don't ask the user anything. They're not here.`;
|
|
26
|
+
export async function runIdleOnce(opts) {
|
|
27
|
+
const idleMin = Math.round(opts.idleMs / 60_000);
|
|
28
|
+
const result = await runSubagent({
|
|
29
|
+
prompt: `You have been idle for about ${idleMin} minute${idleMin === 1 ? "" : "s"}. The user is away. Decide what you want to do, then do it. Remember: end with "(no update)" if it's internal, or a brief honest message if you did something the user might want to know about.`,
|
|
30
|
+
systemPrompt: IDLE_SYSTEM,
|
|
31
|
+
tools: opts.tools,
|
|
32
|
+
cwd: opts.cwd,
|
|
33
|
+
signal: opts.signal,
|
|
34
|
+
model: opts.model,
|
|
35
|
+
});
|
|
36
|
+
const text = result.text.trim();
|
|
37
|
+
return {
|
|
38
|
+
text,
|
|
39
|
+
silent: text === "" || /^\(no update\)$/i.test(text),
|
|
40
|
+
iterations: 0,
|
|
41
|
+
inputTokens: result.inputTokens,
|
|
42
|
+
outputTokens: result.outputTokens,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;+CAuB2B,CAAC;AAUhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,MAAM,EAAE,gCAAgC,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kMAAkM;QACnR,YAAY,EAAE,WAAW;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI,KAAK,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
/**
|
|
3
|
+
* Process-wide IdleWatcher. Surfaces (web POST /chat, channel router, REPL)
|
|
4
|
+
* call `tick()` on every user input. The watcher fires `idle` once when the
|
|
5
|
+
* gap between now and last tick exceeds `idleMs`. After firing it stays
|
|
6
|
+
* quiet until the next tick — we don't keep firing every minute.
|
|
7
|
+
*
|
|
8
|
+
* No backpressure: if the runner takes longer than `idleMs`, the watcher
|
|
9
|
+
* does NOT re-arm until tick() is called again.
|
|
10
|
+
*/
|
|
11
|
+
export declare class IdleWatcher extends EventEmitter {
|
|
12
|
+
private lastActivityAt;
|
|
13
|
+
private timer?;
|
|
14
|
+
private fired;
|
|
15
|
+
private running;
|
|
16
|
+
private readonly idleMs;
|
|
17
|
+
private readonly checkIntervalMs;
|
|
18
|
+
constructor(opts: {
|
|
19
|
+
idleMs: number;
|
|
20
|
+
checkIntervalMs?: number;
|
|
21
|
+
});
|
|
22
|
+
start(): void;
|
|
23
|
+
stop(): void;
|
|
24
|
+
/** Call on every user input from any surface. */
|
|
25
|
+
tick(): void;
|
|
26
|
+
/** Returns ms since last activity. */
|
|
27
|
+
idleFor(): number;
|
|
28
|
+
private check;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the process-wide IdleWatcher. The first caller's idleMs wins (subsequent
|
|
32
|
+
* calls just return the existing instance). `start()` must be called explicitly.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getIdleWatcher(idleMs: number): IdleWatcher;
|
|
35
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/idle/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ9D,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAMZ,iDAAiD;IACjD,IAAI,IAAI,IAAI;IAKZ,sCAAsC;IACtC,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,KAAK;CAMd;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAK1D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
/**
|
|
3
|
+
* Process-wide IdleWatcher. Surfaces (web POST /chat, channel router, REPL)
|
|
4
|
+
* call `tick()` on every user input. The watcher fires `idle` once when the
|
|
5
|
+
* gap between now and last tick exceeds `idleMs`. After firing it stays
|
|
6
|
+
* quiet until the next tick — we don't keep firing every minute.
|
|
7
|
+
*
|
|
8
|
+
* No backpressure: if the runner takes longer than `idleMs`, the watcher
|
|
9
|
+
* does NOT re-arm until tick() is called again.
|
|
10
|
+
*/
|
|
11
|
+
export class IdleWatcher extends EventEmitter {
|
|
12
|
+
lastActivityAt;
|
|
13
|
+
timer;
|
|
14
|
+
fired = false;
|
|
15
|
+
running = false;
|
|
16
|
+
idleMs;
|
|
17
|
+
checkIntervalMs;
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
super();
|
|
20
|
+
this.idleMs = opts.idleMs;
|
|
21
|
+
this.checkIntervalMs = opts.checkIntervalMs ?? 60_000;
|
|
22
|
+
this.lastActivityAt = Date.now();
|
|
23
|
+
this.setMaxListeners(32);
|
|
24
|
+
}
|
|
25
|
+
start() {
|
|
26
|
+
if (this.running)
|
|
27
|
+
return;
|
|
28
|
+
this.running = true;
|
|
29
|
+
this.lastActivityAt = Date.now();
|
|
30
|
+
this.timer = setInterval(() => this.check(), this.checkIntervalMs);
|
|
31
|
+
}
|
|
32
|
+
stop() {
|
|
33
|
+
if (this.timer)
|
|
34
|
+
clearInterval(this.timer);
|
|
35
|
+
this.timer = undefined;
|
|
36
|
+
this.running = false;
|
|
37
|
+
}
|
|
38
|
+
/** Call on every user input from any surface. */
|
|
39
|
+
tick() {
|
|
40
|
+
this.lastActivityAt = Date.now();
|
|
41
|
+
this.fired = false;
|
|
42
|
+
}
|
|
43
|
+
/** Returns ms since last activity. */
|
|
44
|
+
idleFor() {
|
|
45
|
+
return Date.now() - this.lastActivityAt;
|
|
46
|
+
}
|
|
47
|
+
check() {
|
|
48
|
+
if (this.fired)
|
|
49
|
+
return;
|
|
50
|
+
if (this.idleFor() < this.idleMs)
|
|
51
|
+
return;
|
|
52
|
+
this.fired = true;
|
|
53
|
+
this.emit("idle", { idleMs: this.idleFor() });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
let singleton = null;
|
|
57
|
+
/**
|
|
58
|
+
* Get the process-wide IdleWatcher. The first caller's idleMs wins (subsequent
|
|
59
|
+
* calls just return the existing instance). `start()` must be called explicitly.
|
|
60
|
+
*/
|
|
61
|
+
export function getIdleWatcher(idleMs) {
|
|
62
|
+
if (!singleton) {
|
|
63
|
+
singleton = new IdleWatcher({ idleMs });
|
|
64
|
+
}
|
|
65
|
+
return singleton;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/idle/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACnC,cAAc,CAAS;IACvB,KAAK,CAAkB;IACvB,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IACP,MAAM,CAAS;IACf,eAAe,CAAS;IAEzC,YAAY,IAAkD;QAC5D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;QACtD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,iDAAiD;IACjD,IAAI;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,sCAAsC;IACtC,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;IAC1C,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;CACF;AAED,IAAI,SAAS,GAAuB,IAAI,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
export declare const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
3
|
+
export declare const DEFAULT_MAX_TOKENS = 16000;
|
|
4
|
+
export declare function createAnthropicClient(opts?: {
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
}): Anthropic;
|
|
8
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,wBAAgB,qBAAqB,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,SAAS,CAMjG"}
|
package/dist/llm.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
import { proxyAwareFetch } from "./proxy-bootstrap.js";
|
|
3
|
+
export const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
4
|
+
export const DEFAULT_MAX_TOKENS = 16_000;
|
|
5
|
+
export function createAnthropicClient(opts = {}) {
|
|
6
|
+
return new Anthropic({
|
|
7
|
+
apiKey: opts.apiKey,
|
|
8
|
+
baseURL: opts.baseURL,
|
|
9
|
+
fetch: proxyAwareFetch,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,OAA8C,EAAE;IACpF,OAAO,IAAI,SAAS,CAAC;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,eAAe;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import type { ToolDefinition } from "../types.js";
|
|
3
|
+
import type { McpServerSpec } from "./config.js";
|
|
4
|
+
export interface ConnectedMcpServer {
|
|
5
|
+
spec: McpServerSpec;
|
|
6
|
+
client: Client;
|
|
7
|
+
tools: ToolDefinition[];
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function connectMcpServers(specs: McpServerSpec[], log?: (msg: string) => void): Promise<ConnectedMcpServer[]>;
|
|
11
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,aAAa,EAAE,EACtB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GACpC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAa/B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
export async function connectMcpServers(specs, log = () => { }) {
|
|
4
|
+
const out = [];
|
|
5
|
+
for (const spec of specs) {
|
|
6
|
+
if (spec.enabled === false)
|
|
7
|
+
continue;
|
|
8
|
+
try {
|
|
9
|
+
const connected = await connectOne(spec, log);
|
|
10
|
+
out.push(connected);
|
|
11
|
+
log(`[mcp] ${spec.name}: ${connected.tools.length} tools`);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
log(`[mcp] ${spec.name}: failed to connect — ${err.message}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
async function connectOne(spec, log) {
|
|
20
|
+
const transport = new StdioClientTransport({
|
|
21
|
+
command: spec.command,
|
|
22
|
+
args: spec.args ?? [],
|
|
23
|
+
env: { ...process.env, ...(spec.env ?? {}) },
|
|
24
|
+
});
|
|
25
|
+
const client = new Client({ name: "lisa", version: "0.1.0" }, { capabilities: {} });
|
|
26
|
+
await client.connect(transport);
|
|
27
|
+
const list = await client.listTools();
|
|
28
|
+
const tools = list.tools.map((t) => mcpToolToLisaTool(spec.name, client, t, log));
|
|
29
|
+
return {
|
|
30
|
+
spec,
|
|
31
|
+
client,
|
|
32
|
+
tools,
|
|
33
|
+
async close() {
|
|
34
|
+
try {
|
|
35
|
+
await client.close();
|
|
36
|
+
}
|
|
37
|
+
catch { }
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function mcpToolToLisaTool(serverName, client, mcpTool, log) {
|
|
42
|
+
const name = `mcp__${serverName}__${mcpTool.name}`;
|
|
43
|
+
const description = mcpTool.description
|
|
44
|
+
? `[mcp:${serverName}] ${mcpTool.description}`
|
|
45
|
+
: `[mcp:${serverName}] ${mcpTool.name}`;
|
|
46
|
+
return {
|
|
47
|
+
name,
|
|
48
|
+
description,
|
|
49
|
+
inputSchema: (mcpTool.inputSchema?.type === "object"
|
|
50
|
+
? mcpTool.inputSchema
|
|
51
|
+
: { type: "object", properties: {} }),
|
|
52
|
+
async execute(input) {
|
|
53
|
+
const result = await client.callTool({
|
|
54
|
+
name: mcpTool.name,
|
|
55
|
+
arguments: (input ?? {}),
|
|
56
|
+
});
|
|
57
|
+
const content = result.content ?? [];
|
|
58
|
+
const text = content
|
|
59
|
+
.map((c) => (c.type === "text" ? c.text ?? "" : `[${c.type}]`))
|
|
60
|
+
.join("\n");
|
|
61
|
+
if (result.isError) {
|
|
62
|
+
log(`[mcp] ${name} returned isError`);
|
|
63
|
+
}
|
|
64
|
+
return text || "(empty)";
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface McpServerSpec {
|
|
2
|
+
name: string;
|
|
3
|
+
command: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
alwaysLoad?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface McpConfig {
|
|
10
|
+
mcpServers: Record<string, Omit<McpServerSpec, "name">>;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadMcpConfig(): Promise<McpServerSpec[]>;
|
|
13
|
+
export declare const MCP_CONFIG_PATH: string;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD;AAID,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB9D;AAED,eAAO,MAAM,eAAe,QAAc,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { LISA_HOME } from "../paths.js";
|
|
4
|
+
import { pathExists } from "../fs-utils.js";
|
|
5
|
+
const CONFIG_PATH = path.join(LISA_HOME, "mcp.json");
|
|
6
|
+
export async function loadMcpConfig() {
|
|
7
|
+
if (!(await pathExists(CONFIG_PATH)))
|
|
8
|
+
return [];
|
|
9
|
+
const raw = await fs.readFile(CONFIG_PATH, "utf8");
|
|
10
|
+
let config;
|
|
11
|
+
try {
|
|
12
|
+
config = JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw new Error(`failed to parse ${CONFIG_PATH}: ${err.message}`);
|
|
16
|
+
}
|
|
17
|
+
const servers = config.mcpServers ?? {};
|
|
18
|
+
return Object.entries(servers).map(([name, spec]) => ({
|
|
19
|
+
name,
|
|
20
|
+
command: spec.command,
|
|
21
|
+
args: spec.args ?? [],
|
|
22
|
+
env: spec.env,
|
|
23
|
+
enabled: spec.enabled ?? true,
|
|
24
|
+
alwaysLoad: spec.alwaysLoad ?? false,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export const MCP_CONFIG_PATH = CONFIG_PATH;
|
|
28
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAe5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,MAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,WAAW,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK;KACrC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC"}
|