@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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export function classifyClaudePreflightError(error) {
|
|
2
|
+
if (!error || error.trim().length === 0) {
|
|
3
|
+
return "unknown";
|
|
4
|
+
}
|
|
5
|
+
const text = error.toLowerCase();
|
|
6
|
+
// Structural install problems first — they are the most actionable and their
|
|
7
|
+
// wording is distinctive. Note the "No compatible … found" aggregate is NOT
|
|
8
|
+
// "missing" (a `claude` exists, it just failed the probe); it carries the
|
|
9
|
+
// specific per-candidate reasons matched below (e.g. `--safe-mode`, wrapper).
|
|
10
|
+
if (/was not found on path|was not found in|claude.*was not found/.test(text)) {
|
|
11
|
+
return "missing";
|
|
12
|
+
}
|
|
13
|
+
if (/--safe-mode|too old\/incompatible|too old for headless|\bincompatible\b|flag\/contract error|unknown option|unknown argument|invalid option|unrecognized option/.test(text)) {
|
|
14
|
+
return "incompatible";
|
|
15
|
+
}
|
|
16
|
+
// Auth BEFORE wrapper: a recorded reason can carry both signals — e.g. a legacy
|
|
17
|
+
// row (or any future caller) whose text says "authentication failed … likely a
|
|
18
|
+
// wrapper/PTY shim". Auth is the more specific, more actionable cause, so it
|
|
19
|
+
// wins the tie; a genuine wrapper failure carries no auth wording and still
|
|
20
|
+
// falls through to `wrapper` below. (The runner now also emits a precise,
|
|
21
|
+
// non-conflated reason — see claude-cli-runner.ts — so new rows rarely carry
|
|
22
|
+
// both; this ordering hardens the legacy/ambiguous path.)
|
|
23
|
+
if (/authentication failed|not (logged|signed) in|\bunauthorized\b|\b401\b|please (run|sign|log).{0,12}(login|in)|login (has )?expired|credentials? (expired|invalid)|sign in/.test(text)) {
|
|
24
|
+
return "auth";
|
|
25
|
+
}
|
|
26
|
+
if (/could not run headless|wrapper\/pty shim|pty shim|input must be provided|when using --print|not a tty|raw mode is not supported/.test(text)) {
|
|
27
|
+
return "wrapper";
|
|
28
|
+
}
|
|
29
|
+
if (/rate limit|\b429\b|too many requests|usage limit|\bquota\b|out of credits|insufficient (credit|quota|balance)/.test(text)) {
|
|
30
|
+
return "rate_limit";
|
|
31
|
+
}
|
|
32
|
+
if (/network error|econnreset|econnrefused|enotfound|etimedout|getaddrinfo|connection (refused|reset)|failed to (connect|reach)|\bnetwork\b|http 5\d\d|socket hang up/.test(text)) {
|
|
33
|
+
return "network";
|
|
34
|
+
}
|
|
35
|
+
if (/timed out|\btimeout\b/.test(text)) {
|
|
36
|
+
return "timeout";
|
|
37
|
+
}
|
|
38
|
+
return "unknown";
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A short, leak-free, human summary for a class. Deliberately canned (no raw
|
|
42
|
+
* stderr, no file paths, no prompt/session content) so SwiftBar/doctor can
|
|
43
|
+
* surface it without parsing or redacting raw `claude` output.
|
|
44
|
+
*/
|
|
45
|
+
export function summarizeClaudePreflightClass(cls) {
|
|
46
|
+
switch (cls) {
|
|
47
|
+
case "missing":
|
|
48
|
+
return "Claude Code CLI (`claude`) was not found.";
|
|
49
|
+
case "incompatible":
|
|
50
|
+
return "Claude Code CLI is too old for headless triage (it needs `--safe-mode`).";
|
|
51
|
+
case "wrapper":
|
|
52
|
+
return "A PATH wrapper is intercepting `claude` and cannot run it headlessly.";
|
|
53
|
+
case "auth":
|
|
54
|
+
return "Claude Code login appears to have expired.";
|
|
55
|
+
case "rate_limit":
|
|
56
|
+
return "Claude hit a rate or usage limit — usually transient.";
|
|
57
|
+
case "network":
|
|
58
|
+
return "Claude could not reach its backend (network/transport).";
|
|
59
|
+
case "timeout":
|
|
60
|
+
return "Claude probe timed out — often a transient hiccup.";
|
|
61
|
+
case "unknown":
|
|
62
|
+
return "Claude preflight failed for an unrecognized reason.";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The single concrete remedy for a class — shown as the doctor `nextAction` and
|
|
67
|
+
* the status `Next:` line. Claude-shaped (never "codex login"), and it always
|
|
68
|
+
* ends by pointing back at `rift capture` so the user can re-verify.
|
|
69
|
+
*/
|
|
70
|
+
export function claudePreflightNextAction(cls) {
|
|
71
|
+
switch (cls) {
|
|
72
|
+
case "missing":
|
|
73
|
+
return "Install Claude Code, or set RIFT_CLAUDE_CLI_PATH to your `claude`, then run: rift capture";
|
|
74
|
+
case "incompatible":
|
|
75
|
+
return "Upgrade Claude Code so it supports --safe-mode (or set RIFT_CLAUDE_CLI_PATH to a newer claude), then run: rift capture";
|
|
76
|
+
case "wrapper":
|
|
77
|
+
return "Set RIFT_CLAUDE_CLI_PATH to the real claude binary (a wrapper is intercepting it), then run: rift capture";
|
|
78
|
+
case "auth":
|
|
79
|
+
return "Sign back in: run claude and log in, then run: rift capture";
|
|
80
|
+
case "rate_limit":
|
|
81
|
+
return "Wait for the limit to reset, then run: rift capture";
|
|
82
|
+
case "network":
|
|
83
|
+
return "Check your network connection, then run: rift capture";
|
|
84
|
+
case "timeout":
|
|
85
|
+
case "unknown":
|
|
86
|
+
return "Re-run: rift capture";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=claude-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-preflight.js","sourceRoot":"","sources":["../../../src/diagnostics/claude-preflight.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,4BAA4B,CAC1C,KAAgC;IAEhC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEjC,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,8EAA8E;IAC9E,IAAI,8DAA8D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,iKAAiK,CAAC,IAAI,CACpK,IAAI,CACL,EACD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,0DAA0D;IAC1D,IACE,0KAA0K,CAAC,IAAI,CAC7K,IAAI,CACL,EACD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IACE,iIAAiI,CAAC,IAAI,CACpI,IAAI,CACL,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,+GAA+G,CAAC,IAAI,CAClH,IAAI,CACL,EACD,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IACE,kKAAkK,CAAC,IAAI,CACrK,IAAI,CACL,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,GAA8B;IAE9B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,2CAA2C,CAAC;QACrD,KAAK,cAAc;YACjB,OAAO,0EAA0E,CAAC;QACpF,KAAK,SAAS;YACZ,OAAO,uEAAuE,CAAC;QACjF,KAAK,MAAM;YACT,OAAO,4CAA4C,CAAC;QACtD,KAAK,YAAY;YACf,OAAO,uDAAuD,CAAC;QACjE,KAAK,SAAS;YACZ,OAAO,yDAAyD,CAAC;QACnE,KAAK,SAAS;YACZ,OAAO,oDAAoD,CAAC;QAC9D,KAAK,SAAS;YACZ,OAAO,qDAAqD,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,GAA8B;IAE9B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,2FAA2F,CAAC;QACrG,KAAK,cAAc;YACjB,OAAO,wHAAwH,CAAC;QAClI,KAAK,SAAS;YACZ,OAAO,2GAA2G,CAAC;QACrH,KAAK,MAAM;YACT,OAAO,6DAA6D,CAAC;QACvE,KAAK,YAAY;YACf,OAAO,qDAAqD,CAAC;QAC/D,KAAK,SAAS;YACZ,OAAO,uDAAuD,CAAC;QACjE,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,sBAAsB,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* transport lines, and anything ambiguous falls to a non-auth bucket — we
|
|
18
18
|
* never falsely tell the user their login expired.
|
|
19
19
|
*/
|
|
20
|
-
export type CodexPreflightErrorClass = "auth" | "model" | "binary" | "timeout" | "backend" | "unknown";
|
|
20
|
+
export type CodexPreflightErrorClass = "auth" | "model" | "cli_incompatible" | "binary" | "timeout" | "backend" | "unknown";
|
|
21
21
|
export declare function classifyCodexPreflightError(error: string | null | undefined): CodexPreflightErrorClass;
|
|
22
22
|
/**
|
|
23
23
|
* Best-effort model name from the codex banner (`model: <name>`), for display
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-preflight.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/codex-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,wBAAwB,GAChC,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAOd,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,wBAAwB,
|
|
1
|
+
{"version":3,"file":"codex-preflight.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/codex-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,wBAAwB,GAChC,MAAM,GACN,OAAO,GACP,kBAAkB,GAClB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAOd,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,wBAAwB,CAuE1B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAMf;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,MAAM,CAmBR"}
|
|
@@ -16,6 +16,18 @@ export function classifyCodexPreflightError(error) {
|
|
|
16
16
|
if (/\bunsupported model\b|\bunknown model\b|\bmodel_not_found\b|no working codex model|model[^\n]*\bnot (found|supported|available)\b|does not support the model|invalid model/.test(codexText)) {
|
|
17
17
|
return "model";
|
|
18
18
|
}
|
|
19
|
+
// CLI too old / incompatible: the executable launched fine but rejected an
|
|
20
|
+
// argument we depend on. The canonical signal is a Codex predating
|
|
21
|
+
// `--output-schema` (added after 0.39) — clap exits 2 with
|
|
22
|
+
// "error: unexpected argument '--output-schema' found". Also matches Rift's
|
|
23
|
+
// own pre-send capability-probe message ("too old … missing required
|
|
24
|
+
// option(s): --output-schema"). Distinct from `binary` (the executable runs)
|
|
25
|
+
// and from `auth`/`model`: the fix is to UPGRADE the CLI, not re-login or
|
|
26
|
+
// change the model. Mirrors the Claude runner's flag/contract bucket. Matched
|
|
27
|
+
// before the generic buckets so a too-old CLI never falls through to unknown.
|
|
28
|
+
if (/unexpected argument|unrecognized (subcommand|argument|option)|unknown (option|flag|argument|subcommand)|wasn'?t expected|isn'?t valid in this context|--output-schema|--output-last-message|too old|missing required option/.test(codexText)) {
|
|
29
|
+
return "cli_incompatible";
|
|
30
|
+
}
|
|
19
31
|
// Binary: the codex executable could not be launched at all — almost always
|
|
20
32
|
// `spawn … ENOENT`, i.e. the resolved path no longer exists (a `brew
|
|
21
33
|
// upgrade`/reinstall moved or removed it, or it was never installed). This is
|
|
@@ -62,6 +74,8 @@ export function summarizeCodexPreflightClass(cls, model) {
|
|
|
62
74
|
return model
|
|
63
75
|
? `Codex rejected the model "${model}".`
|
|
64
76
|
: "Codex rejected the configured model.";
|
|
77
|
+
case "cli_incompatible":
|
|
78
|
+
return "Codex CLI is too old for capture — it rejected an option Rift needs.";
|
|
65
79
|
case "binary":
|
|
66
80
|
return "Codex CLI could not be found or started — it may have moved or been removed.";
|
|
67
81
|
case "timeout":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-preflight.js","sourceRoot":"","sources":["../../../src/diagnostics/codex-preflight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex-preflight.js","sourceRoot":"","sources":["../../../src/diagnostics/codex-preflight.ts"],"names":[],"mappings":"AA4BA,0EAA0E;AAC1E,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAgC;IAEhC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK;SACpB,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;SACvC,IAAI,CAAC,IAAI,CAAC;SACV,WAAW,EAAE,CAAC;IAEjB,yEAAyE;IACzE,2EAA2E;IAC3E,IACE,4KAA4K,CAAC,IAAI,CAC/K,SAAS,CACV,EACD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,2EAA2E;IAC3E,mEAAmE;IACnE,2DAA2D;IAC3D,4EAA4E;IAC5E,qEAAqE;IACrE,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,8EAA8E;IAC9E,IACE,6NAA6N,CAAC,IAAI,CAChO,SAAS,CACV,EACD,CAAC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,4EAA4E;IAC5E,qEAAqE;IACrE,8EAA8E;IAC9E,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAC9E,wCAAwC;IACxC,IAAI,wDAAwD,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,IACE,uLAAuL,CAAC,IAAI,CAC1L,SAAS,CACV,EACD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,oIAAoI,CAAC,IAAI,CACvI,SAAS,CACV,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAgC;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,GAA6B,EAC7B,KAAoB;IAEpB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,sCAAsC,CAAC;QAChD,KAAK,OAAO;YACV,OAAO,KAAK;gBACV,CAAC,CAAC,6BAA6B,KAAK,IAAI;gBACxC,CAAC,CAAC,sCAAsC,CAAC;QAC7C,KAAK,kBAAkB;YACrB,OAAO,sEAAsE,CAAC;QAChF,KAAK,QAAQ;YACX,OAAO,8EAA8E,CAAC;QACxF,KAAK,SAAS;YACZ,OAAO,2DAA2D,CAAC;QACrE,KAAK,SAAS;YACZ,OAAO,wDAAwD,CAAC;QAClE,KAAK,SAAS;YACZ,OAAO,oDAAoD,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import type { FriendStatusPayload } from "../server/routes/friend-status.js";
|
|
27
27
|
/** Stable identifiers for each diagnosable condition. */
|
|
28
|
-
export type DoctorIssueKind = "daemon_unreachable" | "daemon_auth_failed" | "config_missing" | "voyage_key_missing" | "codex_auth_expired" | "codex_preflight_failed" | "voyage_embed_errors" | "index_write_errors" | "inbox_import_errors" | "capture_failed" | "capture_daemon_stale" | "mcp_not_installed" | "capture_quarantined" | "capture_repairing" | "update_available";
|
|
28
|
+
export type DoctorIssueKind = "daemon_unreachable" | "daemon_auth_failed" | "config_missing" | "voyage_key_missing" | "codex_auth_expired" | "codex_preflight_failed" | "claude_auth_expired" | "claude_preflight_failed" | "voyage_embed_errors" | "index_write_errors" | "inbox_import_errors" | "capture_failed" | "capture_daemon_stale" | "mcp_not_installed" | "menu_bar_unavailable" | "capture_quarantined" | "capture_repairing" | "update_available";
|
|
29
29
|
/**
|
|
30
30
|
* `broken` blocks Rift from doing its job (no capture, no search, no
|
|
31
31
|
* memory). `warning` is degraded-but-working or user-side (a rejected
|
|
@@ -64,6 +64,14 @@ export interface DoctorLocalSignals {
|
|
|
64
64
|
client: string;
|
|
65
65
|
installed: boolean;
|
|
66
66
|
}>;
|
|
67
|
+
/**
|
|
68
|
+
* SwiftBar presence — null when not applicable (non-macOS, or a caller that
|
|
69
|
+
* does not probe it, e.g. the daemon notifier). Only `{ installed: false }`
|
|
70
|
+
* raises the menu-bar advisory.
|
|
71
|
+
*/
|
|
72
|
+
swiftBar?: {
|
|
73
|
+
installed: boolean;
|
|
74
|
+
} | null;
|
|
67
75
|
}
|
|
68
76
|
/**
|
|
69
77
|
* Why `/status/friend` could not be read. A null status is NOT always
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAO7E,yDAAyD;AACzD,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,qBAAqB,GACrB,yBAAyB,GACzB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,sBAAsB,GACtB,mBAAmB,GACnB,sBAAsB,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1D;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B,oBAAoB,GACpB,aAAa,GACb,mBAAmB,GACnB,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,YAAY,EAAE,kBAAkB,CAAC;IACjC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAiHD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAkUzD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { claudePreflightNextAction, } from "./claude-preflight.js";
|
|
1
2
|
/**
|
|
2
3
|
* True only when `iso` parses to a timestamp at/after the daemon's
|
|
3
4
|
* current start. Historical errors that predate the running process are
|
|
@@ -22,6 +23,8 @@ function codexPreflightNextAction(cls) {
|
|
|
22
23
|
switch (cls) {
|
|
23
24
|
case "model":
|
|
24
25
|
return "Set codex_cli.model in your Rift config to a model your Codex plan supports, then: rift capture";
|
|
26
|
+
case "cli_incompatible":
|
|
27
|
+
return "Codex CLI is too old. Upgrade Codex (e.g. brew upgrade codex, or reinstall), then: rift capture";
|
|
25
28
|
case "binary":
|
|
26
29
|
return "Codex CLI could not be launched — check it is installed and on PATH (e.g. brew upgrade codex, or reinstall), then: rift capture";
|
|
27
30
|
case "timeout":
|
|
@@ -137,7 +140,38 @@ export function diagnose(input) {
|
|
|
137
140
|
// login". Everything else (a rejected model, a backend timeout, MCP
|
|
138
141
|
// noise) gets a neutral, honest message — never a false login nag.
|
|
139
142
|
if (status.codex.last_preflight_ok === false) {
|
|
140
|
-
if (status.codex.
|
|
143
|
+
if (status.codex.last_preflight_worker === "claude") {
|
|
144
|
+
// Triage runs through the `claude` CLI on this install — every remedy is
|
|
145
|
+
// Claude-shaped (sign into claude / upgrade / point past a wrapper), never
|
|
146
|
+
// "codex login". The summary is already the leak-free Claude phrasing.
|
|
147
|
+
const claudeClass = status.codex.last_preflight_error_class ?? "unknown";
|
|
148
|
+
if (claudeClass === "auth") {
|
|
149
|
+
issues.push({
|
|
150
|
+
kind: "claude_auth_expired",
|
|
151
|
+
severity: "broken",
|
|
152
|
+
title: "Claude Code login has expired",
|
|
153
|
+
detail: "Rift triages your new Claude Code / Codex sessions through the " +
|
|
154
|
+
"`claude` CLI on this install. Its login has expired, so automatic " +
|
|
155
|
+
"capture cannot run and new conversations are not being saved.",
|
|
156
|
+
nextAction: "Sign back in: run claude and log in (then run: rift capture)",
|
|
157
|
+
daemonObservable: true,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
issues.push({
|
|
162
|
+
kind: "claude_preflight_failed",
|
|
163
|
+
severity: "broken",
|
|
164
|
+
fingerprint: `claude_preflight_failed:${claudeClass}`,
|
|
165
|
+
title: "Claude Code capture probe is failing",
|
|
166
|
+
detail: `${status.codex.last_preflight_error_summary ?? "Claude preflight failed."} ` +
|
|
167
|
+
"Automatic capture is paused until a probe succeeds; recent " +
|
|
168
|
+
"conversations are safe on disk and will be captured once it clears.",
|
|
169
|
+
nextAction: claudePreflightNextAction(claudeClass),
|
|
170
|
+
daemonObservable: true,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else if (status.codex.last_preflight_error_class === "auth") {
|
|
141
175
|
issues.push({
|
|
142
176
|
kind: "codex_auth_expired",
|
|
143
177
|
severity: "broken",
|
|
@@ -159,7 +193,10 @@ export function diagnose(input) {
|
|
|
159
193
|
"Your codex login looks fine — this is not an auth problem. " +
|
|
160
194
|
"Automatic capture is paused until a probe succeeds; recent " +
|
|
161
195
|
"conversations are safe on disk and will be captured once it clears.",
|
|
162
|
-
nextAction: codexPreflightNextAction(
|
|
196
|
+
nextAction: codexPreflightNextAction(
|
|
197
|
+
// This branch only runs for the Codex worker, so the class is a
|
|
198
|
+
// Codex class; narrow the worker-union field back for the helper.
|
|
199
|
+
status.codex.last_preflight_error_class ?? null),
|
|
163
200
|
daemonObservable: true,
|
|
164
201
|
});
|
|
165
202
|
}
|
|
@@ -278,6 +315,24 @@ export function diagnose(input) {
|
|
|
278
315
|
daemonObservable: false,
|
|
279
316
|
});
|
|
280
317
|
}
|
|
318
|
+
// 7b. SwiftBar missing — the menu plugin is installed but the app that
|
|
319
|
+
// draws it is not, so the Rift menu bar icon will never appear. Degraded
|
|
320
|
+
// surface, not a broken engine (capture/search/memory all work headless),
|
|
321
|
+
// so it is a warning. Only fires when we actually probed it on macOS and
|
|
322
|
+
// found it absent; null (non-macOS / unprobed) stays silent.
|
|
323
|
+
if (localSignals.swiftBar && localSignals.swiftBar.installed === false) {
|
|
324
|
+
issues.push({
|
|
325
|
+
kind: "menu_bar_unavailable",
|
|
326
|
+
severity: "warning",
|
|
327
|
+
title: "Rift's menu bar icon can't show — SwiftBar isn't installed",
|
|
328
|
+
detail: "Rift installed its menu plugin, but SwiftBar — the free app that " +
|
|
329
|
+
"draws the icon in your menu bar — is not present, so the icon will " +
|
|
330
|
+
"not appear. Rift still captures and searches in the background.",
|
|
331
|
+
nextAction: "Install SwiftBar from swiftbar.app (or brew install --cask swiftbar if " +
|
|
332
|
+
"you use Homebrew), then: rift menubar install",
|
|
333
|
+
daemonObservable: false,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
281
336
|
// 8. Oversized sessions parked in quarantine — not in memory yet, but a
|
|
282
337
|
// graceful skip rather than an error, and one that now SELF-REPAIRS in
|
|
283
338
|
// the background. So the copy follows the repair state, not a bare count:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/diagnostics/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/diagnostics/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single source of truth for chunk MARKERS — how a row declares it is one
|
|
3
|
+
* piece of a larger logical document/conversation, and how readers recover the
|
|
4
|
+
* parent grouping. Every producer (indexer, save, ingest, rebuild) and every
|
|
5
|
+
* consumer (retrieval grouping, reconcile, dedup) imports from here, so there is
|
|
6
|
+
* exactly one marker contract.
|
|
7
|
+
*
|
|
8
|
+
* Representation:
|
|
9
|
+
* - Conversations carry explicit columns `parent_id`, `chunk_index`,
|
|
10
|
+
* `chunk_count` (all strings; empty = legacy/unchunked).
|
|
11
|
+
* - Documents carry `chunk_index` / `chunk_count` inside the existing
|
|
12
|
+
* `metadata` JSON; the parent key is the already-indexed `source_path`.
|
|
13
|
+
*
|
|
14
|
+
* The explicit `chunk_count` IS the marker: `chunk_count > 1` means "this row is
|
|
15
|
+
* part of a chunk set". A row WITHOUT that marker is never grouped — sharing a
|
|
16
|
+
* `source_path` or `idempotency_key` alone must not cause a collapse. Ordinals
|
|
17
|
+
* are stored explicitly (not parsed out of the row id), so completeness checks
|
|
18
|
+
* and honest "section k of N" display never treat the id as the source of truth.
|
|
19
|
+
*/
|
|
20
|
+
import type { TableName } from "../storage/tables.js";
|
|
21
|
+
export interface ChunkMarker {
|
|
22
|
+
/** Parent key value: `source_path` for docs, `parent_id` for conversations. */
|
|
23
|
+
parentId: string;
|
|
24
|
+
/** 0-based ordinal within the set. */
|
|
25
|
+
index: number;
|
|
26
|
+
/** Total chunks in the set (> 1 when this is genuinely chunked). */
|
|
27
|
+
count: number;
|
|
28
|
+
}
|
|
29
|
+
/** Separators for chunk row ids. Distinct per family for readability; ids are
|
|
30
|
+
* unique either way and are NOT load-bearing for ordering (use chunk_index). */
|
|
31
|
+
export declare const DOC_CHUNK_SEP = ":";
|
|
32
|
+
export declare const CONV_CHUNK_SEP = "::";
|
|
33
|
+
/** Read the chunk marker from a conversation row, or null if unchunked/legacy. */
|
|
34
|
+
export declare function readConversationChunkMarker(row: Record<string, unknown>): ChunkMarker | null;
|
|
35
|
+
/** Read the chunk marker from a structured-doc row, or null if unchunked/legacy. */
|
|
36
|
+
export declare function readDocChunkMarker(row: Record<string, unknown>): ChunkMarker | null;
|
|
37
|
+
/**
|
|
38
|
+
* Namespaced parent key for retrieval grouping, or `null` when the row carries
|
|
39
|
+
* NO explicit chunk marker (the flag-off / legacy case — never grouped).
|
|
40
|
+
*
|
|
41
|
+
* Namespacing guarantees mixed-vintage / cross-table rows can never collapse:
|
|
42
|
+
* - docs → `doc|<source_table>|<source_path>` (so `structured_docs` vs
|
|
43
|
+
* `structured_docs_local` with the same path stay separate)
|
|
44
|
+
* - convs → `conv|<source>|<parent_id>`
|
|
45
|
+
*/
|
|
46
|
+
export declare function parentKeyForRow(sourceTable: TableName, row: Record<string, unknown>): string | null;
|
|
47
|
+
/** True iff the row is part of a genuine chunk set (`chunk_count > 1`). */
|
|
48
|
+
export declare function isChunked(sourceTable: TableName, row: Record<string, unknown>): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Unified chunk-marker reader across the conversation and document families,
|
|
51
|
+
* or `null` for an unchunked/legacy row (no marker / `chunk_count <= 1`) and for
|
|
52
|
+
* digests (which never chunk). Lets the read-side (expand stitching) inspect a
|
|
53
|
+
* row's position in its set without re-deriving the per-family column vs metadata
|
|
54
|
+
* split. `parentId` is the raw column value (`parent_id` / `source_path`), not the
|
|
55
|
+
* namespaced retrieval key.
|
|
56
|
+
*/
|
|
57
|
+
export declare function readChunkMarker(sourceTable: TableName, row: Record<string, unknown>): ChunkMarker | null;
|
|
58
|
+
/** Conversation chunk columns. count <= 1 → empty markers (matches seed/legacy). */
|
|
59
|
+
export declare function conversationChunkColumns(parentId: string, index: number, count: number): {
|
|
60
|
+
parent_id: string;
|
|
61
|
+
chunk_index: string;
|
|
62
|
+
chunk_count: string;
|
|
63
|
+
};
|
|
64
|
+
/** Merge chunk ordinals into a doc metadata object. count <= 1 → unchanged
|
|
65
|
+
* (NO `chunk_*` keys), so a single/legacy doc stays byte-identical. */
|
|
66
|
+
export declare function docChunkMetadata(base: Record<string, unknown>, index: number, count: number): Record<string, unknown>;
|
|
67
|
+
export declare function convChunkId(parentId: string, index: number): string;
|
|
68
|
+
export declare function docChunkId(fileId: string, index: number): string;
|
|
69
|
+
/** The largest declared `chunk_count` across a set of rows (≥ 1). */
|
|
70
|
+
export declare function expectedChunkCount(rows: Record<string, unknown>[]): number;
|
|
71
|
+
/**
|
|
72
|
+
* True iff the rows already indexed for a parent form a COMPLETE set. Used by
|
|
73
|
+
* save/ingest/reconcile dedup so a partially-written set (crash mid-append) is
|
|
74
|
+
* repaired rather than mistaken for "already indexed".
|
|
75
|
+
*
|
|
76
|
+
* Completeness is stricter than a row count: a chunked set is complete only when
|
|
77
|
+
* every chunk index `0 .. count-1` is present EXACTLY once and every row agrees
|
|
78
|
+
* on the same `chunk_count`. This rejects the degenerate set that a bare
|
|
79
|
+
* `rows.length >= count` check would wave through — e.g. a duplicated chunk 0
|
|
80
|
+
* with a missing chunk 1 (length 2, count 2, but broken). An unchunked set
|
|
81
|
+
* (`count <= 1`, all legacy/`/ingest`-job rows) keeps the legacy semantics: any
|
|
82
|
+
* existing row counts as complete, so this never changes flag-off behavior.
|
|
83
|
+
*/
|
|
84
|
+
export declare function chunkSetComplete(rows: Record<string, unknown>[]): boolean;
|
|
85
|
+
//# sourceMappingURL=chunk-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-meta.d.ts","sourceRoot":"","sources":["../../../src/ingestion/chunk-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;CACf;AAED;iFACiF;AACjF,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,cAAc,OAAO,CAAC;AAgCnC,kFAAkF;AAClF,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,WAAW,GAAG,IAAI,CAMpB;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,WAAW,GAAG,IAAI,CAQpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,SAAS,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,GAAG,IAAI,CAaf;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CACvB,WAAW,EAAE,SAAS,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,SAAS,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,WAAW,GAAG,IAAI,CAQpB;AAID,oFAAoF;AACpF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAOjE;AAED;wEACwE;AACxE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAID,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAI1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAczE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/** Separators for chunk row ids. Distinct per family for readability; ids are
|
|
2
|
+
* unique either way and are NOT load-bearing for ordering (use chunk_index). */
|
|
3
|
+
export const DOC_CHUNK_SEP = ":";
|
|
4
|
+
export const CONV_CHUNK_SEP = "::";
|
|
5
|
+
function parseIntOr(value, fallback) {
|
|
6
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
7
|
+
return value;
|
|
8
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
9
|
+
const n = Number.parseInt(value, 10);
|
|
10
|
+
if (Number.isFinite(n))
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
function parseMetadata(value) {
|
|
16
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
17
|
+
return {};
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(value);
|
|
20
|
+
return parsed && typeof parsed === "object"
|
|
21
|
+
? parsed
|
|
22
|
+
: {};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const CONVERSATION_TABLES = new Set([
|
|
29
|
+
"conversations_hot",
|
|
30
|
+
"conversations_cold",
|
|
31
|
+
]);
|
|
32
|
+
const DOC_TABLES = new Set([
|
|
33
|
+
"structured_docs",
|
|
34
|
+
"structured_docs_local",
|
|
35
|
+
]);
|
|
36
|
+
/** Read the chunk marker from a conversation row, or null if unchunked/legacy. */
|
|
37
|
+
export function readConversationChunkMarker(row) {
|
|
38
|
+
const count = parseIntOr(row["chunk_count"], 1);
|
|
39
|
+
if (count <= 1)
|
|
40
|
+
return null;
|
|
41
|
+
const parentId = typeof row["parent_id"] === "string" ? row["parent_id"] : "";
|
|
42
|
+
if (!parentId)
|
|
43
|
+
return null;
|
|
44
|
+
return { parentId, index: parseIntOr(row["chunk_index"], 0), count };
|
|
45
|
+
}
|
|
46
|
+
/** Read the chunk marker from a structured-doc row, or null if unchunked/legacy. */
|
|
47
|
+
export function readDocChunkMarker(row) {
|
|
48
|
+
const sourcePath = typeof row["source_path"] === "string" ? row["source_path"] : "";
|
|
49
|
+
if (!sourcePath)
|
|
50
|
+
return null;
|
|
51
|
+
const meta = parseMetadata(row["metadata"]);
|
|
52
|
+
const count = parseIntOr(meta["chunk_count"], 1);
|
|
53
|
+
if (count <= 1)
|
|
54
|
+
return null;
|
|
55
|
+
return { parentId: sourcePath, index: parseIntOr(meta["chunk_index"], 0), count };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Namespaced parent key for retrieval grouping, or `null` when the row carries
|
|
59
|
+
* NO explicit chunk marker (the flag-off / legacy case — never grouped).
|
|
60
|
+
*
|
|
61
|
+
* Namespacing guarantees mixed-vintage / cross-table rows can never collapse:
|
|
62
|
+
* - docs → `doc|<source_table>|<source_path>` (so `structured_docs` vs
|
|
63
|
+
* `structured_docs_local` with the same path stay separate)
|
|
64
|
+
* - convs → `conv|<source>|<parent_id>`
|
|
65
|
+
*/
|
|
66
|
+
export function parentKeyForRow(sourceTable, row) {
|
|
67
|
+
if (CONVERSATION_TABLES.has(sourceTable)) {
|
|
68
|
+
const marker = readConversationChunkMarker(row);
|
|
69
|
+
if (!marker)
|
|
70
|
+
return null;
|
|
71
|
+
const source = typeof row["source"] === "string" ? row["source"] : "";
|
|
72
|
+
return `conv|${source}|${marker.parentId}`;
|
|
73
|
+
}
|
|
74
|
+
if (DOC_TABLES.has(sourceTable)) {
|
|
75
|
+
const marker = readDocChunkMarker(row);
|
|
76
|
+
if (!marker)
|
|
77
|
+
return null;
|
|
78
|
+
return `doc|${sourceTable}|${marker.parentId}`;
|
|
79
|
+
}
|
|
80
|
+
return null; // digests and anything else never chunk
|
|
81
|
+
}
|
|
82
|
+
/** True iff the row is part of a genuine chunk set (`chunk_count > 1`). */
|
|
83
|
+
export function isChunked(sourceTable, row) {
|
|
84
|
+
return parentKeyForRow(sourceTable, row) !== null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Unified chunk-marker reader across the conversation and document families,
|
|
88
|
+
* or `null` for an unchunked/legacy row (no marker / `chunk_count <= 1`) and for
|
|
89
|
+
* digests (which never chunk). Lets the read-side (expand stitching) inspect a
|
|
90
|
+
* row's position in its set without re-deriving the per-family column vs metadata
|
|
91
|
+
* split. `parentId` is the raw column value (`parent_id` / `source_path`), not the
|
|
92
|
+
* namespaced retrieval key.
|
|
93
|
+
*/
|
|
94
|
+
export function readChunkMarker(sourceTable, row) {
|
|
95
|
+
if (CONVERSATION_TABLES.has(sourceTable)) {
|
|
96
|
+
return readConversationChunkMarker(row);
|
|
97
|
+
}
|
|
98
|
+
if (DOC_TABLES.has(sourceTable)) {
|
|
99
|
+
return readDocChunkMarker(row);
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
// --- Builders (producers) ---
|
|
104
|
+
/** Conversation chunk columns. count <= 1 → empty markers (matches seed/legacy). */
|
|
105
|
+
export function conversationChunkColumns(parentId, index, count) {
|
|
106
|
+
if (count <= 1)
|
|
107
|
+
return { parent_id: "", chunk_index: "", chunk_count: "" };
|
|
108
|
+
return {
|
|
109
|
+
parent_id: parentId,
|
|
110
|
+
chunk_index: String(index),
|
|
111
|
+
chunk_count: String(count),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Merge chunk ordinals into a doc metadata object. count <= 1 → unchanged
|
|
115
|
+
* (NO `chunk_*` keys), so a single/legacy doc stays byte-identical. */
|
|
116
|
+
export function docChunkMetadata(base, index, count) {
|
|
117
|
+
if (count <= 1)
|
|
118
|
+
return base;
|
|
119
|
+
return { ...base, chunk_index: index, chunk_count: count };
|
|
120
|
+
}
|
|
121
|
+
export function convChunkId(parentId, index) {
|
|
122
|
+
return `${parentId}${CONV_CHUNK_SEP}${index}`;
|
|
123
|
+
}
|
|
124
|
+
export function docChunkId(fileId, index) {
|
|
125
|
+
return `${fileId}${DOC_CHUNK_SEP}${index}`;
|
|
126
|
+
}
|
|
127
|
+
// --- Completeness (replay / dedup) ---
|
|
128
|
+
/** The largest declared `chunk_count` across a set of rows (≥ 1). */
|
|
129
|
+
export function expectedChunkCount(rows) {
|
|
130
|
+
let max = 1;
|
|
131
|
+
for (const r of rows)
|
|
132
|
+
max = Math.max(max, parseIntOr(r["chunk_count"], 1));
|
|
133
|
+
return max;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* True iff the rows already indexed for a parent form a COMPLETE set. Used by
|
|
137
|
+
* save/ingest/reconcile dedup so a partially-written set (crash mid-append) is
|
|
138
|
+
* repaired rather than mistaken for "already indexed".
|
|
139
|
+
*
|
|
140
|
+
* Completeness is stricter than a row count: a chunked set is complete only when
|
|
141
|
+
* every chunk index `0 .. count-1` is present EXACTLY once and every row agrees
|
|
142
|
+
* on the same `chunk_count`. This rejects the degenerate set that a bare
|
|
143
|
+
* `rows.length >= count` check would wave through — e.g. a duplicated chunk 0
|
|
144
|
+
* with a missing chunk 1 (length 2, count 2, but broken). An unchunked set
|
|
145
|
+
* (`count <= 1`, all legacy/`/ingest`-job rows) keeps the legacy semantics: any
|
|
146
|
+
* existing row counts as complete, so this never changes flag-off behavior.
|
|
147
|
+
*/
|
|
148
|
+
export function chunkSetComplete(rows) {
|
|
149
|
+
if (rows.length === 0)
|
|
150
|
+
return false;
|
|
151
|
+
const count = expectedChunkCount(rows);
|
|
152
|
+
if (count <= 1)
|
|
153
|
+
return true; // unchunked/legacy: one existing row is enough
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
for (const r of rows) {
|
|
156
|
+
// Every row in a genuine chunk set must declare the same total; drift means
|
|
157
|
+
// we are looking at a mixed/partial set and cannot trust it as complete.
|
|
158
|
+
if (parseIntOr(r["chunk_count"], 1) !== count)
|
|
159
|
+
return false;
|
|
160
|
+
const idx = parseIntOr(r["chunk_index"], -1);
|
|
161
|
+
if (idx < 0 || idx >= count || seen.has(idx))
|
|
162
|
+
return false;
|
|
163
|
+
seen.add(idx);
|
|
164
|
+
}
|
|
165
|
+
return seen.size === count;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=chunk-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-meta.js","sourceRoot":"","sources":["../../../src/ingestion/chunk-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index-time chunkers.
|
|
3
|
+
*
|
|
4
|
+
* `chunkText` splits a long document into overlapping windows at natural
|
|
5
|
+
* (paragraph / heading) boundaries; `chunkConversation` prefers turn boundaries
|
|
6
|
+
* (`User:` / `Assistant:`) and falls back to `chunkText`. Both short-circuit to a
|
|
7
|
+
* single chunk when the content is below `CHUNK_THRESHOLD_CHARS`, so small
|
|
8
|
+
* documents/conversations are unaffected.
|
|
9
|
+
*
|
|
10
|
+
* Deterministic and dependency-free. Sibling of `chunkByTurns` in
|
|
11
|
+
* `src/capture/recover-quarantine.ts` (that one is byte-budgeted, for recovery
|
|
12
|
+
* summarization; these are char-windowed, for index-time embedding).
|
|
13
|
+
*/
|
|
14
|
+
export interface ChunkOptions {
|
|
15
|
+
/** Soft target size per chunk (chars). */
|
|
16
|
+
targetChars: number;
|
|
17
|
+
/** Approx overlap carried from the previous chunk (chars). */
|
|
18
|
+
overlapChars: number;
|
|
19
|
+
/** Trailing chunks smaller than this are merged back into the previous one. */
|
|
20
|
+
minChars: number;
|
|
21
|
+
/** A single unit larger than this is hard-split at a word boundary. */
|
|
22
|
+
maxChars: number;
|
|
23
|
+
/** Content at or below this size is emitted as one chunk (no chunking). */
|
|
24
|
+
thresholdChars: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const CHUNK_THRESHOLD_CHARS = 2400;
|
|
27
|
+
/**
|
|
28
|
+
* Whether index-time chunking is enabled. Single env flag `RIFT_CHUNKING`
|
|
29
|
+
* (default OFF), read at call time so tests can toggle it. With it OFF, every
|
|
30
|
+
* write path emits a single row with no chunk markers — byte-for-byte the
|
|
31
|
+
* pre-chunking behavior.
|
|
32
|
+
*/
|
|
33
|
+
export declare function chunkingEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
34
|
+
export declare const DEFAULT_CHUNK_OPTIONS: ChunkOptions;
|
|
35
|
+
/** Split a document into overlapping chunks at paragraph boundaries. */
|
|
36
|
+
export declare function chunkText(content: string, options?: Partial<ChunkOptions>): string[];
|
|
37
|
+
/** Split a conversation into overlapping chunks, preferring turn boundaries. */
|
|
38
|
+
export declare function chunkConversation(content: string, options?: Partial<ChunkOptions>): string[];
|
|
39
|
+
//# sourceMappingURL=chunk-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-text.d.ts","sourceRoot":"","sources":["../../../src/ingestion/chunk-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE7E;AAED,eAAO,MAAM,qBAAqB,EAAE,YAMnC,CAAC;AAIF,wEAAwE;AACxE,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,MAAM,EAAE,CAMV;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,MAAM,EAAE,CAYV"}
|