@getrift/rift 0.1.0-beta.20 → 0.1.0-beta.22
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/README.md +7 -3
- package/dist/src/capture/auto-capture.d.ts +105 -4
- package/dist/src/capture/auto-capture.d.ts.map +1 -1
- package/dist/src/capture/auto-capture.js +313 -34
- package/dist/src/capture/auto-capture.js.map +1 -1
- package/dist/src/capture/claude-cli-triage-provider.d.ts +28 -0
- package/dist/src/capture/claude-cli-triage-provider.d.ts.map +1 -0
- package/dist/src/capture/claude-cli-triage-provider.js +88 -0
- package/dist/src/capture/claude-cli-triage-provider.js.map +1 -0
- package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
- package/dist/src/capture/codex-cli-triage-provider.js +1 -33
- package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
- package/dist/src/capture/cursor-capture.d.ts +89 -0
- package/dist/src/capture/cursor-capture.d.ts.map +1 -0
- package/dist/src/capture/cursor-capture.js +121 -0
- package/dist/src/capture/cursor-capture.js.map +1 -0
- package/dist/src/capture/observability.d.ts +30 -0
- package/dist/src/capture/observability.d.ts.map +1 -1
- package/dist/src/capture/observability.js +29 -0
- package/dist/src/capture/observability.js.map +1 -1
- package/dist/src/capture/sources.d.ts +41 -3
- package/dist/src/capture/sources.d.ts.map +1 -1
- package/dist/src/capture/sources.js +43 -1
- package/dist/src/capture/sources.js.map +1 -1
- package/dist/src/capture/triage-classification.d.ts +69 -0
- package/dist/src/capture/triage-classification.d.ts.map +1 -0
- package/dist/src/capture/triage-classification.js +62 -0
- package/dist/src/capture/triage-classification.js.map +1 -0
- package/dist/src/capture/triage-provider-factory.d.ts +36 -0
- package/dist/src/capture/triage-provider-factory.d.ts.map +1 -0
- package/dist/src/capture/triage-provider-factory.js +55 -0
- package/dist/src/capture/triage-provider-factory.js.map +1 -0
- package/dist/src/capture/triage.d.ts +1 -1
- package/dist/src/capture/triage.d.ts.map +1 -1
- package/dist/src/capture/triage.js +8 -6
- package/dist/src/capture/triage.js.map +1 -1
- package/dist/src/cli/commands/capture.d.ts.map +1 -1
- package/dist/src/cli/commands/capture.js +72 -17
- package/dist/src/cli/commands/capture.js.map +1 -1
- package/dist/src/cli/commands/chunk-backfill.d.ts +13 -0
- package/dist/src/cli/commands/chunk-backfill.d.ts.map +1 -0
- package/dist/src/cli/commands/chunk-backfill.js +157 -0
- package/dist/src/cli/commands/chunk-backfill.js.map +1 -0
- package/dist/src/cli/commands/cursor-probe.d.ts +20 -0
- package/dist/src/cli/commands/cursor-probe.d.ts.map +1 -0
- package/dist/src/cli/commands/cursor-probe.js +162 -0
- package/dist/src/cli/commands/cursor-probe.js.map +1 -0
- package/dist/src/cli/commands/menubar.d.ts +50 -0
- package/dist/src/cli/commands/menubar.d.ts.map +1 -1
- package/dist/src/cli/commands/menubar.js +224 -16
- package/dist/src/cli/commands/menubar.js.map +1 -1
- package/dist/src/cli/commands/onboard.d.ts +36 -7
- package/dist/src/cli/commands/onboard.d.ts.map +1 -1
- package/dist/src/cli/commands/onboard.js +256 -53
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +16 -0
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts +34 -1
- package/dist/src/cli/commands/update.d.ts.map +1 -1
- package/dist/src/cli/commands/update.js +179 -2
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/postinstall-menubar.d.ts.map +1 -1
- package/dist/src/cli/postinstall-menubar.js +14 -0
- package/dist/src/cli/postinstall-menubar.js.map +1 -1
- package/dist/src/cli/status/friend-header.d.ts +18 -0
- package/dist/src/cli/status/friend-header.d.ts.map +1 -1
- package/dist/src/cli/status/friend-header.js +137 -0
- package/dist/src/cli/status/friend-header.js.map +1 -1
- package/dist/src/cli/status/local-signals.d.ts +41 -0
- package/dist/src/cli/status/local-signals.d.ts.map +1 -1
- package/dist/src/cli/status/local-signals.js +48 -0
- package/dist/src/cli/status/local-signals.js.map +1 -1
- package/dist/src/config/schema.d.ts +220 -14
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +82 -7
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/diagnostics/claude-preflight.d.ts +34 -0
- package/dist/src/diagnostics/claude-preflight.d.ts.map +1 -0
- package/dist/src/diagnostics/claude-preflight.js +89 -0
- package/dist/src/diagnostics/claude-preflight.js.map +1 -0
- package/dist/src/diagnostics/codex-preflight.d.ts +1 -1
- package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
- package/dist/src/diagnostics/codex-preflight.js +14 -0
- package/dist/src/diagnostics/codex-preflight.js.map +1 -1
- package/dist/src/diagnostics/doctor.d.ts +9 -1
- package/dist/src/diagnostics/doctor.d.ts.map +1 -1
- package/dist/src/diagnostics/doctor.js +57 -2
- package/dist/src/diagnostics/doctor.js.map +1 -1
- package/dist/src/ingestion/chunk-meta.d.ts +85 -0
- package/dist/src/ingestion/chunk-meta.d.ts.map +1 -0
- package/dist/src/ingestion/chunk-meta.js +167 -0
- package/dist/src/ingestion/chunk-meta.js.map +1 -0
- package/dist/src/ingestion/chunk-text.d.ts +39 -0
- package/dist/src/ingestion/chunk-text.d.ts.map +1 -0
- package/dist/src/ingestion/chunk-text.js +114 -0
- package/dist/src/ingestion/chunk-text.js.map +1 -0
- package/dist/src/ingestion/cursor/cursor-store.d.ts +177 -0
- package/dist/src/ingestion/cursor/cursor-store.d.ts.map +1 -0
- package/dist/src/ingestion/cursor/cursor-store.js +243 -0
- package/dist/src/ingestion/cursor/cursor-store.js.map +1 -0
- package/dist/src/ingestion/cursor/enrich-roots.d.ts +16 -0
- package/dist/src/ingestion/cursor/enrich-roots.d.ts.map +1 -0
- package/dist/src/ingestion/cursor/enrich-roots.js +22 -0
- package/dist/src/ingestion/cursor/enrich-roots.js.map +1 -0
- package/dist/src/ingestion/cursor/vscdb-reader.d.ts +32 -0
- package/dist/src/ingestion/cursor/vscdb-reader.d.ts.map +1 -0
- package/dist/src/ingestion/cursor/vscdb-reader.js +113 -0
- package/dist/src/ingestion/cursor/vscdb-reader.js.map +1 -0
- package/dist/src/ingestion/cursor/workspace-root.d.ts +96 -0
- package/dist/src/ingestion/cursor/workspace-root.d.ts.map +1 -0
- package/dist/src/ingestion/cursor/workspace-root.js +187 -0
- package/dist/src/ingestion/cursor/workspace-root.js.map +1 -0
- package/dist/src/ingestion/indexer.d.ts.map +1 -1
- package/dist/src/ingestion/indexer.js +41 -32
- package/dist/src/ingestion/indexer.js.map +1 -1
- package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
- package/dist/src/jobs/handlers/compact.js +9 -4
- package/dist/src/jobs/handlers/compact.js.map +1 -1
- package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
- package/dist/src/jobs/handlers/ingest.js +60 -30
- package/dist/src/jobs/handlers/ingest.js.map +1 -1
- package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
- package/dist/src/jobs/handlers/reconcile.js +128 -45
- package/dist/src/jobs/handlers/reconcile.js.map +1 -1
- package/dist/src/jobs/handlers/save.d.ts.map +1 -1
- package/dist/src/jobs/handlers/save.js +122 -72
- package/dist/src/jobs/handlers/save.js.map +1 -1
- package/dist/src/jobs/types.d.ts +1 -1
- package/dist/src/main.js +26 -15
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +10 -3
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
- package/dist/src/mcp/tools/context-pack.js +7 -1
- package/dist/src/mcp/tools/context-pack.js.map +1 -1
- package/dist/src/mcp/tools/conversations-search.d.ts +1 -1
- package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -1
- package/dist/src/mcp/tools/conversations-search.js +7 -1
- package/dist/src/mcp/tools/conversations-search.js.map +1 -1
- package/dist/src/mcp/tools/evidence-feedback.d.ts +60 -0
- package/dist/src/mcp/tools/evidence-feedback.d.ts.map +1 -0
- package/dist/src/mcp/tools/evidence-feedback.js +62 -0
- package/dist/src/mcp/tools/evidence-feedback.js.map +1 -0
- package/dist/src/mcp/tools/log-outcome.d.ts +72 -0
- package/dist/src/mcp/tools/log-outcome.d.ts.map +1 -0
- package/dist/src/mcp/tools/log-outcome.js +59 -0
- package/dist/src/mcp/tools/log-outcome.js.map +1 -0
- package/dist/src/mcp/tools/open-evidence.d.ts +37 -0
- package/dist/src/mcp/tools/open-evidence.d.ts.map +1 -0
- package/dist/src/mcp/tools/open-evidence.js +72 -0
- package/dist/src/mcp/tools/open-evidence.js.map +1 -0
- package/dist/src/mcp/tools/save.d.ts +7 -2
- package/dist/src/mcp/tools/save.d.ts.map +1 -1
- package/dist/src/mcp/tools/save.js +7 -2
- package/dist/src/mcp/tools/save.js.map +1 -1
- package/dist/src/mcp/tools/search.d.ts.map +1 -1
- package/dist/src/mcp/tools/search.js +7 -1
- package/dist/src/mcp/tools/search.js.map +1 -1
- package/dist/src/observability/retrieval-feedback.d.ts +82 -0
- package/dist/src/observability/retrieval-feedback.d.ts.map +1 -0
- package/dist/src/observability/retrieval-feedback.js +231 -0
- package/dist/src/observability/retrieval-feedback.js.map +1 -0
- package/dist/src/observability/rift-context.d.ts.map +1 -1
- package/dist/src/observability/rift-context.js +3 -0
- package/dist/src/observability/rift-context.js.map +1 -1
- package/dist/src/observability/tool-usage-stats.d.ts +13 -0
- package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
- package/dist/src/observability/tool-usage-stats.js +15 -0
- package/dist/src/observability/tool-usage-stats.js.map +1 -1
- package/dist/src/observability/tool-usage.d.ts +56 -0
- package/dist/src/observability/tool-usage.d.ts.map +1 -1
- package/dist/src/observability/tool-usage.js +86 -0
- package/dist/src/observability/tool-usage.js.map +1 -1
- package/dist/src/providers/claude-cli-metadata-extraction.d.ts +47 -0
- package/dist/src/providers/claude-cli-metadata-extraction.d.ts.map +1 -0
- package/dist/src/providers/claude-cli-metadata-extraction.js +120 -0
- package/dist/src/providers/claude-cli-metadata-extraction.js.map +1 -0
- package/dist/src/providers/claude-cli-runner.d.ts +92 -0
- package/dist/src/providers/claude-cli-runner.d.ts.map +1 -0
- package/dist/src/providers/claude-cli-runner.js +598 -0
- package/dist/src/providers/claude-cli-runner.js.map +1 -0
- package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
- package/dist/src/providers/codex-cli-metadata-extraction.js +1 -40
- package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
- package/dist/src/providers/codex-cli-runner.d.ts +7 -0
- package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
- package/dist/src/providers/codex-cli-runner.js +131 -5
- package/dist/src/providers/codex-cli-runner.js.map +1 -1
- package/dist/src/providers/conversation-generation.d.ts +10 -0
- package/dist/src/providers/conversation-generation.d.ts.map +1 -1
- package/dist/src/providers/conversation-generation.js +54 -13
- package/dist/src/providers/conversation-generation.js.map +1 -1
- package/dist/src/providers/openai-metadata-extraction.d.ts +48 -1
- package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
- package/dist/src/providers/openai-metadata-extraction.js +51 -2
- package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
- package/dist/src/providers/types.d.ts +1 -1
- package/dist/src/providers/types.d.ts.map +1 -1
- package/dist/src/providers/types.js +4 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/retrieval/compact.d.ts +81 -0
- package/dist/src/retrieval/compact.d.ts.map +1 -1
- package/dist/src/retrieval/compact.js +248 -8
- package/dist/src/retrieval/compact.js.map +1 -1
- package/dist/src/retrieval/context-pack.d.ts.map +1 -1
- package/dist/src/retrieval/context-pack.js +28 -14
- package/dist/src/retrieval/context-pack.js.map +1 -1
- package/dist/src/retrieval/evidence-key.d.ts +48 -0
- package/dist/src/retrieval/evidence-key.d.ts.map +1 -0
- package/dist/src/retrieval/evidence-key.js +131 -0
- package/dist/src/retrieval/evidence-key.js.map +1 -0
- package/dist/src/retrieval/group-by-parent.d.ts +38 -0
- package/dist/src/retrieval/group-by-parent.d.ts.map +1 -0
- package/dist/src/retrieval/group-by-parent.js +40 -0
- package/dist/src/retrieval/group-by-parent.js.map +1 -0
- package/dist/src/retrieval/lexical.d.ts.map +1 -1
- package/dist/src/retrieval/lexical.js +1 -3
- package/dist/src/retrieval/lexical.js.map +1 -1
- package/dist/src/retrieval/receipt.d.ts +57 -0
- package/dist/src/retrieval/receipt.d.ts.map +1 -0
- package/dist/src/retrieval/receipt.js +119 -0
- package/dist/src/retrieval/receipt.js.map +1 -0
- package/dist/src/retrieval/reranker.d.ts +12 -2
- package/dist/src/retrieval/reranker.d.ts.map +1 -1
- package/dist/src/retrieval/reranker.js +11 -4
- package/dist/src/retrieval/reranker.js.map +1 -1
- package/dist/src/retrieval/stitch-chunks.d.ts +73 -0
- package/dist/src/retrieval/stitch-chunks.d.ts.map +1 -0
- package/dist/src/retrieval/stitch-chunks.js +106 -0
- package/dist/src/retrieval/stitch-chunks.js.map +1 -0
- package/dist/src/server/app.d.ts.map +1 -1
- package/dist/src/server/app.js +17 -1
- package/dist/src/server/app.js.map +1 -1
- package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
- package/dist/src/server/routes/conversations-search.js +12 -3
- package/dist/src/server/routes/conversations-search.js.map +1 -1
- package/dist/src/server/routes/friend-status.d.ts +44 -5
- package/dist/src/server/routes/friend-status.d.ts.map +1 -1
- package/dist/src/server/routes/friend-status.js +74 -6
- package/dist/src/server/routes/friend-status.js.map +1 -1
- package/dist/src/server/routes/mcp-usage.d.ts +9 -6
- package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
- package/dist/src/server/routes/mcp-usage.js.map +1 -1
- package/dist/src/server/routes/retrieval-feedback.d.ts +3 -0
- package/dist/src/server/routes/retrieval-feedback.d.ts.map +1 -0
- package/dist/src/server/routes/retrieval-feedback.js +290 -0
- package/dist/src/server/routes/retrieval-feedback.js.map +1 -0
- package/dist/src/server/routes/save.d.ts +3 -3
- package/dist/src/server/routes/save.d.ts.map +1 -1
- package/dist/src/server/routes/save.js +6 -2
- package/dist/src/server/routes/save.js.map +1 -1
- package/dist/src/server/routes/search.d.ts.map +1 -1
- package/dist/src/server/routes/search.js +19 -7
- package/dist/src/server/routes/search.js.map +1 -1
- package/dist/src/server/serving-marker.d.ts +85 -0
- package/dist/src/server/serving-marker.d.ts.map +1 -0
- package/dist/src/server/serving-marker.js +226 -0
- package/dist/src/server/serving-marker.js.map +1 -0
- package/dist/src/storage/chunk-backfill.d.ts +39 -0
- package/dist/src/storage/chunk-backfill.d.ts.map +1 -0
- package/dist/src/storage/chunk-backfill.js +295 -0
- package/dist/src/storage/chunk-backfill.js.map +1 -0
- package/dist/src/storage/filter.d.ts +42 -0
- package/dist/src/storage/filter.d.ts.map +1 -0
- package/dist/src/storage/filter.js +70 -0
- package/dist/src/storage/filter.js.map +1 -0
- package/dist/src/storage/rebuild.d.ts.map +1 -1
- package/dist/src/storage/rebuild.js +44 -27
- package/dist/src/storage/rebuild.js.map +1 -1
- package/dist/src/storage/tables.d.ts +41 -0
- package/dist/src/storage/tables.d.ts.map +1 -1
- package/dist/src/storage/tables.js +64 -1
- package/dist/src/storage/tables.js.map +1 -1
- package/operator/swiftbar/render-menu.py +57 -15
- package/package.json +5 -3
|
@@ -11,7 +11,10 @@ import { Command } from "commander";
|
|
|
11
11
|
import { createHttpClient, readToken, resolveBaseUrl, probeDaemonHealth, CliError, requireExistingConfigPath, } from "../http-client.js";
|
|
12
12
|
import { pollJob } from "../job-poller.js";
|
|
13
13
|
import { isJobFailure } from "../output.js";
|
|
14
|
-
import { runAutoCapture, resolveCodexCaptureDeps, } from "../../capture/auto-capture.js";
|
|
14
|
+
import { runAutoCapture, resolveCodexCaptureDeps, resolveCursorCaptureDeps, } from "../../capture/auto-capture.js";
|
|
15
|
+
import { CURSOR_CAPTURE_SOURCE } from "../../capture/sources.js";
|
|
16
|
+
import { resolveTriageProviderName, setConfiguredTriageProviderName, triageWorkerLabel, } from "../../capture/triage-provider-factory.js";
|
|
17
|
+
import { cursorCaptureEnabled, cursorCapturePersistEnabled, } from "../../capture/cursor-capture.js";
|
|
15
18
|
import { appendAutoCaptureRunRecord, buildAutoCaptureRunRecord, } from "../../capture/observability.js";
|
|
16
19
|
import { makeCaptureRecoverCommand } from "./capture-recover.js";
|
|
17
20
|
export function makeCaptureCommand() {
|
|
@@ -20,7 +23,8 @@ export function makeCaptureCommand() {
|
|
|
20
23
|
.option("--dry-run", "Triage only — don't save, review, or update state")
|
|
21
24
|
.option("--claude-dir <path>", "Claude config directory", undefined)
|
|
22
25
|
.option("--codex-dir <path>", "Codex config directory", undefined)
|
|
23
|
-
.option("--
|
|
26
|
+
.option("--cursor-dir <path>", "Cursor application-support directory", undefined)
|
|
27
|
+
.option("--source <source>", "Filter auto-capture to one source (claude_code|codex_cli|cursor_composer)", undefined)
|
|
24
28
|
.action(async (opts, cmd) => {
|
|
25
29
|
const globalOpts = cmd.optsWithGlobals();
|
|
26
30
|
try {
|
|
@@ -41,6 +45,13 @@ export function makeCaptureCommand() {
|
|
|
41
45
|
const configPath = requireExistingConfigPath(globalOpts);
|
|
42
46
|
const config = loadConfig(configPath);
|
|
43
47
|
const dataDir = config.data_paths.data_dir;
|
|
48
|
+
// Route this one-shot run's triage (preflight + per-session) through
|
|
49
|
+
// the configured worker, matching what the scheduled daemon would use.
|
|
50
|
+
const triageProviderName = resolveTriageProviderName(config);
|
|
51
|
+
setConfiguredTriageProviderName(triageProviderName);
|
|
52
|
+
// Worker name for honest egress copy — content is sent to whichever
|
|
53
|
+
// AI worker is configured (Codex CLI or Claude Code), not always Codex.
|
|
54
|
+
const triageWorker = triageWorkerLabel(triageProviderName);
|
|
44
55
|
// Voyage prerequisite gate — runs BEFORE the Codex model pin, the
|
|
45
56
|
// preflight probe, and any per-session triage. Capture is the
|
|
46
57
|
// off-device path: it reads parsed conversation content and sends it
|
|
@@ -63,15 +74,15 @@ export function makeCaptureCommand() {
|
|
|
63
74
|
if (!health.up) {
|
|
64
75
|
process.stderr.write("Error: capture saves through the Rift daemon, but it is unreachable.\n" +
|
|
65
76
|
" • Check it: rift doctor\n" +
|
|
66
|
-
|
|
77
|
+
` • Triage only: rift capture --dry-run (no save, content still goes to ${triageWorker})\n`);
|
|
67
78
|
process.exitCode = 1;
|
|
68
79
|
return;
|
|
69
80
|
}
|
|
70
81
|
if (!health.voyageKeyPresent) {
|
|
71
|
-
process.stderr.write(
|
|
82
|
+
process.stderr.write(`Error: capture sends your parsed conversation content to ${triageWorker} for triage, ` +
|
|
72
83
|
"and the daemon has no Voyage key loaded to save searchable results.\n" +
|
|
73
84
|
" • Add a key: rift onboard --reconfigure-voyage\n" +
|
|
74
|
-
|
|
85
|
+
` • Triage only: rift capture --dry-run (no save, content still goes to ${triageWorker})\n`);
|
|
75
86
|
process.exitCode = 1;
|
|
76
87
|
return;
|
|
77
88
|
}
|
|
@@ -83,26 +94,61 @@ export function makeCaptureCommand() {
|
|
|
83
94
|
configureCodexModel({ model: config.codex_cli?.model, dataDir });
|
|
84
95
|
const source = opts.source === undefined
|
|
85
96
|
? undefined
|
|
86
|
-
: opts.source === "claude_code" ||
|
|
97
|
+
: opts.source === "claude_code" ||
|
|
98
|
+
opts.source === "codex_cli" ||
|
|
99
|
+
opts.source === "cursor_composer"
|
|
87
100
|
? opts.source
|
|
88
101
|
: (() => {
|
|
89
|
-
throw new CliError("Invalid --source. Use claude_code or
|
|
102
|
+
throw new CliError("Invalid --source. Use claude_code, codex_cli, or cursor_composer.", "validation");
|
|
90
103
|
})();
|
|
104
|
+
// Native Cursor capture has two enablement paths: the config opt-in
|
|
105
|
+
// (cursor_composer in capture.sources — authorizes discovery + persist
|
|
106
|
+
// with no env flags) or the two env flags (the ad-hoc/dogfood path).
|
|
107
|
+
// Surface the exact state so the operator is never surprised by a run
|
|
108
|
+
// that found nothing or saved nothing. When config already schedules
|
|
109
|
+
// Cursor, neither env note applies.
|
|
110
|
+
const cursorScheduled = config.capture.sources.includes(CURSOR_CAPTURE_SOURCE);
|
|
111
|
+
if (source === "cursor_composer" &&
|
|
112
|
+
!cursorScheduled &&
|
|
113
|
+
!cursorCaptureEnabled()) {
|
|
114
|
+
// Not in config, env off: the Cursor store is never even read.
|
|
115
|
+
process.stderr.write("Note: native Cursor capture is off. Add cursor_composer to " +
|
|
116
|
+
"capture.sources to schedule it, or set RIFT_CURSOR_CAPTURE=1 for a " +
|
|
117
|
+
"one-off (saving then also requires CURSOR_CAPTURE_PERSIST=1).\n");
|
|
118
|
+
}
|
|
119
|
+
else if (source === "cursor_composer" &&
|
|
120
|
+
!cursorScheduled &&
|
|
121
|
+
!opts.dryRun &&
|
|
122
|
+
!cursorCapturePersistEnabled()) {
|
|
123
|
+
// Env discovery on, persistence off, not scheduled: triaged but
|
|
124
|
+
// deferred, never saved. Say so before the run so "0 saved" reads as
|
|
125
|
+
// expected, not broken.
|
|
126
|
+
process.stderr.write("Note: Cursor persistence is off — sessions will be triaged and DEFERRED, " +
|
|
127
|
+
"not saved. Set CURSOR_CAPTURE_PERSIST=1, or add cursor_composer to " +
|
|
128
|
+
"capture.sources to persist.\n");
|
|
129
|
+
}
|
|
91
130
|
// Be explicit that even a dry-run sends content off-device: it skips
|
|
92
|
-
// save/review/state but still triages each session via
|
|
93
|
-
// non-dry-run egress is already covered by the Voyage
|
|
94
|
-
// makes the dry-run transmission visible before it
|
|
131
|
+
// save/review/state but still triages each session via the configured
|
|
132
|
+
// AI worker. The non-dry-run egress is already covered by the Voyage
|
|
133
|
+
// gate above; this makes the dry-run transmission visible before it
|
|
134
|
+
// happens, not after.
|
|
95
135
|
if (opts.dryRun && !globalOpts.json) {
|
|
96
|
-
|
|
136
|
+
const worker = triageWorkerLabel(resolveTriageProviderName(config));
|
|
137
|
+
process.stderr.write(`Dry-run: triaging via ${worker} (conversation content is sent to ${worker}); nothing will be saved.\n`);
|
|
97
138
|
}
|
|
98
139
|
const startedAt = new Date();
|
|
99
140
|
const report = await runAutoCapture({
|
|
100
141
|
dataDir,
|
|
101
142
|
claudeDir: opts.claudeDir,
|
|
102
143
|
codexDir: opts.codexDir,
|
|
144
|
+
cursorDir: opts.cursorDir,
|
|
103
145
|
dryRun: opts.dryRun ?? false,
|
|
104
146
|
...(source ? { sources: [source] } : {}),
|
|
147
|
+
// Config membership is the Cursor opt-in: a manual run honors it too,
|
|
148
|
+
// so `rift capture` is consistent with the scheduled daemon.
|
|
149
|
+
cursorConfigEnabled: cursorScheduled,
|
|
105
150
|
...resolveCodexCaptureDeps(config),
|
|
151
|
+
...resolveCursorCaptureDeps(config),
|
|
106
152
|
saveFn: async (saveOpts) => {
|
|
107
153
|
if (!client) {
|
|
108
154
|
throw new Error("No HTTP client (dry-run mode)");
|
|
@@ -164,15 +210,21 @@ export function makeCaptureCommand() {
|
|
|
164
210
|
` Saved: ${report.saved}\n` +
|
|
165
211
|
` Review: ${report.review}\n` +
|
|
166
212
|
` Discarded: ${report.discarded}\n` +
|
|
213
|
+
(report.deferred > 0
|
|
214
|
+
? ` Deferred: ${report.deferred} (triaged but persistence gated off)\n`
|
|
215
|
+
: "") +
|
|
216
|
+
(report.bootstrapped > 0
|
|
217
|
+
? ` Bootstrapped:${report.bootstrapped} (existing sessions watermarked, not imported)\n`
|
|
218
|
+
: "") +
|
|
167
219
|
` Quarantined: ${report.quarantined}\n` +
|
|
168
220
|
` Errors: ${report.errors}\n`);
|
|
169
|
-
// A preflight (
|
|
170
|
-
// error, so `Errors: 0` above can read green while triage
|
|
171
|
-
// actually degraded or skipped. Surface it explicitly — otherwise
|
|
172
|
-
// hard auth/path failure looks like a clean run. (Mirrored in the
|
|
221
|
+
// A preflight (triage-worker health-probe) failure is NOT a
|
|
222
|
+
// per-session error, so `Errors: 0` above can read green while triage
|
|
223
|
+
// was actually degraded or skipped. Surface it explicitly — otherwise
|
|
224
|
+
// a hard auth/path failure looks like a clean run. (Mirrored in the
|
|
173
225
|
// exit code below.)
|
|
174
226
|
if (!report.preflight_ok) {
|
|
175
|
-
process.stderr.write(`\n ⚠
|
|
227
|
+
process.stderr.write(`\n ⚠ ${triageWorker} preflight FAILED — triage was degraded or skipped.\n` +
|
|
176
228
|
(report.preflight_error
|
|
177
229
|
? ` ${report.preflight_error}\n`
|
|
178
230
|
: ""));
|
|
@@ -185,7 +237,10 @@ export function makeCaptureCommand() {
|
|
|
185
237
|
: r.decision === "review"
|
|
186
238
|
? "?"
|
|
187
239
|
: "-";
|
|
188
|
-
|
|
240
|
+
const rootTag = r.projectRootStatus
|
|
241
|
+
? ` [root: ${r.projectRootStatus}]`
|
|
242
|
+
: "";
|
|
243
|
+
process.stdout.write(` [${icon}] ${r.decision.padEnd(7)} (${r.model}, ${(r.confidence * 100).toFixed(0)}%) ${r.title.slice(0, 60)}${rootTag}\n`);
|
|
189
244
|
}
|
|
190
245
|
}
|
|
191
246
|
if (report.error_details.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,uBAAuB,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Owner-only, offline historical conversation chunk backfill.
|
|
4
|
+
*
|
|
5
|
+
* Re-chunks conversations that were indexed before `RIFT_CHUNKING` was on, from
|
|
6
|
+
* their raw artifacts, into chunk sets — so the owner can dogfood retrieval over a
|
|
7
|
+
* fully-chunked corpus and gather OFF-vs-ON eval evidence before any product
|
|
8
|
+
* default flip. Deliberately crude: explicit, offline (daemon must be stopped, so
|
|
9
|
+
* there is a single LanceDB writer), `--dry-run`-able, throttleable, and Ctrl-C
|
|
10
|
+
* safe. NOT the productized resumable beta-user migration.
|
|
11
|
+
*/
|
|
12
|
+
export declare function makeChunkBackfillCommand(): Command;
|
|
13
|
+
//# sourceMappingURL=chunk-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-backfill.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/chunk-backfill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAoJlD"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { CliError, requireExistingConfigPath, resolveBaseUrl, } from "../http-client.js";
|
|
4
|
+
import { printError, printJson, printText } from "../output.js";
|
|
5
|
+
import { loadConfig } from "../../config/loader.js";
|
|
6
|
+
import { VoyageEmbeddingProvider } from "../../providers/voyage.js";
|
|
7
|
+
import { PlaceholderEmbeddingProvider } from "../../providers/placeholder-embed.js";
|
|
8
|
+
import { initTables, openTablesReadOnly } from "../../storage/tables.js";
|
|
9
|
+
import { backfillConversationChunks, } from "../../storage/chunk-backfill.js";
|
|
10
|
+
import { assertChunkBackfillWriteCompatible } from "../../server/serving-marker.js";
|
|
11
|
+
import { probeDaemon } from "./rebuild.js";
|
|
12
|
+
/**
|
|
13
|
+
* Owner-only, offline historical conversation chunk backfill.
|
|
14
|
+
*
|
|
15
|
+
* Re-chunks conversations that were indexed before `RIFT_CHUNKING` was on, from
|
|
16
|
+
* their raw artifacts, into chunk sets — so the owner can dogfood retrieval over a
|
|
17
|
+
* fully-chunked corpus and gather OFF-vs-ON eval evidence before any product
|
|
18
|
+
* default flip. Deliberately crude: explicit, offline (daemon must be stopped, so
|
|
19
|
+
* there is a single LanceDB writer), `--dry-run`-able, throttleable, and Ctrl-C
|
|
20
|
+
* safe. NOT the productized resumable beta-user migration.
|
|
21
|
+
*/
|
|
22
|
+
export function makeChunkBackfillCommand() {
|
|
23
|
+
return new Command("chunk-backfill")
|
|
24
|
+
.description("Owner-only: re-chunk historical conversations from raw (offline; daemon must be stopped)")
|
|
25
|
+
.option("--dry-run", "Report what would change without embedding or writing", false)
|
|
26
|
+
.option("--limit <n>", "Stop after re-chunking this many conversations", (v) => parseInt(v, 10))
|
|
27
|
+
.option("--throttle-ms <ms>", "Sleep between conversations (ms)", (v) => parseInt(v, 10))
|
|
28
|
+
.option("--allow-uncertified-copy", "Override the serving-build compatibility guard for a DISPOSABLE COPY of a data dir (never the live serving dir)", false)
|
|
29
|
+
.action(async (opts, cmd) => {
|
|
30
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
31
|
+
try {
|
|
32
|
+
// 1. Daemon MUST be stopped — offline single-writer, same precondition
|
|
33
|
+
// as `rift rebuild --offline`.
|
|
34
|
+
const baseUrl = resolveBaseUrl(globalOpts.config);
|
|
35
|
+
const probe = await probeDaemon(baseUrl);
|
|
36
|
+
if (probe.state !== "stopped") {
|
|
37
|
+
printError(probe.reason ||
|
|
38
|
+
"Daemon must be stopped before chunk-backfill (run: rift stop).");
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// 2. Config + embedding key. Dry-run reports blast radius without
|
|
43
|
+
// embedding or writing, so it must NOT require a key — only the real
|
|
44
|
+
// run, which embeds via the cloud provider, does. Parse dryRun first
|
|
45
|
+
// and skip both the key check and provider construction for it.
|
|
46
|
+
const dryRun = opts.dryRun === true;
|
|
47
|
+
const configPath = requireExistingConfigPath(globalOpts);
|
|
48
|
+
const config = loadConfig(configPath);
|
|
49
|
+
const dataDir = config.data_paths.data_dir;
|
|
50
|
+
let embedding;
|
|
51
|
+
if (dryRun) {
|
|
52
|
+
// Never embeds (the dry-run path returns before any embed call), so a
|
|
53
|
+
// placeholder satisfies the option type without needing a real key.
|
|
54
|
+
embedding = new PlaceholderEmbeddingProvider();
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// 2a. Compatibility guard (WRITE mode only). A chunk-column write must
|
|
58
|
+
// never land on a dir whose serving install cannot serve chunk
|
|
59
|
+
// rows. The daemon is stopped here, so we cannot probe /version;
|
|
60
|
+
// instead we read the capability marker the serving daemon stamps
|
|
61
|
+
// on boot. Absent/incompatible/STALE → refuse (a pre-chunk daemon
|
|
62
|
+
// never writes the marker; a stale one only proves an OLD chunk-aware
|
|
63
|
+
// boot, not the current install). This keeps the write guard truthful,
|
|
64
|
+
// so (re)boot the chunk-aware daemon right before backfilling.
|
|
65
|
+
//
|
|
66
|
+
// Escape hatch: --allow-uncertified-copy lets the owner override
|
|
67
|
+
// the guard for a DISPOSABLE COPY (e.g. running OFF-vs-ON eval on a
|
|
68
|
+
// copied corpus) without first booting a chunk-aware daemon on it.
|
|
69
|
+
// The live beta.21 dir has no marker, so it stays blocked by
|
|
70
|
+
// default; only an explicit flag + loud warning proceeds, and the
|
|
71
|
+
// owner asserts this is a copy, not the serving dir.
|
|
72
|
+
const verdict = assertChunkBackfillWriteCompatible(dataDir);
|
|
73
|
+
if (!verdict.ok) {
|
|
74
|
+
if (opts.allowUncertifiedCopy === true) {
|
|
75
|
+
process.stderr.write(`WARNING: ${verdict.reason}\n` +
|
|
76
|
+
`Proceeding anyway because --allow-uncertified-copy was set. ` +
|
|
77
|
+
`This MUST be a disposable COPY of a data dir — NEVER your live ` +
|
|
78
|
+
`serving dir. A chunk-column write against a dir served by a ` +
|
|
79
|
+
`pre-chunk daemon will break that daemon's writes.\n`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
printError(verdict.reason);
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const voyageApiKey = process.env.VOYAGE_API_KEY;
|
|
88
|
+
if (!voyageApiKey) {
|
|
89
|
+
printError("VOYAGE_API_KEY environment variable required for chunk-backfill");
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
embedding = new VoyageEmbeddingProvider({
|
|
94
|
+
apiKey: voyageApiKey,
|
|
95
|
+
model: config.embedding.model,
|
|
96
|
+
cachePath: path.join(config.data_paths.data_dir, "embeddings"),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Open storage. Dry-run uses a READ-ONLY open that never creates or
|
|
100
|
+
// migrates tables, so a recon run cannot mutate the live schema (the P1
|
|
101
|
+
// this command previously caused). Write mode initializes/migrates as
|
|
102
|
+
// needed — gated by the compatibility guard above.
|
|
103
|
+
if (dryRun) {
|
|
104
|
+
await openTablesReadOnly(dataDir, {
|
|
105
|
+
require: ["conversations_hot", "conversations_cold"],
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
await initTables(dataDir);
|
|
110
|
+
}
|
|
111
|
+
// 3. Ctrl-C → cooperative abort: the in-flight conversation's atomic
|
|
112
|
+
// write finishes, then the run stops cleanly (no half-written set).
|
|
113
|
+
const controller = new AbortController();
|
|
114
|
+
const onSigint = () => {
|
|
115
|
+
process.stderr.write("\nCtrl-C received — finishing the current conversation, then stopping...\n");
|
|
116
|
+
controller.abort();
|
|
117
|
+
};
|
|
118
|
+
process.once("SIGINT", onSigint);
|
|
119
|
+
if (dryRun)
|
|
120
|
+
process.stderr.write("Dry run — no embeddings or writes.\n");
|
|
121
|
+
let summary;
|
|
122
|
+
try {
|
|
123
|
+
summary = await backfillConversationChunks({
|
|
124
|
+
embedding,
|
|
125
|
+
dataDir,
|
|
126
|
+
dryRun,
|
|
127
|
+
...(typeof opts.limit === "number" && !Number.isNaN(opts.limit)
|
|
128
|
+
? { limit: opts.limit }
|
|
129
|
+
: {}),
|
|
130
|
+
...(typeof opts.throttleMs === "number" && !Number.isNaN(opts.throttleMs)
|
|
131
|
+
? { throttleMs: opts.throttleMs }
|
|
132
|
+
: {}),
|
|
133
|
+
signal: controller.signal,
|
|
134
|
+
log: (msg) => process.stderr.write(`${msg}\n`),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
process.removeListener("SIGINT", onSigint);
|
|
139
|
+
}
|
|
140
|
+
if (globalOpts.json) {
|
|
141
|
+
printJson(summary);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const verb = dryRun ? "would re-chunk" : "re-chunked";
|
|
145
|
+
printText(`Chunk backfill ${summary.aborted ? "aborted" : "complete"}: ` +
|
|
146
|
+
`${verb} ${summary.rechunked}, already chunked ${summary.alreadyChunked}, ` +
|
|
147
|
+
`single-row ${summary.singleChunk}, orphaned ${summary.orphaned}, ` +
|
|
148
|
+
`errored ${summary.errored} (scanned ${summary.scanned}).`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
printError(err instanceof CliError ? err.message : err instanceof Error ? err.message : String(err));
|
|
153
|
+
process.exitCode = 1;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=chunk-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-backfill.js","sourceRoot":"","sources":["../../../../src/cli/commands/chunk-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rift cursor-probe` — read-only discovery probe for native Cursor sessions.
|
|
3
|
+
*
|
|
4
|
+
* DISCOVERY SLICE ONLY. This command answers "what would Cursor auto-capture
|
|
5
|
+
* see?" without capturing anything. It:
|
|
6
|
+
* - reads Cursor's state.vscdb READ-ONLY (immutable, SELECT-only),
|
|
7
|
+
* - never contacts the daemon, never writes LanceDB, never touches capture
|
|
8
|
+
* state, never bumps versions,
|
|
9
|
+
* - by default surfaces metadata only (ids, modes, models, timestamps,
|
|
10
|
+
* turn counts) — NOT message text.
|
|
11
|
+
*
|
|
12
|
+
* It is intentionally NOT wired into `rift capture` / scheduled capture. That
|
|
13
|
+
* wiring is a separate, gated slice (see docs/cursor-capture-discovery.md).
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* rift cursor-probe [--dir <Cursor app dir>] [--json] [--show-provenance]
|
|
17
|
+
*/
|
|
18
|
+
import { Command } from "commander";
|
|
19
|
+
export declare function makeCursorProbeCommand(): Command;
|
|
20
|
+
//# sourceMappingURL=cursor-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-probe.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cursor-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDpC,wBAAgB,sBAAsB,IAAI,OAAO,CAoIhD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rift cursor-probe` — read-only discovery probe for native Cursor sessions.
|
|
3
|
+
*
|
|
4
|
+
* DISCOVERY SLICE ONLY. This command answers "what would Cursor auto-capture
|
|
5
|
+
* see?" without capturing anything. It:
|
|
6
|
+
* - reads Cursor's state.vscdb READ-ONLY (immutable, SELECT-only),
|
|
7
|
+
* - never contacts the daemon, never writes LanceDB, never touches capture
|
|
8
|
+
* state, never bumps versions,
|
|
9
|
+
* - by default surfaces metadata only (ids, modes, models, timestamps,
|
|
10
|
+
* turn counts) — NOT message text.
|
|
11
|
+
*
|
|
12
|
+
* It is intentionally NOT wired into `rift capture` / scheduled capture. That
|
|
13
|
+
* wiring is a separate, gated slice (see docs/cursor-capture-discovery.md).
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* rift cursor-probe [--dir <Cursor app dir>] [--json] [--show-provenance]
|
|
17
|
+
*/
|
|
18
|
+
import { Command } from "commander";
|
|
19
|
+
import { printError, printJson, printText } from "../output.js";
|
|
20
|
+
import { discoverCursorComposerSessions, proposeCursorProvenance, } from "../../ingestion/cursor/cursor-store.js";
|
|
21
|
+
import { CursorReaderError, defaultCursorDir, globalStatePath, readCursorGlobalState, } from "../../ingestion/cursor/vscdb-reader.js";
|
|
22
|
+
import { enrichCursorProjectRoots } from "../../ingestion/cursor/enrich-roots.js";
|
|
23
|
+
function summarize(candidates) {
|
|
24
|
+
const byBackend = {};
|
|
25
|
+
const byMode = {};
|
|
26
|
+
const byRootStatus = {};
|
|
27
|
+
let drafts = 0;
|
|
28
|
+
let empty = 0;
|
|
29
|
+
for (const c of candidates) {
|
|
30
|
+
byBackend[c.backend] = (byBackend[c.backend] ?? 0) + 1;
|
|
31
|
+
const mode = c.mode ?? "unknown";
|
|
32
|
+
byMode[mode] = (byMode[mode] ?? 0) + 1;
|
|
33
|
+
byRootStatus[c.projectRootStatus] = (byRootStatus[c.projectRootStatus] ?? 0) + 1;
|
|
34
|
+
if (c.isDraft)
|
|
35
|
+
drafts += 1;
|
|
36
|
+
if (c.turnCount === 0)
|
|
37
|
+
empty += 1;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
total: candidates.length,
|
|
41
|
+
captureable: candidates.filter((c) => !c.isDraft && c.turnCount > 0).length,
|
|
42
|
+
project_attributable: candidates.filter((c) => c.projectRoot !== null).length,
|
|
43
|
+
drafts,
|
|
44
|
+
empty,
|
|
45
|
+
by_backend: byBackend,
|
|
46
|
+
by_mode: byMode,
|
|
47
|
+
by_root_status: byRootStatus,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function pad(value, width) {
|
|
51
|
+
return value.length >= width ? value : value + " ".repeat(width - value.length);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A Cursor session title is user-authored and frequently a mini-summary of the
|
|
55
|
+
* private conversation — NOT harmless metadata. So it is redacted by default and
|
|
56
|
+
* only shown with an explicit `--show-titles` opt-in for local inspection.
|
|
57
|
+
*/
|
|
58
|
+
function displayTitle(name, showTitles) {
|
|
59
|
+
if (name === null)
|
|
60
|
+
return "(untitled)";
|
|
61
|
+
return showTitles ? name : "(title hidden — use --show-titles)";
|
|
62
|
+
}
|
|
63
|
+
export function makeCursorProbeCommand() {
|
|
64
|
+
return new Command("cursor-probe")
|
|
65
|
+
.description("Read-only discovery of native Cursor composer/chat sessions (no capture)")
|
|
66
|
+
.option("--dir <path>", "Cursor application-support dir", undefined)
|
|
67
|
+
.option("--show-provenance", "Include the proposed per-session provenance row model", false)
|
|
68
|
+
.option("--show-titles", "Reveal session titles (user-authored; may summarize private content)", false)
|
|
69
|
+
.action(async (opts, cmd) => {
|
|
70
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
71
|
+
try {
|
|
72
|
+
const cursorDir = opts.dir ?? defaultCursorDir();
|
|
73
|
+
const { dbPath, rows } = readCursorGlobalState({ cursorDir: opts.dir });
|
|
74
|
+
const candidates = enrichCursorProjectRoots(discoverCursorComposerSessions(rows), cursorDir);
|
|
75
|
+
const summary = summarize(candidates);
|
|
76
|
+
if (globalOpts.json) {
|
|
77
|
+
// Redact the user-authored title by default; keep a boolean so the
|
|
78
|
+
// report still conveys whether a session was named.
|
|
79
|
+
const redact = (c) => {
|
|
80
|
+
const { name, ...rest } = c;
|
|
81
|
+
return opts.showTitles
|
|
82
|
+
? { ...rest, name, has_title: name !== null }
|
|
83
|
+
: { ...rest, name: null, has_title: name !== null };
|
|
84
|
+
};
|
|
85
|
+
printJson({
|
|
86
|
+
db_path: dbPath,
|
|
87
|
+
read_only: true,
|
|
88
|
+
titles_redacted: !opts.showTitles,
|
|
89
|
+
summary,
|
|
90
|
+
sessions: opts.showProvenance
|
|
91
|
+
? candidates.map((c) => ({
|
|
92
|
+
...redact(c),
|
|
93
|
+
proposed_provenance: proposeCursorProvenance(c),
|
|
94
|
+
}))
|
|
95
|
+
: candidates.map(redact),
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (candidates.length === 0) {
|
|
100
|
+
printText(`No native Cursor sessions found in:\n ${dbPath}\n` +
|
|
101
|
+
"(Cursor stores Claude Code / Codex CLI sessions elsewhere — " +
|
|
102
|
+
"those are captured via ~/.claude and ~/.codex.)");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const lines = [];
|
|
106
|
+
lines.push(`Cursor store (read-only): ${dbPath}`);
|
|
107
|
+
lines.push(`Sessions: ${summary.total} ` +
|
|
108
|
+
`captureable: ${summary.captureable} ` +
|
|
109
|
+
`drafts: ${summary.drafts} empty: ${summary.empty}`);
|
|
110
|
+
lines.push(`By backend: ${Object.entries(summary.by_backend)
|
|
111
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
112
|
+
.join(" ")}`);
|
|
113
|
+
lines.push(`By mode: ${Object.entries(summary.by_mode)
|
|
114
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
115
|
+
.join(" ")}`);
|
|
116
|
+
lines.push(`Project roots: attributable=${summary.project_attributable} ` +
|
|
117
|
+
Object.entries(summary.by_root_status)
|
|
118
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
119
|
+
.join(" "));
|
|
120
|
+
if (!opts.showTitles) {
|
|
121
|
+
lines.push("(titles redacted — pass --show-titles to reveal)");
|
|
122
|
+
}
|
|
123
|
+
lines.push("");
|
|
124
|
+
lines.push(`${pad("updated", 25)} ${pad("mode", 6)} ${pad("backend", 13)} ` +
|
|
125
|
+
`${pad("turns", 5)} ${pad("model", 14)} ${pad("project root", 34)} title`);
|
|
126
|
+
for (const c of candidates) {
|
|
127
|
+
const flag = c.isDraft ? " (draft)" : "";
|
|
128
|
+
const root = c.projectRoot ?? `— (${c.projectRootStatus})`;
|
|
129
|
+
lines.push(`${pad(c.updatedAt ?? c.createdAt ?? "—", 25)} ` +
|
|
130
|
+
`${pad(c.mode ?? "—", 6)} ${pad(c.backend, 13)} ` +
|
|
131
|
+
`${pad(String(c.turnCount), 5)} ${pad(c.modelName ?? "—", 14)} ` +
|
|
132
|
+
`${pad(root, 34)} ${displayTitle(c.name, opts.showTitles)}${flag}`);
|
|
133
|
+
}
|
|
134
|
+
if (opts.showProvenance && candidates[0]) {
|
|
135
|
+
lines.push("");
|
|
136
|
+
lines.push("Proposed provenance row (example, first session):");
|
|
137
|
+
lines.push(JSON.stringify(proposeCursorProvenance(candidates[0]), null, 2));
|
|
138
|
+
}
|
|
139
|
+
printText(lines.join("\n"));
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (err instanceof CursorReaderError) {
|
|
143
|
+
if (err.code === "db_missing") {
|
|
144
|
+
printError(`${err.message}\nIs Cursor installed for this user? ` +
|
|
145
|
+
`Expected: ${globalStatePath(opts.dir ?? "<Cursor dir>")}`);
|
|
146
|
+
}
|
|
147
|
+
else if (err.code === "sqlite_missing") {
|
|
148
|
+
printError(`${err.message}\nOn macOS sqlite3 ships at /usr/bin/sqlite3; ` +
|
|
149
|
+
"check your PATH.");
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
printError(err.message);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
printError(err instanceof Error ? err.message : String(err));
|
|
157
|
+
}
|
|
158
|
+
process.exitCode = 1;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=cursor-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-probe.js","sourceRoot":"","sources":["../../../../src/cli/commands/cursor-probe.ts"],"names":[],"mappings":"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"}
|