@nex-ai/nex 0.1.33 → 0.1.35
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 +6 -19
- package/dist/index.js.map +1 -1
- package/dist/mcp/channel.d.ts +28 -0
- package/dist/mcp/channel.js +135 -0
- package/dist/mcp/channel.js.map +1 -0
- package/dist/mcp/client.d.ts +20 -0
- package/dist/mcp/client.js +130 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +14 -0
- package/dist/mcp/config.js +33 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/context-files.d.ts +9 -0
- package/dist/mcp/context-files.js +90 -0
- package/dist/mcp/context-files.js.map +1 -0
- package/dist/mcp/file-manifest.d.ts +27 -0
- package/dist/mcp/file-manifest.js +64 -0
- package/dist/mcp/file-manifest.js.map +1 -0
- package/dist/mcp/file-scanner.d.ts +17 -0
- package/dist/mcp/file-scanner.js +77 -0
- package/dist/mcp/file-scanner.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +51 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/rate-limiter.d.ts +14 -0
- package/dist/mcp/rate-limiter.js +60 -0
- package/dist/mcp/rate-limiter.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session-store.d.ts +16 -0
- package/dist/mcp/session-store.js +70 -0
- package/dist/mcp/session-store.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +3 -0
- package/dist/mcp/tools/context.js +65 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/insights.d.ts +3 -0
- package/dist/mcp/tools/insights.js +24 -0
- package/dist/mcp/tools/insights.js.map +1 -0
- package/dist/mcp/tools/integrations.d.ts +3 -0
- package/dist/mcp/tools/integrations.js +27 -0
- package/dist/mcp/tools/integrations.js.map +1 -0
- package/dist/mcp/tools/lists.d.ts +3 -0
- package/dist/mcp/tools/lists.js +101 -0
- package/dist/mcp/tools/lists.js.map +1 -0
- package/dist/mcp/tools/notes.d.ts +3 -0
- package/dist/mcp/tools/notes.js +52 -0
- package/dist/mcp/tools/notes.js.map +1 -0
- package/dist/mcp/tools/records.d.ts +3 -0
- package/dist/mcp/tools/records.js +74 -0
- package/dist/mcp/tools/records.js.map +1 -0
- package/dist/mcp/tools/register.d.ts +3 -0
- package/dist/mcp/tools/register.js +30 -0
- package/dist/mcp/tools/register.js.map +1 -0
- package/dist/mcp/tools/relationships.d.ts +3 -0
- package/dist/mcp/tools/relationships.js +47 -0
- package/dist/mcp/tools/relationships.js.map +1 -0
- package/dist/mcp/tools/scan.d.ts +3 -0
- package/dist/mcp/tools/scan.js +37 -0
- package/dist/mcp/tools/scan.js.map +1 -0
- package/dist/mcp/tools/schema.d.ts +3 -0
- package/dist/mcp/tools/schema.js +108 -0
- package/dist/mcp/tools/schema.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +3 -0
- package/dist/mcp/tools/search.js +8 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/tasks.d.ts +3 -0
- package/dist/mcp/tools/tasks.js +88 -0
- package/dist/mcp/tools/tasks.js.map +1 -0
- 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 +6 -4
- 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
|
@@ -6,12 +6,37 @@
|
|
|
6
6
|
* a baseline context summary and injects it so the agent "already knows"
|
|
7
7
|
* relevant business context from the first message.
|
|
8
8
|
*
|
|
9
|
+
* On startup/clear: also scans project files and ingests changed ones.
|
|
10
|
+
* On compact/resume: skips file scan (files already ingested, just re-query summary).
|
|
11
|
+
*
|
|
9
12
|
* On ANY error: outputs {} and exits 0 (graceful degradation).
|
|
10
13
|
*/
|
|
11
|
-
import {
|
|
14
|
+
import { loadConfig, loadScanConfig, ConfigError, isHookEnabled } from "./config.js";
|
|
15
|
+
import { NexClient } from "./nex-client.js";
|
|
16
|
+
import { RateLimiter } from "./rate-limiter.js";
|
|
17
|
+
import { formatNexContext } from "./context-format.js";
|
|
18
|
+
import { SessionStore } from "./session-store.js";
|
|
19
|
+
import { recordRecall } from "./recall-filter.js";
|
|
20
|
+
import { scanAndIngest } from "./file-scanner.js";
|
|
21
|
+
import { ingestContextFiles } from "./context-files.js";
|
|
22
|
+
import { readManifest as readScanManifest, isScanFresh, markScanned, writeManifest as writeScanManifest } from "./file-manifest.js";
|
|
23
|
+
import { fileURLToPath } from "node:url";
|
|
24
|
+
import { dirname, join } from "node:path";
|
|
25
|
+
const sessions = new SessionStore();
|
|
26
|
+
const SESSION_START_QUERY = "Summarize the key active context, recent interactions, and important updates for this user.";
|
|
12
27
|
async function main() {
|
|
13
28
|
try {
|
|
14
|
-
|
|
29
|
+
// Read stdin
|
|
30
|
+
const chunks = [];
|
|
31
|
+
for await (const chunk of process.stdin) {
|
|
32
|
+
chunks.push(chunk);
|
|
33
|
+
}
|
|
34
|
+
const raw = Buffer.concat(chunks).toString("utf-8");
|
|
35
|
+
// Check .nex.toml kill switch
|
|
36
|
+
if (!isHookEnabled("session_start")) {
|
|
37
|
+
process.stdout.write("{}");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
15
40
|
let input = {};
|
|
16
41
|
try {
|
|
17
42
|
input = JSON.parse(raw);
|
|
@@ -19,17 +44,111 @@ async function main() {
|
|
|
19
44
|
catch {
|
|
20
45
|
process.stderr.write("[nex-session-start] Failed to parse stdin JSON, continuing with defaults\n");
|
|
21
46
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
47
|
+
let cfg;
|
|
48
|
+
try {
|
|
49
|
+
cfg = loadConfig();
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof ConfigError) {
|
|
53
|
+
// No API key — inject registration prompt so Claude handles it
|
|
54
|
+
const pluginDir = dirname(fileURLToPath(import.meta.url));
|
|
55
|
+
const registerScript = join(pluginDir, "auto-register.js");
|
|
56
|
+
const registrationPrompt = [
|
|
57
|
+
"[Nex Memory Plugin] No API key configured. Registration is required to enable persistent memory.",
|
|
58
|
+
"",
|
|
59
|
+
"IMPORTANT: Before proceeding with the user's request, you must set up Nex memory:",
|
|
60
|
+
"1. Ask the user for their email address to register for a Nex account",
|
|
61
|
+
"2. Run the registration command: node " + registerScript + " <email> [name] [company]",
|
|
62
|
+
"3. Once registration succeeds, the API key is saved automatically — all memory features activate immediately",
|
|
63
|
+
"",
|
|
64
|
+
"Keep it brief — just ask for the email and register. No restart needed after registration.",
|
|
65
|
+
].join("\n");
|
|
66
|
+
const output = JSON.stringify({
|
|
67
|
+
hookSpecificOutput: {
|
|
68
|
+
hookEventName: "SessionStart",
|
|
69
|
+
additionalContext: registrationPrompt,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
process.stdout.write(output);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
process.stderr.write(`[nex-session-start] Config error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
25
76
|
process.stdout.write("{}");
|
|
26
77
|
return;
|
|
27
78
|
}
|
|
28
|
-
|
|
29
|
-
|
|
79
|
+
const client = new NexClient(cfg.apiKey, cfg.baseUrl);
|
|
80
|
+
const contextParts = [];
|
|
81
|
+
// --- File scan on startup or clear ---
|
|
82
|
+
const source = input.source ?? "startup";
|
|
83
|
+
const shouldScan = source === "startup" || source === "clear";
|
|
84
|
+
if (shouldScan) {
|
|
85
|
+
// Skip expensive file scanning if a scan completed recently (within 1 hour).
|
|
86
|
+
// The context query below still runs — only the file walk + ingest is skipped.
|
|
87
|
+
const scanManifest = readScanManifest();
|
|
88
|
+
const scanFresh = isScanFresh(scanManifest);
|
|
89
|
+
if (scanFresh) {
|
|
90
|
+
process.stderr.write("[nex-session-start] Scan fresh — skipping file scan\n");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const rateLimiter = new RateLimiter();
|
|
94
|
+
const cwd = process.cwd();
|
|
95
|
+
// --- Ingest CLAUDE.md + memory files (highest priority) ---
|
|
96
|
+
try {
|
|
97
|
+
const ctxResult = await ingestContextFiles(client, rateLimiter, cwd);
|
|
98
|
+
if (ctxResult.ingested > 0) {
|
|
99
|
+
contextParts.push(`[Context files: ${ctxResult.ingested} ingested (${ctxResult.files.join(", ")})]`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
process.stderr.write(`[nex-session-start] Context files error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
104
|
+
}
|
|
105
|
+
// --- Project file scan ---
|
|
106
|
+
try {
|
|
107
|
+
const scanConfig = loadScanConfig();
|
|
108
|
+
if (scanConfig.enabled) {
|
|
109
|
+
const scanResult = await scanAndIngest(client, rateLimiter, cwd, scanConfig);
|
|
110
|
+
if (scanResult.ingested > 0) {
|
|
111
|
+
contextParts.push(`[File scan: ${scanResult.ingested} file${scanResult.ingested === 1 ? "" : "s"} ingested, ${scanResult.scanned} scanned]`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
process.stderr.write(`[nex-session-start] File scan error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
117
|
+
}
|
|
118
|
+
// Mark scan as complete so subsequent sessions skip it
|
|
119
|
+
markScanned(scanManifest);
|
|
120
|
+
writeScanManifest(scanManifest);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// --- Nex context query ---
|
|
124
|
+
const result = await client.ask(SESSION_START_QUERY, undefined, 10_000);
|
|
125
|
+
if (!result.answer && contextParts.length === 0) {
|
|
126
|
+
process.stdout.write("{}");
|
|
30
127
|
return;
|
|
31
128
|
}
|
|
32
|
-
|
|
129
|
+
// Store session mapping
|
|
130
|
+
if (result.session_id && input.session_id) {
|
|
131
|
+
sessions.set(input.session_id, result.session_id);
|
|
132
|
+
}
|
|
133
|
+
// Record this as a successful recall for debounce
|
|
134
|
+
recordRecall(result.session_id);
|
|
135
|
+
const entityCount = result.entity_references?.length ?? 0;
|
|
136
|
+
const context = formatNexContext({
|
|
137
|
+
answer: result.answer,
|
|
138
|
+
entityCount,
|
|
139
|
+
sessionId: result.session_id,
|
|
140
|
+
});
|
|
141
|
+
// Append scan summary if any
|
|
142
|
+
const fullContext = contextParts.length > 0
|
|
143
|
+
? `${context}\n${contextParts.join("\n")}`
|
|
144
|
+
: context;
|
|
145
|
+
const output = JSON.stringify({
|
|
146
|
+
hookSpecificOutput: {
|
|
147
|
+
hookEventName: "SessionStart",
|
|
148
|
+
additionalContext: fullContext,
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
process.stdout.write(output);
|
|
33
152
|
}
|
|
34
153
|
catch (err) {
|
|
35
154
|
process.stderr.write(`[nex-session-start] Unexpected error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-session-start.js","sourceRoot":"","sources":["../../src/plugin/auto-session-start.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"auto-session-start.js","sourceRoot":"","sources":["../../src/plugin/auto-session-start.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin/config.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Plugin configuration — reads from environment variables,
|
|
3
|
-
* with fallback to ~/.nex
|
|
3
|
+
* with fallback to ~/.nex-mcp.json (shared with MCP server).
|
|
4
4
|
*/
|
|
5
5
|
export interface NexConfig {
|
|
6
6
|
apiKey: string;
|
|
@@ -17,15 +17,24 @@ export interface ScanConfig {
|
|
|
17
17
|
export declare class ConfigError extends Error {
|
|
18
18
|
constructor(message: string);
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
/** Shared config file with MCP server — stores registration data. */
|
|
21
|
+
declare const MCP_CONFIG_PATH: string;
|
|
22
|
+
export { MCP_CONFIG_PATH };
|
|
23
|
+
interface McpConfig {
|
|
24
|
+
api_key?: string;
|
|
25
|
+
base_url?: string;
|
|
26
|
+
workspace_id?: string;
|
|
27
|
+
workspace_slug?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Read ~/.nex-mcp.json (shared with MCP server registration). */
|
|
30
|
+
export declare function loadMcpConfig(): McpConfig;
|
|
31
|
+
/** Write registration data to ~/.nex-mcp.json. */
|
|
23
32
|
export declare function persistRegistration(data: Record<string, unknown>): void;
|
|
24
33
|
/**
|
|
25
|
-
* Load config from environment variables, with fallback to ~/.nex
|
|
34
|
+
* Load config from environment variables, with fallback to ~/.nex-mcp.json.
|
|
26
35
|
*
|
|
27
|
-
* Priority: NEX_API_KEY env > ~/.nex
|
|
28
|
-
* If
|
|
36
|
+
* Priority: NEX_API_KEY env > ~/.nex-mcp.json api_key
|
|
37
|
+
* If neither is set, throws ConfigError with registration instructions.
|
|
29
38
|
*/
|
|
30
39
|
export declare function loadConfig(): NexConfig;
|
|
31
40
|
/**
|
package/dist/plugin/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Plugin configuration — reads from environment variables,
|
|
3
|
-
* with fallback to ~/.nex
|
|
3
|
+
* with fallback to ~/.nex-mcp.json (shared with MCP server).
|
|
4
4
|
*/
|
|
5
5
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
6
6
|
import { join, dirname } from "node:path";
|
|
@@ -11,21 +11,22 @@ export class ConfigError extends Error {
|
|
|
11
11
|
this.name = "ConfigError";
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
/** Shared config file with MCP server — stores registration data. */
|
|
15
|
+
const MCP_CONFIG_PATH = join(homedir(), ".nex-mcp.json");
|
|
16
|
+
export { MCP_CONFIG_PATH };
|
|
17
|
+
/** Read ~/.nex-mcp.json (shared with MCP server registration). */
|
|
18
|
+
export function loadMcpConfig() {
|
|
18
19
|
try {
|
|
19
|
-
const raw = readFileSync(
|
|
20
|
+
const raw = readFileSync(MCP_CONFIG_PATH, "utf-8");
|
|
20
21
|
return JSON.parse(raw);
|
|
21
22
|
}
|
|
22
23
|
catch {
|
|
23
24
|
return {};
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
/** Write registration data to ~/.nex
|
|
27
|
+
/** Write registration data to ~/.nex-mcp.json. */
|
|
27
28
|
export function persistRegistration(data) {
|
|
28
|
-
const existing =
|
|
29
|
+
const existing = loadMcpConfig();
|
|
29
30
|
if (typeof data.api_key === "string")
|
|
30
31
|
existing.api_key = data.api_key;
|
|
31
32
|
if (typeof data.workspace_id === "string" || typeof data.workspace_id === "number") {
|
|
@@ -33,24 +34,27 @@ export function persistRegistration(data) {
|
|
|
33
34
|
}
|
|
34
35
|
if (typeof data.workspace_slug === "string")
|
|
35
36
|
existing.workspace_slug = data.workspace_slug;
|
|
36
|
-
mkdirSync(dirname(
|
|
37
|
-
writeFileSync(
|
|
37
|
+
mkdirSync(dirname(MCP_CONFIG_PATH), { recursive: true });
|
|
38
|
+
writeFileSync(MCP_CONFIG_PATH, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
38
39
|
}
|
|
39
40
|
/**
|
|
40
|
-
* Load config from environment variables, with fallback to ~/.nex
|
|
41
|
+
* Load config from environment variables, with fallback to ~/.nex-mcp.json.
|
|
41
42
|
*
|
|
42
|
-
* Priority: NEX_API_KEY env > ~/.nex
|
|
43
|
-
* If
|
|
43
|
+
* Priority: NEX_API_KEY env > ~/.nex-mcp.json api_key
|
|
44
|
+
* If neither is set, throws ConfigError with registration instructions.
|
|
44
45
|
*/
|
|
45
46
|
export function loadConfig() {
|
|
46
47
|
let apiKey = process.env.NEX_API_KEY;
|
|
47
48
|
if (!apiKey) {
|
|
48
|
-
|
|
49
|
+
// Fallback to shared MCP config
|
|
50
|
+
const mcpConfig = loadMcpConfig();
|
|
51
|
+
apiKey = mcpConfig.api_key;
|
|
49
52
|
}
|
|
50
53
|
if (!apiKey) {
|
|
51
54
|
throw new ConfigError("No API key found. Set NEX_API_KEY or run /register to create an account.");
|
|
52
55
|
}
|
|
53
|
-
let baseUrl = process.env.NEX_API_BASE_URL ??
|
|
56
|
+
let baseUrl = process.env.NEX_API_BASE_URL ?? "https://app.nex.ai";
|
|
57
|
+
// Strip trailing slash
|
|
54
58
|
baseUrl = baseUrl.replace(/\/+$/, "");
|
|
55
59
|
return { apiKey, baseUrl };
|
|
56
60
|
}
|
|
@@ -59,7 +63,7 @@ export function loadConfig() {
|
|
|
59
63
|
* Used for registration (which doesn't need auth).
|
|
60
64
|
*/
|
|
61
65
|
export function loadBaseUrl() {
|
|
62
|
-
let baseUrl = process.env.NEX_API_BASE_URL ??
|
|
66
|
+
let baseUrl = process.env.NEX_API_BASE_URL ?? "https://app.nex.ai";
|
|
63
67
|
return baseUrl.replace(/\/+$/, "");
|
|
64
68
|
}
|
|
65
69
|
function parseTomlValue(raw) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/plugin/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAgBlC,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/plugin/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,6 @@ export interface NexRecallResult {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Format a Nex /ask response as an XML block for context injection.
|
|
12
|
-
*
|
|
13
|
-
* The preamble tells the AI to use the context naturally — not as a
|
|
14
|
-
* direct answer, but as background knowledge that informs the response.
|
|
15
|
-
* This makes proactive context feel seamless rather than forced.
|
|
16
12
|
*/
|
|
17
13
|
export declare function formatNexContext(result: NexRecallResult): string;
|
|
18
14
|
/**
|
|
@@ -6,10 +6,6 @@ const OPEN_TAG = "<nex-context>";
|
|
|
6
6
|
const CLOSE_TAG = "</nex-context>";
|
|
7
7
|
/**
|
|
8
8
|
* Format a Nex /ask response as an XML block for context injection.
|
|
9
|
-
*
|
|
10
|
-
* The preamble tells the AI to use the context naturally — not as a
|
|
11
|
-
* direct answer, but as background knowledge that informs the response.
|
|
12
|
-
* This makes proactive context feel seamless rather than forced.
|
|
13
9
|
*/
|
|
14
10
|
export function formatNexContext(result) {
|
|
15
11
|
const parts = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-format.js","sourceRoot":"","sources":["../../src/plugin/context-format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,QAAQ,GAAG,eAAe,CAAC;AACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAQnC
|
|
1
|
+
{"version":3,"file":"context-format.js","sourceRoot":"","sources":["../../src/plugin/context-format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,QAAQ,GAAG,eAAe,CAAC;AACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAQnC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAuB;IACtD,MAAM,KAAK,GAAa;QACtB,QAAQ;QACR,2IAA2I;KAC5I,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,+BAA+B;IAC/B,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;IACvE,8DAA8D;IAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -13,9 +13,15 @@ export interface FileManifestEntry {
|
|
|
13
13
|
}
|
|
14
14
|
export interface FileManifest {
|
|
15
15
|
version: 1;
|
|
16
|
+
lastScanAt?: number;
|
|
16
17
|
files: Record<string, FileManifestEntry>;
|
|
17
18
|
}
|
|
18
19
|
export declare function readManifest(): FileManifest;
|
|
19
20
|
export declare function writeManifest(manifest: FileManifest): void;
|
|
20
21
|
export declare function isChanged(path: string, stat: Stats, manifest: FileManifest): boolean;
|
|
21
22
|
export declare function markIngested(path: string, stat: Stats, context: string, manifest: FileManifest): void;
|
|
23
|
+
/**
|
|
24
|
+
* Record that a full scan completed at this moment.
|
|
25
|
+
*/
|
|
26
|
+
export declare function markScanned(manifest: FileManifest): void;
|
|
27
|
+
export declare function isScanFresh(manifest: FileManifest, windowMs?: number): boolean;
|
|
@@ -45,4 +45,20 @@ export function markIngested(path, stat, context, manifest) {
|
|
|
45
45
|
context,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Record that a full scan completed at this moment.
|
|
50
|
+
*/
|
|
51
|
+
export function markScanned(manifest) {
|
|
52
|
+
manifest.lastScanAt = Date.now();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a scan completed recently (within the given window).
|
|
56
|
+
* Default window: 1 hour.
|
|
57
|
+
*/
|
|
58
|
+
const DEFAULT_SCAN_FRESHNESS_MS = 60 * 60 * 1000; // 1 hour
|
|
59
|
+
export function isScanFresh(manifest, windowMs = DEFAULT_SCAN_FRESHNESS_MS) {
|
|
60
|
+
if (!manifest.lastScanAt)
|
|
61
|
+
return false;
|
|
62
|
+
return Date.now() - manifest.lastScanAt < windowMs;
|
|
63
|
+
}
|
|
48
64
|
//# sourceMappingURL=file-manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manifest.js","sourceRoot":"","sources":["../../src/plugin/file-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"file-manifest.js","sourceRoot":"","sources":["../../src/plugin/file-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAelC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;AAEhE,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAW,EAAE,QAAsB;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,IAAW,EACX,OAAe,EACf,QAAsB;IAEtB,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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
// --- Error types ---
|
|
6
6
|
export class NexAuthError extends Error {
|
|
7
|
-
constructor(message = "
|
|
7
|
+
constructor(message = "Invalid or missing API key") {
|
|
8
8
|
super(message);
|
|
9
9
|
this.name = "NexAuthError";
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nex-client.js","sourceRoot":"","sources":["../../src/plugin/nex-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sBAAsB;AAEtB,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"nex-client.js","sourceRoot":"","sources":["../../src/plugin/nex-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Smart prompt classifier for selective recall.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Only skip on truly trivial inputs (confirmations, single words) or explicit opt-out.
|
|
10
|
-
* Debounce prevents hammering the API on rapid-fire prompts.
|
|
4
|
+
* Determines whether a prompt is likely knowledge-seeking (needs recall)
|
|
5
|
+
* or a pure coding directive (skip recall). Also handles debounce —
|
|
6
|
+
* skips recall if a successful recall happened within the debounce window,
|
|
7
|
+
* unless the current prompt contains question words.
|
|
11
8
|
*
|
|
12
9
|
* Persistence: last-recall timestamp stored in ~/.nex/recall-state.json
|
|
13
10
|
*/
|
|
@@ -22,11 +19,5 @@ export interface RecallDecision {
|
|
|
22
19
|
export declare function recordRecall(sessionId?: string): void;
|
|
23
20
|
/**
|
|
24
21
|
* Determine whether this prompt should trigger a Nex /ask recall.
|
|
25
|
-
*
|
|
26
|
-
* Default: ALWAYS recall. Only skip on:
|
|
27
|
-
* - Explicit opt-out (prompt starts with !)
|
|
28
|
-
* - Trivial confirmations (yes, ok, done, lgtm)
|
|
29
|
-
* - Very short inputs (< 10 chars)
|
|
30
|
-
* - Debounce (< 10s since last recall, unless first prompt)
|
|
31
22
|
*/
|
|
32
23
|
export declare function shouldRecall(prompt: string, isFirstPrompt: boolean): RecallDecision;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Smart prompt classifier for selective recall.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Only skip on truly trivial inputs (confirmations, single words) or explicit opt-out.
|
|
10
|
-
* Debounce prevents hammering the API on rapid-fire prompts.
|
|
4
|
+
* Determines whether a prompt is likely knowledge-seeking (needs recall)
|
|
5
|
+
* or a pure coding directive (skip recall). Also handles debounce —
|
|
6
|
+
* skips recall if a successful recall happened within the debounce window,
|
|
7
|
+
* unless the current prompt contains question words.
|
|
11
8
|
*
|
|
12
9
|
* Persistence: last-recall timestamp stored in ~/.nex/recall-state.json
|
|
13
10
|
*/
|
|
@@ -16,9 +13,18 @@ import { join } from "node:path";
|
|
|
16
13
|
import { homedir } from "node:os";
|
|
17
14
|
const DATA_DIR = join(homedir(), ".nex");
|
|
18
15
|
const STATE_FILE = join(DATA_DIR, "recall-state.json");
|
|
19
|
-
const DEBOUNCE_MS =
|
|
20
|
-
// ---
|
|
21
|
-
const
|
|
16
|
+
const DEBOUNCE_MS = 30_000; // 30 seconds
|
|
17
|
+
// --- Question words that signal knowledge-seeking intent ---
|
|
18
|
+
const QUESTION_WORDS = /\b(who|what|when|where|why|how|which|tell|explain|describe|summarize|summarise|list|find|show|get|any|does|did|is|are|was|were|have|has|do|can|could|should|would|will)\b/i;
|
|
19
|
+
// --- Tool/action commands that are pure coding directives ---
|
|
20
|
+
const TOOL_COMMANDS = /^\s*(run|build|test|lint|format|deploy|install|uninstall|start|stop|restart|commit|push|pull|merge|rebase|checkout|fetch|init|fix|refactor|rename|move|delete|remove|add|create|update|upgrade|downgrade|migrate|generate|scaffold|compile|bundle|watch|serve|debug|profile|bench|clean|reset|undo|redo|revert|squash|cherry-pick|tag|release|publish|npm|npx|yarn|pnpm|bun|pip|cargo|go|make|docker|kubectl|terraform|git|gh|cd|ls|cat|grep|find|mkdir|rm|cp|mv|touch|echo|export|source|chmod|chown|curl|wget|ssh|scp)\b/i;
|
|
21
|
+
// --- File reference pattern (paths, extensions) ---
|
|
22
|
+
const FILE_REF = /(?:[\w./\\-]+\.\w{1,10}|src\/|lib\/|dist\/|node_modules\/|\.\/|\.\.\/)/;
|
|
23
|
+
// --- Code-heavy: >50% non-alpha characters (brackets, operators, etc.) ---
|
|
24
|
+
function isCodeHeavy(text) {
|
|
25
|
+
const alpha = text.replace(/[^a-zA-Z]/g, "").length;
|
|
26
|
+
return alpha < text.length * 0.5;
|
|
27
|
+
}
|
|
22
28
|
function readState() {
|
|
23
29
|
try {
|
|
24
30
|
const raw = readFileSync(STATE_FILE, "utf-8");
|
|
@@ -46,37 +52,43 @@ export function recordRecall(sessionId) {
|
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
48
54
|
* Determine whether this prompt should trigger a Nex /ask recall.
|
|
49
|
-
*
|
|
50
|
-
* Default: ALWAYS recall. Only skip on:
|
|
51
|
-
* - Explicit opt-out (prompt starts with !)
|
|
52
|
-
* - Trivial confirmations (yes, ok, done, lgtm)
|
|
53
|
-
* - Very short inputs (< 10 chars)
|
|
54
|
-
* - Debounce (< 10s since last recall, unless first prompt)
|
|
55
55
|
*/
|
|
56
56
|
export function shouldRecall(prompt, isFirstPrompt) {
|
|
57
57
|
const trimmed = prompt.trim();
|
|
58
|
-
// Explicit opt-out: prompt starts with ! (overrides everything)
|
|
59
|
-
if (trimmed.startsWith("!")) {
|
|
60
|
-
return { shouldRecall: false, reason: "opt-out" };
|
|
61
|
-
}
|
|
62
58
|
// Always recall on first prompt of session
|
|
63
59
|
if (isFirstPrompt) {
|
|
64
60
|
return { shouldRecall: true, reason: "first-prompt" };
|
|
65
61
|
}
|
|
66
|
-
//
|
|
67
|
-
if (
|
|
68
|
-
return { shouldRecall: false, reason: "
|
|
62
|
+
// Explicit opt-out: prompt starts with !
|
|
63
|
+
if (trimmed.startsWith("!")) {
|
|
64
|
+
return { shouldRecall: false, reason: "opt-out" };
|
|
69
65
|
}
|
|
70
|
-
// Too short
|
|
71
|
-
if (trimmed.length <
|
|
66
|
+
// Too short — likely a directive like "yes", "ok", "done"
|
|
67
|
+
if (trimmed.length < 15) {
|
|
72
68
|
return { shouldRecall: false, reason: "too-short" };
|
|
73
69
|
}
|
|
74
|
-
//
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
// Has question words — likely knowledge-seeking
|
|
71
|
+
const hasQuestion = QUESTION_WORDS.test(trimmed);
|
|
72
|
+
// Check debounce: skip if recent successful recall, unless question
|
|
73
|
+
if (!hasQuestion) {
|
|
74
|
+
const state = readState();
|
|
75
|
+
if (state.lastRecallAt > 0 && Date.now() - state.lastRecallAt < DEBOUNCE_MS) {
|
|
76
|
+
return { shouldRecall: false, reason: "debounce" };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Tool/action commands — pure coding directives
|
|
80
|
+
if (TOOL_COMMANDS.test(trimmed) && !hasQuestion) {
|
|
81
|
+
return { shouldRecall: false, reason: "tool-command" };
|
|
82
|
+
}
|
|
83
|
+
// Code-heavy with file references and no question words
|
|
84
|
+
if (isCodeHeavy(trimmed) && FILE_REF.test(trimmed) && !hasQuestion) {
|
|
85
|
+
return { shouldRecall: false, reason: "code-prompt" };
|
|
86
|
+
}
|
|
87
|
+
// Has question words — always recall
|
|
88
|
+
if (hasQuestion) {
|
|
89
|
+
return { shouldRecall: true, reason: "question" };
|
|
78
90
|
}
|
|
79
|
-
// Default:
|
|
80
|
-
return { shouldRecall: true, reason: "
|
|
91
|
+
// Default: recall (err on the side of providing context)
|
|
92
|
+
return { shouldRecall: true, reason: "default" };
|
|
81
93
|
}
|
|
82
94
|
//# sourceMappingURL=recall-filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-filter.js","sourceRoot":"","sources":["../../src/plugin/recall-filter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"recall-filter.js","sourceRoot":"","sources":["../../src/plugin/recall-filter.ts"],"names":[],"mappings":"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"}
|