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.
- package/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/dist/src/cli/disconnect.d.ts +1 -0
- package/dist/src/cli/disconnect.d.ts.map +1 -1
- package/dist/src/cli/disconnect.js +23 -1
- package/dist/src/cli/disconnect.js.map +1 -1
- package/dist/src/cli/hook.d.ts.map +1 -1
- package/dist/src/cli/hook.js +53 -5
- package/dist/src/cli/hook.js.map +1 -1
- package/dist/src/cli/status.d.ts +19 -0
- package/dist/src/cli/status.d.ts.map +1 -1
- package/dist/src/cli/status.js +35 -9
- package/dist/src/cli/status.js.map +1 -1
- package/dist/src/handoff/embeddings.d.ts +14 -0
- package/dist/src/handoff/embeddings.d.ts.map +1 -1
- package/dist/src/handoff/embeddings.js +19 -0
- package/dist/src/handoff/embeddings.js.map +1 -1
- package/dist/src/handoff/sqlite-index.d.ts +42 -3
- package/dist/src/handoff/sqlite-index.d.ts.map +1 -1
- package/dist/src/handoff/sqlite-index.js +263 -38
- package/dist/src/handoff/sqlite-index.js.map +1 -1
- package/dist/src/handoff/types.d.ts +36 -2
- package/dist/src/handoff/types.d.ts.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +15 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/manifest.d.ts.map +1 -1
- package/dist/src/mcp/tools/manifest.js +1 -1
- package/dist/src/mcp/tools/manifest.js.map +1 -1
- package/dist/src/mcp/tools/sessions.d.ts +2 -0
- package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
- package/dist/src/mcp/tools/sessions.js +39 -6
- package/dist/src/mcp/tools/sessions.js.map +1 -1
- package/dist/src/scrapers/antigravity.d.ts +23 -0
- package/dist/src/scrapers/antigravity.d.ts.map +1 -1
- package/dist/src/scrapers/antigravity.js +66 -8
- package/dist/src/scrapers/antigravity.js.map +1 -1
- package/dist/src/scrapers/claude-code.d.ts +1 -0
- package/dist/src/scrapers/claude-code.d.ts.map +1 -1
- package/dist/src/scrapers/claude-code.js +24 -13
- package/dist/src/scrapers/claude-code.js.map +1 -1
- package/dist/src/scrapers/codex.d.ts.map +1 -1
- package/dist/src/scrapers/codex.js +22 -5
- package/dist/src/scrapers/codex.js.map +1 -1
- package/dist/src/scrapers/copilot-cli.d.ts.map +1 -1
- package/dist/src/scrapers/copilot-cli.js +22 -5
- package/dist/src/scrapers/copilot-cli.js.map +1 -1
- package/dist/src/scrapers/copilot.d.ts.map +1 -1
- package/dist/src/scrapers/copilot.js +5 -5
- package/dist/src/scrapers/copilot.js.map +1 -1
- package/dist/src/scrapers/cursor.d.ts.map +1 -1
- package/dist/src/scrapers/cursor.js +5 -5
- package/dist/src/scrapers/cursor.js.map +1 -1
- package/dist/src/scrapers/drift-log.d.ts +15 -0
- package/dist/src/scrapers/drift-log.d.ts.map +1 -0
- package/dist/src/scrapers/drift-log.js +81 -0
- package/dist/src/scrapers/drift-log.js.map +1 -0
- package/dist/src/scrapers/opencode.d.ts.map +1 -1
- package/dist/src/scrapers/opencode.js +5 -5
- package/dist/src/scrapers/opencode.js.map +1 -1
- package/dist/src/types/scraper.d.ts +13 -0
- package/dist/src/types/scraper.d.ts.map +1 -1
- 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
|
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../../src/cli/disconnect.ts"],"names":[],"mappings":"
|
|
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 (
|
|
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;
|
|
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":"
|
|
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"}
|
package/dist/src/cli/hook.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
package/dist/src/cli/hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/status.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/src/cli/status.js
CHANGED
|
@@ -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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
135
|
+
let resolved;
|
|
122
136
|
try {
|
|
123
|
-
|
|
137
|
+
resolved = definition.defaultStorePath();
|
|
124
138
|
}
|
|
125
139
|
catch {
|
|
126
140
|
return [];
|
|
127
141
|
}
|
|
128
|
-
|
|
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,
|
|
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;
|
|
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;
|
|
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;
|
|
1
|
+
{"version":3,"file":"sqlite-index.d.ts","sourceRoot":"","sources":["../../../src/handoff/sqlite-index.ts"],"names":[],"mappings":"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"}
|