@jigyasudham/veto 1.2.19 → 1.4.1
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 +303 -251
- package/dist/cli.js +35 -9
- package/dist/cli.js.map +1 -1
- package/dist/context/reader.d.ts.map +1 -1
- package/dist/context/reader.js +4 -1
- package/dist/context/reader.js.map +1 -1
- package/dist/council/decision-engine.d.ts.map +1 -1
- package/dist/council/decision-engine.js +21 -1
- package/dist/council/decision-engine.js.map +1 -1
- package/dist/council/decision-extractor.d.ts +13 -0
- package/dist/council/decision-extractor.d.ts.map +1 -0
- package/dist/council/decision-extractor.js +66 -0
- package/dist/council/decision-extractor.js.map +1 -0
- package/dist/council/devil-advocate.d.ts.map +1 -1
- package/dist/council/devil-advocate.js +12 -1
- package/dist/council/devil-advocate.js.map +1 -1
- package/dist/council/index.d.ts.map +1 -1
- package/dist/council/index.js +26 -5
- package/dist/council/index.js.map +1 -1
- package/dist/council/lead-developer.d.ts.map +1 -1
- package/dist/council/lead-developer.js +34 -14
- package/dist/council/lead-developer.js.map +1 -1
- package/dist/council/legal-compliance.d.ts.map +1 -1
- package/dist/council/legal-compliance.js +44 -24
- package/dist/council/legal-compliance.js.map +1 -1
- package/dist/council/llm-council.d.ts +4 -0
- package/dist/council/llm-council.d.ts.map +1 -0
- package/dist/council/llm-council.js +160 -0
- package/dist/council/llm-council.js.map +1 -0
- package/dist/council/product-manager.d.ts.map +1 -1
- package/dist/council/product-manager.js +33 -13
- package/dist/council/product-manager.js.map +1 -1
- package/dist/council/security.d.ts.map +1 -1
- package/dist/council/security.js +44 -24
- package/dist/council/security.js.map +1 -1
- package/dist/council/system-architect.d.ts.map +1 -1
- package/dist/council/system-architect.js +33 -13
- package/dist/council/system-architect.js.map +1 -1
- package/dist/council/types.d.ts +2 -0
- package/dist/council/types.d.ts.map +1 -1
- package/dist/council/ux-designer.d.ts.map +1 -1
- package/dist/council/ux-designer.js +47 -26
- package/dist/council/ux-designer.js.map +1 -1
- package/dist/memory/local.d.ts +40 -1
- package/dist/memory/local.d.ts.map +1 -1
- package/dist/memory/local.js +95 -4
- package/dist/memory/local.js.map +1 -1
- package/dist/router/complexity-scorer.js +2 -2
- package/dist/router/complexity-scorer.js.map +1 -1
- package/dist/server.js +232 -793
- package/dist/server.js.map +1 -1
- package/dist/skills/memory/skill-session-restore.d.ts.map +1 -1
- package/dist/skills/memory/skill-session-restore.js +19 -24
- package/dist/skills/memory/skill-session-restore.js.map +1 -1
- package/dist/skills/memory/skill-session-save.js +4 -4
- package/dist/skills/memory/skill-session-save.js.map +1 -1
- package/dist/tools/definitions.d.ts +1073 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +797 -0
- package/dist/tools/definitions.js.map +1 -0
- package/package.json +2 -2
package/dist/council/security.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, pickSide, reframeVote } from './decision-extractor.js';
|
|
1
2
|
const BLOCK_RULES = [
|
|
2
3
|
{
|
|
3
4
|
pattern: /(no.{0,25}rate.?limit|(auth|login|password|signin|otp|2fa|token|reset).{0,50}no.{0,20}rate.?limit|no.{0,25}rate.?limit.{0,50}(auth|login|password|signin|otp|2fa))/i,
|
|
@@ -141,22 +142,6 @@ export function analyze(task) {
|
|
|
141
142
|
recommendations.push(rule.recommendation);
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
|
-
if (blocks.length > 0) {
|
|
145
|
-
return {
|
|
146
|
-
verdict: 'block',
|
|
147
|
-
reason: blocks[0].reason,
|
|
148
|
-
concerns: blocks.slice(1).map(b => b.reason),
|
|
149
|
-
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
if (concerns.length > 0) {
|
|
153
|
-
return {
|
|
154
|
-
verdict: 'warn',
|
|
155
|
-
reason: `${concerns.length} security concern${concerns.length > 1 ? 's' : ''} — threat model flagged issues.`,
|
|
156
|
-
concerns,
|
|
157
|
-
recommendation: recommendations[0],
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
145
|
// Topic-based security analysis for tasks with no specific pattern matches
|
|
161
146
|
const TOPIC_INSIGHTS = [
|
|
162
147
|
{
|
|
@@ -195,16 +180,51 @@ export function analyze(task) {
|
|
|
195
180
|
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
181
|
},
|
|
197
182
|
];
|
|
198
|
-
|
|
199
|
-
if (
|
|
200
|
-
|
|
201
|
-
|
|
183
|
+
let vote;
|
|
184
|
+
if (blocks.length > 0) {
|
|
185
|
+
vote = {
|
|
186
|
+
verdict: 'block',
|
|
187
|
+
reason: blocks[0].reason,
|
|
188
|
+
concerns: blocks.slice(1).map(b => b.reason),
|
|
189
|
+
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
else if (concerns.length > 0) {
|
|
193
|
+
vote = {
|
|
202
194
|
verdict: 'warn',
|
|
203
|
-
reason:
|
|
204
|
-
concerns
|
|
205
|
-
recommendation:
|
|
195
|
+
reason: `${concerns.length} security concern${concerns.length > 1 ? 's' : ''} — threat model flagged issues.`,
|
|
196
|
+
concerns,
|
|
197
|
+
recommendation: recommendations[0],
|
|
206
198
|
};
|
|
207
199
|
}
|
|
208
|
-
|
|
200
|
+
else {
|
|
201
|
+
const topicMatched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
202
|
+
if (topicMatched.length > 0) {
|
|
203
|
+
const top = topicMatched.slice(0, 2);
|
|
204
|
+
vote = {
|
|
205
|
+
verdict: 'warn',
|
|
206
|
+
reason: top[0].concern,
|
|
207
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
208
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
vote = { verdict: 'approve', reason: 'No security threats identified in threat model.', concerns: [] };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return applyDecisionStance(vote, task);
|
|
216
|
+
}
|
|
217
|
+
// Security risk: options that expose the server to the network or add new untrusted input paths
|
|
218
|
+
const SEC_RISK = /\b(http|rest.?api|express|network|port|remote|transport|oauth|token.?endpoint|api.?key)\b/i;
|
|
219
|
+
function applyDecisionStance(vote, task) {
|
|
220
|
+
const ctx = extractDecision(task);
|
|
221
|
+
if (!ctx.isDecisionTask)
|
|
222
|
+
return vote;
|
|
223
|
+
const { optionA, optionB } = ctx;
|
|
224
|
+
const side = pickSide(optionA, optionB, SEC_RISK);
|
|
225
|
+
const advice = side
|
|
226
|
+
? `"${side.preferred}" keeps the threat model local-only. "${side.avoided}" changes Veto from a local tool to a network service — auth, TLS, rate-limiting, and input validation become mandatory from day one.`
|
|
227
|
+
: `Both options carry network exposure risk. Confirm: can this be done without opening a network port? If not, auth and TLS are non-negotiable.`;
|
|
228
|
+
return reframeVote(vote, ctx, side?.preferred ?? null, advice);
|
|
209
229
|
}
|
|
210
230
|
//# sourceMappingURL=security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/council/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/council/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAsI5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAqD/C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, pickSide, reframeVote } from './decision-extractor.js';
|
|
1
2
|
const BLOCK_RULES = [
|
|
2
3
|
{
|
|
3
4
|
pattern: /\bdrop\s+table\b/i,
|
|
@@ -143,32 +144,51 @@ export function analyze(task) {
|
|
|
143
144
|
recommendations.push(rule.recommendation);
|
|
144
145
|
}
|
|
145
146
|
}
|
|
147
|
+
let vote;
|
|
146
148
|
if (blocks.length > 0) {
|
|
147
|
-
|
|
149
|
+
vote = {
|
|
148
150
|
verdict: 'block',
|
|
149
151
|
reason: blocks[0].reason,
|
|
150
152
|
concerns: blocks.slice(1).map(b => b.reason),
|
|
151
153
|
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
152
154
|
};
|
|
153
155
|
}
|
|
154
|
-
if (concerns.length > 0) {
|
|
155
|
-
|
|
156
|
+
else if (concerns.length > 0) {
|
|
157
|
+
vote = {
|
|
156
158
|
verdict: 'warn',
|
|
157
159
|
reason: `${concerns.length} structural concern${concerns.length > 1 ? 's' : ''} — review before building.`,
|
|
158
160
|
concerns,
|
|
159
161
|
recommendation: recommendations[0],
|
|
160
162
|
};
|
|
161
163
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
else {
|
|
165
|
+
const matched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
166
|
+
if (matched.length > 0) {
|
|
167
|
+
const top = matched.slice(0, 2);
|
|
168
|
+
vote = {
|
|
169
|
+
verdict: 'warn',
|
|
170
|
+
reason: top[0].concern,
|
|
171
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
172
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
vote = { verdict: 'approve', reason: 'Architecture looks sound. No structural concerns identified.', concerns: [] };
|
|
177
|
+
}
|
|
171
178
|
}
|
|
172
|
-
return
|
|
179
|
+
return applyDecisionStance(vote, task);
|
|
180
|
+
}
|
|
181
|
+
// Architect risk: options that tighten coupling or introduce new architectural layers
|
|
182
|
+
const ARCH_RISK = /\b(bundl|integrat\s+into|embed|inline|http|express|new\s+(server|layer|transport|protocol)|microservice)\b/i;
|
|
183
|
+
function applyDecisionStance(vote, task) {
|
|
184
|
+
const ctx = extractDecision(task);
|
|
185
|
+
if (!ctx.isDecisionTask)
|
|
186
|
+
return vote;
|
|
187
|
+
const { optionA, optionB } = ctx;
|
|
188
|
+
const side = pickSide(optionA, optionB, ARCH_RISK);
|
|
189
|
+
const advice = side
|
|
190
|
+
? `"${side.preferred}" preserves separation of concerns and keeps the boundary clean. "${side.avoided}" creates coupling that is difficult to undo later — the caller now depends on implementation details.`
|
|
191
|
+
: `Evaluate which option maintains the cleaner boundary. Prefer the path that adds no new coupling between existing components.`;
|
|
192
|
+
return reframeVote(vote, ctx, side?.preferred ?? null, advice);
|
|
173
193
|
}
|
|
174
194
|
//# sourceMappingURL=system-architect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-architect.js","sourceRoot":"","sources":["../../src/council/system-architect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-architect.js","sourceRoot":"","sources":["../../src/council/system-architect.ts"],"names":[],"mappings":"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"}
|
package/dist/council/types.d.ts
CHANGED
|
@@ -6,10 +6,12 @@ export interface AgentVote {
|
|
|
6
6
|
concerns: string[];
|
|
7
7
|
recommendation?: string;
|
|
8
8
|
}
|
|
9
|
+
export type CouncilStrictness = 'fast' | 'standard' | 'strict';
|
|
9
10
|
export interface DebateInput {
|
|
10
11
|
task: string;
|
|
11
12
|
context?: string;
|
|
12
13
|
project_dir?: string;
|
|
14
|
+
strictness?: CouncilStrictness;
|
|
13
15
|
}
|
|
14
16
|
export interface DebateResult {
|
|
15
17
|
task: string;
|
|
@@ -1 +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;
|
|
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,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;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"}
|
|
@@ -1 +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;
|
|
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;AAsE5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAkG/C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, pickSide, reframeVote } from './decision-extractor.js';
|
|
1
2
|
// Backend-only tasks: UX approves without friction
|
|
2
3
|
const BACKEND_ONLY = /\b(api|backend|server|database|db|query|schema|migration|auth.*middleware|jwt|oauth|cron|cli|script|worker|queue|cache|redis|sql|index|trigger|webhook)\b/i;
|
|
3
4
|
const FRONTEND_SIGNALS = /\b(ui|ux|form|button|modal|page|screen|component|view|layout|menu|nav|input|field|label|error.?message|loading|user.?interface|frontend|react|vue|svelte|html|css)\b/i;
|
|
@@ -65,14 +66,15 @@ export function analyze(task) {
|
|
|
65
66
|
if (TRIVIAL.test(task.trim())) {
|
|
66
67
|
return { verdict: 'approve', reason: 'Trivial change — no UX concerns.', concerns: [] };
|
|
67
68
|
}
|
|
68
|
-
// Pure backend tasks get a light pass
|
|
69
|
+
// Pure backend tasks get a light pass — but still apply decision stance
|
|
69
70
|
const isBackend = BACKEND_ONLY.test(task) && !FRONTEND_SIGNALS.test(task);
|
|
70
71
|
if (isBackend) {
|
|
71
|
-
|
|
72
|
+
const backendVote = {
|
|
72
73
|
verdict: 'approve',
|
|
73
74
|
reason: 'Backend task — no direct UX concerns. Ensure API errors surface clearly to users.',
|
|
74
75
|
concerns: [],
|
|
75
76
|
};
|
|
77
|
+
return applyDecisionStance(backendVote, task);
|
|
76
78
|
}
|
|
77
79
|
const blocks = [];
|
|
78
80
|
const concerns = [];
|
|
@@ -88,22 +90,6 @@ export function analyze(task) {
|
|
|
88
90
|
recommendations.push(rule.recommendation);
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
|
-
if (blocks.length > 0) {
|
|
92
|
-
return {
|
|
93
|
-
verdict: 'block',
|
|
94
|
-
reason: blocks[0].reason,
|
|
95
|
-
concerns: blocks.slice(1).map(b => b.reason),
|
|
96
|
-
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
if (concerns.length > 0) {
|
|
100
|
-
return {
|
|
101
|
-
verdict: 'warn',
|
|
102
|
-
reason: `${concerns.length} UX concern${concerns.length > 1 ? 's' : ''} — real users will notice this.`,
|
|
103
|
-
concerns,
|
|
104
|
-
recommendation: recommendations[0],
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
93
|
// Topic-based UX analysis for tasks with no direct frontend signals
|
|
108
94
|
const TOPIC_INSIGHTS = [
|
|
109
95
|
{
|
|
@@ -137,16 +123,51 @@ export function analyze(task) {
|
|
|
137
123
|
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
124
|
},
|
|
139
125
|
];
|
|
140
|
-
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
|
|
126
|
+
let vote;
|
|
127
|
+
if (blocks.length > 0) {
|
|
128
|
+
vote = {
|
|
129
|
+
verdict: 'block',
|
|
130
|
+
reason: blocks[0].reason,
|
|
131
|
+
concerns: blocks.slice(1).map(b => b.reason),
|
|
132
|
+
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
else if (concerns.length > 0) {
|
|
136
|
+
vote = {
|
|
144
137
|
verdict: 'warn',
|
|
145
|
-
reason:
|
|
146
|
-
concerns
|
|
147
|
-
recommendation:
|
|
138
|
+
reason: `${concerns.length} UX concern${concerns.length > 1 ? 's' : ''} — real users will notice this.`,
|
|
139
|
+
concerns,
|
|
140
|
+
recommendation: recommendations[0],
|
|
148
141
|
};
|
|
149
142
|
}
|
|
150
|
-
|
|
143
|
+
else {
|
|
144
|
+
const topicMatched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
145
|
+
if (topicMatched.length > 0) {
|
|
146
|
+
const top = topicMatched.slice(0, 2);
|
|
147
|
+
vote = {
|
|
148
|
+
verdict: 'warn',
|
|
149
|
+
reason: top[0].concern,
|
|
150
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
151
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
vote = { verdict: 'approve', reason: 'UX looks solid. No user experience concerns identified.', concerns: [] };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return applyDecisionStance(vote, task);
|
|
159
|
+
}
|
|
160
|
+
// UX risk: options that add setup friction, credentials, or configuration overhead
|
|
161
|
+
const UX_RISK = /\b(http|api.?key|auth|oauth|port|server\s+config|credentials|token|setup.{0,15}required|install.{0,15}extra)\b/i;
|
|
162
|
+
function applyDecisionStance(vote, task) {
|
|
163
|
+
const ctx = extractDecision(task);
|
|
164
|
+
if (!ctx.isDecisionTask)
|
|
165
|
+
return vote;
|
|
166
|
+
const { optionA, optionB } = ctx;
|
|
167
|
+
const side = pickSide(optionA, optionB, UX_RISK);
|
|
168
|
+
const advice = side
|
|
169
|
+
? `"${side.preferred}" keeps the developer experience simpler — no extra setup or credentials. "${side.avoided}" adds friction that will silently reduce adoption.`
|
|
170
|
+
: `Evaluate which option requires fewer steps for a first-time user. The shorter happy path wins on developer experience.`;
|
|
171
|
+
return reframeVote(vote, ctx, side?.preferred ?? null, advice);
|
|
151
172
|
}
|
|
152
173
|
//# sourceMappingURL=ux-designer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ux-designer.js","sourceRoot":"","sources":["../../src/council/ux-designer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ux-designer.js","sourceRoot":"","sources":["../../src/council/ux-designer.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/local.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { DatabaseSync } from 'node:sqlite';
|
|
2
2
|
import { type SessionRow, type KnowledgeRow, type KnowledgeType, type ProjectMapRow } from './schema.js';
|
|
3
3
|
export declare const CONTEXT_WINDOWS: Record<string, number>;
|
|
4
|
+
export declare function resolveContextWindow(platform: string, model?: string): number;
|
|
4
5
|
export declare function resetDb(): void;
|
|
5
6
|
export declare function getDb(): DatabaseSync;
|
|
6
7
|
export type SaveSessionInput = {
|
|
@@ -12,6 +13,7 @@ export type SaveSessionInput = {
|
|
|
12
13
|
task_state?: string;
|
|
13
14
|
token_count?: number;
|
|
14
15
|
save_type?: 'manual' | 'auto';
|
|
16
|
+
tags?: string[];
|
|
15
17
|
};
|
|
16
18
|
export type SessionSaveResult = {
|
|
17
19
|
session_id: string;
|
|
@@ -32,7 +34,7 @@ export type UpdateSessionResult = {
|
|
|
32
34
|
};
|
|
33
35
|
export declare function updateSession(session_id: string, input: SaveSessionInput): UpdateSessionResult | null;
|
|
34
36
|
export declare function restoreSession(session_id: string, active_client?: string): RestoreSessionResult;
|
|
35
|
-
export declare function listSessions(limit?: number): SessionRow[];
|
|
37
|
+
export declare function listSessions(limit?: number, query?: string): SessionRow[];
|
|
36
38
|
export declare function closeSession(session_id: string): void;
|
|
37
39
|
export declare function getDbPath(): string;
|
|
38
40
|
export type SaveCouncilOutcomeInput = {
|
|
@@ -102,6 +104,43 @@ export declare function fetchAndCacheDocs(package_name: string, ecosystem: 'npm'
|
|
|
102
104
|
fetched_at: string;
|
|
103
105
|
} | null>;
|
|
104
106
|
export declare function saveTaskPlan(plan_json: string, description_hash: string, project_dir?: string): string;
|
|
107
|
+
export declare function getTaskPlan(description_hash: string): {
|
|
108
|
+
id: string;
|
|
109
|
+
plan_json: string;
|
|
110
|
+
} | null;
|
|
111
|
+
export type VetoMetrics = {
|
|
112
|
+
sessions: {
|
|
113
|
+
total: number;
|
|
114
|
+
today: number;
|
|
115
|
+
this_week: number;
|
|
116
|
+
};
|
|
117
|
+
council: {
|
|
118
|
+
total: number;
|
|
119
|
+
today: number;
|
|
120
|
+
by_verdict: Record<string, number>;
|
|
121
|
+
};
|
|
122
|
+
agents: Array<{
|
|
123
|
+
agent: string;
|
|
124
|
+
calls: number;
|
|
125
|
+
avg_quality: number;
|
|
126
|
+
}>;
|
|
127
|
+
quality: {
|
|
128
|
+
overall_avg: number;
|
|
129
|
+
trend: Array<{
|
|
130
|
+
date: string;
|
|
131
|
+
avg: number;
|
|
132
|
+
count: number;
|
|
133
|
+
}>;
|
|
134
|
+
};
|
|
135
|
+
knowledge: {
|
|
136
|
+
total_entries: number;
|
|
137
|
+
by_type: Record<string, number>;
|
|
138
|
+
};
|
|
139
|
+
patterns: {
|
|
140
|
+
total: number;
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
export declare function getMetrics(): VetoMetrics;
|
|
105
144
|
export type UsageStatus = {
|
|
106
145
|
today: {
|
|
107
146
|
by_platform: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/memory/local.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAqB,MAAM,aAAa,CAAC;AAG3I,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAC;
|
|
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
|
@@ -15,6 +15,42 @@ export const CONTEXT_WINDOWS = {
|
|
|
15
15
|
gemini: 1_000_000,
|
|
16
16
|
codex: 128_000,
|
|
17
17
|
};
|
|
18
|
+
// Per-model context windows — resolved at call time when model is provided.
|
|
19
|
+
// Falls back to CONTEXT_WINDOWS[platform] when model is unknown.
|
|
20
|
+
const MODEL_CONTEXT_WINDOWS = {
|
|
21
|
+
// Claude 4.x — 1M context
|
|
22
|
+
'claude-sonnet-4-6': 1_000_000,
|
|
23
|
+
'claude-sonnet-4-7': 1_000_000,
|
|
24
|
+
'claude-opus-4-7': 1_000_000,
|
|
25
|
+
'claude-haiku-4-5': 1_000_000,
|
|
26
|
+
// Claude 3.x — 200K context
|
|
27
|
+
'claude-3-5-sonnet': 200_000,
|
|
28
|
+
'claude-3-5-haiku': 200_000,
|
|
29
|
+
'claude-3-opus': 200_000,
|
|
30
|
+
// Gemini — all current models are 1M+
|
|
31
|
+
'gemini-2-5-pro': 1_048_576,
|
|
32
|
+
'gemini-2-0-flash': 1_048_576,
|
|
33
|
+
'gemini-1-5-pro': 1_048_576,
|
|
34
|
+
'gemini-1-5-flash': 1_048_576,
|
|
35
|
+
// OpenAI / Codex
|
|
36
|
+
'gpt-4o': 128_000,
|
|
37
|
+
'gpt-4o-mini': 128_000,
|
|
38
|
+
'o1': 200_000,
|
|
39
|
+
'o3': 200_000,
|
|
40
|
+
'o4-mini': 200_000,
|
|
41
|
+
};
|
|
42
|
+
export function resolveContextWindow(platform, model) {
|
|
43
|
+
if (model) {
|
|
44
|
+
if (MODEL_CONTEXT_WINDOWS[model])
|
|
45
|
+
return MODEL_CONTEXT_WINDOWS[model];
|
|
46
|
+
// Prefix match handles suffixed model IDs like "claude-sonnet-4-6-20251001"
|
|
47
|
+
for (const key of Object.keys(MODEL_CONTEXT_WINDOWS)) {
|
|
48
|
+
if (model.startsWith(key))
|
|
49
|
+
return MODEL_CONTEXT_WINDOWS[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return CONTEXT_WINDOWS[platform] ?? 200_000;
|
|
53
|
+
}
|
|
18
54
|
const VETO_DIR = join(homedir(), '.veto');
|
|
19
55
|
const DB_PATH = process.env.VETO_TEST_DB ?? join(VETO_DIR, 'veto.db');
|
|
20
56
|
let _db = null;
|
|
@@ -41,8 +77,16 @@ export function getDb() {
|
|
|
41
77
|
migrateUsageLog(_db);
|
|
42
78
|
migrateSessionSaveType(_db);
|
|
43
79
|
migrateScanDiagnostics(_db);
|
|
80
|
+
migrateSessionTags(_db);
|
|
44
81
|
return _db;
|
|
45
82
|
}
|
|
83
|
+
// Adds tags column to sessions (v1.3.1 migration)
|
|
84
|
+
function migrateSessionTags(db) {
|
|
85
|
+
const cols = db.prepare('PRAGMA table_info(sessions)').all();
|
|
86
|
+
const names = new Set(cols.map(c => c.name));
|
|
87
|
+
if (!names.has('tags'))
|
|
88
|
+
db.exec('ALTER TABLE sessions ADD COLUMN tags TEXT');
|
|
89
|
+
}
|
|
46
90
|
// Creates scan_diagnostics table if it doesn't exist (v1.2.18 migration)
|
|
47
91
|
function migrateScanDiagnostics(db) {
|
|
48
92
|
db.exec(`
|
|
@@ -140,9 +184,9 @@ export function saveSession(input) {
|
|
|
140
184
|
const token_count = input.token_count ?? 0;
|
|
141
185
|
const save_type = input.save_type ?? 'manual';
|
|
142
186
|
db.prepare(`
|
|
143
|
-
INSERT INTO sessions (id, started_at, platform, connection_type, project_dir, summary, context, task_state, token_count, save_type)
|
|
144
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
145
|
-
`).run(id, now, platform, connection_type, input.project_dir ?? null, input.summary ?? null, input.context ? JSON.stringify(input.context) : null, input.task_state ? JSON.stringify(input.task_state) : null, token_count, save_type);
|
|
187
|
+
INSERT INTO sessions (id, started_at, platform, connection_type, project_dir, summary, context, task_state, token_count, save_type, tags)
|
|
188
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
189
|
+
`).run(id, now, platform, connection_type, input.project_dir ?? null, input.summary ?? null, input.context ? JSON.stringify(input.context) : null, input.task_state ? JSON.stringify(input.task_state) : null, token_count, save_type, input.tags ? JSON.stringify(input.tags) : null);
|
|
146
190
|
// Record usage event
|
|
147
191
|
db.prepare(`
|
|
148
192
|
INSERT INTO usage_events (id, session_id, platform, connection_type, tokens, event_type, recorded_at)
|
|
@@ -189,8 +233,13 @@ export function restoreSession(session_id, active_client) {
|
|
|
189
233
|
}
|
|
190
234
|
return { found: true, session: row };
|
|
191
235
|
}
|
|
192
|
-
export function listSessions(limit = 10) {
|
|
236
|
+
export function listSessions(limit = 10, query) {
|
|
193
237
|
const db = getDb();
|
|
238
|
+
if (query) {
|
|
239
|
+
const q = `%${query}%`;
|
|
240
|
+
return db.prepare(`SELECT * FROM sessions WHERE summary LIKE ? OR context LIKE ? OR task_state LIKE ? OR tags LIKE ? OR project_dir LIKE ?
|
|
241
|
+
ORDER BY created_at DESC LIMIT ?`).all(q, q, q, q, q, limit);
|
|
242
|
+
}
|
|
194
243
|
return db.prepare('SELECT * FROM sessions ORDER BY created_at DESC LIMIT ?').all(limit);
|
|
195
244
|
}
|
|
196
245
|
export function closeSession(session_id) {
|
|
@@ -385,6 +434,48 @@ export function saveTaskPlan(plan_json, description_hash, project_dir) {
|
|
|
385
434
|
`).run(id, description_hash, plan_json, project_dir ?? null);
|
|
386
435
|
return id;
|
|
387
436
|
}
|
|
437
|
+
export function getTaskPlan(description_hash) {
|
|
438
|
+
const db = getDb();
|
|
439
|
+
const row = db.prepare(`
|
|
440
|
+
SELECT id, plan_json FROM task_plans
|
|
441
|
+
WHERE description_hash = ?
|
|
442
|
+
AND created_at > datetime('now', '-7 days')
|
|
443
|
+
ORDER BY created_at DESC
|
|
444
|
+
LIMIT 1
|
|
445
|
+
`).get(description_hash);
|
|
446
|
+
return row ?? null;
|
|
447
|
+
}
|
|
448
|
+
export function getMetrics() {
|
|
449
|
+
const db = getDb();
|
|
450
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
451
|
+
const weekAgo = new Date(Date.now() - 7 * 86400_000).toISOString().slice(0, 10);
|
|
452
|
+
const sessions = {
|
|
453
|
+
total: db.prepare('SELECT COUNT(*) as n FROM sessions').get().n,
|
|
454
|
+
today: db.prepare("SELECT COUNT(*) as n FROM sessions WHERE created_at >= ?").get(today + 'T00:00:00').n,
|
|
455
|
+
this_week: db.prepare("SELECT COUNT(*) as n FROM sessions WHERE created_at >= ?").get(weekAgo + 'T00:00:00').n,
|
|
456
|
+
};
|
|
457
|
+
const councilTotal = db.prepare('SELECT COUNT(*) as n FROM council_outcomes').get().n;
|
|
458
|
+
const councilToday = db.prepare("SELECT COUNT(*) as n FROM council_outcomes WHERE debated_at >= ?").get(today + 'T00:00:00').n;
|
|
459
|
+
const verdictRows = db.prepare('SELECT verdict, COUNT(*) as n FROM council_outcomes GROUP BY verdict').all();
|
|
460
|
+
const by_verdict = Object.fromEntries(verdictRows.map(r => [r.verdict, r.n]));
|
|
461
|
+
const agentRows = db.prepare('SELECT agent, COUNT(*) as calls, AVG(output_quality) as avg_q FROM learning_data WHERE agent IS NOT NULL GROUP BY agent ORDER BY calls DESC LIMIT 10').all();
|
|
462
|
+
const agents = agentRows.map(r => ({ agent: r.agent, calls: r.calls, avg_quality: Math.round(r.avg_q ?? 0) }));
|
|
463
|
+
const overallAvg = db.prepare('SELECT AVG(output_quality) as avg FROM learning_data WHERE output_quality IS NOT NULL').get().avg ?? 0;
|
|
464
|
+
const trendRows = db.prepare("SELECT substr(recorded_at,1,10) as date, AVG(output_quality) as avg, COUNT(*) as count FROM learning_data WHERE output_quality IS NOT NULL AND recorded_at >= ? GROUP BY date ORDER BY date").all(weekAgo + 'T00:00:00');
|
|
465
|
+
const trend = trendRows.map(r => ({ date: r.date, avg: Math.round(r.avg), count: r.count }));
|
|
466
|
+
const knowledgeTotal = db.prepare('SELECT COUNT(*) as n FROM knowledge_base').get().n;
|
|
467
|
+
const knowledgeTypeRows = db.prepare('SELECT type, COUNT(*) as n FROM knowledge_base GROUP BY type').all();
|
|
468
|
+
const by_type = Object.fromEntries(knowledgeTypeRows.map(r => [r.type, r.n]));
|
|
469
|
+
const patternsTotal = db.prepare('SELECT COUNT(*) as n FROM patterns').get().n;
|
|
470
|
+
return {
|
|
471
|
+
sessions,
|
|
472
|
+
council: { total: councilTotal, today: councilToday, by_verdict },
|
|
473
|
+
agents,
|
|
474
|
+
quality: { overall_avg: Math.round(overallAvg), trend },
|
|
475
|
+
knowledge: { total_entries: knowledgeTotal, by_type },
|
|
476
|
+
patterns: { total: patternsTotal },
|
|
477
|
+
};
|
|
478
|
+
}
|
|
388
479
|
export function getUsageStatus() {
|
|
389
480
|
const db = getDb();
|
|
390
481
|
const today = new Date().toISOString().slice(0, 10);
|