@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,98 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
import { SESSIONS_DIR } from "../paths.js";
|
|
5
|
+
import { appendLine, ensureDir } from "../fs-utils.js";
|
|
6
|
+
export class SessionStore {
|
|
7
|
+
id;
|
|
8
|
+
path;
|
|
9
|
+
header;
|
|
10
|
+
constructor(id, file, header) {
|
|
11
|
+
this.id = id;
|
|
12
|
+
this.path = file;
|
|
13
|
+
this.header = header;
|
|
14
|
+
}
|
|
15
|
+
static async open(id) {
|
|
16
|
+
const file = path.join(SESSIONS_DIR, `${id}.jsonl`);
|
|
17
|
+
const raw = await fs.readFile(file, "utf8");
|
|
18
|
+
const lines = raw.split("\n").filter(Boolean);
|
|
19
|
+
if (lines.length === 0)
|
|
20
|
+
throw new Error(`session ${id} is empty`);
|
|
21
|
+
const header = JSON.parse(lines[0]);
|
|
22
|
+
return new SessionStore(id, file, header);
|
|
23
|
+
}
|
|
24
|
+
static async create(opts) {
|
|
25
|
+
await ensureDir(SESSIONS_DIR);
|
|
26
|
+
const id = `${stamp()}-${crypto.randomBytes(3).toString("hex")}`;
|
|
27
|
+
const file = path.join(SESSIONS_DIR, `${id}.jsonl`);
|
|
28
|
+
const header = {
|
|
29
|
+
type: "session",
|
|
30
|
+
id,
|
|
31
|
+
version: 1,
|
|
32
|
+
startedAt: new Date().toISOString(),
|
|
33
|
+
cwd: opts.cwd,
|
|
34
|
+
model: opts.model,
|
|
35
|
+
};
|
|
36
|
+
await appendLine(file, JSON.stringify(header));
|
|
37
|
+
return new SessionStore(id, file, header);
|
|
38
|
+
}
|
|
39
|
+
async appendMessage(message) {
|
|
40
|
+
const entry = {
|
|
41
|
+
type: "message",
|
|
42
|
+
ts: new Date().toISOString(),
|
|
43
|
+
message,
|
|
44
|
+
};
|
|
45
|
+
await appendLine(this.path, JSON.stringify(entry));
|
|
46
|
+
}
|
|
47
|
+
async appendReflection(summary) {
|
|
48
|
+
const entry = {
|
|
49
|
+
type: "reflection",
|
|
50
|
+
ts: new Date().toISOString(),
|
|
51
|
+
summary,
|
|
52
|
+
};
|
|
53
|
+
await appendLine(this.path, JSON.stringify(entry));
|
|
54
|
+
}
|
|
55
|
+
async readAll() {
|
|
56
|
+
const raw = await fs.readFile(this.path, "utf8");
|
|
57
|
+
const lines = raw.split("\n").filter(Boolean);
|
|
58
|
+
if (lines.length === 0)
|
|
59
|
+
throw new Error("empty session file");
|
|
60
|
+
const header = JSON.parse(lines[0]);
|
|
61
|
+
const entries = lines
|
|
62
|
+
.slice(1)
|
|
63
|
+
.map((line) => JSON.parse(line));
|
|
64
|
+
return { header, entries };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Read a page of message entries (newest-first within the page).
|
|
68
|
+
* page=0 = latest PAGE_SIZE messages, page=1 = older ones, etc.
|
|
69
|
+
*/
|
|
70
|
+
async readMessagePage(page, pageSize = 20) {
|
|
71
|
+
const raw = await fs.readFile(this.path, "utf8");
|
|
72
|
+
const lines = raw.split("\n").filter(Boolean).slice(1); // skip header
|
|
73
|
+
const msgLines = lines.filter((l) => {
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(l).type === "message";
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
const total = msgLines.length;
|
|
82
|
+
// newest page first: take from the end
|
|
83
|
+
const end = total - page * pageSize;
|
|
84
|
+
const start = Math.max(0, end - pageSize);
|
|
85
|
+
if (end <= 0)
|
|
86
|
+
return { messages: [], hasMore: false };
|
|
87
|
+
const slice = msgLines.slice(start, end);
|
|
88
|
+
const messages = slice.map((l) => JSON.parse(l).message);
|
|
89
|
+
return { messages, hasMore: start > 0 };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function stamp() {
|
|
93
|
+
const d = new Date();
|
|
94
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
95
|
+
return (`${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-` +
|
|
96
|
+
`${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/sessions/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../types.js";
|
|
2
|
+
export interface ApprovedRecord {
|
|
3
|
+
/** SHA256 hex of tool.js content at approval time. */
|
|
4
|
+
sha256: string;
|
|
5
|
+
/** ISO timestamp of approval. */
|
|
6
|
+
approvedAt: string;
|
|
7
|
+
/** Reviewer's tool name as it appeared in the approved source. */
|
|
8
|
+
toolName: string;
|
|
9
|
+
/** Free-form note set by the reviewer. */
|
|
10
|
+
note?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ExecutableCandidate {
|
|
13
|
+
slug: string;
|
|
14
|
+
toolJsPath: string;
|
|
15
|
+
currentSha: string;
|
|
16
|
+
approved: ApprovedRecord | null;
|
|
17
|
+
disabled: boolean;
|
|
18
|
+
/** Status the loader uses to decide whether to register. */
|
|
19
|
+
status: "approved-current" | "approved-stale" | "unapproved" | "disabled" | "missing";
|
|
20
|
+
}
|
|
21
|
+
export declare function readAudit(slug: string): Promise<string>;
|
|
22
|
+
export declare function readToolSource(slug: string): Promise<string | null>;
|
|
23
|
+
/** Discover all candidates with a tool.js, regardless of approval state. */
|
|
24
|
+
export declare function discoverExecutableSkills(): Promise<ExecutableCandidate[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Load and dynamically import every approved-current executable skill.
|
|
27
|
+
* Failure to import any one is logged but does not abort — the rest still
|
|
28
|
+
* load. Returns the list of registered tools.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadApprovedExecutableTools(log?: (msg: string) => void): Promise<ToolDefinition[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Mark a skill's current tool.js as approved by recording its SHA. Called by
|
|
33
|
+
* the `lisa skills approve` CLI subcommand AFTER the user has reviewed the
|
|
34
|
+
* source. Re-approval after a content change requires this to be called
|
|
35
|
+
* again with the new SHA.
|
|
36
|
+
*/
|
|
37
|
+
export declare function approveExecutableSkill(slug: string, opts: {
|
|
38
|
+
toolName: string;
|
|
39
|
+
note?: string;
|
|
40
|
+
}): Promise<ApprovedRecord>;
|
|
41
|
+
export declare function disableExecutableSkill(slug: string, reason?: string): Promise<void>;
|
|
42
|
+
export declare function enableExecutableSkill(slug: string): Promise<void>;
|
|
43
|
+
/** Quick text summary for the CLI / startup notice. */
|
|
44
|
+
export declare function summarizeCandidate(c: ExecutableCandidate): string;
|
|
45
|
+
//# sourceMappingURL=executable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../../src/skills/executable.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,4DAA4D;IAC5D,MAAM,EACF,kBAAkB,GAClB,gBAAgB,GAChB,YAAY,GACZ,UAAU,GACV,SAAS,CAAC;CACf;AAsCD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI7D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASzE;AAED,4EAA4E;AAC5E,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAoB/E;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GACpC,OAAO,CAAC,cAAc,EAAE,CAAC,CA4B3B;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CASjE"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executable skills (Phase 3.1 of AUTONOMY_ROADMAP).
|
|
3
|
+
*
|
|
4
|
+
* A skill at ~/.lisa/skills/<slug>/ may include an OPTIONAL tool.js file that
|
|
5
|
+
* exports a ToolDefinition. When approved, that tool is dynamically imported
|
|
6
|
+
* at startup and registered into the agent's tool list — letting Lisa extend
|
|
7
|
+
* her own capabilities (not just write down knowledge).
|
|
8
|
+
*
|
|
9
|
+
* THIS IS DANGEROUS. The tool.js runs in the same process with the same
|
|
10
|
+
* privileges as Lisa herself. Real isolation (worker_threads with capability
|
|
11
|
+
* gating, or a separate child process) is intentionally NOT implemented in
|
|
12
|
+
* this PR — getting it half-right is worse than not having it. The trust
|
|
13
|
+
* boundary is human approval per content hash:
|
|
14
|
+
*
|
|
15
|
+
* - Each registered tool is approved by content SHA256.
|
|
16
|
+
* - If the file changes, approval is invalidated until a new approval.
|
|
17
|
+
* - An audit log records every approval / disable / load event.
|
|
18
|
+
* - A `.disabled` flag forces the tool to never load.
|
|
19
|
+
*
|
|
20
|
+
* Lisa cannot self-approve. She CAN write the file (via skill_manage or fs);
|
|
21
|
+
* loading happens only after `lisa skills approve <slug>` runs interactively
|
|
22
|
+
* with the user reading the source.
|
|
23
|
+
*
|
|
24
|
+
* The TS source can ship as `tool.ts` for human reading, but only `tool.js`
|
|
25
|
+
* is loaded. We do not run a TypeScript compiler at startup; the user (or
|
|
26
|
+
* Lisa via redeploy) must produce the .js. This keeps the loader minimal.
|
|
27
|
+
*/
|
|
28
|
+
import fs from "node:fs/promises";
|
|
29
|
+
import path from "node:path";
|
|
30
|
+
import crypto from "node:crypto";
|
|
31
|
+
import { pathToFileURL } from "node:url";
|
|
32
|
+
import { atomicWrite, ensureDir, pathExists } from "../fs-utils.js";
|
|
33
|
+
import { SKILLS_DIR } from "../paths.js";
|
|
34
|
+
const TOOL_JS = "tool.js";
|
|
35
|
+
const APPROVED_FILE = "approved.json";
|
|
36
|
+
const DISABLED_FILE = ".disabled";
|
|
37
|
+
const AUDIT_FILE = "audit.log";
|
|
38
|
+
/** SHA256 hex of a file. Returns null if not present. */
|
|
39
|
+
async function shaOf(p) {
|
|
40
|
+
try {
|
|
41
|
+
const buf = await fs.readFile(p);
|
|
42
|
+
return crypto.createHash("sha256").update(buf).digest("hex");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function readApproved(slug) {
|
|
49
|
+
const f = path.join(SKILLS_DIR, slug, APPROVED_FILE);
|
|
50
|
+
if (!(await pathExists(f)))
|
|
51
|
+
return null;
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(await fs.readFile(f, "utf8"));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function writeApproved(slug, rec) {
|
|
60
|
+
await atomicWrite(path.join(SKILLS_DIR, slug, APPROVED_FILE), JSON.stringify(rec, null, 2));
|
|
61
|
+
}
|
|
62
|
+
async function isDisabled(slug) {
|
|
63
|
+
return await pathExists(path.join(SKILLS_DIR, slug, DISABLED_FILE));
|
|
64
|
+
}
|
|
65
|
+
async function appendAudit(slug, event, detail) {
|
|
66
|
+
const f = path.join(SKILLS_DIR, slug, AUDIT_FILE);
|
|
67
|
+
await ensureDir(path.dirname(f));
|
|
68
|
+
const ts = new Date().toISOString();
|
|
69
|
+
const line = `${ts}\t${event}${detail ? `\t${detail}` : ""}\n`;
|
|
70
|
+
await fs.appendFile(f, line, "utf8");
|
|
71
|
+
}
|
|
72
|
+
export async function readAudit(slug) {
|
|
73
|
+
const f = path.join(SKILLS_DIR, slug, AUDIT_FILE);
|
|
74
|
+
if (!(await pathExists(f)))
|
|
75
|
+
return "";
|
|
76
|
+
return await fs.readFile(f, "utf8");
|
|
77
|
+
}
|
|
78
|
+
export async function readToolSource(slug) {
|
|
79
|
+
// Prefer .ts if present (more readable); fall back to .js.
|
|
80
|
+
for (const name of ["tool.ts", TOOL_JS]) {
|
|
81
|
+
const p = path.join(SKILLS_DIR, slug, name);
|
|
82
|
+
if (await pathExists(p)) {
|
|
83
|
+
return await fs.readFile(p, "utf8");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/** Discover all candidates with a tool.js, regardless of approval state. */
|
|
89
|
+
export async function discoverExecutableSkills() {
|
|
90
|
+
if (!(await pathExists(SKILLS_DIR)))
|
|
91
|
+
return [];
|
|
92
|
+
const entries = await fs.readdir(SKILLS_DIR, { withFileTypes: true });
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const e of entries) {
|
|
95
|
+
if (!e.isDirectory() || e.name.startsWith("."))
|
|
96
|
+
continue;
|
|
97
|
+
const slug = e.name;
|
|
98
|
+
const toolJsPath = path.join(SKILLS_DIR, slug, TOOL_JS);
|
|
99
|
+
const currentShaMaybe = await shaOf(toolJsPath);
|
|
100
|
+
if (!currentShaMaybe)
|
|
101
|
+
continue; // no tool.js — not an executable skill
|
|
102
|
+
const approved = await readApproved(slug);
|
|
103
|
+
const disabled = await isDisabled(slug);
|
|
104
|
+
let status;
|
|
105
|
+
if (disabled)
|
|
106
|
+
status = "disabled";
|
|
107
|
+
else if (!approved)
|
|
108
|
+
status = "unapproved";
|
|
109
|
+
else if (approved.sha256 === currentShaMaybe)
|
|
110
|
+
status = "approved-current";
|
|
111
|
+
else
|
|
112
|
+
status = "approved-stale";
|
|
113
|
+
out.push({ slug, toolJsPath, currentSha: currentShaMaybe, approved, disabled, status });
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Load and dynamically import every approved-current executable skill.
|
|
119
|
+
* Failure to import any one is logged but does not abort — the rest still
|
|
120
|
+
* load. Returns the list of registered tools.
|
|
121
|
+
*/
|
|
122
|
+
export async function loadApprovedExecutableTools(log = () => { }) {
|
|
123
|
+
const candidates = await discoverExecutableSkills();
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const c of candidates) {
|
|
126
|
+
if (c.status !== "approved-current")
|
|
127
|
+
continue;
|
|
128
|
+
try {
|
|
129
|
+
const url = pathToFileURL(c.toolJsPath).href;
|
|
130
|
+
// Dynamic import. The bust query only runs on first load; we're fine.
|
|
131
|
+
const mod = (await import(url));
|
|
132
|
+
const tool = mod.tool;
|
|
133
|
+
if (!tool || typeof tool !== "object") {
|
|
134
|
+
log(`[skills] ${c.slug}: tool.js does not export "tool" — skipped`);
|
|
135
|
+
await appendAudit(c.slug, "load_failed", "no tool export");
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (!tool.name || !tool.description || !tool.execute) {
|
|
139
|
+
log(`[skills] ${c.slug}: exported tool missing name/description/execute — skipped`);
|
|
140
|
+
await appendAudit(c.slug, "load_failed", "incomplete tool shape");
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
out.push(tool);
|
|
144
|
+
await appendAudit(c.slug, "loaded", `sha=${c.currentSha.slice(0, 12)} name=${tool.name}`);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
log(`[skills] ${c.slug}: import failed — ${err.message}`);
|
|
148
|
+
await appendAudit(c.slug, "load_failed", err.message.slice(0, 200));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Mark a skill's current tool.js as approved by recording its SHA. Called by
|
|
155
|
+
* the `lisa skills approve` CLI subcommand AFTER the user has reviewed the
|
|
156
|
+
* source. Re-approval after a content change requires this to be called
|
|
157
|
+
* again with the new SHA.
|
|
158
|
+
*/
|
|
159
|
+
export async function approveExecutableSkill(slug, opts) {
|
|
160
|
+
const toolJsPath = path.join(SKILLS_DIR, slug, TOOL_JS);
|
|
161
|
+
const sha = await shaOf(toolJsPath);
|
|
162
|
+
if (!sha)
|
|
163
|
+
throw new Error(`no tool.js found at ${toolJsPath}`);
|
|
164
|
+
const rec = {
|
|
165
|
+
sha256: sha,
|
|
166
|
+
approvedAt: new Date().toISOString(),
|
|
167
|
+
toolName: opts.toolName,
|
|
168
|
+
note: opts.note,
|
|
169
|
+
};
|
|
170
|
+
await writeApproved(slug, rec);
|
|
171
|
+
// Re-enable on approval if a stale .disabled flag is present.
|
|
172
|
+
const disPath = path.join(SKILLS_DIR, slug, DISABLED_FILE);
|
|
173
|
+
if (await pathExists(disPath)) {
|
|
174
|
+
await fs.rm(disPath, { force: true });
|
|
175
|
+
await appendAudit(slug, "re_enabled");
|
|
176
|
+
}
|
|
177
|
+
await appendAudit(slug, "approved", `sha=${sha.slice(0, 12)} name=${opts.toolName}`);
|
|
178
|
+
return rec;
|
|
179
|
+
}
|
|
180
|
+
export async function disableExecutableSkill(slug, reason) {
|
|
181
|
+
const dir = path.join(SKILLS_DIR, slug);
|
|
182
|
+
if (!(await pathExists(dir)))
|
|
183
|
+
throw new Error(`skill "${slug}" not found`);
|
|
184
|
+
await ensureDir(dir);
|
|
185
|
+
await fs.writeFile(path.join(dir, DISABLED_FILE), `${new Date().toISOString()}\n${reason ?? ""}\n`);
|
|
186
|
+
await appendAudit(slug, "disabled", reason);
|
|
187
|
+
}
|
|
188
|
+
export async function enableExecutableSkill(slug) {
|
|
189
|
+
const dir = path.join(SKILLS_DIR, slug);
|
|
190
|
+
const f = path.join(dir, DISABLED_FILE);
|
|
191
|
+
if (await pathExists(f)) {
|
|
192
|
+
await fs.rm(f, { force: true });
|
|
193
|
+
await appendAudit(slug, "enabled");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Quick text summary for the CLI / startup notice. */
|
|
197
|
+
export function summarizeCandidate(c) {
|
|
198
|
+
const tag = {
|
|
199
|
+
"approved-current": "✓ loaded",
|
|
200
|
+
"approved-stale": "✗ stale (re-approve)",
|
|
201
|
+
"unapproved": "✗ unapproved",
|
|
202
|
+
"disabled": "✗ disabled",
|
|
203
|
+
"missing": "✗ missing",
|
|
204
|
+
}[c.status];
|
|
205
|
+
return ` ${c.slug.padEnd(28)} ${tag} sha=${c.currentSha.slice(0, 12)}`;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=executable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable.js","sourceRoot":"","sources":["../../src/skills/executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,MAAM,UAAU,GAAG,WAAW,CAAC;AA4B/B,yDAAyD;AACzD,KAAK,UAAU,KAAK,CAAC,CAAS;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAmB,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,GAAmB;IAC5D,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa,EAAE,MAAe;IACrE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC/D,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,2DAA2D;IAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACzD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,eAAe;YAAE,SAAS,CAAC,uCAAuC;QACvE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAqC,CAAC;QAC1C,IAAI,QAAQ;YAAE,MAAM,GAAG,UAAU,CAAC;aAC7B,IAAI,CAAC,QAAQ;YAAE,MAAM,GAAG,YAAY,CAAC;aACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,eAAe;YAAE,MAAM,GAAG,kBAAkB,CAAC;;YACrE,MAAM,GAAG,gBAAgB,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAA6B,GAAG,EAAE,GAAE,CAAC;IAErC,MAAM,UAAU,GAAG,MAAM,wBAAwB,EAAE,CAAC;IACpD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB;YAAE,SAAS;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC7C,sEAAsE;YACtE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAA8B,CAAC;YAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,4CAA4C,CAAC,CAAC;gBACpE,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrD,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,4DAA4D,CAAC,CAAC;gBACpF,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,uBAAuB,CAAC,CAAC;gBAClE,SAAS;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,EAAG,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,IAAyC;IAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAmB;QAC1B,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IACF,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,8DAA8D;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,MAAe;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;IAC3E,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC;IACpG,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACxC,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,MAAM,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,CAAsB;IACvD,MAAM,GAAG,GAAG;QACV,kBAAkB,EAAE,UAAU;QAC9B,gBAAgB,EAAI,sBAAsB;QAC1C,YAAY,EAAQ,cAAc;QAClC,UAAU,EAAU,YAAY;QAChC,SAAS,EAAW,WAAW;KAChC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SkillFrontmatter } from "../types.js";
|
|
2
|
+
export interface ParsedFrontmatter {
|
|
3
|
+
frontmatter: SkillFrontmatter;
|
|
4
|
+
body: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function parseFrontmatter(raw: string): ParsedFrontmatter | null;
|
|
7
|
+
export declare function buildFrontmatter(fm: SkillFrontmatter, body: string): string;
|
|
8
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/skills/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmBtE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3E"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const FENCE = "---";
|
|
2
|
+
export function parseFrontmatter(raw) {
|
|
3
|
+
if (!raw.startsWith(FENCE))
|
|
4
|
+
return null;
|
|
5
|
+
const end = raw.indexOf(`\n${FENCE}`, FENCE.length);
|
|
6
|
+
if (end < 0)
|
|
7
|
+
return null;
|
|
8
|
+
const yamlBlock = raw.slice(FENCE.length, end).trim();
|
|
9
|
+
const body = raw.slice(end + FENCE.length + 1).replace(/^\n/, "");
|
|
10
|
+
const fm = parseSimpleYaml(yamlBlock);
|
|
11
|
+
if (typeof fm.name !== "string" || typeof fm.description !== "string") {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const frontmatter = {
|
|
15
|
+
name: fm.name,
|
|
16
|
+
description: fm.description,
|
|
17
|
+
version: typeof fm.version === "string" ? fm.version : undefined,
|
|
18
|
+
tags: Array.isArray(fm.tags)
|
|
19
|
+
? fm.tags.filter((t) => typeof t === "string")
|
|
20
|
+
: undefined,
|
|
21
|
+
};
|
|
22
|
+
return { frontmatter, body };
|
|
23
|
+
}
|
|
24
|
+
export function buildFrontmatter(fm, body) {
|
|
25
|
+
const lines = [FENCE];
|
|
26
|
+
lines.push(`name: ${escapeScalar(fm.name)}`);
|
|
27
|
+
lines.push(`description: ${escapeScalar(fm.description)}`);
|
|
28
|
+
if (fm.version)
|
|
29
|
+
lines.push(`version: ${escapeScalar(fm.version)}`);
|
|
30
|
+
if (fm.tags && fm.tags.length > 0) {
|
|
31
|
+
lines.push(`tags: [${fm.tags.map(escapeScalar).join(", ")}]`);
|
|
32
|
+
}
|
|
33
|
+
lines.push(FENCE, "");
|
|
34
|
+
return lines.join("\n") + body.replace(/^\n+/, "");
|
|
35
|
+
}
|
|
36
|
+
function escapeScalar(s) {
|
|
37
|
+
if (/^[A-Za-z0-9._-]+$/.test(s))
|
|
38
|
+
return s;
|
|
39
|
+
return JSON.stringify(s);
|
|
40
|
+
}
|
|
41
|
+
function parseSimpleYaml(yaml) {
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const rawLine of yaml.split(/\r?\n/)) {
|
|
44
|
+
const line = rawLine.trimEnd();
|
|
45
|
+
if (!line || line.startsWith("#"))
|
|
46
|
+
continue;
|
|
47
|
+
const colon = line.indexOf(":");
|
|
48
|
+
if (colon < 0)
|
|
49
|
+
continue;
|
|
50
|
+
const key = line.slice(0, colon).trim();
|
|
51
|
+
const valueRaw = line.slice(colon + 1).trim();
|
|
52
|
+
out[key] = parseYamlValue(valueRaw);
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
function parseYamlValue(raw) {
|
|
57
|
+
if (raw === "")
|
|
58
|
+
return "";
|
|
59
|
+
if (raw === "true")
|
|
60
|
+
return true;
|
|
61
|
+
if (raw === "false")
|
|
62
|
+
return false;
|
|
63
|
+
if (raw === "null" || raw === "~")
|
|
64
|
+
return null;
|
|
65
|
+
if (raw.startsWith("[") && raw.endsWith("]")) {
|
|
66
|
+
const inner = raw.slice(1, -1).trim();
|
|
67
|
+
if (!inner)
|
|
68
|
+
return [];
|
|
69
|
+
return inner.split(",").map((part) => parseYamlValue(part.trim()));
|
|
70
|
+
}
|
|
71
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) ||
|
|
72
|
+
(raw.startsWith("'") && raw.endsWith("'"))) {
|
|
73
|
+
try {
|
|
74
|
+
return JSON.parse(raw.replaceAll("'", '"'));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return raw.slice(1, -1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (/^-?\d+(?:\.\d+)?$/.test(raw))
|
|
81
|
+
return Number(raw);
|
|
82
|
+
return raw;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/skills/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Skill, SkillFrontmatter } from "../types.js";
|
|
2
|
+
export declare function validateSkillName(name: string): void;
|
|
3
|
+
export declare function listSkills(): Promise<Skill[]>;
|
|
4
|
+
export declare function getSkill(name: string): Promise<Skill | null>;
|
|
5
|
+
export declare function createSkill(fm: SkillFrontmatter, body: string): Promise<Skill>;
|
|
6
|
+
export declare function patchSkill(name: string, oldString: string, newString: string): Promise<Skill>;
|
|
7
|
+
export declare function rewriteSkill(name: string, body: string, description?: string): Promise<Skill>;
|
|
8
|
+
export declare function deleteSkill(name: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/skills/manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAa3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAgBnD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAOlE;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,gBAAgB,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,CAAC,CAYhB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC,CAyBhB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,KAAK,CAAC,CAchB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { SKILLS_DIR } from "../paths.js";
|
|
4
|
+
import { atomicWrite, ensureDir, pathExists } from "../fs-utils.js";
|
|
5
|
+
import { buildFrontmatter, parseFrontmatter } from "./frontmatter.js";
|
|
6
|
+
const VALID_NAME = /^[a-z0-9][a-z0-9-]{0,62}$/;
|
|
7
|
+
function skillDir(name) {
|
|
8
|
+
return path.join(SKILLS_DIR, name);
|
|
9
|
+
}
|
|
10
|
+
function skillFile(name) {
|
|
11
|
+
return path.join(skillDir(name), "SKILL.md");
|
|
12
|
+
}
|
|
13
|
+
export function validateSkillName(name) {
|
|
14
|
+
if (!VALID_NAME.test(name)) {
|
|
15
|
+
throw new Error(`invalid skill name "${name}": must be lowercase letters, digits, hyphens (max 63 chars)`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function listSkills() {
|
|
19
|
+
await ensureDir(SKILLS_DIR);
|
|
20
|
+
const entries = await fs.readdir(SKILLS_DIR, { withFileTypes: true });
|
|
21
|
+
const out = [];
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (!entry.isDirectory() || entry.name.startsWith("."))
|
|
24
|
+
continue;
|
|
25
|
+
const file = skillFile(entry.name);
|
|
26
|
+
if (!(await pathExists(file)))
|
|
27
|
+
continue;
|
|
28
|
+
const raw = await fs.readFile(file, "utf8");
|
|
29
|
+
const parsed = parseFrontmatter(raw);
|
|
30
|
+
if (!parsed)
|
|
31
|
+
continue;
|
|
32
|
+
if (parsed.frontmatter.name !== entry.name)
|
|
33
|
+
continue;
|
|
34
|
+
out.push({ ...parsed, path: file });
|
|
35
|
+
}
|
|
36
|
+
out.sort((a, b) => a.frontmatter.name.localeCompare(b.frontmatter.name));
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
export async function getSkill(name) {
|
|
40
|
+
const file = skillFile(name);
|
|
41
|
+
if (!(await pathExists(file)))
|
|
42
|
+
return null;
|
|
43
|
+
const raw = await fs.readFile(file, "utf8");
|
|
44
|
+
const parsed = parseFrontmatter(raw);
|
|
45
|
+
if (!parsed)
|
|
46
|
+
return null;
|
|
47
|
+
return { ...parsed, path: file };
|
|
48
|
+
}
|
|
49
|
+
export async function createSkill(fm, body) {
|
|
50
|
+
validateSkillName(fm.name);
|
|
51
|
+
if (fm.description.length > 1024) {
|
|
52
|
+
throw new Error("skill description too long (max 1024 chars)");
|
|
53
|
+
}
|
|
54
|
+
const file = skillFile(fm.name);
|
|
55
|
+
if (await pathExists(file)) {
|
|
56
|
+
throw new Error(`skill "${fm.name}" already exists`);
|
|
57
|
+
}
|
|
58
|
+
const content = buildFrontmatter(fm, body.endsWith("\n") ? body : body + "\n");
|
|
59
|
+
await atomicWrite(file, content);
|
|
60
|
+
return { frontmatter: fm, body, path: file };
|
|
61
|
+
}
|
|
62
|
+
export async function patchSkill(name, oldString, newString) {
|
|
63
|
+
validateSkillName(name);
|
|
64
|
+
const existing = await getSkill(name);
|
|
65
|
+
if (!existing)
|
|
66
|
+
throw new Error(`skill "${name}" not found`);
|
|
67
|
+
if (oldString === newString) {
|
|
68
|
+
throw new Error("old_string and new_string are identical");
|
|
69
|
+
}
|
|
70
|
+
const occurrences = countOccurrences(existing.body, oldString);
|
|
71
|
+
if (occurrences === 0) {
|
|
72
|
+
throw new Error(`old_string not found in skill "${name}". Use skill_view to inspect current content.`);
|
|
73
|
+
}
|
|
74
|
+
if (occurrences > 1) {
|
|
75
|
+
throw new Error(`old_string matches ${occurrences} places in skill "${name}". Provide more context to disambiguate.`);
|
|
76
|
+
}
|
|
77
|
+
const newBody = existing.body.replace(oldString, newString);
|
|
78
|
+
const content = buildFrontmatter(existing.frontmatter, newBody.endsWith("\n") ? newBody : newBody + "\n");
|
|
79
|
+
await atomicWrite(existing.path, content);
|
|
80
|
+
return { ...existing, body: newBody };
|
|
81
|
+
}
|
|
82
|
+
export async function rewriteSkill(name, body, description) {
|
|
83
|
+
validateSkillName(name);
|
|
84
|
+
const existing = await getSkill(name);
|
|
85
|
+
if (!existing)
|
|
86
|
+
throw new Error(`skill "${name}" not found`);
|
|
87
|
+
const fm = {
|
|
88
|
+
...existing.frontmatter,
|
|
89
|
+
description: description ?? existing.frontmatter.description,
|
|
90
|
+
};
|
|
91
|
+
if (fm.description.length > 1024) {
|
|
92
|
+
throw new Error("skill description too long (max 1024 chars)");
|
|
93
|
+
}
|
|
94
|
+
const content = buildFrontmatter(fm, body.endsWith("\n") ? body : body + "\n");
|
|
95
|
+
await atomicWrite(existing.path, content);
|
|
96
|
+
return { frontmatter: fm, body, path: existing.path };
|
|
97
|
+
}
|
|
98
|
+
export async function deleteSkill(name) {
|
|
99
|
+
validateSkillName(name);
|
|
100
|
+
const dir = skillDir(name);
|
|
101
|
+
if (!(await pathExists(dir)))
|
|
102
|
+
throw new Error(`skill "${name}" not found`);
|
|
103
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
function countOccurrences(haystack, needle) {
|
|
106
|
+
if (!needle)
|
|
107
|
+
return 0;
|
|
108
|
+
let count = 0;
|
|
109
|
+
let idx = 0;
|
|
110
|
+
while ((idx = haystack.indexOf(needle, idx)) !== -1) {
|
|
111
|
+
count++;
|
|
112
|
+
idx += needle.length;
|
|
113
|
+
}
|
|
114
|
+
return count;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/skills/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../types.js";
|
|
2
|
+
interface SkillManageInput {
|
|
3
|
+
action: "list" | "view" | "create" | "patch" | "rewrite" | "delete";
|
|
4
|
+
name?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
body?: string;
|
|
7
|
+
old_string?: string;
|
|
8
|
+
new_string?: string;
|
|
9
|
+
tags?: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare const skillManageTool: ToolDefinition<SkillManageInput, string>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/skills/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,gBAAgB,EAAE,MAAM,CAuFpE,CAAC"}
|