@getrift/rift 0.1.0-beta.21 → 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/onboard.d.ts +22 -2
- package/dist/src/cli/commands/onboard.d.ts.map +1 -1
- package/dist/src/cli/commands/onboard.js +160 -32
- 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 +12 -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 +166 -1
- 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/status/friend-header.d.ts +10 -0
- package/dist/src/cli/status/friend-header.d.ts.map +1 -1
- package/dist/src/cli/status/friend-header.js +117 -0
- package/dist/src/cli/status/friend-header.js.map +1 -1
- package/dist/src/cli/status/local-signals.d.ts +23 -0
- package/dist/src/cli/status/local-signals.d.ts.map +1 -1
- package/dist/src/cli/status/local-signals.js +19 -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 +1 -1
- package/dist/src/diagnostics/doctor.d.ts.map +1 -1
- package/dist/src/diagnostics/doctor.js +39 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification of a recorded Claude Code `preflight_error` (the capture-triage
|
|
3
|
+
* probe failure) into a coarse class that drives honest, CLAUDE-SPECIFIC
|
|
4
|
+
* doctor/status copy — the Claude analogue of `codex-preflight.ts`.
|
|
5
|
+
*
|
|
6
|
+
* The string we classify is the runner's OWN leak-free error (see
|
|
7
|
+
* `claude-cli-runner.ts`): a canned `classifyClaudeStderr` phrase, the
|
|
8
|
+
* "No compatible Claude Code CLI found …" aggregate, the "was not found …"
|
|
9
|
+
* message, or a timeout. Those are structural phrases the runner emits — never
|
|
10
|
+
* raw stderr, prompt, or model output (the runner already stripped those). So we
|
|
11
|
+
* only ever pattern-match Rift's own wording here; nothing user-content-bearing
|
|
12
|
+
* reaches this module.
|
|
13
|
+
*
|
|
14
|
+
* Why a separate worker: when capture triage runs through `claude` instead of
|
|
15
|
+
* `codex`, "run codex login" is wrong advice. A Claude user needs Claude-shaped
|
|
16
|
+
* remedies — sign into `claude`, upgrade an old CLI that lacks `--safe-mode`, or
|
|
17
|
+
* point `RIFT_CLAUDE_CLI_PATH` past a wrapper. These classes encode exactly the
|
|
18
|
+
* failure buckets the runner can produce.
|
|
19
|
+
*/
|
|
20
|
+
export type ClaudePreflightErrorClass = "missing" | "incompatible" | "wrapper" | "auth" | "rate_limit" | "network" | "timeout" | "unknown";
|
|
21
|
+
export declare function classifyClaudePreflightError(error: string | null | undefined): ClaudePreflightErrorClass;
|
|
22
|
+
/**
|
|
23
|
+
* A short, leak-free, human summary for a class. Deliberately canned (no raw
|
|
24
|
+
* stderr, no file paths, no prompt/session content) so SwiftBar/doctor can
|
|
25
|
+
* surface it without parsing or redacting raw `claude` output.
|
|
26
|
+
*/
|
|
27
|
+
export declare function summarizeClaudePreflightClass(cls: ClaudePreflightErrorClass): string;
|
|
28
|
+
/**
|
|
29
|
+
* The single concrete remedy for a class — shown as the doctor `nextAction` and
|
|
30
|
+
* the status `Next:` line. Claude-shaped (never "codex login"), and it always
|
|
31
|
+
* ends by pointing back at `rift capture` so the user can re-verify.
|
|
32
|
+
*/
|
|
33
|
+
export declare function claudePreflightNextAction(cls: ClaudePreflightErrorClass): string;
|
|
34
|
+
//# sourceMappingURL=claude-preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-preflight.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/claude-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,cAAc,GACd,SAAS,GACT,MAAM,GACN,YAAY,GACZ,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,yBAAyB,CA2D3B;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,yBAAyB,GAC7B,MAAM,CAmBR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,yBAAyB,GAC7B,MAAM,CAkBR"}
|
|
@@ -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" | "menu_bar_unavailable" | "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
|
|
@@ -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
|
}
|
|
@@ -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
|