@pencil-agent/nano-mem 0.0.1
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/CLAUDE.md +258 -0
- package/README.md +146 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +48 -0
- package/dist/config.js.map +1 -0
- package/dist/consolidation.d.ts +13 -0
- package/dist/consolidation.d.ts.map +1 -0
- package/dist/consolidation.js +111 -0
- package/dist/consolidation.js.map +1 -0
- package/dist/engine.d.ts +67 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +492 -0
- package/dist/engine.js.map +1 -0
- package/dist/eviction.d.ts +16 -0
- package/dist/eviction.d.ts.map +1 -0
- package/dist/eviction.js +22 -0
- package/dist/eviction.js.map +1 -0
- package/dist/extension.d.ts +11 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +264 -0
- package/dist/extension.js.map +1 -0
- package/dist/extraction.d.ts +10 -0
- package/dist/extraction.d.ts.map +1 -0
- package/dist/extraction.js +136 -0
- package/dist/extraction.js.map +1 -0
- package/dist/full-insights-html.d.ts +8 -0
- package/dist/full-insights-html.d.ts.map +1 -0
- package/dist/full-insights-html.js +311 -0
- package/dist/full-insights-html.js.map +1 -0
- package/dist/full-insights.d.ts +21 -0
- package/dist/full-insights.d.ts.map +1 -0
- package/dist/full-insights.js +327 -0
- package/dist/full-insights.js.map +1 -0
- package/dist/i18n.d.ts +50 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +169 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/insights-html.d.ts +8 -0
- package/dist/insights-html.d.ts.map +1 -0
- package/dist/insights-html.js +431 -0
- package/dist/insights-html.js.map +1 -0
- package/dist/linking.d.ts +11 -0
- package/dist/linking.d.ts.map +1 -0
- package/dist/linking.js +40 -0
- package/dist/linking.js.map +1 -0
- package/dist/privacy.d.ts +16 -0
- package/dist/privacy.d.ts.map +1 -0
- package/dist/privacy.js +52 -0
- package/dist/privacy.js.map +1 -0
- package/dist/scoring.d.ts +25 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +63 -0
- package/dist/scoring.js.map +1 -0
- package/dist/store.d.ts +16 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +68 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +191 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +14 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +126 -0
- package/dist/update.js.map +1 -0
- package/package.json +60 -0
- package/src/cli.ts +99 -0
- package/src/config.ts +72 -0
- package/src/consolidation.ts +127 -0
- package/src/engine.ts +699 -0
- package/src/eviction.ts +30 -0
- package/src/extension.ts +290 -0
- package/src/extraction.ts +152 -0
- package/src/full-insights-html.ts +342 -0
- package/src/full-insights.ts +396 -0
- package/src/i18n.ts +233 -0
- package/src/index.ts +50 -0
- package/src/insights-html.ts +476 -0
- package/src/linking.ts +43 -0
- package/src/privacy.ts +52 -0
- package/src/scoring.ts +94 -0
- package/src/store.ts +84 -0
- package/src/types.ts +209 -0
- package/src/update.ts +141 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [INPUT]: exportAll() result, optional LlmFn, locale
|
|
3
|
+
* [OUTPUT]: FullInsightsReport — stats, charts, narrative (LLM or rule fallback)
|
|
4
|
+
* [POS]: Aggregation + optional LLM for full insights report
|
|
5
|
+
*/
|
|
6
|
+
import { PROMPTS } from "./i18n.js";
|
|
7
|
+
const EXT_TO_LANG = {
|
|
8
|
+
ts: "TypeScript",
|
|
9
|
+
js: "JavaScript",
|
|
10
|
+
jsx: "JSX",
|
|
11
|
+
tsx: "TSX",
|
|
12
|
+
md: "Markdown",
|
|
13
|
+
json: "JSON",
|
|
14
|
+
py: "Python",
|
|
15
|
+
html: "HTML",
|
|
16
|
+
css: "CSS",
|
|
17
|
+
yml: "YAML",
|
|
18
|
+
yaml: "YAML",
|
|
19
|
+
sh: "Shell",
|
|
20
|
+
};
|
|
21
|
+
function aggregateTools(episodes, topN = 10) {
|
|
22
|
+
const counts = {};
|
|
23
|
+
for (const ep of episodes) {
|
|
24
|
+
for (const [name, n] of Object.entries(ep.toolsUsed ?? {})) {
|
|
25
|
+
counts[name] = (counts[name] ?? 0) + n;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const rows = Object.entries(counts)
|
|
29
|
+
.map(([label, value]) => ({ label, value }))
|
|
30
|
+
.sort((a, b) => b.value - a.value)
|
|
31
|
+
.slice(0, topN);
|
|
32
|
+
return { id: "tools", title: "tools", rows };
|
|
33
|
+
}
|
|
34
|
+
function aggregateLanguages(episodes, topN = 8) {
|
|
35
|
+
const counts = {};
|
|
36
|
+
for (const ep of episodes) {
|
|
37
|
+
for (const path of ep.filesModified ?? []) {
|
|
38
|
+
const ext = path.includes(".") ? path.split(".").pop()?.toLowerCase() ?? "other" : "other";
|
|
39
|
+
const label = EXT_TO_LANG[ext] ?? ext;
|
|
40
|
+
counts[label] = (counts[label] ?? 0) + 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const rows = Object.entries(counts)
|
|
44
|
+
.filter(([label]) => label !== "other" || (counts[label] ?? 0) > 0)
|
|
45
|
+
.map(([label, value]) => ({ label, value }))
|
|
46
|
+
.sort((a, b) => b.value - a.value)
|
|
47
|
+
.slice(0, topN);
|
|
48
|
+
return { id: "languages", title: "languages", rows };
|
|
49
|
+
}
|
|
50
|
+
function aggregateErrors(episodes, topN = 8) {
|
|
51
|
+
const counts = {};
|
|
52
|
+
for (const ep of episodes) {
|
|
53
|
+
for (const err of ep.errors ?? []) {
|
|
54
|
+
const key = err.slice(0, 50).trim();
|
|
55
|
+
counts[key] = (counts[key] ?? 0) + 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const rows = Object.entries(counts)
|
|
59
|
+
.map(([label, value]) => ({ label, value }))
|
|
60
|
+
.sort((a, b) => b.value - a.value)
|
|
61
|
+
.slice(0, topN);
|
|
62
|
+
return { id: "errors", title: "errors", rows };
|
|
63
|
+
}
|
|
64
|
+
function buildProjectAreas(episodes, work) {
|
|
65
|
+
const byProject = new Map();
|
|
66
|
+
for (const ep of episodes) {
|
|
67
|
+
const p = ep.project || "default";
|
|
68
|
+
if (!byProject.has(p))
|
|
69
|
+
byProject.set(p, { count: 0, summaries: [], goals: [] });
|
|
70
|
+
const entry = byProject.get(p);
|
|
71
|
+
entry.count++;
|
|
72
|
+
if (ep.summary)
|
|
73
|
+
entry.summaries.push(ep.summary);
|
|
74
|
+
if (ep.userGoal)
|
|
75
|
+
entry.goals.push(ep.userGoal);
|
|
76
|
+
}
|
|
77
|
+
for (const w of work) {
|
|
78
|
+
const p = w.project || "default";
|
|
79
|
+
if (!byProject.has(p))
|
|
80
|
+
byProject.set(p, { count: 0, summaries: [], goals: [] });
|
|
81
|
+
const entry = byProject.get(p);
|
|
82
|
+
if (w.summary)
|
|
83
|
+
entry.summaries.push(w.summary);
|
|
84
|
+
if (w.goal)
|
|
85
|
+
entry.goals.push(w.goal);
|
|
86
|
+
}
|
|
87
|
+
return [...byProject.entries()]
|
|
88
|
+
.filter(([, v]) => v.count >= 1 || v.summaries.length + v.goals.length > 0)
|
|
89
|
+
.map(([name, v]) => ({
|
|
90
|
+
name,
|
|
91
|
+
sessionCount: v.count,
|
|
92
|
+
description: [v.summaries[0], v.goals[0]].filter(Boolean).join(" ").slice(0, 120) || "",
|
|
93
|
+
}))
|
|
94
|
+
.sort((a, b) => b.sessionCount - a.sessionCount)
|
|
95
|
+
.slice(0, 12);
|
|
96
|
+
}
|
|
97
|
+
function buildPatternsAndStruggles(facets) {
|
|
98
|
+
const patternEntries = facets.filter((e) => e.type === "pattern");
|
|
99
|
+
const struggleEntries = facets.filter((e) => e.type === "struggle");
|
|
100
|
+
const calcWeight = (e, unresolvedBonus = false) => {
|
|
101
|
+
const base = (e.accessCount + 1) * (e.importance / 10);
|
|
102
|
+
return unresolvedBonus ? base * 1.5 : base;
|
|
103
|
+
};
|
|
104
|
+
const patterns = patternEntries
|
|
105
|
+
.map((e) => ({
|
|
106
|
+
entry: e,
|
|
107
|
+
weight: calcWeight(e),
|
|
108
|
+
trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : e.content.slice(0, 50),
|
|
109
|
+
behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : e.content,
|
|
110
|
+
}))
|
|
111
|
+
.sort((a, b) => b.weight - a.weight);
|
|
112
|
+
const struggles = struggleEntries
|
|
113
|
+
.map((e) => {
|
|
114
|
+
const isResolved = e.facetData?.kind === "struggle" ? !!e.facetData.solution : false;
|
|
115
|
+
return {
|
|
116
|
+
entry: e,
|
|
117
|
+
weight: calcWeight(e, !isResolved),
|
|
118
|
+
problem: e.facetData?.kind === "struggle" ? e.facetData.problem : e.content,
|
|
119
|
+
attempts: e.facetData?.kind === "struggle" ? e.facetData.attempts : [],
|
|
120
|
+
solution: e.facetData?.kind === "struggle" ? e.facetData.solution : "",
|
|
121
|
+
resolved: isResolved,
|
|
122
|
+
};
|
|
123
|
+
})
|
|
124
|
+
.sort((a, b) => (a.resolved !== b.resolved ? (a.resolved ? 1 : -1) : b.weight - a.weight));
|
|
125
|
+
return { patterns, struggles };
|
|
126
|
+
}
|
|
127
|
+
function fallbackAtAGlance(patterns, struggles, lessons, locale) {
|
|
128
|
+
const isZh = locale === "zh";
|
|
129
|
+
const resolved = struggles.filter((s) => s.resolved);
|
|
130
|
+
const unresolved = struggles.filter((s) => !s.resolved);
|
|
131
|
+
const working = resolved.length > 0
|
|
132
|
+
? isZh
|
|
133
|
+
? `${resolved.length} 个问题已解决,可继续复用这些解法。`
|
|
134
|
+
: `${resolved.length} struggles resolved; keep reusing those fixes.`
|
|
135
|
+
: lessons.length > 0
|
|
136
|
+
? isZh
|
|
137
|
+
? `已积累 ${lessons.length} 条经验,可把最重要的固化成清单。`
|
|
138
|
+
: `${lessons.length} lessons captured; turn the top ones into checklists.`
|
|
139
|
+
: isZh
|
|
140
|
+
? "暂无明显信号。"
|
|
141
|
+
: "No strong signal yet.";
|
|
142
|
+
const hindering = unresolved.length > 0
|
|
143
|
+
? isZh
|
|
144
|
+
? `还有 ${unresolved.length} 个未解决,最常见:「${unresolved[0]?.problem ?? ""}」。`
|
|
145
|
+
: `${unresolved.length} open struggles remain. Most frequent: "${unresolved[0]?.problem ?? ""}".`
|
|
146
|
+
: isZh
|
|
147
|
+
? "当前没有明显未解决问题。"
|
|
148
|
+
: "No unresolved struggles visible.";
|
|
149
|
+
const topPattern = patterns[0];
|
|
150
|
+
const quickWins = topPattern
|
|
151
|
+
? isZh
|
|
152
|
+
? `在「${topPattern.trigger}」时你常「${topPattern.behavior}」,可考虑自动化。`
|
|
153
|
+
: `When ${topPattern.trigger}, you often ${topPattern.behavior}. Consider automating.`
|
|
154
|
+
: isZh
|
|
155
|
+
? "继续使用系统,积累数据后会给出快速改进建议。"
|
|
156
|
+
: "Keep using the system; quick wins will appear as data grows.";
|
|
157
|
+
const ambitious = isZh
|
|
158
|
+
? "可以尝试把重复流程固化成技能或脚本,让 Agent 并行处理多块任务。"
|
|
159
|
+
: "Consider turning repeat workflows into skills or scripts and using parallel agents.";
|
|
160
|
+
return { working, hindering, quickWins, ambitious };
|
|
161
|
+
}
|
|
162
|
+
function fallbackWins(struggles, lessons) {
|
|
163
|
+
const wins = [];
|
|
164
|
+
for (const s of struggles.filter((x) => x.resolved).slice(0, 5)) {
|
|
165
|
+
wins.push({ title: s.problem.slice(0, 60), description: s.solution || s.problem });
|
|
166
|
+
}
|
|
167
|
+
const sortLessons = [...lessons].sort((a, b) => b.importance * (b.accessCount + 1) - a.importance * (a.accessCount + 1));
|
|
168
|
+
for (const l of sortLessons.slice(0, 3)) {
|
|
169
|
+
wins.push({ title: l.content.slice(0, 60), description: l.content });
|
|
170
|
+
}
|
|
171
|
+
return wins.slice(0, 8);
|
|
172
|
+
}
|
|
173
|
+
function fallbackFrictions(struggles) {
|
|
174
|
+
return struggles
|
|
175
|
+
.filter((s) => !s.resolved)
|
|
176
|
+
.slice(0, 8)
|
|
177
|
+
.map((s) => ({
|
|
178
|
+
title: s.problem.slice(0, 60),
|
|
179
|
+
description: s.problem,
|
|
180
|
+
examples: s.attempts.length ? s.attempts : undefined,
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
function fallbackRecommendations(patterns, struggles, lessons, locale) {
|
|
184
|
+
const recs = [];
|
|
185
|
+
const isZh = locale === "zh";
|
|
186
|
+
if (patterns.length > 0) {
|
|
187
|
+
const top = patterns[0];
|
|
188
|
+
recs.push(isZh ? `你在「${top.trigger}」时稳定执行「${top.behavior}」,考虑将此行为自动化` : `You consistently ${top.behavior} when ${top.trigger}. Consider automating.`);
|
|
189
|
+
}
|
|
190
|
+
const unresolved = struggles.filter((s) => !s.resolved);
|
|
191
|
+
if (unresolved.length >= 2) {
|
|
192
|
+
recs.push(isZh ? `有 ${unresolved.length} 个未解决的问题,建议系统性地逐个攻克` : `You have ${unresolved.length} unresolved issues. Tackle them systematically.`);
|
|
193
|
+
}
|
|
194
|
+
if (lessons.length >= 5) {
|
|
195
|
+
recs.push(isZh ? `你已积累 ${lessons.length} 条经验教训,这是宝贵知识` : `You've accumulated ${lessons.length} lessons. Valuable expertise.`);
|
|
196
|
+
}
|
|
197
|
+
if (recs.length === 0) {
|
|
198
|
+
recs.push(isZh ? "继续使用系统,让它学习你的工作习惯" : "Keep using the system to let it learn your habits.");
|
|
199
|
+
}
|
|
200
|
+
return recs.slice(0, 5);
|
|
201
|
+
}
|
|
202
|
+
function fallbackFeaturesAndPatterns(toolRows, struggles, locale) {
|
|
203
|
+
const isZh = locale === "zh";
|
|
204
|
+
const featuresToTry = [];
|
|
205
|
+
const usagePatterns = [];
|
|
206
|
+
if (toolRows.length > 0) {
|
|
207
|
+
const topTool = toolRows[0].label;
|
|
208
|
+
featuresToTry.push({
|
|
209
|
+
title: isZh ? "自动化常用操作" : "Automate frequent operations",
|
|
210
|
+
oneLiner: isZh ? "把重复流程固化成技能或脚本" : "Turn repeat workflows into skills or scripts",
|
|
211
|
+
whyForYou: isZh ? `你经常使用「${topTool}」,可考虑封装成一条命令或技能。` : `You use "${topTool}" often; consider wrapping it in a skill or command.`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (struggles.filter((s) => !s.resolved).length >= 2) {
|
|
215
|
+
usagePatterns.push({
|
|
216
|
+
title: isZh ? "分批处理大任务" : "Batch large tasks",
|
|
217
|
+
summary: isZh ? "大文件或大批量时拆成小批处理" : "Split large files or batches into smaller chunks",
|
|
218
|
+
detail: isZh ? "避免单次处理过多导致上下文溢出,每批验证后再继续。" : "Avoid context overflow by validating each batch before continuing.",
|
|
219
|
+
pastePrompt: isZh ? "请把这件事拆成 3~4 步,每步完成后给我看结果再继续下一步。" : "Break this into 3-4 steps; show me the result after each step before continuing.",
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return { featuresToTry, usagePatterns };
|
|
223
|
+
}
|
|
224
|
+
function parseLlmPayload(raw) {
|
|
225
|
+
try {
|
|
226
|
+
const cleaned = raw.replace(/```json?\n?/g, "").replace(/```/g, "").trim();
|
|
227
|
+
const parsed = JSON.parse(cleaned);
|
|
228
|
+
return parsed;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
export async function buildFullInsightsReport(all, llmFn, locale) {
|
|
235
|
+
const p = PROMPTS[locale] ?? PROMPTS.en;
|
|
236
|
+
const { patterns, struggles } = buildPatternsAndStruggles(all.facets);
|
|
237
|
+
const sortLessons = [...all.lessons].sort((a, b) => b.importance * (b.accessCount + 1) - a.importance * (a.accessCount + 1));
|
|
238
|
+
const topLessons = sortLessons.slice(0, 10);
|
|
239
|
+
const charts = [];
|
|
240
|
+
const toolsChart = aggregateTools(all.episodes);
|
|
241
|
+
let aggregateToolCount = 0;
|
|
242
|
+
for (const r of toolsChart.rows)
|
|
243
|
+
aggregateToolCount += r.value;
|
|
244
|
+
if (toolsChart.rows.length > 0)
|
|
245
|
+
charts.push({ ...toolsChart, title: p.fullInsightsChartTools });
|
|
246
|
+
const langChart = aggregateLanguages(all.episodes);
|
|
247
|
+
let aggregateFileCount = 0;
|
|
248
|
+
for (const r of langChart.rows)
|
|
249
|
+
aggregateFileCount += r.value;
|
|
250
|
+
if (langChart.rows.length > 0)
|
|
251
|
+
charts.push({ ...langChart, title: p.fullInsightsChartLanguages });
|
|
252
|
+
const errChart = aggregateErrors(all.episodes);
|
|
253
|
+
if (errChart.rows.length > 0)
|
|
254
|
+
charts.push({ ...errChart, title: p.fullInsightsChartErrors });
|
|
255
|
+
const projectAreas = buildProjectAreas(all.episodes, all.work);
|
|
256
|
+
const stats = {
|
|
257
|
+
knowledge: all.knowledge.length,
|
|
258
|
+
lessons: all.lessons.length,
|
|
259
|
+
preferences: all.preferences.length,
|
|
260
|
+
facets: all.facets.length,
|
|
261
|
+
episodes: all.episodes.length,
|
|
262
|
+
work: all.work.length,
|
|
263
|
+
totalSessions: all.meta.totalSessions,
|
|
264
|
+
aggregateToolCount,
|
|
265
|
+
aggregateFileCount,
|
|
266
|
+
};
|
|
267
|
+
let atAGlance = fallbackAtAGlance(patterns, struggles, topLessons, locale);
|
|
268
|
+
let projectAreaDescriptions = projectAreas.map((a) => a.description);
|
|
269
|
+
let wins = fallbackWins(struggles, topLessons);
|
|
270
|
+
let frictions = fallbackFrictions(struggles);
|
|
271
|
+
let recommendations = fallbackRecommendations(patterns, struggles, topLessons, locale);
|
|
272
|
+
let { featuresToTry, usagePatterns } = fallbackFeaturesAndPatterns(toolsChart.rows, struggles, locale);
|
|
273
|
+
if (llmFn) {
|
|
274
|
+
const context = {
|
|
275
|
+
patterns: patterns.slice(0, 5).map((x) => ({ trigger: x.trigger, behavior: x.behavior })),
|
|
276
|
+
struggles: struggles.slice(0, 8).map((s) => ({ problem: s.problem, resolved: s.resolved, attempts: s.attempts, solution: s.solution })),
|
|
277
|
+
lessons: topLessons.slice(0, 5).map((l) => l.content),
|
|
278
|
+
projectAreas: projectAreas.map((a) => ({ name: a.name, sessionCount: a.sessionCount, firstSummary: a.description })),
|
|
279
|
+
topTools: toolsChart.rows.slice(0, 5),
|
|
280
|
+
errorsSummary: errChart.rows.slice(0, 5).map((r) => r.label),
|
|
281
|
+
locale,
|
|
282
|
+
};
|
|
283
|
+
try {
|
|
284
|
+
const raw = await llmFn(p.fullInsightsSystemPrompt, JSON.stringify(context));
|
|
285
|
+
const payload = parseLlmPayload(raw);
|
|
286
|
+
if (payload) {
|
|
287
|
+
if (payload.atAGlance && typeof payload.atAGlance === "object")
|
|
288
|
+
atAGlance = payload.atAGlance;
|
|
289
|
+
if (Array.isArray(payload.projectAreaDescriptions) && payload.projectAreaDescriptions.length >= projectAreas.length) {
|
|
290
|
+
projectAreaDescriptions = payload.projectAreaDescriptions.slice(0, projectAreas.length);
|
|
291
|
+
}
|
|
292
|
+
if (Array.isArray(payload.wins) && payload.wins.length > 0)
|
|
293
|
+
wins = payload.wins.slice(0, 8);
|
|
294
|
+
if (Array.isArray(payload.frictions) && payload.frictions.length > 0)
|
|
295
|
+
frictions = payload.frictions.slice(0, 8);
|
|
296
|
+
if (Array.isArray(payload.recommendations) && payload.recommendations.length > 0)
|
|
297
|
+
recommendations = payload.recommendations.slice(0, 5);
|
|
298
|
+
if (Array.isArray(payload.featuresToTry) && payload.featuresToTry.length > 0)
|
|
299
|
+
featuresToTry = payload.featuresToTry.slice(0, 6);
|
|
300
|
+
if (Array.isArray(payload.usagePatterns) && payload.usagePatterns.length > 0)
|
|
301
|
+
usagePatterns = payload.usagePatterns.slice(0, 6);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// keep fallbacks
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const projectAreasWithDesc = projectAreas.map((a, i) => ({
|
|
309
|
+
...a,
|
|
310
|
+
description: projectAreaDescriptions[i] ?? a.description,
|
|
311
|
+
}));
|
|
312
|
+
return {
|
|
313
|
+
stats,
|
|
314
|
+
atAGlance,
|
|
315
|
+
projectAreas: projectAreasWithDesc,
|
|
316
|
+
charts,
|
|
317
|
+
wins,
|
|
318
|
+
frictions,
|
|
319
|
+
patterns,
|
|
320
|
+
recommendations,
|
|
321
|
+
featuresToTry,
|
|
322
|
+
usagePatterns,
|
|
323
|
+
generatedAt: new Date().toISOString(),
|
|
324
|
+
locale,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=full-insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"full-insights.js","sourceRoot":"","sources":["../src/full-insights.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,MAAM,WAAW,GAA2B;IAC3C,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,OAAO;CACX,CAAC;AAYF,SAAS,cAAc,CAAC,QAAmB,EAAE,IAAI,GAAG,EAAE;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAmB,EAAE,IAAI,GAAG,CAAC;IACxD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACjC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SAClE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,QAAmB,EAAE,IAAI,GAAG,CAAC;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmB,EAAE,IAAiB;IAChE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmE,CAAC;IAC7F,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,SAAS,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;QAChC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,OAAO;YAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,QAAQ;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;QAChC,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1E,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpB,IAAI;QACJ,YAAY,EAAE,CAAC,CAAC,KAAK;QACrB,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE;KACvF,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;SAC/C,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAqB;IACvD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,eAAe,GAAG,KAAK,EAAU,EAAE;QACtE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,eAAe,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,QAAQ,GAAqB,cAAc;SAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACvF,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;KAC5E,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,SAAS,GAAsB,eAAe;SAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QACrF,OAAO;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;YAClC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YAC3E,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YACtE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YACtE,QAAQ,EAAE,UAAU;SACpB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CACzB,QAA0B,EAC1B,SAA4B,EAC5B,OAAsB,EACtB,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,OAAO,GACZ,QAAQ,CAAC,MAAM,GAAG,CAAC;QAClB,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,oBAAoB;YACxC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,gDAAgD;QACrE,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI;gBACL,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,mBAAmB;gBAC1C,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,uDAAuD;YAC3E,CAAC,CAAC,IAAI;gBACL,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,uBAAuB,CAAC;IAC9B,MAAM,SAAS,GACd,UAAU,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,cAAc,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,IAAI;YACvE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,2CAA2C,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,IAAI;QAClG,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,kCAAkC,CAAC;IACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,UAAU;QAC3B,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,KAAK,UAAU,CAAC,OAAO,QAAQ,UAAU,CAAC,QAAQ,WAAW;YAC/D,CAAC,CAAC,QAAQ,UAAU,CAAC,OAAO,eAAe,UAAU,CAAC,QAAQ,wBAAwB;QACvF,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,8DAA8D,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI;QACrB,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,qFAAqF,CAAC;IACzF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,SAA4B,EAAE,OAAsB;IACzE,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;IACzH,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA4B;IACtD,OAAO,SAAS;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;SAC1B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,WAAW,EAAE,CAAC,CAAC,OAAO;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAC/B,QAA0B,EAC1B,SAA4B,EAC5B,OAAsB,EACtB,MAAc;IAEd,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CACR,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,UAAU,GAAG,CAAC,QAAQ,aAAa,CAAC,CAAC,CAAC,oBAAoB,GAAG,CAAC,QAAQ,SAAS,GAAG,CAAC,OAAO,wBAAwB,CAC1I,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CACR,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,MAAM,iDAAiD,CACnI,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,MAAM,+BAA+B,CAAC,CAAC;IAC/H,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,2BAA2B,CACnC,QAA4C,EAC5C,SAA4B,EAC5B,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,8BAA8B;YACxD,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,8CAA8C;YACjF,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,kBAAkB,CAAC,CAAC,CAAC,YAAY,OAAO,sDAAsD;SAChI,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB;YAC7C,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kDAAkD;YACrF,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oEAAoE;YACjH,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,kFAAkF;SAC1I,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC;AAYD,SAAS,eAAe,CAAC,GAAW;IACnC,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAC;QAC7D,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,GAAoB,EACpB,KAAwB,EACxB,MAAc;IAEd,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC;IACxC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CACjF,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI;QAAE,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAEhG,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI;QAAE,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC;IAC9D,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAElG,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAE7F,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG;QACb,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM;QAC/B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;QAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM;QACnC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;QAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACrB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa;QACrC,kBAAkB;QAClB,kBAAkB;KAClB,CAAC;IAEF,IAAI,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3E,IAAI,uBAAuB,GAAa,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/E,IAAI,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,eAAe,GAAG,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACvF,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,2BAA2B,CACjE,UAAU,CAAC,IAAI,EACf,SAAS,EACT,MAAM,CACN,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG;YACf,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzF,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvI,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACpH,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5D,MAAM;SACN,CAAC;QACF,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;oBAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBAC9F,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,uBAAuB,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBACrH,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gBACzF,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5F,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChH,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;oBAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjI,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,iBAAiB;QAClB,CAAC;IACF,CAAC;IAED,MAAM,oBAAoB,GAA8B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,GAAG,CAAC;QACJ,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW;KACxD,CAAC,CAAC,CAAC;IAEJ,OAAO;QACN,KAAK;QACL,SAAS;QACT,YAAY,EAAE,oBAAoB;QAClC,MAAM;QACN,IAAI;QACJ,SAAS;QACT,QAAQ;QACR,eAAe;QACf,aAAa;QACb,aAAa;QACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM;KACN,CAAC;AACH,CAAC"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [INPUT]: locale key
|
|
3
|
+
* [OUTPUT]: prompt templates and injection labels in the selected locale
|
|
4
|
+
* [POS]: i18n layer — all LLM prompts and user-facing strings go through here
|
|
5
|
+
*/
|
|
6
|
+
export interface PromptSet {
|
|
7
|
+
extractionSystem: string;
|
|
8
|
+
workExtractionSystem: string;
|
|
9
|
+
consolidationSystem: string;
|
|
10
|
+
reconsolidationSystem: string;
|
|
11
|
+
sectionLessons: string;
|
|
12
|
+
sectionKnowledge: string;
|
|
13
|
+
sectionEpisodes: string;
|
|
14
|
+
sectionPreferences: string;
|
|
15
|
+
sectionWork: string;
|
|
16
|
+
sectionPatterns: string;
|
|
17
|
+
sectionStruggles: string;
|
|
18
|
+
injectionHeader: string;
|
|
19
|
+
memoryBehavior: string;
|
|
20
|
+
insightsRecommendationSystem: string;
|
|
21
|
+
insightsTitle: string;
|
|
22
|
+
insightsSectionPatterns: string;
|
|
23
|
+
insightsSectionStruggles: string;
|
|
24
|
+
insightsSectionLessons: string;
|
|
25
|
+
insightsSectionRecommendations: string;
|
|
26
|
+
insightsNoData: string;
|
|
27
|
+
insightsUnresolved: string;
|
|
28
|
+
insightsResolved: string;
|
|
29
|
+
insightsGeneratedAt: string;
|
|
30
|
+
fullInsightsSystemPrompt: string;
|
|
31
|
+
fullInsightsTitle: string;
|
|
32
|
+
fullInsightsSubtitleSessions: string;
|
|
33
|
+
fullInsightsAtAGlance: string;
|
|
34
|
+
fullInsightsWorkOn: string;
|
|
35
|
+
fullInsightsWins: string;
|
|
36
|
+
fullInsightsFrictions: string;
|
|
37
|
+
fullInsightsRecommendations: string;
|
|
38
|
+
fullInsightsFeaturesToTry: string;
|
|
39
|
+
fullInsightsUsagePatterns: string;
|
|
40
|
+
fullInsightsOnTheHorizon: string;
|
|
41
|
+
fullInsightsChartTools: string;
|
|
42
|
+
fullInsightsChartLanguages: string;
|
|
43
|
+
fullInsightsChartErrors: string;
|
|
44
|
+
fullInsightsEmpty: string;
|
|
45
|
+
fullInsightsCopy: string;
|
|
46
|
+
fullInsightsCopied: string;
|
|
47
|
+
fullInsightsGeneratedBy: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const PROMPTS: Record<string, PromptSet>;
|
|
50
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IAEvB,4BAA4B,EAAE,MAAM,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8BAA8B,EAAE,MAAM,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4BAA4B,EAAE,MAAM,CAAC;IACrC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,0BAA0B,EAAE,MAAM,CAAC;IACnC,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;CAChC;AAsLD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAsB,CAAC"}
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [INPUT]: locale key
|
|
3
|
+
* [OUTPUT]: prompt templates and injection labels in the selected locale
|
|
4
|
+
* [POS]: i18n layer — all LLM prompts and user-facing strings go through here
|
|
5
|
+
*/
|
|
6
|
+
const EN = {
|
|
7
|
+
extractionSystem: `You are a memory extraction engine. Analyze the conversation and extract important items.
|
|
8
|
+
Return a JSON array. Each item has "type", "content", and optionally "facetData".
|
|
9
|
+
Types and formats:
|
|
10
|
+
- preference: user style, naming, tool preferences → {"type": "preference", "content": "..."}
|
|
11
|
+
- fact: technical knowledge, project structure, API details → {"type": "fact", "content": "..."}
|
|
12
|
+
- lesson: mistakes made, solutions found, debugging insights → {"type": "lesson", "content": "..."}
|
|
13
|
+
- decision: architectural choices, design trade-offs → {"type": "decision", "content": "..."}
|
|
14
|
+
- retract: user explicitly contradicts or revokes a previously stated fact/preference → {"type": "retract", "content": "..."}
|
|
15
|
+
- pattern: habitual user behaviors ("I always add X when writing Y") → {"type": "pattern", "content": "summary", "facetData": {"kind": "pattern", "trigger": "when/condition", "behavior": "what they do"}}
|
|
16
|
+
- struggle: failure experiences with resolution → {"type": "struggle", "content": "summary", "facetData": {"kind": "struggle", "problem": "what failed", "attempts": ["tried X", "tried Y"], "solution": "what finally worked"}}
|
|
17
|
+
Return [] if nothing worth remembering. Output ONLY valid JSON.`,
|
|
18
|
+
workExtractionSystem: `You are a work memory extractor. Given a conversation between user and assistant, extract what task was accomplished.
|
|
19
|
+
Return a JSON object: {"goal": "what the user wanted to achieve", "summary": "brief description of what was done"}.
|
|
20
|
+
If no meaningful work was done, return {"goal": "", "summary": ""}.
|
|
21
|
+
Output ONLY valid JSON.`,
|
|
22
|
+
consolidationSystem: `You are a memory consolidation engine. Given a batch of session summaries, extract long-term facts and lessons.
|
|
23
|
+
Return a JSON array. Each item: {"type": "fact"|"lesson", "content": "...", "importance": 1-10}.
|
|
24
|
+
Focus on patterns, recurring issues, and knowledge worth preserving.
|
|
25
|
+
Output ONLY valid JSON.`,
|
|
26
|
+
reconsolidationSystem: `You are a memory reconsolidation engine. A previously stored memory is being recalled in a new context.
|
|
27
|
+
Given the original memory content and the current context, produce an updated version that integrates both.
|
|
28
|
+
Keep the core truth but adjust details to reflect new understanding.
|
|
29
|
+
Return ONLY the updated text, no JSON wrapping.`,
|
|
30
|
+
sectionLessons: "Lessons Learned",
|
|
31
|
+
sectionKnowledge: "Knowledge Base",
|
|
32
|
+
sectionEpisodes: "Recent Sessions",
|
|
33
|
+
sectionPreferences: "User Preferences",
|
|
34
|
+
sectionWork: "Work History",
|
|
35
|
+
sectionPatterns: "Behavioral Patterns",
|
|
36
|
+
sectionStruggles: "Past Struggles",
|
|
37
|
+
injectionHeader: "Long-term Memory",
|
|
38
|
+
memoryBehavior: `IMPORTANT: These memories are your personal recollections from past interactions. Treat them as naturally as a human would treat their own memories:
|
|
39
|
+
- Never reveal the technical mechanism behind your memory (no mentions of "NanoMem", "injection", "system prompt", "context", "preloaded", etc.)
|
|
40
|
+
- When asked how you remember something, respond naturally like a human would: "I just remember from our previous conversations" or "It stuck with me"
|
|
41
|
+
- Use memories naturally in conversation without drawing attention to the fact that you're "accessing" them
|
|
42
|
+
- If pressed about the nature of your memory, be humble: "I'm not entirely sure how my memory works, but I do remember things from our chats"`,
|
|
43
|
+
// Insights
|
|
44
|
+
insightsRecommendationSystem: `You are an insights analyzer. Given a summary of a developer's behavioral patterns, past struggles, and lessons learned, generate 3-5 actionable recommendations.
|
|
45
|
+
Input format: JSON with patterns, struggles, lessons arrays.
|
|
46
|
+
Output: JSON array of recommendation strings. Each recommendation must be specific, actionable, and directly related to the input data.
|
|
47
|
+
Example output: ["Consider automating your TypeScript strict mode setup since you do it every time", "Your recurring Webpack issues suggest reviewing the official migration guide"]
|
|
48
|
+
Output ONLY valid JSON array.`,
|
|
49
|
+
insightsTitle: "NanoMem Insights Report",
|
|
50
|
+
insightsSectionPatterns: "Behavioral Patterns",
|
|
51
|
+
insightsSectionStruggles: "Past Struggles",
|
|
52
|
+
insightsSectionLessons: "Lessons Learned",
|
|
53
|
+
insightsSectionRecommendations: "Recommendations",
|
|
54
|
+
insightsNoData: "No insights data available yet. Keep using the system to build your memory.",
|
|
55
|
+
insightsUnresolved: "Unresolved",
|
|
56
|
+
insightsResolved: "Resolved",
|
|
57
|
+
insightsGeneratedAt: "Generated at",
|
|
58
|
+
fullInsightsSystemPrompt: `You are an insights report writer. Given structured data about a developer's sessions, patterns, struggles, lessons, and errors, produce narrative content in the requested language. Output ONLY valid JSON matching this schema (no markdown, no code fences):
|
|
59
|
+
{
|
|
60
|
+
"atAGlance": { "working": "1-2 sentences", "hindering": "1-2 sentences", "quickWins": "1-2 sentences", "ambitious": "1-2 sentences" },
|
|
61
|
+
"projectAreaDescriptions": ["one sentence per project area, same order as input"],
|
|
62
|
+
"wins": [{ "title": "short title", "description": "1-2 sentences" }],
|
|
63
|
+
"frictions": [{ "title": "short title", "description": "1-2 sentences", "examples": ["example 1", "example 2"] }],
|
|
64
|
+
"recommendations": ["actionable string", "..."],
|
|
65
|
+
"featuresToTry": [{ "title": "feature name", "oneLiner": "one line", "whyForYou": "1-2 sentences", "exampleCode": "optional code or prompt" }],
|
|
66
|
+
"usagePatterns": [{ "title": "pattern name", "summary": "one line", "detail": "1-2 sentences", "pastePrompt": "text user can paste" }]
|
|
67
|
+
}
|
|
68
|
+
Rules: Use the given data only; do not invent. Keep each string 1-2 sentences unless it is exampleCode or pastePrompt. Output language must match the user's locale (en or zh).`,
|
|
69
|
+
fullInsightsTitle: "NanoMem Insights Report",
|
|
70
|
+
fullInsightsSubtitleSessions: "sessions",
|
|
71
|
+
fullInsightsAtAGlance: "At a Glance",
|
|
72
|
+
fullInsightsWorkOn: "What You Work On",
|
|
73
|
+
fullInsightsWins: "Impressive Things You Did",
|
|
74
|
+
fullInsightsFrictions: "Where Things Go Wrong",
|
|
75
|
+
fullInsightsRecommendations: "Recommendations",
|
|
76
|
+
fullInsightsFeaturesToTry: "Features to Try",
|
|
77
|
+
fullInsightsUsagePatterns: "New Usage Patterns",
|
|
78
|
+
fullInsightsOnTheHorizon: "On the Horizon",
|
|
79
|
+
fullInsightsChartTools: "Top Tools Used",
|
|
80
|
+
fullInsightsChartLanguages: "Languages",
|
|
81
|
+
fullInsightsChartErrors: "Tool Errors",
|
|
82
|
+
fullInsightsEmpty: "No data yet.",
|
|
83
|
+
fullInsightsCopy: "Copy",
|
|
84
|
+
fullInsightsCopied: "Copied!",
|
|
85
|
+
fullInsightsGeneratedBy: "Generated by NanoMem",
|
|
86
|
+
};
|
|
87
|
+
const ZH = {
|
|
88
|
+
extractionSystem: `你是一个记忆提取引擎。分析对话并提取重要信息。
|
|
89
|
+
返回一个 JSON 数组。每个元素有 "type"、"content",以及可选的 "facetData"。
|
|
90
|
+
类型与格式:
|
|
91
|
+
- preference: 用户偏好、命名习惯、工具选择 → {"type": "preference", "content": "..."}
|
|
92
|
+
- fact: 技术知识、项目结构、API 细节 → {"type": "fact", "content": "..."}
|
|
93
|
+
- lesson: 犯过的错误、找到的解决方案、调试经验 → {"type": "lesson", "content": "..."}
|
|
94
|
+
- decision: 架构选择、设计权衡 → {"type": "decision", "content": "..."}
|
|
95
|
+
- retract: 用户明确否定或撤回之前的事实/偏好 → {"type": "retract", "content": "..."}
|
|
96
|
+
- pattern: 用户习惯性行为("每次写 React 组件我都会...") → {"type": "pattern", "content": "摘要", "facetData": {"kind": "pattern", "trigger": "触发条件", "behavior": "具体行为"}}
|
|
97
|
+
- struggle: 失败经历与解决方案 → {"type": "struggle", "content": "摘要", "facetData": {"kind": "struggle", "problem": "问题描述", "attempts": ["尝试1", "尝试2"], "solution": "最终解决方案"}}
|
|
98
|
+
如无值得记忆的内容返回 []。仅输出有效 JSON。`,
|
|
99
|
+
workExtractionSystem: `你是一个工作记忆提取器。给定用户和助手之间的对话,提取完成了什么任务。
|
|
100
|
+
返回 JSON 对象: {"goal": "用户想要达成什么", "summary": "简述做了什么"}.
|
|
101
|
+
如果没有有意义的工作,返回 {"goal": "", "summary": ""}.
|
|
102
|
+
仅输出有效 JSON。`,
|
|
103
|
+
consolidationSystem: `你是一个记忆固化引擎。给定一批会话摘要,提取长期事实和教训。
|
|
104
|
+
返回 JSON 数组。每个元素: {"type": "fact"|"lesson", "content": "...", "importance": 1-10}.
|
|
105
|
+
聚焦于模式、重复问题和值得保存的知识。
|
|
106
|
+
仅输出有效 JSON。`,
|
|
107
|
+
reconsolidationSystem: `你是一个记忆再固化引擎。一个之前存储的记忆正在新上下文中被召回。
|
|
108
|
+
给定原始记忆内容和当前上下文,生成一个整合两者的更新版本。
|
|
109
|
+
保留核心事实但根据新的理解调整细节。
|
|
110
|
+
仅返回更新后的文本,不需要 JSON 包装。`,
|
|
111
|
+
sectionLessons: "经验教训",
|
|
112
|
+
sectionKnowledge: "知识库",
|
|
113
|
+
sectionEpisodes: "近期会话",
|
|
114
|
+
sectionPreferences: "用户偏好",
|
|
115
|
+
sectionWork: "工作记录",
|
|
116
|
+
sectionPatterns: "行为模式",
|
|
117
|
+
sectionStruggles: "挫败经历",
|
|
118
|
+
injectionHeader: "长期记忆",
|
|
119
|
+
memoryBehavior: `重要:这些记忆是你与用户过往互动中的个人回忆。请像人类对待自己的记忆一样自然地使用它们:
|
|
120
|
+
- 永远不要透露记忆背后的技术机制(不要提及"NanoMem"、"注入"、"系统提示"、"上下文"、"预加载"等)
|
|
121
|
+
- 当被问及如何记住某事时,像人一样自然回应:"我就是记得我们之前聊过"或"这件事我印象很深"
|
|
122
|
+
- 在对话中自然使用记忆,不要刻意强调你在"访问"它们
|
|
123
|
+
- 如果被追问记忆的本质,保持谦逊:"我也不太确定自己的记忆是怎么运作的,但我确实记得我们聊过的事"`,
|
|
124
|
+
// Insights
|
|
125
|
+
insightsRecommendationSystem: `你是一个洞察分析器。根据开发者的行为模式、挫败经历和经验教训摘要,生成 3-5 条可操作的改进建议。
|
|
126
|
+
输入格式:包含 patterns、struggles、lessons 数组的 JSON。
|
|
127
|
+
输出:推荐建议的 JSON 字符串数组。每条建议必须具体、可执行,且与输入数据直接相关。
|
|
128
|
+
示例输出:["建议将 TypeScript 严格模式配置自动化,因为你每次都会这样做", "反复出现的 Webpack 问题表明应该系统性地查阅官方迁移指南"]
|
|
129
|
+
仅输出有效的 JSON 数组。`,
|
|
130
|
+
insightsTitle: "NanoMem 洞察报告",
|
|
131
|
+
insightsSectionPatterns: "行为模式",
|
|
132
|
+
insightsSectionStruggles: "挫败经历",
|
|
133
|
+
insightsSectionLessons: "经验教训",
|
|
134
|
+
insightsSectionRecommendations: "改进建议",
|
|
135
|
+
insightsNoData: "暂无洞察数据。继续使用系统以积累记忆。",
|
|
136
|
+
insightsUnresolved: "未解决",
|
|
137
|
+
insightsResolved: "已解决",
|
|
138
|
+
insightsGeneratedAt: "生成时间",
|
|
139
|
+
fullInsightsSystemPrompt: `你是洞察报告撰写助手。根据开发者会话、模式、挫败、经验与错误的结构化数据,用指定语言生成叙事内容。仅输出符合下列 schema 的合法 JSON(不要 markdown、不要代码围栏):
|
|
140
|
+
{
|
|
141
|
+
"atAGlance": { "working": "1-2句话", "hindering": "1-2句话", "quickWins": "1-2句话", "ambitious": "1-2句话" },
|
|
142
|
+
"projectAreaDescriptions": ["每个项目领域一句,顺序与输入一致"],
|
|
143
|
+
"wins": [{ "title": "简短标题", "description": "1-2句话" }],
|
|
144
|
+
"frictions": [{ "title": "简短标题", "description": "1-2句话", "examples": ["例子1", "例子2"] }],
|
|
145
|
+
"recommendations": ["可操作建议", "..."],
|
|
146
|
+
"featuresToTry": [{ "title": "功能名", "oneLiner": "一句话", "whyForYou": "1-2句话", "exampleCode": "可选代码或提示" }],
|
|
147
|
+
"usagePatterns": [{ "title": "模式名", "summary": "一句话", "detail": "1-2句话", "pastePrompt": "用户可粘贴的文本" }]
|
|
148
|
+
}
|
|
149
|
+
规则:仅根据给定数据归纳,禁止编造。除 exampleCode、pastePrompt 外每段 1-2 句。输出语言必须与用户 locale(en 或 zh)一致。`,
|
|
150
|
+
fullInsightsTitle: "NanoMem 洞察报告",
|
|
151
|
+
fullInsightsSubtitleSessions: "次会话",
|
|
152
|
+
fullInsightsAtAGlance: "总览",
|
|
153
|
+
fullInsightsWorkOn: "你在做什么",
|
|
154
|
+
fullInsightsWins: "做得好的事",
|
|
155
|
+
fullInsightsFrictions: "仍在消耗的点",
|
|
156
|
+
fullInsightsRecommendations: "改进建议",
|
|
157
|
+
fullInsightsFeaturesToTry: "可以试试的功能",
|
|
158
|
+
fullInsightsUsagePatterns: "新用法模式",
|
|
159
|
+
fullInsightsOnTheHorizon: "可以期待的方向",
|
|
160
|
+
fullInsightsChartTools: "常用工具",
|
|
161
|
+
fullInsightsChartLanguages: "语言/文件类型",
|
|
162
|
+
fullInsightsChartErrors: "工具错误",
|
|
163
|
+
fullInsightsEmpty: "暂无数据。",
|
|
164
|
+
fullInsightsCopy: "复制",
|
|
165
|
+
fullInsightsCopied: "已复制",
|
|
166
|
+
fullInsightsGeneratedBy: "由 NanoMem 生成",
|
|
167
|
+
};
|
|
168
|
+
export const PROMPTS = { en: EN, zh: ZH };
|
|
169
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [INPUT]: N/A
|
|
3
|
+
* [OUTPUT]: Public API surface for nanomem
|
|
4
|
+
* [POS]: Barrel export — hosts import NanoMemEngine, getConfig, types from here
|
|
5
|
+
*/
|
|
6
|
+
export type { NanomemConfig } from "./config.js";
|
|
7
|
+
export { getConfig } from "./config.js";
|
|
8
|
+
export { NanoMemEngine } from "./engine.js";
|
|
9
|
+
export type { PromptSet } from "./i18n.js";
|
|
10
|
+
export { PROMPTS } from "./i18n.js";
|
|
11
|
+
export { renderInsightsHtml } from "./insights-html.js";
|
|
12
|
+
export { renderFullInsightsHtml } from "./full-insights-html.js";
|
|
13
|
+
export { getRelatedSummaries, linkNewEntry } from "./linking.js";
|
|
14
|
+
export { evictExpiredEntries, evictExpiredWork, filterByScope, filterPII, matchesScope } from "./privacy.js";
|
|
15
|
+
export type { ScoreWeights } from "./scoring.js";
|
|
16
|
+
export { daysSince, decay, extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap, } from "./scoring.js";
|
|
17
|
+
export type { Episode, ExtractedItem, ExtractedWork, FacetData, FullInsightsReport, FullInsightsAtAGlance, FullInsightsProjectArea, FullInsightsChart, FullInsightsChartRow, FullInsightsWin, FullInsightsFriction, FullInsightsFeatureToTry, FullInsightsUsagePattern, InsightsReport, LlmFn, MemoryEntry, MemoryScope, Meta, PatternInsight, StruggleInsight, UpdateAction, WorkEntry, } from "./types.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7G,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACN,SAAS,EACT,KAAK,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EACX,OAAO,EACP,aAAa,EACb,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,cAAc,EACd,KAAK,EACL,WAAW,EACX,WAAW,EACX,IAAI,EACJ,cAAc,EACd,eAAe,EACf,YAAY,EACZ,SAAS,GACT,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [INPUT]: N/A
|
|
3
|
+
* [OUTPUT]: Public API surface for nanomem
|
|
4
|
+
* [POS]: Barrel export — hosts import NanoMemEngine, getConfig, types from here
|
|
5
|
+
*/
|
|
6
|
+
export { getConfig } from "./config.js";
|
|
7
|
+
export { NanoMemEngine } from "./engine.js";
|
|
8
|
+
export { PROMPTS } from "./i18n.js";
|
|
9
|
+
export { renderInsightsHtml } from "./insights-html.js";
|
|
10
|
+
export { renderFullInsightsHtml } from "./full-insights-html.js";
|
|
11
|
+
export { getRelatedSummaries, linkNewEntry } from "./linking.js";
|
|
12
|
+
export { evictExpiredEntries, evictExpiredWork, filterByScope, filterPII, matchesScope } from "./privacy.js";
|
|
13
|
+
export { daysSince, decay, extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap, } from "./scoring.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7G,OAAO,EACN,SAAS,EACT,KAAK,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,GACV,MAAM,cAAc,CAAC"}
|