@code-insights/cli 3.6.0 → 4.0.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.
- package/CHANGELOG.md +53 -0
- package/README.md +40 -4
- package/dashboard-dist/assets/index-D1JDyyu5.js +660 -0
- package/dashboard-dist/assets/index-kwbCW1n2.css +1 -0
- package/dashboard-dist/index.html +2 -2
- package/dist/commands/reflect.d.ts +3 -0
- package/dist/commands/reflect.d.ts.map +1 -0
- package/dist/commands/reflect.js +457 -0
- package/dist/commands/reflect.js.map +1 -0
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +3 -1
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/stats/actions/patterns.d.ts +3 -0
- package/dist/commands/stats/actions/patterns.d.ts.map +1 -0
- package/dist/commands/stats/actions/patterns.js +140 -0
- package/dist/commands/stats/actions/patterns.js.map +1 -0
- package/dist/commands/stats/data/aggregation-helpers.d.ts +23 -0
- package/dist/commands/stats/data/aggregation-helpers.d.ts.map +1 -0
- package/dist/commands/stats/data/aggregation-helpers.js +128 -0
- package/dist/commands/stats/data/aggregation-helpers.js.map +1 -0
- package/dist/commands/stats/data/aggregation.d.ts +3 -35
- package/dist/commands/stats/data/aggregation.d.ts.map +1 -1
- package/dist/commands/stats/data/aggregation.js +8 -290
- package/dist/commands/stats/data/aggregation.js.map +1 -1
- package/dist/commands/stats/data/time-series.d.ts +24 -0
- package/dist/commands/stats/data/time-series.d.ts.map +1 -0
- package/dist/commands/stats/data/time-series.js +162 -0
- package/dist/commands/stats/data/time-series.js.map +1 -0
- package/dist/commands/stats/index.d.ts.map +1 -1
- package/dist/commands/stats/index.js +7 -1
- package/dist/commands/stats/index.js.map +1 -1
- package/dist/commands/sync.d.ts +19 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +67 -1
- package/dist/commands/sync.js.map +1 -1
- package/dist/constants/llm-providers.js +1 -1
- package/dist/constants/llm-providers.js.map +1 -1
- package/dist/db/client.d.ts +7 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +11 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +10 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +96 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/read.d.ts +5 -0
- package/dist/db/read.d.ts.map +1 -1
- package/dist/db/read.js +20 -3
- package/dist/db/read.js.map +1 -1
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/db/write.d.ts.map +1 -1
- package/dist/db/write.js +8 -2
- package/dist/db/write.js.map +1 -1
- package/dist/index.js +39 -3
- package/dist/index.js.map +1 -1
- package/dist/parser/jsonl.d.ts +19 -1
- package/dist/parser/jsonl.d.ts.map +1 -1
- package/dist/parser/jsonl.js +109 -3
- package/dist/parser/jsonl.js.map +1 -1
- package/dist/providers/codex.js +4 -1
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/copilot-cli.js +3 -0
- package/dist/providers/copilot-cli.js.map +1 -1
- package/dist/providers/copilot.js +3 -0
- package/dist/providers/copilot.js.map +1 -1
- package/dist/providers/cursor.js +3 -0
- package/dist/providers/cursor.js.map +1 -1
- package/dist/types.d.ts +109 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/date-utils.d.ts +6 -0
- package/dist/utils/date-utils.d.ts.map +1 -0
- package/dist/utils/date-utils.js +26 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/telemetry.d.ts +1 -1
- package/dist/utils/telemetry.d.ts.map +1 -1
- package/dist/utils/telemetry.js.map +1 -1
- package/package.json +2 -1
- package/server-dist/export/agent-rules.d.ts.map +1 -1
- package/server-dist/export/agent-rules.js +15 -4
- package/server-dist/export/agent-rules.js.map +1 -1
- package/server-dist/export/knowledge-base.d.ts.map +1 -1
- package/server-dist/export/knowledge-base.js +30 -4
- package/server-dist/export/knowledge-base.js.map +1 -1
- package/server-dist/index.d.ts.map +1 -1
- package/server-dist/index.js +4 -0
- package/server-dist/index.js.map +1 -1
- package/server-dist/llm/analysis-db.d.ts +51 -0
- package/server-dist/llm/analysis-db.d.ts.map +1 -0
- package/server-dist/llm/analysis-db.js +208 -0
- package/server-dist/llm/analysis-db.js.map +1 -0
- package/server-dist/llm/analysis-internal.d.ts +36 -0
- package/server-dist/llm/analysis-internal.d.ts.map +1 -0
- package/server-dist/llm/analysis-internal.js +23 -0
- package/server-dist/llm/analysis-internal.js.map +1 -0
- package/server-dist/llm/analysis-pricing.d.ts +25 -0
- package/server-dist/llm/analysis-pricing.d.ts.map +1 -0
- package/server-dist/llm/analysis-pricing.js +74 -0
- package/server-dist/llm/analysis-pricing.js.map +1 -0
- package/server-dist/llm/analysis-usage-db.d.ts +45 -0
- package/server-dist/llm/analysis-usage-db.d.ts.map +1 -0
- package/server-dist/llm/analysis-usage-db.js +35 -0
- package/server-dist/llm/analysis-usage-db.js.map +1 -0
- package/server-dist/llm/analysis.d.ts +9 -79
- package/server-dist/llm/analysis.d.ts.map +1 -1
- package/server-dist/llm/analysis.js +119 -375
- package/server-dist/llm/analysis.js.map +1 -1
- package/server-dist/llm/facet-extraction.d.ts +14 -0
- package/server-dist/llm/facet-extraction.d.ts.map +1 -0
- package/server-dist/llm/facet-extraction.js +91 -0
- package/server-dist/llm/facet-extraction.js.map +1 -0
- package/server-dist/llm/friction-normalize.d.ts +16 -0
- package/server-dist/llm/friction-normalize.d.ts.map +1 -0
- package/server-dist/llm/friction-normalize.js +54 -0
- package/server-dist/llm/friction-normalize.js.map +1 -0
- package/server-dist/llm/index.d.ts +3 -2
- package/server-dist/llm/index.d.ts.map +1 -1
- package/server-dist/llm/index.js +1 -1
- package/server-dist/llm/index.js.map +1 -1
- package/server-dist/llm/message-format.d.ts +32 -0
- package/server-dist/llm/message-format.d.ts.map +1 -0
- package/server-dist/llm/message-format.js +129 -0
- package/server-dist/llm/message-format.js.map +1 -0
- package/server-dist/llm/normalize-utils.d.ts +22 -0
- package/server-dist/llm/normalize-utils.d.ts.map +1 -0
- package/server-dist/llm/normalize-utils.js +71 -0
- package/server-dist/llm/normalize-utils.js.map +1 -0
- package/server-dist/llm/pattern-normalize.d.ts +19 -0
- package/server-dist/llm/pattern-normalize.d.ts.map +1 -0
- package/server-dist/llm/pattern-normalize.js +90 -0
- package/server-dist/llm/pattern-normalize.js.map +1 -0
- package/server-dist/llm/prompt-constants.d.ts +9 -0
- package/server-dist/llm/prompt-constants.d.ts.map +1 -0
- package/server-dist/llm/prompt-constants.js +169 -0
- package/server-dist/llm/prompt-constants.js.map +1 -0
- package/server-dist/llm/prompt-quality-analysis.d.ts +8 -0
- package/server-dist/llm/prompt-quality-analysis.d.ts.map +1 -0
- package/server-dist/llm/prompt-quality-analysis.js +133 -0
- package/server-dist/llm/prompt-quality-analysis.js.map +1 -0
- package/server-dist/llm/prompt-quality-normalize.d.ts +26 -0
- package/server-dist/llm/prompt-quality-normalize.d.ts.map +1 -0
- package/server-dist/llm/prompt-quality-normalize.js +116 -0
- package/server-dist/llm/prompt-quality-normalize.js.map +1 -0
- package/server-dist/llm/prompt-types.d.ts +124 -0
- package/server-dist/llm/prompt-types.d.ts.map +1 -0
- package/server-dist/llm/prompt-types.js +4 -0
- package/server-dist/llm/prompt-types.js.map +1 -0
- package/server-dist/llm/prompts.d.ts +57 -100
- package/server-dist/llm/prompts.d.ts.map +1 -1
- package/server-dist/llm/prompts.js +606 -232
- package/server-dist/llm/prompts.js.map +1 -1
- package/server-dist/llm/providers/anthropic.d.ts.map +1 -1
- package/server-dist/llm/providers/anthropic.js +12 -0
- package/server-dist/llm/providers/anthropic.js.map +1 -1
- package/server-dist/llm/providers/gemini.d.ts.map +1 -1
- package/server-dist/llm/providers/gemini.js +10 -2
- package/server-dist/llm/providers/gemini.js.map +1 -1
- package/server-dist/llm/providers/ollama.d.ts.map +1 -1
- package/server-dist/llm/providers/ollama.js +3 -1
- package/server-dist/llm/providers/ollama.js.map +1 -1
- package/server-dist/llm/providers/openai.d.ts.map +1 -1
- package/server-dist/llm/providers/openai.js +4 -1
- package/server-dist/llm/providers/openai.js.map +1 -1
- package/server-dist/llm/recurring-insights.d.ts +26 -0
- package/server-dist/llm/recurring-insights.d.ts.map +1 -0
- package/server-dist/llm/recurring-insights.js +119 -0
- package/server-dist/llm/recurring-insights.js.map +1 -0
- package/server-dist/llm/reflect-prompts.d.ts +55 -0
- package/server-dist/llm/reflect-prompts.d.ts.map +1 -0
- package/server-dist/llm/reflect-prompts.js +151 -0
- package/server-dist/llm/reflect-prompts.js.map +1 -0
- package/server-dist/llm/response-parsers.d.ts +8 -0
- package/server-dist/llm/response-parsers.d.ts.map +1 -0
- package/server-dist/llm/response-parsers.js +151 -0
- package/server-dist/llm/response-parsers.js.map +1 -0
- package/server-dist/llm/types.d.ts +23 -1
- package/server-dist/llm/types.d.ts.map +1 -1
- package/server-dist/llm/types.js +10 -1
- package/server-dist/llm/types.js.map +1 -1
- package/server-dist/routes/analysis.d.ts.map +1 -1
- package/server-dist/routes/analysis.js +107 -282
- package/server-dist/routes/analysis.js.map +1 -1
- package/server-dist/routes/analytics.d.ts.map +1 -1
- package/server-dist/routes/analytics.js +3 -1
- package/server-dist/routes/analytics.js.map +1 -1
- package/server-dist/routes/export.d.ts.map +1 -1
- package/server-dist/routes/export.js +19 -27
- package/server-dist/routes/export.js.map +1 -1
- package/server-dist/routes/facets.d.ts +4 -0
- package/server-dist/routes/facets.d.ts.map +1 -0
- package/server-dist/routes/facets.js +208 -0
- package/server-dist/routes/facets.js.map +1 -0
- package/server-dist/routes/insights.d.ts.map +1 -1
- package/server-dist/routes/insights.js +12 -11
- package/server-dist/routes/insights.js.map +1 -1
- package/server-dist/routes/reflect.d.ts +4 -0
- package/server-dist/routes/reflect.d.ts.map +1 -0
- package/server-dist/routes/reflect.js +332 -0
- package/server-dist/routes/reflect.js.map +1 -0
- package/server-dist/routes/route-helpers.d.ts +124 -0
- package/server-dist/routes/route-helpers.d.ts.map +1 -0
- package/server-dist/routes/route-helpers.js +242 -0
- package/server-dist/routes/route-helpers.js.map +1 -0
- package/server-dist/routes/sessions.d.ts.map +1 -1
- package/server-dist/routes/sessions.js +29 -5
- package/server-dist/routes/sessions.js.map +1 -1
- package/server-dist/routes/shared-aggregation.d.ts +82 -0
- package/server-dist/routes/shared-aggregation.d.ts.map +1 -0
- package/server-dist/routes/shared-aggregation.js +384 -0
- package/server-dist/routes/shared-aggregation.js.map +1 -0
- package/dashboard-dist/assets/index-C1mDRV7y.js +0 -607
- package/dashboard-dist/assets/index-_SWpRg6C.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAkE9E"}
|
|
@@ -15,12 +15,18 @@ export function createAnthropicClient(apiKey, model) {
|
|
|
15
15
|
'Content-Type': 'application/json',
|
|
16
16
|
'x-api-key': apiKey,
|
|
17
17
|
'anthropic-version': '2023-06-01',
|
|
18
|
+
// Enable prompt caching (ephemeral cache, 5-minute TTL).
|
|
19
|
+
// This header is required for cache_control blocks to take effect.
|
|
20
|
+
'anthropic-beta': 'prompt-caching-2024-07-31',
|
|
18
21
|
},
|
|
19
22
|
signal: options?.signal,
|
|
20
23
|
body: JSON.stringify({
|
|
21
24
|
model,
|
|
22
25
|
max_tokens: 8192,
|
|
26
|
+
// System message: pass ContentBlock[] through natively, or string as-is.
|
|
23
27
|
system: systemMessage?.content,
|
|
28
|
+
// Chat messages: pass ContentBlock[] content arrays natively (Anthropic supports this).
|
|
29
|
+
// String content passes through unchanged for backward compatibility.
|
|
24
30
|
messages: chatMessages.map(m => ({ role: m.role, content: m.content })),
|
|
25
31
|
}),
|
|
26
32
|
});
|
|
@@ -34,6 +40,12 @@ export function createAnthropicClient(apiKey, model) {
|
|
|
34
40
|
usage: data.usage ? {
|
|
35
41
|
inputTokens: data.usage.input_tokens,
|
|
36
42
|
outputTokens: data.usage.output_tokens,
|
|
43
|
+
...(data.usage.cache_creation_input_tokens !== undefined && {
|
|
44
|
+
cacheCreationTokens: data.usage.cache_creation_input_tokens,
|
|
45
|
+
}),
|
|
46
|
+
...(data.usage.cache_read_input_tokens !== undefined && {
|
|
47
|
+
cacheReadTokens: data.usage.cache_read_input_tokens,
|
|
48
|
+
}),
|
|
37
49
|
} : undefined,
|
|
38
50
|
};
|
|
39
51
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2FAA2F;AAC3F,sEAAsE;AAItE,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,KAAa;IACjE,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAqB;YACtD,oCAAoC;YACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,MAAM;oBACnB,mBAAmB,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2FAA2F;AAC3F,sEAAsE;AAItE,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,KAAa;IACjE,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAqB;YACtD,oCAAoC;YACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,MAAM;oBACnB,mBAAmB,EAAE,YAAY;oBACjC,yDAAyD;oBACzD,mEAAmE;oBACnE,gBAAgB,EAAE,2BAA2B;iBAC9C;gBACD,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,UAAU,EAAE,IAAI;oBAChB,yEAAyE;oBACzE,MAAM,EAAE,aAAa,EAAE,OAAO;oBAC9B,wFAAwF;oBACxF,sEAAsE;oBACtE,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBACxE,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;gBAC1F,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAQ/B,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;oBACpC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;oBACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,KAAK,SAAS,IAAI;wBAC1D,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,2BAA2B;qBAC5D,CAAC;oBACF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,SAAS,IAAI;wBACtD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,uBAAuB;qBACpD,CAAC;iBACH,CAAC,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,IAAY;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAGnF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAsE3E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Gemini provider implementation (server-side, no browser dependencies)
|
|
2
|
+
import { flattenContent } from '../types.js';
|
|
2
3
|
export function createGeminiClient(apiKey, model) {
|
|
3
4
|
return {
|
|
4
5
|
provider: 'gemini',
|
|
@@ -8,18 +9,25 @@ export function createGeminiClient(apiKey, model) {
|
|
|
8
9
|
const chatMessages = messages.filter(m => m.role !== 'system');
|
|
9
10
|
const contents = chatMessages.map(m => ({
|
|
10
11
|
role: m.role === 'assistant' ? 'model' : 'user',
|
|
11
|
-
|
|
12
|
+
// flattenContent converts ContentBlock[] to string; strings pass through unchanged.
|
|
13
|
+
parts: [{ text: flattenContent(m.content) }],
|
|
12
14
|
}));
|
|
13
15
|
const body = {
|
|
14
16
|
contents,
|
|
15
17
|
generationConfig: {
|
|
16
18
|
temperature: 0.7,
|
|
17
19
|
maxOutputTokens: 8192,
|
|
20
|
+
// Force valid JSON output at the decoding level.
|
|
21
|
+
// Without this, Gemini Flash often wraps JSON in markdown fences,
|
|
22
|
+
// prefixes prose, or produces structurally broken JSON that even
|
|
23
|
+
// jsonrepair cannot fix.
|
|
24
|
+
responseMimeType: 'application/json',
|
|
18
25
|
},
|
|
19
26
|
};
|
|
20
27
|
if (systemMessage) {
|
|
21
28
|
body.systemInstruction = {
|
|
22
|
-
|
|
29
|
+
// flattenContent handles string | ContentBlock[] system messages.
|
|
30
|
+
parts: [{ text: flattenContent(systemMessage.content) }],
|
|
23
31
|
};
|
|
24
32
|
}
|
|
25
33
|
// Gemini REST API requires the API key as a query parameter (not a header).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAAA,wEAAwE;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAAa;IAC9D,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAqB;YACtD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAC/C,oFAAoF;gBACpF,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAC,CAAC;YAEJ,MAAM,IAAI,GAA4B;gBACpC,QAAQ;gBACR,gBAAgB,EAAE;oBAChB,WAAW,EAAE,GAAG;oBAChB,eAAe,EAAE,IAAI;oBACrB,iDAAiD;oBACjD,kEAAkE;oBAClE,iEAAiE;oBACjE,yBAAyB;oBACzB,gBAAgB,EAAE,kBAAkB;iBACrC;aACF,CAAC;YAEF,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,iBAAiB,GAAG;oBACvB,kEAAkE;oBAClE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;iBACzD,CAAC;YACJ,CAAC;YAED,4EAA4E;YAC5E,sFAAsF;YACtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,2DAA2D,KAAK,wBAAwB,MAAM,EAAE,EAChG;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;gBAC1F,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAG/B,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;gBAC9D,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;oBAC1B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB;oBAChD,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,oBAAoB;iBACtD,CAAC,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,IAAY;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAKnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CA6C7E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBpE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Ollama provider implementation (local models, no API key required)
|
|
2
|
+
import { flattenContent } from '../types.js';
|
|
2
3
|
const DEFAULT_OLLAMA_URL = 'http://localhost:11434';
|
|
3
4
|
export function createOllamaClient(model, baseUrl) {
|
|
4
5
|
const url = baseUrl || DEFAULT_OLLAMA_URL;
|
|
@@ -12,7 +13,8 @@ export function createOllamaClient(model, baseUrl) {
|
|
|
12
13
|
signal: options?.signal,
|
|
13
14
|
body: JSON.stringify({
|
|
14
15
|
model,
|
|
15
|
-
|
|
16
|
+
// flattenContent converts ContentBlock[] to string; strings pass through unchanged.
|
|
17
|
+
messages: messages.map(m => ({ role: m.role, content: flattenContent(m.content) })),
|
|
16
18
|
stream: false,
|
|
17
19
|
options: { temperature: 0.7 },
|
|
18
20
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAAA,qEAAqE;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAgB;IAChE,MAAM,GAAG,GAAG,OAAO,IAAI,kBAAkB,CAAC;IAE1C,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAqB;YACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,WAAW,EAAE;gBAC9C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,oFAAoF;oBACpF,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnF,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE;iBAC9B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBACpC,KAAK,EAAE;oBACL,WAAW,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC;oBACxC,YAAY,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;iBACnC;aACF,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,IAAY;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,IAAI,kBAAkB,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,WAAW,EAAE;YAC9C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6E,CAAC;QAC9G,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,WAAW;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAGnF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CA+C3E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// OpenAI provider implementation (server-side, no browser dependencies)
|
|
2
|
+
import { flattenContent } from '../types.js';
|
|
2
3
|
export function createOpenAIClient(apiKey, model) {
|
|
3
4
|
return {
|
|
4
5
|
provider: 'openai',
|
|
@@ -13,7 +14,9 @@ export function createOpenAIClient(apiKey, model) {
|
|
|
13
14
|
signal: options?.signal,
|
|
14
15
|
body: JSON.stringify({
|
|
15
16
|
model,
|
|
16
|
-
|
|
17
|
+
// flattenContent converts ContentBlock[] to string; strings pass through unchanged.
|
|
18
|
+
// OpenAI gets automatic prefix caching for free when prefixes match — no extra config needed.
|
|
19
|
+
messages: messages.map(m => ({ role: m.role, content: flattenContent(m.content) })),
|
|
17
20
|
temperature: 0.7,
|
|
18
21
|
max_tokens: 8192,
|
|
19
22
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAAA,wEAAwE;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAAa;IAC9D,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAqB;YACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,MAAM,EAAE;iBACpC;gBACD,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,oFAAoF;oBACpF,8FAA8F;oBAC9F,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnF,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,IAAI;iBACjB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;gBAC1F,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAG/B,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBAChD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;oBACrC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;iBAC3C,CAAC,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,IAAY;YACzB,sDAAsD;YACtD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface RecurringInsightGroup {
|
|
2
|
+
insightIds: string[];
|
|
3
|
+
theme: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RecurringInsightResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
groups: RecurringInsightGroup[];
|
|
8
|
+
updatedCount: number;
|
|
9
|
+
error?: string;
|
|
10
|
+
usage?: {
|
|
11
|
+
inputTokens: number;
|
|
12
|
+
outputTokens: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find recurring patterns across multiple insights and write bidirectional links to SQLite.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findRecurringInsights(insights: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
title: string;
|
|
22
|
+
summary: string;
|
|
23
|
+
project_name: string;
|
|
24
|
+
session_id: string;
|
|
25
|
+
}>): Promise<RecurringInsightResult>;
|
|
26
|
+
//# sourceMappingURL=recurring-insights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurring-insights.d.ts","sourceRoot":"","sources":["../../src/llm/recurring-insights.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,KAAK,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,GACD,OAAO,CAAC,sBAAsB,CAAC,CA4HjC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Recurring insight detection — finds semantically similar insights across sessions
|
|
2
|
+
// and writes bidirectional links to SQLite.
|
|
3
|
+
// Extracted from analysis.ts to keep each analysis responsibility in its own module.
|
|
4
|
+
import { getDb } from '@code-insights/cli/db/client';
|
|
5
|
+
import { createLLMClient, isLLMConfigured } from './client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Find recurring patterns across multiple insights and write bidirectional links to SQLite.
|
|
8
|
+
*/
|
|
9
|
+
export async function findRecurringInsights(insights) {
|
|
10
|
+
if (!isLLMConfigured()) {
|
|
11
|
+
return { success: false, groups: [], updatedCount: 0, error: 'LLM not configured.' };
|
|
12
|
+
}
|
|
13
|
+
const candidates = insights
|
|
14
|
+
.filter(i => i.type !== 'summary' && i.type !== 'prompt_quality')
|
|
15
|
+
.slice(0, 200);
|
|
16
|
+
if (candidates.length < 2) {
|
|
17
|
+
return {
|
|
18
|
+
success: false,
|
|
19
|
+
groups: [],
|
|
20
|
+
updatedCount: 0,
|
|
21
|
+
error: 'Need at least 2 non-summary insights to find patterns.',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const client = createLLMClient();
|
|
26
|
+
const insightData = candidates.map(i => ({
|
|
27
|
+
id: i.id,
|
|
28
|
+
type: i.type === 'technique' ? 'learning' : i.type,
|
|
29
|
+
title: i.title,
|
|
30
|
+
summary: i.summary.slice(0, 150),
|
|
31
|
+
projectName: i.project_name,
|
|
32
|
+
sessionId: i.session_id,
|
|
33
|
+
}));
|
|
34
|
+
const prompt = `Analyze these insights from coding sessions and find groups of semantically similar or duplicate insights — ones that express the same learning or decision even if worded differently.
|
|
35
|
+
|
|
36
|
+
RULES:
|
|
37
|
+
- Only group insights that are genuinely about the same concept/topic
|
|
38
|
+
- Insights in a group should be from DIFFERENT sessions (same sessionId = not recurring)
|
|
39
|
+
- A group must have at least 2 insights
|
|
40
|
+
- An insight can only belong to one group
|
|
41
|
+
- Provide a brief "theme" describing what the group shares
|
|
42
|
+
- If no recurring patterns exist, return an empty groups array
|
|
43
|
+
|
|
44
|
+
INSIGHTS:
|
|
45
|
+
${JSON.stringify(insightData, null, 2)}
|
|
46
|
+
|
|
47
|
+
Respond with valid JSON only:
|
|
48
|
+
{
|
|
49
|
+
"groups": [
|
|
50
|
+
{
|
|
51
|
+
"insightIds": ["insight_abc", "insight_def"],
|
|
52
|
+
"theme": "Brief description of the shared concept"
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}`;
|
|
56
|
+
const response = await client.chat([
|
|
57
|
+
{
|
|
58
|
+
role: 'system',
|
|
59
|
+
content: 'You are an expert at identifying recurring patterns and themes across software development insights. You find semantically similar insights even when they are worded differently. Respond with valid JSON only.',
|
|
60
|
+
},
|
|
61
|
+
{ role: 'user', content: prompt },
|
|
62
|
+
]);
|
|
63
|
+
const jsonMatch = response.content.match(/\{[\s\S]*\}/);
|
|
64
|
+
if (!jsonMatch) {
|
|
65
|
+
return { success: false, groups: [], updatedCount: 0, error: 'Failed to parse recurring insights response.' };
|
|
66
|
+
}
|
|
67
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
68
|
+
const groups = parsed.groups || [];
|
|
69
|
+
const validIds = new Set(candidates.map(i => i.id));
|
|
70
|
+
const validGroups = groups
|
|
71
|
+
.map(g => ({
|
|
72
|
+
...g,
|
|
73
|
+
insightIds: g.insightIds.filter(id => validIds.has(id)),
|
|
74
|
+
}))
|
|
75
|
+
.filter(g => g.insightIds.length >= 2);
|
|
76
|
+
if (validGroups.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
groups: [],
|
|
80
|
+
updatedCount: 0,
|
|
81
|
+
usage: response.usage
|
|
82
|
+
? { inputTokens: response.usage.inputTokens, outputTokens: response.usage.outputTokens }
|
|
83
|
+
: undefined,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Build bidirectional links
|
|
87
|
+
const linkMap = new Map();
|
|
88
|
+
for (const group of validGroups) {
|
|
89
|
+
for (const id of group.insightIds) {
|
|
90
|
+
const others = group.insightIds.filter(otherId => otherId !== id);
|
|
91
|
+
const existing = linkMap.get(id) || [];
|
|
92
|
+
linkMap.set(id, [...new Set([...existing, ...others])]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Write links to SQLite
|
|
96
|
+
const db = getDb();
|
|
97
|
+
const updateLinks = db.prepare(`UPDATE insights SET linked_insight_ids = ? WHERE id = ?`);
|
|
98
|
+
for (const [insightId, linkedIds] of linkMap.entries()) {
|
|
99
|
+
updateLinks.run(JSON.stringify(linkedIds), insightId);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
groups: validGroups,
|
|
104
|
+
updatedCount: linkMap.size,
|
|
105
|
+
usage: response.usage
|
|
106
|
+
? { inputTokens: response.usage.inputTokens, outputTokens: response.usage.outputTokens }
|
|
107
|
+
: undefined,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
groups: [],
|
|
114
|
+
updatedCount: 0,
|
|
115
|
+
error: error instanceof Error ? error.message : 'Failed to find recurring insights',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=recurring-insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurring-insights.js","sourceRoot":"","sources":["../../src/llm/recurring-insights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const FRICTION_WINS_SYSTEM_PROMPT = "You are analyzing cross-session patterns from a developer's AI coding sessions. You will receive pre-aggregated friction categories and effective patterns with counts and severity scores.\n\nYour job is to synthesize a narrative analysis of the 3-5 most significant patterns. For each pattern:\n1. State what the pattern is\n2. Explain why it matters (impact on productivity)\n3. Identify the likely root cause\n4. Note if it's trending (getting better or worse)\n\nRULES:\n- Every claim must trace to the statistics provided. Do not invent patterns.\n- Patterns require 2+ occurrences to be mentioned.\n- Do not give advice \u2014 that's for the Rules & Skills section.\n- Be specific: \"wrong-approach appeared 7 times with high severity\" not \"there were some issues\"\n- Keep the narrative under 500 words.\n- Where PQ deficit signals corroborate friction categories, note the reinforcing evidence briefly.\n- PQ signals are supplementary context, not primary evidence. Never dedicate a full pattern to PQ alone \u2014 mention PQ only within friction or wins paragraphs.\n\nRespond with valid JSON only, wrapped in <json>...</json> tags.";
|
|
2
|
+
export declare function generateFrictionWinsPrompt(data: {
|
|
3
|
+
frictionCategories: Array<{
|
|
4
|
+
category: string;
|
|
5
|
+
count: number;
|
|
6
|
+
avg_severity: number;
|
|
7
|
+
examples: string[];
|
|
8
|
+
}>;
|
|
9
|
+
effectivePatterns: Array<{
|
|
10
|
+
category: string;
|
|
11
|
+
label: string;
|
|
12
|
+
frequency: number;
|
|
13
|
+
avg_confidence: number;
|
|
14
|
+
descriptions: string[];
|
|
15
|
+
}>;
|
|
16
|
+
totalSessions: number;
|
|
17
|
+
period: string;
|
|
18
|
+
pqSignals?: {
|
|
19
|
+
deficits: Array<{
|
|
20
|
+
category: string;
|
|
21
|
+
count: number;
|
|
22
|
+
}>;
|
|
23
|
+
strengths: Array<{
|
|
24
|
+
category: string;
|
|
25
|
+
count: number;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
}): string;
|
|
29
|
+
export declare const RULES_SKILLS_SYSTEM_PROMPT = "You are generating actionable artifacts from cross-session analysis of a developer's AI coding sessions. You will receive recurring friction patterns and effective practices.\n\nYour job is to produce concrete, copy-paste-ready artifacts:\n1. CLAUDE.md rules \u2014 specific instructions to add to the AI assistant's config\n2. Hook configurations \u2014 automation triggers\n\nRULES:\n- Only generate artifacts for patterns with 3+ occurrences (friction) or 2+ occurrences (effective patterns)\n- Rules must be specific enough to be actionable: \"Always run tests before creating PRs\" not \"Be careful with code\"\n- Hook configs must include the event trigger and command\n- Max 6 rules, 3 hooks\n- Each artifact must reference the friction pattern or effective practice it addresses\n\nRespond with valid JSON only, wrapped in <json>...</json> tags.";
|
|
30
|
+
export declare function generateRulesSkillsPrompt(data: {
|
|
31
|
+
recurringFriction: Array<{
|
|
32
|
+
category: string;
|
|
33
|
+
count: number;
|
|
34
|
+
avg_severity: number;
|
|
35
|
+
examples: string[];
|
|
36
|
+
}>;
|
|
37
|
+
effectivePatterns: Array<{
|
|
38
|
+
category: string;
|
|
39
|
+
label: string;
|
|
40
|
+
frequency: number;
|
|
41
|
+
avg_confidence: number;
|
|
42
|
+
descriptions: string[];
|
|
43
|
+
}>;
|
|
44
|
+
targetTool: string;
|
|
45
|
+
}): string;
|
|
46
|
+
export declare const WORKING_STYLE_SYSTEM_PROMPT = "You are writing a brief working style profile based on aggregated statistics from a developer's AI coding sessions. You will receive distributions of workflow patterns, outcomes, session types, and friction frequency.\n\nYour job is to describe WHAT you see, not what they should change. Write in second person (\"You tend to...\").\n\nRULES:\n- Base every statement on the statistics provided\n- Keep the narrative to 3-5 sentences\n- Be descriptive, not prescriptive (no advice)\n- Mention the dominant workflow pattern, outcome distribution, and any notable characteristics\n- If the data is too sparse (< 5 sessions), say so and keep it brief\n- Generate a tagline: a 2-4 word archetype label in title case, maximum 40 characters (e.g. \"The Methodical Builder\", \"Relentless Debugger\", \"Ship Fast Fix Later\", \"Deep Focus Specialist\")\n- The tagline must be empowering and descriptive, never critical or negative\n- Base the tagline on the dominant session types, workflow patterns, and outcome distribution\n- Think of it like a developer personality type \u2014 specific and earned, not generic\n\nRespond with valid JSON only, wrapped in <json>...</json> tags.";
|
|
47
|
+
export declare function generateWorkingStylePrompt(data: {
|
|
48
|
+
workflowDistribution: Record<string, number>;
|
|
49
|
+
outcomeDistribution: Record<string, number>;
|
|
50
|
+
characterDistribution: Record<string, number>;
|
|
51
|
+
totalSessions: number;
|
|
52
|
+
period: string;
|
|
53
|
+
frictionFrequency: number;
|
|
54
|
+
}): string;
|
|
55
|
+
//# sourceMappingURL=reflect-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect-prompts.d.ts","sourceRoot":"","sources":["../../src/llm/reflect-prompts.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,2BAA2B,2nCAiBwB,CAAC;AAEjE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,kBAAkB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACzG,iBAAiB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjI,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACrD,SAAS,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CACH,GAAG,MAAM,CA2CT;AAID,eAAO,MAAM,0BAA0B,01BAayB,CAAC;AAEjE,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,iBAAiB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACxG,iBAAiB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjI,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CA8BT;AAID,eAAO,MAAM,2BAA2B,0pCAewB,CAAC;AAEjE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAqBT"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Synthesis prompts for the Reflect/Patterns feature.
|
|
2
|
+
// These prompts receive pre-aggregated facet data and produce cross-session narratives.
|
|
3
|
+
// LLMs synthesize — they don't count. All counting is done in code before calling these.
|
|
4
|
+
// --- Friction & Wins ---
|
|
5
|
+
export const FRICTION_WINS_SYSTEM_PROMPT = `You are analyzing cross-session patterns from a developer's AI coding sessions. You will receive pre-aggregated friction categories and effective patterns with counts and severity scores.
|
|
6
|
+
|
|
7
|
+
Your job is to synthesize a narrative analysis of the 3-5 most significant patterns. For each pattern:
|
|
8
|
+
1. State what the pattern is
|
|
9
|
+
2. Explain why it matters (impact on productivity)
|
|
10
|
+
3. Identify the likely root cause
|
|
11
|
+
4. Note if it's trending (getting better or worse)
|
|
12
|
+
|
|
13
|
+
RULES:
|
|
14
|
+
- Every claim must trace to the statistics provided. Do not invent patterns.
|
|
15
|
+
- Patterns require 2+ occurrences to be mentioned.
|
|
16
|
+
- Do not give advice — that's for the Rules & Skills section.
|
|
17
|
+
- Be specific: "wrong-approach appeared 7 times with high severity" not "there were some issues"
|
|
18
|
+
- Keep the narrative under 500 words.
|
|
19
|
+
- Where PQ deficit signals corroborate friction categories, note the reinforcing evidence briefly.
|
|
20
|
+
- PQ signals are supplementary context, not primary evidence. Never dedicate a full pattern to PQ alone — mention PQ only within friction or wins paragraphs.
|
|
21
|
+
|
|
22
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
23
|
+
export function generateFrictionWinsPrompt(data) {
|
|
24
|
+
const hasPQData = data.pqSignals?.deficits.length || data.pqSignals?.strengths.length;
|
|
25
|
+
const pqSection = hasPQData
|
|
26
|
+
? `
|
|
27
|
+
PROMPT QUALITY SIGNALS (supplementary):
|
|
28
|
+
|
|
29
|
+
Deficits:
|
|
30
|
+
${((data.pqSignals?.deficits ?? []).map(d => ` ${d.category}: ${d.count}`).join('\n') || ' (none above threshold)')}
|
|
31
|
+
|
|
32
|
+
Strengths:
|
|
33
|
+
${((data.pqSignals?.strengths ?? []).map(s => ` ${s.category}: ${s.count}`).join('\n') || ' (none above threshold)')}
|
|
34
|
+
`
|
|
35
|
+
: '';
|
|
36
|
+
return `Analyze these cross-session patterns from ${data.totalSessions} sessions over ${data.period}.
|
|
37
|
+
|
|
38
|
+
FRICTION CATEGORIES (ranked by frequency × severity):
|
|
39
|
+
${JSON.stringify(data.frictionCategories.slice(0, 15), null, 2)}
|
|
40
|
+
|
|
41
|
+
EFFECTIVE PATTERNS (ranked by frequency, grouped by category):
|
|
42
|
+
${JSON.stringify(data.effectivePatterns.slice(0, 10), null, 2)}
|
|
43
|
+
${pqSection}
|
|
44
|
+
Respond with this JSON format:
|
|
45
|
+
{
|
|
46
|
+
"narrative": "Your 300-500 word analysis of the most significant patterns",
|
|
47
|
+
"topFriction": [
|
|
48
|
+
{
|
|
49
|
+
"category": "category-name",
|
|
50
|
+
"significance": "Why this matters",
|
|
51
|
+
"rootCause": "Likely underlying cause",
|
|
52
|
+
"trend": "increasing | stable | decreasing | new"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"topWins": [
|
|
56
|
+
{
|
|
57
|
+
"category": "structured-planning",
|
|
58
|
+
"pattern": "Description of what works",
|
|
59
|
+
"significance": "Why this is effective"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
65
|
+
}
|
|
66
|
+
// --- Rules & Skills ---
|
|
67
|
+
export const RULES_SKILLS_SYSTEM_PROMPT = `You are generating actionable artifacts from cross-session analysis of a developer's AI coding sessions. You will receive recurring friction patterns and effective practices.
|
|
68
|
+
|
|
69
|
+
Your job is to produce concrete, copy-paste-ready artifacts:
|
|
70
|
+
1. CLAUDE.md rules — specific instructions to add to the AI assistant's config
|
|
71
|
+
2. Hook configurations — automation triggers
|
|
72
|
+
|
|
73
|
+
RULES:
|
|
74
|
+
- Only generate artifacts for patterns with 3+ occurrences (friction) or 2+ occurrences (effective patterns)
|
|
75
|
+
- Rules must be specific enough to be actionable: "Always run tests before creating PRs" not "Be careful with code"
|
|
76
|
+
- Hook configs must include the event trigger and command
|
|
77
|
+
- Max 6 rules, 3 hooks
|
|
78
|
+
- Each artifact must reference the friction pattern or effective practice it addresses
|
|
79
|
+
|
|
80
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
81
|
+
export function generateRulesSkillsPrompt(data) {
|
|
82
|
+
return `Generate actionable artifacts from these recurring patterns.
|
|
83
|
+
|
|
84
|
+
TARGET TOOL: ${data.targetTool} (generate artifacts compatible with this tool's ecosystem)
|
|
85
|
+
|
|
86
|
+
RECURRING FRICTION (3+ occurrences):
|
|
87
|
+
${JSON.stringify(data.recurringFriction, null, 2)}
|
|
88
|
+
|
|
89
|
+
EFFECTIVE PATTERNS (2+ occurrences):
|
|
90
|
+
${JSON.stringify(data.effectivePatterns, null, 2)}
|
|
91
|
+
|
|
92
|
+
Respond with this JSON format:
|
|
93
|
+
{
|
|
94
|
+
"claudeMdRules": [
|
|
95
|
+
{
|
|
96
|
+
"rule": "The exact text to add to CLAUDE.md",
|
|
97
|
+
"rationale": "Why this rule helps (reference the friction pattern)",
|
|
98
|
+
"frictionSource": "category-name (N occurrences)"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"hookConfigs": [
|
|
102
|
+
{
|
|
103
|
+
"event": "pre-commit | post-file-edit | etc.",
|
|
104
|
+
"command": "The shell command to run",
|
|
105
|
+
"rationale": "Why this automation helps"
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
111
|
+
}
|
|
112
|
+
// --- Working Style ---
|
|
113
|
+
export const WORKING_STYLE_SYSTEM_PROMPT = `You are writing a brief working style profile based on aggregated statistics from a developer's AI coding sessions. You will receive distributions of workflow patterns, outcomes, session types, and friction frequency.
|
|
114
|
+
|
|
115
|
+
Your job is to describe WHAT you see, not what they should change. Write in second person ("You tend to...").
|
|
116
|
+
|
|
117
|
+
RULES:
|
|
118
|
+
- Base every statement on the statistics provided
|
|
119
|
+
- Keep the narrative to 3-5 sentences
|
|
120
|
+
- Be descriptive, not prescriptive (no advice)
|
|
121
|
+
- Mention the dominant workflow pattern, outcome distribution, and any notable characteristics
|
|
122
|
+
- If the data is too sparse (< 5 sessions), say so and keep it brief
|
|
123
|
+
- Generate a tagline: a 2-4 word archetype label in title case, maximum 40 characters (e.g. "The Methodical Builder", "Relentless Debugger", "Ship Fast Fix Later", "Deep Focus Specialist")
|
|
124
|
+
- The tagline must be empowering and descriptive, never critical or negative
|
|
125
|
+
- Base the tagline on the dominant session types, workflow patterns, and outcome distribution
|
|
126
|
+
- Think of it like a developer personality type — specific and earned, not generic
|
|
127
|
+
|
|
128
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
129
|
+
export function generateWorkingStylePrompt(data) {
|
|
130
|
+
return `Write a working style profile based on ${data.totalSessions} sessions over ${data.period}.
|
|
131
|
+
|
|
132
|
+
WORKFLOW PATTERNS:
|
|
133
|
+
${JSON.stringify(data.workflowDistribution, null, 2)}
|
|
134
|
+
|
|
135
|
+
OUTCOME SATISFACTION:
|
|
136
|
+
${JSON.stringify(data.outcomeDistribution, null, 2)}
|
|
137
|
+
|
|
138
|
+
SESSION TYPES:
|
|
139
|
+
${JSON.stringify(data.characterDistribution, null, 2)}
|
|
140
|
+
|
|
141
|
+
FRICTION FREQUENCY: ${data.frictionFrequency} total friction points across all sessions
|
|
142
|
+
|
|
143
|
+
Respond with this JSON format:
|
|
144
|
+
{
|
|
145
|
+
"tagline": "2-4 word archetype label (e.g. The Methodical Builder)",
|
|
146
|
+
"narrative": "3-5 sentence working style description"
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
Respond with valid JSON only, wrapped in <json>...</json> tags.`;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=reflect-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect-prompts.js","sourceRoot":"","sources":["../../src/llm/reflect-prompts.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,wFAAwF;AACxF,yFAAyF;AAEzF,0BAA0B;AAE1B,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;gEAiBqB,CAAC;AAEjE,MAAM,UAAU,0BAA0B,CAAC,IAS1C;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC;IACtF,MAAM,SAAS,GAAG,SAAS;QACzB,CAAC,CAAC;;;;EAIJ,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC;;;EAGnH,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC;CACrH;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,6CAA6C,IAAI,CAAC,aAAa,kBAAkB,IAAI,CAAC,MAAM;;;EAGnG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAG7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAC5D,SAAS;;;;;;;;;;;;;;;;;;;;;gEAqBqD,CAAC;AACjE,CAAC;AAED,yBAAyB;AAEzB,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;gEAasB,CAAC;AAEjE,MAAM,UAAU,yBAAyB,CAAC,IAIzC;IACC,OAAO;;eAEM,IAAI,CAAC,UAAU;;;EAG5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAG/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;gEAoBe,CAAC;AACjE,CAAC;AAED,wBAAwB;AAExB,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;gEAeqB,CAAC;AAEjE,MAAM,UAAU,0BAA0B,CAAC,IAO1C;IACC,OAAO,0CAA0C,IAAI,CAAC,aAAa,kBAAkB,IAAI,CAAC,MAAM;;;EAGhG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGlD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;;sBAE/B,IAAI,CAAC,iBAAiB;;;;;;;;gEAQoB,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnalysisResponse, ParseResult, PromptQualityResponse } from './prompt-types.js';
|
|
2
|
+
export declare function extractJsonPayload(response: string): string | null;
|
|
3
|
+
/**
|
|
4
|
+
* Parse the LLM response into structured insights.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseAnalysisResponse(response: string): ParseResult<AnalysisResponse>;
|
|
7
|
+
export declare function parsePromptQualityResponse(response: string): ParseResult<PromptQualityResponse>;
|
|
8
|
+
//# sourceMappingURL=response-parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-parsers.d.ts","sourceRoot":"","sources":["../../src/llm/response-parsers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAc,WAAW,EAAE,qBAAqB,EAAgC,MAAM,mBAAmB,CAAC;AAOxI,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,CA4ErF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAmE/F"}
|