xtctx 0.3.2 → 0.11.3
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 +317 -122
- package/LICENSE +21 -21
- package/README.md +154 -121
- package/dist/src/cli/disconnect.d.ts +8 -0
- package/dist/src/cli/disconnect.d.ts.map +1 -0
- package/dist/src/cli/disconnect.js +42 -0
- package/dist/src/cli/disconnect.js.map +1 -0
- package/dist/src/cli/hook.d.ts +7 -0
- package/dist/src/cli/hook.d.ts.map +1 -0
- package/dist/src/cli/hook.js +32 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +86 -33
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/setup.d.ts +8 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +76 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/status.d.ts +7 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +133 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/config/disconnect.d.ts +34 -0
- package/dist/src/config/disconnect.d.ts.map +1 -0
- package/dist/src/config/disconnect.js +386 -0
- package/dist/src/config/disconnect.js.map +1 -0
- package/dist/src/config/managed-block.d.ts +29 -0
- package/dist/src/config/managed-block.d.ts.map +1 -0
- package/dist/src/config/managed-block.js +67 -0
- package/dist/src/config/managed-block.js.map +1 -0
- package/dist/src/config/mcp-config.d.ts +93 -0
- package/dist/src/config/mcp-config.d.ts.map +1 -0
- package/dist/src/config/mcp-config.js +556 -0
- package/dist/src/config/mcp-config.js.map +1 -0
- package/dist/src/config/setup.d.ts +39 -0
- package/dist/src/config/setup.d.ts.map +1 -0
- package/dist/src/config/setup.js +379 -0
- package/dist/src/config/setup.js.map +1 -0
- package/dist/src/config/skills.d.ts +73 -0
- package/dist/src/config/skills.d.ts.map +1 -0
- package/dist/src/config/skills.js +427 -0
- package/dist/src/config/skills.js.map +1 -0
- package/dist/src/handoff/embeddings.d.ts +26 -0
- package/dist/src/handoff/embeddings.d.ts.map +1 -0
- package/dist/src/handoff/embeddings.js +132 -0
- package/dist/src/handoff/embeddings.js.map +1 -0
- package/dist/src/handoff/sqlite-index.d.ts +52 -0
- package/dist/src/handoff/sqlite-index.d.ts.map +1 -0
- package/dist/src/handoff/sqlite-index.js +905 -0
- package/dist/src/handoff/sqlite-index.js.map +1 -0
- package/dist/src/handoff/types.d.ts +63 -0
- package/dist/src/handoff/types.d.ts.map +1 -0
- package/dist/src/handoff/types.js +2 -0
- package/dist/src/handoff/types.js.map +1 -0
- package/dist/src/handoff/vector.d.ts +4 -0
- package/dist/src/handoff/vector.d.ts.map +1 -0
- package/dist/src/handoff/vector.js +31 -0
- package/dist/src/handoff/vector.js.map +1 -0
- package/dist/src/mcp/server.d.ts +3 -20
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +90 -205
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/continuity.d.ts +21 -0
- package/dist/src/mcp/tools/continuity.d.ts.map +1 -0
- package/dist/src/mcp/tools/continuity.js +55 -0
- package/dist/src/mcp/tools/continuity.js.map +1 -0
- package/dist/src/mcp/tools/manifest.d.ts +40 -0
- package/dist/src/mcp/tools/manifest.d.ts.map +1 -0
- package/dist/src/mcp/tools/manifest.js +105 -0
- package/dist/src/mcp/tools/manifest.js.map +1 -0
- package/dist/src/mcp/tools/sessions.d.ts +18 -31
- package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
- package/dist/src/mcp/tools/sessions.js +109 -16
- package/dist/src/mcp/tools/sessions.js.map +1 -1
- package/dist/src/runtime/services.d.ts +11 -38
- package/dist/src/runtime/services.d.ts.map +1 -1
- package/dist/src/runtime/services.js +61 -200
- package/dist/src/runtime/services.js.map +1 -1
- package/dist/src/scrapers/antigravity.d.ts +52 -0
- package/dist/src/scrapers/antigravity.d.ts.map +1 -0
- package/dist/src/scrapers/antigravity.js +869 -0
- package/dist/src/scrapers/antigravity.js.map +1 -0
- package/dist/src/scrapers/base.d.ts +53 -1
- package/dist/src/scrapers/base.d.ts.map +1 -1
- package/dist/src/scrapers/base.js +93 -4
- package/dist/src/scrapers/base.js.map +1 -1
- package/dist/src/scrapers/claude-code.d.ts +37 -6
- package/dist/src/scrapers/claude-code.d.ts.map +1 -1
- package/dist/src/scrapers/claude-code.js +214 -40
- package/dist/src/scrapers/claude-code.js.map +1 -1
- package/dist/src/scrapers/codex.d.ts +36 -6
- package/dist/src/scrapers/codex.d.ts.map +1 -1
- package/dist/src/scrapers/codex.js +283 -60
- package/dist/src/scrapers/codex.js.map +1 -1
- package/dist/src/scrapers/copilot-cli.d.ts +34 -0
- package/dist/src/scrapers/copilot-cli.d.ts.map +1 -0
- package/dist/src/scrapers/copilot-cli.js +342 -0
- package/dist/src/scrapers/copilot-cli.js.map +1 -0
- package/dist/src/scrapers/copilot.d.ts +41 -8
- package/dist/src/scrapers/copilot.d.ts.map +1 -1
- package/dist/src/scrapers/copilot.js +256 -118
- package/dist/src/scrapers/copilot.js.map +1 -1
- package/dist/src/scrapers/cursor.d.ts +24 -9
- package/dist/src/scrapers/cursor.d.ts.map +1 -1
- package/dist/src/scrapers/cursor.js +259 -152
- package/dist/src/scrapers/cursor.js.map +1 -1
- package/dist/src/scrapers/index.d.ts +23 -0
- package/dist/src/scrapers/index.d.ts.map +1 -0
- package/dist/src/scrapers/index.js +22 -0
- package/dist/src/scrapers/index.js.map +1 -0
- package/dist/src/scrapers/opencode.d.ts +37 -0
- package/dist/src/scrapers/opencode.d.ts.map +1 -0
- package/dist/src/scrapers/opencode.js +277 -0
- package/dist/src/scrapers/opencode.js.map +1 -0
- package/dist/src/scrapers/registry.d.ts +1 -0
- package/dist/src/scrapers/registry.d.ts.map +1 -1
- package/dist/src/scrapers/registry.js +3 -0
- package/dist/src/scrapers/registry.js.map +1 -1
- package/dist/src/tools/sources.d.ts +28 -0
- package/dist/src/tools/sources.d.ts.map +1 -0
- package/dist/src/tools/sources.js +149 -0
- package/dist/src/tools/sources.js.map +1 -0
- package/dist/src/types/config.d.ts +24 -37
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/index.d.ts +0 -2
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +0 -2
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/scraper.d.ts +34 -5
- package/dist/src/types/scraper.d.ts.map +1 -1
- package/dist/src/utils/atomic-file.d.ts +8 -0
- package/dist/src/utils/atomic-file.d.ts.map +1 -0
- package/dist/src/utils/atomic-file.js +15 -0
- package/dist/src/utils/atomic-file.js.map +1 -0
- package/dist/src/utils/errors.d.ts +7 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +16 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/package-info.d.ts +11 -0
- package/dist/src/utils/package-info.d.ts.map +1 -0
- package/dist/src/utils/package-info.js +30 -0
- package/dist/src/utils/package-info.js.map +1 -0
- package/dist/src/utils/project-scope.d.ts +19 -0
- package/dist/src/utils/project-scope.d.ts.map +1 -0
- package/dist/src/utils/project-scope.js +61 -0
- package/dist/src/utils/project-scope.js.map +1 -0
- package/package.json +70 -66
- package/dist/src/api/routes/config.d.ts +0 -4
- package/dist/src/api/routes/config.d.ts.map +0 -1
- package/dist/src/api/routes/config.js +0 -61
- package/dist/src/api/routes/config.js.map +0 -1
- package/dist/src/api/routes/knowledge.d.ts +0 -4
- package/dist/src/api/routes/knowledge.d.ts.map +0 -1
- package/dist/src/api/routes/knowledge.js +0 -40
- package/dist/src/api/routes/knowledge.js.map +0 -1
- package/dist/src/api/routes/search.d.ts +0 -7
- package/dist/src/api/routes/search.d.ts.map +0 -1
- package/dist/src/api/routes/search.js +0 -108
- package/dist/src/api/routes/search.js.map +0 -1
- package/dist/src/api/routes/sources.d.ts +0 -12
- package/dist/src/api/routes/sources.d.ts.map +0 -1
- package/dist/src/api/routes/sources.js +0 -70
- package/dist/src/api/routes/sources.js.map +0 -1
- package/dist/src/api/server.d.ts +0 -26
- package/dist/src/api/server.d.ts.map +0 -1
- package/dist/src/api/server.js +0 -312
- package/dist/src/api/server.js.map +0 -1
- package/dist/src/cli/ingest.d.ts +0 -6
- package/dist/src/cli/ingest.d.ts.map +0 -1
- package/dist/src/cli/ingest.js +0 -11
- package/dist/src/cli/ingest.js.map +0 -1
- package/dist/src/cli/init.d.ts +0 -6
- package/dist/src/cli/init.d.ts.map +0 -1
- package/dist/src/cli/init.js +0 -105
- package/dist/src/cli/init.js.map +0 -1
- package/dist/src/cli/serve.d.ts +0 -7
- package/dist/src/cli/serve.d.ts.map +0 -1
- package/dist/src/cli/serve.js +0 -100
- package/dist/src/cli/serve.js.map +0 -1
- package/dist/src/cli/sync.d.ts +0 -5
- package/dist/src/cli/sync.d.ts.map +0 -1
- package/dist/src/cli/sync.js +0 -13
- package/dist/src/cli/sync.js.map +0 -1
- package/dist/src/compaction/pipeline.d.ts +0 -19
- package/dist/src/compaction/pipeline.d.ts.map +0 -1
- package/dist/src/compaction/pipeline.js +0 -37
- package/dist/src/compaction/pipeline.js.map +0 -1
- package/dist/src/compaction/providers/cli.d.ts +0 -13
- package/dist/src/compaction/providers/cli.d.ts.map +0 -1
- package/dist/src/compaction/providers/cli.js +0 -60
- package/dist/src/compaction/providers/cli.js.map +0 -1
- package/dist/src/compaction/rule-based.d.ts +0 -8
- package/dist/src/compaction/rule-based.d.ts.map +0 -1
- package/dist/src/compaction/rule-based.js +0 -120
- package/dist/src/compaction/rule-based.js.map +0 -1
- package/dist/src/config/loader.d.ts +0 -12
- package/dist/src/config/loader.d.ts.map +0 -1
- package/dist/src/config/loader.js +0 -76
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/config/mappings/claude-code.d.ts +0 -3
- package/dist/src/config/mappings/claude-code.d.ts.map +0 -1
- package/dist/src/config/mappings/claude-code.js +0 -31
- package/dist/src/config/mappings/claude-code.js.map +0 -1
- package/dist/src/config/mappings/codex.d.ts +0 -3
- package/dist/src/config/mappings/codex.d.ts.map +0 -1
- package/dist/src/config/mappings/codex.js +0 -31
- package/dist/src/config/mappings/codex.js.map +0 -1
- package/dist/src/config/mappings/copilot.d.ts +0 -3
- package/dist/src/config/mappings/copilot.d.ts.map +0 -1
- package/dist/src/config/mappings/copilot.js +0 -33
- package/dist/src/config/mappings/copilot.js.map +0 -1
- package/dist/src/config/mappings/cursor.d.ts +0 -3
- package/dist/src/config/mappings/cursor.d.ts.map +0 -1
- package/dist/src/config/mappings/cursor.js +0 -29
- package/dist/src/config/mappings/cursor.js.map +0 -1
- package/dist/src/config/sync.d.ts +0 -13
- package/dist/src/config/sync.d.ts.map +0 -1
- package/dist/src/config/sync.js +0 -96
- package/dist/src/config/sync.js.map +0 -1
- package/dist/src/ingestion/coordinator.d.ts +0 -37
- package/dist/src/ingestion/coordinator.d.ts.map +0 -1
- package/dist/src/ingestion/coordinator.js +0 -127
- package/dist/src/ingestion/coordinator.js.map +0 -1
- package/dist/src/ingestion/daemon.d.ts +0 -17
- package/dist/src/ingestion/daemon.d.ts.map +0 -1
- package/dist/src/ingestion/daemon.js +0 -35
- package/dist/src/ingestion/daemon.js.map +0 -1
- package/dist/src/ingestion/watcher.d.ts +0 -19
- package/dist/src/ingestion/watcher.d.ts.map +0 -1
- package/dist/src/ingestion/watcher.js +0 -70
- package/dist/src/ingestion/watcher.js.map +0 -1
- package/dist/src/knowledge/autotag.d.ts +0 -3
- package/dist/src/knowledge/autotag.d.ts.map +0 -1
- package/dist/src/knowledge/autotag.js +0 -24
- package/dist/src/knowledge/autotag.js.map +0 -1
- package/dist/src/knowledge/dedup.d.ts +0 -7
- package/dist/src/knowledge/dedup.d.ts.map +0 -1
- package/dist/src/knowledge/dedup.js +0 -15
- package/dist/src/knowledge/dedup.js.map +0 -1
- package/dist/src/knowledge/repository.d.ts +0 -12
- package/dist/src/knowledge/repository.d.ts.map +0 -1
- package/dist/src/knowledge/repository.js +0 -74
- package/dist/src/knowledge/repository.js.map +0 -1
- package/dist/src/mcp/tools/config.d.ts +0 -36
- package/dist/src/mcp/tools/config.d.ts.map +0 -1
- package/dist/src/mcp/tools/config.js +0 -54
- package/dist/src/mcp/tools/config.js.map +0 -1
- package/dist/src/mcp/tools/knowledge.d.ts +0 -17
- package/dist/src/mcp/tools/knowledge.d.ts.map +0 -1
- package/dist/src/mcp/tools/knowledge.js +0 -46
- package/dist/src/mcp/tools/knowledge.js.map +0 -1
- package/dist/src/mcp/tools/search.d.ts +0 -22
- package/dist/src/mcp/tools/search.d.ts.map +0 -1
- package/dist/src/mcp/tools/search.js +0 -30
- package/dist/src/mcp/tools/search.js.map +0 -1
- package/dist/src/mcp/tools/write.d.ts +0 -38
- package/dist/src/mcp/tools/write.d.ts.map +0 -1
- package/dist/src/mcp/tools/write.js +0 -97
- package/dist/src/mcp/tools/write.js.map +0 -1
- package/dist/src/runtime/ingestion.d.ts +0 -17
- package/dist/src/runtime/ingestion.d.ts.map +0 -1
- package/dist/src/runtime/ingestion.js +0 -106
- package/dist/src/runtime/ingestion.js.map +0 -1
- package/dist/src/scrapers/gemini.d.ts +0 -17
- package/dist/src/scrapers/gemini.d.ts.map +0 -1
- package/dist/src/scrapers/gemini.js +0 -245
- package/dist/src/scrapers/gemini.js.map +0 -1
- package/dist/src/store/embeddings.d.ts +0 -9
- package/dist/src/store/embeddings.d.ts.map +0 -1
- package/dist/src/store/embeddings.js +0 -28
- package/dist/src/store/embeddings.js.map +0 -1
- package/dist/src/store/lance.d.ts +0 -25
- package/dist/src/store/lance.d.ts.map +0 -1
- package/dist/src/store/lance.js +0 -74
- package/dist/src/store/lance.js.map +0 -1
- package/dist/src/store/search.d.ts +0 -18
- package/dist/src/store/search.d.ts.map +0 -1
- package/dist/src/store/search.js +0 -55
- package/dist/src/store/search.js.map +0 -1
- package/dist/src/types/compaction.d.ts +0 -29
- package/dist/src/types/compaction.d.ts.map +0 -1
- package/dist/src/types/compaction.js +0 -2
- package/dist/src/types/compaction.js.map +0 -1
- package/dist/src/types/context.d.ts +0 -33
- package/dist/src/types/context.d.ts.map +0 -1
- package/dist/src/types/context.js +0 -18
- package/dist/src/types/context.js.map +0 -1
- package/dist/src/utils/retry.d.ts +0 -11
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js +0 -46
- package/dist/src/utils/retry.js.map +0 -1
- package/dist/src/utils/shutdown.d.ts +0 -25
- package/dist/src/utils/shutdown.d.ts.map +0 -1
- package/dist/src/utils/shutdown.js +0 -56
- package/dist/src/utils/shutdown.js.map +0 -1
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/index-Nuadr5ox.css +0 -1
- package/dist/web/assets/index-aA0u8eXA.js +0 -3504
- package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
- package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
- package/dist/web/assets/primeicons-Dr5RGzOO.svg +0 -345
- package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
- package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +0 -21
- package/dist/web/index.html +0 -21
- package/dist/web/site.webmanifest +0 -19
- package/dist/web/vite.svg +0 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { createReadStream } from "node:fs";
|
|
2
|
+
import { readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import { pathMatchesProject } from "../utils/project-scope.js";
|
|
6
|
+
import { AbstractScraper, estimateTokens, toDate } from "./base.js";
|
|
7
|
+
const SCRAPER_NAME = "copilot-cli";
|
|
8
|
+
/**
|
|
9
|
+
* Mutation shapes the copilot-cli scraper tolerates silently. Anything
|
|
10
|
+
* outside this whitelist that drops records must warn.
|
|
11
|
+
*/
|
|
12
|
+
export const ACCEPTED_DEGRADATIONS = {
|
|
13
|
+
/** Sessions root missing — Copilot CLI not installed. */
|
|
14
|
+
missingSessionRoot: "~/.copilot/session-state directory absent",
|
|
15
|
+
/** Session directory has no events.jsonl file yet — fresh session. */
|
|
16
|
+
missingEventsJsonl: "session directory has no events.jsonl",
|
|
17
|
+
/** Blank line in events.jsonl. */
|
|
18
|
+
blankJsonlLine: "blank line in events.jsonl",
|
|
19
|
+
/** Event with no extractable role — many event types (status, tool_call,
|
|
20
|
+
* subagent meta, etc.) legitimately have no role. */
|
|
21
|
+
noRole: "event has no role — non-conversation event",
|
|
22
|
+
/** Event with no extractable text content. */
|
|
23
|
+
noContent: "event has role but no text content",
|
|
24
|
+
/** Forward-compat unknown keys alongside known fields. */
|
|
25
|
+
unknownFieldsAlongside: "extra keys alongside known event schema",
|
|
26
|
+
};
|
|
27
|
+
const ROLE_MAP = {
|
|
28
|
+
user: "user",
|
|
29
|
+
human: "user",
|
|
30
|
+
assistant: "assistant",
|
|
31
|
+
ai: "assistant",
|
|
32
|
+
system: "system",
|
|
33
|
+
tool: "tool",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Current Copilot CLI writes typed events ("user.message",
|
|
37
|
+
* "assistant.message", "system.message") whose payload lives under `data`.
|
|
38
|
+
* The event type itself carries the role.
|
|
39
|
+
*/
|
|
40
|
+
const EVENT_TYPE_ROLE_MAP = {
|
|
41
|
+
"user.message": "user",
|
|
42
|
+
"assistant.message": "assistant",
|
|
43
|
+
"system.message": "system",
|
|
44
|
+
};
|
|
45
|
+
function warnDrift(sourcePath, surprise, recordsAffected) {
|
|
46
|
+
console.warn(`[${SCRAPER_NAME}] schema-drift surprise at ${sourcePath}: ${surprise} ` +
|
|
47
|
+
`(records affected: ${recordsAffected})`);
|
|
48
|
+
}
|
|
49
|
+
export class CopilotCliScraper extends AbstractScraper {
|
|
50
|
+
sessionStateDir;
|
|
51
|
+
projectRoot;
|
|
52
|
+
tool = "copilot-cli";
|
|
53
|
+
constructor(sessionStateDir, stateDir, projectRoot) {
|
|
54
|
+
super(stateDir);
|
|
55
|
+
this.sessionStateDir = sessionStateDir;
|
|
56
|
+
this.projectRoot = projectRoot;
|
|
57
|
+
}
|
|
58
|
+
async detect() {
|
|
59
|
+
try {
|
|
60
|
+
const target = await stat(this.sessionStateDir);
|
|
61
|
+
return target.isDirectory();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
getStorePaths() {
|
|
68
|
+
return [this.sessionStateDir];
|
|
69
|
+
}
|
|
70
|
+
async *scrape(since) {
|
|
71
|
+
const state = await this.getLastScrapedPosition();
|
|
72
|
+
const cutoff = since ?? state.lastTimestamp;
|
|
73
|
+
yield* this.readAllSessions(cutoff);
|
|
74
|
+
}
|
|
75
|
+
async *fullSync() {
|
|
76
|
+
yield* this.readAllSessions(new Date(0));
|
|
77
|
+
}
|
|
78
|
+
async *readAllSessions(since) {
|
|
79
|
+
let sessionDirs;
|
|
80
|
+
try {
|
|
81
|
+
sessionDirs = await readdir(this.sessionStateDir);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ACCEPTED_DEGRADATIONS.missingSessionRoot
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for (const sessionId of sessionDirs) {
|
|
88
|
+
const sessionDir = join(this.sessionStateDir, sessionId);
|
|
89
|
+
let dirStat;
|
|
90
|
+
try {
|
|
91
|
+
dirStat = await stat(sessionDir);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!dirStat.isDirectory())
|
|
97
|
+
continue;
|
|
98
|
+
const eventsPath = join(sessionDir, "events.jsonl");
|
|
99
|
+
try {
|
|
100
|
+
const eventsStat = await stat(eventsPath);
|
|
101
|
+
if (!eventsStat.isFile())
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// ACCEPTED_DEGRADATIONS.missingEventsJsonl
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
yield* this.readEventsFile(eventsPath, sessionId, since);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
// One unreadable session must not abort the remaining sessions.
|
|
113
|
+
warnDrift(eventsPath, `unreadable transcript file: ${err.message}`, 0);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async *readEventsFile(filePath, sessionId, since) {
|
|
118
|
+
const reader = createInterface({
|
|
119
|
+
input: createReadStream(filePath, { encoding: "utf8" }),
|
|
120
|
+
crlfDelay: Infinity,
|
|
121
|
+
});
|
|
122
|
+
let messageIndex = 0;
|
|
123
|
+
let lineNo = 0;
|
|
124
|
+
// null = no session.start context seen yet; only consulted when scoped.
|
|
125
|
+
let projectMatch = null;
|
|
126
|
+
for await (const line of reader) {
|
|
127
|
+
lineNo++;
|
|
128
|
+
if (!line.trim()) {
|
|
129
|
+
// ACCEPTED_DEGRADATIONS.blankJsonlLine
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
let event;
|
|
133
|
+
try {
|
|
134
|
+
event = JSON.parse(line);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
warnDrift(`${filePath}:${lineNo}`, `events.jsonl line is not valid JSON: ${err.message}`, 1);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!isRecord(event)) {
|
|
141
|
+
warnDrift(`${filePath}:${lineNo}`, `events.jsonl line is not an object (got ${describeType(event)})`, 1);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (this.projectRoot && event.type === "session.start") {
|
|
145
|
+
projectMatch = sessionStartMatchesProject(event, this.projectRoot);
|
|
146
|
+
if (projectMatch === false) {
|
|
147
|
+
// Another project's session; nothing in this file belongs here.
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const role = extractRole(event);
|
|
153
|
+
const content = extractContent(event);
|
|
154
|
+
if (!role) {
|
|
155
|
+
// If the event looks like a conversation message (has extractable
|
|
156
|
+
// content AND a 'message' or 'role'-shaped sibling that we COULDN'T
|
|
157
|
+
// route), warn — likely a rename. Routine non-conversation events
|
|
158
|
+
// (status, tool_call, etc.) carry no content and are silent.
|
|
159
|
+
if (content) {
|
|
160
|
+
const looksLikeMessage = event.type === "message" ||
|
|
161
|
+
"role" in event ||
|
|
162
|
+
(isRecord(event.message) && "role" in event.message);
|
|
163
|
+
if (looksLikeMessage) {
|
|
164
|
+
warnDrift(`${filePath}:${lineNo}`, "event has content but no readable role — likely role-field rename", 1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ACCEPTED_DEGRADATIONS.noRole — non-conversation events are
|
|
168
|
+
// routine in events.jsonl. Skip silently.
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (!content) {
|
|
172
|
+
// Role is present but no content extractable. If a 'content' key
|
|
173
|
+
// exists in an unexpected shape (null, number, etc.), warn — silent
|
|
174
|
+
// skip would hide a content-field retype. A genuinely-missing content
|
|
175
|
+
// key on a role'd event is unusual but not necessarily drift.
|
|
176
|
+
if ("content" in event && typeof event.content !== "string" && !Array.isArray(event.content)) {
|
|
177
|
+
warnDrift(`${filePath}:${lineNo}`, `event has role but 'content' is unexpected type ${describeType(event.content)}`, 1);
|
|
178
|
+
}
|
|
179
|
+
// ACCEPTED_DEGRADATIONS.noContent
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (this.projectRoot && projectMatch === null) {
|
|
183
|
+
// Fail closed: without session.start context this session cannot be
|
|
184
|
+
// attributed to a project, so scoped indexing must not include it.
|
|
185
|
+
warnDrift(filePath, "session has no session.start context; cannot attribute to a project — skipped under project scoping", 1);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const tsValue = event.timestamp ?? event.created_at ?? event.createdAt ?? event.time;
|
|
189
|
+
const timestamp = toDate(tsValue);
|
|
190
|
+
if (since.getTime() > 0 && timestamp <= since) {
|
|
191
|
+
messageIndex++;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const eventType = typeof event.type === "string" ? event.type : undefined;
|
|
195
|
+
yield {
|
|
196
|
+
tool: "copilot-cli",
|
|
197
|
+
sessionId,
|
|
198
|
+
timestamp,
|
|
199
|
+
role,
|
|
200
|
+
content,
|
|
201
|
+
metadata: {
|
|
202
|
+
messageIndex,
|
|
203
|
+
tokenEstimate: estimateTokens(content),
|
|
204
|
+
referencedFiles: [],
|
|
205
|
+
eventType,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
messageIndex++;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function extractRole(event) {
|
|
213
|
+
// Try event.role first.
|
|
214
|
+
if (typeof event.role === "string") {
|
|
215
|
+
const mapped = ROLE_MAP[event.role.toLowerCase()];
|
|
216
|
+
if (mapped)
|
|
217
|
+
return mapped;
|
|
218
|
+
}
|
|
219
|
+
// Try event.message.role.
|
|
220
|
+
const message = event.message;
|
|
221
|
+
if (isRecord(message) && typeof message.role === "string") {
|
|
222
|
+
const mapped = ROLE_MAP[message.role.toLowerCase()];
|
|
223
|
+
if (mapped)
|
|
224
|
+
return mapped;
|
|
225
|
+
}
|
|
226
|
+
// Typed events: event.data.role, then the role implied by the event type.
|
|
227
|
+
const data = event.data;
|
|
228
|
+
if (isRecord(data) && typeof data.role === "string") {
|
|
229
|
+
const mapped = ROLE_MAP[data.role.toLowerCase()];
|
|
230
|
+
if (mapped)
|
|
231
|
+
return mapped;
|
|
232
|
+
}
|
|
233
|
+
if (typeof event.type === "string") {
|
|
234
|
+
const mapped = EVENT_TYPE_ROLE_MAP[event.type];
|
|
235
|
+
if (mapped)
|
|
236
|
+
return mapped;
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
function sessionStartMatchesProject(event, projectRoot) {
|
|
241
|
+
const data = event.data;
|
|
242
|
+
if (!isRecord(data))
|
|
243
|
+
return false;
|
|
244
|
+
const context = data.context;
|
|
245
|
+
if (!isRecord(context))
|
|
246
|
+
return false;
|
|
247
|
+
const candidates = [context.cwd, context.gitRoot].filter((value) => typeof value === "string" && value.length > 0);
|
|
248
|
+
return candidates.some((candidate) => pathMatchesProject(candidate, projectRoot));
|
|
249
|
+
}
|
|
250
|
+
function extractContent(event) {
|
|
251
|
+
// 1. event.content as string.
|
|
252
|
+
if (typeof event.content === "string") {
|
|
253
|
+
const trimmed = event.content.trim();
|
|
254
|
+
if (trimmed.length > 0)
|
|
255
|
+
return trimmed;
|
|
256
|
+
}
|
|
257
|
+
// 2. event.text as string.
|
|
258
|
+
if (typeof event.text === "string") {
|
|
259
|
+
const trimmed = event.text.trim();
|
|
260
|
+
if (trimmed.length > 0)
|
|
261
|
+
return trimmed;
|
|
262
|
+
}
|
|
263
|
+
// 3. event.message.content as string or array of {type, text}.
|
|
264
|
+
const message = event.message;
|
|
265
|
+
if (isRecord(message)) {
|
|
266
|
+
const inner = message.content;
|
|
267
|
+
if (typeof inner === "string") {
|
|
268
|
+
const trimmed = inner.trim();
|
|
269
|
+
if (trimmed.length > 0)
|
|
270
|
+
return trimmed;
|
|
271
|
+
}
|
|
272
|
+
if (Array.isArray(inner)) {
|
|
273
|
+
const texts = inner
|
|
274
|
+
.map((item) => {
|
|
275
|
+
if (typeof item === "string")
|
|
276
|
+
return item;
|
|
277
|
+
if (isRecord(item) && typeof item.text === "string")
|
|
278
|
+
return item.text;
|
|
279
|
+
return "";
|
|
280
|
+
})
|
|
281
|
+
.filter((t) => t.length > 0);
|
|
282
|
+
const joined = texts.join("\n").trim();
|
|
283
|
+
if (joined.length > 0)
|
|
284
|
+
return joined;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// 4. event.content as array of {type, text}.
|
|
288
|
+
if (Array.isArray(event.content)) {
|
|
289
|
+
const texts = event.content
|
|
290
|
+
.map((item) => {
|
|
291
|
+
if (typeof item === "string")
|
|
292
|
+
return item;
|
|
293
|
+
if (isRecord(item) && typeof item.text === "string")
|
|
294
|
+
return item.text;
|
|
295
|
+
return "";
|
|
296
|
+
})
|
|
297
|
+
.filter((t) => t.length > 0);
|
|
298
|
+
const joined = texts.join("\n").trim();
|
|
299
|
+
if (joined.length > 0)
|
|
300
|
+
return joined;
|
|
301
|
+
}
|
|
302
|
+
// 5. Typed events: event.data.content / event.data.text.
|
|
303
|
+
const data = event.data;
|
|
304
|
+
if (isRecord(data)) {
|
|
305
|
+
if (typeof data.content === "string") {
|
|
306
|
+
const trimmed = data.content.trim();
|
|
307
|
+
if (trimmed.length > 0)
|
|
308
|
+
return trimmed;
|
|
309
|
+
}
|
|
310
|
+
if (Array.isArray(data.content)) {
|
|
311
|
+
const texts = data.content
|
|
312
|
+
.map((item) => {
|
|
313
|
+
if (typeof item === "string")
|
|
314
|
+
return item;
|
|
315
|
+
if (isRecord(item) && typeof item.text === "string")
|
|
316
|
+
return item.text;
|
|
317
|
+
return "";
|
|
318
|
+
})
|
|
319
|
+
.filter((t) => t.length > 0);
|
|
320
|
+
const joined = texts.join("\n").trim();
|
|
321
|
+
if (joined.length > 0)
|
|
322
|
+
return joined;
|
|
323
|
+
}
|
|
324
|
+
if (typeof data.text === "string") {
|
|
325
|
+
const trimmed = data.text.trim();
|
|
326
|
+
if (trimmed.length > 0)
|
|
327
|
+
return trimmed;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
function isRecord(value) {
|
|
333
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
334
|
+
}
|
|
335
|
+
function describeType(value) {
|
|
336
|
+
if (value === null)
|
|
337
|
+
return "null";
|
|
338
|
+
if (Array.isArray(value))
|
|
339
|
+
return "array";
|
|
340
|
+
return typeof value;
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=copilot-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-cli.js","sourceRoot":"","sources":["../../../src/scrapers/copilot-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,50 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { CopilotChunk } from "../types/scraper.js";
|
|
2
|
+
import { AbstractScraper } from "./base.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shapes that the Copilot scraper tolerates silently without logging.
|
|
5
|
+
* Each entry documents the shape being accepted and why it is not drift.
|
|
6
|
+
* Anything not listed here that falls outside the happy path MUST warn
|
|
7
|
+
* (or throw, for required-schema violations).
|
|
8
|
+
*/
|
|
9
|
+
export declare const ACCEPTED_DEGRADATIONS: {
|
|
10
|
+
/** Workspace has no state.vscdb yet — pristine VS Code install. */
|
|
11
|
+
missingStateVscdb: string;
|
|
12
|
+
/** workspaceStorage root missing — VS Code not installed. */
|
|
13
|
+
missingWorkspaceStorage: string;
|
|
14
|
+
/** better-sqlite3 native module absent — Copilot ingestion is opt-in. */
|
|
15
|
+
missingSqliteBinding: string;
|
|
16
|
+
/** State.vscdb has no interactive.sessions row — workspace never used Copilot chat. */
|
|
17
|
+
noInteractiveSessionsKey: string;
|
|
18
|
+
/** ItemTable shape varies across VS Code versions; tolerate open/query failure. */
|
|
19
|
+
unreadableItemTable: string;
|
|
20
|
+
/** A canceled request is intentionally skipped — not drift. */
|
|
21
|
+
canceledRequest: string;
|
|
22
|
+
/** Some sessions legitimately have no user-text (agent-only runs); skip silently. */
|
|
23
|
+
emptyUserText: string;
|
|
24
|
+
/** Empty assistant response (thinking timeout etc.) — not drift. */
|
|
25
|
+
emptyAssistantText: string;
|
|
26
|
+
/** Extra/unknown fields alongside known ones are forward-compatible. */
|
|
27
|
+
unknownFieldsAlongside: string;
|
|
28
|
+
};
|
|
29
|
+
export declare class CopilotScraper extends AbstractScraper<CopilotChunk> {
|
|
30
|
+
/** Path to %APPDATA%/Code/User/workspaceStorage (or a test stand-in). */
|
|
31
|
+
private readonly workspaceStoragePath;
|
|
32
|
+
private readonly projectRoot?;
|
|
4
33
|
readonly tool = "copilot";
|
|
5
|
-
|
|
6
|
-
|
|
34
|
+
constructor(
|
|
35
|
+
/** Path to %APPDATA%/Code/User/workspaceStorage (or a test stand-in). */
|
|
36
|
+
workspaceStoragePath: string, stateDir: string, projectRoot?: string | undefined);
|
|
7
37
|
detect(): Promise<boolean>;
|
|
8
38
|
getStorePaths(): string[];
|
|
9
39
|
scrape(since?: Date): AsyncIterable<CopilotChunk>;
|
|
10
40
|
fullSync(): AsyncIterable<CopilotChunk>;
|
|
11
41
|
parseRaw(raw: unknown): CopilotChunk;
|
|
12
|
-
getLastScrapedPosition(): Promise<ScraperState>;
|
|
13
|
-
saveScrapedPosition(state: ScraperState): Promise<void>;
|
|
14
42
|
private readAllMessages;
|
|
15
|
-
private
|
|
43
|
+
private readFromDb;
|
|
44
|
+
/**
|
|
45
|
+
* Discovers VS Code workspaceStorage SQLite databases.
|
|
46
|
+
* Pattern: <workspaceStoragePath>/[hash]/state.vscdb
|
|
47
|
+
*/
|
|
48
|
+
private resolveDbPaths;
|
|
16
49
|
}
|
|
17
50
|
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAC;AAQpE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;IAChC,mEAAmE;;IAEnE,6DAA6D;;IAE7D,yEAAyE;;IAEzE,uFAAuF;;IAEvF,mFAAmF;;IAEnF,+DAA+D;;IAE/D,qFAAqF;;IAErF,oEAAoE;;IAEpE,wEAAwE;;CAEzE,CAAC;AAyBF,qBAAa,cAAe,SAAQ,eAAe,CAAC,YAAY,CAAC;IAI7D,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAN/B,QAAQ,CAAC,IAAI,aAAa;;IAGxB,yEAAyE;IACxD,oBAAoB,EAAE,MAAM,EAC7C,QAAQ,EAAE,MAAM,EACC,WAAW,CAAC,EAAE,MAAM,YAAA;IAKjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,aAAa,IAAI,MAAM,EAAE;IAIlB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,YAAY,CAAC;IAIjD,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC;IAI9C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;YAoBrB,eAAe;IAmC9B,OAAO,CAAE,UAAU;IAoKnB;;;OAGG;YACW,cAAc;CAkC7B"}
|