xtctx 0.13.1 → 0.14.1

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 (63) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/dist/src/cli/disconnect.d.ts +1 -0
  4. package/dist/src/cli/disconnect.d.ts.map +1 -1
  5. package/dist/src/cli/disconnect.js +23 -1
  6. package/dist/src/cli/disconnect.js.map +1 -1
  7. package/dist/src/cli/hook.d.ts.map +1 -1
  8. package/dist/src/cli/hook.js +53 -5
  9. package/dist/src/cli/hook.js.map +1 -1
  10. package/dist/src/cli/status.d.ts +19 -0
  11. package/dist/src/cli/status.d.ts.map +1 -1
  12. package/dist/src/cli/status.js +35 -9
  13. package/dist/src/cli/status.js.map +1 -1
  14. package/dist/src/handoff/embeddings.d.ts +14 -0
  15. package/dist/src/handoff/embeddings.d.ts.map +1 -1
  16. package/dist/src/handoff/embeddings.js +19 -0
  17. package/dist/src/handoff/embeddings.js.map +1 -1
  18. package/dist/src/handoff/sqlite-index.d.ts +42 -3
  19. package/dist/src/handoff/sqlite-index.d.ts.map +1 -1
  20. package/dist/src/handoff/sqlite-index.js +263 -38
  21. package/dist/src/handoff/sqlite-index.js.map +1 -1
  22. package/dist/src/handoff/types.d.ts +36 -2
  23. package/dist/src/handoff/types.d.ts.map +1 -1
  24. package/dist/src/mcp/server.d.ts.map +1 -1
  25. package/dist/src/mcp/server.js +15 -0
  26. package/dist/src/mcp/server.js.map +1 -1
  27. package/dist/src/mcp/tools/manifest.d.ts.map +1 -1
  28. package/dist/src/mcp/tools/manifest.js +1 -1
  29. package/dist/src/mcp/tools/manifest.js.map +1 -1
  30. package/dist/src/mcp/tools/sessions.d.ts +2 -0
  31. package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
  32. package/dist/src/mcp/tools/sessions.js +39 -6
  33. package/dist/src/mcp/tools/sessions.js.map +1 -1
  34. package/dist/src/scrapers/antigravity.d.ts +23 -0
  35. package/dist/src/scrapers/antigravity.d.ts.map +1 -1
  36. package/dist/src/scrapers/antigravity.js +66 -8
  37. package/dist/src/scrapers/antigravity.js.map +1 -1
  38. package/dist/src/scrapers/claude-code.d.ts +1 -0
  39. package/dist/src/scrapers/claude-code.d.ts.map +1 -1
  40. package/dist/src/scrapers/claude-code.js +24 -13
  41. package/dist/src/scrapers/claude-code.js.map +1 -1
  42. package/dist/src/scrapers/codex.d.ts.map +1 -1
  43. package/dist/src/scrapers/codex.js +22 -5
  44. package/dist/src/scrapers/codex.js.map +1 -1
  45. package/dist/src/scrapers/copilot-cli.d.ts.map +1 -1
  46. package/dist/src/scrapers/copilot-cli.js +22 -5
  47. package/dist/src/scrapers/copilot-cli.js.map +1 -1
  48. package/dist/src/scrapers/copilot.d.ts.map +1 -1
  49. package/dist/src/scrapers/copilot.js +5 -5
  50. package/dist/src/scrapers/copilot.js.map +1 -1
  51. package/dist/src/scrapers/cursor.d.ts.map +1 -1
  52. package/dist/src/scrapers/cursor.js +5 -5
  53. package/dist/src/scrapers/cursor.js.map +1 -1
  54. package/dist/src/scrapers/drift-log.d.ts +15 -0
  55. package/dist/src/scrapers/drift-log.d.ts.map +1 -0
  56. package/dist/src/scrapers/drift-log.js +81 -0
  57. package/dist/src/scrapers/drift-log.js.map +1 -0
  58. package/dist/src/scrapers/opencode.d.ts.map +1 -1
  59. package/dist/src/scrapers/opencode.js +5 -5
  60. package/dist/src/scrapers/opencode.js.map +1 -1
  61. package/dist/src/types/scraper.d.ts +13 -0
  62. package/dist/src/types/scraper.d.ts.map +1 -1
  63. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on Keep a Changelog, and this project follows Semantic Versioning.
6
6
  This file is maintained automatically by Release Please.
7
7
 
8
+ ## [0.14.1](https://github.com/fstubner/xtctx/compare/xtctx-v0.14.0...xtctx-v0.14.1) (2026-08-21)
9
+
10
+
11
+ ### Performance
12
+
13
+ * **antigravity:** decide before fetching, not after ([#126](https://github.com/fstubner/xtctx/issues/126)) ([42c6bbf](https://github.com/fstubner/xtctx/commit/42c6bbf28be1840383c5d2d124c0959303212ea2))
14
+
15
+ ## [0.14.0](https://github.com/fstubner/xtctx/compare/xtctx-v0.13.1...xtctx-v0.14.0) (2026-08-21)
16
+
17
+
18
+ ### Features
19
+
20
+ * git provenance and turn-0 context priming ([#123](https://github.com/fstubner/xtctx/issues/123)) ([2aa0536](https://github.com/fstubner/xtctx/commit/2aa053658b5d715fd4e30e80ad95d1f6690bbfe8))
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * acceptance round 4 — eight findings from the independent review ([#122](https://github.com/fstubner/xtctx/issues/122)) ([b8ef164](https://github.com/fstubner/xtctx/commit/b8ef164a35cf3142afdf05260f9edad75774f721))
26
+
8
27
  ## [0.13.1](https://github.com/fstubner/xtctx/compare/xtctx-v0.13.0...xtctx-v0.13.1) (2026-08-20)
9
28
 
10
29
 
package/README.md CHANGED
@@ -108,7 +108,7 @@ startup hooks; others receive MCP config plus managed instructions only.
108
108
 
109
109
  - xtctx is local-only. It does not upload transcripts or run telemetry.
110
110
  - Transcript formats belong to each upstream tool and can drift. The drift
111
- tests and nightly canary exist to catch parser breakage, but `xtctx status`
111
+ tests and format fingerprints exist to catch parser breakage, but `xtctx status`
112
112
  is still the source of truth for your machine.
113
113
  - Semantic search is lazy. The first semantic or hybrid query may initialize
114
114
  the local embedding provider and create local vectors; hybrid search falls
@@ -3,6 +3,7 @@ export interface DisconnectCliOptions {
3
3
  tool?: string;
4
4
  all?: boolean;
5
5
  yes?: boolean;
6
+ homeDir?: string;
6
7
  }
7
8
  export declare function runDisconnect(options?: DisconnectCliOptions): Promise<void>;
8
9
  //# sourceMappingURL=disconnect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../../src/cli/disconnect.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAerF"}
1
+ {"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../../src/cli/disconnect.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrF"}
@@ -1,8 +1,19 @@
1
+ import { join } from "node:path";
1
2
  import { createInterface } from "node:readline/promises";
2
3
  import { stdin as input, stdout as output } from "node:process";
3
4
  import { describeDisconnectPlan, disconnectProject, printDisconnectResult, } from "../config/disconnect.js";
4
5
  export async function runDisconnect(options = {}) {
5
- if (!options.yes) {
6
+ if (options.yes) {
7
+ // `--yes` skips the prompt, not the disclosure. Antigravity keeps its MCP
8
+ // config at app level, so disconnecting here removes xtctx from
9
+ // Antigravity for every project on the machine — which was previously
10
+ // only mentioned once the files had been written.
11
+ const plan = describeDisconnectPlan(options);
12
+ for (const warning of plan.warnings) {
13
+ process.stdout.write(` warning ${warning}\n`);
14
+ }
15
+ }
16
+ else {
6
17
  const confirmed = await confirmDisconnect(options);
7
18
  if (!confirmed) {
8
19
  process.stdout.write("xtctx disconnect cancelled.\n");
@@ -13,8 +24,19 @@ export async function runDisconnect(options = {}) {
13
24
  projectPath: options.projectPath,
14
25
  tool: options.tool,
15
26
  all: options.all,
27
+ homeDir: options.homeDir,
16
28
  });
17
29
  printDisconnectResult(result);
30
+ printLeftovers(result.projectRoot);
31
+ }
32
+ /**
33
+ * Disconnect unwires xtctx from other tools; it does not delete the project's
34
+ * own directory, which holds an index built from transcript content. Leaving
35
+ * that unmentioned makes "disconnect" sound more complete than it is.
36
+ */
37
+ function printLeftovers(projectRoot) {
38
+ process.stdout.write(` left in place ${join(projectRoot, ".xtctx")} ` +
39
+ `(config and the local indexed transcript content — delete the directory to remove it)\n`);
18
40
  }
19
41
  async function confirmDisconnect(options) {
20
42
  const plan = describeDisconnectPlan(options);
@@ -1 +1 @@
1
- {"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../src/cli/disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AASjC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAA6B;IAC5D,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;IACtF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../src/cli/disconnect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE"}
@@ -1,4 +1,14 @@
1
1
  import { createProjectServices } from "../runtime/services.js";
2
+ /**
3
+ * How recent a session has to be to count as active context.
4
+ *
5
+ * Priming the agent with what someone was doing an hour ago saves it a
6
+ * round-trip. Priming it with last week's work just puts stale detail at the
7
+ * top of the context window, where it reads as current.
8
+ */
9
+ const ACTIVE_FRAME_MAX_AGE_MS = 24 * 60 * 60 * 1000;
10
+ /** Keep the preview to a line: this lands in the agent's boot context. */
11
+ const PREVIEW_CHARS = 200;
2
12
  export async function runHook(options = {}) {
3
13
  if (options.event && options.event !== "session-start") {
4
14
  return;
@@ -10,17 +20,24 @@ export async function runHook(options = {}) {
10
20
  services = await createProjectServices(options.projectPath);
11
21
  const status = await services.sessions.getStatus();
12
22
  const tool = options.tool ?? "unknown";
13
- process.stdout.write([
23
+ // Deliberately the no-scan read. This runs before the user's first turn,
24
+ // and `listRecentSessions` would start a scan of every transcript store on
25
+ // the machine and wait seconds for it — on every agent startup.
26
+ const recent = (await services.sessions.listIndexedSessions?.(1)) ?? [];
27
+ const active = recent.find(isActive);
28
+ const lines = [
14
29
  "# xtctx handoff",
15
30
  "",
16
31
  `Tool: ${tool}`,
17
32
  `Project root: ${services.projectRoot}`,
18
33
  `Last scan: ${status.last_scan_at ?? "never"}`,
19
34
  "",
20
- "Recent transcript context is available through MCP.",
21
- "Call `xtctx_recent_sessions`, then `xtctx_session_detail` for relevant sessions.",
22
- "",
23
- ].join("\n"));
35
+ ];
36
+ if (active) {
37
+ lines.push(...activeFrame(active));
38
+ }
39
+ lines.push("Recent transcript context is available through MCP.", "Call `xtctx_recent_sessions`, then `xtctx_session_detail` for relevant sessions.", "");
40
+ process.stdout.write(lines.join("\n"));
24
41
  }
25
42
  catch {
26
43
  return;
@@ -29,4 +46,35 @@ export async function runHook(options = {}) {
29
46
  await services?.sessions.close().catch(() => { });
30
47
  }
31
48
  }
49
+ function isActive(session) {
50
+ const lastActivity = Date.parse(session.last_activity_at);
51
+ return Number.isFinite(lastActivity) && Date.now() - lastActivity <= ACTIVE_FRAME_MAX_AGE_MS;
52
+ }
53
+ /**
54
+ * A pointer, not a summary. It names the session and where it was, and leaves
55
+ * the content to `xtctx_session_detail` — the raw transcript stays the
56
+ * authority, and nothing here is derived from more than one field.
57
+ */
58
+ function activeFrame(session) {
59
+ const branch = session.git_branch
60
+ ? ` on ${session.git_branch}${session.git_commit ? ` @ ${session.git_commit.slice(0, 8)}` : ""}`
61
+ : "";
62
+ const lines = [
63
+ "## Active context",
64
+ "",
65
+ `- Session: \`${session.session_ref}\` (${session.tool}${branch})`,
66
+ `- Last activity: ${session.last_activity_at}`,
67
+ `- Messages: ${session.message_count}`,
68
+ ];
69
+ if (session.preview) {
70
+ // Single line: this is untrusted transcript text going into a context
71
+ // window, and content that cannot start a line cannot forge structure.
72
+ lines.push(`- Opened with: ${inlineSafe(session.preview).slice(0, PREVIEW_CHARS)}`);
73
+ }
74
+ lines.push("", `Call \`xtctx_session_detail session_ref="${session.session_ref}"\` for the full turn history.`, "");
75
+ return lines;
76
+ }
77
+ function inlineSafe(value) {
78
+ return value.replace(/\s+/g, " ").trim();
79
+ }
32
80
  //# sourceMappingURL=hook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAQ/D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACrD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACvD,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,QAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;QAEvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;YACE,iBAAiB;YACjB,EAAE;YACF,SAAS,IAAI,EAAE;YACf,iBAAiB,QAAQ,CAAC,WAAW,EAAE;YACvC,cAAc,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE;YAC9C,EAAE;YACF,qDAAqD;YACrD,kFAAkF;YAClF,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,26 @@
1
1
  import { type ProjectServices } from "../runtime/services.js";
2
+ import { SUPPORTED_TOOLS } from "../tools/sources.js";
2
3
  export interface StatusOptions {
3
4
  projectPath?: string;
4
5
  }
5
6
  export declare function runStatus(options?: StatusOptions): Promise<void>;
6
7
  export declare function renderStatusBlock(services: ProjectServices): Promise<string>;
8
+ /** Store paths that differ from the tool's built-in default location. */
9
+ /**
10
+ * Notes about where a tool's transcripts are being read from.
11
+ *
12
+ * Two different situations look identical in the config file. A path that
13
+ * differs from the default may be a deliberate override — `.xtctx/config.yaml`
14
+ * is committable, so a cloned repo can legitimately point a scraper anywhere,
15
+ * and those stay legal but visible. Or it may simply be stale: setup records
16
+ * where the tool kept its data that day, and tools move. opencode turned out
17
+ * to write to the XDG location on Windows rather than %APPDATA%, so every
18
+ * project set up before that was fixed still points at a path that has never
19
+ * existed, and reports "not detected" forever with a real store sitting
20
+ * elsewhere.
21
+ *
22
+ * Nothing is rewritten here — a config file is the user's. But the stale case
23
+ * is named, with the path that does exist and how to adopt it.
24
+ */
25
+ export declare function storePathNotes(definition: (typeof SUPPORTED_TOOLS)[number] | undefined, storePaths: string[]): string[];
7
26
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIrF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqGlF"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkGlF;AAYD,yEAAyE;AACzE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EACxD,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,EAAE,CA4BV"}
@@ -1,3 +1,4 @@
1
+ import { existsSync } from "node:fs";
1
2
  import { join, resolve } from "node:path";
2
3
  import { inspectManagedFile, pathExists } from "../config/setup.js";
3
4
  import { inspectSkillStatus } from "../config/skills.js";
@@ -45,11 +46,8 @@ export async function renderStatusBlock(services) {
45
46
  const error = tool.last_error ? `; last scrape error: ${tool.last_error}` : "";
46
47
  lines.push(` ${marker} ${tool.tool.padEnd(13)} ${tool.detected ? "detected" : "not detected"}; ` +
47
48
  `${tool.indexed_sessions} sessions; hook: ${hook}${error}`);
48
- // `.xtctx/config.yaml` is committable, so a cloned repo can point a
49
- // scraper at any directory on disk. Overrides stay legal but visible.
50
- const custom = customStorePaths(definition, tool.store_paths);
51
- for (const path of custom) {
52
- lines.push(` custom store path (not the ${tool.tool} default): ${path}`);
49
+ for (const note of storePathNotes(definition, tool.store_paths)) {
50
+ lines.push(` ${note}`);
53
51
  }
54
52
  }
55
53
  lines.push("");
@@ -114,18 +112,46 @@ function managedTargets(projectRoot) {
114
112
  ];
115
113
  }
116
114
  /** Store paths that differ from the tool's built-in default location. */
117
- function customStorePaths(definition, storePaths) {
115
+ /**
116
+ * Notes about where a tool's transcripts are being read from.
117
+ *
118
+ * Two different situations look identical in the config file. A path that
119
+ * differs from the default may be a deliberate override — `.xtctx/config.yaml`
120
+ * is committable, so a cloned repo can legitimately point a scraper anywhere,
121
+ * and those stay legal but visible. Or it may simply be stale: setup records
122
+ * where the tool kept its data that day, and tools move. opencode turned out
123
+ * to write to the XDG location on Windows rather than %APPDATA%, so every
124
+ * project set up before that was fixed still points at a path that has never
125
+ * existed, and reports "not detected" forever with a real store sitting
126
+ * elsewhere.
127
+ *
128
+ * Nothing is rewritten here — a config file is the user's. But the stale case
129
+ * is named, with the path that does exist and how to adopt it.
130
+ */
131
+ export function storePathNotes(definition, storePaths) {
118
132
  if (!definition) {
119
133
  return [];
120
134
  }
121
- let fallback;
135
+ let resolved;
122
136
  try {
123
- fallback = normalizePath(definition.defaultStorePath());
137
+ resolved = definition.defaultStorePath();
124
138
  }
125
139
  catch {
126
140
  return [];
127
141
  }
128
- return storePaths.filter((path) => normalizePath(path) !== fallback);
142
+ const notes = [];
143
+ for (const path of storePaths) {
144
+ if (normalizePath(path) === normalizePath(resolved)) {
145
+ continue;
146
+ }
147
+ if (!existsSync(path) && existsSync(resolved)) {
148
+ notes.push(`stale store path: ${path} does not exist, but ${definition.id} has a store at ` +
149
+ `${resolved} — re-run 'xtctx setup --yes' to point at it`);
150
+ continue;
151
+ }
152
+ notes.push(`custom store path (not the ${definition.id} default): ${path}`);
153
+ }
154
+ return notes;
129
155
  }
130
156
  function normalizePath(value) {
131
157
  return value.replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAyB;IAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,GAAG,MAAM;QACT,GAAG,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KAC3C,CAAC,CAAC,CACJ,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,mBAAmB,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,iDAAiD,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,CAAC,IAAI,CACR,YAAY,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,QAAQ,aAAa;QACnE,GAAG,MAAM,CAAC,eAAe,uBAAuB,MAAM,CAAC,gBAAgB,aAAa,CACvF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,UAAU,EAAE,QAAQ,IAAI,UAAU,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,IAAI;YACpF,GAAG,IAAI,CAAC,gBAAgB,oBAAoB,IAAI,GAAG,KAAK,EAAE,CAC7D,CAAC;QACF,oEAAoE;QACpE,sEAAsE;QACtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,IAAI,cAAc,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;gBAC1D,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,cAAc,CAAC;QACrB,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,eAAe,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpH,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,WAAW,GACf,CAAC,aAAa;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9C,6DAA6D;QAC7D,oEAAoE;QACpE,sDAAsD;QACtD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IAE1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IAC5G,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IACjG,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,WAAmB;IACzC,OAAO;QACL,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;QACjE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;QAC9D,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;QAC9D,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE;QAC7E,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,yBAAyB,CAAC,EAAE;KACpF,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,gBAAgB,CACvB,UAAwD,EACxD,UAAoB;IAEpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,28 @@ export interface EmbeddingProvider {
3
3
  readonly model: string;
4
4
  embed(text: string): Promise<Float32Array>;
5
5
  embedBatch(texts: string[]): Promise<Float32Array[]>;
6
+ /**
7
+ * Whether the model is loaded and embedding would start immediately.
8
+ *
9
+ * Loading it means fetching and initialising a local model, which on a cold
10
+ * cache is minutes — not something to do while an agent holds a tool call
11
+ * open. Callers check this to decide whether to answer now by another route.
12
+ */
13
+ isReady?(): boolean;
14
+ /** Begin loading the model without waiting for it. */
15
+ warm?(): void;
6
16
  }
7
17
  export declare class TransformersEmbeddingProvider implements EmbeddingProvider {
8
18
  readonly model: string;
9
19
  private extractor;
20
+ private loading;
10
21
  constructor(model?: string);
11
22
  embed(text: string): Promise<Float32Array>;
12
23
  embedBatch(texts: string[]): Promise<Float32Array[]>;
24
+ isReady(): boolean;
25
+ warm(): void;
13
26
  private getExtractor;
27
+ private loadExtractor;
14
28
  }
15
29
  /**
16
30
  * Split text into segments that fit the embedding model's sequence window
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACtD;AAiBD,qBAAa,6BAA8B,YAAW,iBAAiB;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,SAAS,CAA0C;gBAE/C,KAAK,SAA0B;IAIrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAe5C,YAAY;CAuB3B;AA0BD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,MAAM,EAAE,CAgCtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAyBjE"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC;IACpB,sDAAsD;IACtD,IAAI,CAAC,IAAI,IAAI,CAAC;CACf;AAiBD,qBAAa,6BAA8B,YAAW,iBAAiB;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,OAAO,CAAmD;gBAEtD,KAAK,SAA0B;IAIrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAe1D,OAAO,IAAI,OAAO;IAIlB,IAAI,IAAI,IAAI;YAME,YAAY;YAeZ,aAAa;CAmB5B;AA0BD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,MAAM,EAAE,CAgCtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAyBjE"}
@@ -6,6 +6,7 @@ const MAX_BATCH_SIZE = 32;
6
6
  export class TransformersEmbeddingProvider {
7
7
  model;
8
8
  extractor = null;
9
+ loading = null;
9
10
  constructor(model = DEFAULT_EMBEDDING_MODEL) {
10
11
  this.model = model;
11
12
  }
@@ -26,10 +27,28 @@ export class TransformersEmbeddingProvider {
26
27
  }
27
28
  return vectors;
28
29
  }
30
+ isReady() {
31
+ return this.extractor !== null;
32
+ }
33
+ warm() {
34
+ void this.getExtractor().catch(() => {
35
+ // Warming is best-effort; the next real embed call reports the failure.
36
+ });
37
+ }
29
38
  async getExtractor() {
30
39
  if (this.extractor) {
31
40
  return this.extractor;
32
41
  }
42
+ // Concurrent callers must not each start their own model load.
43
+ if (this.loading) {
44
+ return this.loading;
45
+ }
46
+ this.loading = this.loadExtractor().finally(() => {
47
+ this.loading = null;
48
+ });
49
+ return this.loading;
50
+ }
51
+ async loadExtractor() {
33
52
  process.stderr.write(`xtctx: Initializing local embedding provider (${this.model})...\n`);
34
53
  const transformers = (await import("@huggingface/transformers"));
35
54
  const extractor = await transformers.pipeline("feature-extraction", this.model, {
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AACjE,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,6EAA6E;AAC7E,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,EAAE,CAAC;AAuB1B,MAAM,OAAO,6BAA6B;IAC/B,KAAK,CAAS;IACf,SAAS,GAAqC,IAAI,CAAC;IAE3D,YAAY,KAAK,GAAG,uBAAuB;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,cAAc,EAAE,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,cAAc,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;QAE1F,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAE9D,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,EAAE;YAC9E,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,8EAA8E;QAC9E,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,oEAAoE;QACpE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,SAAS,gBAAgB,CACvB,MAA+B,EAC/B,SAAiB;IAEjB,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,IAA4C;IAClE,IAAI,IAAI,YAAY,YAAY,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,QAAQ,GAAG,aAAa;IAC1E,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YACxD,OAAO,GAAG,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAuB;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;QAChC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ConversationScraper } from "../types/scraper.js";
2
2
  import { type EmbeddingProvider } from "./embeddings.js";
3
- import type { HandoffStatus, SessionMessage, SessionSearchMode, SessionService, SessionSummary } from "./types.js";
3
+ import type { HandoffStatus, IndexProgress, SessionMessage, SessionSearchMode, SessionService, SessionSummary } from "./types.js";
4
4
  interface ToolRuntime {
5
5
  tool: string;
6
6
  scraper: ConversationScraper;
@@ -9,6 +9,10 @@ interface SqliteHandoffIndexOptions {
9
9
  embeddingProvider?: EmbeddingProvider;
10
10
  windowSize?: number;
11
11
  windowStride?: number;
12
+ /** How long a caller waits for a scan before taking what is indexed so far. */
13
+ refreshBudgetMs?: number;
14
+ /** How long one search spends building vectors before answering with what it has. */
15
+ vectorBudgetMs?: number;
12
16
  }
13
17
  export declare class SqliteHandoffIndex implements SessionService {
14
18
  private readonly dbPath;
@@ -19,18 +23,53 @@ export declare class SqliteHandoffIndex implements SessionService {
19
23
  private readonly initialized;
20
24
  private refreshPromise;
21
25
  private lastRefreshMs;
26
+ /**
27
+ * How long an indexed view is treated as current.
28
+ *
29
+ * A scan re-reads every transcript store on the machine, so at five seconds
30
+ * almost every tool call in a session started a fresh one and paid the wait
31
+ * budget again. The transcripts being read belong to sessions that ended
32
+ * before this one started; they do not change second to second.
33
+ */
22
34
  private readonly refreshTtlMs;
35
+ private readonly refreshBudgetMs;
36
+ private readonly vectorBudgetMs;
37
+ private scanStartedMs;
38
+ /** The embedding model is loading, so this answer came from keyword search alone. */
39
+ private embeddingWarming;
40
+ /** Windows still waiting to be vectorized after the last search gave up its budget. */
41
+ private vectorBacklog;
23
42
  private readonly embeddingProvider;
24
43
  private readonly windowSize;
25
44
  private readonly windowStride;
26
45
  constructor(dbPath: string, projectRoot: string, tools: ToolRuntime[], options?: SqliteHandoffIndexOptions);
27
- listRecentSessions(limit: number, toolFilter?: string[]): Promise<SessionSummary[]>;
46
+ listRecentSessions(limit: number, toolFilter?: string[], branchFilter?: string[]): Promise<SessionSummary[]>;
47
+ /**
48
+ * What is already indexed, with no scan and no waiting.
49
+ *
50
+ * The SessionStart hook runs before the user has typed anything, so it
51
+ * cannot afford the scan `listRecentSessions` starts — even bounded, that
52
+ * is four seconds added to every agent startup. Priming with slightly
53
+ * stale context instantly beats priming with fresh context late.
54
+ */
55
+ listIndexedSessions(limit: number): Promise<SessionSummary[]>;
28
56
  getSessionByRef(sessionRef: string): Promise<SessionSummary | null>;
29
57
  getSessionDetail(sessionRef: string, offset: number, limit: number): Promise<SessionMessage[]>;
30
- searchSessions(query: string, limit: number, toolFilter?: string[], mode?: SessionSearchMode): Promise<SessionSummary[]>;
58
+ searchSessions(query: string, limit: number, toolFilter?: string[], mode?: SessionSearchMode, branchFilter?: string[]): Promise<SessionSummary[]>;
31
59
  getStatus(): Promise<HandoffStatus>;
32
60
  close(): Promise<void>;
33
61
  private refresh;
62
+ /**
63
+ * Wait for the scan, but not past the budget. Nothing is cancelled on
64
+ * timeout — the scan keeps running and keeps committing — so a caller that
65
+ * stops waiting costs the index nothing, and the next call finds more.
66
+ */
67
+ private waitWithBudget;
68
+ /** True when a scan started by an earlier call is still running. */
69
+ isScanning(): boolean;
70
+ getIndexProgress(): IndexProgress;
71
+ /** Resolves when no scan is in flight. Used by close() and by tests. */
72
+ whenScanSettled(): Promise<void>;
34
73
  private refreshNow;
35
74
  private upsertChunk;
36
75
  private rebuildRetrievalUnitsForSession;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-index.d.ts","sourceRoot":"","sources":["../../../src/handoff/sqlite-index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAgBD,UAAU,yBAAyB;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+ED,qBAAa,kBAAmB,YAAW,cAAc;IAYrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAbxB,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAAE,EACrC,OAAO,GAAE,yBAA8B;IAanC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBnF,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAcnE,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,EAAE,CAAC;IAuBtB,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,iBAA4B,GACjC,OAAO,CAAC,cAAc,EAAE,CAAC;IA8BtB,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAsDnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,OAAO;YA0BP,UAAU;IAmDxB,OAAO,CAAC,WAAW;IAoDnB,OAAO,CAAC,+BAA+B;IAwFvC,OAAO,CAAC,QAAQ;YA8EF,aAAa;YAUb,cAAc;IAqF5B,OAAO,CAAC,iBAAiB;YA2BX,aAAa;YAwEb,UAAU;YAwBV,mBAAmB;IAMjC;;;OAGG;YACW,mBAAmB;IAajC,OAAO,CAAC,KAAK;CAMd"}
1
+ {"version":3,"file":"sqlite-index.d.ts","sourceRoot":"","sources":["../../../src/handoff/sqlite-index.ts"],"names":[],"mappings":"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"}