@jigyasudham/veto 3.2.1 → 3.4.0

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.
Files changed (159) hide show
  1. package/README.md +62 -7
  2. package/dist/adapters/index.d.ts.map +1 -1
  3. package/dist/adapters/index.js +4 -1
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/agents/llm-runner.d.ts.map +1 -1
  6. package/dist/agents/llm-runner.js +17 -4
  7. package/dist/agents/llm-runner.js.map +1 -1
  8. package/dist/cli/context-guidance.d.ts +16 -0
  9. package/dist/cli/context-guidance.d.ts.map +1 -0
  10. package/dist/cli/context-guidance.js +20 -0
  11. package/dist/cli/context-guidance.js.map +1 -0
  12. package/dist/cli/leftover-guides.d.ts +38 -0
  13. package/dist/cli/leftover-guides.d.ts.map +1 -0
  14. package/dist/cli/leftover-guides.js +135 -0
  15. package/dist/cli/leftover-guides.js.map +1 -0
  16. package/dist/cli/statusline-hosts.d.ts +36 -0
  17. package/dist/cli/statusline-hosts.d.ts.map +1 -0
  18. package/dist/cli/statusline-hosts.js +212 -0
  19. package/dist/cli/statusline-hosts.js.map +1 -0
  20. package/dist/cli/statusline.d.ts +6 -0
  21. package/dist/cli/statusline.d.ts.map +1 -1
  22. package/dist/cli/statusline.js +51 -10
  23. package/dist/cli/statusline.js.map +1 -1
  24. package/dist/cli.js +105 -48
  25. package/dist/cli.js.map +1 -1
  26. package/dist/council/llm-council.d.ts.map +1 -1
  27. package/dist/council/llm-council.js +13 -8
  28. package/dist/council/llm-council.js.map +1 -1
  29. package/dist/lessons/adapters/claude.d.ts +10 -0
  30. package/dist/lessons/adapters/claude.d.ts.map +1 -0
  31. package/dist/lessons/adapters/claude.js +18 -0
  32. package/dist/lessons/adapters/claude.js.map +1 -0
  33. package/dist/lessons/adapters/codex.d.ts +7 -0
  34. package/dist/lessons/adapters/codex.d.ts.map +1 -0
  35. package/dist/lessons/adapters/codex.js +9 -0
  36. package/dist/lessons/adapters/codex.js.map +1 -0
  37. package/dist/lessons/adapters/gemini.d.ts +4 -0
  38. package/dist/lessons/adapters/gemini.d.ts.map +1 -0
  39. package/dist/lessons/adapters/gemini.js +44 -0
  40. package/dist/lessons/adapters/gemini.js.map +1 -0
  41. package/dist/lessons/adapters/index.d.ts +6 -0
  42. package/dist/lessons/adapters/index.d.ts.map +1 -0
  43. package/dist/lessons/adapters/index.js +14 -0
  44. package/dist/lessons/adapters/index.js.map +1 -0
  45. package/dist/lessons/adapters/markdown.d.ts +16 -0
  46. package/dist/lessons/adapters/markdown.d.ts.map +1 -0
  47. package/dist/lessons/adapters/markdown.js +130 -0
  48. package/dist/lessons/adapters/markdown.js.map +1 -0
  49. package/dist/lessons/adapters/types.d.ts +27 -0
  50. package/dist/lessons/adapters/types.d.ts.map +1 -0
  51. package/dist/lessons/adapters/types.js +2 -0
  52. package/dist/lessons/adapters/types.js.map +1 -0
  53. package/dist/lessons/classify.d.ts +30 -0
  54. package/dist/lessons/classify.d.ts.map +1 -0
  55. package/dist/lessons/classify.js +101 -0
  56. package/dist/lessons/classify.js.map +1 -0
  57. package/dist/lessons/discover.d.ts +19 -0
  58. package/dist/lessons/discover.d.ts.map +1 -0
  59. package/dist/lessons/discover.js +65 -0
  60. package/dist/lessons/discover.js.map +1 -0
  61. package/dist/lessons/harvest.d.ts +48 -0
  62. package/dist/lessons/harvest.d.ts.map +1 -0
  63. package/dist/lessons/harvest.js +96 -0
  64. package/dist/lessons/harvest.js.map +1 -0
  65. package/dist/lessons/identity.d.ts +23 -0
  66. package/dist/lessons/identity.d.ts.map +1 -0
  67. package/dist/lessons/identity.js +81 -0
  68. package/dist/lessons/identity.js.map +1 -0
  69. package/dist/lessons/mask.d.ts +6 -0
  70. package/dist/lessons/mask.d.ts.map +1 -0
  71. package/dist/lessons/mask.js +22 -0
  72. package/dist/lessons/mask.js.map +1 -0
  73. package/dist/lessons/select.d.ts +23 -0
  74. package/dist/lessons/select.d.ts.map +1 -0
  75. package/dist/lessons/select.js +134 -0
  76. package/dist/lessons/select.js.map +1 -0
  77. package/dist/lessons/source-project.d.ts +9 -0
  78. package/dist/lessons/source-project.d.ts.map +1 -0
  79. package/dist/lessons/source-project.js +149 -0
  80. package/dist/lessons/source-project.js.map +1 -0
  81. package/dist/lessons/store.d.ts +56 -0
  82. package/dist/lessons/store.d.ts.map +1 -0
  83. package/dist/lessons/store.js +85 -0
  84. package/dist/lessons/store.js.map +1 -0
  85. package/dist/memory/config.d.ts +14 -0
  86. package/dist/memory/config.d.ts.map +1 -1
  87. package/dist/memory/config.js +43 -0
  88. package/dist/memory/config.js.map +1 -1
  89. package/dist/memory/decisions.d.ts +34 -1
  90. package/dist/memory/decisions.d.ts.map +1 -1
  91. package/dist/memory/decisions.js +158 -13
  92. package/dist/memory/decisions.js.map +1 -1
  93. package/dist/memory/local.d.ts.map +1 -1
  94. package/dist/memory/local.js +38 -4
  95. package/dist/memory/local.js.map +1 -1
  96. package/dist/memory/schema.d.ts +2 -1
  97. package/dist/memory/schema.d.ts.map +1 -1
  98. package/dist/memory/schema.js +69 -0
  99. package/dist/memory/schema.js.map +1 -1
  100. package/dist/server/handlers/council.d.ts.map +1 -1
  101. package/dist/server/handlers/council.js +16 -2
  102. package/dist/server/handlers/council.js.map +1 -1
  103. package/dist/server/handlers/generators.d.ts.map +1 -1
  104. package/dist/server/handlers/generators.js +8 -0
  105. package/dist/server/handlers/generators.js.map +1 -1
  106. package/dist/server/handlers/memory.d.ts.map +1 -1
  107. package/dist/server/handlers/memory.js +44 -7
  108. package/dist/server/handlers/memory.js.map +1 -1
  109. package/dist/server/handlers/session.d.ts.map +1 -1
  110. package/dist/server/handlers/session.js +52 -22
  111. package/dist/server/handlers/session.js.map +1 -1
  112. package/dist/server.d.ts.map +1 -1
  113. package/dist/server.js +12 -3
  114. package/dist/server.js.map +1 -1
  115. package/dist/tools/definitions.d.ts +7 -3
  116. package/dist/tools/definitions.d.ts.map +1 -1
  117. package/dist/tools/definitions.js +4 -3
  118. package/dist/tools/definitions.js.map +1 -1
  119. package/dist/transcripts/cache.d.ts +1 -0
  120. package/dist/transcripts/cache.d.ts.map +1 -1
  121. package/dist/transcripts/cache.js +0 -0
  122. package/dist/transcripts/cache.js.map +1 -1
  123. package/dist/transcripts/claude-paths.d.ts +5 -0
  124. package/dist/transcripts/claude-paths.d.ts.map +1 -0
  125. package/dist/transcripts/claude-paths.js +21 -0
  126. package/dist/transcripts/claude-paths.js.map +1 -0
  127. package/dist/transcripts/context.d.ts +41 -0
  128. package/dist/transcripts/context.d.ts.map +1 -0
  129. package/dist/transcripts/context.js +144 -0
  130. package/dist/transcripts/context.js.map +1 -0
  131. package/dist/transcripts/discover.d.ts +12 -2
  132. package/dist/transcripts/discover.d.ts.map +1 -1
  133. package/dist/transcripts/discover.js +55 -7
  134. package/dist/transcripts/discover.js.map +1 -1
  135. package/dist/transcripts/manage.d.ts +8 -0
  136. package/dist/transcripts/manage.d.ts.map +1 -1
  137. package/dist/transcripts/manage.js +28 -13
  138. package/dist/transcripts/manage.js.map +1 -1
  139. package/dist/transcripts/mapping.d.ts.map +1 -1
  140. package/dist/transcripts/mapping.js +4 -2
  141. package/dist/transcripts/mapping.js.map +1 -1
  142. package/dist/transcripts/on-save.d.ts +9 -0
  143. package/dist/transcripts/on-save.d.ts.map +1 -1
  144. package/dist/transcripts/on-save.js +36 -9
  145. package/dist/transcripts/on-save.js.map +1 -1
  146. package/dist/transcripts/project-key.d.ts +4 -0
  147. package/dist/transcripts/project-key.d.ts.map +1 -0
  148. package/dist/transcripts/project-key.js +30 -0
  149. package/dist/transcripts/project-key.js.map +1 -0
  150. package/dist/transcripts/recall.d.ts +4 -0
  151. package/dist/transcripts/recall.d.ts.map +1 -1
  152. package/dist/transcripts/recall.js +6 -5
  153. package/dist/transcripts/recall.js.map +1 -1
  154. package/dist/transcripts/stopwords.d.ts +2 -0
  155. package/dist/transcripts/stopwords.d.ts.map +1 -0
  156. package/dist/transcripts/stopwords.js +8 -0
  157. package/dist/transcripts/stopwords.js.map +1 -0
  158. package/package.json +1 -1
  159. package/server.json +2 -2
@@ -0,0 +1,56 @@
1
+ import type { LessonSource } from './adapters/index.js';
2
+ import type { LessonScope } from './classify.js';
3
+ export type LessonRow = {
4
+ id: string;
5
+ source_cli: LessonSource;
6
+ source_path: string;
7
+ section_anchor: string;
8
+ project_identity: string;
9
+ project_label: string | null;
10
+ scope: LessonScope;
11
+ kind: string;
12
+ text_masked: string;
13
+ source_hash: string;
14
+ source_mtime: string;
15
+ quarantined: number;
16
+ quarantine_reason: string | null;
17
+ created_at: string;
18
+ updated_at: string;
19
+ };
20
+ /** A section after masking and classification; raw memory text never reaches the store. */
21
+ export type HarvestedSection = {
22
+ anchor: string;
23
+ textMasked: string;
24
+ scope: LessonScope;
25
+ kind: string;
26
+ quarantineReason: string | null;
27
+ };
28
+ export type SyncLessonsInput = {
29
+ sourceCli: LessonSource;
30
+ sourcePath: string;
31
+ projectIdentity: string;
32
+ projectLabel: string | null;
33
+ sourceMtime: string;
34
+ sections: HarvestedSection[];
35
+ };
36
+ /**
37
+ * Make a source's rows exactly its current sections: insert new ones, update
38
+ * changed ones, delete the rest (lifetime = source). A source that failed to
39
+ * parse never reaches this function, so a malformed file cannot erase rows;
40
+ * an empty section list is a successful parse of nothing and clears them.
41
+ */
42
+ export declare function syncLessons(input: SyncLessonsInput): {
43
+ inserted: number;
44
+ updated: number;
45
+ removed: number;
46
+ };
47
+ /** Delete every row whose source file is no longer among the discovered ones. */
48
+ export declare function purgeVanishedLessonSources(present: Array<{
49
+ source: LessonSource;
50
+ sourcePath: string;
51
+ }>): number;
52
+ export declare function disableLessonSource(source: LessonSource, reason: string): void;
53
+ export declare function isLessonSourceEnabled(source: LessonSource): boolean;
54
+ /** Hosts whose adapter tripped the format-drift canary; their rows are not served. */
55
+ export declare function disabledLessonSources(): Set<LessonSource>;
56
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lessons/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,YAAY,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,2FAA2F;AAC3F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,YAAY,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CAAC;AAgBF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA6B3G;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAU/G;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI9E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAGnE;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,IAAI,GAAG,CAAC,YAAY,CAAC,CAGzD"}
@@ -0,0 +1,85 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { getDb } from '../memory/local.js';
3
+ /** Per SECTION, over everything stored: an edit elsewhere in the file leaves this row alone. */
4
+ function sectionHash(input, section) {
5
+ return createHash('sha256')
6
+ .update(JSON.stringify([input.projectIdentity, input.projectLabel, section.scope, section.kind, section.quarantineReason, section.textMasked]))
7
+ .digest('hex');
8
+ }
9
+ function inTransaction(run) {
10
+ const db = getDb();
11
+ db.exec('BEGIN');
12
+ try {
13
+ const out = run();
14
+ db.exec('COMMIT');
15
+ return out;
16
+ }
17
+ catch (err) {
18
+ db.exec('ROLLBACK');
19
+ throw err;
20
+ }
21
+ }
22
+ /**
23
+ * Make a source's rows exactly its current sections: insert new ones, update
24
+ * changed ones, delete the rest (lifetime = source). A source that failed to
25
+ * parse never reaches this function, so a malformed file cannot erase rows;
26
+ * an empty section list is a successful parse of nothing and clears them.
27
+ */
28
+ export function syncLessons(input) {
29
+ return inTransaction(() => {
30
+ const db = getDb();
31
+ const existing = db.prepare('SELECT id, source_hash FROM lessons WHERE source_cli = ? AND source_path = ? AND section_anchor = ?');
32
+ const insert = db.prepare(`INSERT INTO lessons (id, source_cli, source_path, section_anchor, project_identity, project_label, scope, kind, text_masked, source_hash, source_mtime, quarantined, quarantine_reason, created_at, updated_at)
33
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
34
+ const update = db.prepare(`UPDATE lessons SET project_identity = ?, project_label = ?, scope = ?, kind = ?, text_masked = ?, source_hash = ?, source_mtime = ?, quarantined = ?, quarantine_reason = ?, updated_at = ? WHERE id = ?`);
35
+ const now = new Date().toISOString();
36
+ let inserted = 0;
37
+ let updated = 0;
38
+ for (const section of input.sections) {
39
+ const hash = sectionHash(input, section);
40
+ const quarantined = section.quarantineReason ? 1 : 0;
41
+ const row = existing.get(input.sourceCli, input.sourcePath, section.anchor);
42
+ if (!row) {
43
+ insert.run(randomUUID(), input.sourceCli, input.sourcePath, section.anchor, input.projectIdentity, input.projectLabel, section.scope, section.kind, section.textMasked, hash, input.sourceMtime, quarantined, section.quarantineReason, now, now);
44
+ inserted++;
45
+ }
46
+ else if (row.source_hash !== hash) {
47
+ update.run(input.projectIdentity, input.projectLabel, section.scope, section.kind, section.textMasked, hash, input.sourceMtime, quarantined, section.quarantineReason, now, row.id);
48
+ updated++;
49
+ }
50
+ }
51
+ const anchors = input.sections.map(section => section.anchor);
52
+ const keep = anchors.length ? ` AND section_anchor NOT IN (${anchors.map(() => '?').join(', ')})` : '';
53
+ const removed = Number(db.prepare(`DELETE FROM lessons WHERE source_cli = ? AND source_path = ?${keep}`)
54
+ .run(input.sourceCli, input.sourcePath, ...anchors).changes);
55
+ return { inserted, updated, removed };
56
+ });
57
+ }
58
+ /** Delete every row whose source file is no longer among the discovered ones. */
59
+ export function purgeVanishedLessonSources(present) {
60
+ const keep = new Set(present.map(p => `${p.source}\u0000${p.sourcePath}`));
61
+ const db = getDb();
62
+ const rows = db.prepare('SELECT DISTINCT source_cli, source_path FROM lessons').all();
63
+ const del = db.prepare('DELETE FROM lessons WHERE source_cli = ? AND source_path = ?');
64
+ let removed = 0;
65
+ for (const row of rows) {
66
+ if (!keep.has(`${row.source_cli}\u0000${row.source_path}`))
67
+ removed += Number(del.run(row.source_cli, row.source_path).changes);
68
+ }
69
+ return removed;
70
+ }
71
+ export function disableLessonSource(source, reason) {
72
+ getDb().prepare(`INSERT INTO lesson_source_state (source_cli, enabled, disabled_reason, checked_at) VALUES (?, 0, ?, ?)
73
+ ON CONFLICT(source_cli) DO UPDATE SET enabled = 0, disabled_reason = excluded.disabled_reason, checked_at = excluded.checked_at`)
74
+ .run(source, reason, new Date().toISOString());
75
+ }
76
+ export function isLessonSourceEnabled(source) {
77
+ const row = getDb().prepare('SELECT enabled FROM lesson_source_state WHERE source_cli = ?').get(source);
78
+ return !row || row.enabled === 1;
79
+ }
80
+ /** Hosts whose adapter tripped the format-drift canary; their rows are not served. */
81
+ export function disabledLessonSources() {
82
+ const rows = getDb().prepare('SELECT source_cli FROM lesson_source_state WHERE enabled = 0').all();
83
+ return new Set(rows.map(row => row.source_cli));
84
+ }
85
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lessons/store.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,15 @@ export type TranscriptsConfig = {
6
6
  consent_at: string | null;
7
7
  first_capture_at: string | null;
8
8
  };
9
+ export type LessonsConfig = {
10
+ enabled: boolean;
11
+ consent_version: number;
12
+ consent_at: string | null;
13
+ cross_project: boolean;
14
+ cross_vendor: boolean;
15
+ };
16
+ export declare const LESSONS_CONSENT_VERSION = 2;
17
+ export declare const DEFAULT_LESSONS: LessonsConfig;
9
18
  export type VetoConfig = {
10
19
  dailyTokenBudget: {
11
20
  claude: number;
@@ -17,9 +26,14 @@ export type VetoConfig = {
17
26
  auto_apply_learning: boolean;
18
27
  compact_tools: boolean;
19
28
  transcripts: TranscriptsConfig;
29
+ lessons: LessonsConfig;
20
30
  };
21
31
  export declare const DEFAULT_BUDGETS: VetoConfig['dailyTokenBudget'];
22
32
  export declare const DEFAULT_TRANSCRIPTS: TranscriptsConfig;
23
33
  export declare function getConfig(): VetoConfig;
24
34
  export declare function setConfig(partial: Partial<VetoConfig>): void;
35
+ /** Explicit v2 opt-in. No version upgrade can silently enable sharing. */
36
+ export declare function enableLessonsSharing(): LessonsConfig;
37
+ export declare function disableLessonsSharing(): void;
38
+ export declare function isLessonsSharingEnabled(config?: LessonsConfig): boolean;
25
39
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,gBAAgB,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE,cAAc,GAAG,KAAK,CAAC;IAGrC,mBAAmB,EAAE,OAAO,CAAC;IAI7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAYF,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,kBAAkB,CAK1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,iBAOjC,CAAC;AAeF,wBAAgB,SAAS,IAAI,UAAU,CAiCtC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAa5D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAIF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,eAAe,EAAE,aAM7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,gBAAgB,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE,cAAc,GAAG,KAAK,CAAC;IAGrC,mBAAmB,EAAE,OAAO,CAAC;IAI7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAYF,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,kBAAkB,CAK1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,iBAOjC,CAAC;AAyBF,wBAAgB,SAAS,IAAI,UAAU,CAoCtC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAc5D;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,aAAa,CAUpD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED,wBAAgB,uBAAuB,CAAC,MAAM,GAAE,aAAmC,GAAG,OAAO,CAK5F"}
@@ -1,6 +1,14 @@
1
1
  import { join, dirname } from 'node:path';
2
2
  import { homedir } from 'node:os';
3
3
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
4
+ export const LESSONS_CONSENT_VERSION = 2;
5
+ export const DEFAULT_LESSONS = {
6
+ enabled: false,
7
+ consent_version: 0,
8
+ consent_at: null,
9
+ cross_project: false,
10
+ cross_vendor: false,
11
+ };
4
12
  // VETO_CONFIG_PATH overrides the config location (tests isolate here, mirroring
5
13
  // VETO_TEST_DB). Read per-call so the override applies even after this module
6
14
  // has already been imported transitively.
@@ -36,6 +44,15 @@ function normalizeTranscripts(raw) {
36
44
  first_capture_at: typeof raw?.first_capture_at === 'string' ? raw.first_capture_at : null,
37
45
  };
38
46
  }
47
+ function normalizeLessons(raw) {
48
+ return {
49
+ enabled: raw?.enabled === true,
50
+ consent_version: typeof raw?.consent_version === 'number' ? raw.consent_version : 0,
51
+ consent_at: typeof raw?.consent_at === 'string' ? raw.consent_at : null,
52
+ cross_project: raw?.cross_project === true,
53
+ cross_vendor: raw?.cross_vendor === true,
54
+ };
55
+ }
39
56
  export function getConfig() {
40
57
  if (!existsSync(configPath())) {
41
58
  return {
@@ -44,6 +61,7 @@ export function getConfig() {
44
61
  auto_apply_learning: true,
45
62
  compact_tools: false,
46
63
  transcripts: { ...DEFAULT_TRANSCRIPTS },
64
+ lessons: { ...DEFAULT_LESSONS },
47
65
  };
48
66
  }
49
67
  try {
@@ -59,6 +77,7 @@ export function getConfig() {
59
77
  auto_apply_learning: raw.auto_apply_learning !== false, // default true
60
78
  compact_tools: raw.compact_tools === true, // default false
61
79
  transcripts: normalizeTranscripts(raw.transcripts),
80
+ lessons: normalizeLessons(raw.lessons),
62
81
  };
63
82
  }
64
83
  catch {
@@ -68,6 +87,7 @@ export function getConfig() {
68
87
  auto_apply_learning: true,
69
88
  compact_tools: false,
70
89
  transcripts: { ...DEFAULT_TRANSCRIPTS },
90
+ lessons: { ...DEFAULT_LESSONS },
71
91
  };
72
92
  }
73
93
  }
@@ -81,8 +101,31 @@ export function setConfig(partial) {
81
101
  ...(partial.dailyTokenBudget ?? {}),
82
102
  },
83
103
  transcripts: partial.transcripts ?? current.transcripts,
104
+ lessons: partial.lessons ?? current.lessons,
84
105
  };
85
106
  mkdirSync(dirname(configPath()), { recursive: true });
86
107
  writeFileSync(configPath(), JSON.stringify(next, null, 2), 'utf8');
87
108
  }
109
+ /** Explicit v2 opt-in. No version upgrade can silently enable sharing. */
110
+ export function enableLessonsSharing() {
111
+ const lessons = {
112
+ enabled: true,
113
+ consent_version: LESSONS_CONSENT_VERSION,
114
+ consent_at: new Date().toISOString(),
115
+ cross_project: true,
116
+ cross_vendor: true,
117
+ };
118
+ setConfig({ lessons });
119
+ return lessons;
120
+ }
121
+ export function disableLessonsSharing() {
122
+ const current = getConfig().lessons;
123
+ setConfig({ lessons: { ...current, enabled: false, cross_project: false, cross_vendor: false } });
124
+ }
125
+ export function isLessonsSharingEnabled(config = getConfig().lessons) {
126
+ return config.enabled
127
+ && config.consent_version === LESSONS_CONSENT_VERSION
128
+ && config.cross_project
129
+ && config.cross_vendor;
130
+ }
88
131
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAkC7E,gFAAgF;AAChF,8EAA8E;AAC9E,0CAA0C;AAC1C,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,+EAA+E;AAC/E,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC7D,MAAM,EAAG,OAAO;IAChB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAI,OAAO;IAChB,WAAW,EAAE,SAAS;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,EAAE;IACP,cAAc,EAAE,GAAG;IACnB,eAAe,EAAE,CAAC;IAClB,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,SAAS,oBAAoB,CAAC,GAA2C;IACvE,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI;QAC9B,GAAG,EAAE,OAAO,GAAG,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChD,cAAc,EAAE,OAAO,GAAG,EAAE,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC;YAC/E,CAAC,CAAC,GAAG,CAAC,cAAc;YACpB,CAAC,CAAC,mBAAmB,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,GAAG,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnF,UAAU,EAAE,OAAO,GAAG,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACvE,gBAAgB,EAAE,OAAO,GAAG,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;KAC1F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,gBAAgB,EAAE,EAAE,GAAG,eAAe,EAAE;YACxC,YAAY,EAAE,cAAc;YAC5B,mBAAmB,EAAE,IAAI;YACzB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,EAAE,GAAG,mBAAmB,EAAE;SACxC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAwB,CAAC;QAClF,OAAO;YACL,gBAAgB,EAAE;gBAChB,MAAM,EAAG,GAAG,CAAC,gBAAgB,EAAE,MAAM,IAAK,eAAe,CAAC,MAAM;gBAChE,MAAM,EAAG,GAAG,CAAC,gBAAgB,EAAE,MAAM,IAAK,eAAe,CAAC,MAAM;gBAChE,KAAK,EAAI,GAAG,CAAC,gBAAgB,EAAE,KAAK,IAAM,eAAe,CAAC,KAAK;gBAC/D,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,WAAW,IAAI,eAAe,CAAC,WAAW;aAC9E;YACD,YAAY,EAAE,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;YACjE,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,KAAK,KAAK,EAAE,eAAe;YACvE,aAAa,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,EAAE,gBAAgB;YAC3D,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,gBAAgB,EAAE,EAAE,GAAG,eAAe,EAAE;YACxC,YAAY,EAAE,cAAc;YAC5B,mBAAmB,EAAE,IAAI;YACzB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,EAAE,GAAG,mBAAmB,EAAE;SACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAA4B;IACpD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAe;QACvB,GAAG,OAAO;QACV,GAAG,OAAO;QACV,gBAAgB,EAAE;YAChB,GAAG,OAAO,CAAC,gBAAgB;YAC3B,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;SACpC;QACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;KACxD,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ export type DriftViolation = {
19
19
  line: string;
20
20
  matched_pattern: string;
21
21
  };
22
+ export declare const MAX_PATTERN_LENGTH = 200;
23
+ export declare function validateForbiddenPatterns(patterns: string[]): string[];
22
24
  export declare function addConstraint(input: {
23
25
  rule: string;
24
26
  forbidden_patterns: string[];
@@ -29,5 +31,36 @@ export declare function addConstraint(input: {
29
31
  }): DecisionConstraint;
30
32
  export declare function listConstraints(project_dir?: string, include_inactive?: boolean): DecisionConstraint[];
31
33
  export declare function setConstraintActive(id: string, active: boolean): boolean;
32
- export declare function checkDiffAgainstConstraints(diff: string, project_dir?: string): DriftViolation[];
34
+ export declare const MAX_LINE_CHARS = 2000;
35
+ export declare const CHECK_BUDGET_MS = 2000;
36
+ export declare function checkDiffAgainstConstraints(diff: string, project_dir?: string, budgetMs?: number): DriftViolation[];
37
+ export type InvitationSource = 'council' | 'adr';
38
+ export type InvitationAnswer = 'accepted' | 'declined';
39
+ export type ConstraintInvitation = {
40
+ id: string;
41
+ source_kind: InvitationSource;
42
+ source_id: string | null;
43
+ project_dir: string | null;
44
+ offered_at: string;
45
+ answer: InvitationAnswer | null;
46
+ answered_at: string | null;
47
+ constraint_id: string | null;
48
+ };
49
+ export declare function offerInvitation(input: {
50
+ source_kind: InvitationSource;
51
+ source_id?: string;
52
+ project_dir?: string;
53
+ }): ConstraintInvitation | null;
54
+ export declare function getInvitation(id: string): ConstraintInvitation | null;
55
+ export declare function answerInvitation(id: string, answer: InvitationAnswer, constraint_id?: string): 'recorded' | 'not_found' | 'already_answered';
56
+ export declare function invitationStats(): {
57
+ offered: number;
58
+ accepted: number;
59
+ declined: number;
60
+ unanswered: number;
61
+ };
62
+ export declare function invitationPayload(invitation_id: string): {
63
+ invitation_id: string;
64
+ instruction: string;
65
+ };
33
66
  //# sourceMappingURL=decisions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/memory/decisions.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AA6BF,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,kBAAkB,CAkBrB;AAGD,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,kBAAkB,EAAE,CAQpG;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAIxE;AA4BD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA8BhG"}
1
+ {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/memory/decisions.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,83 @@ function normalizeDir(dir) {
29
29
  return null;
30
30
  return dir.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
31
31
  }
32
+ // ─── Pattern safety ───────────────────────────────────────────────────────────
33
+ // Constraints run inside veto_diff_review and veto_ci_gate, so one bad pattern
34
+ // must never wedge them. addConstraint is the only way into the table, and it
35
+ // refuses a pattern that fails these checks; a pattern stored before they
36
+ // existed degrades to a literal substring match at check time instead.
37
+ export const MAX_PATTERN_LENGTH = 200;
38
+ // True when a repeated group contains a repeat of its own — (a+)+, (\w*)*,
39
+ // ((ab)+c){2,} — the shape behind catastrophic backtracking. Deliberately
40
+ // over-approximate: refusing a safe pattern costs the user one rewrite,
41
+ // accepting a bad one can hang every review that follows.
42
+ function hasNestedQuantifier(src) {
43
+ const groups = []; // per open group: does its body repeat anything?
44
+ let closedGroupRepeats = false; // the group that closed on the previous character
45
+ let inClass = false;
46
+ for (let i = 0; i < src.length; i++) {
47
+ const ch = src[i];
48
+ const afterRepeatingGroup = closedGroupRepeats;
49
+ closedGroupRepeats = false;
50
+ if (ch === '\\') {
51
+ i++;
52
+ continue;
53
+ }
54
+ if (inClass) {
55
+ if (ch === ']')
56
+ inClass = false;
57
+ continue;
58
+ }
59
+ if (ch === '[') {
60
+ inClass = true;
61
+ continue;
62
+ }
63
+ if (ch === '(') {
64
+ groups.push(false);
65
+ continue;
66
+ }
67
+ if (ch === ')') {
68
+ closedGroupRepeats = groups.pop() ?? false;
69
+ if (closedGroupRepeats && groups.length > 0)
70
+ groups[groups.length - 1] = true;
71
+ continue;
72
+ }
73
+ if (ch === '+' || ch === '*' || (ch === '{' && /^\{\d+(,\d*)?\}/.test(src.slice(i)))) {
74
+ if (afterRepeatingGroup)
75
+ return true;
76
+ if (groups.length > 0)
77
+ groups[groups.length - 1] = true;
78
+ }
79
+ }
80
+ return false;
81
+ }
82
+ function compiles(pattern) {
83
+ try {
84
+ new RegExp(pattern, 'i');
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ // Why each pattern is unsafe to run against every future diff; [] means all are safe.
92
+ // A pattern that does not compile is not a problem: it is matched as plain text.
93
+ export function validateForbiddenPatterns(patterns) {
94
+ const problems = [];
95
+ for (const p of patterns) {
96
+ if (p.length > MAX_PATTERN_LENGTH) {
97
+ problems.push(`"${p.slice(0, 40)}…" is ${p.length} characters; the limit is ${MAX_PATTERN_LENGTH}.`);
98
+ }
99
+ else if (compiles(p) && hasNestedQuantifier(p)) {
100
+ problems.push(`"${p}" repeats a group that already repeats, which can hang diff review on some inputs. Drop the outer repeat — "(a+)+" matches the same lines as "a+".`);
101
+ }
102
+ }
103
+ return problems;
104
+ }
32
105
  export function addConstraint(input) {
106
+ const problems = validateForbiddenPatterns(input.forbidden_patterns);
107
+ if (problems.length > 0)
108
+ throw new Error(`Unsafe forbidden_patterns: ${problems.join(' ')}`);
33
109
  const db = getDb();
34
110
  const id = randomUUID();
35
111
  const created_at = new Date().toISOString();
@@ -76,23 +152,50 @@ function scopeMatches(scope, file) {
76
152
  return true;
77
153
  }
78
154
  }
79
- // A pattern is a case-insensitive regex; if it doesn't compile, it degrades to
80
- // a case-insensitive substring match so user input can never break the check.
81
- function patternMatches(pattern, line) {
82
- try {
83
- return new RegExp(pattern, 'i').test(line);
84
- }
85
- catch {
86
- return line.toLowerCase().includes(pattern.toLowerCase());
155
+ // A pattern is a case-insensitive regex. One that doesn't compile or that
156
+ // validateForbiddenPatterns would refuse, e.g. stored before those checks
157
+ // existed — degrades to a case-insensitive substring match, so user input can
158
+ // never break or hang the check.
159
+ function toMatcher(pattern) {
160
+ if (validateForbiddenPatterns([pattern]).length === 0) {
161
+ try {
162
+ const re = new RegExp(pattern, 'i');
163
+ return line => re.test(line);
164
+ }
165
+ catch { /* not a regex */ }
87
166
  }
167
+ const needle = pattern.toLowerCase();
168
+ return line => line.toLowerCase().includes(needle);
88
169
  }
89
- export function checkDiffAgainstConstraints(diff, project_dir) {
90
- const constraints = listConstraints(project_dir);
170
+ // A check must finish. Only the first MAX_LINE_CHARS of each added line are
171
+ // tested (a minified bundle can put 100KB on one line), and once the check has
172
+ // run for budgetMs it stops and reports a warning — so a slow rule degrades
173
+ // review and CI to a warning instead of wedging them.
174
+ export const MAX_LINE_CHARS = 2_000;
175
+ export const CHECK_BUDGET_MS = 2_000;
176
+ export function checkDiffAgainstConstraints(diff, project_dir, budgetMs = CHECK_BUDGET_MS) {
177
+ const constraints = listConstraints(project_dir).map(c => ({
178
+ ...c,
179
+ matchers: c.forbidden_patterns.filter(Boolean).map(pattern => ({ pattern, test: toMatcher(pattern) })),
180
+ }));
91
181
  if (constraints.length === 0 || !diff.trim())
92
182
  return [];
183
+ const deadline = Date.now() + budgetMs;
93
184
  const violations = [];
94
185
  let currentFile = '';
95
186
  for (const raw of diff.split('\n')) {
187
+ if (Date.now() >= deadline) {
188
+ violations.push({
189
+ constraint_id: 'veto:check-budget',
190
+ rule: `Decision check stopped after ${budgetMs}ms; the rest of this diff was not checked.`,
191
+ why: 'A constraint is too slow for this diff. Find it with veto_decisions list, then simplify or disable it.',
192
+ severity: 'warn',
193
+ file: currentFile || '(diff)',
194
+ line: '',
195
+ matched_pattern: '',
196
+ });
197
+ break;
198
+ }
96
199
  const fileHeader = raw.match(/^\+\+\+ b\/(.+)$/);
97
200
  if (fileHeader) {
98
201
  currentFile = fileHeader[1];
@@ -100,12 +203,12 @@ export function checkDiffAgainstConstraints(diff, project_dir) {
100
203
  }
101
204
  if (!raw.startsWith('+') || raw.startsWith('+++'))
102
205
  continue;
103
- const line = raw.slice(1);
206
+ const line = raw.slice(1, 1 + MAX_LINE_CHARS);
104
207
  for (const c of constraints) {
105
208
  if (!scopeMatches(c.file_scope, currentFile))
106
209
  continue;
107
- for (const pattern of c.forbidden_patterns) {
108
- if (pattern && patternMatches(pattern, line)) {
210
+ for (const { pattern, test } of c.matchers) {
211
+ if (test(line)) {
109
212
  violations.push({
110
213
  constraint_id: c.id,
111
214
  rule: c.rule,
@@ -122,4 +225,46 @@ export function checkDiffAgainstConstraints(diff, project_dir) {
122
225
  }
123
226
  return violations;
124
227
  }
228
+ // Records an offer, or returns null when this source (a council outcome) has
229
+ // already been offered — one question per verdict, however many tools see it.
230
+ export function offerInvitation(input) {
231
+ const db = getDb();
232
+ const id = randomUUID();
233
+ const res = db.prepare(`INSERT OR IGNORE INTO constraint_invitations (id, source_kind, source_id, project_dir, offered_at)
234
+ VALUES (?, ?, ?, ?, ?)`).run(id, input.source_kind, input.source_id ?? null, normalizeDir(input.project_dir), new Date().toISOString());
235
+ return res.changes > 0 ? getInvitation(id) : null;
236
+ }
237
+ export function getInvitation(id) {
238
+ const row = getDb().prepare('SELECT * FROM constraint_invitations WHERE id = ?').get(id);
239
+ return row ?? null;
240
+ }
241
+ // An invitation is answered once; a second answer is refused so the counts
242
+ // cannot drift from what the user actually said.
243
+ export function answerInvitation(id, answer, constraint_id) {
244
+ const res = getDb().prepare('UPDATE constraint_invitations SET answer = ?, answered_at = ?, constraint_id = ? WHERE id = ? AND answer IS NULL').run(answer, new Date().toISOString(), constraint_id ?? null, id);
245
+ if (res.changes > 0)
246
+ return 'recorded';
247
+ return getInvitation(id) ? 'already_answered' : 'not_found';
248
+ }
249
+ // Across all projects: the question is whether anyone ever says yes, not where.
250
+ export function invitationStats() {
251
+ const r = getDb().prepare(`SELECT COUNT(*) AS offered,
252
+ COALESCE(SUM(answer = 'accepted'), 0) AS accepted,
253
+ COALESCE(SUM(answer = 'declined'), 0) AS declined,
254
+ COALESCE(SUM(answer IS NULL), 0) AS unanswered
255
+ FROM constraint_invitations`).get();
256
+ return { offered: r.offered, accepted: r.accepted, declined: r.declined, unanswered: r.unanswered };
257
+ }
258
+ // The text a tool result carries to the host AI. Fixed wording, no derived
259
+ // content: the rule is written in the user's words when they say yes, so what
260
+ // ends up enforced is text the user authored or confirmed.
261
+ export function invitationPayload(invitation_id) {
262
+ return {
263
+ invitation_id,
264
+ instruction: 'Ask the user once, in one line, whether this verdict should become an enforceable rule: Veto would then flag any future diff that breaks it. ' +
265
+ 'Ask only if the verdict settles a lasting choice (e.g. "we use Postgres, not Mongo"); if it settles nothing lasting, skip the question without mentioning it. ' +
266
+ 'If they say yes, call veto_decisions with { action: "add", invitation_id, rule (in the user\'s words), forbidden_patterns, why }. ' +
267
+ 'If they say no, call veto_decisions with { action: "decline", invitation_id }. Never raise it again for this verdict.',
268
+ };
269
+ }
125
270
  //# sourceMappingURL=decisions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/memory/decisions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/memory/decisions.ts"],"names":[],"mappings":"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"}