@nex-ai/nex 0.1.37 → 0.1.38
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 +0 -2
- package/dist/cli.js.map +1 -1
- 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 +4 -33
- package/dist/lib/config.js.map +1 -1
- package/dist/mcp/config.d.ts +0 -5
- package/dist/mcp/config.js +1 -16
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/file-manifest.d.ts +1 -1
- package/dist/mcp/file-manifest.js +7 -11
- 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/plugin/auto-register.d.ts +1 -1
- package/dist/plugin/auto-register.js +6 -34
- package/dist/plugin/auto-register.js.map +1 -1
- package/dist/plugin/config.d.ts +4 -11
- package/dist/plugin/config.js +5 -21
- package/dist/plugin/config.js.map +1 -1
- package/dist/plugin/file-manifest.js +6 -10
- 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 +6 -10
- package/dist/plugin/recall-filter.js.map +1 -1
- package/dist/plugin/session-store.js +3 -2
- package/dist/plugin/session-store.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/workspace.d.ts +0 -8
- package/dist/commands/workspace.js +0 -251
- package/dist/commands/workspace.js.map +0 -1
- package/dist/lib/workspace-registry.d.ts +0 -47
- package/dist/lib/workspace-registry.js +0 -240
- package/dist/lib/workspace-registry.js.map +0 -1
- package/dist/mcp/workspace-data-dir.d.ts +0 -2
- package/dist/mcp/workspace-data-dir.js +0 -28
- package/dist/mcp/workspace-data-dir.js.map +0 -1
- package/dist/plugin/adapters/cline-capture.d.ts +0 -7
- package/dist/plugin/adapters/cline-capture.js +0 -25
- package/dist/plugin/adapters/cline-capture.js.map +0 -1
- package/dist/plugin/adapters/cline-recall.d.ts +0 -7
- package/dist/plugin/adapters/cline-recall.js +0 -30
- package/dist/plugin/adapters/cline-recall.js.map +0 -1
- package/dist/plugin/adapters/cline-task-start.d.ts +0 -7
- package/dist/plugin/adapters/cline-task-start.js +0 -30
- package/dist/plugin/adapters/cline-task-start.js.map +0 -1
- package/dist/plugin/adapters/cursor-recall.d.ts +0 -7
- package/dist/plugin/adapters/cursor-recall.js +0 -31
- package/dist/plugin/adapters/cursor-recall.js.map +0 -1
- package/dist/plugin/adapters/cursor-session-start.d.ts +0 -7
- package/dist/plugin/adapters/cursor-session-start.js +0 -30
- package/dist/plugin/adapters/cursor-session-start.js.map +0 -1
- package/dist/plugin/adapters/cursor-stop.d.ts +0 -7
- package/dist/plugin/adapters/cursor-stop.js +0 -25
- package/dist/plugin/adapters/cursor-stop.js.map +0 -1
- package/dist/plugin/adapters/windsurf-capture.d.ts +0 -7
- package/dist/plugin/adapters/windsurf-capture.js +0 -25
- package/dist/plugin/adapters/windsurf-capture.js.map +0 -1
- package/dist/plugin/adapters/windsurf-recall.d.ts +0 -7
- package/dist/plugin/adapters/windsurf-recall.js +0 -31
- package/dist/plugin/adapters/windsurf-recall.js.map +0 -1
- package/dist/plugin/shared.d.ts +0 -39
- package/dist/plugin/shared.js +0 -380
- package/dist/plugin/shared.js.map +0 -1
- package/dist/plugin/workspace-data-dir.d.ts +0 -2
- package/dist/plugin/workspace-data-dir.js +0 -31
- package/dist/plugin/workspace-data-dir.js.map +0 -1
|
@@ -1,240 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-registry.js","sourceRoot":"","sources":["../../src/lib/workspace-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cline-task-start.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cline-task-start.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,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,MAAM,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,OAAO,CAAC;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5G,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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Cursor userPromptSubmit hook — auto-recall from Nex.
|
|
4
|
-
* Input: { prompt?: string, attachments?: unknown[], session_id?: string }
|
|
5
|
-
* Output: { continue: true, user_message: "<original + context>" } 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.prompt ?? "";
|
|
17
|
-
const result = await doRecall(prompt, input.session_id);
|
|
18
|
-
if (!result) {
|
|
19
|
-
process.stdout.write("{}");
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// Inject context as additional_context (Cursor's context injection mechanism)
|
|
23
|
-
process.stdout.write(JSON.stringify({ additional_context: result.context }));
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
process.stderr.write(`[nex-cursor] Recall error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
27
|
-
process.stdout.write("{}");
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
main().then(() => process.exit(0)).catch(() => process.exit(0));
|
|
31
|
-
//# sourceMappingURL=cursor-recall.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-recall.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cursor-recall.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQnD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAgB,EAAE,CAAC;QAC5B,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,MAAM,IAAI,EAAE,CAAC;QAClC,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,8EAA8E;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Cursor sessionStart hook — load baseline context from Nex.
|
|
4
|
-
* Input: { session_id?: string }
|
|
5
|
-
* Output: { additional_context: "..." } 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({ additional_context: context }));
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
process.stderr.write(`[nex-cursor] Session 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=cursor-session-start.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-session-start.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cursor-session-start.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,GAA4B,EAAE,CAAC;QACxC,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,MAAM,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,OAAO,CAAC;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChH,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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Cursor stop hook — auto-capture conversation to Nex.
|
|
4
|
-
* Input: { last_message?: string, status?: string, session_id?: 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.last_message ?? "" });
|
|
17
|
-
process.stdout.write("{}");
|
|
18
|
-
}
|
|
19
|
-
catch (err) {
|
|
20
|
-
process.stderr.write(`[nex-cursor] 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=cursor-stop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-stop.js","sourceRoot":"","sources":["../../../src/plugin/adapters/cursor-stop.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQpD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAoB,EAAE,CAAC;QAChC,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,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1G,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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Windsurf post_cascade_response hook — auto-capture to Nex.
|
|
4
|
-
* Input: { tool_info: { response: 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.tool_info?.response ?? "" });
|
|
17
|
-
process.stdout.write("{}");
|
|
18
|
-
}
|
|
19
|
-
catch (err) {
|
|
20
|
-
process.stderr.write(`[nex-windsurf] 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=windsurf-capture.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"windsurf-capture.js","sourceRoot":"","sources":["../../../src/plugin/adapters/windsurf-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,GAAkB,EAAE,CAAC;QAC9B,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,SAAS,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5G,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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Windsurf pre_user_prompt hook — auto-recall from Nex.
|
|
4
|
-
* Input: { tool_info: { user_prompt: string } }
|
|
5
|
-
* Output: context string on stdout (displayed via show_output) 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.tool_info?.user_prompt ?? "";
|
|
17
|
-
const result = await doRecall(prompt, input.session_id);
|
|
18
|
-
if (!result) {
|
|
19
|
-
process.stdout.write("{}");
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// Windsurf displays stdout content via show_output
|
|
23
|
-
process.stdout.write(JSON.stringify({ additional_context: result.context }));
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
process.stderr.write(`[nex-windsurf] Recall error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
27
|
-
process.stdout.write("{}");
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
main().then(() => process.exit(0)).catch(() => process.exit(0));
|
|
31
|
-
//# sourceMappingURL=windsurf-recall.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"windsurf-recall.js","sourceRoot":"","sources":["../../../src/plugin/adapters/windsurf-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,GAAkB,EAAE,CAAC;QAC9B,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,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;QAClD,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,mDAAmD;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3G,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"}
|