@nex-ai/nex 0.1.33 → 0.1.34
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/agent/loop.d.ts +3 -9
- package/dist/agent/loop.js +13 -29
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/queues.d.ts +0 -1
- package/dist/agent/queues.js +0 -3
- package/dist/agent/queues.js.map +1 -1
- package/dist/agent/templates.js +3 -3
- package/dist/agent/templates.js.map +1 -1
- package/dist/index.js +1 -19
- package/dist/index.js.map +1 -1
- package/dist/plugin/auto-capture.js +106 -6
- package/dist/plugin/auto-capture.js.map +1 -1
- package/dist/plugin/auto-recall.js +79 -5
- package/dist/plugin/auto-recall.js.map +1 -1
- package/dist/plugin/auto-register.d.ts +1 -1
- package/dist/plugin/auto-register.js +8 -13
- package/dist/plugin/auto-register.js.map +1 -1
- package/dist/plugin/auto-scan.js +5 -0
- package/dist/plugin/auto-scan.js.map +1 -1
- package/dist/plugin/auto-session-start.d.ts +3 -0
- package/dist/plugin/auto-session-start.js +127 -8
- package/dist/plugin/auto-session-start.js.map +1 -1
- package/dist/plugin/config.d.ts +16 -7
- package/dist/plugin/config.js +20 -16
- package/dist/plugin/config.js.map +1 -1
- package/dist/plugin/context-format.d.ts +0 -4
- package/dist/plugin/context-format.js +0 -4
- package/dist/plugin/context-format.js.map +1 -1
- package/dist/plugin/file-manifest.d.ts +6 -0
- package/dist/plugin/file-manifest.js +16 -0
- package/dist/plugin/file-manifest.js.map +1 -1
- package/dist/plugin/nex-client.js +1 -1
- package/dist/plugin/nex-client.js.map +1 -1
- package/dist/plugin/recall-filter.d.ts +5 -14
- package/dist/plugin/recall-filter.js +44 -32
- package/dist/plugin/recall-filter.js.map +1 -1
- package/dist/plugin/shared.js +31 -22
- package/dist/plugin/shared.js.map +1 -1
- package/dist/tui/app.js +3 -3
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/services/agent-service.d.ts +0 -6
- package/dist/tui/services/agent-service.js +5 -39
- package/dist/tui/services/agent-service.js.map +1 -1
- package/dist/tui/slash-commands.d.ts +0 -2
- package/dist/tui/slash-commands.js +7 -150
- package/dist/tui/slash-commands.js.map +1 -1
- package/dist/tui/views/stream.d.ts +3 -6
- package/dist/tui/views/stream.js +51 -241
- package/dist/tui/views/stream.js.map +1 -1
- package/package.json +1 -2
- package/plugin-commands/integrate.md +15 -10
- package/plugin-commands/recall.md +1 -1
- package/dist/agent/message-router.d.ts +0 -26
- package/dist/agent/message-router.js +0 -114
- package/dist/agent/message-router.js.map +0 -1
- package/dist/agent/orchestrate.d.ts +0 -26
- package/dist/agent/orchestrate.js +0 -87
- package/dist/agent/orchestrate.js.map +0 -1
- package/dist/agent/providers/claude-bridge.d.ts +0 -13
- package/dist/agent/providers/claude-bridge.js +0 -161
- package/dist/agent/providers/claude-bridge.js.map +0 -1
- package/dist/agent/providers/claude-code.d.ts +0 -27
- package/dist/agent/providers/claude-code.js +0 -164
- package/dist/agent/providers/claude-code.js.map +0 -1
- package/dist/agent/providers/claude-worker.d.ts +0 -6
- package/dist/agent/providers/claude-worker.js +0 -28
- package/dist/agent/providers/claude-worker.js.map +0 -1
- package/dist/agent/providers/gemini.d.ts +0 -12
- package/dist/agent/providers/gemini.js +0 -110
- package/dist/agent/providers/gemini.js.map +0 -1
- package/dist/agent/providers/types.d.ts +0 -5
- package/dist/agent/providers/types.js +0 -2
- package/dist/agent/providers/types.js.map +0 -1
- package/dist/agent/tick-manager.d.ts +0 -20
- package/dist/agent/tick-manager.js +0 -50
- package/dist/agent/tick-manager.js.map +0 -1
- package/dist/lib/claude-code-installer.d.ts +0 -8
- package/dist/lib/claude-code-installer.js +0 -76
- package/dist/lib/claude-code-installer.js.map +0 -1
- package/dist/lib/nex-mcp-config.d.ts +0 -21
- package/dist/lib/nex-mcp-config.js +0 -33
- package/dist/lib/nex-mcp-config.js.map +0 -1
- package/dist/tui/components/agent-roster.d.ts +0 -7
- package/dist/tui/components/agent-roster.js +0 -66
- package/dist/tui/components/agent-roster.js.map +0 -1
- package/plugin-commands/add-field.md +0 -12
- package/plugin-commands/artifact.md +0 -14
- package/plugin-commands/create-note.md +0 -10
- package/plugin-commands/create-object.md +0 -10
- package/plugin-commands/create-record.md +0 -11
- package/plugin-commands/create-task.md +0 -10
- package/plugin-commands/insights.md +0 -13
- package/plugin-commands/link-records.md +0 -10
- package/plugin-commands/list-members.md +0 -15
- package/plugin-commands/lists.md +0 -14
- package/plugin-commands/notes.md +0 -13
- package/plugin-commands/record.md +0 -12
- package/plugin-commands/relationships.md +0 -12
- package/plugin-commands/schema.md +0 -12
- package/plugin-commands/search.md +0 -12
- package/plugin-commands/tasks.md +0 -13
- package/plugin-commands/timeline.md +0 -12
- package/plugin-commands/update-field.md +0 -10
- package/plugin-commands/update-record.md +0 -11
- package/plugin-commands/upsert-record.md +0 -13
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code provider — spawns a bridge server and communicates via HTTP fetch.
|
|
3
|
-
*
|
|
4
|
-
* The bridge runs as a separate Node.js process (not Bun) so child_process
|
|
5
|
-
* operations work normally. The TUI communicates with it via fetch() which
|
|
6
|
-
* works fine in Bun+Ink.
|
|
7
|
-
*/
|
|
8
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
9
|
-
import { join, dirname } from "node:path";
|
|
10
|
-
import { fileURLToPath } from "node:url";
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
// ── Bridge lifecycle ─────────────────────────────────────────────
|
|
14
|
-
let bridgeProcess = null;
|
|
15
|
-
let bridgePort = null;
|
|
16
|
-
let bridgeStarting = null;
|
|
17
|
-
/**
|
|
18
|
-
* Start the bridge server if not already running. Returns the port.
|
|
19
|
-
*/
|
|
20
|
-
export function startBridge() {
|
|
21
|
-
if (bridgePort !== null)
|
|
22
|
-
return Promise.resolve(bridgePort);
|
|
23
|
-
if (bridgeStarting)
|
|
24
|
-
return bridgeStarting;
|
|
25
|
-
bridgeStarting = new Promise((resolve, reject) => {
|
|
26
|
-
const bridgePath = join(__dirname, "claude-bridge.ts");
|
|
27
|
-
// Use tsx to run TypeScript directly; fall back to node
|
|
28
|
-
const proc = spawn("bun", ["run", bridgePath], {
|
|
29
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
30
|
-
detached: true,
|
|
31
|
-
env: { ...process.env },
|
|
32
|
-
});
|
|
33
|
-
proc.unref();
|
|
34
|
-
bridgeProcess = proc;
|
|
35
|
-
let portData = "";
|
|
36
|
-
const timeout = setTimeout(() => {
|
|
37
|
-
reject(new Error("Bridge server did not start within 10s"));
|
|
38
|
-
try {
|
|
39
|
-
proc.kill("SIGTERM");
|
|
40
|
-
}
|
|
41
|
-
catch { }
|
|
42
|
-
}, 10_000);
|
|
43
|
-
proc.stdout.on("data", (chunk) => {
|
|
44
|
-
portData += chunk.toString();
|
|
45
|
-
const lines = portData.split("\n");
|
|
46
|
-
for (const line of lines) {
|
|
47
|
-
const port = parseInt(line.trim(), 10);
|
|
48
|
-
if (!isNaN(port) && port > 0) {
|
|
49
|
-
clearTimeout(timeout);
|
|
50
|
-
bridgePort = port;
|
|
51
|
-
bridgeStarting = null;
|
|
52
|
-
resolve(port);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
proc.on("error", (err) => {
|
|
58
|
-
clearTimeout(timeout);
|
|
59
|
-
bridgeStarting = null;
|
|
60
|
-
reject(new Error(`Failed to start bridge: ${err.message}`));
|
|
61
|
-
});
|
|
62
|
-
proc.on("exit", (code) => {
|
|
63
|
-
if (bridgePort === null) {
|
|
64
|
-
clearTimeout(timeout);
|
|
65
|
-
bridgeStarting = null;
|
|
66
|
-
reject(new Error(`Bridge exited with code ${code} before printing port`));
|
|
67
|
-
}
|
|
68
|
-
// If it exits after we got the port, clear state
|
|
69
|
-
bridgeProcess = null;
|
|
70
|
-
bridgePort = null;
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
return bridgeStarting;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Start the bridge synchronously — call BEFORE Ink takes over.
|
|
77
|
-
* Spawns the bridge as a detached process and waits up to 5s for the port.
|
|
78
|
-
*/
|
|
79
|
-
export function startBridgeSync() {
|
|
80
|
-
if (bridgePort !== null)
|
|
81
|
-
return bridgePort;
|
|
82
|
-
const bridgePath = join(__dirname, "claude-bridge.ts");
|
|
83
|
-
// Bridge writes port to a temp file (avoids async stdout pipe issues)
|
|
84
|
-
const { existsSync: fse, readFileSync: fsr, unlinkSync: fsu } = require("node:fs");
|
|
85
|
-
const portFile = join(require("node:os").tmpdir(), "nex-bridge-port");
|
|
86
|
-
try {
|
|
87
|
-
fsu(portFile);
|
|
88
|
-
}
|
|
89
|
-
catch { }
|
|
90
|
-
const proc = spawn("bun", ["run", bridgePath], {
|
|
91
|
-
stdio: "ignore",
|
|
92
|
-
detached: true,
|
|
93
|
-
env: { ...process.env, NEX_BRIDGE_PORT_FILE: portFile },
|
|
94
|
-
});
|
|
95
|
-
proc.unref();
|
|
96
|
-
bridgeProcess = proc;
|
|
97
|
-
// Busy-wait for port file (pre-Ink, blocking is OK)
|
|
98
|
-
const deadline = Date.now() + 5_000;
|
|
99
|
-
while (Date.now() < deadline) {
|
|
100
|
-
if (fse(portFile)) {
|
|
101
|
-
const port = parseInt(fsr(portFile, "utf-8").trim(), 10);
|
|
102
|
-
if (!isNaN(port) && port > 0) {
|
|
103
|
-
bridgePort = port;
|
|
104
|
-
return port;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
spawnSync("sleep", ["0.05"]);
|
|
108
|
-
}
|
|
109
|
-
throw new Error("Bridge did not write port file within 5s");
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Stop the bridge server.
|
|
113
|
-
*/
|
|
114
|
-
export function stopBridge() {
|
|
115
|
-
if (bridgeProcess) {
|
|
116
|
-
try {
|
|
117
|
-
bridgeProcess.kill("SIGTERM");
|
|
118
|
-
}
|
|
119
|
-
catch { }
|
|
120
|
-
bridgeProcess = null;
|
|
121
|
-
}
|
|
122
|
-
bridgePort = null;
|
|
123
|
-
bridgeStarting = null;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Get the current bridge port, or null if not running.
|
|
127
|
-
*/
|
|
128
|
-
export function getBridgePort() {
|
|
129
|
-
return bridgePort;
|
|
130
|
-
}
|
|
131
|
-
// ── StreamFn provider ────────────────────────────────────────────
|
|
132
|
-
export function createClaudeCodeStreamFn(_agentSlug = "default", _cwd, _model) {
|
|
133
|
-
return async function* claudeCodeStream(messages, _tools) {
|
|
134
|
-
const lastMsg = messages[messages.length - 1];
|
|
135
|
-
const prompt = lastMsg?.content ?? "";
|
|
136
|
-
const context = messages.slice(0, -1)
|
|
137
|
-
.map(m => `${m.role}: ${m.content}`)
|
|
138
|
-
.join("\n")
|
|
139
|
-
.slice(-4000);
|
|
140
|
-
const fullPrompt = context
|
|
141
|
-
? `Context:\n${context}\n\nUser: ${prompt}`
|
|
142
|
-
: prompt;
|
|
143
|
-
try {
|
|
144
|
-
const port = await startBridge();
|
|
145
|
-
const res = await fetch(`http://127.0.0.1:${port}/invoke`, {
|
|
146
|
-
method: "POST",
|
|
147
|
-
headers: { "Content-Type": "application/json" },
|
|
148
|
-
body: JSON.stringify({ prompt: fullPrompt }),
|
|
149
|
-
});
|
|
150
|
-
const data = (await res.json());
|
|
151
|
-
yield { type: "text", content: data.text || "[Claude Code returned empty response]" };
|
|
152
|
-
}
|
|
153
|
-
catch (err) {
|
|
154
|
-
yield {
|
|
155
|
-
type: "text",
|
|
156
|
-
content: `Claude Code error: ${err instanceof Error ? err.message : String(err)}`,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
export function clearClaudeSession(_agentSlug) {
|
|
162
|
-
// Sessions are not persisted across bridge calls (--no-session-persistence)
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agent/providers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,oEAAoE;AAEpE,IAAI,aAAa,GAAwB,IAAI,CAAC;AAC9C,IAAI,UAAU,GAAkB,IAAI,CAAC;AACrC,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,cAAc,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAEvD,wDAAwD;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;YAC7C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,aAAa,GAAG,IAAI,CAAC;QAErB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACxC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC7B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,UAAU,GAAG,IAAI,CAAC;oBAClB,cAAc,GAAG,IAAI,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,cAAc,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,uBAAuB,CAAC,CAAC,CAAC;YAC5E,CAAC;YACD,iDAAiD;YACjD,aAAa,GAAG,IAAI,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAEvD,sEAAsE;IACtE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAA6B,CAAC;IAC/G,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACtE,IAAI,CAAC;QAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;QAC7C,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE;KACxD,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,aAAa,GAAG,IAAI,CAAC;IAErB,oDAAoD;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7B,UAAU,GAAG,IAAI,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAC/C,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,UAAU,GAAG,IAAI,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,oEAAoE;AAEpE,MAAM,UAAU,wBAAwB,CACtC,UAAU,GAAG,SAAS,EACtB,IAAa,EACb,MAAe;IAEf,OAAO,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACrC,QAAkD,EAClD,MAAM;QAEN,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAEtC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACnC,IAAI,CAAC,IAAI,CAAC;aACV,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAEhB,MAAM,UAAU,GAAG,OAAO;YACxB,CAAC,CAAC,aAAa,OAAO,aAAa,MAAM,EAAE;YAC3C,CAAC,CAAC,MAAM,CAAC;QAEX,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,EAAE;gBACzD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC7C,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyC,CAAC;YACxE,MAAM,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,uCAAuC,EAAE,CAAC;QACjG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM;gBACJ,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAClF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,4EAA4E;AAC9E,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Worker script — runs claude -p in its own event loop.
|
|
3
|
-
* Receives prompt + args via parentPort, posts result back.
|
|
4
|
-
* This avoids Bun/Ink's event loop stalling on child processes.
|
|
5
|
-
*/
|
|
6
|
-
import { parentPort } from "node:worker_threads";
|
|
7
|
-
import { execFileSync } from "node:child_process";
|
|
8
|
-
if (!parentPort) {
|
|
9
|
-
console.error("claude-worker must be run as a Worker thread");
|
|
10
|
-
process.exit(1);
|
|
11
|
-
}
|
|
12
|
-
parentPort.on("message", (msg) => {
|
|
13
|
-
try {
|
|
14
|
-
const stdout = execFileSync("claude", msg.args, {
|
|
15
|
-
timeout: 120_000,
|
|
16
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
17
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
18
|
-
});
|
|
19
|
-
parentPort.postMessage({ ok: true, stdout: stdout.toString() });
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
parentPort.postMessage({
|
|
23
|
-
ok: false,
|
|
24
|
-
error: err instanceof Error ? err.message : String(err),
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=claude-worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-worker.js","sourceRoot":"","sources":["../../../src/agent/providers/claude-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAuC,EAAE,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;YAC9C,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,UAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAW,CAAC,WAAW,CAAC;YACtB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gemini LLM stream function for the Pi-style agent loop.
|
|
3
|
-
* Uses @google/generative-ai SDK to stream responses from Gemini.
|
|
4
|
-
* Nex tools are passed as Gemini function declarations.
|
|
5
|
-
*/
|
|
6
|
-
import type { StreamFn } from "../types.js";
|
|
7
|
-
/**
|
|
8
|
-
* Create a StreamFn backed by Google Gemini.
|
|
9
|
-
* @param apiKey Gemini API key (from ai.google.dev)
|
|
10
|
-
* @param model Model name (default: gemini-2.5-flash)
|
|
11
|
-
*/
|
|
12
|
-
export declare function createGeminiStreamFn(apiKey: string, model?: string): StreamFn;
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gemini LLM stream function for the Pi-style agent loop.
|
|
3
|
-
* Uses @google/generative-ai SDK to stream responses from Gemini.
|
|
4
|
-
* Nex tools are passed as Gemini function declarations.
|
|
5
|
-
*/
|
|
6
|
-
import { GoogleGenerativeAI, SchemaType } from "@google/generative-ai";
|
|
7
|
-
/**
|
|
8
|
-
* Create a StreamFn backed by Google Gemini.
|
|
9
|
-
* @param apiKey Gemini API key (from ai.google.dev)
|
|
10
|
-
* @param model Model name (default: gemini-2.5-flash)
|
|
11
|
-
*/
|
|
12
|
-
export function createGeminiStreamFn(apiKey, model = "gemini-2.5-flash") {
|
|
13
|
-
const genAI = new GoogleGenerativeAI(apiKey);
|
|
14
|
-
return async function* geminiStream(messages, tools) {
|
|
15
|
-
// Convert Nex tools → Gemini function declarations
|
|
16
|
-
const functionDeclarations = tools.map(t => ({
|
|
17
|
-
name: t.name,
|
|
18
|
-
description: t.description,
|
|
19
|
-
parameters: convertSchema(t.schema),
|
|
20
|
-
}));
|
|
21
|
-
const geminiTools = functionDeclarations.length > 0
|
|
22
|
-
? [{ functionDeclarations }]
|
|
23
|
-
: [];
|
|
24
|
-
// Convert message history → Gemini format
|
|
25
|
-
const contents = messages.map(m => ({
|
|
26
|
-
role: m.role === "assistant" ? "model" : "user",
|
|
27
|
-
parts: [{ text: m.content }],
|
|
28
|
-
}));
|
|
29
|
-
// Ensure alternating user/model turns (Gemini requirement)
|
|
30
|
-
const sanitized = sanitizeContents(contents);
|
|
31
|
-
const generativeModel = genAI.getGenerativeModel({
|
|
32
|
-
model,
|
|
33
|
-
tools: geminiTools,
|
|
34
|
-
});
|
|
35
|
-
const result = await generativeModel.generateContentStream({
|
|
36
|
-
contents: sanitized,
|
|
37
|
-
});
|
|
38
|
-
for await (const chunk of result.stream) {
|
|
39
|
-
const candidate = chunk.candidates?.[0];
|
|
40
|
-
if (!candidate)
|
|
41
|
-
continue;
|
|
42
|
-
for (const part of candidate.content.parts) {
|
|
43
|
-
if (part.text) {
|
|
44
|
-
yield { type: "text", content: part.text };
|
|
45
|
-
}
|
|
46
|
-
if (part.functionCall) {
|
|
47
|
-
yield {
|
|
48
|
-
type: "tool_call",
|
|
49
|
-
toolName: part.functionCall.name,
|
|
50
|
-
toolParams: (part.functionCall.args ?? {}),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Convert a JSON Schema object to Gemini's FunctionDeclarationSchema format.
|
|
59
|
-
*/
|
|
60
|
-
function convertSchema(schema) {
|
|
61
|
-
const properties = (schema.properties ?? {});
|
|
62
|
-
const required = (schema.required ?? []);
|
|
63
|
-
const converted = {};
|
|
64
|
-
for (const [key, prop] of Object.entries(properties)) {
|
|
65
|
-
converted[key] = {
|
|
66
|
-
type: mapType(prop.type),
|
|
67
|
-
description: prop.description ?? "",
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
type: SchemaType.OBJECT,
|
|
72
|
-
properties: converted,
|
|
73
|
-
required,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function mapType(jsonType) {
|
|
77
|
-
switch (jsonType) {
|
|
78
|
-
case "string": return SchemaType.STRING;
|
|
79
|
-
case "number":
|
|
80
|
-
case "integer": return SchemaType.NUMBER;
|
|
81
|
-
case "boolean": return SchemaType.BOOLEAN;
|
|
82
|
-
case "array": return SchemaType.ARRAY;
|
|
83
|
-
default: return SchemaType.STRING;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Ensure contents alternate between user/model roles.
|
|
88
|
-
* Gemini requires strict alternation — merge consecutive same-role messages.
|
|
89
|
-
*/
|
|
90
|
-
function sanitizeContents(contents) {
|
|
91
|
-
if (contents.length === 0)
|
|
92
|
-
return [{ role: "user", parts: [{ text: "Hello" }] }];
|
|
93
|
-
const result = [];
|
|
94
|
-
for (const msg of contents) {
|
|
95
|
-
const last = result[result.length - 1];
|
|
96
|
-
if (last && last.role === msg.role) {
|
|
97
|
-
// Merge consecutive same-role messages
|
|
98
|
-
last.parts.push(...msg.parts);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
result.push({ ...msg, parts: [...msg.parts] });
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Gemini requires first message to be "user"
|
|
105
|
-
if (result[0]?.role !== "user") {
|
|
106
|
-
result.unshift({ role: "user", parts: [{ text: "Continue." }] });
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/agent/providers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TickManager: drives agent loops on a fixed interval.
|
|
3
|
-
* Each agent gets its own setInterval; ticks are skipped
|
|
4
|
-
* when the agent is idle with no queued work.
|
|
5
|
-
*/
|
|
6
|
-
export declare class TickManager {
|
|
7
|
-
private intervals;
|
|
8
|
-
private tickRateMs;
|
|
9
|
-
constructor(tickRateMs?: number);
|
|
10
|
-
startLoop(slug: string, loop: {
|
|
11
|
-
getState(): {
|
|
12
|
-
phase: string;
|
|
13
|
-
};
|
|
14
|
-
start(): void;
|
|
15
|
-
tick(): Promise<void>;
|
|
16
|
-
}, hasWork: () => boolean): void;
|
|
17
|
-
stopLoop(slug: string): void;
|
|
18
|
-
isRunning(slug: string): boolean;
|
|
19
|
-
stopAll(): void;
|
|
20
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TickManager: drives agent loops on a fixed interval.
|
|
3
|
-
* Each agent gets its own setInterval; ticks are skipped
|
|
4
|
-
* when the agent is idle with no queued work.
|
|
5
|
-
*/
|
|
6
|
-
export class TickManager {
|
|
7
|
-
intervals = new Map();
|
|
8
|
-
tickRateMs;
|
|
9
|
-
constructor(tickRateMs = 500) {
|
|
10
|
-
this.tickRateMs = tickRateMs;
|
|
11
|
-
}
|
|
12
|
-
startLoop(slug, loop, hasWork) {
|
|
13
|
-
if (this.intervals.has(slug))
|
|
14
|
-
return; // idempotent
|
|
15
|
-
const interval = setInterval(async () => {
|
|
16
|
-
const state = loop.getState();
|
|
17
|
-
// Only tick if there's pending work
|
|
18
|
-
if ((state.phase === 'done' || state.phase === 'error' || state.phase === 'idle') &&
|
|
19
|
-
!hasWork()) {
|
|
20
|
-
return; // idle skip
|
|
21
|
-
}
|
|
22
|
-
if (state.phase === 'done' || state.phase === 'error') {
|
|
23
|
-
loop.start(); // reset to idle
|
|
24
|
-
}
|
|
25
|
-
try {
|
|
26
|
-
await loop.tick();
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
/* swallow tick errors */
|
|
30
|
-
}
|
|
31
|
-
}, this.tickRateMs);
|
|
32
|
-
this.intervals.set(slug, interval);
|
|
33
|
-
}
|
|
34
|
-
stopLoop(slug) {
|
|
35
|
-
const interval = this.intervals.get(slug);
|
|
36
|
-
if (interval) {
|
|
37
|
-
clearInterval(interval);
|
|
38
|
-
this.intervals.delete(slug);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
isRunning(slug) {
|
|
42
|
-
return this.intervals.has(slug);
|
|
43
|
-
}
|
|
44
|
-
stopAll() {
|
|
45
|
-
for (const [slug] of this.intervals) {
|
|
46
|
-
this.stopLoop(slug);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=tick-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tick-manager.js","sourceRoot":"","sources":["../../src/agent/tick-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,WAAW;IACd,SAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC9D,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,GAAG;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,SAAS,CACP,IAAY,EACZ,IAA6E,EAC7E,OAAsB;QAEtB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,aAAa;QAEnD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,oCAAoC;YACpC,IACE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;gBAC7E,CAAC,OAAO,EAAE,EACV,CAAC;gBACD,OAAO,CAAC,YAAY;YACtB,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB;YAChC,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code plugin installer.
|
|
3
|
-
* Merges Nex hooks into Claude Code's ~/.claude/settings.json.
|
|
4
|
-
*/
|
|
5
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
6
|
-
import { resolve, dirname, join } from "node:path";
|
|
7
|
-
import { homedir } from "node:os";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = dirname(__filename);
|
|
11
|
-
export function installClaudeCodePlugin() {
|
|
12
|
-
// Resolve plugin directory: src/lib/ or dist/lib/ → up 3 levels → claude-code-plugin/
|
|
13
|
-
const pluginDir = resolve(__dirname, "..", "..", "..", "claude-code-plugin");
|
|
14
|
-
const pluginSettingsPath = join(pluginDir, "settings.json");
|
|
15
|
-
const claudeSettingsPath = join(homedir(), ".claude", "settings.json");
|
|
16
|
-
// 1. Check plugin directory exists
|
|
17
|
-
if (!existsSync(pluginDir) || !existsSync(pluginSettingsPath)) {
|
|
18
|
-
return {
|
|
19
|
-
success: false,
|
|
20
|
-
message: `Claude Code plugin not found at ${pluginDir}. Ensure the nex-as-a-skill repo is intact.`,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
// 2. Read plugin settings.json
|
|
24
|
-
let pluginSettingsRaw;
|
|
25
|
-
try {
|
|
26
|
-
pluginSettingsRaw = readFileSync(pluginSettingsPath, "utf-8");
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
return {
|
|
30
|
-
success: false,
|
|
31
|
-
message: `Failed to read plugin settings: ${err instanceof Error ? err.message : String(err)}`,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
// 3. Resolve <path-to> placeholders with actual plugin path
|
|
35
|
-
const resolvedRaw = pluginSettingsRaw.replace(/<path-to>/g, pluginDir);
|
|
36
|
-
let pluginSettings;
|
|
37
|
-
try {
|
|
38
|
-
pluginSettings = JSON.parse(resolvedRaw);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return {
|
|
42
|
-
success: false,
|
|
43
|
-
message: "Failed to parse plugin settings.json.",
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
// 4. Read existing Claude settings (or start fresh)
|
|
47
|
-
let claudeSettings = {};
|
|
48
|
-
try {
|
|
49
|
-
claudeSettings = JSON.parse(readFileSync(claudeSettingsPath, "utf-8"));
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// File doesn't exist yet
|
|
53
|
-
}
|
|
54
|
-
// 5. Merge hooks from plugin into Claude settings
|
|
55
|
-
const pluginHooks = pluginSettings.hooks;
|
|
56
|
-
if (pluginHooks) {
|
|
57
|
-
const existingHooks = claudeSettings.hooks ?? {};
|
|
58
|
-
claudeSettings.hooks = { ...existingHooks, ...pluginHooks };
|
|
59
|
-
}
|
|
60
|
-
// 6. Write back
|
|
61
|
-
try {
|
|
62
|
-
mkdirSync(dirname(claudeSettingsPath), { recursive: true });
|
|
63
|
-
writeFileSync(claudeSettingsPath, JSON.stringify(claudeSettings, null, 2) + "\n", "utf-8");
|
|
64
|
-
}
|
|
65
|
-
catch (err) {
|
|
66
|
-
return {
|
|
67
|
-
success: false,
|
|
68
|
-
message: `Failed to write Claude settings: ${err instanceof Error ? err.message : String(err)}`,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
success: true,
|
|
73
|
-
message: "Nex plugin installed into Claude Code. Open a new Claude Code session — Nex context will load automatically.",
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=claude-code-installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-installer.js","sourceRoot":"","sources":["../../src/lib/claude-code-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Legacy persistence for ~/.nex-mcp.json.
|
|
3
|
-
*
|
|
4
|
-
* DEPRECATED: All new config reads/writes should use ~/.nex/config.json
|
|
5
|
-
* via lib/config.ts. This module is kept for backward compatibility only.
|
|
6
|
-
* ~/.nex-mcp.json is read-only — never write to it.
|
|
7
|
-
*/
|
|
8
|
-
export interface NexMcpConfig {
|
|
9
|
-
api_key?: string;
|
|
10
|
-
workspace_id?: string;
|
|
11
|
-
workspace_slug?: string;
|
|
12
|
-
base_url?: string;
|
|
13
|
-
}
|
|
14
|
-
/** Read legacy ~/.nex-mcp.json. Prefer lib/config.ts loadConfig() instead. */
|
|
15
|
-
export declare function loadMcpConfig(): NexMcpConfig;
|
|
16
|
-
/**
|
|
17
|
-
* @deprecated No longer writes to ~/.nex-mcp.json. Use lib/config.ts saveConfig() instead.
|
|
18
|
-
* Kept as a no-op to avoid breaking callers that haven't been updated yet.
|
|
19
|
-
*/
|
|
20
|
-
export declare function saveMcpConfig(_config: NexMcpConfig): void;
|
|
21
|
-
export declare function getMcpConfigPath(): string;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Legacy persistence for ~/.nex-mcp.json.
|
|
3
|
-
*
|
|
4
|
-
* DEPRECATED: All new config reads/writes should use ~/.nex/config.json
|
|
5
|
-
* via lib/config.ts. This module is kept for backward compatibility only.
|
|
6
|
-
* ~/.nex-mcp.json is read-only — never write to it.
|
|
7
|
-
*/
|
|
8
|
-
import { readFileSync } from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { homedir } from "node:os";
|
|
11
|
-
const MCP_CONFIG_PATH = join(homedir(), ".nex-mcp.json");
|
|
12
|
-
/** Read legacy ~/.nex-mcp.json. Prefer lib/config.ts loadConfig() instead. */
|
|
13
|
-
export function loadMcpConfig() {
|
|
14
|
-
try {
|
|
15
|
-
const raw = readFileSync(MCP_CONFIG_PATH, "utf-8");
|
|
16
|
-
return JSON.parse(raw);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return {};
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* @deprecated No longer writes to ~/.nex-mcp.json. Use lib/config.ts saveConfig() instead.
|
|
24
|
-
* Kept as a no-op to avoid breaking callers that haven't been updated yet.
|
|
25
|
-
*/
|
|
26
|
-
export function saveMcpConfig(_config) {
|
|
27
|
-
// No-op: ~/.nex-mcp.json is now read-only (legacy fallback).
|
|
28
|
-
// All writes go to ~/.nex/config.json via lib/config.ts.
|
|
29
|
-
}
|
|
30
|
-
export function getMcpConfigPath() {
|
|
31
|
-
return MCP_CONFIG_PATH;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=nex-mcp-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nex-mcp-config.js","sourceRoot":"","sources":["../../src/lib/nex-mcp-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,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,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AASzD,8EAA8E;AAC9E,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,6DAA6D;IAC7D,yDAAyD;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,eAAe,CAAC;AACzB,CAAC"}
|