@ebowwa/coder 0.7.63 → 0.7.64
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/dist/core/__tests__/permissions.test.d.ts +12 -0
- package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/core/__tests__/permissions.test.js +851 -0
- package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
- package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
- package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/index.test.js +121 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
- package/dist/core/agent-loop/compaction.d.ts +39 -0
- package/dist/core/agent-loop/compaction.d.ts.map +1 -0
- package/dist/core/agent-loop/compaction.js +51 -0
- package/dist/core/agent-loop/formatters.d.ts +21 -0
- package/dist/core/agent-loop/formatters.d.ts.map +1 -0
- package/dist/core/agent-loop/formatters.js +42 -0
- package/dist/core/agent-loop/index.d.ts +25 -0
- package/dist/core/agent-loop/index.d.ts.map +1 -0
- package/dist/core/agent-loop/index.js +83 -0
- package/dist/core/agent-loop/loop-state.d.ts +74 -0
- package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
- package/dist/core/agent-loop/loop-state.js +147 -0
- package/dist/core/agent-loop/message-builder.d.ts +13 -0
- package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
- package/dist/core/agent-loop/message-builder.js +49 -0
- package/dist/core/agent-loop/tool-executor.d.ts +23 -0
- package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
- package/dist/core/agent-loop/tool-executor.js +152 -0
- package/dist/core/agent-loop/turn-executor.d.ts +57 -0
- package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
- package/dist/core/agent-loop/turn-executor.js +124 -0
- package/dist/core/agent-loop/types.d.ts +141 -0
- package/dist/core/agent-loop/types.d.ts.map +1 -0
- package/dist/core/agent-loop/types.js +4 -0
- package/dist/core/agent-loop.d.ts +17 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +16 -0
- package/dist/core/api-client-impl.d.ts +62 -0
- package/dist/core/api-client-impl.d.ts.map +1 -0
- package/dist/core/api-client-impl.js +479 -0
- package/dist/core/api-client.d.ts +6 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +5 -0
- package/dist/core/checkpoints.d.ts +128 -0
- package/dist/core/checkpoints.d.ts.map +1 -0
- package/dist/core/checkpoints.js +438 -0
- package/dist/core/claude-md.d.ts +71 -0
- package/dist/core/claude-md.d.ts.map +1 -0
- package/dist/core/claude-md.js +198 -0
- package/dist/core/cognitive-security/hooks.d.ts +138 -0
- package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
- package/dist/core/cognitive-security/hooks.js +389 -0
- package/dist/core/cognitive-security/index.d.ts +751 -0
- package/dist/core/cognitive-security/index.d.ts.map +1 -0
- package/dist/core/cognitive-security/index.js +1123 -0
- package/dist/core/cognitive-security/middleware.d.ts +136 -0
- package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
- package/dist/core/cognitive-security/middleware.js +376 -0
- package/dist/core/config-loader.d.ts +127 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +219 -0
- package/dist/core/context-compaction.d.ts +87 -0
- package/dist/core/context-compaction.d.ts.map +1 -0
- package/dist/core/context-compaction.js +428 -0
- package/dist/core/git-status.d.ts +25 -0
- package/dist/core/git-status.d.ts.map +1 -0
- package/dist/core/git-status.js +204 -0
- package/dist/core/image.d.ts +69 -0
- package/dist/core/image.d.ts.map +1 -0
- package/dist/core/image.js +290 -0
- package/dist/core/image.test.d.ts +2 -0
- package/dist/core/image.test.d.ts.map +1 -0
- package/dist/core/image.test.js +149 -0
- package/dist/core/models.d.ts +123 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +325 -0
- package/dist/core/permissions.d.ts +81 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +327 -0
- package/dist/core/retry.d.ts +25 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +121 -0
- package/dist/core/session-store.d.ts +9 -0
- package/dist/core/session-store.d.ts.map +1 -0
- package/dist/core/session-store.js +10 -0
- package/dist/core/sessions/export.d.ts +47 -0
- package/dist/core/sessions/export.d.ts.map +1 -0
- package/dist/core/sessions/export.js +256 -0
- package/dist/core/sessions/index.d.ts +132 -0
- package/dist/core/sessions/index.d.ts.map +1 -0
- package/dist/core/sessions/index.js +442 -0
- package/dist/core/sessions/metadata.d.ts +77 -0
- package/dist/core/sessions/metadata.d.ts.map +1 -0
- package/dist/core/sessions/metadata.js +233 -0
- package/dist/core/sessions/persistence.d.ts +72 -0
- package/dist/core/sessions/persistence.d.ts.map +1 -0
- package/dist/core/sessions/persistence.js +201 -0
- package/dist/core/sessions/types.d.ts +110 -0
- package/dist/core/sessions/types.d.ts.map +1 -0
- package/dist/core/sessions/types.js +4 -0
- package/dist/core/stream-highlighter.d.ts +18 -0
- package/dist/core/stream-highlighter.d.ts.map +1 -0
- package/dist/core/stream-highlighter.js +916 -0
- package/dist/core/system-reminders.d.ts +89 -0
- package/dist/core/system-reminders.d.ts.map +1 -0
- package/dist/core/system-reminders.js +285 -0
- package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
- package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
- package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
- package/dist/ecosystem/hooks/index.d.ts +59 -0
- package/dist/ecosystem/hooks/index.d.ts.map +1 -0
- package/dist/ecosystem/hooks/index.js +294 -0
- package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
- package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
- package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
- package/dist/ecosystem/skills/index.d.ts +55 -0
- package/dist/ecosystem/skills/index.d.ts.map +1 -0
- package/dist/ecosystem/skills/index.js +258 -0
- package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
- package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
- package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
- package/dist/ecosystem/tools/index.d.ts +24 -0
- package/dist/ecosystem/tools/index.d.ts.map +1 -0
- package/dist/ecosystem/tools/index.js +1709 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -52192
- package/dist/interfaces/mcp/client.d.ts +40 -0
- package/dist/interfaces/mcp/client.d.ts.map +1 -0
- package/dist/interfaces/mcp/client.js +309 -0
- package/dist/interfaces/ui/index.d.ts +36 -0
- package/dist/interfaces/ui/index.d.ts.map +1 -0
- package/dist/interfaces/ui/index.js +61 -0
- package/dist/interfaces/ui/spinner.d.ts +140 -0
- package/dist/interfaces/ui/spinner.d.ts.map +1 -0
- package/dist/interfaces/ui/spinner.js +342 -0
- package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
- package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/cli/index.js +159 -52768
- package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
- package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/args.js +176 -0
- package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
- package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/index.js +16 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
- package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
- package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/query.js +100 -0
- package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
- package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
- package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
- package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
- package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
- package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
- package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
- package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
- package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
- package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
- package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
- package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/console.js +46 -0
- package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
- package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/index.js +28 -0
- package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
- package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/run.js +31 -0
- package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
- package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
- package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
- package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/types.js +5 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
- package/dist/native/index.d.ts +480 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +1625 -0
- package/dist/teammates/index.d.ts +161 -0
- package/dist/teammates/index.d.ts.map +1 -0
- package/dist/teammates/index.js +827 -0
- package/dist/types/index.d.ts +482 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +52 -0
- package/package.json +4 -2
- package/packages/src/core/__tests__/permissions.test.ts +1091 -0
- package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
- package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
- package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
- package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
- package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
- package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
- package/packages/src/core/agent-loop/compaction.ts +88 -0
- package/packages/src/core/agent-loop/formatters.ts +50 -0
- package/packages/src/core/agent-loop/index.ts +135 -0
- package/packages/src/core/agent-loop/loop-state.ts +187 -0
- package/packages/src/core/agent-loop/message-builder.ts +62 -0
- package/packages/src/core/agent-loop/tool-executor.ts +211 -0
- package/packages/src/core/agent-loop/turn-executor.ts +222 -0
- package/packages/src/core/agent-loop/types.ts +148 -0
- package/packages/src/core/agent-loop.ts +18 -0
- package/packages/src/core/api-client-impl.ts +619 -0
- package/packages/src/core/api-client.ts +6 -0
- package/packages/src/core/checkpoints.ts +606 -0
- package/packages/src/core/claude-md.ts +272 -0
- package/packages/src/core/cognitive-security/hooks.ts +590 -0
- package/packages/src/core/cognitive-security/index.ts +2041 -0
- package/packages/src/core/cognitive-security/middleware.ts +536 -0
- package/packages/src/core/config-loader.ts +324 -0
- package/packages/src/core/context-compaction.ts +578 -0
- package/packages/src/core/git-status.ts +262 -0
- package/packages/src/core/image.test.ts +180 -0
- package/packages/src/core/image.ts +350 -0
- package/packages/src/core/lmdb.db +0 -0
- package/packages/src/core/lmdb.db-lock +0 -0
- package/packages/src/core/models.ts +430 -0
- package/packages/src/core/normalizers/todo +4 -0
- package/packages/src/core/permissions.ts +431 -0
- package/packages/src/core/retry.ts +170 -0
- package/packages/src/core/session-store.ts +36 -0
- package/packages/src/core/sessions/export.ts +329 -0
- package/packages/src/core/sessions/index.ts +587 -0
- package/packages/src/core/sessions/metadata.ts +309 -0
- package/packages/src/core/sessions/persistence.ts +244 -0
- package/packages/src/core/sessions/types.ts +169 -0
- package/packages/src/core/stream-highlighter.ts +1123 -0
- package/packages/src/core/system-reminders.ts +402 -0
- package/packages/src/core/todo +8 -0
- package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
- package/packages/src/ecosystem/hooks/index.ts +341 -0
- package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
- package/packages/src/ecosystem/skills/index.ts +295 -0
- package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
- package/packages/src/ecosystem/tools/index.ts +1877 -0
- package/packages/src/index.ts +120 -0
- package/packages/src/interfaces/mcp/client.ts +389 -0
- package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
- package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
- package/packages/src/interfaces/ui/index.ts +161 -0
- package/packages/src/interfaces/ui/lmdb.db +0 -0
- package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
- package/packages/src/interfaces/ui/spinner.ts +451 -0
- package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
- package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
- package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
- package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
- package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
- package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
- package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
- package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
- package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
- package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
- package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
- package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
- package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
- package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
- package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
- package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
- package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
- package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
- package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
- package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
- package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
- package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
- package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
- package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
- package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
- package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
- package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
- package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
- package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
- package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
- package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
- package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
- package/packages/src/lmdb.db +0 -0
- package/packages/src/lmdb.db-lock +0 -0
- package/packages/src/native/index.ts +2345 -0
- package/packages/src/teammates/index.ts +982 -0
- package/packages/src/types/index.ts +722 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cognitive Security Middleware
|
|
3
|
+
*
|
|
4
|
+
* Automatically integrates flow control into the agent loop.
|
|
5
|
+
* All tool inputs/outputs are classified, tracked, and validated.
|
|
6
|
+
*/
|
|
7
|
+
import { type ClassifiedData, type FlowValidationResult, type LeakCheckResult } from "./index.js";
|
|
8
|
+
export interface SecurityConfig {
|
|
9
|
+
/** Enable automatic data classification */
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/** Enable flow policy enforcement */
|
|
12
|
+
enforcePolicies: boolean;
|
|
13
|
+
/** Enable taint tracking */
|
|
14
|
+
trackTaints: boolean;
|
|
15
|
+
/** Enable leak prevention on outputs */
|
|
16
|
+
preventLeaks: boolean;
|
|
17
|
+
/** Log security events */
|
|
18
|
+
logEvents: boolean;
|
|
19
|
+
/** Block on policy violations */
|
|
20
|
+
blockOnViolation: boolean;
|
|
21
|
+
/** Domains considered external (require stricter checks) */
|
|
22
|
+
externalDomains: string[];
|
|
23
|
+
/** Tools that transmit data externally */
|
|
24
|
+
externalTools: string[];
|
|
25
|
+
/** Tools that read from sensitive sources */
|
|
26
|
+
sensitiveSourceTools: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare const DEFAULT_SECURITY_CONFIG: SecurityConfig;
|
|
29
|
+
export interface SecurityEvent {
|
|
30
|
+
type: "classify" | "flow_check" | "leak_check" | "taint" | "block" | "allow";
|
|
31
|
+
timestamp: number;
|
|
32
|
+
toolName: string;
|
|
33
|
+
dataId?: string;
|
|
34
|
+
sensitivity?: string;
|
|
35
|
+
category?: string;
|
|
36
|
+
sourceDomain?: string;
|
|
37
|
+
targetDomain?: string;
|
|
38
|
+
allowed?: boolean;
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ToolSecurityContext {
|
|
42
|
+
toolName: string;
|
|
43
|
+
input: Record<string, unknown>;
|
|
44
|
+
output?: unknown;
|
|
45
|
+
sourceDomain: string;
|
|
46
|
+
targetDomain: string;
|
|
47
|
+
}
|
|
48
|
+
export interface SecurityMiddlewareResult {
|
|
49
|
+
allowed: boolean;
|
|
50
|
+
reason: string;
|
|
51
|
+
classifiedInput?: ClassifiedData;
|
|
52
|
+
classifiedOutput?: ClassifiedData;
|
|
53
|
+
flowResult?: FlowValidationResult;
|
|
54
|
+
leakResult?: LeakCheckResult;
|
|
55
|
+
sanitizedOutput?: string;
|
|
56
|
+
events: SecurityEvent[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Cognitive Security Middleware
|
|
60
|
+
*
|
|
61
|
+
* Wraps tool execution with automatic security checks.
|
|
62
|
+
*/
|
|
63
|
+
export declare class CognitiveSecurityMiddleware {
|
|
64
|
+
private config;
|
|
65
|
+
private policyEngine;
|
|
66
|
+
private flowTracker;
|
|
67
|
+
private leakPrevention;
|
|
68
|
+
private taintTracker;
|
|
69
|
+
private events;
|
|
70
|
+
private initialized;
|
|
71
|
+
constructor(config?: Partial<SecurityConfig>);
|
|
72
|
+
/**
|
|
73
|
+
* Initialize security components (lazy loading)
|
|
74
|
+
*/
|
|
75
|
+
initialize(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Check tool input before execution
|
|
78
|
+
*/
|
|
79
|
+
checkInput(toolName: string, input: Record<string, unknown>): Promise<SecurityMiddlewareResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Check tool output after execution
|
|
82
|
+
*/
|
|
83
|
+
checkOutput(toolName: string, input: Record<string, unknown>, output: string): Promise<SecurityMiddlewareResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Wrap tool handler with security checks
|
|
86
|
+
*/
|
|
87
|
+
wrapToolHandler<TInput extends Record<string, unknown>, TResult>(toolName: string, handler: (input: TInput, context: unknown) => Promise<{
|
|
88
|
+
content: string;
|
|
89
|
+
is_error?: boolean;
|
|
90
|
+
}>): (input: TInput, context: unknown) => Promise<{
|
|
91
|
+
content: string;
|
|
92
|
+
is_error?: boolean;
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Get domain for a tool
|
|
96
|
+
*/
|
|
97
|
+
private getToolDomain;
|
|
98
|
+
/**
|
|
99
|
+
* Check if tool transmits externally
|
|
100
|
+
*/
|
|
101
|
+
private isExternalTool;
|
|
102
|
+
/**
|
|
103
|
+
* Extract content from tool input for classification
|
|
104
|
+
*/
|
|
105
|
+
private extractContent;
|
|
106
|
+
/**
|
|
107
|
+
* Log security events
|
|
108
|
+
*/
|
|
109
|
+
private logEvent;
|
|
110
|
+
/**
|
|
111
|
+
* Get all security events
|
|
112
|
+
*/
|
|
113
|
+
getEvents(): SecurityEvent[];
|
|
114
|
+
/**
|
|
115
|
+
* Clear event history
|
|
116
|
+
*/
|
|
117
|
+
clearEvents(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Get security statistics
|
|
120
|
+
*/
|
|
121
|
+
getStats(): {
|
|
122
|
+
totalEvents: number;
|
|
123
|
+
blockedCount: number;
|
|
124
|
+
allowedCount: number;
|
|
125
|
+
bySensitivity: Record<string, number>;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get or create global security middleware
|
|
130
|
+
*/
|
|
131
|
+
export declare function getSecurityMiddleware(config?: Partial<SecurityConfig>): CognitiveSecurityMiddleware;
|
|
132
|
+
/**
|
|
133
|
+
* Reset global middleware (for testing)
|
|
134
|
+
*/
|
|
135
|
+
export declare function resetSecurityMiddleware(): void;
|
|
136
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../packages/src/core/cognitive-security/middleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAML,KAAK,cAAc,EAKnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,0BAA0B;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6CAA6C;IAC7C,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,uBAAuB,EAAE,cAUrC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAIhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAuGpC;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC;IAyIpC;;OAEG;IACH,eAAe,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAC7D,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAC7F,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAmCxF;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAchB;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACvC;CAkBF;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,2BAA2B,CAK7B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cognitive Security Middleware
|
|
3
|
+
*
|
|
4
|
+
* Automatically integrates flow control into the agent loop.
|
|
5
|
+
* All tool inputs/outputs are classified, tracked, and validated.
|
|
6
|
+
*/
|
|
7
|
+
import { classifyData, createFlowPolicyEngine, createFlowTracker, createLeakPrevention, createTaintTracker, } from "./index.js";
|
|
8
|
+
export const DEFAULT_SECURITY_CONFIG = {
|
|
9
|
+
enabled: true,
|
|
10
|
+
enforcePolicies: true,
|
|
11
|
+
trackTaints: true,
|
|
12
|
+
preventLeaks: true,
|
|
13
|
+
logEvents: true,
|
|
14
|
+
blockOnViolation: true,
|
|
15
|
+
externalDomains: ["external", "network", "api", "web"],
|
|
16
|
+
externalTools: ["Bash", "Write", "Edit", "MultiEdit", "NotebookEdit"],
|
|
17
|
+
sensitiveSourceTools: ["Read", "Bash"],
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Cognitive Security Middleware
|
|
21
|
+
*
|
|
22
|
+
* Wraps tool execution with automatic security checks.
|
|
23
|
+
*/
|
|
24
|
+
export class CognitiveSecurityMiddleware {
|
|
25
|
+
config;
|
|
26
|
+
policyEngine = null;
|
|
27
|
+
flowTracker = null;
|
|
28
|
+
leakPrevention = null;
|
|
29
|
+
taintTracker = null;
|
|
30
|
+
events = [];
|
|
31
|
+
initialized = false;
|
|
32
|
+
constructor(config = {}) {
|
|
33
|
+
this.config = { ...DEFAULT_SECURITY_CONFIG, ...config };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize security components (lazy loading)
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
if (this.initialized)
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
if (this.config.enforcePolicies) {
|
|
43
|
+
this.policyEngine = await createFlowPolicyEngine();
|
|
44
|
+
}
|
|
45
|
+
if (this.config.trackTaints) {
|
|
46
|
+
this.flowTracker = await createFlowTracker();
|
|
47
|
+
this.taintTracker = await createTaintTracker();
|
|
48
|
+
}
|
|
49
|
+
if (this.config.preventLeaks) {
|
|
50
|
+
this.leakPrevention = await createLeakPrevention();
|
|
51
|
+
}
|
|
52
|
+
this.initialized = true;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn("[Security] Failed to initialize:", error);
|
|
56
|
+
// Continue without security if init fails
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check tool input before execution
|
|
61
|
+
*/
|
|
62
|
+
async checkInput(toolName, input) {
|
|
63
|
+
await this.initialize();
|
|
64
|
+
const events = [];
|
|
65
|
+
const sourceDomain = this.getToolDomain(toolName);
|
|
66
|
+
const targetDomain = "agent";
|
|
67
|
+
// Extract input content for classification
|
|
68
|
+
const inputContent = this.extractContent(input);
|
|
69
|
+
// Classify input data
|
|
70
|
+
const classifiedInput = await classifyData(inputContent, sourceDomain, [toolName]);
|
|
71
|
+
events.push({
|
|
72
|
+
type: "classify",
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
toolName,
|
|
75
|
+
dataId: classifiedInput.id,
|
|
76
|
+
sensitivity: classifiedInput.sensitivity,
|
|
77
|
+
category: classifiedInput.category,
|
|
78
|
+
sourceDomain,
|
|
79
|
+
targetDomain,
|
|
80
|
+
});
|
|
81
|
+
// Check flow policy
|
|
82
|
+
let flowResult;
|
|
83
|
+
if (this.policyEngine && this.config.enforcePolicies) {
|
|
84
|
+
flowResult = this.policyEngine.evaluate(classifiedInput, sourceDomain, targetDomain);
|
|
85
|
+
events.push({
|
|
86
|
+
type: "flow_check",
|
|
87
|
+
timestamp: Date.now(),
|
|
88
|
+
toolName,
|
|
89
|
+
dataId: classifiedInput.id,
|
|
90
|
+
sourceDomain,
|
|
91
|
+
targetDomain,
|
|
92
|
+
allowed: flowResult.allowed,
|
|
93
|
+
reason: flowResult.reason,
|
|
94
|
+
});
|
|
95
|
+
if (!flowResult.allowed && this.config.blockOnViolation) {
|
|
96
|
+
events.push({
|
|
97
|
+
type: "block",
|
|
98
|
+
timestamp: Date.now(),
|
|
99
|
+
toolName,
|
|
100
|
+
reason: flowResult.reason,
|
|
101
|
+
});
|
|
102
|
+
this.logEvent(events);
|
|
103
|
+
return {
|
|
104
|
+
allowed: false,
|
|
105
|
+
reason: `Security policy blocked: ${flowResult.reason}`,
|
|
106
|
+
classifiedInput,
|
|
107
|
+
flowResult,
|
|
108
|
+
events,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Register taint for sensitive data
|
|
113
|
+
if (this.taintTracker && this.config.trackTaints) {
|
|
114
|
+
if (classifiedInput.sensitivity !== "public") {
|
|
115
|
+
const sourceId = this.taintTracker.registerSource(sourceDomain, classifiedInput.sensitivity, [classifiedInput.category]);
|
|
116
|
+
this.taintTracker.taint(sourceId, inputContent, "tool_input", toolName);
|
|
117
|
+
events.push({
|
|
118
|
+
type: "taint",
|
|
119
|
+
timestamp: Date.now(),
|
|
120
|
+
toolName,
|
|
121
|
+
sensitivity: classifiedInput.sensitivity,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
events.push({
|
|
126
|
+
type: "allow",
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
toolName,
|
|
129
|
+
reason: "Input check passed",
|
|
130
|
+
});
|
|
131
|
+
this.logEvent(events);
|
|
132
|
+
return {
|
|
133
|
+
allowed: true,
|
|
134
|
+
reason: "Input check passed",
|
|
135
|
+
classifiedInput,
|
|
136
|
+
flowResult,
|
|
137
|
+
events,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Check tool output after execution
|
|
142
|
+
*/
|
|
143
|
+
async checkOutput(toolName, input, output) {
|
|
144
|
+
await this.initialize();
|
|
145
|
+
const events = [];
|
|
146
|
+
const sourceDomain = "agent";
|
|
147
|
+
const targetDomain = this.isExternalTool(toolName)
|
|
148
|
+
? "external"
|
|
149
|
+
: "internal";
|
|
150
|
+
// Classify output data
|
|
151
|
+
const classifiedOutput = await classifyData(output, sourceDomain, [toolName, "output"]);
|
|
152
|
+
events.push({
|
|
153
|
+
type: "classify",
|
|
154
|
+
timestamp: Date.now(),
|
|
155
|
+
toolName,
|
|
156
|
+
dataId: classifiedOutput.id,
|
|
157
|
+
sensitivity: classifiedOutput.sensitivity,
|
|
158
|
+
category: classifiedOutput.category,
|
|
159
|
+
sourceDomain,
|
|
160
|
+
targetDomain,
|
|
161
|
+
});
|
|
162
|
+
// Check flow policy for output
|
|
163
|
+
let flowResult;
|
|
164
|
+
if (this.policyEngine && this.config.enforcePolicies && this.isExternalTool(toolName)) {
|
|
165
|
+
flowResult = this.policyEngine.evaluate(classifiedOutput, sourceDomain, targetDomain);
|
|
166
|
+
events.push({
|
|
167
|
+
type: "flow_check",
|
|
168
|
+
timestamp: Date.now(),
|
|
169
|
+
toolName,
|
|
170
|
+
dataId: classifiedOutput.id,
|
|
171
|
+
sourceDomain,
|
|
172
|
+
targetDomain,
|
|
173
|
+
allowed: flowResult.allowed,
|
|
174
|
+
reason: flowResult.reason,
|
|
175
|
+
});
|
|
176
|
+
if (!flowResult.allowed && this.config.blockOnViolation) {
|
|
177
|
+
events.push({
|
|
178
|
+
type: "block",
|
|
179
|
+
timestamp: Date.now(),
|
|
180
|
+
toolName,
|
|
181
|
+
reason: flowResult.reason,
|
|
182
|
+
});
|
|
183
|
+
this.logEvent(events);
|
|
184
|
+
return {
|
|
185
|
+
allowed: false,
|
|
186
|
+
reason: `Security policy blocked output: ${flowResult.reason}`,
|
|
187
|
+
classifiedOutput,
|
|
188
|
+
flowResult,
|
|
189
|
+
events,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Check for leaks
|
|
194
|
+
let leakResult;
|
|
195
|
+
let sanitizedOutput = output;
|
|
196
|
+
if (this.leakPrevention && this.config.preventLeaks) {
|
|
197
|
+
leakResult = this.leakPrevention.check(output, targetDomain);
|
|
198
|
+
events.push({
|
|
199
|
+
type: "leak_check",
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
toolName,
|
|
202
|
+
allowed: leakResult.action !== "block",
|
|
203
|
+
reason: leakResult.action,
|
|
204
|
+
});
|
|
205
|
+
if (leakResult.action === "block") {
|
|
206
|
+
// Sanitize instead of blocking
|
|
207
|
+
sanitizedOutput = this.leakPrevention.sanitize(output);
|
|
208
|
+
if (this.config.blockOnViolation) {
|
|
209
|
+
events.push({
|
|
210
|
+
type: "block",
|
|
211
|
+
timestamp: Date.now(),
|
|
212
|
+
toolName,
|
|
213
|
+
reason: `Leak detected: ${leakResult.detections.map(d => d.pattern_name).join(", ")}`,
|
|
214
|
+
});
|
|
215
|
+
this.logEvent(events);
|
|
216
|
+
return {
|
|
217
|
+
allowed: false,
|
|
218
|
+
reason: `Potential data leak detected and blocked`,
|
|
219
|
+
classifiedOutput,
|
|
220
|
+
leakResult,
|
|
221
|
+
sanitizedOutput,
|
|
222
|
+
events,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Track flow
|
|
228
|
+
if (this.flowTracker && this.config.trackTaints && flowResult) {
|
|
229
|
+
this.flowTracker.record(classifiedOutput, sourceDomain, targetDomain, this.isExternalTool(toolName) ? "outbound" : "internal", flowResult, null, null);
|
|
230
|
+
}
|
|
231
|
+
events.push({
|
|
232
|
+
type: "allow",
|
|
233
|
+
timestamp: Date.now(),
|
|
234
|
+
toolName,
|
|
235
|
+
reason: "Output check passed",
|
|
236
|
+
});
|
|
237
|
+
this.logEvent(events);
|
|
238
|
+
return {
|
|
239
|
+
allowed: true,
|
|
240
|
+
reason: "Output check passed",
|
|
241
|
+
classifiedOutput,
|
|
242
|
+
flowResult,
|
|
243
|
+
leakResult,
|
|
244
|
+
sanitizedOutput,
|
|
245
|
+
events,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Wrap tool handler with security checks
|
|
250
|
+
*/
|
|
251
|
+
wrapToolHandler(toolName, handler) {
|
|
252
|
+
return async (input, context) => {
|
|
253
|
+
if (!this.config.enabled) {
|
|
254
|
+
return handler(input, context);
|
|
255
|
+
}
|
|
256
|
+
// Check input
|
|
257
|
+
const inputCheck = await this.checkInput(toolName, input);
|
|
258
|
+
if (!inputCheck.allowed) {
|
|
259
|
+
return {
|
|
260
|
+
content: `[Security] ${inputCheck.reason}`,
|
|
261
|
+
is_error: true,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Execute tool
|
|
265
|
+
const result = await handler(input, context);
|
|
266
|
+
// Check output
|
|
267
|
+
const outputCheck = await this.checkOutput(toolName, input, result.content);
|
|
268
|
+
if (!outputCheck.allowed) {
|
|
269
|
+
return {
|
|
270
|
+
content: outputCheck.sanitizedOutput || `[Security] ${outputCheck.reason}`,
|
|
271
|
+
is_error: true,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// Return sanitized output if needed
|
|
275
|
+
return {
|
|
276
|
+
content: outputCheck.sanitizedOutput || result.content,
|
|
277
|
+
is_error: result.is_error,
|
|
278
|
+
};
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get domain for a tool
|
|
283
|
+
*/
|
|
284
|
+
getToolDomain(toolName) {
|
|
285
|
+
if (this.isExternalTool(toolName))
|
|
286
|
+
return "external";
|
|
287
|
+
if (this.config.sensitiveSourceTools.includes(toolName))
|
|
288
|
+
return "filesystem";
|
|
289
|
+
return "internal";
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if tool transmits externally
|
|
293
|
+
*/
|
|
294
|
+
isExternalTool(toolName) {
|
|
295
|
+
return this.config.externalTools.includes(toolName);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Extract content from tool input for classification
|
|
299
|
+
*/
|
|
300
|
+
extractContent(input) {
|
|
301
|
+
const parts = [];
|
|
302
|
+
for (const [key, value] of Object.entries(input)) {
|
|
303
|
+
if (typeof value === "string") {
|
|
304
|
+
parts.push(`${key}=${value}`);
|
|
305
|
+
}
|
|
306
|
+
else if (typeof value === "object" && value !== null) {
|
|
307
|
+
parts.push(`${key}=${JSON.stringify(value)}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return parts.join(" ");
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Log security events
|
|
314
|
+
*/
|
|
315
|
+
logEvent(events) {
|
|
316
|
+
this.events.push(...events);
|
|
317
|
+
if (this.config.logEvents) {
|
|
318
|
+
for (const event of events) {
|
|
319
|
+
if (event.type === "block") {
|
|
320
|
+
console.warn(`[Security] BLOCK: ${event.toolName} - ${event.reason}`);
|
|
321
|
+
}
|
|
322
|
+
else if (event.type === "allow" && event.sensitivity && event.sensitivity !== "public") {
|
|
323
|
+
console.log(`[Security] ALLOW: ${event.toolName} (${event.sensitivity})`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get all security events
|
|
330
|
+
*/
|
|
331
|
+
getEvents() {
|
|
332
|
+
return [...this.events];
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Clear event history
|
|
336
|
+
*/
|
|
337
|
+
clearEvents() {
|
|
338
|
+
this.events = [];
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get security statistics
|
|
342
|
+
*/
|
|
343
|
+
getStats() {
|
|
344
|
+
const blockedCount = this.events.filter(e => e.type === "block").length;
|
|
345
|
+
const allowedCount = this.events.filter(e => e.type === "allow").length;
|
|
346
|
+
const bySensitivity = {};
|
|
347
|
+
for (const event of this.events) {
|
|
348
|
+
if (event.sensitivity) {
|
|
349
|
+
bySensitivity[event.sensitivity] = (bySensitivity[event.sensitivity] || 0) + 1;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
totalEvents: this.events.length,
|
|
354
|
+
blockedCount,
|
|
355
|
+
allowedCount,
|
|
356
|
+
bySensitivity,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Singleton instance for global use
|
|
361
|
+
let globalMiddleware = null;
|
|
362
|
+
/**
|
|
363
|
+
* Get or create global security middleware
|
|
364
|
+
*/
|
|
365
|
+
export function getSecurityMiddleware(config) {
|
|
366
|
+
if (!globalMiddleware) {
|
|
367
|
+
globalMiddleware = new CognitiveSecurityMiddleware(config);
|
|
368
|
+
}
|
|
369
|
+
return globalMiddleware;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Reset global middleware (for testing)
|
|
373
|
+
*/
|
|
374
|
+
export function resetSecurityMiddleware() {
|
|
375
|
+
globalMiddleware = null;
|
|
376
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Loader - Load Coder configuration files
|
|
3
|
+
*
|
|
4
|
+
* Loads from:
|
|
5
|
+
* 1. ~/.claude.json (MCP servers, project settings)
|
|
6
|
+
* 2. ~/.claude/settings.json (hooks, permissions)
|
|
7
|
+
* 3. ~/.claude/keybindings.json (keybindings)
|
|
8
|
+
* 4. .claude/settings.json (project-level overrides)
|
|
9
|
+
*/
|
|
10
|
+
import type { MCPServerConfig, PermissionMode, HookDefinition, HookEvent } from "../types/index.js";
|
|
11
|
+
export interface ClaudeMainConfig {
|
|
12
|
+
numStartups?: number;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
preferredNotifChannel?: "terminal_bell" | "notification";
|
|
15
|
+
projects?: Record<string, ProjectConfig>;
|
|
16
|
+
mcpServers?: Record<string, MCPServerConfig>;
|
|
17
|
+
}
|
|
18
|
+
export interface ProjectConfig {
|
|
19
|
+
allowedTools?: string[];
|
|
20
|
+
mcpServers?: Record<string, MCPServerConfig>;
|
|
21
|
+
enabledMcpjsonServers?: string[];
|
|
22
|
+
disabledMcpjsonServers?: string[];
|
|
23
|
+
hasTrustDialogAccepted?: boolean;
|
|
24
|
+
lastSessionId?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SettingsConfig {
|
|
27
|
+
hooks?: Partial<Record<HookEvent, HookMatcherConfig[]>>;
|
|
28
|
+
permissions?: {
|
|
29
|
+
defaultMode?: PermissionMode;
|
|
30
|
+
allowedTools?: string[];
|
|
31
|
+
disallowedTools?: string[];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface HookMatcherConfig {
|
|
35
|
+
matcher?: string;
|
|
36
|
+
hooks: Array<{
|
|
37
|
+
type: "command" | "prompt";
|
|
38
|
+
command?: string;
|
|
39
|
+
prompt?: string;
|
|
40
|
+
timeout?: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface KeybindingConfig {
|
|
44
|
+
bindings: Array<{
|
|
45
|
+
key: string;
|
|
46
|
+
command: string;
|
|
47
|
+
when?: string;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
export interface LoadedConfig {
|
|
51
|
+
main: ClaudeMainConfig;
|
|
52
|
+
settings: SettingsConfig;
|
|
53
|
+
keybindings: KeybindingConfig;
|
|
54
|
+
projectSettings: SettingsConfig;
|
|
55
|
+
sources: string[];
|
|
56
|
+
}
|
|
57
|
+
export declare const CONFIG_PATHS: {
|
|
58
|
+
main: string;
|
|
59
|
+
settings: string;
|
|
60
|
+
keybindings: string;
|
|
61
|
+
projectSettings: (projectDir: string) => string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Load main ~/.claude.json config
|
|
65
|
+
*/
|
|
66
|
+
export declare function loadMainConfig(): Promise<{
|
|
67
|
+
config: ClaudeMainConfig;
|
|
68
|
+
loaded: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Load settings from ~/.claude/settings.json
|
|
72
|
+
*/
|
|
73
|
+
export declare function loadSettings(): Promise<{
|
|
74
|
+
config: SettingsConfig;
|
|
75
|
+
loaded: boolean;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Load keybindings from ~/.claude/keybindings.json
|
|
79
|
+
*/
|
|
80
|
+
export declare function loadKeybindings(): Promise<{
|
|
81
|
+
config: KeybindingConfig;
|
|
82
|
+
loaded: boolean;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Load project-level settings
|
|
86
|
+
*/
|
|
87
|
+
export declare function loadProjectSettings(projectDir: string): Promise<{
|
|
88
|
+
config: SettingsConfig;
|
|
89
|
+
loaded: boolean;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Get project-specific config from main config
|
|
93
|
+
*/
|
|
94
|
+
export declare function getProjectConfig(mainConfig: ClaudeMainConfig, projectDir: string): ProjectConfig | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Load all configs at once
|
|
97
|
+
*/
|
|
98
|
+
export declare function loadAllConfigs(projectDir?: string): Promise<LoadedConfig>;
|
|
99
|
+
/**
|
|
100
|
+
* Get merged settings (global + project overrides)
|
|
101
|
+
*/
|
|
102
|
+
export declare function getMergedSettings(global: SettingsConfig, project: SettingsConfig): SettingsConfig;
|
|
103
|
+
/**
|
|
104
|
+
* Get all MCP servers (global + project-specific)
|
|
105
|
+
*/
|
|
106
|
+
export declare function getAllMCPServers(mainConfig: ClaudeMainConfig, projectDir: string): Record<string, MCPServerConfig>;
|
|
107
|
+
/**
|
|
108
|
+
* Get hooks for a specific event and tool
|
|
109
|
+
*/
|
|
110
|
+
export declare function getHooksForEvent(settings: SettingsConfig, event: HookEvent, toolName?: string): HookMatcherConfig["hooks"];
|
|
111
|
+
/**
|
|
112
|
+
* Convert settings hooks to HookDefinitions for HookManager
|
|
113
|
+
*/
|
|
114
|
+
export declare function settingsToHookDefinitions(settings: SettingsConfig): Partial<Record<HookEvent, HookDefinition[]>>;
|
|
115
|
+
/**
|
|
116
|
+
* Get permission mode from settings
|
|
117
|
+
*/
|
|
118
|
+
export declare function getPermissionMode(settings: SettingsConfig): PermissionMode;
|
|
119
|
+
/**
|
|
120
|
+
* Get allowed tools from settings
|
|
121
|
+
*/
|
|
122
|
+
export declare function getAllowedTools(settings: SettingsConfig): Set<string>;
|
|
123
|
+
/**
|
|
124
|
+
* Get disallowed tools from settings
|
|
125
|
+
*/
|
|
126
|
+
export declare function getDisallowedTools(settings: SettingsConfig): Set<string>;
|
|
127
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../packages/src/core/config-loader.ts"],"names":[],"mappings":"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"}
|