wave-agent-sdk 0.17.4 → 0.17.6

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 (42) hide show
  1. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  2. package/dist/managers/MemoryRuleManager.js +30 -13
  3. package/dist/managers/hookManager.d.ts.map +1 -1
  4. package/dist/managers/hookManager.js +3 -1
  5. package/dist/managers/lspManager.d.ts.map +1 -1
  6. package/dist/managers/lspManager.js +12 -4
  7. package/dist/managers/mcpManager.d.ts.map +1 -1
  8. package/dist/managers/mcpManager.js +13 -6
  9. package/dist/managers/skillManager.d.ts +3 -0
  10. package/dist/managers/skillManager.d.ts.map +1 -1
  11. package/dist/managers/skillManager.js +69 -54
  12. package/dist/services/MarketplaceService.d.ts +15 -0
  13. package/dist/services/MarketplaceService.d.ts.map +1 -1
  14. package/dist/services/MarketplaceService.js +95 -6
  15. package/dist/services/memory.d.ts.map +1 -1
  16. package/dist/services/memory.js +39 -5
  17. package/dist/services/pluginLoader.d.ts.map +1 -1
  18. package/dist/services/pluginLoader.js +30 -7
  19. package/dist/types/marketplace.d.ts +1 -0
  20. package/dist/types/marketplace.d.ts.map +1 -1
  21. package/dist/types/skills.d.ts +1 -0
  22. package/dist/types/skills.d.ts.map +1 -1
  23. package/dist/utils/customCommands.d.ts.map +1 -1
  24. package/dist/utils/customCommands.js +11 -9
  25. package/dist/utils/skillParser.d.ts.map +1 -1
  26. package/dist/utils/skillParser.js +3 -1
  27. package/dist/utils/subagentParser.d.ts.map +1 -1
  28. package/dist/utils/subagentParser.js +18 -7
  29. package/package.json +1 -1
  30. package/src/managers/MemoryRuleManager.ts +29 -14
  31. package/src/managers/hookManager.ts +6 -1
  32. package/src/managers/lspManager.ts +23 -5
  33. package/src/managers/mcpManager.ts +24 -7
  34. package/src/managers/skillManager.ts +90 -57
  35. package/src/services/MarketplaceService.ts +152 -6
  36. package/src/services/memory.ts +43 -6
  37. package/src/services/pluginLoader.ts +35 -7
  38. package/src/types/marketplace.ts +1 -0
  39. package/src/types/skills.ts +1 -0
  40. package/src/utils/customCommands.ts +17 -12
  41. package/src/utils/skillParser.ts +3 -1
  42. package/src/utils/subagentParser.ts +22 -8
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAGzB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,wBAAwB;IAMnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBtB,aAAa;YAyDb,YAAY;IAsB1B;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
1
+ {"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAGzB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,wBAAwB;IAMnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBtB,aAAa;YAyDb,YAAY;IAkC1B;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
@@ -17,19 +17,22 @@ export class MemoryRuleManager {
17
17
  * Scans .wave/rules and ~/.wave/rules for memory rule files.
18
18
  */
19
19
  async discoverRules() {
20
- const projectRulesDir = path.join(this.workdir, ".wave", "rules");
21
- const userRulesDir = path.join(os.homedir(), ".wave", "rules");
20
+ const projectWaveRulesDir = path.join(this.workdir, ".wave", "rules");
21
+ const projectClaudeRulesDir = path.join(this.workdir, ".claude", "rules");
22
+ const userWaveRulesDir = path.join(os.homedir(), ".wave", "rules");
23
+ const userClaudeRulesDir = path.join(os.homedir(), ".claude", "rules");
22
24
  logger.debug(`Scanning for modular memory rules...`);
23
- logger.debug(` User rules directory: ${userRulesDir}`);
24
- logger.debug(` Project rules directory: ${projectRulesDir}`);
25
+ logger.debug(` User rules directory: ${userWaveRulesDir}`);
26
+ logger.debug(` Project rules directory: ${projectWaveRulesDir}`);
25
27
  const newRules = {};
26
- // Discover user rules first, then project rules so project rules can override if needed
27
- // (though IDs are based on file path, so they shouldn't collide unless same path)
28
- await this.scanDirectory(userRulesDir, "user", newRules);
29
- await this.scanDirectory(projectRulesDir, "project", newRules);
28
+ // Scan order: userClaude userWave projectClaude projectWave
29
+ // Later writes override, so .wave takes priority over .claude
30
+ await this.scanDirectory(userClaudeRulesDir, "user", newRules);
31
+ await this.scanDirectory(userWaveRulesDir, "user", newRules);
32
+ await this.scanDirectory(projectClaudeRulesDir, "project", newRules);
33
+ await this.scanDirectory(projectWaveRulesDir, "project", newRules);
30
34
  this.state.rules = newRules;
31
35
  const ruleCount = Object.keys(newRules).length;
32
- // Removed verbose logging of all discovered rules
33
36
  logger.debug(`Discovered ${ruleCount} modular memory rules`);
34
37
  }
35
38
  async scanDirectory(dir, source, registry, visited = new Set()) {
@@ -83,10 +86,24 @@ export class MemoryRuleManager {
83
86
  try {
84
87
  const content = await fs.readFile(filePath, "utf-8");
85
88
  const rule = this.service.parseRule(content, filePath, source);
86
- // Use relative path from rules root as ID to allow project rules to override user rules
87
- const rulesRoot = source === "project"
88
- ? path.join(this.workdir, ".wave", "rules")
89
- : path.join(os.homedir(), ".wave", "rules");
89
+ // Determine rulesRoot dynamically based on actual file path
90
+ let rulesRoot;
91
+ if (source === "project") {
92
+ if (filePath.includes(path.join(".claude", "rules"))) {
93
+ rulesRoot = path.join(this.workdir, ".claude", "rules");
94
+ }
95
+ else {
96
+ rulesRoot = path.join(this.workdir, ".wave", "rules");
97
+ }
98
+ }
99
+ else {
100
+ if (filePath.includes(path.join(".claude", "rules"))) {
101
+ rulesRoot = path.join(os.homedir(), ".claude", "rules");
102
+ }
103
+ else {
104
+ rulesRoot = path.join(os.homedir(), ".wave", "rules");
105
+ }
106
+ }
90
107
  const relativeId = path.relative(rulesRoot, filePath);
91
108
  rule.id = relativeId;
92
109
  registry[rule.id] = rule;
@@ -1 +1 @@
1
- {"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"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"}
@@ -118,12 +118,14 @@ export class HookManager {
118
118
  env: {
119
119
  ...("env" in context ? (context.env ?? {}) : {}),
120
120
  WAVE_PLUGIN_ROOT: hookCommand.pluginRoot,
121
+ CLAUDE_PLUGIN_ROOT: hookCommand.pluginRoot,
121
122
  },
122
123
  }
123
124
  : context;
124
- // Substitute ${WAVE_PLUGIN_ROOT} in the command string (same pattern as Claude Code)
125
+ // Substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT} in the command string
125
126
  if (hookCommand.pluginRoot) {
126
127
  command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, hookCommand.pluginRoot);
128
+ command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, hookCommand.pluginRoot);
127
129
  }
128
130
  if (hookCommand.async) {
129
131
  // Execute async command without awaiting
@@ -1 +1 @@
1
- {"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,qBAAa,UAAW,YAAW,WAAW;IAKhC,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEX,SAAS,EAAE,SAAS;IAElC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;IAqHzB,OAAO,CAAC,aAAa;YAiBP,WAAW;YA0CX,gBAAgB;IAgBxB,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoJ5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B"}
1
+ {"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,qBAAa,UAAW,YAAW,WAAW;IAKhC,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEX,SAAS,EAAE,SAAS;IAElC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;IAuIzB,OAAO,CAAC,aAAa;YAiBP,WAAW;YA0CX,gBAAgB;IAgBxB,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoJ5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B"}
@@ -57,17 +57,25 @@ export class LspManager {
57
57
  logger?.info(`Starting LSP server for ${language}: ${config.command} ${config.args?.join(" ") || ""}`);
58
58
  try {
59
59
  const env = { ...process.env, ...config.env };
60
- // For plugin servers, substitute ${WAVE_PLUGIN_ROOT} in command/args/env
60
+ // For plugin servers, substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
61
61
  let command = config.command;
62
62
  let args = config.args || [];
63
63
  if (config.pluginRoot) {
64
64
  env.WAVE_PLUGIN_ROOT = config.pluginRoot;
65
+ env.CLAUDE_PLUGIN_ROOT = config.pluginRoot;
65
66
  command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
66
- args = args.map((arg) => arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot));
67
- // Also expand WAVE_PLUGIN_ROOT in user-provided env values
67
+ command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
68
+ args = args.map((arg) => {
69
+ let result = arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
70
+ result = result.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
71
+ return result;
72
+ });
73
+ // Also expand plugin root in user-provided env values
68
74
  if (config.env) {
69
75
  for (const [key, value] of Object.entries(config.env)) {
70
- env[key] = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
76
+ let expanded = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
77
+ expanded = expanded.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
78
+ env[key] = expanded;
71
79
  }
72
80
  }
73
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { logger } from "../utils/globalLogger.js";
10
10
  * Expand environment variables in a string value.
11
11
  * Supports ${VAR} and ${VAR:-default} patterns.
12
12
  */
13
- const WAVE_TEMPLATE_VARS = ["WAVE_PLUGIN_ROOT"];
13
+ const WAVE_TEMPLATE_VARS = ["WAVE_PLUGIN_ROOT", "CLAUDE_PLUGIN_ROOT"];
14
14
  export function expandEnvVars(value) {
15
15
  return value.replace(/\$\{([^}]+)\}/g, (_match, expr) => {
16
16
  const [varName, ...rest] = expr.split(":-");
@@ -338,17 +338,24 @@ export class McpManager {
338
338
  ...agentEnv,
339
339
  ...(server.config.env || {}),
340
340
  };
341
- // For plugin servers, substitute ${WAVE_PLUGIN_ROOT} in command/args/env
342
- // (same pattern as Claude Code's substitutePluginVariables)
341
+ // For plugin servers, substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
343
342
  let command = server.config.command;
344
343
  let args = server.config.args || [];
345
344
  if (server.config.pluginRoot) {
346
345
  env.WAVE_PLUGIN_ROOT = server.config.pluginRoot;
346
+ env.CLAUDE_PLUGIN_ROOT = server.config.pluginRoot;
347
347
  command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
348
- args = args.map((arg) => arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot));
349
- // Also expand WAVE_PLUGIN_ROOT in user-provided env values
348
+ command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
349
+ args = args.map((arg) => {
350
+ let result = arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
351
+ result = result.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
352
+ return result;
353
+ });
354
+ // Also expand plugin root in user-provided env values
350
355
  for (const [key, value] of Object.entries(server.config.env || {})) {
351
- env[key] = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
356
+ let expanded = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
357
+ expanded = expanded.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
358
+ env[key] = expanded;
352
359
  }
353
360
  }
354
361
  transport = new StdioClientTransport({
@@ -7,6 +7,7 @@ import { Container } from "../utils/container.js";
7
7
  export declare class SkillManager extends EventEmitter {
8
8
  private container;
9
9
  private personalSkillsPath;
10
+ private personalClaudeSkillsPath;
10
11
  private scanTimeout;
11
12
  private workdir;
12
13
  private skillMetadata;
@@ -58,6 +59,8 @@ export declare class SkillManager extends EventEmitter {
58
59
  * Discover skills in a specific directory
59
60
  */
60
61
  private discoverSkillCollection;
62
+ private scanSkillPath;
63
+ private processSkillDirs;
61
64
  /**
62
65
  * Find all directories that could contain skills
63
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAc1C,OAAO,CAAC,SAAS;IAbnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAUnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,YAAY;IAkC1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IA4B5B;;OAEG;YACW,uBAAuB;IAoFrC;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA8BhE"}
1
+ {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAe1C,OAAO,CAAC,SAAS;IAdnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAYnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAqC5B;;OAEG;YACW,uBAAuB;YAwBvB,aAAa;YAiBb,gBAAgB;IAsD9B;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkC3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA8BhE"}
@@ -23,6 +23,8 @@ export class SkillManager extends EventEmitter {
23
23
  this.fileWatcher = null;
24
24
  this.personalSkillsPath =
25
25
  options.personalSkillsPath || join(homedir(), ".wave", "skills");
26
+ this.personalClaudeSkillsPath =
27
+ options.personalClaudeSkillsPath || join(homedir(), ".claude", "skills");
26
28
  this.scanTimeout = options.scanTimeout || 5000;
27
29
  this.workdir = options.workdir || process.cwd();
28
30
  this.watchEnabled = options.watch ?? false;
@@ -89,7 +91,9 @@ export class SkillManager extends EventEmitter {
89
91
  this.fileWatcher = new FileWatcherService(logger);
90
92
  const pathsToWatch = [
91
93
  this.personalSkillsPath,
94
+ this.personalClaudeSkillsPath,
92
95
  join(this.workdir, ".wave", "skills"),
96
+ join(this.workdir, ".claude", "skills"),
93
97
  ];
94
98
  logger?.debug(`Setting up skill watcher for: ${pathsToWatch.join(", ")}`);
95
99
  for (const pathToWatch of pathsToWatch) {
@@ -163,14 +167,19 @@ export class SkillManager extends EventEmitter {
163
167
  */
164
168
  async discoverSkills() {
165
169
  const builtinCollection = await this.discoverSkillCollection(getBuiltinSkillsDir(), "builtin");
170
+ const personalClaudeCollection = await this.discoverSkillCollection(this.personalClaudeSkillsPath, "personal");
166
171
  const personalCollection = await this.discoverSkillCollection(this.personalSkillsPath, "personal");
167
172
  const projectCollection = await this.discoverSkillCollection(this.workdir, "project");
168
173
  return {
169
174
  builtinSkills: builtinCollection.skills,
170
- personalSkills: personalCollection.skills,
175
+ personalSkills: new Map([
176
+ ...personalClaudeCollection.skills,
177
+ ...personalCollection.skills, // .wave overrides .claude
178
+ ]),
171
179
  projectSkills: projectCollection.skills,
172
180
  errors: [
173
181
  ...builtinCollection.errors,
182
+ ...personalClaudeCollection.errors,
174
183
  ...personalCollection.errors,
175
184
  ...projectCollection.errors,
176
185
  ],
@@ -186,71 +195,75 @@ export class SkillManager extends EventEmitter {
186
195
  skills: new Map(),
187
196
  errors: [],
188
197
  };
189
- let skillsPath;
190
- if (type === "personal") {
191
- skillsPath = basePath;
192
- }
193
- else if (type === "builtin") {
194
- skillsPath = basePath;
198
+ if (type === "project") {
199
+ // Scan .claude/skills first, then .wave/skills (wave overrides)
200
+ const claudePath = join(basePath, ".claude", "skills");
201
+ const wavePath = join(basePath, ".wave", "skills");
202
+ await this.scanSkillPath(claudePath, collection);
203
+ await this.scanSkillPath(wavePath, collection);
195
204
  }
196
205
  else {
197
- skillsPath = join(basePath, ".wave", "skills");
206
+ await this.scanSkillPath(basePath, collection);
198
207
  }
208
+ return collection;
209
+ }
210
+ async scanSkillPath(skillsPath, collection) {
199
211
  try {
200
212
  const skillDirs = await this.findSkillDirectories(skillsPath);
201
213
  logger?.debug(`Found ${skillDirs.length} potential skill directories in ${skillsPath}`);
202
- for (const skillDir of skillDirs) {
214
+ await this.processSkillDirs(skillDirs, collection);
215
+ }
216
+ catch (error) {
217
+ logger?.debug(`Could not scan ${skillsPath}: ${error instanceof Error ? error.message : String(error)}`);
218
+ }
219
+ }
220
+ async processSkillDirs(skillDirs, collection) {
221
+ for (const skillDir of skillDirs) {
222
+ try {
223
+ const skillFilePath = join(skillDir, "SKILL.md");
224
+ // Check if SKILL.md exists
203
225
  try {
204
- const skillFilePath = join(skillDir, "SKILL.md");
205
- // Check if SKILL.md exists
206
- try {
207
- await stat(skillFilePath);
208
- }
209
- catch {
210
- continue; // Skip directories without SKILL.md
211
- }
212
- const parsed = parseSkillFile(skillFilePath, {
213
- basePath: skillDir,
214
- validateMetadata: true,
215
- });
216
- if (parsed.isValid) {
217
- // Override the skill type with the collection type
218
- const skillMetadata = {
219
- ...parsed.skillMetadata,
220
- type,
221
- };
222
- // Create full skill object with content
223
- const skill = {
224
- ...skillMetadata,
225
- content: parsed.content,
226
- frontmatter: parsed.frontmatter,
227
- isValid: parsed.isValid,
228
- errors: parsed.validationErrors,
229
- };
230
- collection.skills.set(skillMetadata.name, skillMetadata);
231
- // Store the full skill content in the manager's skillContent map
232
- this.skillContent.set(skillMetadata.name, skill);
233
- }
234
- else {
235
- collection.errors.push({
236
- skillPath: skillDir,
237
- message: parsed.validationErrors.join("; "),
238
- });
239
- }
226
+ await stat(skillFilePath);
227
+ }
228
+ catch {
229
+ continue; // Skip directories without SKILL.md
230
+ }
231
+ const parsed = parseSkillFile(skillFilePath, {
232
+ basePath: skillDir,
233
+ validateMetadata: true,
234
+ });
235
+ if (parsed.isValid) {
236
+ // Override the skill type with the collection type
237
+ const skillMetadata = {
238
+ ...parsed.skillMetadata,
239
+ type: collection.type,
240
+ };
241
+ // Create full skill object with content
242
+ const skill = {
243
+ ...skillMetadata,
244
+ content: parsed.content,
245
+ frontmatter: parsed.frontmatter,
246
+ isValid: parsed.isValid,
247
+ errors: parsed.validationErrors,
248
+ };
249
+ collection.skills.set(skillMetadata.name, skillMetadata);
250
+ // Store the full skill content in the manager's skillContent map
251
+ this.skillContent.set(skillMetadata.name, skill);
240
252
  }
241
- catch (error) {
253
+ else {
242
254
  collection.errors.push({
243
255
  skillPath: skillDir,
244
- message: `Failed to process skill: ${error instanceof Error ? error.message : String(error)}`,
256
+ message: parsed.validationErrors.join("; "),
245
257
  });
246
258
  }
247
259
  }
260
+ catch (error) {
261
+ collection.errors.push({
262
+ skillPath: skillDir,
263
+ message: `Failed to process skill: ${error instanceof Error ? error.message : String(error)}`,
264
+ });
265
+ }
248
266
  }
249
- catch (error) {
250
- logger?.debug(`Could not scan ${skillsPath}: ${error instanceof Error ? error.message : String(error)}`);
251
- // Not an error - the directory might not exist yet
252
- }
253
- return collection;
254
267
  }
255
268
  /**
256
269
  * Find all directories that could contain skills
@@ -347,11 +360,13 @@ export class SkillManager extends EventEmitter {
347
360
  let mainContent = contentMatch ? contentMatch[1].trim() : skill.content;
348
361
  // 1. Substitute parameters ($1, $ARGUMENTS, etc.)
349
362
  mainContent = substituteCommandParameters(mainContent, argsString);
350
- // 2. Substitute ${WAVE_SKILL_DIR} with the skill's directory path
363
+ // 2. Substitute ${WAVE_SKILL_DIR} and ${CLAUDE_SKILL_DIR}
351
364
  mainContent = mainContent.replace(/\$\{WAVE_SKILL_DIR\}/g, skill.skillPath);
352
- // 3. Substitute ${WAVE_PLUGIN_ROOT} with the skill's plugin root path
365
+ mainContent = mainContent.replace(/\$\{CLAUDE_SKILL_DIR\}/g, skill.skillPath);
366
+ // 3. Substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
353
367
  if (skill.pluginRoot) {
354
368
  mainContent = mainContent.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, skill.pluginRoot);
369
+ mainContent = mainContent.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, skill.pluginRoot);
355
370
  }
356
371
  return skillPath + mainContent;
357
372
  }
@@ -33,6 +33,15 @@ export declare class MarketplaceService {
33
33
  * to user-level settings if they aren't already declared there.
34
34
  */
35
35
  private runMigration;
36
+ /**
37
+ * Seeds the builtin marketplace on first startup.
38
+ * Adds it to user-scope settings and marks the cache as seeded.
39
+ */
40
+ private seedBuiltinMarketplace;
41
+ /**
42
+ * Sets the builtinSeeded flag in the cache registry, preserving all other fields.
43
+ */
44
+ private setBuiltinSeeded;
36
45
  /**
37
46
  * Check if a lock file is stale by reading its PID and checking if the process is alive.
38
47
  * Returns true if the lock is stale and safe to remove.
@@ -97,6 +106,12 @@ export declare class MarketplaceService {
97
106
  * Removes a marketplace by name from the specified scope
98
107
  */
99
108
  removeMarketplace(name: string, scope?: Scope): Promise<void>;
109
+ /**
110
+ * Uninstalls all plugins belonging to a given marketplace.
111
+ * Removes them from installed_plugins.json, deletes cache files,
112
+ * and cleans up enabledPlugins entries from all scopes.
113
+ */
114
+ private uninstallPluginsByMarketplace;
100
115
  /**
101
116
  * Updates a specific marketplace or all marketplaces
102
117
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,9 @@ export class MarketplaceService {
28
28
  this.gitService = new GitService();
29
29
  this.ensureDirectoryStructure();
30
30
  this.runMigration();
31
+ // Stored dynamically to avoid widening keyof MarketplaceService
32
+ this._seedComplete =
33
+ this.seedBuiltinMarketplace();
31
34
  }
32
35
  /**
33
36
  * Ensures the required directory structure exists in ~/.wave/plugins
@@ -65,6 +68,46 @@ export class MarketplaceService {
65
68
  // Migration failure should not block startup
66
69
  }
67
70
  }
71
+ /**
72
+ * Seeds the builtin marketplace on first startup.
73
+ * Adds it to user-scope settings and marks the cache as seeded.
74
+ */
75
+ async seedBuiltinMarketplace() {
76
+ try {
77
+ const cache = await this.getCacheRegistry();
78
+ if (cache?.builtinSeeded)
79
+ return;
80
+ const builtin = MarketplaceService.BUILTIN_MARKETPLACE;
81
+ // Add to user-scope settings if not already in any scope
82
+ const scoped = this.configurationService.getMergedMarketplaces(this.workdir);
83
+ if (!scoped[builtin.name]) {
84
+ await this.configurationService.addMarketplaceToScope(this.workdir, "user", builtin.name, { source: builtin.source, autoUpdate: builtin.autoUpdate });
85
+ }
86
+ // Update cache: add entry + set builtinSeeded flag
87
+ await this.updateCacheMarketplace(builtin.name, {
88
+ source: builtin.source,
89
+ autoUpdate: builtin.autoUpdate,
90
+ isBuiltin: true,
91
+ declaredScope: "builtin",
92
+ });
93
+ await this.setBuiltinSeeded(true);
94
+ }
95
+ catch {
96
+ // Seeding failure should not block startup
97
+ }
98
+ }
99
+ /**
100
+ * Sets the builtinSeeded flag in the cache registry, preserving all other fields.
101
+ */
102
+ async setBuiltinSeeded(value) {
103
+ const registry = await this.getCacheRegistry();
104
+ const tmpPath = `${this.knownMarketplacesPath}.tmp`;
105
+ await fs.writeFile(tmpPath, JSON.stringify({
106
+ builtinSeeded: value,
107
+ marketplaces: registry?.marketplaces ?? [],
108
+ }, null, 2));
109
+ await fs.rename(tmpPath, this.knownMarketplacesPath);
110
+ }
68
111
  /**
69
112
  * Check if a lock file is stale by reading its PID and checking if the process is alive.
70
113
  * Returns true if the lock is stale and safe to remove.
@@ -192,7 +235,10 @@ export class MarketplaceService {
192
235
  });
193
236
  }
194
237
  const tmpPath = `${this.knownMarketplacesPath}.tmp`;
195
- await fs.writeFile(tmpPath, JSON.stringify({ marketplaces }, null, 2));
238
+ await fs.writeFile(tmpPath, JSON.stringify({
239
+ builtinSeeded: registry?.builtinSeeded ?? false,
240
+ marketplaces,
241
+ }, null, 2));
196
242
  await fs.rename(tmpPath, this.knownMarketplacesPath);
197
243
  }
198
244
  /**
@@ -203,7 +249,10 @@ export class MarketplaceService {
203
249
  const marketplaces = registry?.marketplaces ?? [];
204
250
  const filtered = marketplaces.filter((m) => m.name !== name);
205
251
  const tmpPath = `${this.knownMarketplacesPath}.tmp`;
206
- await fs.writeFile(tmpPath, JSON.stringify({ marketplaces: filtered }, null, 2));
252
+ await fs.writeFile(tmpPath, JSON.stringify({
253
+ builtinSeeded: registry?.builtinSeeded ?? false,
254
+ marketplaces: filtered,
255
+ }, null, 2));
207
256
  await fs.rename(tmpPath, this.knownMarketplacesPath);
208
257
  }
209
258
  /**
@@ -237,9 +286,13 @@ export class MarketplaceService {
237
286
  * Loads a marketplace manifest from a local path
238
287
  */
239
288
  async loadMarketplaceManifest(marketplacePath) {
240
- const manifestPath = path.join(marketplacePath, ".wave-plugin", "marketplace.json");
289
+ let manifestPath = path.join(marketplacePath, ".wave-plugin", "marketplace.json");
241
290
  if (!existsSync(manifestPath)) {
242
- throw new Error(`Marketplace manifest not found at ${manifestPath}`);
291
+ // Fallback to .claude-plugin/marketplace.json
292
+ manifestPath = path.join(marketplacePath, ".claude-plugin", "marketplace.json");
293
+ if (!existsSync(manifestPath)) {
294
+ throw new Error(`Marketplace manifest not found at ${manifestPath}`);
295
+ }
243
296
  }
244
297
  const content = await fs.readFile(manifestPath, "utf-8");
245
298
  const manifest = JSON.parse(content);
@@ -402,6 +455,8 @@ export class MarketplaceService {
402
455
  async removeMarketplace(name, scope) {
403
456
  return this.withLock(async () => {
404
457
  const targetScope = scope || this.getMarketplaceDeclaringSource(name) || "user";
458
+ // Uninstall all plugins from this marketplace
459
+ await this.uninstallPluginsByMarketplace(name);
405
460
  if (targetScope !== "builtin") {
406
461
  await this.configurationService.removeMarketplaceFromScope(this.workdir, targetScope, name);
407
462
  }
@@ -409,6 +464,36 @@ export class MarketplaceService {
409
464
  await this.removeFromCache(name);
410
465
  });
411
466
  }
467
+ /**
468
+ * Uninstalls all plugins belonging to a given marketplace.
469
+ * Removes them from installed_plugins.json, deletes cache files,
470
+ * and cleans up enabledPlugins entries from all scopes.
471
+ */
472
+ async uninstallPluginsByMarketplace(marketplaceName) {
473
+ const installedRegistry = await this.getInstalledPlugins();
474
+ const pluginsFromMarketplace = installedRegistry.plugins.filter((p) => p.marketplace === marketplaceName);
475
+ if (pluginsFromMarketplace.length === 0)
476
+ return;
477
+ // Remove all plugins from this marketplace from the registry
478
+ installedRegistry.plugins = installedRegistry.plugins.filter((p) => p.marketplace !== marketplaceName);
479
+ await this.saveInstalledPlugins(installedRegistry);
480
+ // Delete cache files that are no longer referenced
481
+ const remainingCachePaths = new Set(installedRegistry.plugins.map((p) => p.cachePath));
482
+ for (const plugin of pluginsFromMarketplace) {
483
+ if (!remainingCachePaths.has(plugin.cachePath) &&
484
+ existsSync(plugin.cachePath)) {
485
+ await fs.rm(plugin.cachePath, { recursive: true, force: true });
486
+ }
487
+ }
488
+ // Remove enabledPlugins entries from all scopes
489
+ const scopes = ["user", "project", "local"];
490
+ for (const plugin of pluginsFromMarketplace) {
491
+ const pluginId = `${plugin.name}@${plugin.marketplace}`;
492
+ for (const s of scopes) {
493
+ await this.configurationService.removeEnabledPlugin(this.workdir, s, pluginId);
494
+ }
495
+ }
496
+ }
412
497
  /**
413
498
  * Updates a specific marketplace or all marketplaces
414
499
  */
@@ -568,9 +653,13 @@ export class MarketplaceService {
568
653
  else {
569
654
  pluginSrcPath = path.resolve(marketplacePath, pluginEntry.source);
570
655
  }
571
- const pluginManifestPath = path.join(pluginSrcPath, ".wave-plugin", "plugin.json");
656
+ let pluginManifestPath = path.join(pluginSrcPath, ".wave-plugin", "plugin.json");
572
657
  if (!existsSync(pluginManifestPath)) {
573
- throw new Error(`Plugin manifest not found at ${pluginManifestPath}`);
658
+ // Fallback to .claude-plugin/plugin.json
659
+ pluginManifestPath = path.join(pluginSrcPath, ".claude-plugin", "plugin.json");
660
+ if (!existsSync(pluginManifestPath)) {
661
+ throw new Error(`Plugin manifest not found at ${pluginManifestPath}`);
662
+ }
574
663
  }
575
664
  const pluginManifestContent = await fs.readFile(pluginManifestPath, "utf-8");
576
665
  const pluginManifest = JSON.parse(pluginManifestContent);
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,aAAa;IAKZ,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,qBAAqB,CAAuB;gBAEhC,SAAS,EAAE,SAAS;IAExC,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,UAAU,IAAI,IAAI;IAMzB;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU/C;;OAEG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAevC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBhD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjE"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,aAAa;IAKZ,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,qBAAqB,CAAuB;gBAEhC,SAAS,EAAE,SAAS;IAExC,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,UAAU,IAAI,IAAI;IAMzB;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU/C;;OAEG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAoCvC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuChD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjE"}