@grant-vine/wunderkind 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +156 -36
  3. package/agents/brand-builder.md +16 -2
  4. package/agents/ciso.md +23 -0
  5. package/agents/creative-director.md +14 -0
  6. package/agents/fullstack-wunderkind.md +16 -0
  7. package/agents/marketing-wunderkind.md +14 -0
  8. package/agents/operations-lead.md +15 -0
  9. package/agents/product-wunderkind.md +15 -0
  10. package/agents/qa-specialist.md +14 -0
  11. package/dist/agents/brand-builder.d.ts.map +1 -1
  12. package/dist/agents/brand-builder.js +17 -3
  13. package/dist/agents/brand-builder.js.map +1 -1
  14. package/dist/agents/ciso.d.ts.map +1 -1
  15. package/dist/agents/ciso.js +24 -1
  16. package/dist/agents/ciso.js.map +1 -1
  17. package/dist/agents/creative-director.d.ts.map +1 -1
  18. package/dist/agents/creative-director.js +15 -1
  19. package/dist/agents/creative-director.js.map +1 -1
  20. package/dist/agents/fullstack-wunderkind.d.ts.map +1 -1
  21. package/dist/agents/fullstack-wunderkind.js +17 -1
  22. package/dist/agents/fullstack-wunderkind.js.map +1 -1
  23. package/dist/agents/marketing-wunderkind.d.ts.map +1 -1
  24. package/dist/agents/marketing-wunderkind.js +15 -1
  25. package/dist/agents/marketing-wunderkind.js.map +1 -1
  26. package/dist/agents/operations-lead.d.ts.map +1 -1
  27. package/dist/agents/operations-lead.js +16 -1
  28. package/dist/agents/operations-lead.js.map +1 -1
  29. package/dist/agents/product-wunderkind.d.ts.map +1 -1
  30. package/dist/agents/product-wunderkind.js +16 -1
  31. package/dist/agents/product-wunderkind.js.map +1 -1
  32. package/dist/agents/qa-specialist.d.ts.map +1 -1
  33. package/dist/agents/qa-specialist.js +15 -1
  34. package/dist/agents/qa-specialist.js.map +1 -1
  35. package/dist/cli/cli-installer.d.ts.map +1 -1
  36. package/dist/cli/cli-installer.js +48 -4
  37. package/dist/cli/cli-installer.js.map +1 -1
  38. package/dist/cli/config-manager/index.d.ts +5 -3
  39. package/dist/cli/config-manager/index.d.ts.map +1 -1
  40. package/dist/cli/config-manager/index.js +160 -59
  41. package/dist/cli/config-manager/index.js.map +1 -1
  42. package/dist/cli/gitignore-manager.d.ts +8 -0
  43. package/dist/cli/gitignore-manager.d.ts.map +1 -0
  44. package/dist/cli/gitignore-manager.js +57 -0
  45. package/dist/cli/gitignore-manager.js.map +1 -0
  46. package/dist/cli/index.js +85 -9
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/memory-commands.d.ts +3 -0
  49. package/dist/cli/memory-commands.d.ts.map +1 -0
  50. package/dist/cli/memory-commands.js +138 -0
  51. package/dist/cli/memory-commands.js.map +1 -0
  52. package/dist/cli/tui-installer.d.ts +2 -1
  53. package/dist/cli/tui-installer.d.ts.map +1 -1
  54. package/dist/cli/tui-installer.js +385 -18
  55. package/dist/cli/tui-installer.js.map +1 -1
  56. package/dist/cli/types.d.ts +43 -0
  57. package/dist/cli/types.d.ts.map +1 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +26 -6
  60. package/dist/index.js.map +1 -1
  61. package/dist/memory/adapters/file.d.ts +21 -0
  62. package/dist/memory/adapters/file.d.ts.map +1 -0
  63. package/dist/memory/adapters/file.js +232 -0
  64. package/dist/memory/adapters/file.js.map +1 -0
  65. package/dist/memory/adapters/mem0.d.ts +37 -0
  66. package/dist/memory/adapters/mem0.d.ts.map +1 -0
  67. package/dist/memory/adapters/mem0.js +171 -0
  68. package/dist/memory/adapters/mem0.js.map +1 -0
  69. package/dist/memory/adapters/sqlite.d.ts +21 -0
  70. package/dist/memory/adapters/sqlite.d.ts.map +1 -0
  71. package/dist/memory/adapters/sqlite.js +198 -0
  72. package/dist/memory/adapters/sqlite.js.map +1 -0
  73. package/dist/memory/adapters/stub.d.ts +20 -0
  74. package/dist/memory/adapters/stub.d.ts.map +1 -0
  75. package/dist/memory/adapters/stub.js +58 -0
  76. package/dist/memory/adapters/stub.js.map +1 -0
  77. package/dist/memory/adapters/types.d.ts +45 -0
  78. package/dist/memory/adapters/types.d.ts.map +1 -0
  79. package/dist/memory/adapters/types.js +2 -0
  80. package/dist/memory/adapters/types.js.map +1 -0
  81. package/dist/memory/adapters/vector.d.ts +29 -0
  82. package/dist/memory/adapters/vector.d.ts.map +1 -0
  83. package/dist/memory/adapters/vector.js +347 -0
  84. package/dist/memory/adapters/vector.js.map +1 -0
  85. package/dist/memory/docker.d.ts +9 -0
  86. package/dist/memory/docker.d.ts.map +1 -0
  87. package/dist/memory/docker.js +43 -0
  88. package/dist/memory/docker.js.map +1 -0
  89. package/dist/memory/format.d.ts +5 -0
  90. package/dist/memory/format.d.ts.map +1 -0
  91. package/dist/memory/format.js +41 -0
  92. package/dist/memory/format.js.map +1 -0
  93. package/dist/memory/index.d.ts +19 -0
  94. package/dist/memory/index.d.ts.map +1 -0
  95. package/dist/memory/index.js +183 -0
  96. package/dist/memory/index.js.map +1 -0
  97. package/dist/memory/slug.d.ts +2 -0
  98. package/dist/memory/slug.d.ts.map +1 -0
  99. package/dist/memory/slug.js +40 -0
  100. package/dist/memory/slug.js.map +1 -0
  101. package/dist/memory/tools.d.ts +3 -0
  102. package/dist/memory/tools.d.ts.map +1 -0
  103. package/dist/memory/tools.js +84 -0
  104. package/dist/memory/tools.js.map +1 -0
  105. package/package.json +13 -3
  106. package/skills/memory-manager/SKILL.md +48 -0
@@ -1,16 +1,48 @@
1
1
  export type BooleanArg = "no" | "yes";
2
+ export type InstallScope = "global" | "project";
3
+ export type TeamCulture = "formal-strict" | "pragmatic-balanced" | "experimental-informal";
4
+ export type OrgStructure = "flat" | "hierarchical";
5
+ export type CisoPersonality = "paranoid-enforcer" | "pragmatic-risk-manager" | "educator-collaborator";
6
+ export type CtoPersonality = "grizzled-sysadmin" | "startup-bro" | "code-archaeologist";
7
+ export type CmoPersonality = "data-driven" | "brand-storyteller" | "growth-hacker";
8
+ export type QaPersonality = "rule-enforcer" | "risk-based-pragmatist" | "rubber-duck";
9
+ export type ProductPersonality = "user-advocate" | "velocity-optimizer" | "outcome-obsessed";
10
+ export type OpsPersonality = "on-call-veteran" | "efficiency-maximiser" | "process-purist";
11
+ export type CreativePersonality = "perfectionist-craftsperson" | "bold-provocateur" | "pragmatic-problem-solver";
12
+ export type BrandPersonality = "community-evangelist" | "pr-spinner" | "authentic-builder";
2
13
  export interface InstallArgs {
3
14
  tui: boolean;
15
+ scope: InstallScope;
4
16
  region?: string | undefined;
5
17
  industry?: string | undefined;
6
18
  primaryRegulation?: string | undefined;
7
19
  secondaryRegulation?: string | undefined;
20
+ teamCulture?: string | undefined;
21
+ orgStructure?: string | undefined;
22
+ cisoPersonality?: string | undefined;
23
+ ctoPersonality?: string | undefined;
24
+ cmoPersonality?: string | undefined;
25
+ qaPersonality?: string | undefined;
26
+ productPersonality?: string | undefined;
27
+ opsPersonality?: string | undefined;
28
+ creativePersonality?: string | undefined;
29
+ brandPersonality?: string | undefined;
8
30
  }
9
31
  export interface InstallConfig {
10
32
  region: string;
11
33
  industry: string;
12
34
  primaryRegulation: string;
13
35
  secondaryRegulation: string;
36
+ teamCulture: TeamCulture;
37
+ orgStructure: OrgStructure;
38
+ cisoPersonality: CisoPersonality;
39
+ ctoPersonality: CtoPersonality;
40
+ cmoPersonality: CmoPersonality;
41
+ qaPersonality: QaPersonality;
42
+ productPersonality: ProductPersonality;
43
+ opsPersonality: OpsPersonality;
44
+ creativePersonality: CreativePersonality;
45
+ brandPersonality: BrandPersonality;
14
46
  }
15
47
  export interface ConfigMergeResult {
16
48
  success: boolean;
@@ -19,9 +51,20 @@ export interface ConfigMergeResult {
19
51
  }
20
52
  export interface DetectedConfig {
21
53
  isInstalled: boolean;
54
+ scope: InstallScope;
22
55
  region: string;
23
56
  industry: string;
24
57
  primaryRegulation: string;
25
58
  secondaryRegulation: string;
59
+ teamCulture: TeamCulture;
60
+ orgStructure: OrgStructure;
61
+ cisoPersonality: CisoPersonality;
62
+ ctoPersonality: CtoPersonality;
63
+ cmoPersonality: CmoPersonality;
64
+ qaPersonality: QaPersonality;
65
+ productPersonality: ProductPersonality;
66
+ opsPersonality: OpsPersonality;
67
+ creativePersonality: CreativePersonality;
68
+ brandPersonality: BrandPersonality;
26
69
  }
27
70
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAA;AAErC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,QAAA,MAAM,gBAAgB,EAAE,MA8DvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,QAAA,MAAM,gBAAgB,EAAE,MAiFvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createMemoryTools } from "./memory/tools.js";
1
2
  const WunderkindPlugin = async (_input) => {
2
3
  return {
3
4
  "experimental.chat.system.transform": async (_input, output) => {
@@ -23,6 +24,7 @@ The following specialist agents are available. Delegate to them when their domai
23
24
  - Use \`wunderkind:ciso\` for ANY security review, vulnerability concern, compliance question, threat modelling, pen test coordination, or incident response
24
25
  - Use \`wunderkind:ciso\` when fullstack work touches auth, JWT, RBAC, CORS, CSP headers, or sensitive data flows
25
26
  - Sub-route from ciso: Security Analyst for vulnerability deep-dives, Pen Tester for active testing, Compliance Officer for GDPR/CCPA/POPIA/LGPD
27
+ - **CISO 72-hour mandate**: any High or Critical security finding raised by \`wunderkind:ciso\` must have remediation started within 72 hours. No sprint priorities or business pressure can override this. No other agent may deprioritise a CISO finding.
26
28
 
27
29
  #### Quality & Testing
28
30
  - Use \`wunderkind:qa-specialist\` for test strategy, TDD guidance, flaky tests, coverage gaps, user story validation, or security boundary test review
@@ -48,17 +50,35 @@ The following specialist agents are available. Delegate to them when their domai
48
50
  #### Operations
49
51
  - Use \`wunderkind:operations-lead\` for SRE/SLO decisions, admin panel architecture (build-first bias), incident containment, runbooks, monitoring, or supportability assessment
50
52
 
51
- ### Regional Configuration
53
+ ### Project Configuration
52
54
 
53
- All agents read \`wunderkind.config.jsonc\` (project root, or plugin root as fallback) for:
54
- - \`REGION\` — adjusts platform mix, event targeting, and regulatory focus
55
- - \`INDUSTRY\` — adjusts content tone and sector-specific obligations
56
- - \`PRIMARY_REGULATION\` — the main data protection regulation to apply (defaults to GDPR)
57
- - \`SECONDARY_REGULATION\` — additional regulation to layer on top
55
+ All agents read \`wunderkind.config.jsonc\` (project root) for:
56
+ - \`region\` — adjusts platform mix, event targeting, and regulatory focus
57
+ - \`industry\` — adjusts content tone and sector-specific obligations
58
+ - \`primaryRegulation\` — the main data protection regulation to apply (defaults to GDPR)
59
+ - \`secondaryRegulation\` — additional regulation to layer on top
60
+ - \`teamCulture\` — communication style baseline: \`formal-strict\` | \`pragmatic-balanced\` | \`experimental-informal\`
61
+ - \`orgStructure\` — \`flat\` (peer escalation) | \`hierarchical\` (CISO has hard veto on security)
62
+ - \`cisoPersonality\`, \`ctoPersonality\`, \`cmoPersonality\`, \`qaPersonality\`, \`productPersonality\`, \`opsPersonality\`, \`creativePersonality\`, \`brandPersonality\` — character archetypes per agent
58
63
 
59
64
  If the file is absent or fields are blank, agents default to global best practices.
65
+
66
+ ### Agent Memory
67
+
68
+ Each agent maintains a memory file at \`.wunderkind/memory/<agent-name>.md\` in the project root. These files accumulate project-specific knowledge over time. Agents read their own memory file at the start of relevant tasks. If the file does not exist, agents begin with a clean slate and may create it as they learn.
69
+
70
+ Memory files:
71
+ - \`.wunderkind/memory/ciso.md\`
72
+ - \`.wunderkind/memory/fullstack-wunderkind.md\`
73
+ - \`.wunderkind/memory/marketing-wunderkind.md\`
74
+ - \`.wunderkind/memory/creative-director.md\`
75
+ - \`.wunderkind/memory/product-wunderkind.md\`
76
+ - \`.wunderkind/memory/brand-builder.md\`
77
+ - \`.wunderkind/memory/qa-specialist.md\`
78
+ - \`.wunderkind/memory/operations-lead.md\`
60
79
  `.trim());
61
80
  },
81
+ tool: createMemoryTools(),
62
82
  };
63
83
  };
64
84
  export { WunderkindPlugin as default };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAW,KAAK,EAAE,MAAM,EAAE,EAAE;IAChD,OAAO;QACL,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDxB,CAAC,IAAI,EAAE,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,gBAAgB,GAAW,KAAK,EAAE,MAAM,EAAE,EAAE;IAChD,OAAO;QACL,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ExB,CAAC,IAAI,EAAE,CAAC,CAAC;QACN,CAAC;QACD,IAAI,EAAE,iBAAiB,EAAE;KAC1B,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { HistoryEntry, MemoryAdapter, MemoryCount, MemoryEntry, StaleAnalysis } from "./types.js";
2
+ export declare class FileAdapter implements MemoryAdapter {
3
+ #private;
4
+ constructor(projectDir: string);
5
+ read(agent: string): Promise<MemoryEntry[]>;
6
+ write(agent: string, entry: Omit<MemoryEntry, "id">): Promise<MemoryEntry>;
7
+ update(id: string, content: string): Promise<MemoryEntry>;
8
+ delete(id: string): Promise<void>;
9
+ deleteAll(agent: string): Promise<void>;
10
+ search(agent: string, query: string): Promise<MemoryEntry[]>;
11
+ history(_id: string): Promise<HistoryEntry[]>;
12
+ analyzeStale(agent: string): Promise<StaleAnalysis>;
13
+ prune(agent: string, idsToRemove: string[]): Promise<number>;
14
+ count(agent: string): Promise<MemoryCount>;
15
+ listAgents(): Promise<string[]>;
16
+ status(): Promise<{
17
+ ok: boolean;
18
+ message: string;
19
+ }>;
20
+ }
21
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/memory/adapters/file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAItG,qBAAa,WAAY,YAAW,aAAa;;gBAGnC,UAAU,EAAE,MAAM;IAIxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAa3C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA2B1E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAW5D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI7C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKnD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgB1C,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAa/B,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAmH3D"}
@@ -0,0 +1,232 @@
1
+ import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { analyzeStale, generateId, generateSlug } from "../format.js";
4
+ const FRONTMATTER = "---";
5
+ export class FileAdapter {
6
+ #memoryDir;
7
+ constructor(projectDir) {
8
+ this.#memoryDir = path.join(projectDir, ".wunderkind", "memory");
9
+ }
10
+ async read(agent) {
11
+ const filePath = this.#getPath(agent);
12
+ try {
13
+ const content = await readFile(filePath, "utf-8");
14
+ return this.#parseEntries(agent, content);
15
+ }
16
+ catch (err) {
17
+ if (isErrnoError(err) && err.code === "ENOENT") {
18
+ return [];
19
+ }
20
+ throw err;
21
+ }
22
+ }
23
+ async write(agent, entry) {
24
+ const filePath = this.#getPath(agent);
25
+ await mkdir(this.#memoryDir, { recursive: true });
26
+ const id = generateId();
27
+ const slug = entry.slug.trim().length > 0 ? entry.slug : generateSlug(entry.content);
28
+ const createdAt = entry.createdAt;
29
+ const date = formatDate(createdAt);
30
+ const section = this.#formatSection({ ...entry, id, slug }, date);
31
+ let existing = "";
32
+ try {
33
+ existing = await readFile(filePath, "utf-8");
34
+ }
35
+ catch (err) {
36
+ if (!isErrnoError(err) || err.code !== "ENOENT") {
37
+ throw err;
38
+ }
39
+ }
40
+ if (existing.trim().length === 0) {
41
+ const header = this.#frontmatter(agent);
42
+ await writeFile(filePath, `${header}\n\n${section}`, "utf-8");
43
+ return { ...entry, id, slug };
44
+ }
45
+ await writeFile(filePath, `${existing.trim()}\n\n${section}`, "utf-8");
46
+ return { ...entry, id, slug };
47
+ }
48
+ async update(id, content) {
49
+ const entry = await this.#updateEntry(id, content);
50
+ return entry;
51
+ }
52
+ async delete(id) {
53
+ await this.#removeEntry(id);
54
+ }
55
+ async deleteAll(agent) {
56
+ await mkdir(this.#memoryDir, { recursive: true });
57
+ const filePath = this.#getPath(agent);
58
+ await writeFile(filePath, this.#frontmatter(agent), "utf-8");
59
+ }
60
+ async search(agent, query) {
61
+ const entries = await this.read(agent);
62
+ const needle = query.toLowerCase();
63
+ return entries.filter((entry) => {
64
+ return (entry.content.toLowerCase().includes(needle) ||
65
+ entry.slug.toLowerCase().includes(needle));
66
+ });
67
+ }
68
+ async history(_id) {
69
+ return [];
70
+ }
71
+ async analyzeStale(agent) {
72
+ const entries = await this.read(agent);
73
+ return analyzeStale(entries);
74
+ }
75
+ async prune(agent, idsToRemove) {
76
+ const entries = await this.read(agent);
77
+ const ids = new Set(idsToRemove);
78
+ const kept = entries.filter((entry) => !ids.has(entry.id));
79
+ const removed = entries.length - kept.length;
80
+ await this.#writeAll(agent, kept);
81
+ return removed;
82
+ }
83
+ async count(agent) {
84
+ const entries = await this.read(agent);
85
+ if (entries.length === 0) {
86
+ return { total: 0, pinned: 0, oldest: 0, newest: 0 };
87
+ }
88
+ let pinned = 0;
89
+ let oldest = entries[0]?.createdAt ?? 0;
90
+ let newest = entries[0]?.createdAt ?? 0;
91
+ for (const entry of entries) {
92
+ if (entry.pinned)
93
+ pinned += 1;
94
+ if (entry.createdAt < oldest)
95
+ oldest = entry.createdAt;
96
+ if (entry.createdAt > newest)
97
+ newest = entry.createdAt;
98
+ }
99
+ return { total: entries.length, pinned, oldest, newest };
100
+ }
101
+ async listAgents() {
102
+ let files = [];
103
+ try {
104
+ files = await readdir(this.#memoryDir);
105
+ }
106
+ catch (err) {
107
+ if (isErrnoError(err) && err.code === "ENOENT") {
108
+ return [];
109
+ }
110
+ throw err;
111
+ }
112
+ return files.filter((f) => f.endsWith(".md")).map((f) => f.slice(0, -3)).sort();
113
+ }
114
+ async status() {
115
+ return { ok: true, message: "file adapter ready" };
116
+ }
117
+ #getPath(agent) {
118
+ return path.join(this.#memoryDir, `${agent}.md`);
119
+ }
120
+ #frontmatter(agent) {
121
+ const date = formatDate(Date.now());
122
+ return [FRONTMATTER, `agent: ${agent}`, `compacted: ${date}`, FRONTMATTER].join("\n");
123
+ }
124
+ #formatSection(entry, date) {
125
+ const pinnedLine = entry.pinned ? "\n> pinned" : "";
126
+ return `## [${date}] ${entry.slug}\nid: ${entry.id}\n${entry.content}${pinnedLine}`;
127
+ }
128
+ #parseEntries(agent, content) {
129
+ const sections = content.split(/\n## /).slice(1);
130
+ const entries = [];
131
+ for (const section of sections) {
132
+ const lines = section.split("\n");
133
+ const header = lines[0];
134
+ if (!header)
135
+ continue;
136
+ const headingMatch = header.match(/^\[(\d{4}-\d{2}-\d{2})\]\s+(.+)$/);
137
+ if (!headingMatch)
138
+ continue;
139
+ const [, dateText, slugText] = headingMatch;
140
+ if (!dateText || !slugText)
141
+ continue;
142
+ const idLine = lines.find((line) => line.startsWith("id: "));
143
+ if (!idLine)
144
+ continue;
145
+ const id = idLine.replace("id: ", "").trim();
146
+ const pinned = lines.some((line) => line.trim() === "> pinned");
147
+ const contentLines = lines.filter((line) => {
148
+ return line !== header && !line.startsWith("id: ") && line.trim() !== "> pinned";
149
+ });
150
+ const entryContent = contentLines.join("\n").trim();
151
+ const createdAt = new Date(dateText).getTime();
152
+ entries.push({
153
+ id,
154
+ agent,
155
+ slug: slugText,
156
+ content: entryContent,
157
+ createdAt,
158
+ pinned,
159
+ metadata: {},
160
+ });
161
+ }
162
+ return entries;
163
+ }
164
+ async #writeAll(agent, entries) {
165
+ await mkdir(this.#memoryDir, { recursive: true });
166
+ const filePath = this.#getPath(agent);
167
+ if (entries.length === 0) {
168
+ await writeFile(filePath, this.#frontmatter(agent), "utf-8");
169
+ return;
170
+ }
171
+ const header = this.#frontmatter(agent);
172
+ const body = entries
173
+ .map((entry) => {
174
+ const date = formatDate(entry.createdAt);
175
+ return this.#formatSection(entry, date);
176
+ })
177
+ .join("\n\n");
178
+ await writeFile(filePath, `${header}\n\n${body}`, "utf-8");
179
+ }
180
+ async #updateEntry(id, content) {
181
+ const agent = await this.#findAgent(id);
182
+ if (!agent) {
183
+ throw new Error(`Memory entry not found: ${id}`);
184
+ }
185
+ const entries = await this.read(agent);
186
+ const next = entries.map((entry) => entry.id === id ? { ...entry, content } : entry);
187
+ await this.#writeAll(agent, next);
188
+ const updated = next.find((entry) => entry.id === id);
189
+ if (!updated) {
190
+ throw new Error(`Memory entry not found: ${id}`);
191
+ }
192
+ return updated;
193
+ }
194
+ async #removeEntry(id) {
195
+ const agent = await this.#findAgent(id);
196
+ if (!agent) {
197
+ return;
198
+ }
199
+ const entries = await this.read(agent);
200
+ const filtered = entries.filter((entry) => entry.id !== id);
201
+ await this.#writeAll(agent, filtered);
202
+ }
203
+ async #findAgent(id) {
204
+ let files = [];
205
+ try {
206
+ files = await readdir(this.#memoryDir);
207
+ }
208
+ catch (err) {
209
+ if (isErrnoError(err) && err.code === "ENOENT") {
210
+ return null;
211
+ }
212
+ throw err;
213
+ }
214
+ for (const file of files) {
215
+ if (!file.endsWith(".md"))
216
+ continue;
217
+ const agent = file.slice(0, -3);
218
+ const entries = await this.read(agent);
219
+ if (entries.some((entry) => entry.id === id)) {
220
+ return agent;
221
+ }
222
+ }
223
+ return null;
224
+ }
225
+ }
226
+ function isErrnoError(err) {
227
+ return typeof err === "object" && err !== null && "code" in err;
228
+ }
229
+ function formatDate(timestamp) {
230
+ return new Date(timestamp).toISOString().slice(0, 10);
231
+ }
232
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/memory/adapters/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { HistoryEntry, MemoryAdapter, MemoryCount, MemoryEntry, StaleAnalysis } from "./types.js";
2
+ export interface Mem0AdapterConfig {
3
+ url: string;
4
+ projectSlug: string;
5
+ llmProvider?: string;
6
+ llmModel?: string;
7
+ llmBaseUrl?: string;
8
+ embedProvider?: string;
9
+ embedModel?: string;
10
+ embedDims?: number;
11
+ embedBaseUrl?: string;
12
+ vectorStore?: string;
13
+ vectorStoreHost?: string;
14
+ vectorStorePort?: number;
15
+ vectorStoreCollection?: string;
16
+ graphEnabled?: boolean;
17
+ }
18
+ export declare class Mem0Adapter implements MemoryAdapter {
19
+ #private;
20
+ constructor(config: Mem0AdapterConfig);
21
+ write(agent: string, entry: Omit<MemoryEntry, "id">): Promise<MemoryEntry>;
22
+ read(agent: string): Promise<MemoryEntry[]>;
23
+ update(id: string, content: string): Promise<MemoryEntry>;
24
+ delete(id: string): Promise<void>;
25
+ deleteAll(agent: string): Promise<void>;
26
+ search(agent: string, query: string): Promise<MemoryEntry[]>;
27
+ history(id: string): Promise<HistoryEntry[]>;
28
+ analyzeStale(agent: string): Promise<StaleAnalysis>;
29
+ prune(_agent: string, idsToRemove: string[]): Promise<number>;
30
+ count(agent: string): Promise<MemoryCount>;
31
+ listAgents(): Promise<string[]>;
32
+ status(): Promise<{
33
+ ok: boolean;
34
+ message: string;
35
+ }>;
36
+ }
37
+ //# sourceMappingURL=mem0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem0.d.ts","sourceRoot":"","sources":["../../../src/memory/adapters/mem0.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEtG,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAmGD,qBAAa,WAAY,YAAW,aAAa;;gBAMnC,MAAM,EAAE,iBAAiB;IAa/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAqB1E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM3C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAS5C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKnD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAS7D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgB1C,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAyB1D"}
@@ -0,0 +1,171 @@
1
+ import { Memory } from "mem0ai/oss";
2
+ import { analyzeStale, generateId, generateSlug } from "../format.js";
3
+ function buildMem0Config(cfg) {
4
+ const result = {};
5
+ if (cfg.llmProvider) {
6
+ const llmConfig = {
7
+ provider: cfg.llmProvider,
8
+ config: { model: cfg.llmModel ?? "llama3.1" },
9
+ };
10
+ if (cfg.llmBaseUrl) {
11
+ llmConfig.config.ollama_base_url = cfg.llmBaseUrl;
12
+ }
13
+ result.llm = llmConfig;
14
+ }
15
+ if (cfg.embedProvider) {
16
+ const embedConfig = {
17
+ provider: cfg.embedProvider,
18
+ config: { model: cfg.embedModel ?? "nomic-embed-text" },
19
+ };
20
+ if (cfg.embedDims) {
21
+ embedConfig.config.embedding_dims = cfg.embedDims;
22
+ }
23
+ if (cfg.embedBaseUrl) {
24
+ embedConfig.config.ollama_base_url = cfg.embedBaseUrl;
25
+ }
26
+ result.embedder = embedConfig;
27
+ }
28
+ if (cfg.vectorStore && cfg.vectorStore !== "memory") {
29
+ const vsConfig = {
30
+ provider: cfg.vectorStore,
31
+ config: {},
32
+ };
33
+ if (cfg.vectorStoreCollection) {
34
+ vsConfig.config.collection_name = cfg.vectorStoreCollection;
35
+ }
36
+ if (cfg.vectorStoreHost) {
37
+ vsConfig.config.host = cfg.vectorStoreHost;
38
+ }
39
+ if (cfg.vectorStorePort) {
40
+ vsConfig.config.port = cfg.vectorStorePort;
41
+ }
42
+ if (cfg.embedDims) {
43
+ vsConfig.config.embedding_model_dims = cfg.embedDims;
44
+ }
45
+ result.vector_store = vsConfig;
46
+ }
47
+ return result;
48
+ }
49
+ export class Mem0Adapter {
50
+ #memory;
51
+ #url;
52
+ #projectSlug;
53
+ #knownAgents;
54
+ constructor(config) {
55
+ this.#url = config.url;
56
+ this.#projectSlug = config.projectSlug;
57
+ this.#knownAgents = new Set();
58
+ const mem0Config = buildMem0Config(config);
59
+ const hasConfig = Object.keys(mem0Config).length > 0;
60
+ this.#memory = hasConfig ? Memory.fromConfig(mem0Config) : new Memory();
61
+ }
62
+ #scopedAgent(agent) {
63
+ return `${this.#projectSlug}:${agent}`;
64
+ }
65
+ async write(agent, entry) {
66
+ this.#knownAgents.add(agent);
67
+ const result = await this.#memory.add([{ role: "user", content: entry.content }], { agentId: this.#scopedAgent(agent), infer: false, metadata: entry.metadata });
68
+ const item = result.results[0];
69
+ if (!item) {
70
+ return {
71
+ id: generateId(),
72
+ agent,
73
+ slug: entry.slug,
74
+ content: entry.content,
75
+ createdAt: entry.createdAt,
76
+ pinned: entry.pinned,
77
+ metadata: entry.metadata,
78
+ };
79
+ }
80
+ return this.#mapItem(item, agent);
81
+ }
82
+ async read(agent) {
83
+ this.#knownAgents.add(agent);
84
+ const result = await this.#memory.getAll({ agentId: this.#scopedAgent(agent) });
85
+ return result.results.map((item) => this.#mapItem(item, agent));
86
+ }
87
+ async update(id, content) {
88
+ await this.#memory.update(id, content);
89
+ const item = await this.#memory.get(id);
90
+ const entry = this.#mapItem(item, "");
91
+ return { ...entry, id };
92
+ }
93
+ async delete(id) {
94
+ await this.#memory.delete(id);
95
+ }
96
+ async deleteAll(agent) {
97
+ await this.#memory.deleteAll({ agentId: this.#scopedAgent(agent) });
98
+ }
99
+ async search(agent, query) {
100
+ const result = await this.#memory.search(query, { agentId: this.#scopedAgent(agent) });
101
+ return result.results.map((item) => this.#mapItem(item, agent));
102
+ }
103
+ async history(id) {
104
+ const result = await this.#memory.history(id);
105
+ return result.map((item) => ({
106
+ action: item.event ?? "",
107
+ value: item.new_memory ?? "",
108
+ timestamp: item.created_at ? new Date(item.created_at).getTime() : Date.now(),
109
+ }));
110
+ }
111
+ async analyzeStale(agent) {
112
+ const entries = await this.read(agent);
113
+ return analyzeStale(entries);
114
+ }
115
+ async prune(_agent, idsToRemove) {
116
+ let removed = 0;
117
+ for (const id of idsToRemove) {
118
+ await this.#memory.delete(id);
119
+ removed += 1;
120
+ }
121
+ return removed;
122
+ }
123
+ async count(agent) {
124
+ const entries = await this.read(agent);
125
+ if (entries.length === 0) {
126
+ return { total: 0, pinned: 0, oldest: 0, newest: 0 };
127
+ }
128
+ let pinned = 0;
129
+ let oldest = entries[0]?.createdAt ?? 0;
130
+ let newest = entries[0]?.createdAt ?? 0;
131
+ for (const entry of entries) {
132
+ if (entry.pinned)
133
+ pinned += 1;
134
+ if (entry.createdAt < oldest)
135
+ oldest = entry.createdAt;
136
+ if (entry.createdAt > newest)
137
+ newest = entry.createdAt;
138
+ }
139
+ return { total: entries.length, pinned, oldest, newest };
140
+ }
141
+ async listAgents() {
142
+ return Array.from(this.#knownAgents).sort();
143
+ }
144
+ async status() {
145
+ try {
146
+ const res = await fetch(`${this.#url}/health`);
147
+ if (res.ok)
148
+ return { ok: true, message: "mem0 adapter ready" };
149
+ return { ok: false, message: `mem0 returned HTTP ${res.status}` };
150
+ }
151
+ catch (err) {
152
+ const message = err instanceof Error ? err.message : String(err);
153
+ return { ok: false, message };
154
+ }
155
+ }
156
+ #mapItem(item, agent) {
157
+ const id = item.id ?? generateId();
158
+ const content = item.memory ?? "";
159
+ const createdAt = item.createdAt ? new Date(item.createdAt).getTime() : Date.now();
160
+ return {
161
+ id,
162
+ agent,
163
+ slug: generateSlug(content),
164
+ content,
165
+ createdAt,
166
+ pinned: false,
167
+ metadata: item.metadata ?? {},
168
+ };
169
+ }
170
+ }
171
+ //# sourceMappingURL=mem0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem0.js","sourceRoot":"","sources":["../../../src/memory/adapters/mem0.ts"],"names":[],"mappings":"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"}