@nex-ai/nex 0.1.65 → 0.1.67

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.
Files changed (75) hide show
  1. package/dist/commands/upgrade.d.ts +9 -0
  2. package/dist/commands/upgrade.js +87 -0
  3. package/dist/commands/upgrade.js.map +1 -0
  4. package/dist/index.js +7 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/installers.js +3 -2
  7. package/dist/lib/installers.js.map +1 -1
  8. package/dist/mcp/index.js +0 -0
  9. package/dist/plugin/adapters/cline-capture.d.ts +7 -0
  10. package/dist/plugin/adapters/cline-capture.js +25 -0
  11. package/dist/plugin/adapters/cline-capture.js.map +1 -0
  12. package/dist/plugin/adapters/cline-recall.d.ts +7 -0
  13. package/dist/plugin/adapters/cline-recall.js +30 -0
  14. package/dist/plugin/adapters/cline-recall.js.map +1 -0
  15. package/dist/plugin/adapters/cline-task-start.d.ts +7 -0
  16. package/dist/plugin/adapters/cline-task-start.js +30 -0
  17. package/dist/plugin/adapters/cline-task-start.js.map +1 -0
  18. package/dist/plugin/adapters/cursor-recall.d.ts +7 -0
  19. package/dist/plugin/adapters/cursor-recall.js +31 -0
  20. package/dist/plugin/adapters/cursor-recall.js.map +1 -0
  21. package/dist/plugin/adapters/cursor-session-start.d.ts +7 -0
  22. package/dist/plugin/adapters/cursor-session-start.js +30 -0
  23. package/dist/plugin/adapters/cursor-session-start.js.map +1 -0
  24. package/dist/plugin/adapters/cursor-stop.d.ts +7 -0
  25. package/dist/plugin/adapters/cursor-stop.js +25 -0
  26. package/dist/plugin/adapters/cursor-stop.js.map +1 -0
  27. package/dist/plugin/adapters/windsurf-capture.d.ts +7 -0
  28. package/dist/plugin/adapters/windsurf-capture.js +25 -0
  29. package/dist/plugin/adapters/windsurf-capture.js.map +1 -0
  30. package/dist/plugin/adapters/windsurf-recall.d.ts +7 -0
  31. package/dist/plugin/adapters/windsurf-recall.js +31 -0
  32. package/dist/plugin/adapters/windsurf-recall.js.map +1 -0
  33. package/dist/plugin/auto-session-start.js +39 -1
  34. package/dist/plugin/auto-session-start.js.map +1 -1
  35. package/dist/plugin/shared.d.ts +39 -0
  36. package/dist/plugin/shared.js +380 -0
  37. package/dist/plugin/shared.js.map +1 -0
  38. package/dist/plugin/update-check.d.ts +13 -0
  39. package/dist/plugin/update-check.js +134 -0
  40. package/dist/plugin/update-check.js.map +1 -0
  41. package/openclaw-plugin/dist/capture-filter.d.ts +32 -0
  42. package/openclaw-plugin/dist/capture-filter.d.ts.map +1 -0
  43. package/openclaw-plugin/dist/capture-filter.js +117 -0
  44. package/openclaw-plugin/dist/capture-filter.js.map +1 -0
  45. package/openclaw-plugin/dist/config.d.ts +24 -0
  46. package/openclaw-plugin/dist/config.d.ts.map +1 -0
  47. package/openclaw-plugin/dist/config.js +68 -0
  48. package/openclaw-plugin/dist/config.js.map +1 -0
  49. package/openclaw-plugin/dist/context-format.d.ts +23 -0
  50. package/openclaw-plugin/dist/context-format.d.ts.map +1 -0
  51. package/openclaw-plugin/dist/context-format.js +40 -0
  52. package/openclaw-plugin/dist/context-format.js.map +1 -0
  53. package/openclaw-plugin/dist/file-scanner.d.ts +23 -0
  54. package/openclaw-plugin/dist/file-scanner.d.ts.map +1 -0
  55. package/openclaw-plugin/dist/file-scanner.js +119 -0
  56. package/openclaw-plugin/dist/file-scanner.js.map +1 -0
  57. package/openclaw-plugin/dist/index.d.ts +94 -0
  58. package/openclaw-plugin/dist/index.d.ts.map +1 -0
  59. package/openclaw-plugin/dist/index.js +1227 -0
  60. package/openclaw-plugin/dist/index.js.map +1 -0
  61. package/openclaw-plugin/dist/nex-client.d.ts +52 -0
  62. package/openclaw-plugin/dist/nex-client.d.ts.map +1 -0
  63. package/openclaw-plugin/dist/nex-client.js +129 -0
  64. package/openclaw-plugin/dist/nex-client.js.map +1 -0
  65. package/openclaw-plugin/dist/rate-limiter.d.ts +29 -0
  66. package/openclaw-plugin/dist/rate-limiter.d.ts.map +1 -0
  67. package/openclaw-plugin/dist/rate-limiter.js +95 -0
  68. package/openclaw-plugin/dist/rate-limiter.js.map +1 -0
  69. package/openclaw-plugin/dist/session-store.d.ts +15 -0
  70. package/openclaw-plugin/dist/session-store.d.ts.map +1 -0
  71. package/openclaw-plugin/dist/session-store.js +43 -0
  72. package/openclaw-plugin/dist/session-store.js.map +1 -0
  73. package/openclaw-plugin/openclaw.plugin.json +85 -0
  74. package/openclaw-plugin/package.json +29 -0
  75. package/package.json +2 -1
@@ -21,7 +21,30 @@ import { ingestContextFiles } from "./context-files.js";
21
21
  import { readManifest as readScanManifest, isScanFresh, markScanned, writeManifest as writeScanManifest } from "./file-manifest.js";
22
22
  import { fileURLToPath } from "node:url";
23
23
  import { dirname, join } from "node:path";
24
+ import { execFileSync } from "node:child_process";
24
25
  const sessions = new SessionStore();
26
+ /**
27
+ * Run nex-update-check as a subprocess and return the result.
28
+ * Returns null on error or if no update available.
29
+ */
30
+ function checkForUpdate() {
31
+ try {
32
+ const pluginDir = dirname(fileURLToPath(import.meta.url));
33
+ const checkScript = join(pluginDir, "update-check.js");
34
+ const output = execFileSync("node", [checkScript], {
35
+ encoding: "utf-8",
36
+ timeout: 6000,
37
+ stdio: ["pipe", "pipe", "pipe"],
38
+ }).trim();
39
+ if (output.startsWith("UPGRADE_AVAILABLE") || output.startsWith("JUST_UPGRADED")) {
40
+ return output;
41
+ }
42
+ return null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
25
48
  const SESSION_START_QUERY = "Summarize the key active context, recent interactions, and important updates for this user.";
26
49
  async function main() {
27
50
  try {
@@ -136,9 +159,24 @@ async function main() {
136
159
  sessionId: result.session_id,
137
160
  });
138
161
  // Append scan summary if any
139
- const fullContext = contextParts.length > 0
162
+ let fullContext = contextParts.length > 0
140
163
  ? `${context}\n${contextParts.join("\n")}`
141
164
  : context;
165
+ // --- Update check (non-blocking, best-effort) ---
166
+ const updateResult = checkForUpdate();
167
+ if (updateResult) {
168
+ const parts = updateResult.split(" ");
169
+ if (parts[0] === "UPGRADE_AVAILABLE") {
170
+ const [, currentVer, latestVer] = parts;
171
+ fullContext += `\n\n[Nex Update] A new version of Nex is available: ${currentVer} → ${latestVer}. ` +
172
+ `Inform the user that a Nex update is available and offer to upgrade. ` +
173
+ `To upgrade, run: nex upgrade`;
174
+ }
175
+ else if (parts[0] === "JUST_UPGRADED") {
176
+ const [, oldVer, newVer] = parts;
177
+ fullContext += `\n\n[Nex Update] Nex was recently upgraded from ${oldVer} to ${newVer}.`;
178
+ }
179
+ }
142
180
  const output = JSON.stringify({
143
181
  hookSpecificOutput: {
144
182
  hookEventName: "SessionStart",
@@ -1 +1 @@
1
- {"version":3,"file":"auto-session-start.js","sourceRoot":"","sources":["../../src/plugin/auto-session-start.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;AAOpC,MAAM,mBAAmB,GAAG,6FAA6F,CAAC;AAE1H,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,aAAa;QACb,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEpD,8BAA8B;QAC9B,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,GAAc,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QACrG,CAAC;QAED,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,GAAG,GAAG,UAAU,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;gBAC/B,+DAA+D;gBAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;gBAC3D,MAAM,kBAAkB,GAAG;oBACzB,kGAAkG;oBAClG,EAAE;oBACF,mFAAmF;oBACnF,uEAAuE;oBACvE,wCAAwC,GAAG,cAAc,GAAG,2BAA2B;oBACvF,8GAA8G;oBAC9G,EAAE;oBACF,4FAA4F;iBAC7F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC5B,kBAAkB,EAAE;wBAClB,aAAa,EAAE,cAAc;wBAC7B,iBAAiB,EAAE,kBAAkB;qBACtC;iBACF,CAAC,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1F,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,wCAAwC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC;QAE9D,IAAI,UAAU,EAAE,CAAC;YACf,6EAA6E;YAC7E,+EAA+E;YAC/E,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAE5C,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;gBAE1B,6DAA6D;gBAC7D,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;oBACrE,IAAI,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;wBAC3B,YAAY,CAAC,IAAI,CACf,mBAAmB,SAAS,CAAC,QAAQ,cAAc,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAClF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4CAA4C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACjG,CAAC;gBACJ,CAAC;gBAED,4BAA4B;gBAC5B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;oBACpC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBACvB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;wBAE7E,IAAI,UAAU,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;4BAC5B,YAAY,CAAC,IAAI,CACf,eAAe,UAAU,CAAC,QAAQ,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,cAAc,UAAU,CAAC,OAAO,WAAW,CAC1H,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC7F,CAAC;gBACJ,CAAC;gBAED,uDAAuD;gBACvD,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC1B,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW;YACX,SAAS,EAAE,MAAM,CAAC,UAAU;SAC7B,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1C,CAAC,CAAC,OAAO,CAAC;QAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5B,kBAAkB,EAAE;gBAClB,aAAa,EAAE,cAAc;gBAC7B,iBAAiB,EAAE,WAAW;aAC/B;SACF,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yCAAyC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC9F,CAAC;QACF,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
+ {"version":3,"file":"auto-session-start.js","sourceRoot":"","sources":["../../src/plugin/auto-session-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shared hook logic — platform-agnostic recall, capture, and session-start.
3
+ *
4
+ * Extracted from auto-recall.ts, auto-capture.ts, auto-session-start.ts
5
+ * so adapters for Cursor, Windsurf, Cline, etc. can reuse the same logic
6
+ * without duplicating filter/client/format code.
7
+ */
8
+ export interface RecallResult {
9
+ context: string;
10
+ nexSessionId?: string;
11
+ }
12
+ export interface CaptureInput {
13
+ message: string;
14
+ sessionId?: string;
15
+ planDir?: string;
16
+ }
17
+ export interface SessionStartResult {
18
+ context: string;
19
+ nexSessionId?: string;
20
+ registrationPrompt?: string;
21
+ }
22
+ /**
23
+ * Run recall logic: filter prompt → query Nex /ask → return formatted context.
24
+ * Returns null if recall is skipped or fails.
25
+ */
26
+ export declare function doRecall(prompt: string, sessionKey?: string): Promise<RecallResult | null>;
27
+ /**
28
+ * Run capture logic: filter message → ingest to Nex + scan plan files.
29
+ */
30
+ export declare function doCapture(input: CaptureInput): Promise<void>;
31
+ /**
32
+ * Run session-start logic: scan files → query Nex baseline → return context.
33
+ * Returns null if disabled. Returns registrationPrompt if no API key.
34
+ */
35
+ export declare function doSessionStart(source: string, sessionKey?: string): Promise<SessionStartResult | null>;
36
+ /** Read stdin as a string (shared across all hook scripts). */
37
+ export declare function readStdin(): Promise<string>;
38
+ /** Wrap output in Claude Code hookSpecificOutput format. */
39
+ export declare function claudeCodeOutput(hookEventName: string, additionalContext: string): string;
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Shared hook logic — platform-agnostic recall, capture, and session-start.
3
+ *
4
+ * Extracted from auto-recall.ts, auto-capture.ts, auto-session-start.ts
5
+ * so adapters for Cursor, Windsurf, Cline, etc. can reuse the same logic
6
+ * without duplicating filter/client/format code.
7
+ */
8
+ import { loadConfig, loadScanConfig, ConfigError, isHookEnabled } from "./config.js";
9
+ import { NexClient, NexAuthError } from "./nex-client.js";
10
+ import { formatNexContext } from "./context-format.js";
11
+ import { captureFilter } from "./capture-filter.js";
12
+ import { SessionStore } from "./session-store.js";
13
+ import { shouldRecall, recordRecall } from "./recall-filter.js";
14
+ import { RateLimiter } from "./rate-limiter.js";
15
+ import { scanAndIngest } from "./file-scanner.js";
16
+ import { ingestContextFiles } from "./context-files.js";
17
+ import { readManifest, writeManifest, isChanged, markIngested, isScanFresh, markScanned } from "./file-manifest.js";
18
+ import { readdirSync, statSync, readFileSync } from "node:fs";
19
+ import { join, extname } from "node:path";
20
+ import { homedir } from "node:os";
21
+ const sessions = new SessionStore();
22
+ // ── Recall ──────────────────────────────────────────────────────────────
23
+ /**
24
+ * Run recall logic: filter prompt → query Nex /ask → return formatted context.
25
+ * Returns null if recall is skipped or fails.
26
+ */
27
+ export async function doRecall(prompt, sessionKey) {
28
+ if (!isHookEnabled("recall"))
29
+ return null;
30
+ const trimmed = prompt?.trim();
31
+ if (!trimmed || trimmed.length < 5)
32
+ return null;
33
+ if (trimmed.startsWith("/"))
34
+ return null;
35
+ const isFirst = sessionKey ? !sessions.get(sessionKey) : true;
36
+ const decision = shouldRecall(trimmed, isFirst);
37
+ if (!decision.shouldRecall)
38
+ return null;
39
+ const cfg = loadConfig();
40
+ const client = new NexClient(cfg.apiKey, cfg.baseUrl);
41
+ let result;
42
+ try {
43
+ const nexSessionId = sessionKey ? sessions.get(sessionKey) : undefined;
44
+ result = await client.ask(trimmed, nexSessionId, 30_000);
45
+ }
46
+ catch (err) {
47
+ if (err instanceof NexAuthError) {
48
+ return {
49
+ context: "[Nex] API key expired or invalid. Run: nex register --email <email>",
50
+ };
51
+ }
52
+ throw err;
53
+ }
54
+ if (!result.answer)
55
+ return null;
56
+ if (result.session_id && sessionKey) {
57
+ sessions.set(sessionKey, result.session_id);
58
+ }
59
+ recordRecall(result.session_id);
60
+ const entityCount = result.entity_references?.length ?? 0;
61
+ const context = formatNexContext({
62
+ answer: result.answer,
63
+ entityCount,
64
+ sessionId: result.session_id,
65
+ });
66
+ return { context, nexSessionId: result.session_id };
67
+ }
68
+ // ── Capture ─────────────────────────────────────────────────────────────
69
+ const INGEST_TIMEOUT_MS = 3_000;
70
+ const MAX_PLAN_FILES = 2;
71
+ /**
72
+ * Run capture logic: filter message → ingest to Nex + scan plan files.
73
+ */
74
+ export async function doCapture(input) {
75
+ if (!isHookEnabled("capture"))
76
+ return;
77
+ let cfg;
78
+ try {
79
+ cfg = loadConfig();
80
+ }
81
+ catch {
82
+ return;
83
+ }
84
+ const client = new NexClient(cfg.apiKey, cfg.baseUrl);
85
+ const rateLimiter = new RateLimiter();
86
+ // Conversation capture
87
+ const message = input.message?.trim();
88
+ if (message) {
89
+ const filterResult = captureFilter(message);
90
+ if (!filterResult.skipped) {
91
+ if (rateLimiter.canProceed()) {
92
+ try {
93
+ await client.ingest(filterResult.text, "claude-code-conversation", INGEST_TIMEOUT_MS);
94
+ }
95
+ catch (err) {
96
+ if (err instanceof NexAuthError) {
97
+ process.stderr.write(`[nex-capture] API key expired or invalid. Run 'nex register --email <email>' to get a new key.\n`);
98
+ return;
99
+ }
100
+ process.stderr.write(`[nex-capture] Ingest failed: ${err instanceof Error ? err.message : String(err)}\n`);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ // Plan file ingestion
106
+ const plansDir = input.planDir ?? join(process.cwd(), ".claude", "plans");
107
+ try {
108
+ await ingestPlanFiles(client, rateLimiter, plansDir);
109
+ }
110
+ catch (err) {
111
+ process.stderr.write(`[nex-capture] Plan file scan error: ${err instanceof Error ? err.message : String(err)}\n`);
112
+ }
113
+ // Transcript ingestion — ingest the full session conversation
114
+ if (input.sessionId) {
115
+ try {
116
+ await ingestTranscript(client, input.sessionId);
117
+ }
118
+ catch {
119
+ // non-fatal
120
+ }
121
+ }
122
+ }
123
+ async function ingestPlanFiles(client, rateLimiter, plansDir) {
124
+ const scanConfig = loadScanConfig();
125
+ if (!scanConfig.enabled)
126
+ return;
127
+ let entries;
128
+ try {
129
+ entries = readdirSync(plansDir, { withFileTypes: true });
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ const manifest = readManifest();
135
+ let ingested = 0;
136
+ for (const entry of entries) {
137
+ if (ingested >= MAX_PLAN_FILES)
138
+ break;
139
+ if (!entry.isFile())
140
+ continue;
141
+ if (extname(entry.name).toLowerCase() !== ".md")
142
+ continue;
143
+ const fullPath = join(plansDir, entry.name);
144
+ try {
145
+ const stat = statSync(fullPath);
146
+ if (!isChanged(fullPath, stat, manifest))
147
+ continue;
148
+ if (!rateLimiter.canProceed())
149
+ break;
150
+ let content = readFileSync(fullPath, "utf-8");
151
+ if (content.length > 100_000) {
152
+ content = content.slice(0, 100_000) + "\n[...truncated]";
153
+ }
154
+ const context = `claude-code-plan:${entry.name}`;
155
+ await client.ingest(content, context, INGEST_TIMEOUT_MS);
156
+ markIngested(fullPath, stat, context, manifest);
157
+ ingested++;
158
+ }
159
+ catch {
160
+ // skip individual file errors
161
+ }
162
+ }
163
+ if (ingested > 0)
164
+ writeManifest(manifest);
165
+ }
166
+ /**
167
+ * Read a Claude Code session transcript and ingest the full conversation.
168
+ *
169
+ * Extracts user and assistant messages from the JSONL transcript file,
170
+ * builds a condensed conversation text, and sends it to Nex in one shot.
171
+ * This captures the full context instead of just the last assistant message.
172
+ */
173
+ const MAX_TRANSCRIPT_LENGTH = 100_000;
174
+ async function ingestTranscript(client, sessionId) {
175
+ const cwd = process.cwd();
176
+ // Claude Code stores transcripts at ~/.claude/projects/<project-hash>/<session-id>.jsonl
177
+ // Project hash is the CWD path with / replaced by -
178
+ const projectHash = "-" + cwd.replace(/\//g, "-");
179
+ const transcriptPath = join(homedir(), ".claude", "projects", projectHash, `${sessionId}.jsonl`);
180
+ let raw;
181
+ try {
182
+ raw = readFileSync(transcriptPath, "utf-8");
183
+ }
184
+ catch {
185
+ return; // transcript doesn't exist yet or path is wrong
186
+ }
187
+ // Extract user/assistant messages
188
+ const lines = [];
189
+ for (const line of raw.split("\n")) {
190
+ if (!line.trim())
191
+ continue;
192
+ try {
193
+ const entry = JSON.parse(line);
194
+ const role = entry.message?.role;
195
+ if (role !== "user" && role !== "assistant")
196
+ continue;
197
+ let text = "";
198
+ const content = entry.message?.content;
199
+ if (typeof content === "string") {
200
+ text = content;
201
+ }
202
+ else if (Array.isArray(content)) {
203
+ text = content
204
+ .filter((c) => c.type === "text")
205
+ .map((c) => c.text)
206
+ .join("\n");
207
+ }
208
+ if (!text.trim())
209
+ continue;
210
+ // Strip nex-context blocks to avoid feedback loops
211
+ text = text.replace(/<nex-context>[\s\S]*?<\/nex-context>/g, "").trim();
212
+ if (!text)
213
+ continue;
214
+ lines.push(`[${role}]: ${text}`);
215
+ }
216
+ catch {
217
+ continue;
218
+ }
219
+ }
220
+ if (lines.length < 2)
221
+ return; // need at least one exchange
222
+ let transcript = lines.join("\n\n");
223
+ if (transcript.length > MAX_TRANSCRIPT_LENGTH) {
224
+ // Keep the most recent messages (end of conversation is most valuable)
225
+ transcript = transcript.slice(-MAX_TRANSCRIPT_LENGTH);
226
+ transcript = "[...earlier messages truncated]\n\n" + transcript;
227
+ }
228
+ await client.ingest(transcript, `claude-code-transcript:${sessionId}`, 30_000);
229
+ }
230
+ // ── Session Start ───────────────────────────────────────────────────────
231
+ const SESSION_START_QUERY = "Summarize the key active context, recent interactions, and important updates for this user.";
232
+ /**
233
+ * Run session-start logic: scan files → query Nex baseline → return context.
234
+ * Returns null if disabled. Returns registrationPrompt if no API key.
235
+ */
236
+ export async function doSessionStart(source, sessionKey) {
237
+ if (!isHookEnabled("session_start"))
238
+ return null;
239
+ let cfg;
240
+ try {
241
+ cfg = loadConfig();
242
+ }
243
+ catch (err) {
244
+ if (err instanceof ConfigError) {
245
+ // No API key — return registration instructions
246
+ return {
247
+ context: "",
248
+ registrationPrompt: buildRegistrationPrompt(),
249
+ };
250
+ }
251
+ return null;
252
+ }
253
+ const client = new NexClient(cfg.apiKey, cfg.baseUrl);
254
+ const contextParts = [];
255
+ // File scan on startup or clear
256
+ const shouldScan = source === "startup" || source === "clear";
257
+ if (shouldScan) {
258
+ // Skip expensive file scanning if a scan completed recently (within 1 hour).
259
+ // The context query below still runs — only the file walk + ingest is skipped.
260
+ const scanManifest = readManifest();
261
+ const scanFresh = isScanFresh(scanManifest);
262
+ if (!scanFresh) {
263
+ const rateLimiter = new RateLimiter();
264
+ const cwd = process.cwd();
265
+ try {
266
+ const ctxResult = await ingestContextFiles(client, rateLimiter, cwd);
267
+ if (ctxResult.ingested > 0) {
268
+ contextParts.push(`[Context files: ${ctxResult.ingested} ingested (${ctxResult.files.join(", ")})]`);
269
+ }
270
+ }
271
+ catch {
272
+ // non-fatal
273
+ }
274
+ try {
275
+ const scanConfig = loadScanConfig();
276
+ if (scanConfig.enabled) {
277
+ const scanResult = await scanAndIngest(client, rateLimiter, cwd, scanConfig);
278
+ if (scanResult.ingested > 0) {
279
+ contextParts.push(`[File scan: ${scanResult.ingested} file${scanResult.ingested === 1 ? "" : "s"} ingested, ${scanResult.scanned} scanned]`);
280
+ // Trigger compounding intelligence after ingestion (non-blocking, best-effort)
281
+ triggerCompounding(cfg).catch(() => { });
282
+ }
283
+ }
284
+ }
285
+ catch {
286
+ // non-fatal
287
+ }
288
+ // Mark scan as complete so subsequent sessions skip it
289
+ markScanned(scanManifest);
290
+ writeManifest(scanManifest);
291
+ }
292
+ }
293
+ let result;
294
+ try {
295
+ result = await client.ask(SESSION_START_QUERY, undefined, 30_000);
296
+ }
297
+ catch (err) {
298
+ if (err instanceof NexAuthError) {
299
+ return {
300
+ context: "",
301
+ registrationPrompt: buildAuthExpiredPrompt(),
302
+ };
303
+ }
304
+ throw err;
305
+ }
306
+ if (!result.answer && contextParts.length === 0)
307
+ return null;
308
+ if (result.session_id && sessionKey) {
309
+ sessions.set(sessionKey, result.session_id);
310
+ }
311
+ recordRecall(result.session_id);
312
+ const entityCount = result.entity_references?.length ?? 0;
313
+ const context = formatNexContext({
314
+ answer: result.answer,
315
+ entityCount,
316
+ sessionId: result.session_id,
317
+ });
318
+ const fullContext = contextParts.length > 0
319
+ ? `${context}\n${contextParts.join("\n")}`
320
+ : context;
321
+ return { context: fullContext, nexSessionId: result.session_id };
322
+ }
323
+ function buildRegistrationPrompt() {
324
+ return [
325
+ "[Nex Memory Plugin] No API key configured. Registration is required to enable persistent memory.",
326
+ "",
327
+ "IMPORTANT: Before proceeding with the user's request, you must set up Nex memory:",
328
+ "1. Ask the user for their email address to register for a Nex account",
329
+ "2. Run: nex register --email <email>",
330
+ "3. Then run: nex setup",
331
+ "",
332
+ "Keep it brief — just ask for the email and register. No restart needed after registration.",
333
+ ].join("\n");
334
+ }
335
+ function buildAuthExpiredPrompt() {
336
+ return [
337
+ "[Nex Memory Plugin] API key expired or invalid. Re-registration is required to restore persistent memory.",
338
+ "",
339
+ "IMPORTANT: Before proceeding with the user's request, you must renew the Nex API key:",
340
+ "1. Ask the user for their email address",
341
+ "2. Run: nex register --email <email>",
342
+ "3. Then run: nex setup",
343
+ "",
344
+ "Keep it brief — just ask for the email and register. No restart needed after registration.",
345
+ ].join("\n");
346
+ }
347
+ // ── Helpers ─────────────────────────────────────────────────────────────
348
+ /** Read stdin as a string (shared across all hook scripts). */
349
+ export async function readStdin() {
350
+ const chunks = [];
351
+ for await (const chunk of process.stdin) {
352
+ chunks.push(chunk);
353
+ }
354
+ return Buffer.concat(chunks).toString("utf-8");
355
+ }
356
+ /**
357
+ * Trigger compounding intelligence jobs after content ingestion.
358
+ * Runs consolidation, pattern detection, and playbook synthesis.
359
+ * Best-effort — errors are silently ignored.
360
+ */
361
+ async function triggerCompounding(cfg) {
362
+ const jobs = ["consolidation", "pattern_detection", "playbook_synthesis"];
363
+ const url = `${cfg.baseUrl}/api/developers/v1/compounding/trigger`;
364
+ await Promise.allSettled(jobs.map((job) => fetch(url, {
365
+ method: "POST",
366
+ headers: { Authorization: `Bearer ${cfg.apiKey}`, "Content-Type": "application/json" },
367
+ body: JSON.stringify({ job_type: job, dry_run: false }),
368
+ signal: AbortSignal.timeout(30_000),
369
+ })));
370
+ }
371
+ /** Wrap output in Claude Code hookSpecificOutput format. */
372
+ export function claudeCodeOutput(hookEventName, additionalContext) {
373
+ return JSON.stringify({
374
+ hookSpecificOutput: {
375
+ hookEventName,
376
+ additionalContext,
377
+ },
378
+ });
379
+ }
380
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/plugin/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nex-update-check — lightweight version check with caching.
4
+ *
5
+ * Outputs one of:
6
+ * UPGRADE_AVAILABLE <current> <latest>
7
+ * (nothing — up to date, snoozed, disabled, or cached)
8
+ *
9
+ * Designed to run inline in session start hooks with minimal latency.
10
+ * Caches results to ~/.nex/last-update-check (60 min TTL for "up to date",
11
+ * 720 min for "upgrade available"). Supports snooze with escalating backoff.
12
+ */
13
+ export {};