@nex-ai/nex 0.1.38 → 0.1.40

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 (73) hide show
  1. package/dist/cli.js +2 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/workspace.d.ts +8 -0
  4. package/dist/commands/workspace.js +251 -0
  5. package/dist/commands/workspace.js.map +1 -0
  6. package/dist/index.js +12 -12
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/config.d.ts +2 -2
  9. package/dist/lib/config.js +33 -4
  10. package/dist/lib/config.js.map +1 -1
  11. package/dist/lib/workspace-registry.d.ts +47 -0
  12. package/dist/lib/workspace-registry.js +240 -0
  13. package/dist/lib/workspace-registry.js.map +1 -0
  14. package/dist/mcp/channel.js +5 -4
  15. package/dist/mcp/channel.js.map +1 -1
  16. package/dist/mcp/config.d.ts +5 -0
  17. package/dist/mcp/config.js +16 -1
  18. package/dist/mcp/config.js.map +1 -1
  19. package/dist/mcp/file-manifest.d.ts +1 -1
  20. package/dist/mcp/file-manifest.js +11 -7
  21. package/dist/mcp/file-manifest.js.map +1 -1
  22. package/dist/mcp/rate-limiter.js +2 -2
  23. package/dist/mcp/rate-limiter.js.map +1 -1
  24. package/dist/mcp/session-store.js +2 -2
  25. package/dist/mcp/session-store.js.map +1 -1
  26. package/dist/mcp/workspace-data-dir.d.ts +2 -0
  27. package/dist/mcp/workspace-data-dir.js +28 -0
  28. package/dist/mcp/workspace-data-dir.js.map +1 -0
  29. package/dist/plugin/adapters/cline-capture.d.ts +7 -0
  30. package/dist/plugin/adapters/cline-capture.js +25 -0
  31. package/dist/plugin/adapters/cline-capture.js.map +1 -0
  32. package/dist/plugin/adapters/cline-recall.d.ts +7 -0
  33. package/dist/plugin/adapters/cline-recall.js +30 -0
  34. package/dist/plugin/adapters/cline-recall.js.map +1 -0
  35. package/dist/plugin/adapters/cline-task-start.d.ts +7 -0
  36. package/dist/plugin/adapters/cline-task-start.js +30 -0
  37. package/dist/plugin/adapters/cline-task-start.js.map +1 -0
  38. package/dist/plugin/adapters/cursor-recall.d.ts +7 -0
  39. package/dist/plugin/adapters/cursor-recall.js +31 -0
  40. package/dist/plugin/adapters/cursor-recall.js.map +1 -0
  41. package/dist/plugin/adapters/cursor-session-start.d.ts +7 -0
  42. package/dist/plugin/adapters/cursor-session-start.js +30 -0
  43. package/dist/plugin/adapters/cursor-session-start.js.map +1 -0
  44. package/dist/plugin/adapters/cursor-stop.d.ts +7 -0
  45. package/dist/plugin/adapters/cursor-stop.js +25 -0
  46. package/dist/plugin/adapters/cursor-stop.js.map +1 -0
  47. package/dist/plugin/adapters/windsurf-capture.d.ts +7 -0
  48. package/dist/plugin/adapters/windsurf-capture.js +25 -0
  49. package/dist/plugin/adapters/windsurf-capture.js.map +1 -0
  50. package/dist/plugin/adapters/windsurf-recall.d.ts +7 -0
  51. package/dist/plugin/adapters/windsurf-recall.js +31 -0
  52. package/dist/plugin/adapters/windsurf-recall.js.map +1 -0
  53. package/dist/plugin/auto-register.d.ts +1 -1
  54. package/dist/plugin/auto-register.js +34 -6
  55. package/dist/plugin/auto-register.js.map +1 -1
  56. package/dist/plugin/config.d.ts +11 -4
  57. package/dist/plugin/config.js +21 -5
  58. package/dist/plugin/config.js.map +1 -1
  59. package/dist/plugin/file-manifest.js +10 -6
  60. package/dist/plugin/file-manifest.js.map +1 -1
  61. package/dist/plugin/rate-limiter.js +2 -2
  62. package/dist/plugin/rate-limiter.js.map +1 -1
  63. package/dist/plugin/recall-filter.js +10 -6
  64. package/dist/plugin/recall-filter.js.map +1 -1
  65. package/dist/plugin/session-store.js +2 -3
  66. package/dist/plugin/session-store.js.map +1 -1
  67. package/dist/plugin/shared.d.ts +39 -0
  68. package/dist/plugin/shared.js +380 -0
  69. package/dist/plugin/shared.js.map +1 -0
  70. package/dist/plugin/workspace-data-dir.d.ts +2 -0
  71. package/dist/plugin/workspace-data-dir.js +31 -0
  72. package/dist/plugin/workspace-data-dir.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Workspace registry — manages multiple Nex workspaces on a single machine.
3
+ *
4
+ * Storage:
5
+ * ~/.nex/config.json → registry (active_workspace + workspace list)
6
+ * ~/.nex/workspaces/<slug>/ → per-workspace credentials + state
7
+ *
8
+ * All functions accept an optional `baseDir` for testing (defaults to ~/.nex).
9
+ */
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, rmSync, } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { homedir } from "node:os";
13
+ const DEFAULT_BASE_DIR = process.env.NEX_BASE_DIR || join(homedir(), ".nex");
14
+ // --- State file names that get moved during migration ---
15
+ const STATE_FILES = [
16
+ "file-scan-manifest.json",
17
+ "claude-sessions.json",
18
+ "mcp-sessions.json",
19
+ "cli-sessions.json",
20
+ "recall-state.json",
21
+ "rate-limiter.json",
22
+ ];
23
+ // --- Core functions ---
24
+ export function loadRegistry(baseDir = DEFAULT_BASE_DIR) {
25
+ const configPath = join(baseDir, "config.json");
26
+ try {
27
+ const raw = readFileSync(configPath, "utf-8");
28
+ const data = JSON.parse(raw);
29
+ if (data && data.active_workspace !== undefined && data.workspaces) {
30
+ return data;
31
+ }
32
+ // Flat config detected — trigger migration
33
+ if (data && data.api_key) {
34
+ migrateIfNeeded(baseDir);
35
+ return JSON.parse(readFileSync(configPath, "utf-8"));
36
+ }
37
+ return { active_workspace: "", workspaces: {} };
38
+ }
39
+ catch {
40
+ return { active_workspace: "", workspaces: {} };
41
+ }
42
+ }
43
+ export function saveRegistry(registry, baseDir = DEFAULT_BASE_DIR) {
44
+ mkdirSync(baseDir, { recursive: true });
45
+ writeFileSync(join(baseDir, "config.json"), JSON.stringify(registry, null, 2), "utf-8");
46
+ }
47
+ export function addWorkspace(slug, credentials, nickname, baseDir = DEFAULT_BASE_DIR) {
48
+ const registry = loadRegistry(baseDir);
49
+ const wsDir = join(baseDir, "workspaces", slug);
50
+ mkdirSync(wsDir, { recursive: true });
51
+ // Write credentials
52
+ writeFileSync(join(wsDir, "credentials.json"), JSON.stringify(credentials, null, 2), "utf-8");
53
+ // Update registry — preserve existing nickname if no new one provided
54
+ const existing = registry.workspaces[slug];
55
+ registry.workspaces[slug] = {
56
+ nickname: nickname ?? existing?.nickname,
57
+ added_at: existing?.added_at ?? Date.now(),
58
+ };
59
+ // Set as active if first workspace or no active set
60
+ if (!registry.active_workspace || Object.keys(registry.workspaces).length === 1) {
61
+ registry.active_workspace = slug;
62
+ }
63
+ saveRegistry(registry, baseDir);
64
+ }
65
+ export function removeWorkspace(slug, baseDir = DEFAULT_BASE_DIR) {
66
+ const registry = loadRegistry(baseDir);
67
+ delete registry.workspaces[slug];
68
+ // Clean up active_workspace pointer
69
+ if (registry.active_workspace === slug) {
70
+ const remaining = Object.keys(registry.workspaces);
71
+ registry.active_workspace = remaining[0] ?? "";
72
+ }
73
+ // Remove workspace directory
74
+ const wsDir = join(baseDir, "workspaces", slug);
75
+ rmSync(wsDir, { recursive: true, force: true });
76
+ saveRegistry(registry, baseDir);
77
+ }
78
+ export function switchWorkspace(slug, baseDir = DEFAULT_BASE_DIR) {
79
+ const registry = loadRegistry(baseDir);
80
+ if (!registry.workspaces[slug]) {
81
+ throw new Error(`Workspace "${slug}" not found`);
82
+ }
83
+ registry.active_workspace = slug;
84
+ saveRegistry(registry, baseDir);
85
+ return loadCredentials(slug, baseDir);
86
+ }
87
+ export function renameWorkspace(slug, nickname, baseDir = DEFAULT_BASE_DIR) {
88
+ const registry = loadRegistry(baseDir);
89
+ if (!registry.workspaces[slug]) {
90
+ throw new Error(`Workspace "${slug}" not found`);
91
+ }
92
+ registry.workspaces[slug].nickname = nickname;
93
+ saveRegistry(registry, baseDir);
94
+ }
95
+ export function getActiveCredentials(baseDir = DEFAULT_BASE_DIR) {
96
+ const registry = loadRegistry(baseDir);
97
+ if (!registry.active_workspace)
98
+ return undefined;
99
+ try {
100
+ return loadCredentials(registry.active_workspace, baseDir);
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ export function listWorkspaces(baseDir = DEFAULT_BASE_DIR) {
107
+ const registry = loadRegistry(baseDir);
108
+ return Object.entries(registry.workspaces)
109
+ .map(([slug, meta]) => {
110
+ let email = "";
111
+ try {
112
+ const creds = loadCredentials(slug, baseDir);
113
+ email = creds.email;
114
+ }
115
+ catch { /* missing credentials */ }
116
+ return { slug, nickname: meta.nickname, added_at: meta.added_at, email };
117
+ })
118
+ .sort((a, b) => a.added_at - b.added_at);
119
+ }
120
+ /** Resolve the data directory for a workspace's state files. */
121
+ let _cachedDataDir;
122
+ export function workspaceDataDir(slug, baseDir = DEFAULT_BASE_DIR) {
123
+ if (slug) {
124
+ return join(baseDir, "workspaces", slug);
125
+ }
126
+ if (!_cachedDataDir) {
127
+ const registry = loadRegistry(baseDir);
128
+ if (registry.active_workspace) {
129
+ _cachedDataDir = join(baseDir, "workspaces", registry.active_workspace);
130
+ }
131
+ else {
132
+ // Fallback to base dir if no workspace (pre-registration)
133
+ return baseDir;
134
+ }
135
+ }
136
+ return _cachedDataDir;
137
+ }
138
+ /** Reset cached data dir (for testing or after workspace switch). */
139
+ export function resetDataDirCache() {
140
+ _cachedDataDir = undefined;
141
+ }
142
+ /**
143
+ * Resolve a workspace slug from a slug-or-nickname input.
144
+ * Resolution: exact slug → case-insensitive nickname → null.
145
+ */
146
+ export function resolveSlug(input, baseDir = DEFAULT_BASE_DIR) {
147
+ const registry = loadRegistry(baseDir);
148
+ if (registry.workspaces[input])
149
+ return input;
150
+ const lower = input.toLowerCase();
151
+ for (const [slug, meta] of Object.entries(registry.workspaces)) {
152
+ if (meta.nickname?.toLowerCase() === lower)
153
+ return slug;
154
+ }
155
+ return null;
156
+ }
157
+ // --- Migration ---
158
+ export function migrateIfNeeded(baseDir = DEFAULT_BASE_DIR, legacyMcpPath) {
159
+ const configPath = join(baseDir, "config.json");
160
+ let data = {};
161
+ try {
162
+ data = JSON.parse(readFileSync(configPath, "utf-8"));
163
+ }
164
+ catch {
165
+ return; // No config file — nothing to migrate
166
+ }
167
+ // Already migrated
168
+ if (data.active_workspace !== undefined)
169
+ return;
170
+ // No api_key — nothing to migrate
171
+ if (!data.api_key)
172
+ return;
173
+ const slug = data.workspace_slug || "default";
174
+ const wsDir = join(baseDir, "workspaces", slug);
175
+ mkdirSync(wsDir, { recursive: true });
176
+ // Write credentials
177
+ const credentials = {
178
+ api_key: data.api_key,
179
+ email: data.email || "",
180
+ workspace_id: String(data.workspace_id || ""),
181
+ workspace_slug: slug,
182
+ };
183
+ writeFileSync(join(wsDir, "credentials.json"), JSON.stringify(credentials, null, 2), "utf-8");
184
+ // Move state files
185
+ for (const file of STATE_FILES) {
186
+ const src = join(baseDir, file);
187
+ const dest = join(wsDir, file);
188
+ if (existsSync(src)) {
189
+ try {
190
+ renameSync(src, dest);
191
+ }
192
+ catch {
193
+ // Cross-device move fallback
194
+ writeFileSync(dest, readFileSync(src));
195
+ rmSync(src);
196
+ }
197
+ }
198
+ }
199
+ // Build new config — preserve global settings, remove credential fields
200
+ const { api_key, email, workspace_id, workspace_slug, ...globalSettings } = data;
201
+ const newConfig = {
202
+ ...globalSettings,
203
+ active_workspace: slug,
204
+ workspaces: {
205
+ [slug]: { added_at: Date.now() },
206
+ },
207
+ };
208
+ writeFileSync(configPath, JSON.stringify(newConfig, null, 2), "utf-8");
209
+ // Migrate legacy MCP config if present
210
+ const mcpPath = legacyMcpPath ?? join(homedir(), ".nex-mcp.json");
211
+ try {
212
+ const mcpData = JSON.parse(readFileSync(mcpPath, "utf-8"));
213
+ if (mcpData.api_key && mcpData.workspace_slug && mcpData.workspace_slug !== slug) {
214
+ // Different workspace — add it
215
+ const mcpSlug = mcpData.workspace_slug;
216
+ const mcpWsDir = join(baseDir, "workspaces", mcpSlug);
217
+ mkdirSync(mcpWsDir, { recursive: true });
218
+ const mcpCreds = {
219
+ api_key: mcpData.api_key,
220
+ email: mcpData.email || "",
221
+ workspace_id: String(mcpData.workspace_id || ""),
222
+ workspace_slug: mcpSlug,
223
+ };
224
+ writeFileSync(join(mcpWsDir, "credentials.json"), JSON.stringify(mcpCreds, null, 2), "utf-8");
225
+ newConfig.workspaces[mcpSlug] = { added_at: Date.now() };
226
+ writeFileSync(configPath, JSON.stringify(newConfig, null, 2), "utf-8");
227
+ }
228
+ // Backup legacy file
229
+ renameSync(mcpPath, mcpPath + ".bak");
230
+ }
231
+ catch {
232
+ // No MCP config or already backed up — fine
233
+ }
234
+ }
235
+ // --- Helpers ---
236
+ function loadCredentials(slug, baseDir) {
237
+ const credPath = join(baseDir, "workspaces", slug, "credentials.json");
238
+ return JSON.parse(readFileSync(credPath, "utf-8"));
239
+ }
240
+ //# sourceMappingURL=workspace-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.js","sourceRoot":"","sources":["../../src/lib/workspace-registry.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,8 @@ const STATE_PATH = join(STATE_DIR, "channel-state.json");
17
17
  const DIGEST_CHECK_INTERVAL_MS = 60 * 60 * 1000;
18
18
  /** Minimum gap between daily digests (24 hours). */
19
19
  const DIGEST_COOLDOWN_MS = 24 * 60 * 60 * 1000;
20
- /** How often to poll for proactive notifications (5 minutes). */
21
- const NOTIFY_INTERVAL_MS = 5 * 60 * 1000;
20
+ /** How often to poll for proactive notifications. Configurable via NEX_NOTIFY_INTERVAL_MINUTES env (default: 15). */
21
+ const NOTIFY_INTERVAL_MS = Math.max(1, parseInt(process.env.NEX_NOTIFY_INTERVAL_MINUTES ?? "15", 10)) * 60 * 1000;
22
22
  /** Delay before the first digest check after startup (10 seconds). */
23
23
  const INITIAL_DIGEST_DELAY_MS = 10_000;
24
24
  /** Delay before the first notification check after startup (15 seconds). */
@@ -90,7 +90,8 @@ async function checkNotifications(server, client, state) {
90
90
  const now = Date.now();
91
91
  try {
92
92
  const lastCheck = state.lastNotifyCheckAt || now - NOTIFY_INTERVAL_MS;
93
- const minutesSinceLastCheck = Math.max(5, Math.ceil((now - lastCheck) / 60_000));
93
+ const notifyIntervalMinutes = NOTIFY_INTERVAL_MS / 60_000;
94
+ const minutesSinceLastCheck = Math.max(notifyIntervalMinutes, Math.ceil((now - lastCheck) / 60_000));
94
95
  const result = (await client.get(`/v1/insights?last=${minutesSinceLastCheck}m&limit=10`));
95
96
  state.lastNotifyCheckAt = now;
96
97
  saveState(state);
@@ -130,6 +131,6 @@ export function startChannel(server, client) {
130
131
  // --- Proactive notifications ---
131
132
  setTimeout(() => checkNotifications(server, client, state), INITIAL_NOTIFY_DELAY_MS);
132
133
  setInterval(() => checkNotifications(server, client, state), NOTIFY_INTERVAL_MS);
133
- console.error("[nex-channel] started (digest: 24h, notifications: 5m)");
134
+ console.error(`[nex-channel] started (digest: 24h, notifications: ${NOTIFY_INTERVAL_MS / 60_000}m)`);
134
135
  }
135
136
  //# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/mcp/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/mcp/channel.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,11 @@ interface NexMcpConfig {
9
9
  }
10
10
  export declare function loadConfig(): NexMcpConfig;
11
11
  export declare function saveConfig(config: NexMcpConfig): void;
12
+ interface WorkspaceCredentials {
13
+ api_key?: string;
14
+ [key: string]: unknown;
15
+ }
16
+ export declare function loadWorkspaceCredentials(): WorkspaceCredentials;
12
17
  export declare function loadApiKey(): string | undefined;
13
18
  export declare function persistRegistration(data: Record<string, unknown>): void;
14
19
  export { CONFIG_PATH };
@@ -1,6 +1,7 @@
1
1
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join, dirname } from "node:path";
4
+ import { workspaceDataDir } from "./workspace-data-dir.js";
4
5
  const CONFIG_PATH = join(homedir(), ".nex", "config.json");
5
6
  export function loadConfig() {
6
7
  try {
@@ -15,8 +16,22 @@ export function saveConfig(config) {
15
16
  mkdirSync(dirname(CONFIG_PATH), { recursive: true });
16
17
  writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
17
18
  }
19
+ export function loadWorkspaceCredentials() {
20
+ try {
21
+ const credPath = join(workspaceDataDir(), "credentials.json");
22
+ const raw = readFileSync(credPath, "utf-8");
23
+ return JSON.parse(raw);
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ }
18
29
  export function loadApiKey() {
19
- return process.env.NEX_API_KEY || loadConfig().api_key || undefined;
30
+ // NEX_API_KEY env workspace credentials → legacy config → undefined
31
+ return (process.env.NEX_API_KEY ||
32
+ loadWorkspaceCredentials().api_key ||
33
+ loadConfig().api_key ||
34
+ undefined);
20
35
  }
21
36
  export function persistRegistration(data) {
22
37
  const existing = loadConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAW3D,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU,EAAE,CAAC,OAAO,IAAI,SAAS,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACtE,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnF,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ;QAAE,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3F,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAW3D,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAOD,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,sEAAsE;IACtE,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,wBAAwB,EAAE,CAAC,OAAO;QAClC,UAAU,EAAE,CAAC,OAAO;QACpB,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACtE,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnF,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ;QAAE,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3F,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Persistent file manifest — tracks which files have been ingested
3
3
  * using mtime + size as change detection.
4
4
  *
5
- * Stored at ~/.nex/file-scan-manifest.json.
5
+ * Stored at <workspaceDataDir>/file-scan-manifest.json.
6
6
  */
7
7
  import { type Stats } from "node:fs";
8
8
  export interface FileManifestEntry {
@@ -2,16 +2,20 @@
2
2
  * Persistent file manifest — tracks which files have been ingested
3
3
  * using mtime + size as change detection.
4
4
  *
5
- * Stored at ~/.nex/file-scan-manifest.json.
5
+ * Stored at <workspaceDataDir>/file-scan-manifest.json.
6
6
  */
7
7
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
- import { homedir } from "node:os";
10
- const DATA_DIR = join(homedir(), ".nex");
11
- const MANIFEST_PATH = join(DATA_DIR, "file-scan-manifest.json");
9
+ import { workspaceDataDir } from "./workspace-data-dir.js";
10
+ function dataDir() {
11
+ return workspaceDataDir();
12
+ }
13
+ function manifestPath() {
14
+ return join(dataDir(), "file-scan-manifest.json");
15
+ }
12
16
  export function readManifest() {
13
17
  try {
14
- const raw = readFileSync(MANIFEST_PATH, "utf-8");
18
+ const raw = readFileSync(manifestPath(), "utf-8");
15
19
  const data = JSON.parse(raw);
16
20
  if (data && data.version === 1 && data.files) {
17
21
  return data;
@@ -24,8 +28,8 @@ export function readManifest() {
24
28
  }
25
29
  export function writeManifest(manifest) {
26
30
  try {
27
- mkdirSync(DATA_DIR, { recursive: true });
28
- writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2), "utf-8");
31
+ mkdirSync(dataDir(), { recursive: true });
32
+ writeFileSync(manifestPath(), JSON.stringify(manifest, null, 2), "utf-8");
29
33
  }
30
34
  catch {
31
35
  // Best-effort — if we can't write, next scan re-ingests
@@ -1 +1 @@
1
- {"version":3,"file":"file-manifest.js","sourceRoot":"","sources":["../../src/mcp/file-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;AAehE,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAW,EAAE,QAAsB;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAW,EAAE,OAAe,EAAE,QAAsB;IAC7F,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;QACrB,KAAK,EAAE,IAAI,CAAC,OAAO;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAsB;IAChD,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE3D,MAAM,UAAU,WAAW,CAAC,QAAsB,EAAE,QAAQ,GAAG,yBAAyB;IACtF,IAAI,CAAC,QAAQ,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"file-manifest.js","sourceRoot":"","sources":["../../src/mcp/file-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,SAAS,OAAO;IACd,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAC;AACpD,CAAC;AAeD,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAW,EAAE,QAAsB;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAW,EAAE,OAAe,EAAE,QAAsB;IAC7F,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;QACrB,KAAK,EAAE,IAAI,CAAC,OAAO;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAsB;IAChD,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE3D,MAAM,UAAU,WAAW,CAAC,QAAsB,EAAE,QAAQ,GAAG,yBAAyB;IACtF,IAAI,CAAC,QAAQ,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC;AACrD,CAAC"}
@@ -7,11 +7,11 @@
7
7
  */
8
8
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
9
  import { join } from "node:path";
10
- import { homedir } from "node:os";
10
+ import { workspaceDataDir } from "./workspace-data-dir.js";
11
11
  const DEFAULTS = {
12
12
  maxRequests: 10,
13
13
  windowMs: 60_000,
14
- dataDir: join(homedir(), ".nex"),
14
+ dataDir: workspaceDataDir(),
15
15
  };
16
16
  export class RateLimiter {
17
17
  config;
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/mcp/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQlC,MAAM,QAAQ,GAAsB;IAClC,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,OAAO,WAAW;IACd,MAAM,CAAoB;IAC1B,QAAQ,CAAS;IAEzB,YAAY,MAAmC;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,UAAoB;QAC1C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,UAAU;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvF,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/mcp/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQ3D,MAAM,QAAQ,GAAsB;IAClC,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,gBAAgB,EAAE;CAC5B,CAAC;AAEF,MAAM,OAAO,WAAW;IACd,MAAM,CAAoB;IAC1B,QAAQ,CAAS;IAEzB,YAAY,MAAmC;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,UAAoB;QAC1C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,UAAU;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvF,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -4,9 +4,9 @@
4
4
  */
5
5
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
6
6
  import { join } from "node:path";
7
- import { homedir } from "node:os";
7
+ import { workspaceDataDir } from "./workspace-data-dir.js";
8
8
  const DEFAULT_MAX = 100;
9
- const DEFAULT_DATA_DIR = join(homedir(), ".nex");
9
+ const DEFAULT_DATA_DIR = workspaceDataDir();
10
10
  export class SessionStore {
11
11
  filePath;
12
12
  maxSize;
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/mcp/session-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAExB,YAAY,MAAoC;QAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,WAAW,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACnD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAA6B;QAC9C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,UAAkB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,UAAkB,EAAE,YAAoB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAG,CAAC;YAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI;QACN,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;CACF"}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/mcp/session-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;AAE5C,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAExB,YAAY,MAAoC;QAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,WAAW,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACnD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAA6B;QAC9C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,UAAkB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,UAAkB,EAAE,YAAoB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAG,CAAC;YAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI;QACN,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function workspaceDataDir(): string;
2
+ export declare function resetWorkspaceCache(): void;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Resolve the active workspace's data directory for the MCP server.
3
+ * Reads from ~/.nex/config.json (workspace registry format).
4
+ * Falls back to ~/.nex/ if no workspace is configured (pre-migration).
5
+ */
6
+ import { readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { homedir } from "node:os";
9
+ const BASE_DIR = process.env.NEX_BASE_DIR || join(homedir(), ".nex");
10
+ let _cached;
11
+ export function workspaceDataDir() {
12
+ if (_cached)
13
+ return _cached;
14
+ try {
15
+ const raw = readFileSync(join(BASE_DIR, "config.json"), "utf-8");
16
+ const config = JSON.parse(raw);
17
+ if (config.active_workspace) {
18
+ _cached = join(BASE_DIR, "workspaces", config.active_workspace);
19
+ return _cached;
20
+ }
21
+ }
22
+ catch { /* fall back */ }
23
+ return BASE_DIR;
24
+ }
25
+ export function resetWorkspaceCache() {
26
+ _cached = undefined;
27
+ }
28
+ //# sourceMappingURL=workspace-data-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-data-dir.js","sourceRoot":"","sources":["../../src/mcp/workspace-data-dir.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAErE,IAAI,OAA2B,CAAC;AAEhC,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAChE,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline TaskComplete hook — auto-capture to Nex.
4
+ * Input: { taskComplete: { result: string } }
5
+ * Output: {}
6
+ */
7
+ export {};
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline TaskComplete hook — auto-capture to Nex.
4
+ * Input: { taskComplete: { result: string } }
5
+ * Output: {}
6
+ */
7
+ import { doCapture, readStdin } from "../shared.js";
8
+ async function main() {
9
+ try {
10
+ const raw = await readStdin();
11
+ let input = {};
12
+ try {
13
+ input = JSON.parse(raw);
14
+ }
15
+ catch { /* defaults */ }
16
+ await doCapture({ message: input.taskComplete?.result ?? "" });
17
+ process.stdout.write("{}");
18
+ }
19
+ catch (err) {
20
+ process.stderr.write(`[nex-cline] Capture error: ${err instanceof Error ? err.message : String(err)}\n`);
21
+ process.stdout.write("{}");
22
+ }
23
+ }
24
+ main().then(() => process.exit(0)).catch(() => process.exit(0));
25
+ //# sourceMappingURL=cline-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline-capture.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cline-capture.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMpD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAe,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAEzD,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline UserPromptSubmit hook — auto-recall from Nex.
4
+ * Input: { userPromptSubmit: { prompt: string } }
5
+ * Output: { contextModification: "..." } or {}
6
+ */
7
+ export {};
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline UserPromptSubmit hook — auto-recall from Nex.
4
+ * Input: { userPromptSubmit: { prompt: string } }
5
+ * Output: { contextModification: "..." } or {}
6
+ */
7
+ import { doRecall, readStdin } from "../shared.js";
8
+ async function main() {
9
+ try {
10
+ const raw = await readStdin();
11
+ let input = {};
12
+ try {
13
+ input = JSON.parse(raw);
14
+ }
15
+ catch { /* defaults */ }
16
+ const prompt = input.userPromptSubmit?.prompt ?? "";
17
+ const result = await doRecall(prompt, input.session_id);
18
+ if (!result) {
19
+ process.stdout.write("{}");
20
+ return;
21
+ }
22
+ process.stdout.write(JSON.stringify({ contextModification: result.context }));
23
+ }
24
+ catch (err) {
25
+ process.stderr.write(`[nex-cline] Recall error: ${err instanceof Error ? err.message : String(err)}\n`);
26
+ process.stdout.write("{}");
27
+ }
28
+ }
29
+ main().then(() => process.exit(0)).catch(() => process.exit(0));
30
+ //# sourceMappingURL=cline-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline-recall.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cline-recall.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOnD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAe,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,MAAM,IAAI,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline TaskStart hook — load baseline context from Nex.
4
+ * Input: { taskStart: { task: string } }
5
+ * Output: { contextModification: "..." } or {}
6
+ */
7
+ export {};
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cline TaskStart hook — load baseline context from Nex.
4
+ * Input: { taskStart: { task: string } }
5
+ * Output: { contextModification: "..." } or {}
6
+ */
7
+ import { doSessionStart, readStdin } from "../shared.js";
8
+ async function main() {
9
+ try {
10
+ const raw = await readStdin();
11
+ let input = {};
12
+ try {
13
+ input = JSON.parse(raw);
14
+ }
15
+ catch { /* defaults */ }
16
+ const result = await doSessionStart("startup", input.session_id);
17
+ if (!result) {
18
+ process.stdout.write("{}");
19
+ return;
20
+ }
21
+ const context = result.registrationPrompt ?? result.context;
22
+ process.stdout.write(JSON.stringify({ contextModification: context }));
23
+ }
24
+ catch (err) {
25
+ process.stderr.write(`[nex-cline] Task start error: ${err instanceof Error ? err.message : String(err)}\n`);
26
+ process.stdout.write("{}");
27
+ }
28
+ }
29
+ main().then(() => process.exit(0)).catch(() => process.exit(0));
30
+ //# sourceMappingURL=cline-task-start.js.map