@jigyasudham/veto 1.4.0 → 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 +72 -0
- package/dist/council/decision-engine.d.ts.map +1 -1
- package/dist/council/decision-engine.js +20 -0
- 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/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.map +1 -1
- package/dist/council/llm-council.js +41 -18
- package/dist/council/llm-council.js.map +1 -1
- 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/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/server.js +43 -9
- 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/package.json +1 -1
package/README.md
CHANGED
|
@@ -276,6 +276,20 @@ veto_council_debate {
|
|
|
276
276
|
}
|
|
277
277
|
```
|
|
278
278
|
|
|
279
|
+
When the task presents a binary choice, agents name the option they prefer:
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
veto_council_debate {
|
|
283
|
+
task: "Should we add an Express HTTP layer or keep Veto pure MCP with an external adapter?"
|
|
284
|
+
}
|
|
285
|
+
→ formatted_output includes:
|
|
286
|
+
🎯 Council leans toward: "pure MCP with an external adapter" (5 agents prefer it)
|
|
287
|
+
Lead Dev: [Express HTTP vs external adapter] ... [WARN]
|
|
288
|
+
recommendation: Prefer "external adapter" — Express adds new infrastructure...
|
|
289
|
+
Security: [Express HTTP vs external adapter] ... [WARN]
|
|
290
|
+
recommendation: Prefer "external adapter" — keeps the threat model local-only...
|
|
291
|
+
```
|
|
292
|
+
|
|
279
293
|
---
|
|
280
294
|
|
|
281
295
|
## Session Tagging + Search
|
|
@@ -296,6 +310,64 @@ veto_sessions_list { query: "auth" }
|
|
|
296
310
|
|
|
297
311
|
---
|
|
298
312
|
|
|
313
|
+
## New in v1.4.1
|
|
314
|
+
|
|
315
|
+
### Council debate — decision-aware verdicts
|
|
316
|
+
|
|
317
|
+
When your task presents a binary architectural choice ("should we X or Y", "A vs B"), every council agent now identifies which option it prefers and names it explicitly. The output includes a `🎯 Council leans toward:` line counting how many agents favour each option.
|
|
318
|
+
|
|
319
|
+
Before — agents fired generic keyword-matched concerns unrelated to the choice:
|
|
320
|
+
```
|
|
321
|
+
Lead Dev: "Persistent memory stores grow unbounded..." ← nothing to do with the question
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
After — agents address the specific choice:
|
|
325
|
+
```
|
|
326
|
+
Lead Dev: [Express-bundled vs external-adapter] reason [WARN]
|
|
327
|
+
recommendation: Prefer "external-adapter" — "Express-bundled" adds new
|
|
328
|
+
infrastructure to maintain; validate real demand before building.
|
|
329
|
+
🎯 Council leans toward: "external adapter pattern" (4 agents prefer it)
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
LLM-backed agents (when MCP Sampling is available) are now explicitly instructed to name the preferred option in their recommendation.
|
|
333
|
+
|
|
334
|
+
### `veto_session_restore` — resume instructions
|
|
335
|
+
|
|
336
|
+
The restore response now includes a `resume_instructions` field that tells the AI exactly what to do:
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
veto_session_restore { session_id: "..." }
|
|
340
|
+
→ {
|
|
341
|
+
resume_instructions: "Context restored. Trust the summary, context, and task_state
|
|
342
|
+
above. Do NOT re-read source files to orient yourself — only open a file if you
|
|
343
|
+
are about to EDIT it. Start immediately with: [nextAction from task_state].",
|
|
344
|
+
session_id: "...",
|
|
345
|
+
summary: "...",
|
|
346
|
+
context: { ... },
|
|
347
|
+
task_state: { nextAction: "Edit src/server.ts line 302, add zod validation..." },
|
|
348
|
+
...
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
This fixes the core issue where AI sessions were re-reading the entire codebase on restore instead of trusting the saved context.
|
|
353
|
+
|
|
354
|
+
### `veto_session_save` — input validation
|
|
355
|
+
|
|
356
|
+
`summary`, `context`, and `task_state` now have enforced size limits. Oversized inputs are truncated with a warning rather than silently stored or crashing.
|
|
357
|
+
|
|
358
|
+
| Field | Limit |
|
|
359
|
+
|---|---|
|
|
360
|
+
| `summary` | 2,000 chars |
|
|
361
|
+
| `context` | 50,000 chars |
|
|
362
|
+
| `task_state` | 20,000 chars |
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
veto_session_save { summary: "...(very long)..." }
|
|
366
|
+
→ { success: true, truncation_warnings: ["summary truncated to 2000 chars (was 8432)"] }
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
299
371
|
## New in v1.4.0
|
|
300
372
|
|
|
301
373
|
### `veto_metrics` — usage dashboard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-engine.d.ts","sourceRoot":"","sources":["../../src/council/decision-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"decision-engine.d.ts","sourceRoot":"","sources":["../../src/council/decision-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1E,KAAK,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAEnC,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG;IACpC,aAAa,EAAE,cAAc,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAsDA;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,EAAE,EACvB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAmHR"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision } from './decision-extractor.js';
|
|
1
2
|
export function decide(votes) {
|
|
2
3
|
const entries = [
|
|
3
4
|
['Lead Developer', votes.lead_dev],
|
|
@@ -121,6 +122,25 @@ export function formatDebate(task, votes, verdict, block_reasons, warnings, reco
|
|
|
121
122
|
lines.push(` • ...and ${extra} more`);
|
|
122
123
|
lines.push('');
|
|
123
124
|
}
|
|
125
|
+
// Council position on a binary choice — surface which option most agents prefer
|
|
126
|
+
const decision = extractDecision(task);
|
|
127
|
+
if (decision.isDecisionTask) {
|
|
128
|
+
const allRecs = Object.values(votes)
|
|
129
|
+
.map(v => v.recommendation ?? '')
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.join(' ');
|
|
132
|
+
const prefersA = (allRecs.match(new RegExp(`"${decision.optionA.slice(0, 20).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'gi')) ?? []).length;
|
|
133
|
+
const prefersB = (allRecs.match(new RegExp(`"${decision.optionB.slice(0, 20).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'gi')) ?? []).length;
|
|
134
|
+
if (prefersA > prefersB) {
|
|
135
|
+
lines.push(`🎯 Council leans toward: "${decision.optionA}" (${prefersA} agent${prefersA !== 1 ? 's' : ''} prefer it)`);
|
|
136
|
+
}
|
|
137
|
+
else if (prefersB > prefersA) {
|
|
138
|
+
lines.push(`🎯 Council leans toward: "${decision.optionB}" (${prefersB} agent${prefersB !== 1 ? 's' : ''} prefer it)`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
lines.push(`🎯 Council is split on: "${decision.optionA}" vs "${decision.optionB}" — see agent recommendations below`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
124
144
|
lines.push(`✅ Recommended: ${recommended}`);
|
|
125
145
|
if (verdict === 'RED') {
|
|
126
146
|
lines.push('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-engine.js","sourceRoot":"","sources":["../../src/council/decision-engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decision-engine.js","sourceRoot":"","sources":["../../src/council/decision-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentVote } from './types.js';
|
|
2
|
+
export interface DecisionContext {
|
|
3
|
+
isDecisionTask: boolean;
|
|
4
|
+
optionA: string;
|
|
5
|
+
optionB: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function extractDecision(task: string): DecisionContext;
|
|
8
|
+
export declare function pickSide(optionA: string, optionB: string, riskPatterns: RegExp): {
|
|
9
|
+
preferred: string;
|
|
10
|
+
avoided: string;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function reframeVote(vote: AgentVote, ctx: DecisionContext, preferred: string | null, domainAdvice: string): AgentVote;
|
|
13
|
+
//# sourceMappingURL=decision-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-extractor.d.ts","sourceRoot":"","sources":["../../src/council/decision-extractor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CA4B7D;AAKD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO/C;AAGD,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,YAAY,EAAE,MAAM,GACnB,SAAS,CAWX"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Extracts a binary architectural choice from a task description.
|
|
2
|
+
// Used by all council agents to frame their votes against the specific decision.
|
|
3
|
+
const NULL_CTX = { isDecisionTask: false, optionA: '', optionB: '' };
|
|
4
|
+
function cleanOption(s) {
|
|
5
|
+
return s
|
|
6
|
+
.replace(/^(build|add|use|keep|go\s+with|implement|we\s+should\s+)?/i, '')
|
|
7
|
+
.replace(/[,.\s]+$/, '')
|
|
8
|
+
.trim()
|
|
9
|
+
.slice(0, 70);
|
|
10
|
+
}
|
|
11
|
+
export function extractDecision(task) {
|
|
12
|
+
const flat = task.replace(/[\r\n]+/g, ' ').replace(/\s{2,}/g, ' ');
|
|
13
|
+
// "X vs Y" or "X versus Y"
|
|
14
|
+
const vsMatch = flat.match(/(.{8,90}?)\s+(?:vs\.?|versus)\s+(.{8,90}?)(?:[.?!]|$)/i);
|
|
15
|
+
if (vsMatch) {
|
|
16
|
+
const a = cleanOption(vsMatch[1].split(/[?!—–]/).pop() ?? '');
|
|
17
|
+
const b = cleanOption(vsMatch[2].split(/[,?!.—–]/)[0]);
|
|
18
|
+
if (a.length >= 4 && b.length >= 4)
|
|
19
|
+
return { isDecisionTask: true, optionA: a, optionB: b };
|
|
20
|
+
}
|
|
21
|
+
// "should we [A] or [B]" / "should we [A], or keep [B]" / "should we [A] — or [B]"
|
|
22
|
+
const shouldMatch = flat.match(/should\s+we\s+(.{8,140}?)\s*,?\s*(?:—\s*)?or\s+(?:keep\s+|go\s+with\s+)?(.{8,120})(?:[?.]|$)/i);
|
|
23
|
+
if (shouldMatch) {
|
|
24
|
+
const a = cleanOption(shouldMatch[1]);
|
|
25
|
+
const b = cleanOption(shouldMatch[2].split(/[,?.!]/)[0]);
|
|
26
|
+
if (a.length >= 4 && b.length >= 4)
|
|
27
|
+
return { isDecisionTask: true, optionA: a, optionB: b };
|
|
28
|
+
}
|
|
29
|
+
// "X approach/pattern or Y approach/pattern"
|
|
30
|
+
const approachMatch = flat.match(/(.{5,60}?)\s+(?:approach|option|pattern|strategy|method)\s+or\s+(.{5,60}?)\s+(?:approach|option|pattern|strategy|method)/i);
|
|
31
|
+
if (approachMatch) {
|
|
32
|
+
const a = cleanOption(approachMatch[1]);
|
|
33
|
+
const b = cleanOption(approachMatch[2]);
|
|
34
|
+
if (a.length >= 4 && b.length >= 4)
|
|
35
|
+
return { isDecisionTask: true, optionA: a, optionB: b };
|
|
36
|
+
}
|
|
37
|
+
return NULL_CTX;
|
|
38
|
+
}
|
|
39
|
+
// Returns which option is preferred from a given agent's perspective.
|
|
40
|
+
// riskPatterns: regex matching traits that make an option RISKIER for this domain.
|
|
41
|
+
// Counts occurrences so a single safe word can't cancel a strong risk signal.
|
|
42
|
+
export function pickSide(optionA, optionB, riskPatterns) {
|
|
43
|
+
const g = new RegExp(riskPatterns.source, 'gi');
|
|
44
|
+
const aHits = (optionA.match(g) ?? []).length;
|
|
45
|
+
const bHits = (optionB.match(g) ?? []).length;
|
|
46
|
+
if (aHits > bHits)
|
|
47
|
+
return { preferred: optionB, avoided: optionA };
|
|
48
|
+
if (bHits > aHits)
|
|
49
|
+
return { preferred: optionA, avoided: optionB };
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// Reframes an existing vote to explicitly address the architectural choice.
|
|
53
|
+
export function reframeVote(vote, ctx, preferred, domainAdvice) {
|
|
54
|
+
if (!ctx.isDecisionTask)
|
|
55
|
+
return vote;
|
|
56
|
+
const { optionA, optionB } = ctx;
|
|
57
|
+
const rec = preferred
|
|
58
|
+
? `Prefer "${preferred}" — ${domainAdvice}`
|
|
59
|
+
: domainAdvice || vote.recommendation || '';
|
|
60
|
+
return {
|
|
61
|
+
...vote,
|
|
62
|
+
reason: `[${optionA} vs ${optionB}] ${vote.reason}`,
|
|
63
|
+
recommendation: rec,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=decision-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-extractor.js","sourceRoot":"","sources":["../../src/council/decision-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devil-advocate.d.ts","sourceRoot":"","sources":["../../src/council/devil-advocate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"devil-advocate.d.ts","sourceRoot":"","sources":["../../src/council/devil-advocate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgI5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAqC/C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, reframeVote } from './decision-extractor.js';
|
|
1
2
|
// Devil always warns — never alone blocks, never approves non-trivial tasks
|
|
2
3
|
const PROBES = [
|
|
3
4
|
{
|
|
@@ -142,11 +143,21 @@ export function analyze(task) {
|
|
|
142
143
|
matched.push(GENERIC);
|
|
143
144
|
}
|
|
144
145
|
const top = matched.slice(0, 3); // cap at 3 concerns to avoid flooding
|
|
145
|
-
|
|
146
|
+
const vote = {
|
|
146
147
|
verdict: 'warn',
|
|
147
148
|
reason: top[0].concern,
|
|
148
149
|
concerns: top.slice(1).map(m => m.concern),
|
|
149
150
|
recommendation: top.map(m => m.recommendation).join(' | '),
|
|
150
151
|
};
|
|
152
|
+
return applyDecisionStance(vote, task);
|
|
153
|
+
}
|
|
154
|
+
function applyDecisionStance(vote, task) {
|
|
155
|
+
const ctx = extractDecision(task);
|
|
156
|
+
if (!ctx.isDecisionTask)
|
|
157
|
+
return vote;
|
|
158
|
+
// Devil challenges the first (typically "build new") option — it's the direction being proposed
|
|
159
|
+
const { optionA } = ctx;
|
|
160
|
+
const advice = `Before committing to "${optionA}": what is the failure mode at 2AM with no one watching? What breaks first, how do you detect it, and how fast can you roll back?`;
|
|
161
|
+
return reframeVote(vote, ctx, null, advice);
|
|
151
162
|
}
|
|
152
163
|
//# sourceMappingURL=devil-advocate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devil-advocate.js","sourceRoot":"","sources":["../../src/council/devil-advocate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devil-advocate.js","sourceRoot":"","sources":["../../src/council/devil-advocate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lead-developer.d.ts","sourceRoot":"","sources":["../../src/council/lead-developer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"lead-developer.d.ts","sourceRoot":"","sources":["../../src/council/lead-developer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqI5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAoD/C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, pickSide, reframeVote } from './decision-extractor.js';
|
|
1
2
|
const BLOCK_RULES = [
|
|
2
3
|
{
|
|
3
4
|
pattern: /\bmd5\b/i,
|
|
@@ -140,33 +141,52 @@ export function analyze(task) {
|
|
|
140
141
|
concerns.push(rule.concern);
|
|
141
142
|
}
|
|
142
143
|
}
|
|
144
|
+
let vote;
|
|
143
145
|
if (blocks.length > 0) {
|
|
144
|
-
|
|
146
|
+
vote = {
|
|
145
147
|
verdict: 'block',
|
|
146
148
|
reason: blocks[0].reason,
|
|
147
149
|
concerns: [...blocks.slice(1).map(b => b.reason), ...concerns],
|
|
148
150
|
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
149
151
|
};
|
|
150
152
|
}
|
|
151
|
-
if (concerns.length > 0) {
|
|
152
|
-
|
|
153
|
+
else if (concerns.length > 0) {
|
|
154
|
+
vote = {
|
|
153
155
|
verdict: 'warn',
|
|
154
156
|
reason: `${concerns.length} code quality issue${concerns.length > 1 ? 's' : ''} detected.`,
|
|
155
157
|
concerns,
|
|
156
158
|
recommendation: 'Address quality concerns before shipping to production.',
|
|
157
159
|
};
|
|
158
160
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
161
|
+
else {
|
|
162
|
+
// No bad patterns — apply topic-based expert analysis
|
|
163
|
+
const matched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
164
|
+
if (matched.length > 0) {
|
|
165
|
+
const top = matched.slice(0, 2);
|
|
166
|
+
vote = {
|
|
167
|
+
verdict: 'warn',
|
|
168
|
+
reason: top[0].concern,
|
|
169
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
170
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
vote = { verdict: 'approve', reason: 'No security or quality violations detected. Code quality standards appear satisfied.', concerns: [] };
|
|
175
|
+
}
|
|
169
176
|
}
|
|
170
|
-
return
|
|
177
|
+
return applyDecisionStance(vote, task);
|
|
178
|
+
}
|
|
179
|
+
// Risk: traits that increase implementation burden / maintenance surface
|
|
180
|
+
const LEAD_DEV_RISK = /\b(http|express|rest.?api|api.?layer|bundl|embed|integrat\s+into|new\s+(server|layer|endpoint|transport))\b/i;
|
|
181
|
+
function applyDecisionStance(vote, task) {
|
|
182
|
+
const ctx = extractDecision(task);
|
|
183
|
+
if (!ctx.isDecisionTask)
|
|
184
|
+
return vote;
|
|
185
|
+
const { optionA, optionB } = ctx;
|
|
186
|
+
const side = pickSide(optionA, optionB, LEAD_DEV_RISK);
|
|
187
|
+
const advice = side
|
|
188
|
+
? `"${side.avoided}" adds new infrastructure to maintain; "${side.preferred}" limits scope and keeps the codebase smaller — validate real demand before building.`
|
|
189
|
+
: `Evaluate which option requires fewer new abstractions. Prefer the path with the smaller implementation surface until user demand justifies the cost.`;
|
|
190
|
+
return reframeVote(vote, ctx, side?.preferred ?? null, advice);
|
|
171
191
|
}
|
|
172
192
|
//# sourceMappingURL=lead-developer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lead-developer.js","sourceRoot":"","sources":["../../src/council/lead-developer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lead-developer.js","sourceRoot":"","sources":["../../src/council/lead-developer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legal-compliance.d.ts","sourceRoot":"","sources":["../../src/council/legal-compliance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"legal-compliance.d.ts","sourceRoot":"","sources":["../../src/council/legal-compliance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+G5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAuF/C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { extractDecision, pickSide, reframeVote } from './decision-extractor.js';
|
|
1
2
|
const BLOCK_RULES = [
|
|
2
3
|
{
|
|
3
4
|
pattern: /\b(gpl|gnu.?general.?public.?license)\b/i,
|
|
@@ -121,22 +122,6 @@ export function analyze(task) {
|
|
|
121
122
|
recommendations.push(rule.recommendation);
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
|
-
if (blocks.length > 0) {
|
|
125
|
-
return {
|
|
126
|
-
verdict: 'block',
|
|
127
|
-
reason: blocks[0].reason,
|
|
128
|
-
concerns: blocks.slice(1).map(b => b.reason),
|
|
129
|
-
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
if (concerns.length > 0) {
|
|
133
|
-
return {
|
|
134
|
-
verdict: 'warn',
|
|
135
|
-
reason: `${concerns.length} legal or compliance concern${concerns.length > 1 ? 's' : ''} — review before shipping.`,
|
|
136
|
-
concerns,
|
|
137
|
-
recommendation: recommendations[0],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
125
|
// Topic-based legal analysis for tasks with no specific pattern matches
|
|
141
126
|
const TOPIC_INSIGHTS = [
|
|
142
127
|
{
|
|
@@ -170,16 +155,51 @@ export function analyze(task) {
|
|
|
170
155
|
recommendation: 'If collecting any telemetry, disclose it in the Marketplace listing and use VS Code\'s telemetry API which respects user opt-out settings. Consult Marketplace policies before publishing.',
|
|
171
156
|
},
|
|
172
157
|
];
|
|
173
|
-
|
|
174
|
-
if (
|
|
175
|
-
|
|
176
|
-
|
|
158
|
+
let vote;
|
|
159
|
+
if (blocks.length > 0) {
|
|
160
|
+
vote = {
|
|
161
|
+
verdict: 'block',
|
|
162
|
+
reason: blocks[0].reason,
|
|
163
|
+
concerns: blocks.slice(1).map(b => b.reason),
|
|
164
|
+
recommendation: blocks.map(b => b.recommendation).join(' | '),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
else if (concerns.length > 0) {
|
|
168
|
+
vote = {
|
|
177
169
|
verdict: 'warn',
|
|
178
|
-
reason:
|
|
179
|
-
concerns
|
|
180
|
-
recommendation:
|
|
170
|
+
reason: `${concerns.length} legal or compliance concern${concerns.length > 1 ? 's' : ''} — review before shipping.`,
|
|
171
|
+
concerns,
|
|
172
|
+
recommendation: recommendations[0],
|
|
181
173
|
};
|
|
182
174
|
}
|
|
183
|
-
|
|
175
|
+
else {
|
|
176
|
+
const topicMatched = TOPIC_INSIGHTS.filter(t => t.pattern.test(task));
|
|
177
|
+
if (topicMatched.length > 0) {
|
|
178
|
+
const top = topicMatched.slice(0, 2);
|
|
179
|
+
vote = {
|
|
180
|
+
verdict: 'warn',
|
|
181
|
+
reason: top[0].concern,
|
|
182
|
+
concerns: top.slice(1).map(t => t.concern),
|
|
183
|
+
recommendation: top.map(t => t.recommendation).join(' | '),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
vote = { verdict: 'approve', reason: 'No legal or compliance issues detected.', concerns: [] };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return applyDecisionStance(vote, task);
|
|
191
|
+
}
|
|
192
|
+
// Legal risk: options that expose more data surface, add network endpoints, or create new data flows
|
|
193
|
+
const LEGAL_RISK = /\b(http|rest.?api|network|remote|endpoint|expose|token|oauth|third.?party|integrate)\b/i;
|
|
194
|
+
function applyDecisionStance(vote, task) {
|
|
195
|
+
const ctx = extractDecision(task);
|
|
196
|
+
if (!ctx.isDecisionTask)
|
|
197
|
+
return vote;
|
|
198
|
+
const { optionA, optionB } = ctx;
|
|
199
|
+
const side = pickSide(optionA, optionB, LEGAL_RISK);
|
|
200
|
+
const advice = side
|
|
201
|
+
? `"${side.preferred}" has a smaller data surface area and fewer cross-boundary data flows. "${side.avoided}" introduces new data exposure obligations — document retention policies and user consent before shipping.`
|
|
202
|
+
: `Both options may create data obligations. Confirm: what user data each option stores, for how long, and whether users can delete it.`;
|
|
203
|
+
return reframeVote(vote, ctx, side?.preferred ?? null, advice);
|
|
184
204
|
}
|
|
185
205
|
//# sourceMappingURL=legal-compliance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legal-compliance.js","sourceRoot":"","sources":["../../src/council/legal-compliance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"legal-compliance.js","sourceRoot":"","sources":["../../src/council/legal-compliance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjF,MAAM,WAAW,GAAuE;IACtF;QACE,OAAO,EAAE,0CAA0C;QACnD,MAAM,EAAE,+FAA+F;QACvG,cAAc,EAAE,iGAAiG;KAClH;IACD;QACE,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,iFAAiF;QACzF,cAAc,EAAE,0FAA0F;KAC3G;IACD;QACE,OAAO,EAAE,0EAA0E;QACnF,MAAM,EAAE,4GAA4G;QACpH,cAAc,EAAE,sHAAsH;KACvI;IACD;QACE,OAAO,EAAE,mDAAmD;QAC5D,MAAM,EAAE,sGAAsG;QAC9G,cAAc,EAAE,+GAA+G;KAChI;IACD;QACE,OAAO,EAAE,wDAAwD;QACjE,MAAM,EAAE,kGAAkG;QAC1G,cAAc,EAAE,4FAA4F;KAC7G;IACD;QACE,OAAO,EAAE,kEAAkE;QAC3E,MAAM,EAAE,6GAA6G;QACrH,cAAc,EAAE,8FAA8F;KAC/G;IACD;QACE,OAAO,EAAE,2EAA2E;QACpF,MAAM,EAAE,6GAA6G;QACrH,cAAc,EAAE,uGAAuG;KACxH;IACD;QACE,OAAO,EAAE,wFAAwF;QACjG,MAAM,EAAE,+FAA+F;QACvG,cAAc,EAAE,6GAA6G;KAC9H;IACD;QACE,OAAO,EAAE,4EAA4E;QACrF,MAAM,EAAE,4FAA4F;QACpG,cAAc,EAAE,kHAAkH;KACnI;IACD;QACE,OAAO,EAAE,6DAA6D;QACtE,MAAM,EAAE,kGAAkG;QAC1G,cAAc,EAAE,wFAAwF;KACzG;CACF,CAAC;AAEF,MAAM,UAAU,GAAwE;IACtF;QACE,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,uGAAuG;QAChH,cAAc,EAAE,oGAAoG;KACrH;IACD;QACE,OAAO,EAAE,oHAAoH;QAC7H,OAAO,EAAE,2FAA2F;QACpG,cAAc,EAAE,gGAAgG;KACjH;IACD;QACE,OAAO,EAAE,mEAAmE;QAC5E,OAAO,EAAE,6EAA6E;QACtF,cAAc,EAAE,gGAAgG;KACjH;IACD;QACE,OAAO,EAAE,4EAA4E;QACrF,OAAO,EAAE,qFAAqF;QAC9F,cAAc,EAAE,gGAAgG;KACjH;IACD;QACE,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE,kGAAkG;QAC3G,cAAc,EAAE,2EAA2E;KAC5F;IACD;QACE,OAAO,EAAE,kFAAkF;QAC3F,OAAO,EAAE,sGAAsG;QAC/G,cAAc,EAAE,iGAAiG;KAClH;IACD;QACE,OAAO,EAAE,+EAA+E;QACxF,OAAO,EAAE,oGAAoG;QAC7G,cAAc,EAAE,4FAA4F;KAC7G;IACD;QACE,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE,sEAAsE;QAC/E,cAAc,EAAE,iHAAiH;KAClI;IACD;QACE,OAAO,EAAE,iFAAiF;QAC1F,OAAO,EAAE,oFAAoF;QAC7F,cAAc,EAAE,kFAAkF;KACnG;IACD;QACE,OAAO,EAAE,+EAA+E;QACxF,OAAO,EAAE,wFAAwF;QACjG,cAAc,EAAE,oGAAoG;KACrH;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,qCAAqC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7F,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,wEAAwE;IACxE,MAAM,cAAc,GAAwE;QAC1F;YACE,OAAO,EAAE,uCAAuC;YAChD,OAAO,EAAE,wKAAwK;YACjL,cAAc,EAAE,sLAAsL;SACvM;QACD;YACE,OAAO,EAAE,qDAAqD;YAC9D,OAAO,EAAE,2KAA2K;YACpL,cAAc,EAAE,4KAA4K;SAC7L;QACD;YACE,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,+KAA+K;YACxL,cAAc,EAAE,+KAA+K;SAChM;QACD;YACE,OAAO,EAAE,6CAA6C;YACtD,OAAO,EAAE,4KAA4K;YACrL,cAAc,EAAE,mJAAmJ;SACpK;QACD;YACE,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,mKAAmK;YAC5K,cAAc,EAAE,yJAAyJ;SAC1K;QACD;YACE,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,2KAA2K;YACpL,cAAc,EAAE,4LAA4L;SAC7M;KACF,CAAC;IAEF,IAAI,IAAe,CAAC;IAEpB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,GAAG;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;SAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,GAAG;YACL,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,+BAA+B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,4BAA4B;YACnH,QAAQ;YACR,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;SACnC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,IAAI,GAAG;gBACL,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;gBACtB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1C,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;aAC3D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,yCAAyC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjG,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,GAAG,yFAAyF,CAAC;AAE7G,SAAS,mBAAmB,CAAC,IAAe,EAAE,IAAY;IACxD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI;QACjB,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,2EAA2E,IAAI,CAAC,OAAO,4GAA4G;QACvN,CAAC,CAAC,sIAAsI,CAAC;IAC3I,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-council.d.ts","sourceRoot":"","sources":["../../src/council/llm-council.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAa,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"llm-council.d.ts","sourceRoot":"","sources":["../../src/council/llm-council.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAa,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6IvE,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAqC5F"}
|