agent-recorder 0.0.9 → 0.0.11

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 (82) hide show
  1. package/package.json +1 -1
  2. package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.d.ts.map +1 -1
  3. package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.js +5 -31
  4. package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.js.map +1 -1
  5. package/vendor/node_modules/@agent-recorder/cli/commands/configure.d.ts +2 -0
  6. package/vendor/node_modules/@agent-recorder/cli/commands/configure.d.ts.map +1 -1
  7. package/vendor/node_modules/@agent-recorder/cli/commands/configure.js +117 -1
  8. package/vendor/node_modules/@agent-recorder/cli/commands/configure.js.map +1 -1
  9. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.d.ts.map +1 -1
  10. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.js +113 -19
  11. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.js.map +1 -1
  12. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.d.ts +5 -0
  13. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.d.ts.map +1 -0
  14. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.js +152 -0
  15. package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.js.map +1 -0
  16. package/vendor/node_modules/@agent-recorder/cli/commands/install.d.ts +7 -1
  17. package/vendor/node_modules/@agent-recorder/cli/commands/install.d.ts.map +1 -1
  18. package/vendor/node_modules/@agent-recorder/cli/commands/install.js +89 -14
  19. package/vendor/node_modules/@agent-recorder/cli/commands/install.js.map +1 -1
  20. package/vendor/node_modules/@agent-recorder/cli/commands/install.test.d.ts +5 -0
  21. package/vendor/node_modules/@agent-recorder/cli/commands/install.test.d.ts.map +1 -0
  22. package/vendor/node_modules/@agent-recorder/cli/commands/install.test.js +173 -0
  23. package/vendor/node_modules/@agent-recorder/cli/commands/install.test.js.map +1 -0
  24. package/vendor/node_modules/@agent-recorder/cli/commands/start.d.ts.map +1 -1
  25. package/vendor/node_modules/@agent-recorder/cli/commands/start.js +29 -4
  26. package/vendor/node_modules/@agent-recorder/cli/commands/start.js.map +1 -1
  27. package/vendor/node_modules/@agent-recorder/cli/config/hubify.d.ts +51 -0
  28. package/vendor/node_modules/@agent-recorder/cli/config/hubify.d.ts.map +1 -0
  29. package/vendor/node_modules/@agent-recorder/cli/config/hubify.js +125 -0
  30. package/vendor/node_modules/@agent-recorder/cli/config/hubify.js.map +1 -0
  31. package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.d.ts +5 -0
  32. package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.d.ts.map +1 -0
  33. package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.js +329 -0
  34. package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.js.map +1 -0
  35. package/vendor/node_modules/@agent-recorder/cli/index.js +7 -3
  36. package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
  37. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +32 -0
  38. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -0
  39. package/vendor/node_modules/@agent-recorder/core/claude-config.js +65 -0
  40. package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -0
  41. package/vendor/node_modules/@agent-recorder/core/index.d.ts +3 -0
  42. package/vendor/node_modules/@agent-recorder/core/index.d.ts.map +1 -1
  43. package/vendor/node_modules/@agent-recorder/core/index.js +3 -0
  44. package/vendor/node_modules/@agent-recorder/core/index.js.map +1 -1
  45. package/vendor/node_modules/@agent-recorder/core/providers/index.d.ts +9 -0
  46. package/vendor/node_modules/@agent-recorder/core/providers/index.d.ts.map +1 -0
  47. package/vendor/node_modules/@agent-recorder/core/providers/index.js +9 -0
  48. package/vendor/node_modules/@agent-recorder/core/providers/index.js.map +1 -0
  49. package/vendor/node_modules/@agent-recorder/core/providers/io.d.ts +36 -0
  50. package/vendor/node_modules/@agent-recorder/core/providers/io.d.ts.map +1 -0
  51. package/vendor/node_modules/@agent-recorder/core/providers/io.js +88 -0
  52. package/vendor/node_modules/@agent-recorder/core/providers/io.js.map +1 -0
  53. package/vendor/node_modules/@agent-recorder/core/providers/io.test.d.ts +5 -0
  54. package/vendor/node_modules/@agent-recorder/core/providers/io.test.d.ts.map +1 -0
  55. package/vendor/node_modules/@agent-recorder/core/providers/io.test.js +248 -0
  56. package/vendor/node_modules/@agent-recorder/core/providers/io.test.js.map +1 -0
  57. package/vendor/node_modules/@agent-recorder/core/providers/types.d.ts +36 -0
  58. package/vendor/node_modules/@agent-recorder/core/providers/types.d.ts.map +1 -0
  59. package/vendor/node_modules/@agent-recorder/core/providers/types.js +6 -0
  60. package/vendor/node_modules/@agent-recorder/core/providers/types.js.map +1 -0
  61. package/vendor/node_modules/@agent-recorder/core/wrap-utils.d.ts +42 -0
  62. package/vendor/node_modules/@agent-recorder/core/wrap-utils.d.ts.map +1 -0
  63. package/vendor/node_modules/@agent-recorder/core/wrap-utils.js +80 -0
  64. package/vendor/node_modules/@agent-recorder/core/wrap-utils.js.map +1 -0
  65. package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
  66. package/vendor/node_modules/@agent-recorder/service/index.js +19 -0
  67. package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
  68. package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.d.ts +43 -0
  69. package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.d.ts.map +1 -0
  70. package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.js +221 -0
  71. package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.js.map +1 -0
  72. package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.d.ts +6 -0
  73. package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.d.ts.map +1 -0
  74. package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.js +319 -0
  75. package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.js.map +1 -0
  76. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +1 -0
  77. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
  78. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +239 -34
  79. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
  80. package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
  81. package/vendor/node_modules/@agent-recorder/service/routes/events.js +1 -0
  82. package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Claude Code configuration detection and management utilities.
3
+ * Shared between CLI and service packages.
4
+ */
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ /**
9
+ * Get the v2 Claude config path (~/.claude/settings.json)
10
+ */
11
+ export function getV2ConfigPath() {
12
+ return path.join(os.homedir(), ".claude", "settings.json");
13
+ }
14
+ /**
15
+ * Get the legacy Claude config path (~/.config/claude/mcp.json)
16
+ */
17
+ export function getLegacyConfigPath() {
18
+ return path.join(os.homedir(), ".config", "claude", "mcp.json");
19
+ }
20
+ /**
21
+ * Detect which Claude config file exists.
22
+ * Checks v2 first, then legacy. Returns 'none' if neither exists.
23
+ */
24
+ export function detectClaudeConfig() {
25
+ const v2Path = getV2ConfigPath();
26
+ const legacyPath = getLegacyConfigPath();
27
+ if (fs.existsSync(v2Path)) {
28
+ return { kind: "v2", path: v2Path };
29
+ }
30
+ if (fs.existsSync(legacyPath)) {
31
+ return { kind: "legacy", path: legacyPath };
32
+ }
33
+ return { kind: "none", path: null };
34
+ }
35
+ /**
36
+ * Safely read and parse a JSON file.
37
+ * Returns null if file doesn't exist or is invalid JSON.
38
+ */
39
+ export function readJsonFile(filePath) {
40
+ try {
41
+ if (!fs.existsSync(filePath)) {
42
+ return null;
43
+ }
44
+ const content = fs.readFileSync(filePath, "utf-8");
45
+ return JSON.parse(content);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Write JSON to file atomically (write to temp, then rename).
53
+ * Creates parent directories if needed.
54
+ */
55
+ export function writeJsonFileAtomic(filePath, data) {
56
+ const dir = path.dirname(filePath);
57
+ if (!fs.existsSync(dir)) {
58
+ fs.mkdirSync(dir, { recursive: true });
59
+ }
60
+ const content = JSON.stringify(data, null, 2) + "\n";
61
+ const tempPath = `${filePath}.tmp.${Date.now()}`;
62
+ fs.writeFileSync(tempPath, content, "utf-8");
63
+ fs.renameSync(tempPath, filePath);
64
+ }
65
+ //# sourceMappingURL=claude-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../src/claude-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAO9B;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,IAAuC;IAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAEjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC"}
@@ -10,4 +10,7 @@ export * from "./utils/index.js";
10
10
  export { loadConfig, getDefaultUpstreamsPath, type Config } from "./config.js";
11
11
  export * from "./daemon-paths.js";
12
12
  export * from "./lockfile.js";
13
+ export * from "./wrap-utils.js";
14
+ export * from "./claude-config.js";
15
+ export * from "./providers/index.js";
13
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
@@ -10,4 +10,7 @@ export * from "./utils/index.js";
10
10
  export { loadConfig, getDefaultUpstreamsPath } from "./config.js";
11
11
  export * from "./daemon-paths.js";
12
12
  export * from "./lockfile.js";
13
+ export * from "./wrap-utils.js";
14
+ export * from "./claude-config.js";
15
+ export * from "./providers/index.js";
13
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAe,MAAM,aAAa,CAAC;AAC/E,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAe,MAAM,aAAa,CAAC;AAC/E,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @agent-recorder/core/providers
3
+ *
4
+ * Providers registry for Agent Recorder Hub.
5
+ * Types and I/O utilities for managing downstream MCP server providers.
6
+ */
7
+ export * from "./types.js";
8
+ export * from "./io.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @agent-recorder/core/providers
3
+ *
4
+ * Providers registry for Agent Recorder Hub.
5
+ * Types and I/O utilities for managing downstream MCP server providers.
6
+ */
7
+ export * from "./types.js";
8
+ export * from "./io.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * I/O utilities for providers registry.
3
+ * Handles reading/writing providers.json file.
4
+ */
5
+ import type { ProvidersFile, Provider } from "./types.js";
6
+ /**
7
+ * Get the default path for providers.json.
8
+ * Returns ~/.agent-recorder/providers.json
9
+ */
10
+ export declare function getDefaultProvidersPath(): string;
11
+ /**
12
+ * Read providers file from disk.
13
+ * Returns empty providers list if file doesn't exist or is invalid.
14
+ *
15
+ * @param filePath - Path to providers.json (defaults to ~/.agent-recorder/providers.json)
16
+ */
17
+ export declare function readProvidersFile(filePath?: string): ProvidersFile;
18
+ /**
19
+ * Write providers file to disk.
20
+ * Creates parent directory if needed.
21
+ * Writes pretty-printed JSON with 2-space indent.
22
+ *
23
+ * @param file - Providers file to write
24
+ * @param filePath - Path to providers.json (defaults to ~/.agent-recorder/providers.json)
25
+ */
26
+ export declare function writeProvidersFile(file: ProvidersFile, filePath?: string): void;
27
+ /**
28
+ * Upsert providers into a providers file.
29
+ * Merges providers by provider.id - replaces if exists, adds if new.
30
+ *
31
+ * @param file - Existing providers file
32
+ * @param providers - Providers to upsert
33
+ * @returns New providers file with merged providers
34
+ */
35
+ export declare function upsertProviders(file: ProvidersFile, providers: Provider[]): ProvidersFile;
36
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/providers/io.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAgClE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAYN;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,QAAQ,EAAE,GACpB,aAAa,CAoBf"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * I/O utilities for providers registry.
3
+ * Handles reading/writing providers.json file.
4
+ */
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ /**
9
+ * Get the default path for providers.json.
10
+ * Returns ~/.agent-recorder/providers.json
11
+ */
12
+ export function getDefaultProvidersPath() {
13
+ return path.join(os.homedir(), ".agent-recorder", "providers.json");
14
+ }
15
+ /**
16
+ * Read providers file from disk.
17
+ * Returns empty providers list if file doesn't exist or is invalid.
18
+ *
19
+ * @param filePath - Path to providers.json (defaults to ~/.agent-recorder/providers.json)
20
+ */
21
+ export function readProvidersFile(filePath) {
22
+ const targetPath = filePath ?? getDefaultProvidersPath();
23
+ try {
24
+ if (!fs.existsSync(targetPath)) {
25
+ return { version: 1, providers: [] };
26
+ }
27
+ const content = fs.readFileSync(targetPath, "utf-8");
28
+ const parsed = JSON.parse(content);
29
+ // Validate version and providers array
30
+ if (typeof parsed !== "object" ||
31
+ parsed === null ||
32
+ parsed.version !== 1 ||
33
+ !Array.isArray(parsed.providers)) {
34
+ console.warn(`[Providers] Invalid file format at ${targetPath}, returning empty`);
35
+ return { version: 1, providers: [] };
36
+ }
37
+ return parsed;
38
+ }
39
+ catch (error) {
40
+ console.warn(`[Providers] Failed to read ${targetPath}:`, error instanceof Error ? error.message : "Unknown error");
41
+ return { version: 1, providers: [] };
42
+ }
43
+ }
44
+ /**
45
+ * Write providers file to disk.
46
+ * Creates parent directory if needed.
47
+ * Writes pretty-printed JSON with 2-space indent.
48
+ *
49
+ * @param file - Providers file to write
50
+ * @param filePath - Path to providers.json (defaults to ~/.agent-recorder/providers.json)
51
+ */
52
+ export function writeProvidersFile(file, filePath) {
53
+ const targetPath = filePath ?? getDefaultProvidersPath();
54
+ const dir = path.dirname(targetPath);
55
+ // Create directory if it doesn't exist
56
+ if (!fs.existsSync(dir)) {
57
+ fs.mkdirSync(dir, { recursive: true });
58
+ }
59
+ // Write pretty-printed JSON with 2-space indent
60
+ const content = JSON.stringify(file, null, 2) + "\n";
61
+ fs.writeFileSync(targetPath, content, "utf-8");
62
+ }
63
+ /**
64
+ * Upsert providers into a providers file.
65
+ * Merges providers by provider.id - replaces if exists, adds if new.
66
+ *
67
+ * @param file - Existing providers file
68
+ * @param providers - Providers to upsert
69
+ * @returns New providers file with merged providers
70
+ */
71
+ export function upsertProviders(file, providers) {
72
+ const existingMap = new Map();
73
+ // Build map of existing providers
74
+ for (const provider of file.providers) {
75
+ existingMap.set(provider.id, provider);
76
+ }
77
+ // Upsert new providers
78
+ for (const provider of providers) {
79
+ existingMap.set(provider.id, provider);
80
+ }
81
+ // Convert back to array
82
+ const mergedProviders = Array.from(existingMap.values());
83
+ return {
84
+ version: 1,
85
+ providers: mergedProviders,
86
+ };
87
+ }
88
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/providers/io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for providers I/O utilities.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=io.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.test.d.ts","sourceRoot":"","sources":["../../src/providers/io.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Tests for providers I/O utilities.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+ import * as fs from "node:fs";
8
+ import { getDefaultProvidersPath, readProvidersFile, writeProvidersFile, upsertProviders, } from "./io.js";
9
+ describe("Providers I/O", () => {
10
+ const testDir = join(homedir(), ".agent-recorder-test");
11
+ const testFilePath = join(testDir, "providers-test.json");
12
+ beforeEach(() => {
13
+ // Clean up test directory
14
+ if (fs.existsSync(testDir)) {
15
+ fs.rmSync(testDir, { recursive: true, force: true });
16
+ }
17
+ });
18
+ afterEach(() => {
19
+ // Clean up test directory
20
+ if (fs.existsSync(testDir)) {
21
+ fs.rmSync(testDir, { recursive: true, force: true });
22
+ }
23
+ });
24
+ describe("getDefaultProvidersPath", () => {
25
+ it("returns path in user home directory", () => {
26
+ const providersPath = getDefaultProvidersPath();
27
+ const expected = join(homedir(), ".agent-recorder", "providers.json");
28
+ expect(providersPath).toBe(expected);
29
+ });
30
+ });
31
+ describe("readProvidersFile", () => {
32
+ it("returns empty providers when file does not exist", () => {
33
+ const result = readProvidersFile(testFilePath);
34
+ expect(result).toEqual({
35
+ version: 1,
36
+ providers: [],
37
+ });
38
+ });
39
+ it("returns empty providers when file is invalid JSON", () => {
40
+ fs.mkdirSync(testDir, { recursive: true });
41
+ fs.writeFileSync(testFilePath, "invalid json", "utf-8");
42
+ const result = readProvidersFile(testFilePath);
43
+ expect(result).toEqual({
44
+ version: 1,
45
+ providers: [],
46
+ });
47
+ });
48
+ it("returns empty providers when file has wrong version", () => {
49
+ fs.mkdirSync(testDir, { recursive: true });
50
+ fs.writeFileSync(testFilePath, JSON.stringify({ version: 2, providers: [] }), "utf-8");
51
+ const result = readProvidersFile(testFilePath);
52
+ expect(result).toEqual({
53
+ version: 1,
54
+ providers: [],
55
+ });
56
+ });
57
+ it("returns empty providers when providers is not an array", () => {
58
+ fs.mkdirSync(testDir, { recursive: true });
59
+ fs.writeFileSync(testFilePath, JSON.stringify({ version: 1, providers: "not-array" }), "utf-8");
60
+ const result = readProvidersFile(testFilePath);
61
+ expect(result).toEqual({
62
+ version: 1,
63
+ providers: [],
64
+ });
65
+ });
66
+ it("reads valid providers file", () => {
67
+ const file = {
68
+ version: 1,
69
+ providers: [
70
+ {
71
+ id: "test-http",
72
+ type: "http",
73
+ url: "http://localhost:3000",
74
+ headers: { Authorization: "Bearer token" },
75
+ },
76
+ {
77
+ id: "test-stdio",
78
+ type: "stdio",
79
+ command: "npx",
80
+ args: ["@playwright/mcp"],
81
+ env: { NODE_ENV: "test" },
82
+ },
83
+ ],
84
+ };
85
+ fs.mkdirSync(testDir, { recursive: true });
86
+ fs.writeFileSync(testFilePath, JSON.stringify(file), "utf-8");
87
+ const result = readProvidersFile(testFilePath);
88
+ expect(result).toEqual(file);
89
+ });
90
+ });
91
+ describe("writeProvidersFile", () => {
92
+ it("creates directory if it does not exist", () => {
93
+ const file = {
94
+ version: 1,
95
+ providers: [],
96
+ };
97
+ writeProvidersFile(file, testFilePath);
98
+ expect(fs.existsSync(testDir)).toBe(true);
99
+ expect(fs.existsSync(testFilePath)).toBe(true);
100
+ });
101
+ it("writes pretty-printed JSON with 2-space indent", () => {
102
+ const file = {
103
+ version: 1,
104
+ providers: [
105
+ {
106
+ id: "test",
107
+ type: "http",
108
+ url: "http://localhost:3000",
109
+ },
110
+ ],
111
+ };
112
+ writeProvidersFile(file, testFilePath);
113
+ const content = fs.readFileSync(testFilePath, "utf-8");
114
+ const expected = JSON.stringify(file, null, 2) + "\n";
115
+ expect(content).toBe(expected);
116
+ });
117
+ it("writes and reads roundtrip correctly", () => {
118
+ const file = {
119
+ version: 1,
120
+ providers: [
121
+ {
122
+ id: "http-provider",
123
+ type: "http",
124
+ url: "http://localhost:3000",
125
+ headers: { "X-Custom": "value" },
126
+ },
127
+ {
128
+ id: "stdio-provider",
129
+ type: "stdio",
130
+ command: "node",
131
+ args: ["server.js", "--port", "8080"],
132
+ env: { DEBUG: "1" },
133
+ },
134
+ ],
135
+ };
136
+ writeProvidersFile(file, testFilePath);
137
+ const result = readProvidersFile(testFilePath);
138
+ expect(result).toEqual(file);
139
+ });
140
+ });
141
+ describe("upsertProviders", () => {
142
+ it("adds new providers to empty file", () => {
143
+ const file = {
144
+ version: 1,
145
+ providers: [],
146
+ };
147
+ const newProviders = [
148
+ {
149
+ id: "new-provider",
150
+ type: "http",
151
+ url: "http://localhost:4000",
152
+ },
153
+ ];
154
+ const result = upsertProviders(file, newProviders);
155
+ expect(result.version).toBe(1);
156
+ expect(result.providers).toHaveLength(1);
157
+ expect(result.providers[0]).toEqual(newProviders[0]);
158
+ });
159
+ it("replaces existing provider with same id", () => {
160
+ const file = {
161
+ version: 1,
162
+ providers: [
163
+ {
164
+ id: "test",
165
+ type: "http",
166
+ url: "http://localhost:3000",
167
+ },
168
+ ],
169
+ };
170
+ const updatedProviders = [
171
+ {
172
+ id: "test",
173
+ type: "http",
174
+ url: "http://localhost:5000",
175
+ headers: { "X-New": "header" },
176
+ },
177
+ ];
178
+ const result = upsertProviders(file, updatedProviders);
179
+ expect(result.providers).toHaveLength(1);
180
+ expect(result.providers[0]).toEqual(updatedProviders[0]);
181
+ expect(result.providers[0].url).toBe("http://localhost:5000");
182
+ });
183
+ it("merges new and existing providers", () => {
184
+ const file = {
185
+ version: 1,
186
+ providers: [
187
+ {
188
+ id: "existing",
189
+ type: "http",
190
+ url: "http://localhost:3000",
191
+ },
192
+ ],
193
+ };
194
+ const newProviders = [
195
+ {
196
+ id: "new",
197
+ type: "stdio",
198
+ command: "npx",
199
+ args: ["@playwright/mcp"],
200
+ },
201
+ ];
202
+ const result = upsertProviders(file, newProviders);
203
+ expect(result.providers).toHaveLength(2);
204
+ expect(result.providers.find((p) => p.id === "existing")).toBeDefined();
205
+ expect(result.providers.find((p) => p.id === "new")).toBeDefined();
206
+ });
207
+ it("handles multiple upserts correctly", () => {
208
+ const file = {
209
+ version: 1,
210
+ providers: [
211
+ {
212
+ id: "provider-1",
213
+ type: "http",
214
+ url: "http://localhost:3000",
215
+ },
216
+ ],
217
+ };
218
+ const upsert1 = [
219
+ {
220
+ id: "provider-1",
221
+ type: "http",
222
+ url: "http://localhost:4000",
223
+ },
224
+ {
225
+ id: "provider-2",
226
+ type: "http",
227
+ url: "http://localhost:5000",
228
+ },
229
+ ];
230
+ const result1 = upsertProviders(file, upsert1);
231
+ expect(result1.providers).toHaveLength(2);
232
+ const upsert2 = [
233
+ {
234
+ id: "provider-3",
235
+ type: "stdio",
236
+ command: "node",
237
+ args: ["server.js"],
238
+ },
239
+ ];
240
+ const result2 = upsertProviders(result1, upsert2);
241
+ expect(result2.providers).toHaveLength(3);
242
+ expect(result2.providers.find((p) => p.id === "provider-1")).toBeDefined();
243
+ expect(result2.providers.find((p) => p.id === "provider-2")).toBeDefined();
244
+ expect(result2.providers.find((p) => p.id === "provider-3")).toBeDefined();
245
+ });
246
+ });
247
+ });
248
+ //# sourceMappingURL=io.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.test.js","sourceRoot":"","sources":["../../src/providers/io.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Provider types for Agent Recorder Hub.
3
+ * Providers represent downstream MCP servers that the hub aggregates.
4
+ */
5
+ /**
6
+ * HTTP-based MCP provider (local or remote server via URL).
7
+ */
8
+ export interface HttpProvider {
9
+ id: string;
10
+ type: "http";
11
+ url: string;
12
+ headers?: Record<string, string>;
13
+ }
14
+ /**
15
+ * Stdio-based MCP provider (process spawned via command).
16
+ * Runtime spawning not implemented yet - type system only.
17
+ */
18
+ export interface StdioProvider {
19
+ id: string;
20
+ type: "stdio";
21
+ command: string;
22
+ args?: string[];
23
+ env?: Record<string, string>;
24
+ }
25
+ /**
26
+ * Union type for all supported provider kinds.
27
+ */
28
+ export type Provider = HttpProvider | StdioProvider;
29
+ /**
30
+ * Providers file schema (stable, versioned).
31
+ */
32
+ export interface ProvidersFile {
33
+ version: 1;
34
+ providers: Provider[];
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Provider types for Agent Recorder Hub.
3
+ * Providers represent downstream MCP servers that the hub aggregates.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared utilities for wrapping MCP servers with Agent Recorder proxy.
3
+ * Used by both CLI command and auto-wrap manager.
4
+ */
5
+ export interface UpstreamsRegistry {
6
+ [serverKey: string]: {
7
+ url: string;
8
+ };
9
+ }
10
+ /**
11
+ * Load upstreams registry from file.
12
+ * Returns empty object if file doesn't exist or is invalid.
13
+ */
14
+ export declare function loadUpstreamsRegistry(upstreamsPath: string): UpstreamsRegistry;
15
+ /**
16
+ * Save upstreams registry to file.
17
+ * Creates directory if it doesn't exist.
18
+ */
19
+ export declare function saveUpstreamsRegistry(upstreamsPath: string, registry: UpstreamsRegistry): void;
20
+ /**
21
+ * Check if a server is already wrapped in the upstreams registry.
22
+ */
23
+ export declare function isAlreadyWrapped(serverKey: string, upstreamsPath: string): boolean;
24
+ /**
25
+ * Get the proxy URL for a given server key.
26
+ */
27
+ export declare function getProxyUrl(serverKey: string, mcpProxyPort: number): string;
28
+ /**
29
+ * Register a URL-based server in the upstreams registry.
30
+ * Returns the proxy URL that should replace the original URL.
31
+ */
32
+ export declare function registerUrlServer(serverKey: string, originalUrl: string, upstreamsPath: string, mcpProxyPort: number): string;
33
+ /**
34
+ * Unregister a server from the upstreams registry.
35
+ */
36
+ export declare function unregisterServer(serverKey: string, upstreamsPath: string): void;
37
+ /**
38
+ * Get the original URL for a wrapped server.
39
+ * Returns null if server is not wrapped.
40
+ */
41
+ export declare function getOriginalUrl(serverKey: string, upstreamsPath: string): string | null;
42
+ //# sourceMappingURL=wrap-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-utils.d.ts","sourceRoot":"","sources":["../src/wrap-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,iBAAiB;IAChC,CAAC,SAAS,EAAE,MAAM,GAAG;QACnB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,GACpB,iBAAiB,CAUnB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,iBAAiB,GAC1B,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAGT;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAGf"}