@kintsugi-ai/core 0.1.0 → 0.2.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/agentConfig.d.ts +17 -0
  4. package/dist/agentConfig.js +91 -0
  5. package/dist/agentInstructions.d.ts +11 -0
  6. package/dist/agentInstructions.js +58 -0
  7. package/dist/auth.d.ts +35 -0
  8. package/dist/auth.js +121 -1
  9. package/dist/baseline.d.ts +9 -0
  10. package/dist/baseline.js +47 -0
  11. package/dist/capturer.js +6 -0
  12. package/dist/classifier-state.d.ts +13 -0
  13. package/dist/classifier-state.js +39 -0
  14. package/dist/comparator.d.ts +7 -0
  15. package/dist/comparator.js +6 -0
  16. package/dist/config.js +0 -6
  17. package/dist/escalation.d.ts +55 -0
  18. package/dist/escalation.js +99 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.js +5 -0
  21. package/dist/net.d.ts +7 -0
  22. package/dist/net.js +20 -0
  23. package/dist/setupPrompt.js +4 -2
  24. package/dist/types.d.ts +9 -4
  25. package/package.json +16 -1
  26. package/dist/auth.d.ts.map +0 -1
  27. package/dist/auth.js.map +0 -1
  28. package/dist/baseline.d.ts.map +0 -1
  29. package/dist/baseline.js.map +0 -1
  30. package/dist/benchmark.d.ts.map +0 -1
  31. package/dist/benchmark.js.map +0 -1
  32. package/dist/capturer.d.ts.map +0 -1
  33. package/dist/capturer.js.map +0 -1
  34. package/dist/classifier.d.ts.map +0 -1
  35. package/dist/classifier.js.map +0 -1
  36. package/dist/comparator.d.ts.map +0 -1
  37. package/dist/comparator.js.map +0 -1
  38. package/dist/comparator.test.d.ts +0 -2
  39. package/dist/comparator.test.d.ts.map +0 -1
  40. package/dist/comparator.test.js +0 -73
  41. package/dist/comparator.test.js.map +0 -1
  42. package/dist/config.d.ts.map +0 -1
  43. package/dist/config.js.map +0 -1
  44. package/dist/config.test.d.ts +0 -2
  45. package/dist/config.test.d.ts.map +0 -1
  46. package/dist/config.test.js +0 -67
  47. package/dist/config.test.js.map +0 -1
  48. package/dist/domdiff.d.ts.map +0 -1
  49. package/dist/domdiff.js.map +0 -1
  50. package/dist/feedback.d.ts.map +0 -1
  51. package/dist/feedback.js.map +0 -1
  52. package/dist/flowid.d.ts.map +0 -1
  53. package/dist/flowid.js.map +0 -1
  54. package/dist/index.d.ts.map +0 -1
  55. package/dist/index.js.map +0 -1
  56. package/dist/recorder.d.ts.map +0 -1
  57. package/dist/recorder.js.map +0 -1
  58. package/dist/setupPrompt.d.ts.map +0 -1
  59. package/dist/setupPrompt.js.map +0 -1
  60. package/dist/types.d.ts.map +0 -1
  61. package/dist/types.js.map +0 -1
  62. package/dist/vision.d.ts +0 -34
  63. package/dist/vision.d.ts.map +0 -1
  64. package/dist/vision.js +0 -139
  65. package/dist/vision.js.map +0 -1
  66. package/src/auth.ts +0 -195
  67. package/src/baseline.ts +0 -125
  68. package/src/benchmark.ts +0 -307
  69. package/src/capturer.ts +0 -105
  70. package/src/classifier.ts +0 -258
  71. package/src/comparator.test.ts +0 -97
  72. package/src/comparator.ts +0 -217
  73. package/src/config.test.ts +0 -80
  74. package/src/config.ts +0 -83
  75. package/src/domdiff.ts +0 -62
  76. package/src/feedback.ts +0 -64
  77. package/src/flowid.ts +0 -14
  78. package/src/index.ts +0 -13
  79. package/src/recorder.ts +0 -96
  80. package/src/setupPrompt.ts +0 -26
  81. package/src/types.ts +0 -144
  82. package/tsconfig.json +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domdiff.d.ts","sourceRoot":"","sources":["../src/domdiff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAsD3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domdiff.js","sourceRoot":"","sources":["../src/domdiff.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2CtF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWpF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flowid.d.ts","sourceRoot":"","sources":["../src/flowid.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAKvE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flowid.js","sourceRoot":"","sources":["../src/flowid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAiB;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAC/E,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAExE,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C,GAAG,OAAO,CAAC,aAAa,CAAC,CAiFzB;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,EAAE,CAEtE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupPrompt.d.ts","sourceRoot":"","sources":["../src/setupPrompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAmB9E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupPrompt.js","sourceRoot":"","sources":["../src/setupPrompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAqC,EAAE;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,IAAI,uBAAuB,CAAC;IAC5D,OAAO;;;;;;;kIAOyH,GAAG;;;;;;;;;6IASQ,CAAC;AAC9I,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAN,IAAY,UAQX;AARD,WAAY,UAAU;IACpB,qCAAuB,CAAA;IACvB,6BAAe,CAAA;IACf,iCAAmB,CAAA;IACnB,+BAAiB,CAAA;IACjB,6BAAe,CAAA;IACf,yFAAyF;IACzF,yCAA2B,CAAA;AAC7B,CAAC,EARW,UAAU,KAAV,UAAU,QAQrB"}
package/dist/vision.d.ts DELETED
@@ -1,34 +0,0 @@
1
- import type { VisionConfig } from './types.js';
2
- export interface VisionVerdict {
3
- /** The classifier's multiple-choice answer */
4
- answer: 'intentional' | 'regression';
5
- /** 0..1 certainty reported by the classifier (conservatively derived when absent) */
6
- confidence: number;
7
- raw: string;
8
- }
9
- /**
10
- * Classifies a visual change as intentional or a regression using an
11
- * OpenAI-compatible vision endpoint (HF Inference router by default, or a
12
- * self-hosted Space exposing the same schema).
13
- */
14
- export declare function classifyChange(options: {
15
- baselineImage: Buffer;
16
- currentImage: Buffer;
17
- context?: string;
18
- config: VisionConfig;
19
- apiToken: string;
20
- logger?: {
21
- info: (msg: string, data?: unknown) => void;
22
- warn: (msg: string, data?: unknown) => void;
23
- };
24
- }): Promise<VisionVerdict>;
25
- /** Robustly extracts {answer, confidence} from the model output. Fails safe to regression. */
26
- export declare function parseVerdict(content: string): VisionVerdict;
27
- /**
28
- * Resolves the API token: process env first, then a gitignored
29
- * `<projectDir>/.kintsugi/.env` file (KEY=VALUE lines).
30
- */
31
- export declare function resolveApiToken(tokenEnvVar: string, projectDir?: string): string | undefined;
32
- /** Loads KEY=VALUE pairs from <projectDir>/.kintsugi/.env into process.env (never overrides). */
33
- export declare function loadKintsugiEnv(projectDir: string): void;
34
- //# sourceMappingURL=vision.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../src/vision.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC;IACrC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAgBD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAC;CACvG,GAAG,OAAO,CAAC,aAAa,CAAC,CA0DzB;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CA+B3D;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI5F;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAexD"}
package/dist/vision.js DELETED
@@ -1,139 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- const SYSTEM_PROMPT = [
4
- 'You are a strict UI visual-regression classifier for an automated QA tool.',
5
- 'You will see two screenshots of the same user flow: IMAGE 1 is the accepted baseline, IMAGE 2 is the current state after a code change.',
6
- 'You will also get optional context about what the developer/agent was asked to do in the latest turn.',
7
- 'Decide whether the visual difference is:',
8
- '- "intentional": a deliberate design/feature change consistent with the context (or a benign change like dynamic content), or',
9
- '- "regression": something broke — a missing/shifted/broken component, layout collapse, unstyled content, blank regions, or an inconsistency with the context.',
10
- 'The baseline is the ACCEPTED, WORKING state. Missing UI elements (buttons, forms, prices, text) are regressions even if the remaining design looks clean and coherent.',
11
- 'If no context is provided, be conservative: significant changes should be classified as "regression" — only classify as "intentional" if the change is clearly benign.',
12
- 'If context IS provided and IMAGE 2 implements exactly what the context asked for, classify as "intentional" with high confidence — a requested change is not a regression.',
13
- 'Answer with ONLY a JSON object, no other text:',
14
- '{"answer": "intentional" | "regression", "confidence": <number between 0 and 1>}',
15
- ].join('\n');
16
- /**
17
- * Classifies a visual change as intentional or a regression using an
18
- * OpenAI-compatible vision endpoint (HF Inference router by default, or a
19
- * self-hosted Space exposing the same schema).
20
- */
21
- export async function classifyChange(options) {
22
- const { baselineImage, currentImage, context, config, apiToken, logger } = options;
23
- const userLines = [
24
- 'IMAGE 1 = accepted baseline. IMAGE 2 = current state after the latest code change.',
25
- context
26
- ? `Context from the latest turn (what the agent was asked to do):\n"${context}"`
27
- : 'No context available about the intended change.',
28
- 'Classify the difference between IMAGE 1 and IMAGE 2 as "intentional" or "regression".',
29
- 'Reply with ONLY the JSON object.',
30
- ];
31
- const body = {
32
- model: config.model,
33
- temperature: 0,
34
- max_tokens: 60,
35
- messages: [
36
- { role: 'system', content: SYSTEM_PROMPT },
37
- {
38
- role: 'user',
39
- content: [
40
- { type: 'text', text: userLines.join('\n\n') },
41
- { type: 'image_url', image_url: { url: toDataUrl(baselineImage) } },
42
- { type: 'image_url', image_url: { url: toDataUrl(currentImage) } },
43
- ],
44
- },
45
- ],
46
- };
47
- const url = `${config.endpoint.replace(/\/$/, '')}/chat/completions`;
48
- const controller = new AbortController();
49
- const timer = setTimeout(() => controller.abort(), config.timeoutMs);
50
- let response;
51
- try {
52
- response = await fetch(url, {
53
- method: 'POST',
54
- headers: {
55
- 'Content-Type': 'application/json',
56
- Authorization: `Bearer ${apiToken}`,
57
- },
58
- body: JSON.stringify(body),
59
- signal: controller.signal,
60
- });
61
- }
62
- finally {
63
- clearTimeout(timer);
64
- }
65
- if (!response.ok) {
66
- const detail = await response.text().catch(() => '');
67
- throw new Error(`vision endpoint ${response.status}: ${detail.slice(0, 300)}`);
68
- }
69
- const payload = JSON.parse(await response.text());
70
- const content = payload.choices?.[0]?.message?.content ?? '';
71
- logger?.info('vision classifier responded', { content: content.slice(0, 200) });
72
- return parseVerdict(content);
73
- }
74
- /** Robustly extracts {answer, confidence} from the model output. Fails safe to regression. */
75
- export function parseVerdict(content) {
76
- const text = content.trim();
77
- // Preferred: the JSON object we asked for
78
- const jsonMatch = text.match(/\{[\s\S]*?\}/);
79
- if (jsonMatch) {
80
- try {
81
- const parsed = JSON.parse(jsonMatch[0]);
82
- if (parsed.answer === 'intentional' || parsed.answer === 'regression') {
83
- const confidence = typeof parsed.confidence === 'number'
84
- ? Math.min(1, Math.max(0, parsed.confidence))
85
- : 0.5;
86
- return { answer: parsed.answer, confidence, raw: text };
87
- }
88
- }
89
- catch {
90
- // fall through to word matching
91
- }
92
- }
93
- // Fallback: the model answered with the bare word (we prompted for one word
94
- // in early iterations; small models sometimes ignore the JSON instruction).
95
- const lower = text.toLowerCase();
96
- if (/\bintentional\b/.test(lower) && !/\bregression\b/.test(lower)) {
97
- return { answer: 'intentional', confidence: 0.8, raw: text };
98
- }
99
- if (/\bregression\b/.test(lower) && !/\bintentional\b/.test(lower)) {
100
- return { answer: 'regression', confidence: 0.8, raw: text };
101
- }
102
- // Unparseable — fail safe: treat as an unresolved regression
103
- return { answer: 'regression', confidence: 0.5, raw: text };
104
- }
105
- function toDataUrl(png) {
106
- return `data:image/png;base64,${png.toString('base64')}`;
107
- }
108
- /**
109
- * Resolves the API token: process env first, then a gitignored
110
- * `<projectDir>/.kintsugi/.env` file (KEY=VALUE lines).
111
- */
112
- export function resolveApiToken(tokenEnvVar, projectDir) {
113
- if (process.env[tokenEnvVar])
114
- return process.env[tokenEnvVar];
115
- if (projectDir)
116
- loadKintsugiEnv(projectDir);
117
- return process.env[tokenEnvVar];
118
- }
119
- /** Loads KEY=VALUE pairs from <projectDir>/.kintsugi/.env into process.env (never overrides). */
120
- export function loadKintsugiEnv(projectDir) {
121
- const envPath = path.join(projectDir, '.kintsugi', '.env');
122
- let content;
123
- try {
124
- content = fs.readFileSync(envPath, 'utf-8');
125
- }
126
- catch {
127
- return;
128
- }
129
- for (const line of content.split('\n')) {
130
- const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/);
131
- if (!match)
132
- continue;
133
- const key = match[1];
134
- const value = match[2].replace(/^["']|["']$/g, '');
135
- if (!(key in process.env))
136
- process.env[key] = value;
137
- }
138
- }
139
- //# sourceMappingURL=vision.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vision.js","sourceRoot":"","sources":["../src/vision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,aAAa,GAAG;IACpB,4EAA4E;IAC5E,yIAAyI;IACzI,uGAAuG;IACvG,0CAA0C;IAC1C,+HAA+H;IAC/H,+JAA+J;IAC/J,wKAAwK;IACxK,wKAAwK;IACxK,4KAA4K;IAC5K,gDAAgD;IAChD,kFAAkF;CACnF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAOpC;IACC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEnF,MAAM,SAAS,GAAG;QAChB,oFAAoF;QACpF,OAAO;YACL,CAAC,CAAC,oEAAoE,OAAO,GAAG;YAChF,CAAC,CAAC,iDAAiD;QACrD,uFAAuF;QACvF,kCAAkC;KACnC,CAAC;IAEF,MAAM,IAAI,GAAG;QACX,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;YAC1C;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE;oBACnE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE;iBACnE;aACF;SACF;KACF,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,QAAQ,EAAE;aACpC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAE/C,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7D,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAChF,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE5B,0CAA0C;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAA6C,CAAC;YACpF,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACtE,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;oBACtD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC7C,CAAC,CAAC,GAAG,CAAC;gBACR,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,yBAAyB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,UAAmB;IACtE,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,UAAU;QAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtD,CAAC;AACH,CAAC"}
package/src/auth.ts DELETED
@@ -1,195 +0,0 @@
1
- /**
2
- * Hosted-API client lifecycle: anonymous key bootstrap, account status, and
3
- * checkout — shared by the hook, the CLI, and the VS Code extension.
4
- */
5
- import fs from 'node:fs';
6
- import path from 'node:path';
7
- import os from 'node:os';
8
- import { createHash } from 'node:crypto';
9
- import { resolveApiToken, globalKintsugiEnvPath } from './classifier.js';
10
- import type { ClassifierContext } from './comparator.js';
11
- import type { KintsugiConfig } from './types.js';
12
-
13
- type Logger = { info: (msg: string, data?: unknown) => void; warn: (msg: string, data?: unknown) => void };
14
-
15
- /** Stable per-machine fingerprint used to issue anonymous keys. */
16
- export function computeDeviceHash(): string {
17
- return createHash('sha256').update(`${os.hostname()}|${os.homedir()}`).digest('hex').slice(0, 32);
18
- }
19
-
20
- /** Writes (or replaces) one KEY=VALUE line in ~/.kintsugi/.env, preserving other lines. */
21
- export function writeGlobalEnvValue(key: string, value: string): string {
22
- const envPath = globalKintsugiEnvPath();
23
- fs.mkdirSync(path.dirname(envPath), { recursive: true });
24
- let content = '';
25
- try {
26
- content = fs.readFileSync(envPath, 'utf-8');
27
- } catch {
28
- // no file yet
29
- }
30
- const line = `${key}=${value}`;
31
- const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
32
- const re = new RegExp(`^${escapedKey}=.*$`, 'm');
33
- const updated = re.test(content)
34
- ? content.replace(re, line)
35
- : content === '' || content.endsWith('\n')
36
- ? content + line
37
- : content + '\n' + line;
38
- fs.writeFileSync(envPath, updated.endsWith('\n') ? updated : updated + '\n');
39
- return envPath;
40
- }
41
-
42
- /**
43
- * Returns the hosted-API key, bootstrapping an anonymous free key (written to
44
- * ~/.kintsugi/.env) when none exists. Returns undefined on network failure —
45
- * callers degrade to classifier-off, never crash.
46
- */
47
- export async function ensureApiKey(options: {
48
- endpoint: string;
49
- tokenEnvVar: string;
50
- projectDir?: string;
51
- fetchImpl?: typeof fetch;
52
- logger?: Logger;
53
- }): Promise<string | undefined> {
54
- const existing = resolveApiToken(options.tokenEnvVar, options.projectDir);
55
- if (existing) return existing;
56
-
57
- const fetchImpl = options.fetchImpl ?? fetch;
58
- try {
59
- const res = await fetchImpl(`${options.endpoint.replace(/\/$/, '')}/keys`, {
60
- method: 'POST',
61
- headers: { 'Content-Type': 'application/json' },
62
- body: JSON.stringify({ deviceHash: computeDeviceHash() }),
63
- });
64
- if (!res.ok) throw new Error(`key issuance ${res.status}`);
65
- const body = (await res.json()) as { key?: string };
66
- if (typeof body.key !== 'string' || !body.key.startsWith('knt_')) {
67
- throw new Error('key issuance returned no key');
68
- }
69
- writeGlobalEnvValue(options.tokenEnvVar, body.key);
70
- options.logger?.info('issued anonymous kintsugi api key', { envFile: globalKintsugiEnvPath() });
71
- return body.key;
72
- } catch (err) {
73
- options.logger?.warn(`could not obtain a kintsugi api key: ${(err as Error).message}`);
74
- return undefined;
75
- }
76
- }
77
-
78
- export interface ApiAccountStatus {
79
- plan: string;
80
- flowsUsed: number;
81
- flowLimit: number | null;
82
- upgradeUrl?: string;
83
- }
84
-
85
- export async function getAccountStatus(
86
- apiKey: string,
87
- endpoint: string,
88
- fetchImpl?: typeof fetch
89
- ): Promise<ApiAccountStatus | undefined> {
90
- try {
91
- const res = await (fetchImpl ?? fetch)(`${endpoint.replace(/\/$/, '')}/keys/me`, {
92
- headers: { Authorization: `Bearer ${apiKey}` },
93
- });
94
- if (!res.ok) return undefined;
95
- return (await res.json()) as ApiAccountStatus;
96
- } catch {
97
- return undefined;
98
- }
99
- }
100
-
101
- /** Stripe Payment Link URL for the $29/mo Pro upgrade, or undefined when billing is unavailable. */
102
- export async function createCheckoutUrl(
103
- apiKey: string,
104
- endpoint: string,
105
- fetchImpl?: typeof fetch
106
- ): Promise<string | undefined> {
107
- try {
108
- const res = await (fetchImpl ?? fetch)(`${endpoint.replace(/\/$/, '')}/billing/checkout`, {
109
- method: 'POST',
110
- headers: { Authorization: `Bearer ${apiKey}` },
111
- });
112
- if (!res.ok) return undefined;
113
- const body = (await res.json()) as { url?: string };
114
- return body.url;
115
- } catch {
116
- return undefined;
117
- }
118
- }
119
-
120
- /**
121
- * Polls account status until the plan becomes 'pro' (the Stripe webhook flips
122
- * it server-side shortly after payment) or the timeout elapses. Called from
123
- * the CLI and the VS Code extension after the payment link is opened.
124
- */
125
- export async function waitForPlanUpgrade(
126
- apiKey: string,
127
- endpoint: string,
128
- options: {
129
- intervalMs?: number;
130
- timeoutMs?: number;
131
- fetchImpl?: typeof fetch;
132
- shouldContinue?: () => boolean;
133
- onPoll?: (status: ApiAccountStatus | undefined) => void;
134
- } = {}
135
- ): Promise<ApiAccountStatus | undefined> {
136
- const interval = options.intervalMs ?? 3000;
137
- const deadline = Date.now() + (options.timeoutMs ?? 180_000);
138
- while (Date.now() < deadline && (options.shouldContinue?.() ?? true)) {
139
- const status = await getAccountStatus(apiKey, endpoint, options.fetchImpl);
140
- if (status?.plan === 'pro') return status;
141
- options.onPoll?.(status);
142
- await new Promise(resolve => setTimeout(resolve, interval));
143
- }
144
- return undefined;
145
- }
146
-
147
- /**
148
- * Shared classifier-context builder used by the hook, `kintsugi check`, and
149
- * the MCP server — one code path decides when classification is active.
150
- * With bootstrapKey, an anonymous hosted key is auto-issued on first use.
151
- */
152
- export async function buildClassifierContext(
153
- config: KintsugiConfig,
154
- options: {
155
- context?: string;
156
- logger?: Logger;
157
- bootstrapKey?: boolean;
158
- projectDir?: string;
159
- fetchImpl?: typeof fetch;
160
- } = {}
161
- ): Promise<ClassifierContext | undefined> {
162
- const log = options.logger;
163
- if (!config.classifier?.enabled) {
164
- log?.info('classifier disabled in config');
165
- return undefined;
166
- }
167
- let apiToken = resolveApiToken(config.classifier.tokenEnvVar, options.projectDir);
168
- if (!apiToken && options.bootstrapKey && config.classifier.provider === 'kintsugi') {
169
- apiToken = await ensureApiKey({
170
- endpoint: config.classifier.endpoint,
171
- tokenEnvVar: config.classifier.tokenEnvVar,
172
- projectDir: options.projectDir,
173
- fetchImpl: options.fetchImpl,
174
- logger: log,
175
- });
176
- }
177
- if (!apiToken) {
178
- log?.warn(
179
- `no API token found (env ${config.classifier.tokenEnvVar}, <project>/.kintsugi/.env, or ~/.kintsugi/.env) — classifier disabled, large diffs will escalate without classification`
180
- );
181
- return undefined;
182
- }
183
- log?.info('classifier active', {
184
- provider: config.classifier.provider,
185
- model: config.classifier.model,
186
- endpoint: config.classifier.endpoint,
187
- turnContext: options.context || '(none)',
188
- });
189
- return {
190
- config: config.classifier,
191
- apiToken,
192
- context: options.context,
193
- logger: log,
194
- };
195
- }
package/src/baseline.ts DELETED
@@ -1,125 +0,0 @@
1
- import { promises as fs } from 'fs';
2
- import path from 'path';
3
- import type { FlowMetadata, FlowRecording, CaptureResult } from './types.js';
4
-
5
- export function getFlowDir(projectDir: string, name: string): string {
6
- return path.join(projectDir, '.kintsugi', 'flows', name);
7
- }
8
-
9
- export async function listFlows(projectDir: string): Promise<FlowMetadata[]> {
10
- const flowsDir = path.join(projectDir, '.kintsugi', 'flows');
11
- try {
12
- const entries = await fs.readdir(flowsDir, { withFileTypes: true });
13
- const flows: FlowMetadata[] = [];
14
- for (const entry of entries) {
15
- if (entry.isDirectory()) {
16
- const metaPath = path.join(flowsDir, entry.name, 'metadata.json');
17
- try {
18
- const data = await fs.readFile(metaPath, 'utf-8');
19
- flows.push(JSON.parse(data) as FlowMetadata);
20
- } catch (e) {
21
- // Ignore invalid directories
22
- }
23
- }
24
- }
25
- return flows;
26
- } catch (e) {
27
- return [];
28
- }
29
- }
30
-
31
- export async function loadFlow(projectDir: string, name: string): Promise<FlowRecording> {
32
- const flowDir = getFlowDir(projectDir, name);
33
- const metaPath = path.join(flowDir, 'metadata.json');
34
- const stepsPath = path.join(flowDir, 'steps.json');
35
-
36
- const [metaData, stepsData] = await Promise.all([
37
- fs.readFile(metaPath, 'utf-8'),
38
- fs.readFile(stepsPath, 'utf-8'),
39
- ]);
40
-
41
- const metadata = JSON.parse(metaData) as FlowMetadata;
42
- const steps = JSON.parse(stepsData) as FlowRecording['steps'];
43
-
44
- const screenshotsDir = path.join(flowDir, 'screenshots');
45
- let screenshotPaths: string[] = [];
46
- try {
47
- const files = await fs.readdir(screenshotsDir);
48
- // Explicitly match step screenshots for each step in order
49
- const stepFiles: string[] = [];
50
- let allStepsFound = true;
51
- for (let i = 0; i < steps.length; i++) {
52
- const candidates = [`step_${i}.png`, `step-${String(i).padStart(3, '0')}.png`, `step-${i}.png`];
53
- const match = candidates.find(c => files.includes(c));
54
- if (match) {
55
- stepFiles.push(path.join(screenshotsDir, match));
56
- } else {
57
- allStepsFound = false;
58
- break;
59
- }
60
- }
61
-
62
- if (allStepsFound && stepFiles.length > 0) {
63
- screenshotPaths = stepFiles;
64
- } else {
65
- screenshotPaths = files
66
- .filter((f) => f.endsWith('.png'))
67
- .sort()
68
- .map((f) => path.join(screenshotsDir, f));
69
- }
70
- } catch (e) {
71
- // No screenshots directory
72
- }
73
-
74
- const videoPath = path.join(flowDir, 'video.webm');
75
- const videoExists = await fs.stat(videoPath).then(() => true).catch(() => false);
76
-
77
- // Baseline aria snapshots (semantic DOM state per step)
78
- const ariaDir = path.join(flowDir, 'aria');
79
- const ariaSnapshotPaths: (string | undefined)[] = [];
80
- for (let i = 0; i < steps.length; i++) {
81
- const ariaPath = path.join(ariaDir, `step_${i}.yml`);
82
- const exists = await fs.stat(ariaPath).then(() => true).catch(() => false);
83
- ariaSnapshotPaths.push(exists ? ariaPath : undefined);
84
- }
85
-
86
- return {
87
- metadata,
88
- steps,
89
- screenshotPaths,
90
- ariaSnapshotPaths: ariaSnapshotPaths.some(p => p !== undefined) ? ariaSnapshotPaths as string[] : undefined,
91
- videoPath: videoExists ? videoPath : undefined,
92
- };
93
- }
94
-
95
- export async function saveFlow(projectDir: string, recording: FlowRecording): Promise<void> {
96
- const flowDir = getFlowDir(projectDir, recording.metadata.name);
97
- await fs.mkdir(flowDir, { recursive: true });
98
- await fs.mkdir(path.join(flowDir, 'screenshots'), { recursive: true });
99
-
100
- await fs.writeFile(path.join(flowDir, 'metadata.json'), JSON.stringify(recording.metadata, null, 2));
101
- await fs.writeFile(path.join(flowDir, 'steps.json'), JSON.stringify(recording.steps, null, 2));
102
- }
103
-
104
- export async function deleteFlow(projectDir: string, name: string): Promise<void> {
105
- const flowDir = getFlowDir(projectDir, name);
106
- await fs.rm(flowDir, { recursive: true, force: true });
107
- }
108
-
109
- export async function updateBaseline(projectDir: string, name: string, capture: CaptureResult): Promise<void> {
110
- const flowDir = getFlowDir(projectDir, name);
111
- const screenshotsDir = path.join(flowDir, 'screenshots');
112
- const ariaDir = path.join(flowDir, 'aria');
113
-
114
- await fs.mkdir(screenshotsDir, { recursive: true });
115
- await fs.mkdir(ariaDir, { recursive: true });
116
-
117
- for (let i = 0; i < capture.screenshots.length; i++) {
118
- const screenshot = capture.screenshots[i];
119
- await fs.writeFile(path.join(screenshotsDir, `step_${i}.png`), screenshot);
120
- const aria = capture.ariaSnapshots?.[i];
121
- if (aria !== undefined) {
122
- await fs.writeFile(path.join(ariaDir, `step_${i}.yml`), aria, 'utf-8');
123
- }
124
- }
125
- }