zerg-ztc 0.1.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/README.md +361 -0
- package/dist/App.d.ts +4 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +499 -0
- package/dist/App.js.map +1 -0
- package/dist/agent/agent.d.ts +54 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +347 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/backends/anthropic.d.ts +13 -0
- package/dist/agent/backends/anthropic.d.ts.map +1 -0
- package/dist/agent/backends/anthropic.js +54 -0
- package/dist/agent/backends/anthropic.js.map +1 -0
- package/dist/agent/backends/gemini.d.ts +13 -0
- package/dist/agent/backends/gemini.d.ts.map +1 -0
- package/dist/agent/backends/gemini.js +71 -0
- package/dist/agent/backends/gemini.js.map +1 -0
- package/dist/agent/backends/inception.d.ts +12 -0
- package/dist/agent/backends/inception.d.ts.map +1 -0
- package/dist/agent/backends/inception.js +15 -0
- package/dist/agent/backends/inception.js.map +1 -0
- package/dist/agent/backends/index.d.ts +7 -0
- package/dist/agent/backends/index.d.ts.map +1 -0
- package/dist/agent/backends/index.js +6 -0
- package/dist/agent/backends/index.js.map +1 -0
- package/dist/agent/backends/openai.d.ts +12 -0
- package/dist/agent/backends/openai.d.ts.map +1 -0
- package/dist/agent/backends/openai.js +15 -0
- package/dist/agent/backends/openai.js.map +1 -0
- package/dist/agent/backends/openai_compatible.d.ts +17 -0
- package/dist/agent/backends/openai_compatible.d.ts.map +1 -0
- package/dist/agent/backends/openai_compatible.js +95 -0
- package/dist/agent/backends/openai_compatible.js.map +1 -0
- package/dist/agent/backends/types.d.ts +49 -0
- package/dist/agent/backends/types.d.ts.map +1 -0
- package/dist/agent/backends/types.js +2 -0
- package/dist/agent/backends/types.js.map +1 -0
- package/dist/agent/commands/clipboard.d.ts +3 -0
- package/dist/agent/commands/clipboard.d.ts.map +1 -0
- package/dist/agent/commands/clipboard.js +72 -0
- package/dist/agent/commands/clipboard.js.map +1 -0
- package/dist/agent/commands/config.d.ts +3 -0
- package/dist/agent/commands/config.d.ts.map +1 -0
- package/dist/agent/commands/config.js +120 -0
- package/dist/agent/commands/config.js.map +1 -0
- package/dist/agent/commands/debug.d.ts +3 -0
- package/dist/agent/commands/debug.d.ts.map +1 -0
- package/dist/agent/commands/debug.js +23 -0
- package/dist/agent/commands/debug.js.map +1 -0
- package/dist/agent/commands/emulation.d.ts +3 -0
- package/dist/agent/commands/emulation.d.ts.map +1 -0
- package/dist/agent/commands/emulation.js +78 -0
- package/dist/agent/commands/emulation.js.map +1 -0
- package/dist/agent/commands/execution.d.ts +3 -0
- package/dist/agent/commands/execution.d.ts.map +1 -0
- package/dist/agent/commands/execution.js +8 -0
- package/dist/agent/commands/execution.js.map +1 -0
- package/dist/agent/commands/help.d.ts +3 -0
- package/dist/agent/commands/help.d.ts.map +1 -0
- package/dist/agent/commands/help.js +19 -0
- package/dist/agent/commands/help.js.map +1 -0
- package/dist/agent/commands/history.d.ts +3 -0
- package/dist/agent/commands/history.d.ts.map +1 -0
- package/dist/agent/commands/history.js +12 -0
- package/dist/agent/commands/history.js.map +1 -0
- package/dist/agent/commands/index.d.ts +4 -0
- package/dist/agent/commands/index.d.ts.map +1 -0
- package/dist/agent/commands/index.js +19 -0
- package/dist/agent/commands/index.js.map +1 -0
- package/dist/agent/commands/model.d.ts +3 -0
- package/dist/agent/commands/model.d.ts.map +1 -0
- package/dist/agent/commands/model.js +10 -0
- package/dist/agent/commands/model.js.map +1 -0
- package/dist/agent/commands/models.d.ts +3 -0
- package/dist/agent/commands/models.d.ts.map +1 -0
- package/dist/agent/commands/models.js +110 -0
- package/dist/agent/commands/models.js.map +1 -0
- package/dist/agent/commands/permissions.d.ts +3 -0
- package/dist/agent/commands/permissions.d.ts.map +1 -0
- package/dist/agent/commands/permissions.js +58 -0
- package/dist/agent/commands/permissions.js.map +1 -0
- package/dist/agent/commands/retry.d.ts +3 -0
- package/dist/agent/commands/retry.d.ts.map +1 -0
- package/dist/agent/commands/retry.js +8 -0
- package/dist/agent/commands/retry.js.map +1 -0
- package/dist/agent/commands/shell.d.ts +4 -0
- package/dist/agent/commands/shell.d.ts.map +1 -0
- package/dist/agent/commands/shell.js +66 -0
- package/dist/agent/commands/shell.js.map +1 -0
- package/dist/agent/commands/skills.d.ts +3 -0
- package/dist/agent/commands/skills.d.ts.map +1 -0
- package/dist/agent/commands/skills.js +50 -0
- package/dist/agent/commands/skills.js.map +1 -0
- package/dist/agent/commands/status.d.ts +3 -0
- package/dist/agent/commands/status.d.ts.map +1 -0
- package/dist/agent/commands/status.js +18 -0
- package/dist/agent/commands/status.js.map +1 -0
- package/dist/agent/commands/types.d.ts +70 -0
- package/dist/agent/commands/types.d.ts.map +1 -0
- package/dist/agent/commands/types.js +2 -0
- package/dist/agent/commands/types.js.map +1 -0
- package/dist/agent/factory.d.ts +13 -0
- package/dist/agent/factory.d.ts.map +1 -0
- package/dist/agent/factory.js +46 -0
- package/dist/agent/factory.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +10 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/runtime/capabilities.d.ts +7 -0
- package/dist/agent/runtime/capabilities.d.ts.map +1 -0
- package/dist/agent/runtime/capabilities.js +8 -0
- package/dist/agent/runtime/capabilities.js.map +1 -0
- package/dist/agent/runtime/memory.d.ts +13 -0
- package/dist/agent/runtime/memory.d.ts.map +1 -0
- package/dist/agent/runtime/memory.js +13 -0
- package/dist/agent/runtime/memory.js.map +1 -0
- package/dist/agent/runtime/policy.d.ts +22 -0
- package/dist/agent/runtime/policy.d.ts.map +1 -0
- package/dist/agent/runtime/policy.js +29 -0
- package/dist/agent/runtime/policy.js.map +1 -0
- package/dist/agent/runtime/session.d.ts +11 -0
- package/dist/agent/runtime/session.d.ts.map +1 -0
- package/dist/agent/runtime/session.js +10 -0
- package/dist/agent/runtime/session.js.map +1 -0
- package/dist/agent/runtime/tracing.d.ts +13 -0
- package/dist/agent/runtime/tracing.d.ts.map +1 -0
- package/dist/agent/runtime/tracing.js +6 -0
- package/dist/agent/runtime/tracing.js.map +1 -0
- package/dist/agent/tools/file.d.ts +5 -0
- package/dist/agent/tools/file.d.ts.map +1 -0
- package/dist/agent/tools/file.js +162 -0
- package/dist/agent/tools/file.js.map +1 -0
- package/dist/agent/tools/index.d.ts +13 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +34 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/search.d.ts +3 -0
- package/dist/agent/tools/search.d.ts.map +1 -0
- package/dist/agent/tools/search.js +124 -0
- package/dist/agent/tools/search.js.map +1 -0
- package/dist/agent/tools/shell.d.ts +3 -0
- package/dist/agent/tools/shell.d.ts.map +1 -0
- package/dist/agent/tools/shell.js +60 -0
- package/dist/agent/tools/shell.js.map +1 -0
- package/dist/agent/tools/skills.d.ts +3 -0
- package/dist/agent/tools/skills.d.ts.map +1 -0
- package/dist/agent/tools/skills.js +27 -0
- package/dist/agent/tools/skills.js.map +1 -0
- package/dist/agent/tools/types.d.ts +8 -0
- package/dist/agent/tools/types.d.ts.map +1 -0
- package/dist/agent/tools/types.js +2 -0
- package/dist/agent/tools/types.js.map +1 -0
- package/dist/agent/tools/zerg.d.ts +3 -0
- package/dist/agent/tools/zerg.d.ts.map +1 -0
- package/dist/agent/tools/zerg.js +47 -0
- package/dist/agent/tools/zerg.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/FullScreen.d.ts +28 -0
- package/dist/components/FullScreen.d.ts.map +1 -0
- package/dist/components/FullScreen.js +40 -0
- package/dist/components/FullScreen.js.map +1 -0
- package/dist/components/Header.d.ts +10 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +14 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/InputArea.d.ts +24 -0
- package/dist/components/InputArea.d.ts.map +1 -0
- package/dist/components/InputArea.js +476 -0
- package/dist/components/InputArea.js.map +1 -0
- package/dist/components/MessageList.d.ts +12 -0
- package/dist/components/MessageList.d.ts.map +1 -0
- package/dist/components/MessageList.js +9 -0
- package/dist/components/MessageList.js.map +1 -0
- package/dist/components/StatusBar.d.ts +18 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +21 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +7 -0
- package/dist/components/index.js.map +1 -0
- package/dist/config/types.d.ts +12 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +155 -0
- package/dist/config.js.map +1 -0
- package/dist/debug/logger.d.ts +2 -0
- package/dist/debug/logger.d.ts.map +1 -0
- package/dist/debug/logger.js +15 -0
- package/dist/debug/logger.js.map +1 -0
- package/dist/emulation/catalog.d.ts +4 -0
- package/dist/emulation/catalog.d.ts.map +1 -0
- package/dist/emulation/catalog.js +68 -0
- package/dist/emulation/catalog.js.map +1 -0
- package/dist/emulation/trace_style.d.ts +3 -0
- package/dist/emulation/trace_style.d.ts.map +1 -0
- package/dist/emulation/trace_style.js +10 -0
- package/dist/emulation/trace_style.js.map +1 -0
- package/dist/emulation/types.d.ts +8 -0
- package/dist/emulation/types.d.ts.map +1 -0
- package/dist/emulation/types.js +2 -0
- package/dist/emulation/types.js.map +1 -0
- package/dist/skills/index.d.ts +5 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +36 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +3 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +137 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +3 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +5 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/types.d.ts +11 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/core/factory.d.ts +4 -0
- package/dist/ui/core/factory.d.ts.map +1 -0
- package/dist/ui/core/factory.js +7 -0
- package/dist/ui/core/factory.js.map +1 -0
- package/dist/ui/core/index.d.ts +5 -0
- package/dist/ui/core/index.d.ts.map +1 -0
- package/dist/ui/core/index.js +4 -0
- package/dist/ui/core/index.js.map +1 -0
- package/dist/ui/core/input.d.ts +22 -0
- package/dist/ui/core/input.d.ts.map +1 -0
- package/dist/ui/core/input.js +15 -0
- package/dist/ui/core/input.js.map +1 -0
- package/dist/ui/core/input_segments.d.ts +19 -0
- package/dist/ui/core/input_segments.d.ts.map +1 -0
- package/dist/ui/core/input_segments.js +367 -0
- package/dist/ui/core/input_segments.js.map +1 -0
- package/dist/ui/core/input_state.d.ts +24 -0
- package/dist/ui/core/input_state.d.ts.map +1 -0
- package/dist/ui/core/input_state.js +2 -0
- package/dist/ui/core/input_state.js.map +1 -0
- package/dist/ui/core/layout_yoga.d.ts +11 -0
- package/dist/ui/core/layout_yoga.d.ts.map +1 -0
- package/dist/ui/core/layout_yoga.js +102 -0
- package/dist/ui/core/layout_yoga.js.map +1 -0
- package/dist/ui/core/style.d.ts +3 -0
- package/dist/ui/core/style.d.ts.map +1 -0
- package/dist/ui/core/style.js +37 -0
- package/dist/ui/core/style.js.map +1 -0
- package/dist/ui/core/types.d.ts +50 -0
- package/dist/ui/core/types.d.ts.map +1 -0
- package/dist/ui/core/types.js +2 -0
- package/dist/ui/core/types.js.map +1 -0
- package/dist/ui/ink/index.d.ts +2 -0
- package/dist/ui/ink/index.d.ts.map +1 -0
- package/dist/ui/ink/index.js +2 -0
- package/dist/ui/ink/index.js.map +1 -0
- package/dist/ui/ink/render.d.ts +6 -0
- package/dist/ui/ink/render.d.ts.map +1 -0
- package/dist/ui/ink/render.js +14 -0
- package/dist/ui/ink/render.js.map +1 -0
- package/dist/ui/views/app.d.ts +28 -0
- package/dist/ui/views/app.d.ts.map +1 -0
- package/dist/ui/views/app.js +59 -0
- package/dist/ui/views/app.js.map +1 -0
- package/dist/ui/views/header.d.ts +11 -0
- package/dist/ui/views/header.d.ts.map +1 -0
- package/dist/ui/views/header.js +28 -0
- package/dist/ui/views/header.js.map +1 -0
- package/dist/ui/views/input_area.d.ts +45 -0
- package/dist/ui/views/input_area.d.ts.map +1 -0
- package/dist/ui/views/input_area.js +183 -0
- package/dist/ui/views/input_area.js.map +1 -0
- package/dist/ui/views/message_list.d.ts +12 -0
- package/dist/ui/views/message_list.d.ts.map +1 -0
- package/dist/ui/views/message_list.js +381 -0
- package/dist/ui/views/message_list.js.map +1 -0
- package/dist/ui/views/status_bar.d.ts +18 -0
- package/dist/ui/views/status_bar.d.ts.map +1 -0
- package/dist/ui/views/status_bar.js +72 -0
- package/dist/ui/views/status_bar.js.map +1 -0
- package/dist/ui/vue/index.d.ts +5 -0
- package/dist/ui/vue/index.d.ts.map +1 -0
- package/dist/ui/vue/index.js +50 -0
- package/dist/ui/vue/index.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +39 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/clipboard_image.d.ts +2 -0
- package/dist/utils/clipboard_image.d.ts.map +1 -0
- package/dist/utils/clipboard_image.js +37 -0
- package/dist/utils/clipboard_image.js.map +1 -0
- package/dist/utils/diff.d.ts +2 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +49 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/image_preview.d.ts +2 -0
- package/dist/utils/image_preview.d.ts.map +1 -0
- package/dist/utils/image_preview.js +37 -0
- package/dist/utils/image_preview.js.map +1 -0
- package/dist/utils/models.d.ts +8 -0
- package/dist/utils/models.d.ts.map +1 -0
- package/dist/utils/models.js +85 -0
- package/dist/utils/models.js.map +1 -0
- package/dist/utils/shell.d.ts +4 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +57 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/tool_summary.d.ts +3 -0
- package/dist/utils/tool_summary.d.ts.map +1 -0
- package/dist/utils/tool_summary.js +54 -0
- package/dist/utils/tool_summary.js.map +1 -0
- package/dist/utils/tool_trace.d.ts +9 -0
- package/dist/utils/tool_trace.d.ts.map +1 -0
- package/dist/utils/tool_trace.js +183 -0
- package/dist/utils/tool_trace.js.map +1 -0
- package/package.json +41 -0
- package/src/App.tsx +576 -0
- package/src/agent/agent.ts +407 -0
- package/src/agent/backends/anthropic.ts +76 -0
- package/src/agent/backends/gemini.ts +107 -0
- package/src/agent/backends/inception.ts +23 -0
- package/src/agent/backends/index.ts +16 -0
- package/src/agent/backends/openai.ts +23 -0
- package/src/agent/backends/openai_compatible.ts +131 -0
- package/src/agent/backends/types.ts +59 -0
- package/src/agent/commands/clipboard.ts +77 -0
- package/src/agent/commands/config.ts +130 -0
- package/src/agent/commands/debug.ts +23 -0
- package/src/agent/commands/emulation.ts +80 -0
- package/src/agent/commands/execution.ts +9 -0
- package/src/agent/commands/help.ts +20 -0
- package/src/agent/commands/history.ts +13 -0
- package/src/agent/commands/index.ts +40 -0
- package/src/agent/commands/model.ts +11 -0
- package/src/agent/commands/models.ts +116 -0
- package/src/agent/commands/permissions.ts +64 -0
- package/src/agent/commands/retry.ts +9 -0
- package/src/agent/commands/shell.ts +68 -0
- package/src/agent/commands/skills.ts +54 -0
- package/src/agent/commands/status.ts +19 -0
- package/src/agent/commands/types.ts +78 -0
- package/src/agent/factory.ts +60 -0
- package/src/agent/index.ts +20 -0
- package/src/agent/runtime/capabilities.ts +6 -0
- package/src/agent/runtime/memory.ts +23 -0
- package/src/agent/runtime/policy.ts +48 -0
- package/src/agent/runtime/session.ts +18 -0
- package/src/agent/runtime/tracing.ts +23 -0
- package/src/agent/tools/file.ts +173 -0
- package/src/agent/tools/index.ts +46 -0
- package/src/agent/tools/search.ts +137 -0
- package/src/agent/tools/shell.ts +65 -0
- package/src/agent/tools/skills.ts +28 -0
- package/src/agent/tools/types.ts +10 -0
- package/src/agent/tools/zerg.ts +50 -0
- package/src/cli.tsx +80 -0
- package/src/components/FullScreen.tsx +73 -0
- package/src/components/Header.tsx +27 -0
- package/src/components/InputArea.tsx +551 -0
- package/src/components/MessageList.tsx +25 -0
- package/src/components/StatusBar.tsx +49 -0
- package/src/components/index.tsx +6 -0
- package/src/config/types.ts +11 -0
- package/src/config.ts +178 -0
- package/src/debug/logger.ts +14 -0
- package/src/emulation/README.md +24 -0
- package/src/emulation/catalog.ts +82 -0
- package/src/emulation/trace_style.ts +8 -0
- package/src/emulation/types.ts +7 -0
- package/src/skills/index.ts +36 -0
- package/src/skills/loader.ts +135 -0
- package/src/skills/registry.ts +6 -0
- package/src/skills/types.ts +10 -0
- package/src/types.ts +83 -0
- package/src/ui/README.md +44 -0
- package/src/ui/core/factory.ts +9 -0
- package/src/ui/core/index.ts +4 -0
- package/src/ui/core/input.ts +38 -0
- package/src/ui/core/input_segments.ts +375 -0
- package/src/ui/core/input_state.ts +17 -0
- package/src/ui/core/layout_yoga.ts +122 -0
- package/src/ui/core/style.ts +38 -0
- package/src/ui/core/types.ts +53 -0
- package/src/ui/ink/index.tsx +1 -0
- package/src/ui/ink/render.tsx +49 -0
- package/src/ui/views/app.ts +99 -0
- package/src/ui/views/header.ts +42 -0
- package/src/ui/views/input_area.ts +244 -0
- package/src/ui/views/message_list.ts +427 -0
- package/src/ui/views/status_bar.ts +104 -0
- package/src/ui/vue/index.ts +53 -0
- package/src/utils/clipboard.ts +39 -0
- package/src/utils/clipboard_image.ts +40 -0
- package/src/utils/diff.ts +52 -0
- package/src/utils/image_preview.ts +36 -0
- package/src/utils/models.ts +98 -0
- package/src/utils/shell.ts +63 -0
- package/src/utils/tool_summary.ts +56 -0
- package/src/utils/tool_trace.ts +206 -0
- package/tsconfig.json +22 -0
- package/vite.config.ts +363 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Command } from './types.js';
|
|
2
|
+
|
|
3
|
+
const LATEST_TAGS = ['latest', 'current', 'default'];
|
|
4
|
+
|
|
5
|
+
function pickLatestModel(models: string[]): string | null {
|
|
6
|
+
if (!models.length) return null;
|
|
7
|
+
|
|
8
|
+
const tagged = models
|
|
9
|
+
.map(name => ({ name, lower: name.toLowerCase() }))
|
|
10
|
+
.filter(entry => LATEST_TAGS.some(tag => entry.lower.includes(tag)));
|
|
11
|
+
|
|
12
|
+
if (tagged.length > 0) {
|
|
13
|
+
const sorted = tagged.sort((a, b) => {
|
|
14
|
+
const aRank = LATEST_TAGS.findIndex(tag => a.lower.includes(tag));
|
|
15
|
+
const bRank = LATEST_TAGS.findIndex(tag => b.lower.includes(tag));
|
|
16
|
+
if (aRank !== bRank) return aRank - bRank;
|
|
17
|
+
return b.name.localeCompare(a.name);
|
|
18
|
+
});
|
|
19
|
+
return sorted[0].name;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const datePattern = /(\d{4})[.-]?(\d{2})[.-]?(\d{2})/;
|
|
23
|
+
const withDates = models
|
|
24
|
+
.map(name => {
|
|
25
|
+
const match = name.match(datePattern);
|
|
26
|
+
if (!match) return null;
|
|
27
|
+
const dateValue = Number(match[1]) * 10000 + Number(match[2]) * 100 + Number(match[3]);
|
|
28
|
+
return { name, dateValue };
|
|
29
|
+
})
|
|
30
|
+
.filter((entry): entry is { name: string; dateValue: number } => !!entry);
|
|
31
|
+
|
|
32
|
+
if (withDates.length > 0) {
|
|
33
|
+
withDates.sort((a, b) => b.dateValue - a.dateValue || b.name.localeCompare(a.name));
|
|
34
|
+
return withDates[0].name;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const versionPattern = /(\d+(?:\.\d+)+|\d+)/g;
|
|
38
|
+
const withVersions = models
|
|
39
|
+
.map(name => {
|
|
40
|
+
const match = name.match(versionPattern);
|
|
41
|
+
if (!match || match.length === 0) return null;
|
|
42
|
+
const versionValue = parseFloat(match[0]);
|
|
43
|
+
return { name, versionValue };
|
|
44
|
+
})
|
|
45
|
+
.filter((entry): entry is { name: string; versionValue: number } => !!entry);
|
|
46
|
+
|
|
47
|
+
if (withVersions.length > 0) {
|
|
48
|
+
withVersions.sort((a, b) => b.versionValue - a.versionValue || b.name.localeCompare(a.name));
|
|
49
|
+
return withVersions[0].name;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return models.slice().sort((a, b) => b.localeCompare(a))[0];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const modelsCommand: Command = {
|
|
56
|
+
name: 'models',
|
|
57
|
+
description: 'List or set available models for a provider',
|
|
58
|
+
usage: '<list [provider]|latest [provider]|set <model-id>>',
|
|
59
|
+
handler: async (args, ctx) => {
|
|
60
|
+
const subCmd = (args[0] || 'list').toLowerCase();
|
|
61
|
+
|
|
62
|
+
if (subCmd === 'set') {
|
|
63
|
+
const value = args.slice(1).join(' ').trim();
|
|
64
|
+
if (!value) {
|
|
65
|
+
ctx.addMessage({
|
|
66
|
+
role: 'system',
|
|
67
|
+
content: 'Usage: /models set <model-id>'
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
ctx.config.set('model', value);
|
|
72
|
+
await ctx.config.save();
|
|
73
|
+
ctx.reloadAgent();
|
|
74
|
+
ctx.addMessage({ role: 'system', content: `✓ Model updated: ${value}` });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const provider = args[0] && args[0] !== 'list' && args[0] !== 'latest' ? args[0] : ctx.config.getProvider();
|
|
79
|
+
try {
|
|
80
|
+
const models = await ctx.models.list(provider);
|
|
81
|
+
if (models.length === 0) {
|
|
82
|
+
ctx.addMessage({
|
|
83
|
+
role: 'system',
|
|
84
|
+
content: `No models returned for provider: ${provider}`
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (subCmd === 'latest') {
|
|
89
|
+
const latest = pickLatestModel(models);
|
|
90
|
+
if (!latest) {
|
|
91
|
+
ctx.addMessage({
|
|
92
|
+
role: 'system',
|
|
93
|
+
content: `Unable to determine latest model for ${provider}`
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
ctx.config.set('model', latest);
|
|
98
|
+
await ctx.config.save();
|
|
99
|
+
ctx.reloadAgent();
|
|
100
|
+
ctx.addMessage({ role: 'system', content: `✓ Model updated: ${latest}` });
|
|
101
|
+
} else {
|
|
102
|
+
const lines = models.sort().map(model => ` ${model}`);
|
|
103
|
+
ctx.addMessage({
|
|
104
|
+
role: 'system',
|
|
105
|
+
content: [`Models (${provider}):`, ...lines].join('\n')
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
} catch (err) {
|
|
109
|
+
const message = err instanceof Error ? err.message : 'Unable to list models';
|
|
110
|
+
ctx.addMessage({
|
|
111
|
+
role: 'system',
|
|
112
|
+
content: `Models error: ${message}`
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Command } from './types.js';
|
|
2
|
+
|
|
3
|
+
const ALL_CAPS = ['file_read', 'file_write', 'shell_exec', 'network'] as const;
|
|
4
|
+
|
|
5
|
+
function normalize(value: string): string {
|
|
6
|
+
return value.trim().toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const permissionsCommand: Command = {
|
|
10
|
+
name: 'permissions',
|
|
11
|
+
description: 'View or update tool permissions',
|
|
12
|
+
usage: '<show|set> [capability] [on|off]',
|
|
13
|
+
handler: async (args, ctx) => {
|
|
14
|
+
const subCmd = normalize(args[0] || 'show');
|
|
15
|
+
const config = ctx.config.get();
|
|
16
|
+
const current = config.toolPermissions || {};
|
|
17
|
+
|
|
18
|
+
if (subCmd === 'show') {
|
|
19
|
+
const lines = ALL_CAPS.map(cap => {
|
|
20
|
+
const value = current[cap];
|
|
21
|
+
const label = value === false ? 'off' : 'on';
|
|
22
|
+
return ` ${cap}: ${label}`;
|
|
23
|
+
});
|
|
24
|
+
ctx.addMessage({
|
|
25
|
+
role: 'system',
|
|
26
|
+
content: ['Tool permissions:', ...lines].join('\n')
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (subCmd === 'set') {
|
|
32
|
+
const cap = normalize(args[1] || '');
|
|
33
|
+
const value = normalize(args[2] || '');
|
|
34
|
+
if (!cap || !ALL_CAPS.includes(cap as typeof ALL_CAPS[number])) {
|
|
35
|
+
ctx.addMessage({
|
|
36
|
+
role: 'system',
|
|
37
|
+
content: `Usage: /permissions set <${ALL_CAPS.join('|')}> <on|off>`
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (value !== 'on' && value !== 'off') {
|
|
42
|
+
ctx.addMessage({
|
|
43
|
+
role: 'system',
|
|
44
|
+
content: 'Usage: /permissions set <capability> <on|off>'
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const next = { ...current, [cap]: value === 'on' };
|
|
49
|
+
ctx.config.set('toolPermissions', next);
|
|
50
|
+
await ctx.config.save();
|
|
51
|
+
ctx.reloadAgent();
|
|
52
|
+
ctx.addMessage({
|
|
53
|
+
role: 'system',
|
|
54
|
+
content: `✓ Permission updated: ${cap} ${value}`
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
ctx.addMessage({
|
|
60
|
+
role: 'system',
|
|
61
|
+
content: 'Usage: /permissions <show|set> [capability] [on|off]'
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Command, ShellResult } from './types.js';
|
|
2
|
+
|
|
3
|
+
function formatShellResult(result: ShellResult): string {
|
|
4
|
+
const lines: string[] = [];
|
|
5
|
+
const stdout = result.stdout.trimEnd();
|
|
6
|
+
const stderr = result.stderr.trimEnd();
|
|
7
|
+
|
|
8
|
+
if (stdout) lines.push(stdout);
|
|
9
|
+
if (stderr) lines.push(stderr);
|
|
10
|
+
if (!stdout && !stderr) lines.push('(no output)');
|
|
11
|
+
|
|
12
|
+
if (result.exitCode !== 0) {
|
|
13
|
+
lines.push(`exit code: ${result.exitCode}`);
|
|
14
|
+
}
|
|
15
|
+
if (result.truncated) {
|
|
16
|
+
lines.push('(output truncated)');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return lines.join('\n');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const shellCommand: Command = {
|
|
23
|
+
name: 'shell',
|
|
24
|
+
description: 'Run a local shell command (or use !command)',
|
|
25
|
+
usage: '<command>',
|
|
26
|
+
handler: async (args, ctx) => {
|
|
27
|
+
const command = args.join(' ').trim();
|
|
28
|
+
if (!command) {
|
|
29
|
+
ctx.addMessage({
|
|
30
|
+
role: 'system',
|
|
31
|
+
content: 'Usage: /shell <command>\n\nExample:\n /shell ls -la\n !pwd'
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ctx.addMessage({ role: 'system', content: `$ ${command}` });
|
|
37
|
+
try {
|
|
38
|
+
const result = await ctx.shell.run(command);
|
|
39
|
+
ctx.addMessage({ role: 'system', content: formatShellResult(result) });
|
|
40
|
+
} catch (err) {
|
|
41
|
+
const message = err instanceof Error ? err.message : 'Command failed';
|
|
42
|
+
ctx.addMessage({ role: 'system', content: `shell: ${message}` });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const cdCommand: Command = {
|
|
48
|
+
name: 'cd',
|
|
49
|
+
description: 'Change working directory for !/shell commands',
|
|
50
|
+
usage: '[path]',
|
|
51
|
+
handler: async (args, ctx) => {
|
|
52
|
+
const target = args.join(' ').trim();
|
|
53
|
+
if (!target) {
|
|
54
|
+
ctx.addMessage({
|
|
55
|
+
role: 'system',
|
|
56
|
+
content: `cwd: ${ctx.shell.getCwd()}`
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const next = await ctx.shell.setCwd(target);
|
|
62
|
+
ctx.addMessage({ role: 'system', content: `cwd: ${next}` });
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const message = err instanceof Error ? err.message : 'Unable to change directory';
|
|
65
|
+
ctx.addMessage({ role: 'system', content: `cd: ${message}` });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Command } from './types.js';
|
|
2
|
+
import { formatSkillList } from '../../skills/index.js';
|
|
3
|
+
|
|
4
|
+
export const skillsCommand: Command = {
|
|
5
|
+
name: 'skills',
|
|
6
|
+
description: 'List or show available skills',
|
|
7
|
+
usage: '<list|show> [id]',
|
|
8
|
+
handler: async (args, ctx) => {
|
|
9
|
+
const subCmd = (args[0] || 'list').toLowerCase();
|
|
10
|
+
const registry = await ctx.skills.list();
|
|
11
|
+
|
|
12
|
+
if (subCmd === 'list') {
|
|
13
|
+
ctx.addMessage({
|
|
14
|
+
role: 'system',
|
|
15
|
+
content: formatSkillList(registry)
|
|
16
|
+
});
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (subCmd === 'show') {
|
|
21
|
+
const id = (args[1] || '').trim();
|
|
22
|
+
if (!id) {
|
|
23
|
+
ctx.addMessage({
|
|
24
|
+
role: 'system',
|
|
25
|
+
content: 'Usage: /skills show <id>'
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const skill = registry.find(entry => entry.id === id);
|
|
30
|
+
if (!skill) {
|
|
31
|
+
ctx.addMessage({
|
|
32
|
+
role: 'system',
|
|
33
|
+
content: `Skill not found: ${id}`
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
ctx.addMessage({
|
|
38
|
+
role: 'system',
|
|
39
|
+
content: [
|
|
40
|
+
`Skill: ${skill.name}`,
|
|
41
|
+
`ID: ${skill.id}`,
|
|
42
|
+
skill.description ? `Description: ${skill.description}` : '',
|
|
43
|
+
skill.instructions
|
|
44
|
+
].filter(Boolean).join('\n')
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ctx.addMessage({
|
|
50
|
+
role: 'system',
|
|
51
|
+
content: 'Usage: /skills <list|show> [id]'
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from './types.js';
|
|
2
|
+
|
|
3
|
+
export const statusCommand: Command = {
|
|
4
|
+
name: 'status',
|
|
5
|
+
description: 'Show current status',
|
|
6
|
+
handler: (_, ctx) => {
|
|
7
|
+
const hasKey = ctx.config.hasApiKey();
|
|
8
|
+
const config = ctx.config.get();
|
|
9
|
+
ctx.addMessage({
|
|
10
|
+
role: 'system',
|
|
11
|
+
content: [
|
|
12
|
+
'Status:',
|
|
13
|
+
` API Key: ${hasKey ? '✓ configured' : '✗ not set (use /config key <key>)'}`,
|
|
14
|
+
` Model: ${config.model}`,
|
|
15
|
+
` Ready: ${hasKey ? 'Yes' : 'No - need API key'}`
|
|
16
|
+
].join('\n')
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { AgentState, Message } from '../../types.js';
|
|
2
|
+
import { ZTCConfig } from '../../config/types.js';
|
|
3
|
+
import type { EmulationProfile } from '../../emulation/types.js';
|
|
4
|
+
import type { Skill } from '../../skills/types.js';
|
|
5
|
+
|
|
6
|
+
export interface ConfigController {
|
|
7
|
+
locationLabel?: string;
|
|
8
|
+
get: () => ZTCConfig;
|
|
9
|
+
set: <K extends keyof ZTCConfig>(key: K, value: ZTCConfig[K]) => void;
|
|
10
|
+
refresh?: () => Promise<void>;
|
|
11
|
+
hasApiKey: () => boolean;
|
|
12
|
+
getApiKey: (provider?: string) => string | undefined;
|
|
13
|
+
setApiKey: (key: string, provider?: string) => void;
|
|
14
|
+
getMaskedApiKey: () => string;
|
|
15
|
+
getProvider: () => string;
|
|
16
|
+
setProvider: (provider: string) => void;
|
|
17
|
+
getOpenAICompatibleBaseUrl: () => string | undefined;
|
|
18
|
+
setOpenAICompatibleBaseUrl: (url: string | undefined) => void;
|
|
19
|
+
getEmulationId: () => string | undefined;
|
|
20
|
+
setEmulationId: (id: string | undefined) => void;
|
|
21
|
+
save: () => void | Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface EmulationController {
|
|
25
|
+
list: () => EmulationProfile[];
|
|
26
|
+
get: (id: string) => EmulationProfile | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ShellResult {
|
|
30
|
+
command: string;
|
|
31
|
+
cwd: string;
|
|
32
|
+
stdout: string;
|
|
33
|
+
stderr: string;
|
|
34
|
+
exitCode: number;
|
|
35
|
+
truncated: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ShellController {
|
|
39
|
+
run: (command: string) => Promise<ShellResult>;
|
|
40
|
+
getCwd: () => string;
|
|
41
|
+
setCwd: (path: string) => Promise<string>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface ClipboardController {
|
|
45
|
+
writeText: (text: string) => Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface ModelsController {
|
|
49
|
+
list: (provider?: string) => Promise<string[]>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface SkillsController {
|
|
53
|
+
list: () => Promise<Skill[]>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface CommandContext {
|
|
57
|
+
addMessage: (msg: Omit<Message, 'id' | 'timestamp'>) => void;
|
|
58
|
+
clearMessages: () => void;
|
|
59
|
+
getMessages: () => Message[];
|
|
60
|
+
setAgentState: (state: AgentState) => void;
|
|
61
|
+
reloadAgent: () => void;
|
|
62
|
+
setDebug: (debug: boolean) => void;
|
|
63
|
+
retry: () => void;
|
|
64
|
+
exit: () => void;
|
|
65
|
+
config: ConfigController;
|
|
66
|
+
emulation: EmulationController;
|
|
67
|
+
shell: ShellController;
|
|
68
|
+
clipboard: ClipboardController;
|
|
69
|
+
models: ModelsController;
|
|
70
|
+
skills: SkillsController;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface Command {
|
|
74
|
+
name: string;
|
|
75
|
+
description: string;
|
|
76
|
+
usage?: string;
|
|
77
|
+
handler: (args: string[], ctx: CommandContext) => void | Promise<void>;
|
|
78
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Agent } from './agent.js';
|
|
2
|
+
import { AnthropicBackend, OpenAIBackend, OpenAICompatibleBackend, GeminiBackend, InceptionBackend } from './backends/index.js';
|
|
3
|
+
import { getEmulationProfile } from '../emulation/catalog.js';
|
|
4
|
+
import { ZTCConfig } from '../config/types.js';
|
|
5
|
+
import { CapabilityPolicy } from './runtime/policy.js';
|
|
6
|
+
|
|
7
|
+
export interface AgentFactoryOptions {
|
|
8
|
+
config: ZTCConfig;
|
|
9
|
+
provider?: string;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
openaiCompatibleBaseUrl?: string;
|
|
12
|
+
emulationId?: string;
|
|
13
|
+
apiEndpoint?: string;
|
|
14
|
+
skillPrompt?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function createAgentFromConfig(options: AgentFactoryOptions): Agent | null {
|
|
18
|
+
const provider = options.provider || options.config.provider || 'anthropic';
|
|
19
|
+
const apiKey = options.apiKey || options.config.apiKey || '';
|
|
20
|
+
if (!apiKey) return null;
|
|
21
|
+
|
|
22
|
+
const emulationId = options.emulationId || options.config.emulationId;
|
|
23
|
+
const emulation = emulationId ? getEmulationProfile(emulationId) : undefined;
|
|
24
|
+
|
|
25
|
+
let backend;
|
|
26
|
+
switch (provider) {
|
|
27
|
+
case 'openai':
|
|
28
|
+
backend = new OpenAIBackend({ apiKey });
|
|
29
|
+
break;
|
|
30
|
+
case 'gemini':
|
|
31
|
+
backend = new GeminiBackend({ apiKey });
|
|
32
|
+
break;
|
|
33
|
+
case 'inception':
|
|
34
|
+
backend = new InceptionBackend({ apiKey });
|
|
35
|
+
break;
|
|
36
|
+
case 'openai_compatible':
|
|
37
|
+
backend = new OpenAICompatibleBackend({
|
|
38
|
+
apiKey,
|
|
39
|
+
baseUrl: options.openaiCompatibleBaseUrl || options.config.openaiCompatibleBaseUrl || 'https://api.openai.com/v1'
|
|
40
|
+
});
|
|
41
|
+
break;
|
|
42
|
+
case 'anthropic':
|
|
43
|
+
default:
|
|
44
|
+
backend = new AnthropicBackend({ apiKey, apiEndpoint: options.apiEndpoint });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const basePrompt = emulation?.systemPrompt;
|
|
48
|
+
const skillPrompt = options.skillPrompt?.trim();
|
|
49
|
+
const systemPrompt = skillPrompt
|
|
50
|
+
? [basePrompt, skillPrompt].filter(Boolean).join('\n\n')
|
|
51
|
+
: basePrompt;
|
|
52
|
+
|
|
53
|
+
return new Agent({
|
|
54
|
+
apiKey,
|
|
55
|
+
model: options.config.model,
|
|
56
|
+
systemPrompt,
|
|
57
|
+
backend,
|
|
58
|
+
policy: new CapabilityPolicy(options.config.toolPermissions)
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Agent module exports
|
|
2
|
+
export { Agent, AgentError, type AgentConfig, type EventHandler } from './agent.js';
|
|
3
|
+
export {
|
|
4
|
+
defaultTools,
|
|
5
|
+
getToolDefinitions,
|
|
6
|
+
getTool,
|
|
7
|
+
executeTool,
|
|
8
|
+
type Tool
|
|
9
|
+
} from './tools/index.js';
|
|
10
|
+
export { AnthropicBackend, OpenAIBackend, OpenAICompatibleBackend, InceptionBackend, GeminiBackend } from './backends/index.js';
|
|
11
|
+
export type { AgentBackend, BackendRequest, BackendResponse } from './backends/index.js';
|
|
12
|
+
export { AllowAllPolicy } from './runtime/policy.js';
|
|
13
|
+
export type { Policy } from './runtime/policy.js';
|
|
14
|
+
export { NoopTracer } from './runtime/tracing.js';
|
|
15
|
+
export type { Tracer, TraceEvent, TraceEventType } from './runtime/tracing.js';
|
|
16
|
+
export { InMemoryStore } from './runtime/memory.js';
|
|
17
|
+
export type { MemoryStore } from './runtime/memory.js';
|
|
18
|
+
export { InMemorySessionStore } from './runtime/session.js';
|
|
19
|
+
export type { SessionStore } from './runtime/session.js';
|
|
20
|
+
export { ToolCapability } from './runtime/capabilities.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Message } from '../../types.js';
|
|
2
|
+
|
|
3
|
+
export interface MemoryStore {
|
|
4
|
+
addMessage(message: Message): void;
|
|
5
|
+
getRecent(limit: number): Message[];
|
|
6
|
+
clear(): void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class InMemoryStore implements MemoryStore {
|
|
10
|
+
private messages: Message[] = [];
|
|
11
|
+
|
|
12
|
+
addMessage(message: Message): void {
|
|
13
|
+
this.messages.push(message);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getRecent(limit: number): Message[] {
|
|
17
|
+
return this.messages.slice(-limit);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
clear(): void {
|
|
21
|
+
this.messages = [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ToolCapability } from './capabilities.js';
|
|
2
|
+
|
|
3
|
+
export interface ToolPolicyRequest {
|
|
4
|
+
name: string;
|
|
5
|
+
args: Record<string, unknown>;
|
|
6
|
+
capabilities: ToolCapability[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ToolPolicyDecision {
|
|
10
|
+
allowed: boolean;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Policy {
|
|
15
|
+
evaluateTool(request: ToolPolicyRequest): ToolPolicyDecision;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class AllowAllPolicy implements Policy {
|
|
19
|
+
evaluateTool(): ToolPolicyDecision {
|
|
20
|
+
return { allowed: true };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class CapabilityPolicy implements Policy {
|
|
25
|
+
private permissions: Record<string, boolean>;
|
|
26
|
+
|
|
27
|
+
constructor(permissions?: Partial<Record<string, boolean>>) {
|
|
28
|
+
this.permissions = {
|
|
29
|
+
file_read: true,
|
|
30
|
+
file_write: true,
|
|
31
|
+
shell_exec: true,
|
|
32
|
+
network: true,
|
|
33
|
+
...permissions
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
evaluateTool(request: ToolPolicyRequest): ToolPolicyDecision {
|
|
38
|
+
for (const capability of request.capabilities) {
|
|
39
|
+
if (this.permissions[capability] === false) {
|
|
40
|
+
return {
|
|
41
|
+
allowed: false,
|
|
42
|
+
reason: `Permission denied: ${capability}`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { allowed: true };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Session } from '../../types.js';
|
|
2
|
+
|
|
3
|
+
export interface SessionStore {
|
|
4
|
+
save(session: Session): Promise<void>;
|
|
5
|
+
load(id: string): Promise<Session | null>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class InMemorySessionStore implements SessionStore {
|
|
9
|
+
private sessions = new Map<string, Session>();
|
|
10
|
+
|
|
11
|
+
async save(session: Session): Promise<void> {
|
|
12
|
+
this.sessions.set(session.id, session);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async load(id: string): Promise<Session | null> {
|
|
16
|
+
return this.sessions.get(id) || null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type TraceEventType =
|
|
2
|
+
| 'api_request'
|
|
3
|
+
| 'api_response'
|
|
4
|
+
| 'tool_start'
|
|
5
|
+
| 'tool_end'
|
|
6
|
+
| 'tool_error'
|
|
7
|
+
| 'policy_denied';
|
|
8
|
+
|
|
9
|
+
export interface TraceEvent {
|
|
10
|
+
type: TraceEventType;
|
|
11
|
+
timestamp: Date;
|
|
12
|
+
data?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface Tracer {
|
|
16
|
+
event(event: TraceEvent): void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class NoopTracer implements Tracer {
|
|
20
|
+
event(): void {
|
|
21
|
+
// No-op
|
|
22
|
+
}
|
|
23
|
+
}
|