@jigyasudham/veto 1.4.0 → 1.4.3
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 +218 -17
- 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 +3 -0
- package/dist/council/llm-council.d.ts.map +1 -1
- package/dist/council/llm-council.js +127 -21
- 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/session-summarizer.d.ts +25 -0
- package/dist/council/session-summarizer.d.ts.map +1 -0
- package/dist/council/session-summarizer.js +130 -0
- package/dist/council/session-summarizer.js.map +1 -0
- 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 +109 -13
- 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.d.ts.map +1 -1
- package/dist/skills/memory/skill-session-save.js +5 -9
- package/dist/skills/memory/skill-session-save.js.map +1 -1
- package/dist/tools/definitions.d.ts +164 -6
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +24 -6
- package/dist/tools/definitions.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,9 +12,9 @@ An MCP server that runs locally on your machine, plugs into Claude Code, Codex C
|
|
|
12
12
|
|
|
13
13
|
Veto has two fundamentally different types of agents:
|
|
14
14
|
|
|
15
|
-
### Council agents — real LLM reasoning (7 agents)
|
|
15
|
+
### Council agents — real LLM reasoning via agentic loop (7 agents)
|
|
16
16
|
|
|
17
|
-
The 7 council agents
|
|
17
|
+
The 7 council agents use the **agentic loop pattern** — no API key, no extra cost, works on Claude Code, Gemini CLI, and Codex CLI identically. The tool returns an instant deterministic result plus a `debate_prompt`. You (the host AI) read it, reason as all 7 specialists, and pass the responses back. Veto runs the verdict engine on your real LLM output.
|
|
18
18
|
|
|
19
19
|
| Agent | Role |
|
|
20
20
|
|---|---|
|
|
@@ -31,7 +31,7 @@ Use `strictness` to control depth:
|
|
|
31
31
|
- `standard` — all 7 agents, default
|
|
32
32
|
- `strict` — all 7 agents + Devil's Advocate rebuttal round on the most critical blocker
|
|
33
33
|
|
|
34
|
-
`veto_benchmark` also runs
|
|
34
|
+
`veto_benchmark` also runs council — two debates in parallel for side-by-side approach comparison.
|
|
35
35
|
|
|
36
36
|
### Expert modules — deterministic, instant, zero tokens (42+ agents)
|
|
37
37
|
|
|
@@ -41,10 +41,10 @@ Every other agent in Veto — coder, reviewer, tester, debugger, security scanne
|
|
|
41
41
|
veto_agent_plan { agent: "coder", task: "..." } ← deterministic plan, instant
|
|
42
42
|
veto_code_review { code: "..." } ← regex + heuristic scanner, instant
|
|
43
43
|
veto_secrets_scan{ text: "..." } ← pattern matching, instant
|
|
44
|
-
veto_council_debate { task: "..." } ←
|
|
44
|
+
veto_council_debate { task: "..." } ← agentic loop: host AI reasons as 7 specialists
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
**Why this split?** LLM reasoning
|
|
47
|
+
**Why this split?** LLM reasoning is only worth it for high-stakes architecture/security/migration decisions. Pattern-matching is MORE reliable than LLMs for secrets detection and OWASP scanning (no hallucinations). The deterministic agents are the workhorses; the council is the gatekeeper.
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
@@ -104,7 +104,7 @@ All config files are home-directory relative — they apply globally across all
|
|
|
104
104
|
|
|
105
105
|
## What Veto Does
|
|
106
106
|
|
|
107
|
-
**Council** — Before any significant task, 7 specialist agents
|
|
107
|
+
**Council** — Before any significant task, 7 specialist agents debate it using the agentic loop and return a GREEN / YELLOW / RED / DEADLOCK verdict. Works on Claude Code, Gemini CLI, and Codex CLI — no API keys needed. Bad decisions get blocked before any code is written.
|
|
108
108
|
|
|
109
109
|
**Metrics** — `veto_metrics` gives you a live usage dashboard: sessions saved, council verdict breakdown, top agents by call count, 7-day quality trend, and knowledge base stats. Zero cost, pure SQLite.
|
|
110
110
|
|
|
@@ -140,9 +140,9 @@ All config files are home-directory relative — they apply globally across all
|
|
|
140
140
|
|
|
141
141
|
## The 50 Agents
|
|
142
142
|
|
|
143
|
-
### Council Layer — LLM
|
|
143
|
+
### Council Layer — LLM reasoning via agentic loop (8)
|
|
144
144
|
|
|
145
|
-
>
|
|
145
|
+
> Real LLM reasoning, zero extra cost, works on all 3 platforms. The host AI reasons as all 7 specialists and passes structured responses back to Veto's verdict engine. Used by `veto_council_debate` and `veto_benchmark`.
|
|
146
146
|
|
|
147
147
|
`Lead Developer` · `Product Manager` · `System Architect` · `UX Designer` · `Devil's Advocate` · `Legal & Compliance` · `Security` · `Decision Engine`
|
|
148
148
|
|
|
@@ -256,26 +256,62 @@ veto doctor
|
|
|
256
256
|
|
|
257
257
|
## Council Debate
|
|
258
258
|
|
|
259
|
+
Two-phase flow — works on Claude Code, Gemini CLI, and Codex CLI with no API keys:
|
|
260
|
+
|
|
259
261
|
```
|
|
262
|
+
# Phase 1 — call with task, get instant deterministic result + LLM upgrade prompt
|
|
260
263
|
veto_council_debate {
|
|
261
264
|
task: "migrate auth from sessions to JWTs",
|
|
262
265
|
project_dir: "/your/project",
|
|
263
|
-
strictness: "standard"
|
|
266
|
+
strictness: "standard"
|
|
267
|
+
}
|
|
268
|
+
→ {
|
|
269
|
+
llm_backed: false,
|
|
270
|
+
final_verdict: "YELLOW",
|
|
271
|
+
votes: { lead_dev: {...}, architect: {...}, security: {...}, ... },
|
|
272
|
+
llm_upgrade: {
|
|
273
|
+
available: true,
|
|
274
|
+
instruction: "Read debate_prompt, reason as all 7 agents, call again with agent_responses",
|
|
275
|
+
debate_prompt: "You are running a Veto Council debate. Analyze the task as each specialist..."
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
# Phase 2 — reason as all 7 agents, pass responses back → get LLM-backed verdict
|
|
280
|
+
veto_council_debate {
|
|
281
|
+
task: "migrate auth from sessions to JWTs",
|
|
282
|
+
agent_responses: {
|
|
283
|
+
lead_dev: { verdict: "warn", reason: "Stateless JWTs complicate logout — need blocklist", concerns: ["Refresh token rotation must be atomic"], recommendation: "Use short-lived access tokens (15m) + httpOnly refresh tokens" },
|
|
284
|
+
pm: { verdict: "approve", reason: "JWT migration unblocks mobile clients", concerns: [], recommendation: "Ship behind a feature flag, roll back if logout issues" },
|
|
285
|
+
architect: { verdict: "approve", reason: "Good fit for stateless microservice boundary", concerns: ["Clock skew can break expiry across services"], recommendation: "Add NTP sync check; use relative expiry not absolute timestamps" },
|
|
286
|
+
ux: { verdict: "approve", reason: "No user-visible change if migration is seamless", concerns: [], recommendation: "Silent migration — no logout required for existing sessions" },
|
|
287
|
+
devil: { verdict: "warn", reason: "What if the refresh token store goes down at 2AM?", concerns: ["Redis outage = all users logged out", "Token replay attack window between rotation and invalidation"], recommendation: "Fallback to session auth if Redis is down; use short rotation window" },
|
|
288
|
+
legal: { verdict: "approve", reason: "JWTs are industry standard, no new compliance risk", concerns: [], recommendation: "Document token storage in privacy policy" },
|
|
289
|
+
security: { verdict: "warn", reason: "Refresh token rotation must be atomic — TOCTOU risk", concerns: ["localStorage storage of access token is XSS-vulnerable"], recommendation: "Store access token in memory only; refresh token in httpOnly Secure SameSite=Strict cookie" }
|
|
290
|
+
}
|
|
264
291
|
}
|
|
265
292
|
→ {
|
|
293
|
+
llm_backed: true,
|
|
266
294
|
final_verdict: "YELLOW",
|
|
267
295
|
block_reasons: [],
|
|
268
|
-
warnings: ["
|
|
269
|
-
|
|
270
|
-
lead_dev: { verdict: "warn", reason: "Stateless JWTs complicate logout flows...", concerns: [...] },
|
|
271
|
-
architect: { verdict: "approve", reason: "Good fit for microservices...", concerns: [...] },
|
|
272
|
-
security: { verdict: "warn", reason: "Refresh token rotation must be atomic...", concerns: [...] },
|
|
273
|
-
...
|
|
274
|
-
},
|
|
275
|
-
recommended: "Proceed with JWT migration. Implement a Redis blocklist for logout..."
|
|
296
|
+
warnings: ["Refresh token rotation must be atomic...", "What if the refresh token store goes down..."],
|
|
297
|
+
recommended: "Proceed with JWT. Use httpOnly cookies for refresh tokens, memory-only for access tokens..."
|
|
276
298
|
}
|
|
277
299
|
```
|
|
278
300
|
|
|
301
|
+
When the task presents a binary choice, agents name the option they prefer and the output includes a `🎯 Council leans toward:` line:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
veto_council_debate {
|
|
305
|
+
task: "Should we add an Express HTTP layer or keep Veto pure MCP with an external adapter?"
|
|
306
|
+
}
|
|
307
|
+
→ formatted_output includes:
|
|
308
|
+
🎯 Council leans toward: "pure MCP with an external adapter" (5 agents prefer it)
|
|
309
|
+
Lead Dev: [Express HTTP vs external adapter] ... [WARN]
|
|
310
|
+
recommendation: Prefer "external adapter" — Express adds new infrastructure...
|
|
311
|
+
Security: [Express HTTP vs external adapter] ... [WARN]
|
|
312
|
+
recommendation: Prefer "external adapter" — keeps the threat model local-only...
|
|
313
|
+
```
|
|
314
|
+
|
|
279
315
|
---
|
|
280
316
|
|
|
281
317
|
## Session Tagging + Search
|
|
@@ -283,6 +319,13 @@ veto_council_debate {
|
|
|
283
319
|
Tag sessions when saving to make them findable later:
|
|
284
320
|
|
|
285
321
|
```
|
|
322
|
+
# Let Veto generate the summary from conversation context
|
|
323
|
+
veto_session_save {
|
|
324
|
+
auto_summarize: true,
|
|
325
|
+
tags: ["auth", "jwt", "middleware"]
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
# Or write it manually
|
|
286
329
|
veto_session_save {
|
|
287
330
|
summary: "Implemented JWT auth middleware",
|
|
288
331
|
context: "...",
|
|
@@ -296,6 +339,164 @@ veto_sessions_list { query: "auth" }
|
|
|
296
339
|
|
|
297
340
|
---
|
|
298
341
|
|
|
342
|
+
## New in v1.4.3
|
|
343
|
+
|
|
344
|
+
### Council debate + session save — work on Gemini CLI and Codex CLI
|
|
345
|
+
|
|
346
|
+
MCP Sampling (`server.createMessage`) is not yet implemented by any of the three CLI hosts. Previously this meant the council always used deterministic fallbacks and `auto_summarize` never ran on any platform.
|
|
347
|
+
|
|
348
|
+
**v1.4.3 introduces the agentic loop pattern** — no API keys, no sampling dependency, works on all three platforms identically.
|
|
349
|
+
|
|
350
|
+
#### Council debate — two-phase LLM upgrade
|
|
351
|
+
|
|
352
|
+
```
|
|
353
|
+
# Phase 1 — always returns an instant deterministic result
|
|
354
|
+
veto_council_debate { task: "migrate auth to JWT" }
|
|
355
|
+
→ {
|
|
356
|
+
llm_backed: false,
|
|
357
|
+
final_verdict: "YELLOW",
|
|
358
|
+
votes: { ... }, ← deterministic agent analysis
|
|
359
|
+
llm_upgrade: {
|
|
360
|
+
available: true,
|
|
361
|
+
instruction: "Read debate_prompt, reason as all 7 agents, call again with agent_responses",
|
|
362
|
+
debate_prompt: "You are running a Veto Council debate. Analyze the task as each specialist..."
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
# Phase 2 — call again with your agent_responses → get the LLM-backed verdict
|
|
367
|
+
veto_council_debate {
|
|
368
|
+
task: "migrate auth to JWT",
|
|
369
|
+
agent_responses: {
|
|
370
|
+
lead_dev: { verdict: "warn", reason: "...", concerns: [], recommendation: "..." },
|
|
371
|
+
pm: { verdict: "approve", ... },
|
|
372
|
+
architect: { verdict: "warn", ... },
|
|
373
|
+
ux: { verdict: "approve", ... },
|
|
374
|
+
devil: { verdict: "warn", ... },
|
|
375
|
+
legal: { verdict: "warn", ... },
|
|
376
|
+
security: { verdict: "warn", ... }
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
→ { llm_backed: true, final_verdict: "YELLOW", votes: { ... } }
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
The host AI (Claude, Gemini, or Codex) reads the `debate_prompt`, reasons as all 7 specialists, and passes the structured JSON back. Veto runs the verdict engine on the real LLM output.
|
|
383
|
+
|
|
384
|
+
#### Session save — agentic fallback
|
|
385
|
+
|
|
386
|
+
When `auto_summarize: true` and MCP Sampling is unavailable, `veto_session_save` now returns a structured template and instructions for the calling AI to fill in and call again — instead of silently saving nothing:
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
veto_session_save { auto_summarize: true }
|
|
390
|
+
→ {
|
|
391
|
+
mode: "agentic",
|
|
392
|
+
instruction: "Generate the session summary yourself from the conversation above, then call veto_session_save again with the filled-in fields.",
|
|
393
|
+
summarize_prompt: "Review the conversation above and produce a session checkpoint...",
|
|
394
|
+
template: {
|
|
395
|
+
auto_summarize: false,
|
|
396
|
+
summary: "<one sentence describing what was accomplished>",
|
|
397
|
+
context: "{ task, decisions[], findings[] with file:line }",
|
|
398
|
+
task_state: "{ completed[], remaining[], nextAction: 'Edit src/X.ts line N — ...' }"
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## New in v1.4.2
|
|
406
|
+
|
|
407
|
+
### `veto_session_save` — LLM auto-summarization
|
|
408
|
+
|
|
409
|
+
Pass `auto_summarize: true` and Veto reads the full conversation via MCP Sampling, then generates an accurate, structured session checkpoint itself — you don't write summary, context, or task_state manually.
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
# Simplest possible save — Veto does the work
|
|
413
|
+
veto_session_save {
|
|
414
|
+
auto_summarize: true,
|
|
415
|
+
project_dir: "/your/project",
|
|
416
|
+
tags: ["auth", "migration"]
|
|
417
|
+
}
|
|
418
|
+
→ {
|
|
419
|
+
success: true,
|
|
420
|
+
auto_summarized: true,
|
|
421
|
+
session_id: "abc-123",
|
|
422
|
+
summary: "Implemented JWT auth middleware with refresh token rotation",
|
|
423
|
+
context: {
|
|
424
|
+
task: "migrate session auth to JWT",
|
|
425
|
+
decisions: [{ decision: "store refresh token in httpOnly cookie", rationale: "XSS protection" }],
|
|
426
|
+
findings: ["src/auth.ts:142 — refreshToken handler, needs rotation logic next"]
|
|
427
|
+
},
|
|
428
|
+
task_state: {
|
|
429
|
+
completed: ["access token generation", "middleware wiring"],
|
|
430
|
+
remaining: ["refresh token rotation", "logout blocklist"],
|
|
431
|
+
nextAction: "Edit src/auth.ts line 142 — implement rotation: invalidate old refresh token, issue new one, update DB row"
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Veto generates `nextAction` as a **concrete, file+line instruction** the next AI can execute without re-reading any source files. On restore, the `resume_instructions` field tells the AI to trust this and start immediately.
|
|
437
|
+
|
|
438
|
+
When MCP Sampling is unavailable (all platforms currently), returns an agentic template asking the host AI to generate the summary from the conversation and call back with filled-in fields — see v1.4.3.
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## New in v1.4.1
|
|
443
|
+
|
|
444
|
+
### Council debate — decision-aware verdicts
|
|
445
|
+
|
|
446
|
+
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.
|
|
447
|
+
|
|
448
|
+
Before — agents fired generic keyword-matched concerns unrelated to the choice:
|
|
449
|
+
```
|
|
450
|
+
Lead Dev: "Persistent memory stores grow unbounded..." ← nothing to do with the question
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
After — agents address the specific choice:
|
|
454
|
+
```
|
|
455
|
+
Lead Dev: [Express-bundled vs external-adapter] reason [WARN]
|
|
456
|
+
recommendation: Prefer "external-adapter" — "Express-bundled" adds new
|
|
457
|
+
infrastructure to maintain; validate real demand before building.
|
|
458
|
+
🎯 Council leans toward: "external adapter pattern" (4 agents prefer it)
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
In the agentic loop (phase 2), the host AI is explicitly instructed to name the preferred option in its recommendation for each agent role.
|
|
462
|
+
|
|
463
|
+
### `veto_session_restore` — resume instructions
|
|
464
|
+
|
|
465
|
+
The restore response now includes a `resume_instructions` field that tells the AI exactly what to do:
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
veto_session_restore { session_id: "..." }
|
|
469
|
+
→ {
|
|
470
|
+
resume_instructions: "Context restored. Trust the summary, context, and task_state
|
|
471
|
+
above. Do NOT re-read source files to orient yourself — only open a file if you
|
|
472
|
+
are about to EDIT it. Start immediately with: [nextAction from task_state].",
|
|
473
|
+
session_id: "...",
|
|
474
|
+
summary: "...",
|
|
475
|
+
context: { ... },
|
|
476
|
+
task_state: { nextAction: "Edit src/server.ts line 302, add zod validation..." },
|
|
477
|
+
...
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
This fixes the core issue where AI sessions were re-reading the entire codebase on restore instead of trusting the saved context.
|
|
482
|
+
|
|
483
|
+
### `veto_session_save` — input validation
|
|
484
|
+
|
|
485
|
+
`summary`, `context`, and `task_state` now have enforced size limits. Oversized inputs are truncated with a warning rather than silently stored or crashing.
|
|
486
|
+
|
|
487
|
+
| Field | Limit |
|
|
488
|
+
|---|---|
|
|
489
|
+
| `summary` | 2,000 chars |
|
|
490
|
+
| `context` | 50,000 chars |
|
|
491
|
+
| `task_state` | 20,000 chars |
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
veto_session_save { summary: "...(very long)..." }
|
|
495
|
+
→ { success: true, truncation_warnings: ["summary truncated to 2000 chars (was 8432)"] }
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
299
500
|
## New in v1.4.0
|
|
300
501
|
|
|
301
502
|
### `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":"AAAA,kEAAkE;AAClE,iFAAiF;AAUjF,MAAM,QAAQ,GAAoB,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEtF,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC;SACL,OAAO,CAAC,4DAA4D,EAAE,EAAE,CAAC;SACzE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEnE,2BAA2B;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACrF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IAED,mFAAmF;IACnF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;IAChI,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,2HAA2H,CAAC,CAAC;IAC9J,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,sEAAsE;AACtE,mFAAmF;AACnF,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,OAAe,EACf,YAAoB;IAEpB,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACnE,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CACzB,IAAe,EACf,GAAoB,EACpB,SAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IACjC,MAAM,GAAG,GAAG,SAAS;QACnB,CAAC,CAAC,WAAW,SAAS,OAAO,YAAY,EAAE;QAC3C,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE;QACnD,cAAc,EAAE,GAAG;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|