@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.
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/workspace.d.ts +8 -0
- package/dist/commands/workspace.js +251 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +2 -2
- package/dist/lib/config.js +33 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/workspace-registry.d.ts +47 -0
- package/dist/lib/workspace-registry.js +240 -0
- package/dist/lib/workspace-registry.js.map +1 -0
- package/dist/mcp/channel.js +5 -4
- package/dist/mcp/channel.js.map +1 -1
- package/dist/mcp/config.d.ts +5 -0
- package/dist/mcp/config.js +16 -1
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/file-manifest.d.ts +1 -1
- package/dist/mcp/file-manifest.js +11 -7
- package/dist/mcp/file-manifest.js.map +1 -1
- package/dist/mcp/rate-limiter.js +2 -2
- package/dist/mcp/rate-limiter.js.map +1 -1
- package/dist/mcp/session-store.js +2 -2
- package/dist/mcp/session-store.js.map +1 -1
- package/dist/mcp/workspace-data-dir.d.ts +2 -0
- package/dist/mcp/workspace-data-dir.js +28 -0
- package/dist/mcp/workspace-data-dir.js.map +1 -0
- package/dist/plugin/adapters/cline-capture.d.ts +7 -0
- package/dist/plugin/adapters/cline-capture.js +25 -0
- package/dist/plugin/adapters/cline-capture.js.map +1 -0
- package/dist/plugin/adapters/cline-recall.d.ts +7 -0
- package/dist/plugin/adapters/cline-recall.js +30 -0
- package/dist/plugin/adapters/cline-recall.js.map +1 -0
- package/dist/plugin/adapters/cline-task-start.d.ts +7 -0
- package/dist/plugin/adapters/cline-task-start.js +30 -0
- package/dist/plugin/adapters/cline-task-start.js.map +1 -0
- package/dist/plugin/adapters/cursor-recall.d.ts +7 -0
- package/dist/plugin/adapters/cursor-recall.js +31 -0
- package/dist/plugin/adapters/cursor-recall.js.map +1 -0
- package/dist/plugin/adapters/cursor-session-start.d.ts +7 -0
- package/dist/plugin/adapters/cursor-session-start.js +30 -0
- package/dist/plugin/adapters/cursor-session-start.js.map +1 -0
- package/dist/plugin/adapters/cursor-stop.d.ts +7 -0
- package/dist/plugin/adapters/cursor-stop.js +25 -0
- package/dist/plugin/adapters/cursor-stop.js.map +1 -0
- package/dist/plugin/adapters/windsurf-capture.d.ts +7 -0
- package/dist/plugin/adapters/windsurf-capture.js +25 -0
- package/dist/plugin/adapters/windsurf-capture.js.map +1 -0
- package/dist/plugin/adapters/windsurf-recall.d.ts +7 -0
- package/dist/plugin/adapters/windsurf-recall.js +31 -0
- package/dist/plugin/adapters/windsurf-recall.js.map +1 -0
- package/dist/plugin/auto-register.d.ts +1 -1
- package/dist/plugin/auto-register.js +34 -6
- package/dist/plugin/auto-register.js.map +1 -1
- package/dist/plugin/config.d.ts +11 -4
- package/dist/plugin/config.js +21 -5
- package/dist/plugin/config.js.map +1 -1
- package/dist/plugin/file-manifest.js +10 -6
- package/dist/plugin/file-manifest.js.map +1 -1
- package/dist/plugin/rate-limiter.js +2 -2
- package/dist/plugin/rate-limiter.js.map +1 -1
- package/dist/plugin/recall-filter.js +10 -6
- package/dist/plugin/recall-filter.js.map +1 -1
- package/dist/plugin/session-store.js +2 -3
- package/dist/plugin/session-store.js.map +1 -1
- package/dist/plugin/shared.d.ts +39 -0
- package/dist/plugin/shared.js +380 -0
- package/dist/plugin/shared.js.map +1 -0
- package/dist/plugin/workspace-data-dir.d.ts +2 -0
- package/dist/plugin/workspace-data-dir.js +31 -0
- package/dist/plugin/workspace-data-dir.js.map +1 -0
- 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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"}
|
package/dist/mcp/channel.js
CHANGED
|
@@ -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 (
|
|
21
|
-
const NOTIFY_INTERVAL_MS =
|
|
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
|
|
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(
|
|
134
|
+
console.error(`[nex-channel] started (digest: 24h, notifications: ${NOTIFY_INTERVAL_MS / 60_000}m)`);
|
|
134
135
|
}
|
|
135
136
|
//# sourceMappingURL=channel.js.map
|
package/dist/mcp/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/mcp/channel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwBjC,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAEzD,iEAAiE;AACjE,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD,oDAAoD;AACpD,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/C,
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/mcp/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/config.d.ts
CHANGED
|
@@ -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 };
|
package/dist/mcp/config.js
CHANGED
|
@@ -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
|
-
|
|
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();
|
package/dist/mcp/config.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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 {
|
|
10
|
-
|
|
11
|
-
|
|
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(
|
|
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(
|
|
28
|
-
writeFileSync(
|
|
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,
|
|
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"}
|
package/dist/mcp/rate-limiter.js
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
|
-
import {
|
|
10
|
+
import { workspaceDataDir } from "./workspace-data-dir.js";
|
|
11
11
|
const DEFAULTS = {
|
|
12
12
|
maxRequests: 10,
|
|
13
13
|
windowMs: 60_000,
|
|
14
|
-
dataDir:
|
|
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;
|
|
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 {
|
|
7
|
+
import { workspaceDataDir } from "./workspace-data-dir.js";
|
|
8
8
|
const DEFAULT_MAX = 100;
|
|
9
|
-
const DEFAULT_DATA_DIR =
|
|
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;
|
|
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,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,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,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,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
|