@jigyasudham/veto 1.2.2 → 1.2.6
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 +29 -6
- package/dist/adapters/index.d.ts +46 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +47 -8
- package/dist/adapters/index.js.map +1 -0
- package/dist/agents/development/api.d.ts +3 -0
- package/dist/agents/development/api.d.ts.map +1 -0
- package/dist/agents/development/api.js.map +1 -0
- package/dist/agents/development/backend.d.ts +3 -0
- package/dist/agents/development/backend.d.ts.map +1 -0
- package/dist/agents/development/backend.js.map +1 -0
- package/dist/agents/development/coder.d.ts +3 -0
- package/dist/agents/development/coder.d.ts.map +1 -0
- package/dist/agents/development/coder.js.map +1 -0
- package/dist/agents/development/database.d.ts +3 -0
- package/dist/agents/development/database.d.ts.map +1 -0
- package/dist/agents/development/database.js +175 -52
- package/dist/agents/development/database.js.map +1 -0
- package/dist/agents/development/debugger.d.ts +3 -0
- package/dist/agents/development/debugger.d.ts.map +1 -0
- package/dist/agents/development/debugger.js.map +1 -0
- package/dist/agents/development/devops.d.ts +3 -0
- package/dist/agents/development/devops.d.ts.map +1 -0
- package/dist/agents/development/devops.js +190 -55
- package/dist/agents/development/devops.js.map +1 -0
- package/dist/agents/development/frontend.d.ts +3 -0
- package/dist/agents/development/frontend.d.ts.map +1 -0
- package/dist/agents/development/frontend.js.map +1 -0
- package/dist/agents/development/migration.d.ts +3 -0
- package/dist/agents/development/migration.d.ts.map +1 -0
- package/dist/agents/development/migration.js.map +1 -0
- package/dist/agents/development/performance.d.ts +3 -0
- package/dist/agents/development/performance.d.ts.map +1 -0
- package/dist/agents/development/performance.js.map +1 -0
- package/dist/agents/development/refactor.d.ts +3 -0
- package/dist/agents/development/refactor.d.ts.map +1 -0
- package/dist/agents/development/refactor.js.map +1 -0
- package/dist/agents/development/reviewer.d.ts +4 -0
- package/dist/agents/development/reviewer.d.ts.map +1 -0
- package/dist/agents/development/reviewer.js +34 -17
- package/dist/agents/development/reviewer.js.map +1 -0
- package/dist/agents/development/tester.d.ts +3 -0
- package/dist/agents/development/tester.d.ts.map +1 -0
- package/dist/agents/development/tester.js.map +1 -0
- package/dist/agents/executor.d.ts +4 -0
- package/dist/agents/executor.d.ts.map +1 -0
- package/dist/agents/executor.js +10 -1
- package/dist/agents/executor.js.map +1 -0
- package/dist/agents/memory/context-manager.d.ts +3 -0
- package/dist/agents/memory/context-manager.d.ts.map +1 -0
- package/dist/agents/memory/context-manager.js.map +1 -0
- package/dist/agents/memory/decision-logger.d.ts +3 -0
- package/dist/agents/memory/decision-logger.d.ts.map +1 -0
- package/dist/agents/memory/decision-logger.js.map +1 -0
- package/dist/agents/memory/knowledge-base.d.ts +3 -0
- package/dist/agents/memory/knowledge-base.d.ts.map +1 -0
- package/dist/agents/memory/knowledge-base.js.map +1 -0
- package/dist/agents/memory/pattern-learner.d.ts +3 -0
- package/dist/agents/memory/pattern-learner.d.ts.map +1 -0
- package/dist/agents/memory/pattern-learner.js.map +1 -0
- package/dist/agents/memory/project-mapper.d.ts +3 -0
- package/dist/agents/memory/project-mapper.d.ts.map +1 -0
- package/dist/agents/memory/project-mapper.js.map +1 -0
- package/dist/agents/quality/accessibility.d.ts +4 -0
- package/dist/agents/quality/accessibility.d.ts.map +1 -0
- package/dist/agents/quality/accessibility.js.map +1 -0
- package/dist/agents/quality/code-quality.d.ts +4 -0
- package/dist/agents/quality/code-quality.d.ts.map +1 -0
- package/dist/agents/quality/code-quality.js.map +1 -0
- package/dist/agents/quality/compatibility.d.ts +3 -0
- package/dist/agents/quality/compatibility.d.ts.map +1 -0
- package/dist/agents/quality/compatibility.js.map +1 -0
- package/dist/agents/quality/documentation.d.ts +4 -0
- package/dist/agents/quality/documentation.d.ts.map +1 -0
- package/dist/agents/quality/documentation.js.map +1 -0
- package/dist/agents/quality/error-handling.d.ts +4 -0
- package/dist/agents/quality/error-handling.d.ts.map +1 -0
- package/dist/agents/quality/error-handling.js.map +1 -0
- package/dist/agents/research/competitor-analyzer.d.ts +3 -0
- package/dist/agents/research/competitor-analyzer.d.ts.map +1 -0
- package/dist/agents/research/competitor-analyzer.js.map +1 -0
- package/dist/agents/research/cost-analyzer.d.ts +3 -0
- package/dist/agents/research/cost-analyzer.d.ts.map +1 -0
- package/dist/agents/research/cost-analyzer.js.map +1 -0
- package/dist/agents/research/estimator.d.ts +3 -0
- package/dist/agents/research/estimator.d.ts.map +1 -0
- package/dist/agents/research/estimator.js.map +1 -0
- package/dist/agents/research/ethics-bias.d.ts +3 -0
- package/dist/agents/research/ethics-bias.d.ts.map +1 -0
- package/dist/agents/research/ethics-bias.js.map +1 -0
- package/dist/agents/research/researcher.d.ts +3 -0
- package/dist/agents/research/researcher.d.ts.map +1 -0
- package/dist/agents/research/researcher.js.map +1 -0
- package/dist/agents/research/risk-assessor.d.ts +3 -0
- package/dist/agents/research/risk-assessor.d.ts.map +1 -0
- package/dist/agents/research/risk-assessor.js.map +1 -0
- package/dist/agents/research/tech-advisor.d.ts +3 -0
- package/dist/agents/research/tech-advisor.d.ts.map +1 -0
- package/dist/agents/research/tech-advisor.js.map +1 -0
- package/dist/agents/security/auth.d.ts +3 -0
- package/dist/agents/security/auth.d.ts.map +1 -0
- package/dist/agents/security/auth.js.map +1 -0
- package/dist/agents/security/dependency-audit.d.ts +19 -0
- package/dist/agents/security/dependency-audit.d.ts.map +1 -0
- package/dist/agents/security/dependency-audit.js.map +1 -0
- package/dist/agents/security/penetration.d.ts +3 -0
- package/dist/agents/security/penetration.d.ts.map +1 -0
- package/dist/agents/security/penetration.js.map +1 -0
- package/dist/agents/security/privacy.d.ts +3 -0
- package/dist/agents/security/privacy.d.ts.map +1 -0
- package/dist/agents/security/privacy.js.map +1 -0
- package/dist/agents/security/scanner.d.ts +4 -0
- package/dist/agents/security/scanner.d.ts.map +1 -0
- package/dist/agents/security/scanner.js.map +1 -0
- package/dist/agents/security/secrets.d.ts +12 -0
- package/dist/agents/security/secrets.d.ts.map +1 -0
- package/dist/agents/security/secrets.js.map +1 -0
- package/dist/agents/types.d.ts +62 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/workflow/automation.d.ts +3 -0
- package/dist/agents/workflow/automation.d.ts.map +1 -0
- package/dist/agents/workflow/automation.js.map +1 -0
- package/dist/agents/workflow/file-manager.d.ts +3 -0
- package/dist/agents/workflow/file-manager.d.ts.map +1 -0
- package/dist/agents/workflow/file-manager.js.map +1 -0
- package/dist/agents/workflow/git-agent.d.ts +3 -0
- package/dist/agents/workflow/git-agent.d.ts.map +1 -0
- package/dist/agents/workflow/git-agent.js.map +1 -0
- package/dist/agents/workflow/reporter.d.ts +3 -0
- package/dist/agents/workflow/reporter.d.ts.map +1 -0
- package/dist/agents/workflow/reporter.js.map +1 -0
- package/dist/agents/workflow/search-agent.d.ts +3 -0
- package/dist/agents/workflow/search-agent.d.ts.map +1 -0
- package/dist/agents/workflow/search-agent.js.map +1 -0
- package/dist/agents/workflow/task-coordinator.d.ts +3 -0
- package/dist/agents/workflow/task-coordinator.d.ts.map +1 -0
- package/dist/agents/workflow/task-coordinator.js.map +1 -0
- package/dist/agents/workflow/task-planner.d.ts +3 -0
- package/dist/agents/workflow/task-planner.d.ts.map +1 -0
- package/dist/agents/workflow/task-planner.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -0
- package/dist/context/reader.d.ts +12 -0
- package/dist/context/reader.d.ts.map +1 -0
- package/dist/context/reader.js.map +1 -0
- package/dist/council/decision-engine.d.ts +11 -0
- package/dist/council/decision-engine.d.ts.map +1 -0
- package/dist/council/decision-engine.js.map +1 -0
- package/dist/council/devil-advocate.d.ts +3 -0
- package/dist/council/devil-advocate.d.ts.map +1 -0
- package/dist/council/devil-advocate.js +46 -0
- package/dist/council/devil-advocate.js.map +1 -0
- package/dist/council/index.d.ts +4 -0
- package/dist/council/index.d.ts.map +1 -0
- package/dist/council/index.js +9 -11
- package/dist/council/index.js.map +1 -0
- package/dist/council/lead-developer.d.ts +3 -0
- package/dist/council/lead-developer.d.ts.map +1 -0
- package/dist/council/lead-developer.js +65 -1
- package/dist/council/lead-developer.js.map +1 -0
- package/dist/council/legal-compliance.d.ts +3 -0
- package/dist/council/legal-compliance.d.ts.map +1 -0
- package/dist/council/legal-compliance.js +43 -0
- package/dist/council/legal-compliance.js.map +1 -0
- package/dist/council/product-manager.d.ts +3 -0
- package/dist/council/product-manager.d.ts.map +1 -0
- package/dist/council/product-manager.js +47 -0
- package/dist/council/product-manager.js.map +1 -0
- package/dist/council/security.d.ts +3 -0
- package/dist/council/security.d.ts.map +1 -0
- package/dist/council/security.js +48 -0
- package/dist/council/security.js.map +1 -0
- package/dist/council/system-architect.d.ts +3 -0
- package/dist/council/system-architect.d.ts.map +1 -0
- package/dist/council/system-architect.js +53 -1
- package/dist/council/system-architect.js.map +1 -0
- package/dist/council/types.d.ts +32 -0
- package/dist/council/types.d.ts.map +1 -0
- package/dist/council/types.js.map +1 -0
- package/dist/council/ux-designer.d.ts +3 -0
- package/dist/council/ux-designer.d.ts.map +1 -0
- package/dist/council/ux-designer.js +44 -1
- package/dist/council/ux-designer.js.map +1 -0
- package/dist/github/pr-fetcher.d.ts +25 -0
- package/dist/github/pr-fetcher.d.ts.map +1 -0
- package/dist/github/pr-fetcher.js +60 -0
- package/dist/github/pr-fetcher.js.map +1 -0
- package/dist/memory/local.d.ts +144 -0
- package/dist/memory/local.d.ts.map +1 -0
- package/dist/memory/local.js +19 -19
- package/dist/memory/local.js.map +1 -0
- package/dist/memory/schema.d.ts +81 -0
- package/dist/memory/schema.d.ts.map +1 -0
- package/dist/memory/schema.js +2 -1
- package/dist/memory/schema.js.map +1 -0
- package/dist/memory/sync.d.ts +24 -0
- package/dist/memory/sync.d.ts.map +1 -0
- package/dist/memory/sync.js.map +1 -0
- package/dist/plugins/loader.d.ts +13 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/router/complexity-scorer.d.ts +18 -0
- package/dist/router/complexity-scorer.d.ts.map +1 -0
- package/dist/router/complexity-scorer.js.map +1 -0
- package/dist/router/context-compressor.d.ts +11 -0
- package/dist/router/context-compressor.d.ts.map +1 -0
- package/dist/router/context-compressor.js.map +1 -0
- package/dist/router/index.d.ts +27 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/learning-updater.d.ts +61 -0
- package/dist/router/learning-updater.d.ts.map +1 -0
- package/dist/router/learning-updater.js.map +1 -0
- package/dist/router/model-selector.d.ts +14 -0
- package/dist/router/model-selector.d.ts.map +1 -0
- package/dist/router/model-selector.js.map +1 -0
- package/dist/router/rate-monitor.d.ts +19 -0
- package/dist/router/rate-monitor.d.ts.map +1 -0
- package/dist/router/rate-monitor.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +297 -73
- package/dist/server.js.map +1 -0
- package/dist/skills/development/skill-api-design.d.ts +15 -0
- package/dist/skills/development/skill-api-design.d.ts.map +1 -0
- package/dist/skills/development/skill-api-design.js.map +1 -0
- package/dist/skills/development/skill-auth.d.ts +15 -0
- package/dist/skills/development/skill-auth.d.ts.map +1 -0
- package/dist/skills/development/skill-auth.js.map +1 -0
- package/dist/skills/development/skill-ci-cd.d.ts +2 -0
- package/dist/skills/development/skill-ci-cd.d.ts.map +1 -0
- package/dist/skills/development/skill-ci-cd.js.map +1 -0
- package/dist/skills/development/skill-crud.d.ts +15 -0
- package/dist/skills/development/skill-crud.d.ts.map +1 -0
- package/dist/skills/development/skill-crud.js.map +1 -0
- package/dist/skills/development/skill-db-schema.d.ts +2 -0
- package/dist/skills/development/skill-db-schema.d.ts.map +1 -0
- package/dist/skills/development/skill-db-schema.js.map +1 -0
- package/dist/skills/development/skill-docker.d.ts +2 -0
- package/dist/skills/development/skill-docker.d.ts.map +1 -0
- package/dist/skills/development/skill-docker.js.map +1 -0
- package/dist/skills/development/skill-env-setup.d.ts +2 -0
- package/dist/skills/development/skill-env-setup.d.ts.map +1 -0
- package/dist/skills/development/skill-env-setup.js.map +1 -0
- package/dist/skills/development/skill-scaffold.d.ts +15 -0
- package/dist/skills/development/skill-scaffold.d.ts.map +1 -0
- package/dist/skills/development/skill-scaffold.js.map +1 -0
- package/dist/skills/intelligence/skill-complexity-score.d.ts +15 -0
- package/dist/skills/intelligence/skill-complexity-score.d.ts.map +1 -0
- package/dist/skills/intelligence/skill-complexity-score.js.map +1 -0
- package/dist/skills/intelligence/skill-cost-track.d.ts +14 -0
- package/dist/skills/intelligence/skill-cost-track.d.ts.map +1 -0
- package/dist/skills/intelligence/skill-cost-track.js.map +1 -0
- package/dist/skills/intelligence/skill-learning-loop.d.ts +15 -0
- package/dist/skills/intelligence/skill-learning-loop.d.ts.map +1 -0
- package/dist/skills/intelligence/skill-learning-loop.js.map +1 -0
- package/dist/skills/intelligence/skill-pattern-detect.d.ts +14 -0
- package/dist/skills/intelligence/skill-pattern-detect.d.ts.map +1 -0
- package/dist/skills/intelligence/skill-pattern-detect.js.map +1 -0
- package/dist/skills/intelligence/skill-rate-watch.d.ts +15 -0
- package/dist/skills/intelligence/skill-rate-watch.d.ts.map +1 -0
- package/dist/skills/intelligence/skill-rate-watch.js.map +1 -0
- package/dist/skills/memory/skill-context-compress.d.ts +15 -0
- package/dist/skills/memory/skill-context-compress.d.ts.map +1 -0
- package/dist/skills/memory/skill-context-compress.js.map +1 -0
- package/dist/skills/memory/skill-cross-sync.d.ts +15 -0
- package/dist/skills/memory/skill-cross-sync.d.ts.map +1 -0
- package/dist/skills/memory/skill-cross-sync.js.map +1 -0
- package/dist/skills/memory/skill-decision-log.d.ts +15 -0
- package/dist/skills/memory/skill-decision-log.d.ts.map +1 -0
- package/dist/skills/memory/skill-decision-log.js.map +1 -0
- package/dist/skills/memory/skill-session-restore.d.ts +15 -0
- package/dist/skills/memory/skill-session-restore.d.ts.map +1 -0
- package/dist/skills/memory/skill-session-restore.js.map +1 -0
- package/dist/skills/memory/skill-session-save.d.ts +15 -0
- package/dist/skills/memory/skill-session-save.d.ts.map +1 -0
- package/dist/skills/memory/skill-session-save.js.map +1 -0
- package/dist/skills/quality/skill-accessibility.d.ts +2 -0
- package/dist/skills/quality/skill-accessibility.d.ts.map +1 -0
- package/dist/skills/quality/skill-accessibility.js.map +1 -0
- package/dist/skills/quality/skill-code-review.d.ts +15 -0
- package/dist/skills/quality/skill-code-review.d.ts.map +1 -0
- package/dist/skills/quality/skill-code-review.js.map +1 -0
- package/dist/skills/quality/skill-docs-gen.d.ts +2 -0
- package/dist/skills/quality/skill-docs-gen.d.ts.map +1 -0
- package/dist/skills/quality/skill-docs-gen.js.map +1 -0
- package/dist/skills/quality/skill-perf-audit.d.ts +2 -0
- package/dist/skills/quality/skill-perf-audit.d.ts.map +1 -0
- package/dist/skills/quality/skill-perf-audit.js.map +1 -0
- package/dist/skills/quality/skill-security-scan.d.ts +15 -0
- package/dist/skills/quality/skill-security-scan.d.ts.map +1 -0
- package/dist/skills/quality/skill-security-scan.js.map +1 -0
- package/dist/skills/quality/skill-test-suite.d.ts +15 -0
- package/dist/skills/quality/skill-test-suite.d.ts.map +1 -0
- package/dist/skills/quality/skill-test-suite.js.map +1 -0
- package/dist/skills/workflow/skill-deploy.d.ts +2 -0
- package/dist/skills/workflow/skill-deploy.d.ts.map +1 -0
- package/dist/skills/workflow/skill-deploy.js.map +1 -0
- package/dist/skills/workflow/skill-git-workflow.d.ts +2 -0
- package/dist/skills/workflow/skill-git-workflow.d.ts.map +1 -0
- package/dist/skills/workflow/skill-git-workflow.js.map +1 -0
- package/dist/skills/workflow/skill-rollback.d.ts +2 -0
- package/dist/skills/workflow/skill-rollback.d.ts.map +1 -0
- package/dist/skills/workflow/skill-rollback.js.map +1 -0
- package/dist/skills/workflow/skill-task-breakdown.d.ts +2 -0
- package/dist/skills/workflow/skill-task-breakdown.d.ts.map +1 -0
- package/dist/skills/workflow/skill-task-breakdown.js.map +1 -0
- package/dist/watcher/index.d.ts +23 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/workflow/pipeline.d.ts +35 -0
- package/dist/workflow/pipeline.d.ts.map +1 -0
- package/dist/workflow/pipeline.js.map +1 -0
- package/package.json +2 -2
- package/dist/adapters/claude.js +0 -57
- package/dist/adapters/codex.js +0 -58
- package/dist/adapters/gemini.js +0 -58
- package/vitest.config.ts +0 -11
package/dist/council/security.js
CHANGED
|
@@ -157,6 +157,54 @@ export function analyze(task) {
|
|
|
157
157
|
recommendation: recommendations[0],
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
|
+
// Topic-based security analysis for tasks with no specific pattern matches
|
|
161
|
+
const TOPIC_INSIGHTS = [
|
|
162
|
+
{
|
|
163
|
+
pattern: /plugin|extensi|loader|dynamic.?import|user.?code/i,
|
|
164
|
+
concern: 'User-supplied code executed in the same process as the MCP server has full access to the filesystem, network, and database. A malicious plugin could exfiltrate memory, delete sessions, or escalate to arbitrary code execution.',
|
|
165
|
+
recommendation: 'Run plugins in a vm.Script sandbox with a restricted module allowlist. Verify plugin exports schema before loading. Log all plugin loads to the audit trail with file hash.',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
pattern: /llm|model|prompt|injection|user.?input/i,
|
|
169
|
+
concern: 'Prompt injection: a malicious user can craft a task description that overrides agent instructions, extracts system prompts, or causes the agent to produce harmful output.',
|
|
170
|
+
recommendation: 'Sanitize task inputs: strip control characters, enforce max length, validate against an allow-list of task types where possible. Never include raw user input verbatim in system prompts.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
pattern: /github|api|token|oauth|credential|key/i,
|
|
174
|
+
concern: 'API tokens stored in config files or environment variables can be read by any process with filesystem access. If the token leaks, all PRs and repositories it can access are compromised.',
|
|
175
|
+
recommendation: 'Never store tokens in plaintext config files. Use OS keychain or a secrets manager. Scope tokens to minimum required permissions (read-only for PR fetching).',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
pattern: /http|transport|remote|server|port|network/i,
|
|
179
|
+
concern: 'Adding HTTP transport changes Veto from a local-only tool to a network service. Without authentication and TLS, any process on the local network can call all 41 tools including memory deletion and file watching.',
|
|
180
|
+
recommendation: 'HTTP transport must require authentication from day one — even locally. Use mutual TLS or bearer tokens. Bind to 127.0.0.1 by default, not 0.0.0.0.',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
pattern: /mcp|tool|handler|input.?schema/i,
|
|
184
|
+
concern: 'MCP tool inputs are deserialized from JSON without schema validation in most handlers — args are accessed as `args?.field` with no type checking. A crafted tool call could pass unexpected types.',
|
|
185
|
+
recommendation: 'Validate all tool inputs with a schema library (zod) at the top of each handler. Reject calls with unexpected fields or wrong types immediately with a descriptive error.',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
pattern: /audit|log|event|trace/i,
|
|
189
|
+
concern: 'Audit logs that include user-supplied task content may inadvertently store sensitive information (API keys pasted in task descriptions, PII in code review requests).',
|
|
190
|
+
recommendation: 'Truncate task content in audit logs to the first 200 characters. Scan audit log entries for secrets before writing. Provide a log rotation/expiry policy.',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
pattern: /phase|feature|agent|improvement/i,
|
|
194
|
+
concern: 'New tools and agents increase the attack surface. Each new tool is a new entry point that can receive arbitrary user input and execute code.',
|
|
195
|
+
recommendation: 'For every new tool: define input validation, define maximum input size, consider what the worst-case malicious input looks like, and write a security note in the tool description.',
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
const topicMatched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
199
|
+
if (topicMatched.length > 0) {
|
|
200
|
+
const top = topicMatched.slice(0, 2);
|
|
201
|
+
return {
|
|
202
|
+
verdict: 'warn',
|
|
203
|
+
reason: top[0].concern,
|
|
204
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
205
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
160
208
|
return { verdict: 'approve', reason: 'No security threats identified in threat model.', concerns: [] };
|
|
161
209
|
}
|
|
162
210
|
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/council/security.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,GAAuE;IACtF;QACE,OAAO,EAAE,qKAAqK;QAC9K,MAAM,EAAE,0FAA0F;QAClG,cAAc,EAAE,4FAA4F;KAC7G;IACD;QACE,OAAO,EAAE,2EAA2E;QACpF,MAAM,EAAE,yFAAyF;QACjG,cAAc,EAAE,2FAA2F;KAC5G;IACD;QACE,OAAO,EAAE,wGAAwG;QACjH,MAAM,EAAE,oGAAoG;QAC5G,cAAc,EAAE,mFAAmF;KACpG;IACD;QACE,OAAO,EAAE,sEAAsE;QAC/E,MAAM,EAAE,wGAAwG;QAChH,cAAc,EAAE,2FAA2F;KAC5G;IACD;QACE,OAAO,EAAE,oEAAoE;QAC7E,MAAM,EAAE,oEAAoE;QAC5E,cAAc,EAAE,gFAAgF;KACjG;IACD;QACE,OAAO,EAAE,oFAAoF;QAC7F,MAAM,EAAE,uGAAuG;QAC/G,cAAc,EAAE,0FAA0F;KAC3G;IACD;QACE,OAAO,EAAE,2EAA2E;QACpF,MAAM,EAAE,iGAAiG;QACzG,cAAc,EAAE,gFAAgF;KACjG;IACD;QACE,OAAO,EAAE,mGAAmG;QAC5G,MAAM,EAAE,qGAAqG;QAC7G,cAAc,EAAE,+EAA+E;KAChG;IACD;QACE,OAAO,EAAE,mDAAmD;QAC5D,MAAM,EAAE,+EAA+E;QACvF,cAAc,EAAE,kFAAkF;KACnG;IACD;QACE,OAAO,EAAE,wDAAwD;QACjE,MAAM,EAAE,yFAAyF;QACjG,cAAc,EAAE,uFAAuF;KACxG;IACD;QACE,OAAO,EAAE,yEAAyE;QAClF,MAAM,EAAE,6FAA6F;QACrG,cAAc,EAAE,sFAAsF;KACvG;IACD;QACE,OAAO,EAAE,kGAAkG;QAC3G,MAAM,EAAE,2FAA2F;QACnG,cAAc,EAAE,8FAA8F;KAC/G;CACF,CAAC;AAEF,MAAM,UAAU,GAAwE;IACtF;QACE,OAAO,EAAE,+CAA+C;QACxD,OAAO,EAAE,2EAA2E;QACpF,cAAc,EAAE,4EAA4E;KAC7F;IACD;QACE,OAAO,EAAE,4EAA4E;QACrF,OAAO,EAAE,4FAA4F;QACrG,cAAc,EAAE,uEAAuE;KACxF;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,sFAAsF;QAC/F,cAAc,EAAE,gGAAgG;KACjH;IACD;QACE,OAAO,EAAE,kEAAkE;QAC3E,OAAO,EAAE,+EAA+E;QACxF,cAAc,EAAE,gFAAgF;KACjG;IACD;QACE,OAAO,EAAE,yDAAyD;QAClE,OAAO,EAAE,wFAAwF;QACjG,cAAc,EAAE,oGAAoG;KACrH;IACD;QACE,OAAO,EAAE,+CAA+C;QACxD,OAAO,EAAE,0FAA0F;QACnG,cAAc,EAAE,wFAAwF;KACzG;IACD;QACE,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,mFAAmF;QAC5F,cAAc,EAAE,yEAAyE;KAC1F;IACD;QACE,OAAO,EAAE,kEAAkE;QAC3E,OAAO,EAAE,gFAAgF;QACzF,cAAc,EAAE,uFAAuF;KACxG;IACD;QACE,OAAO,EAAE,+EAA+E;QACxF,OAAO,EAAE,4FAA4F;QACrG,cAAc,EAAE,qFAAqF;KACtG;IACD;QACE,OAAO,EAAE,oGAAoG;QAC7G,OAAO,EAAE,mEAAmE;QAC5E,cAAc,EAAE,mEAAmE;KACpF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,OAAO,EAAE,gFAAgF;QACzF,cAAc,EAAE,qFAAqF;KACtG;IACD;QACE,OAAO,EAAE,yEAAyE;QAClF,OAAO,EAAE,+EAA+E;QACxF,cAAc,EAAE,qFAAqF;KACtG;CACF,CAAC;AAEF,MAAM,OAAO,GAAG,0EAA0E,CAAC;AAE3F,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,wCAAwC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAsD,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;YACxB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5C,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,oBAAoB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iCAAiC;YAC7G,QAAQ;YACR,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,MAAM,cAAc,GAAwE;QAC1F;YACE,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE,mOAAmO;YAC5O,cAAc,EAAE,6KAA6K;SAC9L;QACD;YACE,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,4KAA4K;YACrL,cAAc,EAAE,2LAA2L;SAC5M;QACD;YACE,OAAO,EAAE,wCAAwC;YACjD,OAAO,EAAE,2LAA2L;YACpM,cAAc,EAAE,+JAA+J;SAChL;QACD;YACE,OAAO,EAAE,4CAA4C;YACrD,OAAO,EAAE,qNAAqN;YAC9N,cAAc,EAAE,qJAAqJ;SACtK;QACD;YACE,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE,oMAAoM;YAC7M,cAAc,EAAE,2KAA2K;SAC5L;QACD;YACE,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,uKAAuK;YAChL,cAAc,EAAE,2JAA2J;SAC5K;QACD;YACE,OAAO,EAAE,kCAAkC;YAC3C,OAAO,EAAE,8IAA8I;YACvJ,cAAc,EAAE,qLAAqL;SACtM;KACF,CAAC;IAEF,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;YACtB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1C,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,iDAAiD,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-architect.d.ts","sourceRoot":"","sources":["../../src/council/system-architect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqI5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAmD/C"}
|
|
@@ -83,6 +83,48 @@ const WARN_RULES = [
|
|
|
83
83
|
},
|
|
84
84
|
];
|
|
85
85
|
const TRIVIAL = /^(rename|fix typo|reorder|reformat|format|update comment|add comment)\b/i;
|
|
86
|
+
const TOPIC_INSIGHTS = [
|
|
87
|
+
{
|
|
88
|
+
pattern: /mcp|stdio|transport|protocol|server/i,
|
|
89
|
+
concern: 'stdio MCP transport processes one message at a time per connection. If any handler blocks the event loop (e.g. sync SQLite writes, CPU-heavy regex), all tool calls queue behind it.',
|
|
90
|
+
recommendation: 'Keep all MCP handlers async. Move any CPU-intensive work off the main handler with setImmediate or worker threads. Benchmark handler latency under concurrent tool calls.',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
pattern: /sqlite|database|db|persist|schema/i,
|
|
94
|
+
concern: 'SQLite WAL mode serialises writes but allows concurrent reads. Multiple MCP connections sharing one DB file without connection pooling can cause SQLITE_BUSY errors under load.',
|
|
95
|
+
recommendation: 'Use a single shared DB connection with WAL mode. For high-write scenarios, batch writes in transactions. Add busy_timeout pragma to handle lock contention gracefully.',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
pattern: /agent|worker|executor|parallel/i,
|
|
99
|
+
concern: 'A growing agent registry with a single switch-case dispatcher becomes a maintenance liability. Every new agent type requires editing the central switch.',
|
|
100
|
+
recommendation: 'Consider a registry pattern: agents register themselves at import time. The executor resolves by key, not by switch-case. New agents require no changes to the executor.',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
pattern: /llm|model|ai.?call|external.?api|fetch|http/i,
|
|
104
|
+
concern: 'LLM calls introduce an external dependency with variable latency (2–30s) and failure modes. The server must handle timeout, rate limit, and model error without crashing the MCP connection.',
|
|
105
|
+
recommendation: 'Wrap every external call in a circuit breaker. Set explicit timeouts. Cache responses where idempotency allows. Return a structured degraded response on failure, never throw.',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
pattern: /version|package\.json|semver/i,
|
|
109
|
+
concern: 'Multiple hardcoded version strings across server.ts, cli.ts, and adapter files create a drift problem that gets worse with each release.',
|
|
110
|
+
recommendation: 'Single source: read version from package.json at startup. Export it from one shared module. All other files import it.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
pattern: /plugin|extensi|loader|dynamic.?import/i,
|
|
114
|
+
concern: 'Dynamic plugin loading from user directories creates a security boundary: any code in ~/.veto/agents/ runs with full server privileges. There is currently no sandboxing.',
|
|
115
|
+
recommendation: 'Validate plugin exports schema before loading. Consider running plugins in a restricted vm.Script context. Log all plugin load events to the audit trail.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
pattern: /vscode|extension|ide|ui|frontend/i,
|
|
119
|
+
concern: 'VS Code extension + MCP server creates a distributed architecture: the extension communicates with the server via MCP protocol, not direct function calls. Version compatibility between extension and server must be managed explicitly.',
|
|
120
|
+
recommendation: 'Define a minimum server version requirement in the extension. On connect, call veto_status and verify server version meets the minimum. Show a clear upgrade prompt if not.',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
pattern: /phase|roadmap|migrat|upgrade/i,
|
|
124
|
+
concern: 'Schema migrations that run inline in the DB constructor (as currently implemented) are safe for additive changes but risky for destructive ones. There is no migration version tracking.',
|
|
125
|
+
recommendation: 'Add a schema_version table. Record each migration with a unique ID. Before running a migration, check if it has already been applied. This prevents re-running on restart.',
|
|
126
|
+
},
|
|
127
|
+
];
|
|
86
128
|
export function analyze(task) {
|
|
87
129
|
if (TRIVIAL.test(task.trim())) {
|
|
88
130
|
return { verdict: 'approve', reason: 'Trivial change — no architectural concerns.', concerns: [] };
|
|
@@ -117,6 +159,16 @@ export function analyze(task) {
|
|
|
117
159
|
recommendation: recommendations[0],
|
|
118
160
|
};
|
|
119
161
|
}
|
|
120
|
-
|
|
162
|
+
const matched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
163
|
+
if (matched.length > 0) {
|
|
164
|
+
const top = matched.slice(0, 2);
|
|
165
|
+
return {
|
|
166
|
+
verdict: 'warn',
|
|
167
|
+
reason: top[0].concern,
|
|
168
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
169
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { verdict: 'approve', reason: 'Architecture looks sound. No structural concerns identified.', concerns: [] };
|
|
121
173
|
}
|
|
122
174
|
//# sourceMappingURL=system-architect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-architect.js","sourceRoot":"","sources":["../../src/council/system-architect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type AgentVerdict = 'approve' | 'warn' | 'block';
|
|
2
|
+
export type CouncilVerdict = 'GREEN' | 'YELLOW' | 'RED' | 'DEADLOCK';
|
|
3
|
+
export interface AgentVote {
|
|
4
|
+
verdict: AgentVerdict;
|
|
5
|
+
reason: string;
|
|
6
|
+
concerns: string[];
|
|
7
|
+
recommendation?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DebateInput {
|
|
10
|
+
task: string;
|
|
11
|
+
context?: string;
|
|
12
|
+
project_dir?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DebateResult {
|
|
15
|
+
task: string;
|
|
16
|
+
final_verdict: CouncilVerdict;
|
|
17
|
+
votes: {
|
|
18
|
+
lead_dev: AgentVote;
|
|
19
|
+
pm: AgentVote;
|
|
20
|
+
architect: AgentVote;
|
|
21
|
+
ux: AgentVote;
|
|
22
|
+
devil: AgentVote;
|
|
23
|
+
legal: AgentVote;
|
|
24
|
+
security: AgentVote;
|
|
25
|
+
};
|
|
26
|
+
recommended: string;
|
|
27
|
+
block_reasons: string[];
|
|
28
|
+
warnings: string[];
|
|
29
|
+
debated_at: string;
|
|
30
|
+
formatted_output: string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/council/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,cAAc,CAAC;IAC9B,KAAK,EAAE;QACL,QAAQ,EAAE,SAAS,CAAC;QACpB,EAAE,EAAE,SAAS,CAAC;QACd,SAAS,EAAE,SAAS,CAAC;QACrB,EAAE,EAAE,SAAS,CAAC;QACd,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,QAAQ,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/council/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ux-designer.d.ts","sourceRoot":"","sources":["../../src/council/ux-designer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqE5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CA+F/C"}
|
|
@@ -104,6 +104,49 @@ export function analyze(task) {
|
|
|
104
104
|
recommendation: recommendations[0],
|
|
105
105
|
};
|
|
106
106
|
}
|
|
107
|
-
|
|
107
|
+
// Topic-based UX analysis for tasks with no direct frontend signals
|
|
108
|
+
const TOPIC_INSIGHTS = [
|
|
109
|
+
{
|
|
110
|
+
pattern: /cli|terminal|command.?line|help|flag|arg/i,
|
|
111
|
+
concern: 'CLI UX is still UX. Commands that give no feedback on success, have inconsistent flag names, or print walls of unformatted text drive users to abandon the tool.',
|
|
112
|
+
recommendation: 'Every CLI command needs: success/fail output, consistent flag naming (kebab-case), and color-coded status (green/red/yellow). Test with a first-time user.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
pattern: /error|message|feedback|output|response/i,
|
|
116
|
+
concern: 'Technical error messages like "TypeError: Cannot read property of undefined" tell the developer nothing actionable. Users want to know what to do, not what went wrong internally.',
|
|
117
|
+
recommendation: 'Every user-facing error must include: what failed, why it failed (if knowable), and what the user should do next. Never expose stack traces.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
pattern: /install|setup|init|onboard|first.?run/i,
|
|
121
|
+
concern: 'Onboarding friction is the leading cause of tool abandonment. Every extra step in setup loses 20–30% of users. The first experience must succeed or users never return.',
|
|
122
|
+
recommendation: 'Time-box the happy path setup to under 2 minutes. Every step must have a clear success indicator. Provide a single copy-paste command that does everything.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
pattern: /vscode|extension|sidebar|panel|button/i,
|
|
126
|
+
concern: 'VS Code extensions that clutter the UI with too many buttons and panels feel like bloatware. Users uninstall extensions that are visually noisy.',
|
|
127
|
+
recommendation: 'Default to minimal UI: one status bar item. Expand to sidebar only when user explicitly enables it. Follow VS Code\'s own design patterns and icon conventions.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
pattern: /41.?tool|tool.?count|tool.?list|discover/i,
|
|
131
|
+
concern: '41 tools requires users to read documentation before they can use the product. No tool is valuable if users can\'t discover it exists.',
|
|
132
|
+
recommendation: 'Make veto_discover the entry point. Ship it as the first thing users learn about. Consider surfacing 3 "most useful for your current task" recommendations automatically.',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
pattern: /wait|loading|slow|latency|timeout/i,
|
|
136
|
+
concern: 'Operations that take more than 300ms with no feedback feel broken to users. For LLM-backed operations (2–30s), silence is indistinguishable from a crash.',
|
|
137
|
+
recommendation: 'Show progress for any operation over 500ms. For long operations, stream partial results or show a "working..." status. Never leave the user in silence.',
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
const topicMatched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
141
|
+
if (topicMatched.length > 0) {
|
|
142
|
+
const top = topicMatched.slice(0, 2);
|
|
143
|
+
return {
|
|
144
|
+
verdict: 'warn',
|
|
145
|
+
reason: top[0].concern,
|
|
146
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
147
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { verdict: 'approve', reason: 'UX looks solid. No user experience concerns identified.', concerns: [] };
|
|
108
151
|
}
|
|
109
152
|
//# sourceMappingURL=ux-designer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ux-designer.js","sourceRoot":"","sources":["../../src/council/ux-designer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface PrMeta {
|
|
2
|
+
owner: string;
|
|
3
|
+
repo: string;
|
|
4
|
+
number: number;
|
|
5
|
+
title: string;
|
|
6
|
+
author: string;
|
|
7
|
+
base_branch: string;
|
|
8
|
+
head_branch: string;
|
|
9
|
+
html_url: string;
|
|
10
|
+
additions: number;
|
|
11
|
+
deletions: number;
|
|
12
|
+
changed_files: number;
|
|
13
|
+
state: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PrFetchResult {
|
|
16
|
+
ok: true;
|
|
17
|
+
diff: string;
|
|
18
|
+
meta: PrMeta;
|
|
19
|
+
}
|
|
20
|
+
export interface PrFetchError {
|
|
21
|
+
ok: false;
|
|
22
|
+
error: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function fetchPrDiff(prUrl: string): Promise<PrFetchResult | PrFetchError>;
|
|
25
|
+
//# sourceMappingURL=pr-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-fetcher.d.ts","sourceRoot":"","sources":["../../src/github/pr-fetcher.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf;AAiBD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC,CAgDtF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Fetches a GitHub PR diff and metadata via the GitHub REST API.
|
|
2
|
+
// Supports public repos without auth; set GITHUB_TOKEN for private repos.
|
|
3
|
+
function parsePrUrl(url) {
|
|
4
|
+
const m = url.match(/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/);
|
|
5
|
+
if (!m)
|
|
6
|
+
return null;
|
|
7
|
+
return { owner: m[1], repo: m[2], number: parseInt(m[3], 10) };
|
|
8
|
+
}
|
|
9
|
+
function githubHeaders() {
|
|
10
|
+
const headers = {
|
|
11
|
+
'User-Agent': 'veto-mcp-server',
|
|
12
|
+
};
|
|
13
|
+
const token = process.env.GITHUB_TOKEN;
|
|
14
|
+
if (token)
|
|
15
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
16
|
+
return headers;
|
|
17
|
+
}
|
|
18
|
+
export async function fetchPrDiff(prUrl) {
|
|
19
|
+
const parsed = parsePrUrl(prUrl);
|
|
20
|
+
if (!parsed) {
|
|
21
|
+
return { ok: false, error: `Cannot parse PR URL. Expected format: https://github.com/owner/repo/pull/123` };
|
|
22
|
+
}
|
|
23
|
+
const { owner, repo, number } = parsed;
|
|
24
|
+
const apiBase = `https://api.github.com/repos/${owner}/${repo}/pulls/${number}`;
|
|
25
|
+
// Fetch PR metadata and diff in parallel
|
|
26
|
+
const [metaRes, diffRes] = await Promise.all([
|
|
27
|
+
fetch(apiBase, { headers: githubHeaders() }),
|
|
28
|
+
fetch(apiBase, { headers: { ...githubHeaders(), Accept: 'application/vnd.github.v3.diff' } }),
|
|
29
|
+
]);
|
|
30
|
+
if (metaRes.status === 404) {
|
|
31
|
+
return { ok: false, error: `PR not found: ${prUrl}. Check the URL and ensure GITHUB_TOKEN is set for private repos.` };
|
|
32
|
+
}
|
|
33
|
+
if (metaRes.status === 401 || metaRes.status === 403) {
|
|
34
|
+
return { ok: false, error: `GitHub API auth error (${metaRes.status}). Set the GITHUB_TOKEN environment variable.` };
|
|
35
|
+
}
|
|
36
|
+
if (!metaRes.ok) {
|
|
37
|
+
return { ok: false, error: `GitHub API error ${metaRes.status}: ${metaRes.statusText}` };
|
|
38
|
+
}
|
|
39
|
+
const pr = await metaRes.json();
|
|
40
|
+
const diff = diffRes.ok ? await diffRes.text() : '';
|
|
41
|
+
if (!diff.trim()) {
|
|
42
|
+
return { ok: false, error: `PR #${number} has no diff (may be empty or already merged with no changes).` };
|
|
43
|
+
}
|
|
44
|
+
const meta = {
|
|
45
|
+
owner,
|
|
46
|
+
repo,
|
|
47
|
+
number,
|
|
48
|
+
title: String(pr.title ?? ''),
|
|
49
|
+
author: String(pr.user?.login ?? ''),
|
|
50
|
+
base_branch: String(pr.base?.ref ?? ''),
|
|
51
|
+
head_branch: String(pr.head?.ref ?? ''),
|
|
52
|
+
html_url: String(pr.html_url ?? prUrl),
|
|
53
|
+
additions: Number(pr.additions ?? 0),
|
|
54
|
+
deletions: Number(pr.deletions ?? 0),
|
|
55
|
+
changed_files: Number(pr.changed_files ?? 0),
|
|
56
|
+
state: String(pr.state ?? 'unknown'),
|
|
57
|
+
};
|
|
58
|
+
return { ok: true, diff, meta };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=pr-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-fetcher.js","sourceRoot":"","sources":["../../src/github/pr-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { type SessionRow, type KnowledgeRow, type KnowledgeType, type ProjectMapRow } from './schema.js';
|
|
3
|
+
export declare const CONTEXT_WINDOWS: Record<string, number>;
|
|
4
|
+
export declare function resetDb(): void;
|
|
5
|
+
export declare function getDb(): DatabaseSync;
|
|
6
|
+
export type SaveSessionInput = {
|
|
7
|
+
platform?: string;
|
|
8
|
+
connection_type?: string;
|
|
9
|
+
project_dir?: string;
|
|
10
|
+
summary?: string;
|
|
11
|
+
context?: string;
|
|
12
|
+
task_state?: string;
|
|
13
|
+
token_count?: number;
|
|
14
|
+
};
|
|
15
|
+
export type SessionSaveResult = {
|
|
16
|
+
session_id: string;
|
|
17
|
+
saved_at: string;
|
|
18
|
+
context_warning: boolean;
|
|
19
|
+
usage_pct: number;
|
|
20
|
+
continuation_prompt: string | null;
|
|
21
|
+
};
|
|
22
|
+
export declare function saveSession(input: SaveSessionInput): SessionSaveResult;
|
|
23
|
+
export type RestoreSessionResult = {
|
|
24
|
+
found: boolean;
|
|
25
|
+
session?: SessionRow;
|
|
26
|
+
};
|
|
27
|
+
export declare function restoreSession(session_id: string, active_client?: string): RestoreSessionResult;
|
|
28
|
+
export declare function listSessions(limit?: number): SessionRow[];
|
|
29
|
+
export declare function closeSession(session_id: string): void;
|
|
30
|
+
export declare function getDbPath(): string;
|
|
31
|
+
export type SaveCouncilOutcomeInput = {
|
|
32
|
+
session_id?: string;
|
|
33
|
+
task: string;
|
|
34
|
+
verdict: string;
|
|
35
|
+
lead_dev: string;
|
|
36
|
+
pm: string;
|
|
37
|
+
architect: string;
|
|
38
|
+
ux: string;
|
|
39
|
+
devil: string;
|
|
40
|
+
legal: string;
|
|
41
|
+
security: string;
|
|
42
|
+
recommended: string;
|
|
43
|
+
duration_ms?: number;
|
|
44
|
+
};
|
|
45
|
+
export declare function saveCouncilOutcome(input: SaveCouncilOutcomeInput): string;
|
|
46
|
+
export type StoreKnowledgeInput = {
|
|
47
|
+
type?: KnowledgeType;
|
|
48
|
+
title: string;
|
|
49
|
+
content: string;
|
|
50
|
+
tags?: string[];
|
|
51
|
+
project_dir?: string;
|
|
52
|
+
session_id?: string;
|
|
53
|
+
relevance?: number;
|
|
54
|
+
};
|
|
55
|
+
export declare function storeKnowledge(input: StoreKnowledgeInput): string;
|
|
56
|
+
export type SearchKnowledgeOptions = {
|
|
57
|
+
query?: string;
|
|
58
|
+
type?: KnowledgeType;
|
|
59
|
+
tags?: string[];
|
|
60
|
+
project_dir?: string;
|
|
61
|
+
limit?: number;
|
|
62
|
+
};
|
|
63
|
+
export declare function searchKnowledge(opts: SearchKnowledgeOptions): KnowledgeRow[];
|
|
64
|
+
export declare function deleteKnowledge(id: string): boolean;
|
|
65
|
+
export type UpdateProjectMapInput = {
|
|
66
|
+
project_dir: string;
|
|
67
|
+
structure: Record<string, unknown> | string;
|
|
68
|
+
key_modules?: string[];
|
|
69
|
+
tech_stack?: string[];
|
|
70
|
+
};
|
|
71
|
+
export declare function updateProjectMap(input: UpdateProjectMapInput): string;
|
|
72
|
+
export declare function getProjectMap(project_dir: string): ProjectMapRow | null;
|
|
73
|
+
export type UpsertPatternInput = {
|
|
74
|
+
pattern_key: string;
|
|
75
|
+
pattern_val: string;
|
|
76
|
+
confidence?: number;
|
|
77
|
+
};
|
|
78
|
+
export declare function upsertPattern(input: UpsertPatternInput): void;
|
|
79
|
+
export declare function getPatterns(prefix?: string, limit?: number): import('./schema.js').PatternRow[];
|
|
80
|
+
export type ContextStatus = {
|
|
81
|
+
session_id: string;
|
|
82
|
+
platform: string;
|
|
83
|
+
token_count: number;
|
|
84
|
+
context_window: number;
|
|
85
|
+
usage_pct: number;
|
|
86
|
+
recommended_action: 'safe' | 'compress' | 'handoff';
|
|
87
|
+
};
|
|
88
|
+
export declare function getContextStatus(session_id: string): ContextStatus | null;
|
|
89
|
+
export declare function fetchAndCacheDocs(package_name: string, ecosystem: 'npm' | 'pypi' | 'crates', version?: string, max_chars?: number, agentVersion?: string): Promise<{
|
|
90
|
+
package_name: string;
|
|
91
|
+
version: string;
|
|
92
|
+
ecosystem: string;
|
|
93
|
+
content: string;
|
|
94
|
+
cached: boolean;
|
|
95
|
+
fetched_at: string;
|
|
96
|
+
} | null>;
|
|
97
|
+
export declare function saveTaskPlan(plan_json: string, description_hash: string, project_dir?: string): string;
|
|
98
|
+
export type UsageStatus = {
|
|
99
|
+
today: {
|
|
100
|
+
by_platform: Array<{
|
|
101
|
+
platform: string;
|
|
102
|
+
requests: number;
|
|
103
|
+
tokens_reported: number;
|
|
104
|
+
connection_breakdown: {
|
|
105
|
+
subscription: number;
|
|
106
|
+
api: number;
|
|
107
|
+
};
|
|
108
|
+
}>;
|
|
109
|
+
};
|
|
110
|
+
history: Array<{
|
|
111
|
+
date: string;
|
|
112
|
+
total_requests: number;
|
|
113
|
+
total_tokens: number;
|
|
114
|
+
}>;
|
|
115
|
+
warnings: string[];
|
|
116
|
+
};
|
|
117
|
+
export declare function getUsageStatus(): UsageStatus;
|
|
118
|
+
export type AuditEvent = {
|
|
119
|
+
timestamp: string;
|
|
120
|
+
event_type: string;
|
|
121
|
+
session_id: string | null;
|
|
122
|
+
agent: string | null;
|
|
123
|
+
verdict: string | null;
|
|
124
|
+
summary: string;
|
|
125
|
+
affected_files: string | null;
|
|
126
|
+
};
|
|
127
|
+
export type AuditLogOptions = {
|
|
128
|
+
session_id?: string;
|
|
129
|
+
agent?: string;
|
|
130
|
+
verdict?: string;
|
|
131
|
+
since?: string;
|
|
132
|
+
limit?: number;
|
|
133
|
+
};
|
|
134
|
+
export declare function getAuditLog(opts?: AuditLogOptions): AuditEvent[];
|
|
135
|
+
export type HealthStats = {
|
|
136
|
+
total_sessions: number;
|
|
137
|
+
total_memories: number;
|
|
138
|
+
total_patterns: number;
|
|
139
|
+
total_council_outcomes: number;
|
|
140
|
+
total_decisions: number;
|
|
141
|
+
avg_council_latency_ms: number | null;
|
|
142
|
+
};
|
|
143
|
+
export declare function getHealthStats(): HealthStats;
|
|
144
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/memory/local.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/local.js
CHANGED
|
@@ -36,8 +36,16 @@ export function getDb() {
|
|
|
36
36
|
migrateCouncilOutcomes(_db);
|
|
37
37
|
migrateCouncilColumns(_db);
|
|
38
38
|
migrateSessionColumns(_db);
|
|
39
|
+
migrateCouncilDuration(_db);
|
|
39
40
|
return _db;
|
|
40
41
|
}
|
|
42
|
+
// Adds duration_ms column to council_outcomes if it doesn't exist (v1.2.3 migration)
|
|
43
|
+
function migrateCouncilDuration(db) {
|
|
44
|
+
const cols = db.prepare('PRAGMA table_info(council_outcomes)').all();
|
|
45
|
+
const names = new Set(cols.map(c => c.name));
|
|
46
|
+
if (!names.has('duration_ms'))
|
|
47
|
+
db.exec('ALTER TABLE council_outcomes ADD COLUMN duration_ms INTEGER DEFAULT 0');
|
|
48
|
+
}
|
|
41
49
|
// Adds active_client, last_resumed_at, and connection_type columns if they don't exist
|
|
42
50
|
function migrateSessionColumns(db) {
|
|
43
51
|
const cols = db.prepare('PRAGMA table_info(sessions)').all();
|
|
@@ -132,9 +140,9 @@ export function saveCouncilOutcome(input) {
|
|
|
132
140
|
const now = new Date().toISOString();
|
|
133
141
|
db.prepare(`
|
|
134
142
|
INSERT INTO council_outcomes
|
|
135
|
-
(id, session_id, task, verdict, lead_dev, pm, architect, ux, devil, legal, security, recommended, debated_at)
|
|
136
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
137
|
-
`).run(id, input.session_id ?? null, input.task, input.verdict, input.lead_dev, input.pm, input.architect, input.ux, input.devil, input.legal, input.security, input.recommended, now);
|
|
143
|
+
(id, session_id, task, verdict, lead_dev, pm, architect, ux, devil, legal, security, recommended, debated_at, duration_ms)
|
|
144
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
145
|
+
`).run(id, input.session_id ?? null, input.task, input.verdict, input.lead_dev, input.pm, input.architect, input.ux, input.devil, input.legal, input.security, input.recommended, now, input.duration_ms ?? 0);
|
|
138
146
|
return id;
|
|
139
147
|
}
|
|
140
148
|
export function storeKnowledge(input) {
|
|
@@ -168,8 +176,9 @@ export function searchKnowledge(opts) {
|
|
|
168
176
|
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
169
177
|
const rows = db.prepare(`SELECT * FROM knowledge_base ${where} ORDER BY relevance DESC, accessed_count DESC, created_at DESC LIMIT ?`).all(...params, limit);
|
|
170
178
|
if (rows.length > 0 && opts.query) {
|
|
171
|
-
const
|
|
172
|
-
|
|
179
|
+
const updateStmt = db.prepare('UPDATE knowledge_base SET accessed_count = accessed_count + 1 WHERE id = ?');
|
|
180
|
+
for (const row of rows)
|
|
181
|
+
updateStmt.run(row.id);
|
|
173
182
|
}
|
|
174
183
|
return rows;
|
|
175
184
|
}
|
|
@@ -240,7 +249,7 @@ export function getContextStatus(session_id) {
|
|
|
240
249
|
}
|
|
241
250
|
// ─── Docs Cache ───────────────────────────────────────────────────────────────
|
|
242
251
|
const DOCS_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
243
|
-
export async function fetchAndCacheDocs(package_name, ecosystem, version, max_chars = 8000) {
|
|
252
|
+
export async function fetchAndCacheDocs(package_name, ecosystem, version, max_chars = 8000, agentVersion = '1.0.0') {
|
|
244
253
|
const db = getDb();
|
|
245
254
|
// Check cache first
|
|
246
255
|
const cached = db.prepare('SELECT * FROM docs_cache WHERE package_name = ? AND ecosystem = ? ORDER BY fetched_at DESC LIMIT 1').get(package_name, ecosystem);
|
|
@@ -277,7 +286,7 @@ export async function fetchAndCacheDocs(package_name, ecosystem, version, max_ch
|
|
|
277
286
|
else {
|
|
278
287
|
const res = await fetch(`https://crates.io/api/v1/crates/${encodeURIComponent(package_name)}`, {
|
|
279
288
|
signal: controller.signal,
|
|
280
|
-
headers: { 'User-Agent':
|
|
289
|
+
headers: { 'User-Agent': `veto-mcp/${agentVersion}` },
|
|
281
290
|
});
|
|
282
291
|
if (!res.ok)
|
|
283
292
|
return null;
|
|
@@ -378,8 +387,6 @@ export function getAuditLog(opts = {}) {
|
|
|
378
387
|
}
|
|
379
388
|
const councilRows = db.prepare(`SELECT id, session_id, task, verdict, recommended, debated_at FROM council_outcomes WHERE ${councilWhere.join(' AND ')} ORDER BY debated_at DESC LIMIT ?`).all(...councilParams, limit);
|
|
380
389
|
for (const r of councilRows) {
|
|
381
|
-
if (opts.agent)
|
|
382
|
-
continue; // council events don't have a single agent
|
|
383
390
|
events.push({ timestamp: r.debated_at, event_type: 'council', session_id: r.session_id, agent: null, verdict: r.verdict, summary: r.task.slice(0, 100), affected_files: null });
|
|
384
391
|
}
|
|
385
392
|
// Decisions
|
|
@@ -403,16 +410,9 @@ export function getAuditLog(opts = {}) {
|
|
|
403
410
|
export function getHealthStats() {
|
|
404
411
|
const db = getDb();
|
|
405
412
|
const count = (table) => db.prepare(`SELECT COUNT(*) as n FROM ${table}`).get().n;
|
|
406
|
-
// Avg latency:
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
if (latencyRows.length >= 2) {
|
|
410
|
-
const diffs = [];
|
|
411
|
-
for (let i = 0; i < latencyRows.length - 1; i++) {
|
|
412
|
-
diffs.push(Math.abs(new Date(latencyRows[i].debated_at).getTime() - new Date(latencyRows[i + 1].debated_at).getTime()));
|
|
413
|
-
}
|
|
414
|
-
avg_council_latency_ms = Math.round(diffs.reduce((a, b) => a + b, 0) / diffs.length);
|
|
415
|
-
}
|
|
413
|
+
// Avg latency: average of actual recorded debate durations
|
|
414
|
+
const latencyRow = db.prepare('SELECT AVG(duration_ms) as avg_ms, COUNT(*) as n FROM council_outcomes WHERE duration_ms > 0').get();
|
|
415
|
+
const avg_council_latency_ms = latencyRow.n > 0 && latencyRow.avg_ms != null ? Math.round(latencyRow.avg_ms) : null;
|
|
416
416
|
return {
|
|
417
417
|
total_sessions: count('sessions'),
|
|
418
418
|
total_memories: count('knowledge_base'),
|