@nex-ai/nex 0.1.61 → 0.1.62

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.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import { loadConfig } from "./config.js";
3
+ import { formatNexContext } from "./context-format.js";
4
+ import { NexClient } from "./nex-client.js";
5
+ import { RecallCache } from "./recall-cache.js";
6
+ import { SessionStore } from "./session-store.js";
7
+ const sessions = new SessionStore();
8
+ const recallCache = new RecallCache();
9
+ function readTimeoutEnv(name, fallbackMs) {
10
+ const raw = process.env[name];
11
+ const parsed = Number.parseInt(raw ?? "", 10);
12
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallbackMs;
13
+ }
14
+ const BACKGROUND_RECALL_TIMEOUT_MS = readTimeoutEnv("NEX_RECALL_BACKGROUND_TIMEOUT_MS", 60_000);
15
+ const PENDING_CACHE_TTL_MS = readTimeoutEnv("NEX_RECALL_PENDING_TTL_MS", BACKGROUND_RECALL_TIMEOUT_MS + 30_000);
16
+ async function readInput() {
17
+ const chunks = [];
18
+ for await (const chunk of process.stdin) {
19
+ chunks.push(chunk);
20
+ }
21
+ try {
22
+ return JSON.parse(Buffer.concat(chunks).toString("utf-8"));
23
+ }
24
+ catch {
25
+ return {};
26
+ }
27
+ }
28
+ async function main() {
29
+ let input = {};
30
+ try {
31
+ input = await readInput();
32
+ const prompt = input.prompt?.trim();
33
+ const promptHash = input.prompt_hash?.trim();
34
+ const sessionKey = input.session_id?.trim();
35
+ if (!prompt || !promptHash || !sessionKey) {
36
+ return;
37
+ }
38
+ if (!recallCache.hasPending(sessionKey, promptHash, PENDING_CACHE_TTL_MS)) {
39
+ return;
40
+ }
41
+ const cfg = loadConfig();
42
+ const client = new NexClient(cfg.apiKey, cfg.baseUrl);
43
+ const nexSessionId = sessions.get(sessionKey);
44
+ const result = await client.ask(prompt, nexSessionId, BACKGROUND_RECALL_TIMEOUT_MS);
45
+ if (!result.answer) {
46
+ recallCache.clearPending(sessionKey, promptHash);
47
+ return;
48
+ }
49
+ if (result.session_id) {
50
+ sessions.set(sessionKey, result.session_id);
51
+ }
52
+ const context = formatNexContext({
53
+ answer: result.answer,
54
+ entityCount: result.entity_references?.length ?? 0,
55
+ sessionId: result.session_id,
56
+ });
57
+ if (!recallCache.hasPending(sessionKey, promptHash, PENDING_CACHE_TTL_MS)) {
58
+ return;
59
+ }
60
+ recallCache.setReady(sessionKey, {
61
+ promptHash,
62
+ context,
63
+ });
64
+ }
65
+ catch {
66
+ const promptHash = input.prompt_hash?.trim();
67
+ const sessionKey = input.session_id?.trim();
68
+ if (promptHash && sessionKey) {
69
+ recallCache.clearPending(sessionKey, promptHash);
70
+ }
71
+ }
72
+ }
73
+ main().then(() => process.exit(0)).catch(() => process.exit(0));
74
+ //# sourceMappingURL=auto-recall-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-recall-worker.js","sourceRoot":"","sources":["../../src/plugin/auto-recall-worker.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,57 @@
11
11
  import { loadConfig, isHookEnabled } from "./config.js";
12
12
  import { NexClient } from "./nex-client.js";
13
13
  import { formatNexContext } from "./context-format.js";
14
+ import { RecallCache, hashPrompt } from "./recall-cache.js";
14
15
  import { SessionStore } from "./session-store.js";
15
16
  import { shouldRecall } from "./recall-filter.js";
17
+ import { spawn } from "node:child_process";
18
+ import { dirname, join } from "node:path";
19
+ import { fileURLToPath } from "node:url";
16
20
  const sessions = new SessionStore();
21
+ const recallCache = new RecallCache();
22
+ const FAST_RECALL_BUDGET_MS = readTimeoutEnv("NEX_RECALL_SYNC_BUDGET_MS", 250);
23
+ const BACKGROUND_RECALL_TIMEOUT_MS = readTimeoutEnv("NEX_RECALL_BACKGROUND_TIMEOUT_MS", 60_000);
24
+ const READY_CACHE_TTL_MS = readTimeoutEnv("NEX_RECALL_READY_TTL_MS", 5 * 60_000);
25
+ const PENDING_CACHE_TTL_MS = readTimeoutEnv("NEX_RECALL_PENDING_TTL_MS", BACKGROUND_RECALL_TIMEOUT_MS + 30_000);
26
+ const WORKER_PATH = join(dirname(fileURLToPath(import.meta.url)), "auto-recall-worker.js");
27
+ function readTimeoutEnv(name, fallbackMs) {
28
+ const raw = process.env[name];
29
+ const parsed = Number.parseInt(raw ?? "", 10);
30
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallbackMs;
31
+ }
32
+ function writeHookContext(context) {
33
+ process.stdout.write(JSON.stringify({
34
+ hookSpecificOutput: {
35
+ hookEventName: "UserPromptSubmit",
36
+ additionalContext: context,
37
+ },
38
+ }));
39
+ }
40
+ function isAbortError(error) {
41
+ return error instanceof Error && error.name === "AbortError";
42
+ }
43
+ function launchBackgroundRecall(prompt, sessionKey, promptHash) {
44
+ try {
45
+ const child = spawn(process.execPath, [WORKER_PATH], {
46
+ detached: true,
47
+ env: {
48
+ ...process.env,
49
+ NEX_RECALL_BACKGROUND_TIMEOUT_MS: String(BACKGROUND_RECALL_TIMEOUT_MS),
50
+ NEX_RECALL_PENDING_TTL_MS: String(PENDING_CACHE_TTL_MS),
51
+ },
52
+ stdio: ["pipe", "ignore", "ignore"],
53
+ });
54
+ child.stdin.end(JSON.stringify({
55
+ prompt,
56
+ prompt_hash: promptHash,
57
+ session_id: sessionKey,
58
+ }));
59
+ child.unref();
60
+ }
61
+ catch {
62
+ recallCache.clearPending(sessionKey, promptHash);
63
+ }
64
+ }
17
65
  /**
18
66
  * Check if this is the first prompt for this session.
19
67
  * A session with no stored Nex session ID is considered "first prompt"
@@ -75,30 +123,59 @@ async function main() {
75
123
  const client = new NexClient(cfg.apiKey, cfg.baseUrl);
76
124
  // Resolve session ID for multi-turn continuity
77
125
  const sessionKey = input.session_id;
126
+ const promptHash = hashPrompt(prompt);
78
127
  const nexSessionId = sessionKey ? sessions.get(sessionKey) : undefined;
79
- const result = await client.ask(prompt, nexSessionId, 10_000);
80
- if (!result.answer) {
81
- process.stdout.write("{}");
128
+ const cachedReady = sessionKey
129
+ ? recallCache.getInjectable(sessionKey, READY_CACHE_TTL_MS)
130
+ : undefined;
131
+ if (sessionKey && cachedReady?.promptHash === promptHash) {
132
+ recallCache.markReadyDelivered(sessionKey);
133
+ writeHookContext(cachedReady.context);
82
134
  return;
83
135
  }
84
- // Store session ID for future turns
85
- if (result.session_id && sessionKey) {
86
- sessions.set(sessionKey, result.session_id);
136
+ const hasPendingCurrent = sessionKey
137
+ ? recallCache.hasPending(sessionKey, promptHash, PENDING_CACHE_TTL_MS)
138
+ : false;
139
+ let shouldStartBackground = false;
140
+ if (!hasPendingCurrent) {
141
+ try {
142
+ const result = await client.ask(prompt, nexSessionId, FAST_RECALL_BUDGET_MS);
143
+ if (result.answer) {
144
+ if (result.session_id && sessionKey) {
145
+ sessions.set(sessionKey, result.session_id);
146
+ }
147
+ const context = formatNexContext({
148
+ answer: result.answer,
149
+ entityCount: result.entity_references?.length ?? 0,
150
+ sessionId: result.session_id,
151
+ });
152
+ if (sessionKey) {
153
+ recallCache.setReady(sessionKey, { promptHash, context });
154
+ recallCache.markReadyDelivered(sessionKey);
155
+ }
156
+ writeHookContext(context);
157
+ return;
158
+ }
159
+ }
160
+ catch (err) {
161
+ if (isAbortError(err)) {
162
+ shouldStartBackground = true;
163
+ }
164
+ else {
165
+ process.stderr.write(`[nex-recall] Fast-path error: ${err instanceof Error ? err.message : String(err)}\n`);
166
+ }
167
+ }
87
168
  }
88
- const entityCount = result.entity_references?.length ?? 0;
89
- const context = formatNexContext({
90
- answer: result.answer,
91
- entityCount,
92
- sessionId: result.session_id,
93
- });
94
- // Use hookSpecificOutput for discrete context injection (not shown in transcript)
95
- const output = JSON.stringify({
96
- hookSpecificOutput: {
97
- hookEventName: "UserPromptSubmit",
98
- additionalContext: context,
99
- },
100
- });
101
- process.stdout.write(output);
169
+ if (sessionKey && shouldStartBackground && !hasPendingCurrent) {
170
+ recallCache.setPending(sessionKey, promptHash);
171
+ launchBackgroundRecall(prompt, sessionKey, promptHash);
172
+ }
173
+ if (sessionKey && cachedReady) {
174
+ recallCache.markReadyDelivered(sessionKey);
175
+ writeHookContext(cachedReady.context);
176
+ return;
177
+ }
178
+ process.stdout.write("{}");
102
179
  }
103
180
  catch (err) {
104
181
  process.stderr.write(`[nex-recall] Unexpected error: ${err instanceof Error ? err.message : String(err)}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/plugin/auto-recall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/plugin/auto-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface PendingRecallEntry {
2
+ promptHash: string;
3
+ createdAt: number;
4
+ }
5
+ export interface ReadyRecallEntry {
6
+ promptHash: string;
7
+ context: string;
8
+ createdAt: number;
9
+ deliveredAt?: number;
10
+ }
11
+ export interface RecallSessionEntry {
12
+ pending?: PendingRecallEntry;
13
+ ready?: ReadyRecallEntry;
14
+ }
15
+ export interface RecallCacheConfig {
16
+ maxSize: number;
17
+ dataDir: string;
18
+ }
19
+ export declare function hashPrompt(prompt: string): string;
20
+ export declare class RecallCache {
21
+ private filePath;
22
+ private maxSize;
23
+ constructor(config?: Partial<RecallCacheConfig>);
24
+ private readStore;
25
+ private writeStore;
26
+ private trimStore;
27
+ private pruneEmptyEntry;
28
+ get(sessionKey: string): RecallSessionEntry | undefined;
29
+ list(): Record<string, RecallSessionEntry>;
30
+ setPending(sessionKey: string, promptHash: string, now?: number): void;
31
+ hasPending(sessionKey: string, promptHash: string, maxAgeMs: number, now?: number): boolean;
32
+ clearPending(sessionKey: string, promptHash?: string): boolean;
33
+ setReady(sessionKey: string, ready: {
34
+ promptHash: string;
35
+ context: string;
36
+ }, now?: number): void;
37
+ getInjectable(sessionKey: string, maxAgeMs: number, now?: number): ReadyRecallEntry | undefined;
38
+ markReadyDelivered(sessionKey: string, now?: number): boolean;
39
+ delete(sessionKey: string): boolean;
40
+ clear(): void;
41
+ }
@@ -0,0 +1,195 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { workspaceDataDir } from "./workspace-data-dir.js";
5
+ const DEFAULT_MAX = 100;
6
+ function isRecord(value) {
7
+ return !!value && typeof value === "object" && !Array.isArray(value);
8
+ }
9
+ function sanitizePending(value) {
10
+ if (!isRecord(value))
11
+ return undefined;
12
+ if (typeof value.promptHash !== "string")
13
+ return undefined;
14
+ if (typeof value.createdAt !== "number")
15
+ return undefined;
16
+ return {
17
+ promptHash: value.promptHash,
18
+ createdAt: value.createdAt,
19
+ };
20
+ }
21
+ function sanitizeReady(value) {
22
+ if (!isRecord(value))
23
+ return undefined;
24
+ if (typeof value.promptHash !== "string")
25
+ return undefined;
26
+ if (typeof value.context !== "string")
27
+ return undefined;
28
+ if (typeof value.createdAt !== "number")
29
+ return undefined;
30
+ if (value.deliveredAt !== undefined && typeof value.deliveredAt !== "number") {
31
+ return undefined;
32
+ }
33
+ return {
34
+ promptHash: value.promptHash,
35
+ context: value.context,
36
+ createdAt: value.createdAt,
37
+ deliveredAt: typeof value.deliveredAt === "number" ? value.deliveredAt : undefined,
38
+ };
39
+ }
40
+ function sanitizeEntry(value) {
41
+ if (!isRecord(value))
42
+ return undefined;
43
+ const pending = sanitizePending(value.pending);
44
+ const ready = sanitizeReady(value.ready);
45
+ if (!pending && !ready)
46
+ return undefined;
47
+ return { pending, ready };
48
+ }
49
+ export function hashPrompt(prompt) {
50
+ return createHash("sha1").update(prompt).digest("hex");
51
+ }
52
+ export class RecallCache {
53
+ filePath;
54
+ maxSize;
55
+ constructor(config) {
56
+ const dataDir = config?.dataDir ?? workspaceDataDir();
57
+ this.maxSize = config?.maxSize ?? DEFAULT_MAX;
58
+ this.filePath = join(dataDir, "claude-recall-cache.json");
59
+ mkdirSync(dataDir, { recursive: true });
60
+ }
61
+ readStore() {
62
+ try {
63
+ const raw = readFileSync(this.filePath, "utf-8");
64
+ const parsed = JSON.parse(raw);
65
+ if (!isRecord(parsed))
66
+ return {};
67
+ const store = {};
68
+ for (const [key, value] of Object.entries(parsed)) {
69
+ const entry = sanitizeEntry(value);
70
+ if (entry)
71
+ store[key] = entry;
72
+ }
73
+ return store;
74
+ }
75
+ catch {
76
+ return {};
77
+ }
78
+ }
79
+ writeStore(store) {
80
+ try {
81
+ writeFileSync(this.filePath, JSON.stringify(store), "utf-8");
82
+ }
83
+ catch {
84
+ // Best-effort — cache misses are acceptable.
85
+ }
86
+ }
87
+ trimStore(store) {
88
+ const keys = Object.keys(store);
89
+ while (keys.length > this.maxSize) {
90
+ delete store[keys.shift()];
91
+ }
92
+ }
93
+ pruneEmptyEntry(store, sessionKey) {
94
+ const entry = store[sessionKey];
95
+ if (!entry)
96
+ return;
97
+ if (!entry.pending && !entry.ready) {
98
+ delete store[sessionKey];
99
+ }
100
+ }
101
+ get(sessionKey) {
102
+ return this.readStore()[sessionKey];
103
+ }
104
+ list() {
105
+ return this.readStore();
106
+ }
107
+ setPending(sessionKey, promptHash, now = Date.now()) {
108
+ const store = this.readStore();
109
+ const current = store[sessionKey] ?? {};
110
+ current.pending = { promptHash, createdAt: now };
111
+ store[sessionKey] = current;
112
+ this.trimStore(store);
113
+ this.writeStore(store);
114
+ }
115
+ hasPending(sessionKey, promptHash, maxAgeMs, now = Date.now()) {
116
+ const store = this.readStore();
117
+ const current = store[sessionKey];
118
+ const pending = current?.pending;
119
+ if (!pending)
120
+ return false;
121
+ if (now - pending.createdAt > maxAgeMs) {
122
+ delete current.pending;
123
+ this.pruneEmptyEntry(store, sessionKey);
124
+ this.writeStore(store);
125
+ return false;
126
+ }
127
+ return pending.promptHash === promptHash;
128
+ }
129
+ clearPending(sessionKey, promptHash) {
130
+ const store = this.readStore();
131
+ const current = store[sessionKey];
132
+ if (!current?.pending)
133
+ return false;
134
+ if (promptHash && current.pending.promptHash !== promptHash) {
135
+ return false;
136
+ }
137
+ delete current.pending;
138
+ this.pruneEmptyEntry(store, sessionKey);
139
+ this.writeStore(store);
140
+ return true;
141
+ }
142
+ setReady(sessionKey, ready, now = Date.now()) {
143
+ const store = this.readStore();
144
+ const current = store[sessionKey] ?? {};
145
+ current.ready = {
146
+ promptHash: ready.promptHash,
147
+ context: ready.context,
148
+ createdAt: now,
149
+ };
150
+ if (current.pending?.promptHash === ready.promptHash) {
151
+ delete current.pending;
152
+ }
153
+ store[sessionKey] = current;
154
+ this.trimStore(store);
155
+ this.writeStore(store);
156
+ }
157
+ getInjectable(sessionKey, maxAgeMs, now = Date.now()) {
158
+ const store = this.readStore();
159
+ const current = store[sessionKey];
160
+ const ready = current?.ready;
161
+ if (!ready)
162
+ return undefined;
163
+ if (ready.deliveredAt !== undefined)
164
+ return undefined;
165
+ if (now - ready.createdAt > maxAgeMs) {
166
+ delete current.ready;
167
+ this.pruneEmptyEntry(store, sessionKey);
168
+ this.writeStore(store);
169
+ return undefined;
170
+ }
171
+ return ready;
172
+ }
173
+ markReadyDelivered(sessionKey, now = Date.now()) {
174
+ const store = this.readStore();
175
+ const current = store[sessionKey];
176
+ if (!current?.ready || current.ready.deliveredAt !== undefined) {
177
+ return false;
178
+ }
179
+ current.ready.deliveredAt = now;
180
+ this.writeStore(store);
181
+ return true;
182
+ }
183
+ delete(sessionKey) {
184
+ const store = this.readStore();
185
+ if (!(sessionKey in store))
186
+ return false;
187
+ delete store[sessionKey];
188
+ this.writeStore(store);
189
+ return true;
190
+ }
191
+ clear() {
192
+ this.writeStore({});
193
+ }
194
+ }
195
+ //# sourceMappingURL=recall-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-cache.js","sourceRoot":"","sources":["../../src/plugin/recall-cache.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nex-ai/nex",
3
- "version": "0.1.61",
3
+ "version": "0.1.62",
4
4
  "description": "Nex CLI provides organizational context & memory to AI agents. Connect email, CRM, Slack, meetings, and 100+ tools into one knowledge graph.",
5
5
  "mcpName": "io.github.nex-crm/nex",
6
6
  "type": "module",
@@ -40,6 +40,8 @@
40
40
  "start": "bun dist/index.js",
41
41
  "dev": "bun src/index.ts",
42
42
  "test": "bun test",
43
+ "test:isolated": "bun test ./tests/tui/register-views-integration.test.isolated.ts && bun test ./tests/tui/slash-commands.test.isolated.ts",
44
+ "test:all": "bun test && bun test ./tests/tui/register-views-integration.test.isolated.ts && bun test ./tests/tui/slash-commands.test.isolated.ts",
43
45
  "prepublishOnly": "bun run build"
44
46
  },
45
47
  "devDependencies": {