@promptwheel/cli 0.7.4 → 0.7.5

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.
@@ -16,7 +16,7 @@
16
16
  import { Command } from 'commander';
17
17
  import { soloCommand } from '../commands/solo.js';
18
18
  import { checkForUpdateInBackground, printUpdateNotification, runSelfUpdate, } from '../lib/update-check.js';
19
- const CURRENT_VERSION = '0.7.4';
19
+ const CURRENT_VERSION = '0.7.5';
20
20
  const program = new Command();
21
21
  program
22
22
  .name('promptwheel')
@@ -85,14 +85,14 @@ export class SpinnerDisplayAdapter {
85
85
  // No-op for spinner mode
86
86
  }
87
87
  progressUpdate(snapshot) {
88
- if (process.stderr.isTTY) {
88
+ if (process.stdout.isTTY) {
89
89
  const line = formatProgressLine(snapshot);
90
90
  const now = Date.now();
91
91
  if (line === this.lastProgressLine || now - this.lastProgressTime < 2000)
92
92
  return;
93
93
  this.lastProgressLine = line;
94
94
  this.lastProgressTime = now;
95
- process.stderr.write(`\n ${chalk.gray('───')} ${line} ${chalk.gray('───')}\n`);
95
+ console.log(`\n ${chalk.gray('───')} ${line} ${chalk.gray('───')}`);
96
96
  }
97
97
  }
98
98
  destroy() {
@@ -1 +1 @@
1
- {"version":3,"file":"display-adapter-spinner.js","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display-adapter-spinner.js","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * MCP Integrations — invoke external MCP servers on cadence during spin.
3
+ *
4
+ * Reads `.promptwheel/integrations.yaml` for provider definitions,
5
+ * spawns each provider's MCP server via stdio transport, calls the
6
+ * configured tool, and converts results into proposals / learnings / nudges.
7
+ */
8
+ import type { TicketProposal } from '@promptwheel/core/scout';
9
+ export interface IntegrationProvider {
10
+ name: string;
11
+ /** MCP server launch command (e.g. "npx @securitychecks/mcp-server") */
12
+ command: string;
13
+ /** Tool name to call on the MCP server */
14
+ tool: string;
15
+ /** Arguments passed to the tool call */
16
+ args?: Record<string, unknown>;
17
+ /** Invoke every N spin cycles */
18
+ every: number;
19
+ /** When in the cycle to invoke */
20
+ phase: 'pre-scout' | 'post-cycle';
21
+ /** How to inject results */
22
+ feed: 'proposals' | 'learnings' | 'nudges';
23
+ /** Timeout in ms (default 60000) */
24
+ timeout?: number;
25
+ }
26
+ export interface IntegrationConfig {
27
+ providers: IntegrationProvider[];
28
+ }
29
+ export interface IntegrationResult {
30
+ provider: string;
31
+ feed: 'proposals' | 'learnings' | 'nudges';
32
+ data: unknown;
33
+ }
34
+ /**
35
+ * Load integrations config from `.promptwheel/integrations.yaml`.
36
+ * Returns `{ providers: [] }` if the file doesn't exist (opt-in feature).
37
+ */
38
+ export declare function loadIntegrations(repoRoot: string): IntegrationConfig;
39
+ /**
40
+ * Parse the integrations YAML file into typed config.
41
+ *
42
+ * Expects a `providers:` top-level key with a list of provider objects.
43
+ * Uses line-by-line parsing (no external YAML library dependency).
44
+ */
45
+ export declare function parseIntegrationsYaml(content: string): IntegrationConfig;
46
+ interface IntegrationState {
47
+ cycleCount: number;
48
+ repoRoot: string;
49
+ integrationLastRun: Record<string, number>;
50
+ options: {
51
+ verbose?: boolean;
52
+ };
53
+ displayAdapter: {
54
+ log(msg: string): void;
55
+ };
56
+ }
57
+ /**
58
+ * Run all integrations matching the given phase.
59
+ * Checks cadence (every N cycles) and invokes each due provider.
60
+ */
61
+ export declare function runIntegrations(state: IntegrationState, config: IntegrationConfig, phase: 'pre-scout' | 'post-cycle'): Promise<IntegrationResult[]>;
62
+ /**
63
+ * Invoke a single integration provider:
64
+ * spawn MCP server, connect, call tool, disconnect.
65
+ */
66
+ export declare function invokeProvider(provider: IntegrationProvider, repoRoot: string): Promise<unknown>;
67
+ /**
68
+ * Convert raw MCP tool output to TicketProposal[].
69
+ *
70
+ * Expects the MCP tool to return:
71
+ * ```json
72
+ * { "proposals": [{ "title", "description", "files", "category", "confidence", "impact" }] }
73
+ * ```
74
+ */
75
+ export declare function toProposals(result: IntegrationResult): TicketProposal[];
76
+ /**
77
+ * Convert raw MCP tool output to learnings and store them.
78
+ *
79
+ * Expects: `{ "learnings": [{ "text", "category"?, "tags"? }] }`
80
+ */
81
+ export declare function toLearnings(data: unknown, repoRoot: string): void;
82
+ /**
83
+ * Convert raw MCP tool output to nudges (hints) and store them.
84
+ *
85
+ * Expects: `{ "nudges": [{ "text" }] }` or `{ "nudges": ["text", ...] }`
86
+ */
87
+ export declare function toNudges(data: unknown, repoRoot: string): void;
88
+ export {};
89
+ //# sourceMappingURL=integrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/lib/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAS9D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,4BAA4B;IAC5B,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAUpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA2FxE;AAmDD,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,WAAW,GAAG,YAAY,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0C9B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAiElB;AAID;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAuBvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoBjE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAe9D"}
@@ -0,0 +1,380 @@
1
+ /**
2
+ * MCP Integrations — invoke external MCP servers on cadence during spin.
3
+ *
4
+ * Reads `.promptwheel/integrations.yaml` for provider definitions,
5
+ * spawns each provider's MCP server via stdio transport, calls the
6
+ * configured tool, and converts results into proposals / learnings / nudges.
7
+ */
8
+ import * as fs from 'node:fs';
9
+ import * as path from 'node:path';
10
+ import { createRequire } from 'node:module';
11
+ import { addLearning } from './learnings.js';
12
+ import { addHint } from './solo-hints.js';
13
+ const _require = createRequire(import.meta.url);
14
+ const CLI_VERSION = _require('../../package.json').version;
15
+ // ── Config loading ──────────────────────────────────────────────────────────
16
+ const VALID_PHASES = new Set(['pre-scout', 'post-cycle']);
17
+ const VALID_FEEDS = new Set(['proposals', 'learnings', 'nudges']);
18
+ /**
19
+ * Load integrations config from `.promptwheel/integrations.yaml`.
20
+ * Returns `{ providers: [] }` if the file doesn't exist (opt-in feature).
21
+ */
22
+ export function loadIntegrations(repoRoot) {
23
+ const yamlPath = path.join(repoRoot, '.promptwheel', 'integrations.yaml');
24
+ if (!fs.existsSync(yamlPath)) {
25
+ const ymlPath = path.join(repoRoot, '.promptwheel', 'integrations.yml');
26
+ if (!fs.existsSync(ymlPath)) {
27
+ return { providers: [] };
28
+ }
29
+ return parseIntegrationsYaml(fs.readFileSync(ymlPath, 'utf-8'));
30
+ }
31
+ return parseIntegrationsYaml(fs.readFileSync(yamlPath, 'utf-8'));
32
+ }
33
+ /**
34
+ * Parse the integrations YAML file into typed config.
35
+ *
36
+ * Expects a `providers:` top-level key with a list of provider objects.
37
+ * Uses line-by-line parsing (no external YAML library dependency).
38
+ */
39
+ export function parseIntegrationsYaml(content) {
40
+ const providers = [];
41
+ const lines = content.split('\n');
42
+ let inProviders = false;
43
+ let current = null;
44
+ let inArgs = false;
45
+ let args = {};
46
+ for (const line of lines) {
47
+ const trimmed = line.trim();
48
+ // Skip comments and empty lines
49
+ if (trimmed === '' || trimmed.startsWith('#'))
50
+ continue;
51
+ // Top-level key
52
+ if (/^providers\s*:/.test(trimmed)) {
53
+ inProviders = true;
54
+ continue;
55
+ }
56
+ if (!inProviders)
57
+ continue;
58
+ // New provider entry (starts with "- ")
59
+ if (/^\s*-\s+\w+/.test(line)) {
60
+ // Flush previous provider
61
+ if (current) {
62
+ if (Object.keys(args).length > 0)
63
+ current.args = args;
64
+ const validated = validateProvider(current);
65
+ if (validated)
66
+ providers.push(validated);
67
+ }
68
+ current = {};
69
+ args = {};
70
+ inArgs = false;
71
+ // Parse "- key: value" on the same line
72
+ const match = trimmed.match(/^-\s+(\w+)\s*:\s*(.*)/);
73
+ if (match) {
74
+ setProviderField(current, match[1], match[2].trim());
75
+ }
76
+ continue;
77
+ }
78
+ // Inside a provider object
79
+ if (current) {
80
+ // Check for args sub-object
81
+ if (/^\s+args\s*:/.test(line) && !trimmed.startsWith('-')) {
82
+ inArgs = true;
83
+ // Check for inline value like "args: {}"
84
+ const inlineMatch = trimmed.match(/^args\s*:\s*(.+)/);
85
+ if (inlineMatch && inlineMatch[1].trim() !== '') {
86
+ // Simple inline value — skip, args will stay empty
87
+ inArgs = false;
88
+ }
89
+ continue;
90
+ }
91
+ // Inside args sub-object
92
+ if (inArgs && /^\s{4,}\w/.test(line)) {
93
+ const argMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
94
+ if (argMatch) {
95
+ args[argMatch[1]] = parseYamlValue(argMatch[2].trim());
96
+ }
97
+ continue;
98
+ }
99
+ // Regular provider field
100
+ if (/^\s+\w/.test(line) && !trimmed.startsWith('-')) {
101
+ inArgs = false;
102
+ const fieldMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
103
+ if (fieldMatch) {
104
+ setProviderField(current, fieldMatch[1], fieldMatch[2].trim());
105
+ }
106
+ continue;
107
+ }
108
+ }
109
+ // If we hit a non-indented line that isn't a provider, stop
110
+ if (!line.startsWith(' ') && !line.startsWith('\t') && !trimmed.startsWith('-')) {
111
+ inProviders = false;
112
+ }
113
+ }
114
+ // Flush last provider
115
+ if (current) {
116
+ if (Object.keys(args).length > 0)
117
+ current.args = args;
118
+ const validated = validateProvider(current);
119
+ if (validated)
120
+ providers.push(validated);
121
+ }
122
+ return { providers };
123
+ }
124
+ function setProviderField(provider, key, value) {
125
+ switch (key) {
126
+ case 'name':
127
+ provider.name = unquote(value);
128
+ break;
129
+ case 'command':
130
+ provider.command = unquote(value);
131
+ break;
132
+ case 'tool':
133
+ provider.tool = unquote(value);
134
+ break;
135
+ case 'every':
136
+ provider.every = parseInt(value, 10);
137
+ break;
138
+ case 'phase':
139
+ provider.phase = unquote(value);
140
+ break;
141
+ case 'feed':
142
+ provider.feed = unquote(value);
143
+ break;
144
+ case 'timeout':
145
+ provider.timeout = parseInt(value, 10);
146
+ break;
147
+ }
148
+ }
149
+ function unquote(s) {
150
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
151
+ return s.slice(1, -1);
152
+ }
153
+ return s;
154
+ }
155
+ function parseYamlValue(s) {
156
+ const unquoted = unquote(s);
157
+ if (unquoted === 'true')
158
+ return true;
159
+ if (unquoted === 'false')
160
+ return false;
161
+ if (unquoted === 'null')
162
+ return null;
163
+ const num = Number(unquoted);
164
+ if (!Number.isNaN(num) && unquoted !== '')
165
+ return num;
166
+ return unquoted;
167
+ }
168
+ function validateProvider(p) {
169
+ if (!p.name || !p.command || !p.tool)
170
+ return null;
171
+ if (!p.every || p.every < 1)
172
+ return null;
173
+ if (p.phase && !VALID_PHASES.has(p.phase))
174
+ return null;
175
+ if (p.feed && !VALID_FEEDS.has(p.feed))
176
+ return null;
177
+ return {
178
+ name: p.name,
179
+ command: p.command,
180
+ tool: p.tool,
181
+ args: p.args,
182
+ every: p.every,
183
+ phase: p.phase ?? 'pre-scout',
184
+ feed: p.feed ?? 'proposals',
185
+ timeout: p.timeout ?? 60_000,
186
+ };
187
+ }
188
+ /**
189
+ * Run all integrations matching the given phase.
190
+ * Checks cadence (every N cycles) and invokes each due provider.
191
+ */
192
+ export async function runIntegrations(state, config, phase) {
193
+ if (config.providers.length === 0)
194
+ return [];
195
+ const due = config.providers.filter(p => {
196
+ if (p.phase !== phase)
197
+ return false;
198
+ const lastRun = state.integrationLastRun[p.name] ?? 0;
199
+ return (state.cycleCount - lastRun) >= p.every;
200
+ });
201
+ if (due.length === 0)
202
+ return [];
203
+ const results = [];
204
+ for (const provider of due) {
205
+ try {
206
+ if (state.options.verbose) {
207
+ state.displayAdapter.log(` Integration: invoking ${provider.name} (${provider.tool})`);
208
+ }
209
+ const data = await invokeProvider(provider, state.repoRoot);
210
+ state.integrationLastRun[provider.name] = state.cycleCount;
211
+ if (data !== null) {
212
+ results.push({ provider: provider.name, feed: provider.feed, data });
213
+ // Apply non-proposal feeds immediately
214
+ if (provider.feed === 'learnings') {
215
+ toLearnings(data, state.repoRoot);
216
+ }
217
+ else if (provider.feed === 'nudges') {
218
+ toNudges(data, state.repoRoot);
219
+ }
220
+ }
221
+ }
222
+ catch (err) {
223
+ const msg = err instanceof Error ? err.message : String(err);
224
+ if (state.options.verbose) {
225
+ state.displayAdapter.log(` Integration: ${provider.name} failed — ${msg}`);
226
+ }
227
+ // Don't crash the spin loop
228
+ }
229
+ }
230
+ return results;
231
+ }
232
+ /**
233
+ * Invoke a single integration provider:
234
+ * spawn MCP server, connect, call tool, disconnect.
235
+ */
236
+ export async function invokeProvider(provider, repoRoot) {
237
+ // Dynamic import to avoid hard dependency on @modelcontextprotocol/sdk
238
+ // (it's available in the monorepo but not a direct dependency of @promptwheel/cli)
239
+ const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
240
+ const { StdioClientTransport } = await import('@modelcontextprotocol/sdk/client/stdio.js');
241
+ const parts = provider.command.split(/\s+/);
242
+ const command = parts[0];
243
+ const args = parts.slice(1);
244
+ const transport = new StdioClientTransport({
245
+ command,
246
+ args,
247
+ env: { ...process.env },
248
+ });
249
+ const client = new Client({ name: 'promptwheel', version: CLI_VERSION }, { capabilities: {} });
250
+ const timeoutMs = provider.timeout ?? 60_000;
251
+ let timeoutId;
252
+ try {
253
+ // Connect with timeout
254
+ await Promise.race([
255
+ client.connect(transport),
256
+ new Promise((_, reject) => {
257
+ timeoutId = setTimeout(() => reject(new Error(`Connection timeout (${timeoutMs}ms)`)), timeoutMs);
258
+ }),
259
+ ]);
260
+ if (timeoutId)
261
+ clearTimeout(timeoutId);
262
+ // Call the tool
263
+ const toolArgs = { ...provider.args, repoRoot };
264
+ const result = await Promise.race([
265
+ client.callTool({ name: provider.tool, arguments: toolArgs }),
266
+ new Promise((_, reject) => {
267
+ timeoutId = setTimeout(() => reject(new Error(`Tool call timeout (${timeoutMs}ms)`)), timeoutMs);
268
+ }),
269
+ ]);
270
+ if (timeoutId)
271
+ clearTimeout(timeoutId);
272
+ // Extract data from result
273
+ if (result.structuredContent) {
274
+ return result.structuredContent;
275
+ }
276
+ const content = result.content;
277
+ if (content && content.length > 0) {
278
+ const textContent = content.find((c) => c.type === 'text');
279
+ if (textContent && 'text' in textContent && textContent.text) {
280
+ try {
281
+ return JSON.parse(textContent.text);
282
+ }
283
+ catch {
284
+ return textContent.text;
285
+ }
286
+ }
287
+ }
288
+ return null;
289
+ }
290
+ finally {
291
+ if (timeoutId)
292
+ clearTimeout(timeoutId);
293
+ try {
294
+ await client.close();
295
+ }
296
+ catch { /* best-effort cleanup */ }
297
+ }
298
+ }
299
+ // ── Result adapters ─────────────────────────────────────────────────────────
300
+ /**
301
+ * Convert raw MCP tool output to TicketProposal[].
302
+ *
303
+ * Expects the MCP tool to return:
304
+ * ```json
305
+ * { "proposals": [{ "title", "description", "files", "category", "confidence", "impact" }] }
306
+ * ```
307
+ */
308
+ export function toProposals(result) {
309
+ const data = result.data;
310
+ if (!data)
311
+ return [];
312
+ const raw = Array.isArray(data) ? data : data.proposals;
313
+ if (!Array.isArray(raw))
314
+ return [];
315
+ return raw
316
+ .filter((item) => item !== null && typeof item === 'object')
317
+ .map((item, i) => ({
318
+ id: `integration-${result.provider}-${Date.now()}-${i}`,
319
+ title: String(item.title ?? `${result.provider} finding ${i + 1}`),
320
+ description: String(item.description ?? ''),
321
+ category: item.category ?? 'fix',
322
+ confidence: typeof item.confidence === 'number' ? item.confidence : 50,
323
+ impact_score: typeof item.impact === 'number' ? item.impact : (typeof item.impact_score === 'number' ? item.impact_score : 5),
324
+ files: Array.isArray(item.files) ? item.files.map(String) : [],
325
+ allowed_paths: Array.isArray(item.files) ? item.files.map(String) : (Array.isArray(item.allowed_paths) ? item.allowed_paths.map(String) : []),
326
+ acceptance_criteria: Array.isArray(item.acceptance_criteria) ? item.acceptance_criteria.map(String) : [],
327
+ verification_commands: Array.isArray(item.verification_commands) ? item.verification_commands.map(String) : [],
328
+ rationale: String(item.rationale ?? item.description ?? ''),
329
+ estimated_complexity: item.estimated_complexity ?? 'moderate',
330
+ }));
331
+ }
332
+ /**
333
+ * Convert raw MCP tool output to learnings and store them.
334
+ *
335
+ * Expects: `{ "learnings": [{ "text", "category"?, "tags"? }] }`
336
+ */
337
+ export function toLearnings(data, repoRoot) {
338
+ if (!data || typeof data !== 'object')
339
+ return;
340
+ const obj = data;
341
+ const raw = Array.isArray(obj) ? obj : obj.learnings;
342
+ if (!Array.isArray(raw))
343
+ return;
344
+ for (const item of raw) {
345
+ if (!item || typeof item !== 'object')
346
+ continue;
347
+ const entry = item;
348
+ const text = String(entry.text ?? '').slice(0, 200);
349
+ if (!text)
350
+ continue;
351
+ addLearning(repoRoot, {
352
+ text,
353
+ category: entry.category ?? 'context',
354
+ source: { type: 'manual', detail: 'integration' },
355
+ tags: Array.isArray(entry.tags) ? entry.tags.map(String) : [],
356
+ });
357
+ }
358
+ }
359
+ /**
360
+ * Convert raw MCP tool output to nudges (hints) and store them.
361
+ *
362
+ * Expects: `{ "nudges": [{ "text" }] }` or `{ "nudges": ["text", ...] }`
363
+ */
364
+ export function toNudges(data, repoRoot) {
365
+ if (!data || typeof data !== 'object')
366
+ return;
367
+ const obj = data;
368
+ const raw = Array.isArray(obj) ? obj : obj.nudges;
369
+ if (!Array.isArray(raw))
370
+ return;
371
+ for (const item of raw) {
372
+ const text = typeof item === 'string'
373
+ ? item
374
+ : (item && typeof item === 'object' ? String(item.text ?? '') : '');
375
+ if (text) {
376
+ addHint(repoRoot, text.slice(0, 500));
377
+ }
378
+ }
379
+ }
380
+ //# sourceMappingURL=integrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/lib/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,WAAW,GAAW,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;AAgCnE,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,qBAAqB,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,qBAAqB,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,OAAO,GAAwC,IAAI,CAAC;IACxD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAA4B,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAExD,gBAAgB;QAChB,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,wCAAwC;QACxC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,SAAS;oBAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,EAAE,CAAC;YACV,MAAM,GAAG,KAAK,CAAC;YAEf,wCAAwC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACrD,IAAI,KAAK,EAAE,CAAC;gBACV,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,SAAS;QACX,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,EAAE,CAAC;YACZ,4BAA4B;YAC5B,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,GAAG,IAAI,CAAC;gBACd,yCAAyC;gBACzC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACtD,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBAChD,mDAAmD;oBACnD,MAAM,GAAG,KAAK,CAAC;gBACjB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,IAAI,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC1D,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,GAAG,KAAK,CAAC;gBACf,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC5D,IAAI,UAAU,EAAE,CAAC;oBACf,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChF,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAsC,EAAE,GAAW,EAAE,KAAa;IAC1F,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM;YAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,MAAM;QACnD,KAAK,SAAS;YAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,MAAM;QACzD,KAAK,MAAM;YAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,MAAM;QACnD,KAAK,OAAO;YAAE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,MAAM;QAC1D,KAAK,OAAO;YAAE,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAiC,CAAC;YAAC,MAAM;QACrF,KAAK,MAAM;YAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAgC,CAAC;YAAC,MAAM;QAClF,KAAK,SAAS;YAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,MAAM;IAChE,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IACtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,CAA+B;IACvD,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,WAAW;QAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW;QAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,MAAM;KAC7B,CAAC;AACJ,CAAC;AAYD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAuB,EACvB,MAAyB,EACzB,KAAiC;IAEjC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACtC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;YAC1F,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5D,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;YAE3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAErE,uCAAuC;gBACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAClC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,IAAI,aAAa,GAAG,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA6B,EAC7B,QAAgB;IAEhB,uEAAuE;IACvE,mFAAmF;IACnF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAC7E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAE3F,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;QACzC,OAAO;QACP,IAAI;QACJ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAA6B,EAAE;KAClD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,EAC7C,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC;IAC7C,IAAI,SAAoD,CAAC;IAEzD,IAAI,CAAC;QACH,uBAAuB;QACvB,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YACzB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,SAAS,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACpG,CAAC,CAAC;SACH,CAAC,CAAC;QACH,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvC,gBAAgB;QAChB,MAAM,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,SAAS,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACnG,CAAC,CAAC;SACH,CAAC,CAAC;QACH,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,iBAAiB,CAAC;QAClC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAA6D,CAAC;QACrF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAC7E,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC7D,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,WAAW,CAAC,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAsC,CAAC;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,SAAuB,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,IAAI,EAAmC,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;SAC5F,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjB,EAAE,EAAE,eAAe,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;QACvD,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,QAAQ,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3C,QAAQ,EAAG,IAAI,CAAC,QAAuC,IAAI,KAAK;QAChE,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;QACtE,YAAY,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7H,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC9D,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7I,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACxG,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC9G,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3D,oBAAoB,EAAG,IAAI,CAAC,oBAA+D,IAAI,UAAU;KAC1G,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,QAAgB;IACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAE9C,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,SAAuB,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IAEhC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,KAAK,GAAG,IAA+B,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,WAAW,CAAC,QAAQ,EAAE;YACpB,IAAI;YACJ,QAAQ,EAAG,KAAK,CAAC,QAAyD,IAAI,SAAS;YACvF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;YACjD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAa,EAAE,QAAgB;IACtD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAE9C,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,MAAoB,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IAEhC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ;YACnC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -75,6 +75,13 @@ export interface RunState {
75
75
  };
76
76
  /** Per-category success/failure stats for confidence calibration */
77
77
  categoryStats?: Record<string, CategorySuccessStats>;
78
+ /** Per-integration provider tracking */
79
+ integrationStats?: Record<string, {
80
+ lastRunCycle: number;
81
+ totalRuns: number;
82
+ totalResults: number;
83
+ lastError?: string;
84
+ }>;
78
85
  /** Learning ROI snapshots (ring buffer, max 20) */
79
86
  learningSnapshots?: LearningSnapshot[];
80
87
  }
@@ -174,4 +181,8 @@ export declare function snapshotLearningROI(repoRoot: string, getLearningEffecti
174
181
  * Get confidence adjustment for a category. Returns 0 if no data.
175
182
  */
176
183
  export declare function getCategoryConfidenceAdjustment(repoRoot: string, category: string): number;
184
+ /**
185
+ * Record an integration provider invocation.
186
+ */
187
+ export declare function recordIntegrationRun(repoRoot: string, providerName: string, resultCount: number, error?: string): Promise<void>;
177
188
  //# sourceMappingURL=run-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,7 @@ export function readRunState(repoRoot) {
53
53
  recentDiffs: Array.isArray(parsed.recentDiffs) ? parsed.recentDiffs : [],
54
54
  qualitySignals: parsed.qualitySignals ?? undefined,
55
55
  categoryStats: parsed.categoryStats ?? undefined,
56
+ integrationStats: parsed.integrationStats ?? undefined,
56
57
  learningSnapshots: Array.isArray(parsed.learningSnapshots) ? parsed.learningSnapshots : undefined,
57
58
  formulaStats: (() => {
58
59
  const statsRaw = parsed.formulaStats ?? {};
@@ -383,4 +384,24 @@ export function getCategoryConfidenceAdjustment(repoRoot, category) {
383
384
  const state = readRunState(repoRoot);
384
385
  return state.categoryStats?.[category]?.confidenceAdjustment ?? 0;
385
386
  }
387
+ /**
388
+ * Record an integration provider invocation.
389
+ */
390
+ export function recordIntegrationRun(repoRoot, providerName, resultCount, error) {
391
+ return withRunStateLock(() => {
392
+ const state = readRunState(repoRoot);
393
+ const stats = state.integrationStats ??= {};
394
+ const entry = stats[providerName] ??= { lastRunCycle: 0, totalRuns: 0, totalResults: 0 };
395
+ entry.lastRunCycle = state.totalCycles;
396
+ entry.totalRuns++;
397
+ entry.totalResults += resultCount;
398
+ if (error) {
399
+ entry.lastError = error.slice(0, 200);
400
+ }
401
+ else {
402
+ delete entry.lastError;
403
+ }
404
+ writeRunState(repoRoot, state);
405
+ });
406
+ }
386
407
  //# sourceMappingURL=run-state.js.map