@getrift/rift 0.0.0 → 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.dev.md +110 -0
- package/dist/src/auth/keychain.d.ts +25 -0
- package/dist/src/auth/keychain.d.ts.map +1 -0
- package/dist/src/auth/keychain.js +113 -0
- package/dist/src/auth/keychain.js.map +1 -0
- package/dist/src/auth/middleware.d.ts +20 -0
- package/dist/src/auth/middleware.d.ts.map +1 -0
- package/dist/src/auth/middleware.js +49 -0
- package/dist/src/auth/middleware.js.map +1 -0
- package/dist/src/auth/rate-limit.d.ts +16 -0
- package/dist/src/auth/rate-limit.d.ts.map +1 -0
- package/dist/src/auth/rate-limit.js +38 -0
- package/dist/src/auth/rate-limit.js.map +1 -0
- package/dist/src/auth/rotation.d.ts +67 -0
- package/dist/src/auth/rotation.d.ts.map +1 -0
- package/dist/src/auth/rotation.js +190 -0
- package/dist/src/auth/rotation.js.map +1 -0
- package/dist/src/backfill/project-context-batch-constructor.d.ts +127 -0
- package/dist/src/backfill/project-context-batch-constructor.d.ts.map +1 -0
- package/dist/src/backfill/project-context-batch-constructor.js +210 -0
- package/dist/src/backfill/project-context-batch-constructor.js.map +1 -0
- package/dist/src/capture/auto-capture.d.ts +162 -0
- package/dist/src/capture/auto-capture.d.ts.map +1 -0
- package/dist/src/capture/auto-capture.js +601 -0
- package/dist/src/capture/auto-capture.js.map +1 -0
- package/dist/src/capture/batch-budget.d.ts +90 -0
- package/dist/src/capture/batch-budget.d.ts.map +1 -0
- package/dist/src/capture/batch-budget.js +148 -0
- package/dist/src/capture/batch-budget.js.map +1 -0
- package/dist/src/capture/codex-cli-triage-provider.d.ts +17 -0
- package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -0
- package/dist/src/capture/codex-cli-triage-provider.js +109 -0
- package/dist/src/capture/codex-cli-triage-provider.js.map +1 -0
- package/dist/src/capture/observability.d.ts +42 -0
- package/dist/src/capture/observability.d.ts.map +1 -0
- package/dist/src/capture/observability.js +87 -0
- package/dist/src/capture/observability.js.map +1 -0
- package/dist/src/capture/openai-triage-provider.d.ts +92 -0
- package/dist/src/capture/openai-triage-provider.d.ts.map +1 -0
- package/dist/src/capture/openai-triage-provider.js +267 -0
- package/dist/src/capture/openai-triage-provider.js.map +1 -0
- package/dist/src/capture/review-queue-index.d.ts +51 -0
- package/dist/src/capture/review-queue-index.d.ts.map +1 -0
- package/dist/src/capture/review-queue-index.js +204 -0
- package/dist/src/capture/review-queue-index.js.map +1 -0
- package/dist/src/capture/review-queue.d.ts +43 -0
- package/dist/src/capture/review-queue.d.ts.map +1 -0
- package/dist/src/capture/review-queue.js +116 -0
- package/dist/src/capture/review-queue.js.map +1 -0
- package/dist/src/capture/sources.d.ts +7 -0
- package/dist/src/capture/sources.d.ts.map +1 -0
- package/dist/src/capture/sources.js +3 -0
- package/dist/src/capture/sources.js.map +1 -0
- package/dist/src/capture/triage-lane.d.ts +39 -0
- package/dist/src/capture/triage-lane.d.ts.map +1 -0
- package/dist/src/capture/triage-lane.js +217 -0
- package/dist/src/capture/triage-lane.js.map +1 -0
- package/dist/src/capture/triage-provider.d.ts +75 -0
- package/dist/src/capture/triage-provider.d.ts.map +1 -0
- package/dist/src/capture/triage-provider.js +120 -0
- package/dist/src/capture/triage-provider.js.map +1 -0
- package/dist/src/capture/triage.d.ts +30 -0
- package/dist/src/capture/triage.d.ts.map +1 -0
- package/dist/src/capture/triage.js +48 -0
- package/dist/src/capture/triage.js.map +1 -0
- package/dist/src/cli/commands/backfill.d.ts +3 -0
- package/dist/src/cli/commands/backfill.d.ts.map +1 -0
- package/dist/src/cli/commands/backfill.js +1376 -0
- package/dist/src/cli/commands/backfill.js.map +1 -0
- package/dist/src/cli/commands/bulk-ingest.d.ts +3 -0
- package/dist/src/cli/commands/bulk-ingest.d.ts.map +1 -0
- package/dist/src/cli/commands/bulk-ingest.js +126 -0
- package/dist/src/cli/commands/bulk-ingest.js.map +1 -0
- package/dist/src/cli/commands/capture.d.ts +12 -0
- package/dist/src/cli/commands/capture.d.ts.map +1 -0
- package/dist/src/cli/commands/capture.js +123 -0
- package/dist/src/cli/commands/capture.js.map +1 -0
- package/dist/src/cli/commands/compact.d.ts +3 -0
- package/dist/src/cli/commands/compact.d.ts.map +1 -0
- package/dist/src/cli/commands/compact.js +70 -0
- package/dist/src/cli/commands/compact.js.map +1 -0
- package/dist/src/cli/commands/feedback.d.ts +22 -0
- package/dist/src/cli/commands/feedback.d.ts.map +1 -0
- package/dist/src/cli/commands/feedback.js +125 -0
- package/dist/src/cli/commands/feedback.js.map +1 -0
- package/dist/src/cli/commands/hooks-install.d.ts +19 -0
- package/dist/src/cli/commands/hooks-install.d.ts.map +1 -0
- package/dist/src/cli/commands/hooks-install.js +103 -0
- package/dist/src/cli/commands/hooks-install.js.map +1 -0
- package/dist/src/cli/commands/import.d.ts +19 -0
- package/dist/src/cli/commands/import.d.ts.map +1 -0
- package/dist/src/cli/commands/import.js +258 -0
- package/dist/src/cli/commands/import.js.map +1 -0
- package/dist/src/cli/commands/ingest.d.ts +3 -0
- package/dist/src/cli/commands/ingest.d.ts.map +1 -0
- package/dist/src/cli/commands/ingest.js +80 -0
- package/dist/src/cli/commands/ingest.js.map +1 -0
- package/dist/src/cli/commands/mcp-install.d.ts +25 -0
- package/dist/src/cli/commands/mcp-install.d.ts.map +1 -0
- package/dist/src/cli/commands/mcp-install.js +134 -0
- package/dist/src/cli/commands/mcp-install.js.map +1 -0
- package/dist/src/cli/commands/onboard.d.ts +98 -0
- package/dist/src/cli/commands/onboard.d.ts.map +1 -0
- package/dist/src/cli/commands/onboard.js +823 -0
- package/dist/src/cli/commands/onboard.js.map +1 -0
- package/dist/src/cli/commands/rebuild.d.ts +12 -0
- package/dist/src/cli/commands/rebuild.d.ts.map +1 -0
- package/dist/src/cli/commands/rebuild.js +164 -0
- package/dist/src/cli/commands/rebuild.js.map +1 -0
- package/dist/src/cli/commands/reconcile.d.ts +3 -0
- package/dist/src/cli/commands/reconcile.d.ts.map +1 -0
- package/dist/src/cli/commands/reconcile.js +56 -0
- package/dist/src/cli/commands/reconcile.js.map +1 -0
- package/dist/src/cli/commands/reindex.d.ts +3 -0
- package/dist/src/cli/commands/reindex.d.ts.map +1 -0
- package/dist/src/cli/commands/reindex.js +66 -0
- package/dist/src/cli/commands/reindex.js.map +1 -0
- package/dist/src/cli/commands/review.d.ts +13 -0
- package/dist/src/cli/commands/review.d.ts.map +1 -0
- package/dist/src/cli/commands/review.js +383 -0
- package/dist/src/cli/commands/review.js.map +1 -0
- package/dist/src/cli/commands/save.d.ts +3 -0
- package/dist/src/cli/commands/save.d.ts.map +1 -0
- package/dist/src/cli/commands/save.js +111 -0
- package/dist/src/cli/commands/save.js.map +1 -0
- package/dist/src/cli/commands/search.d.ts +35 -0
- package/dist/src/cli/commands/search.d.ts.map +1 -0
- package/dist/src/cli/commands/search.js +88 -0
- package/dist/src/cli/commands/search.js.map +1 -0
- package/dist/src/cli/commands/stats.d.ts +3 -0
- package/dist/src/cli/commands/stats.d.ts.map +1 -0
- package/dist/src/cli/commands/stats.js +42 -0
- package/dist/src/cli/commands/stats.js.map +1 -0
- package/dist/src/cli/commands/status.d.ts +15 -0
- package/dist/src/cli/commands/status.d.ts.map +1 -0
- package/dist/src/cli/commands/status.js +89 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/token-issue.d.ts +3 -0
- package/dist/src/cli/commands/token-issue.d.ts.map +1 -0
- package/dist/src/cli/commands/token-issue.js +25 -0
- package/dist/src/cli/commands/token-issue.js.map +1 -0
- package/dist/src/cli/commands/triage.d.ts +3 -0
- package/dist/src/cli/commands/triage.d.ts.map +1 -0
- package/dist/src/cli/commands/triage.js +125 -0
- package/dist/src/cli/commands/triage.js.map +1 -0
- package/dist/src/cli/commands/uninstall.d.ts +3 -0
- package/dist/src/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/src/cli/commands/uninstall.js +238 -0
- package/dist/src/cli/commands/uninstall.js.map +1 -0
- package/dist/src/cli/feedback/feedback-config.d.ts +21 -0
- package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -0
- package/dist/src/cli/feedback/feedback-config.js +43 -0
- package/dist/src/cli/feedback/feedback-config.js.map +1 -0
- package/dist/src/cli/feedback/feedback-history.d.ts +4 -0
- package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -0
- package/dist/src/cli/feedback/feedback-history.js +115 -0
- package/dist/src/cli/feedback/feedback-history.js.map +1 -0
- package/dist/src/cli/feedback/feedback-payload.d.ts +53 -0
- package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -0
- package/dist/src/cli/feedback/feedback-payload.js +10 -0
- package/dist/src/cli/feedback/feedback-payload.js.map +1 -0
- package/dist/src/cli/feedback/feedback-relay.d.ts +15 -0
- package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -0
- package/dist/src/cli/feedback/feedback-relay.js +47 -0
- package/dist/src/cli/feedback/feedback-relay.js.map +1 -0
- package/dist/src/cli/feedback/feedback-status.d.ts +11 -0
- package/dist/src/cli/feedback/feedback-status.d.ts.map +1 -0
- package/dist/src/cli/feedback/feedback-status.js +122 -0
- package/dist/src/cli/feedback/feedback-status.js.map +1 -0
- package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts +25 -0
- package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts.map +1 -0
- package/dist/src/cli/hooks-writers/claude-code-policy-script.js +85 -0
- package/dist/src/cli/hooks-writers/claude-code-policy-script.js.map +1 -0
- package/dist/src/cli/hooks-writers/claude-code.d.ts +12 -0
- package/dist/src/cli/hooks-writers/claude-code.d.ts.map +1 -0
- package/dist/src/cli/hooks-writers/claude-code.js +228 -0
- package/dist/src/cli/hooks-writers/claude-code.js.map +1 -0
- package/dist/src/cli/hooks-writers/errors.d.ts +16 -0
- package/dist/src/cli/hooks-writers/errors.d.ts.map +1 -0
- package/dist/src/cli/hooks-writers/errors.js +24 -0
- package/dist/src/cli/hooks-writers/errors.js.map +1 -0
- package/dist/src/cli/hooks-writers/index.d.ts +13 -0
- package/dist/src/cli/hooks-writers/index.d.ts.map +1 -0
- package/dist/src/cli/hooks-writers/index.js +26 -0
- package/dist/src/cli/hooks-writers/index.js.map +1 -0
- package/dist/src/cli/hooks-writers/types.d.ts +27 -0
- package/dist/src/cli/hooks-writers/types.d.ts.map +1 -0
- package/dist/src/cli/hooks-writers/types.js +9 -0
- package/dist/src/cli/hooks-writers/types.js.map +1 -0
- package/dist/src/cli/http-client.d.ts +36 -0
- package/dist/src/cli/http-client.d.ts.map +1 -0
- package/dist/src/cli/http-client.js +153 -0
- package/dist/src/cli/http-client.js.map +1 -0
- package/dist/src/cli/index.d.ts +4 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +68 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/job-poller.d.ts +13 -0
- package/dist/src/cli/job-poller.d.ts.map +1 -0
- package/dist/src/cli/job-poller.js +29 -0
- package/dist/src/cli/job-poller.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/codex-toml.d.ts +10 -0
- package/dist/src/cli/mcp-config-writers/codex-toml.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/codex-toml.js +410 -0
- package/dist/src/cli/mcp-config-writers/codex-toml.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/errors.d.ts +17 -0
- package/dist/src/cli/mcp-config-writers/errors.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/errors.js +13 -0
- package/dist/src/cli/mcp-config-writers/errors.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/index.d.ts +18 -0
- package/dist/src/cli/mcp-config-writers/index.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/index.js +49 -0
- package/dist/src/cli/mcp-config-writers/index.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/json-config.d.ts +12 -0
- package/dist/src/cli/mcp-config-writers/json-config.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/json-config.js +177 -0
- package/dist/src/cli/mcp-config-writers/json-config.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/redact.d.ts +28 -0
- package/dist/src/cli/mcp-config-writers/redact.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/redact.js +48 -0
- package/dist/src/cli/mcp-config-writers/redact.js.map +1 -0
- package/dist/src/cli/mcp-config-writers/types.d.ts +32 -0
- package/dist/src/cli/mcp-config-writers/types.d.ts.map +1 -0
- package/dist/src/cli/mcp-config-writers/types.js +5 -0
- package/dist/src/cli/mcp-config-writers/types.js.map +1 -0
- package/dist/src/cli/output.d.ts +8 -0
- package/dist/src/cli/output.d.ts.map +1 -0
- package/dist/src/cli/output.js +34 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/cli/status/friend-header.d.ts +33 -0
- package/dist/src/cli/status/friend-header.d.ts.map +1 -0
- package/dist/src/cli/status/friend-header.js +108 -0
- package/dist/src/cli/status/friend-header.js.map +1 -0
- package/dist/src/cli/status/local-signals.d.ts +14 -0
- package/dist/src/cli/status/local-signals.d.ts.map +1 -0
- package/dist/src/cli/status/local-signals.js +73 -0
- package/dist/src/cli/status/local-signals.js.map +1 -0
- package/dist/src/cli/token.d.ts +37 -0
- package/dist/src/cli/token.d.ts.map +1 -0
- package/dist/src/cli/token.js +105 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/uninstall/mcp-uninstall.d.ts +33 -0
- package/dist/src/cli/uninstall/mcp-uninstall.d.ts.map +1 -0
- package/dist/src/cli/uninstall/mcp-uninstall.js +181 -0
- package/dist/src/cli/uninstall/mcp-uninstall.js.map +1 -0
- package/dist/src/config/loader.d.ts +9 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +73 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +635 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +208 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/ingestion/bulk-ingest.d.ts +11 -0
- package/dist/src/ingestion/bulk-ingest.d.ts.map +1 -0
- package/dist/src/ingestion/bulk-ingest.js +11 -0
- package/dist/src/ingestion/bulk-ingest.js.map +1 -0
- package/dist/src/ingestion/extractor.d.ts +16 -0
- package/dist/src/ingestion/extractor.d.ts.map +1 -0
- package/dist/src/ingestion/extractor.js +85 -0
- package/dist/src/ingestion/extractor.js.map +1 -0
- package/dist/src/ingestion/extractors/docx.d.ts +3 -0
- package/dist/src/ingestion/extractors/docx.d.ts.map +1 -0
- package/dist/src/ingestion/extractors/docx.js +20 -0
- package/dist/src/ingestion/extractors/docx.js.map +1 -0
- package/dist/src/ingestion/extractors/pdf.d.ts +3 -0
- package/dist/src/ingestion/extractors/pdf.d.ts.map +1 -0
- package/dist/src/ingestion/extractors/pdf.js +32 -0
- package/dist/src/ingestion/extractors/pdf.js.map +1 -0
- package/dist/src/ingestion/historical-campaign.d.ts +340 -0
- package/dist/src/ingestion/historical-campaign.d.ts.map +1 -0
- package/dist/src/ingestion/historical-campaign.js +1010 -0
- package/dist/src/ingestion/historical-campaign.js.map +1 -0
- package/dist/src/ingestion/ignored-paths.d.ts +20 -0
- package/dist/src/ingestion/ignored-paths.d.ts.map +1 -0
- package/dist/src/ingestion/ignored-paths.js +45 -0
- package/dist/src/ingestion/ignored-paths.js.map +1 -0
- package/dist/src/ingestion/inbox-watcher.d.ts +12 -0
- package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -0
- package/dist/src/ingestion/inbox-watcher.js +99 -0
- package/dist/src/ingestion/inbox-watcher.js.map +1 -0
- package/dist/src/ingestion/indexer.d.ts +32 -0
- package/dist/src/ingestion/indexer.d.ts.map +1 -0
- package/dist/src/ingestion/indexer.js +68 -0
- package/dist/src/ingestion/indexer.js.map +1 -0
- package/dist/src/ingestion/metadata-extraction.d.ts +53 -0
- package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -0
- package/dist/src/ingestion/metadata-extraction.js +132 -0
- package/dist/src/ingestion/metadata-extraction.js.map +1 -0
- package/dist/src/ingestion/parsers/chatgpt-web.d.ts +29 -0
- package/dist/src/ingestion/parsers/chatgpt-web.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/chatgpt-web.js +100 -0
- package/dist/src/ingestion/parsers/chatgpt-web.js.map +1 -0
- package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts +16 -0
- package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/claude-code-jsonl.js +123 -0
- package/dist/src/ingestion/parsers/claude-code-jsonl.js.map +1 -0
- package/dist/src/ingestion/parsers/claude-web.d.ts +24 -0
- package/dist/src/ingestion/parsers/claude-web.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/claude-web.js +78 -0
- package/dist/src/ingestion/parsers/claude-web.js.map +1 -0
- package/dist/src/ingestion/parsers/codex-jsonl.d.ts +18 -0
- package/dist/src/ingestion/parsers/codex-jsonl.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/codex-jsonl.js +125 -0
- package/dist/src/ingestion/parsers/codex-jsonl.js.map +1 -0
- package/dist/src/ingestion/parsers/gemini-web.d.ts +16 -0
- package/dist/src/ingestion/parsers/gemini-web.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/gemini-web.js +170 -0
- package/dist/src/ingestion/parsers/gemini-web.js.map +1 -0
- package/dist/src/ingestion/parsers/grok-web.d.ts +40 -0
- package/dist/src/ingestion/parsers/grok-web.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/grok-web.js +67 -0
- package/dist/src/ingestion/parsers/grok-web.js.map +1 -0
- package/dist/src/ingestion/parsers/types.d.ts +34 -0
- package/dist/src/ingestion/parsers/types.d.ts.map +1 -0
- package/dist/src/ingestion/parsers/types.js +26 -0
- package/dist/src/ingestion/parsers/types.js.map +1 -0
- package/dist/src/ingestion/scanner.d.ts +48 -0
- package/dist/src/ingestion/scanner.d.ts.map +1 -0
- package/dist/src/ingestion/scanner.js +131 -0
- package/dist/src/ingestion/scanner.js.map +1 -0
- package/dist/src/ingestion/staging.d.ts +109 -0
- package/dist/src/ingestion/staging.d.ts.map +1 -0
- package/dist/src/ingestion/staging.js +411 -0
- package/dist/src/ingestion/staging.js.map +1 -0
- package/dist/src/ingestion/watcher.d.ts +65 -0
- package/dist/src/ingestion/watcher.d.ts.map +1 -0
- package/dist/src/ingestion/watcher.js +182 -0
- package/dist/src/ingestion/watcher.js.map +1 -0
- package/dist/src/jobs/codex-override-handler.d.ts +3 -0
- package/dist/src/jobs/codex-override-handler.d.ts.map +1 -0
- package/dist/src/jobs/codex-override-handler.js +16 -0
- package/dist/src/jobs/codex-override-handler.js.map +1 -0
- package/dist/src/jobs/handlers/compact.d.ts +30 -0
- package/dist/src/jobs/handlers/compact.d.ts.map +1 -0
- package/dist/src/jobs/handlers/compact.js +329 -0
- package/dist/src/jobs/handlers/compact.js.map +1 -0
- package/dist/src/jobs/handlers/ingest.d.ts +13 -0
- package/dist/src/jobs/handlers/ingest.d.ts.map +1 -0
- package/dist/src/jobs/handlers/ingest.js +255 -0
- package/dist/src/jobs/handlers/ingest.js.map +1 -0
- package/dist/src/jobs/handlers/reconcile.d.ts +29 -0
- package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -0
- package/dist/src/jobs/handlers/reconcile.js +476 -0
- package/dist/src/jobs/handlers/reconcile.js.map +1 -0
- package/dist/src/jobs/handlers/reindex.d.ts +38 -0
- package/dist/src/jobs/handlers/reindex.d.ts.map +1 -0
- package/dist/src/jobs/handlers/reindex.js +52 -0
- package/dist/src/jobs/handlers/reindex.js.map +1 -0
- package/dist/src/jobs/handlers/save.d.ts +10 -0
- package/dist/src/jobs/handlers/save.d.ts.map +1 -0
- package/dist/src/jobs/handlers/save.js +206 -0
- package/dist/src/jobs/handlers/save.js.map +1 -0
- package/dist/src/jobs/handlers/triage.d.ts +47 -0
- package/dist/src/jobs/handlers/triage.d.ts.map +1 -0
- package/dist/src/jobs/handlers/triage.js +95 -0
- package/dist/src/jobs/handlers/triage.js.map +1 -0
- package/dist/src/jobs/queue.d.ts +107 -0
- package/dist/src/jobs/queue.d.ts.map +1 -0
- package/dist/src/jobs/queue.js +319 -0
- package/dist/src/jobs/queue.js.map +1 -0
- package/dist/src/jobs/types.d.ts +39 -0
- package/dist/src/jobs/types.d.ts.map +1 -0
- package/dist/src/jobs/types.js +29 -0
- package/dist/src/jobs/types.js.map +1 -0
- package/dist/src/jobs/worker-entry.d.ts +10 -0
- package/dist/src/jobs/worker-entry.d.ts.map +1 -0
- package/dist/src/jobs/worker-entry.js +210 -0
- package/dist/src/jobs/worker-entry.js.map +1 -0
- package/dist/src/jobs/worker-process.d.ts +50 -0
- package/dist/src/jobs/worker-process.d.ts.map +1 -0
- package/dist/src/jobs/worker-process.js +186 -0
- package/dist/src/jobs/worker-process.js.map +1 -0
- package/dist/src/jobs/worker.d.ts +11 -0
- package/dist/src/jobs/worker.d.ts.map +1 -0
- package/dist/src/jobs/worker.js +14 -0
- package/dist/src/jobs/worker.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +425 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/mcp/errors.d.ts +8 -0
- package/dist/src/mcp/errors.d.ts.map +1 -0
- package/dist/src/mcp/errors.js +50 -0
- package/dist/src/mcp/errors.js.map +1 -0
- package/dist/src/mcp/server.d.ts +10 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +94 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/context-pack.d.ts +35 -0
- package/dist/src/mcp/tools/context-pack.d.ts.map +1 -0
- package/dist/src/mcp/tools/context-pack.js +97 -0
- package/dist/src/mcp/tools/context-pack.js.map +1 -0
- package/dist/src/mcp/tools/conversations-search.d.ts +38 -0
- package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -0
- package/dist/src/mcp/tools/conversations-search.js +73 -0
- package/dist/src/mcp/tools/conversations-search.js.map +1 -0
- package/dist/src/mcp/tools/save.d.ts +32 -0
- package/dist/src/mcp/tools/save.d.ts.map +1 -0
- package/dist/src/mcp/tools/save.js +60 -0
- package/dist/src/mcp/tools/save.js.map +1 -0
- package/dist/src/mcp/tools/search.d.ts +33 -0
- package/dist/src/mcp/tools/search.d.ts.map +1 -0
- package/dist/src/mcp/tools/search.js +58 -0
- package/dist/src/mcp/tools/search.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +17 -0
- package/dist/src/mcp/tools/status.d.ts.map +1 -0
- package/dist/src/mcp/tools/status.js +12 -0
- package/dist/src/mcp/tools/status.js.map +1 -0
- package/dist/src/observability/coverage.d.ts +100 -0
- package/dist/src/observability/coverage.d.ts.map +1 -0
- package/dist/src/observability/coverage.js +180 -0
- package/dist/src/observability/coverage.js.map +1 -0
- package/dist/src/observability/rift-context.d.ts +47 -0
- package/dist/src/observability/rift-context.d.ts.map +1 -0
- package/dist/src/observability/rift-context.js +118 -0
- package/dist/src/observability/rift-context.js.map +1 -0
- package/dist/src/observability/staleness.d.ts +43 -0
- package/dist/src/observability/staleness.d.ts.map +1 -0
- package/dist/src/observability/staleness.js +74 -0
- package/dist/src/observability/staleness.js.map +1 -0
- package/dist/src/observability/tool-usage-stats.d.ts +23 -0
- package/dist/src/observability/tool-usage-stats.d.ts.map +1 -0
- package/dist/src/observability/tool-usage-stats.js +83 -0
- package/dist/src/observability/tool-usage-stats.js.map +1 -0
- package/dist/src/observability/tool-usage.d.ts +68 -0
- package/dist/src/observability/tool-usage.d.ts.map +1 -0
- package/dist/src/observability/tool-usage.js +207 -0
- package/dist/src/observability/tool-usage.js.map +1 -0
- package/dist/src/onboarding/daemon-control.d.ts +33 -0
- package/dist/src/onboarding/daemon-control.d.ts.map +1 -0
- package/dist/src/onboarding/daemon-control.js +92 -0
- package/dist/src/onboarding/daemon-control.js.map +1 -0
- package/dist/src/onboarding/env-file.d.ts +18 -0
- package/dist/src/onboarding/env-file.d.ts.map +1 -0
- package/dist/src/onboarding/env-file.js +89 -0
- package/dist/src/onboarding/env-file.js.map +1 -0
- package/dist/src/onboarding/voyage-validate.d.ts +16 -0
- package/dist/src/onboarding/voyage-validate.d.ts.map +1 -0
- package/dist/src/onboarding/voyage-validate.js +85 -0
- package/dist/src/onboarding/voyage-validate.js.map +1 -0
- package/dist/src/providers/anthropic-digest.d.ts +23 -0
- package/dist/src/providers/anthropic-digest.d.ts.map +1 -0
- package/dist/src/providers/anthropic-digest.js +91 -0
- package/dist/src/providers/anthropic-digest.js.map +1 -0
- package/dist/src/providers/codex-cli-digest.d.ts +12 -0
- package/dist/src/providers/codex-cli-digest.d.ts.map +1 -0
- package/dist/src/providers/codex-cli-digest.js +70 -0
- package/dist/src/providers/codex-cli-digest.js.map +1 -0
- package/dist/src/providers/codex-cli-metadata-extraction.d.ts +14 -0
- package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -0
- package/dist/src/providers/codex-cli-metadata-extraction.js +101 -0
- package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -0
- package/dist/src/providers/codex-cli-runner.d.ts +14 -0
- package/dist/src/providers/codex-cli-runner.d.ts.map +1 -0
- package/dist/src/providers/codex-cli-runner.js +272 -0
- package/dist/src/providers/codex-cli-runner.js.map +1 -0
- package/dist/src/providers/conversation-generation.d.ts +10 -0
- package/dist/src/providers/conversation-generation.d.ts.map +1 -0
- package/dist/src/providers/conversation-generation.js +54 -0
- package/dist/src/providers/conversation-generation.js.map +1 -0
- package/dist/src/providers/ollama-embed.d.ts +22 -0
- package/dist/src/providers/ollama-embed.d.ts.map +1 -0
- package/dist/src/providers/ollama-embed.js +133 -0
- package/dist/src/providers/ollama-embed.js.map +1 -0
- package/dist/src/providers/ollama.d.ts +42 -0
- package/dist/src/providers/ollama.d.ts.map +1 -0
- package/dist/src/providers/ollama.js +169 -0
- package/dist/src/providers/ollama.js.map +1 -0
- package/dist/src/providers/openai-metadata-extraction.d.ts +73 -0
- package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -0
- package/dist/src/providers/openai-metadata-extraction.js +161 -0
- package/dist/src/providers/openai-metadata-extraction.js.map +1 -0
- package/dist/src/providers/operator-overrides.d.ts +24 -0
- package/dist/src/providers/operator-overrides.d.ts.map +1 -0
- package/dist/src/providers/operator-overrides.js +84 -0
- package/dist/src/providers/operator-overrides.js.map +1 -0
- package/dist/src/providers/stub.d.ts +17 -0
- package/dist/src/providers/stub.d.ts.map +1 -0
- package/dist/src/providers/stub.js +72 -0
- package/dist/src/providers/stub.js.map +1 -0
- package/dist/src/providers/types.d.ts +82 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +52 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/providers/voyage.d.ts +23 -0
- package/dist/src/providers/voyage.d.ts.map +1 -0
- package/dist/src/providers/voyage.js +135 -0
- package/dist/src/providers/voyage.js.map +1 -0
- package/dist/src/retrieval/compact.d.ts +89 -0
- package/dist/src/retrieval/compact.d.ts.map +1 -0
- package/dist/src/retrieval/compact.js +348 -0
- package/dist/src/retrieval/compact.js.map +1 -0
- package/dist/src/retrieval/context-pack.d.ts +123 -0
- package/dist/src/retrieval/context-pack.d.ts.map +1 -0
- package/dist/src/retrieval/context-pack.js +553 -0
- package/dist/src/retrieval/context-pack.js.map +1 -0
- package/dist/src/retrieval/cwd.d.ts +25 -0
- package/dist/src/retrieval/cwd.d.ts.map +1 -0
- package/dist/src/retrieval/cwd.js +48 -0
- package/dist/src/retrieval/cwd.js.map +1 -0
- package/dist/src/retrieval/degraded.d.ts +20 -0
- package/dist/src/retrieval/degraded.d.ts.map +1 -0
- package/dist/src/retrieval/degraded.js +43 -0
- package/dist/src/retrieval/degraded.js.map +1 -0
- package/dist/src/retrieval/hybrid.d.ts +38 -0
- package/dist/src/retrieval/hybrid.d.ts.map +1 -0
- package/dist/src/retrieval/hybrid.js +82 -0
- package/dist/src/retrieval/hybrid.js.map +1 -0
- package/dist/src/retrieval/lexical.d.ts +28 -0
- package/dist/src/retrieval/lexical.d.ts.map +1 -0
- package/dist/src/retrieval/lexical.js +301 -0
- package/dist/src/retrieval/lexical.js.map +1 -0
- package/dist/src/retrieval/post-filter.d.ts +32 -0
- package/dist/src/retrieval/post-filter.d.ts.map +1 -0
- package/dist/src/retrieval/post-filter.js +57 -0
- package/dist/src/retrieval/post-filter.js.map +1 -0
- package/dist/src/retrieval/reranker.d.ts +72 -0
- package/dist/src/retrieval/reranker.d.ts.map +1 -0
- package/dist/src/retrieval/reranker.js +129 -0
- package/dist/src/retrieval/reranker.js.map +1 -0
- package/dist/src/retrieval/vector.d.ts +47 -0
- package/dist/src/retrieval/vector.d.ts.map +1 -0
- package/dist/src/retrieval/vector.js +112 -0
- package/dist/src/retrieval/vector.js.map +1 -0
- package/dist/src/runtime/legacy-migration.d.ts +27 -0
- package/dist/src/runtime/legacy-migration.d.ts.map +1 -0
- package/dist/src/runtime/legacy-migration.js +140 -0
- package/dist/src/runtime/legacy-migration.js.map +1 -0
- package/dist/src/runtime/legacy-name-guard.d.ts +35 -0
- package/dist/src/runtime/legacy-name-guard.d.ts.map +1 -0
- package/dist/src/runtime/legacy-name-guard.js +58 -0
- package/dist/src/runtime/legacy-name-guard.js.map +1 -0
- package/dist/src/runtime/rift-env.d.ts +14 -0
- package/dist/src/runtime/rift-env.d.ts.map +1 -0
- package/dist/src/runtime/rift-env.js +79 -0
- package/dist/src/runtime/rift-env.js.map +1 -0
- package/dist/src/runtime/watcher-startup.d.ts +2 -0
- package/dist/src/runtime/watcher-startup.d.ts.map +1 -0
- package/dist/src/runtime/watcher-startup.js +4 -0
- package/dist/src/runtime/watcher-startup.js.map +1 -0
- package/dist/src/security/archive.d.ts +23 -0
- package/dist/src/security/archive.d.ts.map +1 -0
- package/dist/src/security/archive.js +163 -0
- package/dist/src/security/archive.js.map +1 -0
- package/dist/src/security/paths.d.ts +21 -0
- package/dist/src/security/paths.d.ts.map +1 -0
- package/dist/src/security/paths.js +67 -0
- package/dist/src/security/paths.js.map +1 -0
- package/dist/src/server/app.d.ts +29 -0
- package/dist/src/server/app.d.ts.map +1 -0
- package/dist/src/server/app.js +226 -0
- package/dist/src/server/app.js.map +1 -0
- package/dist/src/server/build-info.d.ts +8 -0
- package/dist/src/server/build-info.d.ts.map +1 -0
- package/dist/src/server/build-info.js +61 -0
- package/dist/src/server/build-info.js.map +1 -0
- package/dist/src/server/lifecycle.d.ts +30 -0
- package/dist/src/server/lifecycle.d.ts.map +1 -0
- package/dist/src/server/lifecycle.js +59 -0
- package/dist/src/server/lifecycle.js.map +1 -0
- package/dist/src/server/middleware/multipart.d.ts +51 -0
- package/dist/src/server/middleware/multipart.d.ts.map +1 -0
- package/dist/src/server/middleware/multipart.js +86 -0
- package/dist/src/server/middleware/multipart.js.map +1 -0
- package/dist/src/server/routes/compact.d.ts +37 -0
- package/dist/src/server/routes/compact.d.ts.map +1 -0
- package/dist/src/server/routes/compact.js +77 -0
- package/dist/src/server/routes/compact.js.map +1 -0
- package/dist/src/server/routes/context.d.ts +5 -0
- package/dist/src/server/routes/context.d.ts.map +1 -0
- package/dist/src/server/routes/context.js +50 -0
- package/dist/src/server/routes/context.js.map +1 -0
- package/dist/src/server/routes/conversations-search.d.ts +4 -0
- package/dist/src/server/routes/conversations-search.d.ts.map +1 -0
- package/dist/src/server/routes/conversations-search.js +243 -0
- package/dist/src/server/routes/conversations-search.js.map +1 -0
- package/dist/src/server/routes/friend-status.d.ts +72 -0
- package/dist/src/server/routes/friend-status.d.ts.map +1 -0
- package/dist/src/server/routes/friend-status.js +71 -0
- package/dist/src/server/routes/friend-status.js.map +1 -0
- package/dist/src/server/routes/ingest.d.ts +15 -0
- package/dist/src/server/routes/ingest.d.ts.map +1 -0
- package/dist/src/server/routes/ingest.js +139 -0
- package/dist/src/server/routes/ingest.js.map +1 -0
- package/dist/src/server/routes/jobs.d.ts +10 -0
- package/dist/src/server/routes/jobs.d.ts.map +1 -0
- package/dist/src/server/routes/jobs.js +29 -0
- package/dist/src/server/routes/jobs.js.map +1 -0
- package/dist/src/server/routes/mcp-usage.d.ts +13 -0
- package/dist/src/server/routes/mcp-usage.d.ts.map +1 -0
- package/dist/src/server/routes/mcp-usage.js +17 -0
- package/dist/src/server/routes/mcp-usage.js.map +1 -0
- package/dist/src/server/routes/reconcile.d.ts +4 -0
- package/dist/src/server/routes/reconcile.d.ts.map +1 -0
- package/dist/src/server/routes/reconcile.js +43 -0
- package/dist/src/server/routes/reconcile.js.map +1 -0
- package/dist/src/server/routes/reindex.d.ts +4 -0
- package/dist/src/server/routes/reindex.d.ts.map +1 -0
- package/dist/src/server/routes/reindex.js +74 -0
- package/dist/src/server/routes/reindex.js.map +1 -0
- package/dist/src/server/routes/save.d.ts +40 -0
- package/dist/src/server/routes/save.d.ts.map +1 -0
- package/dist/src/server/routes/save.js +112 -0
- package/dist/src/server/routes/save.js.map +1 -0
- package/dist/src/server/routes/search.d.ts +5 -0
- package/dist/src/server/routes/search.d.ts.map +1 -0
- package/dist/src/server/routes/search.js +400 -0
- package/dist/src/server/routes/search.js.map +1 -0
- package/dist/src/server/routes/stats.d.ts +10 -0
- package/dist/src/server/routes/stats.d.ts.map +1 -0
- package/dist/src/server/routes/stats.js +15 -0
- package/dist/src/server/routes/stats.js.map +1 -0
- package/dist/src/server/routes/status.d.ts +20 -0
- package/dist/src/server/routes/status.d.ts.map +1 -0
- package/dist/src/server/routes/status.js +31 -0
- package/dist/src/server/routes/status.js.map +1 -0
- package/dist/src/server/routes/triage.d.ts +4 -0
- package/dist/src/server/routes/triage.d.ts.map +1 -0
- package/dist/src/server/routes/triage.js +94 -0
- package/dist/src/server/routes/triage.js.map +1 -0
- package/dist/src/server/save-quality.d.ts +21 -0
- package/dist/src/server/save-quality.d.ts.map +1 -0
- package/dist/src/server/save-quality.js +51 -0
- package/dist/src/server/save-quality.js.map +1 -0
- package/dist/src/storage/atomic.d.ts +8 -0
- package/dist/src/storage/atomic.d.ts.map +1 -0
- package/dist/src/storage/atomic.js +22 -0
- package/dist/src/storage/atomic.js.map +1 -0
- package/dist/src/storage/db.d.ts +15 -0
- package/dist/src/storage/db.d.ts.map +1 -0
- package/dist/src/storage/db.js +43 -0
- package/dist/src/storage/db.js.map +1 -0
- package/dist/src/storage/integrity.d.ts +11 -0
- package/dist/src/storage/integrity.d.ts.map +1 -0
- package/dist/src/storage/integrity.js +66 -0
- package/dist/src/storage/integrity.js.map +1 -0
- package/dist/src/storage/rebuild.d.ts +37 -0
- package/dist/src/storage/rebuild.d.ts.map +1 -0
- package/dist/src/storage/rebuild.js +353 -0
- package/dist/src/storage/rebuild.js.map +1 -0
- package/dist/src/storage/shadow-swap.d.ts +20 -0
- package/dist/src/storage/shadow-swap.d.ts.map +1 -0
- package/dist/src/storage/shadow-swap.js +163 -0
- package/dist/src/storage/shadow-swap.js.map +1 -0
- package/dist/src/storage/tables.d.ts +77 -0
- package/dist/src/storage/tables.d.ts.map +1 -0
- package/dist/src/storage/tables.js +196 -0
- package/dist/src/storage/tables.js.map +1 -0
- package/package.json +45 -14
- package/index.js +0 -3
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rift feedback "<note>" [--kind worked|broke|surprised|idea] [--with-status]`
|
|
3
|
+
* `rift feedback --history`
|
|
4
|
+
*
|
|
5
|
+
* Local JSONL row at `<data_dir>/observability/feedback.jsonl` is canonical.
|
|
6
|
+
* Relay POST is best-effort and only fires when `feedback-config.json`
|
|
7
|
+
* marks the install opted-in. The friend sees one line of confirmation
|
|
8
|
+
* naming whether the row was relayed or stored locally.
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { Command, Option } from "commander";
|
|
13
|
+
import { CliError, resolveBaseUrl } from "../http-client.js";
|
|
14
|
+
import { loadConfig } from "../../config/loader.js";
|
|
15
|
+
import { getBuildInfo } from "../../server/build-info.js";
|
|
16
|
+
import { loadFeedbackConfig } from "../feedback/feedback-config.js";
|
|
17
|
+
import { FEEDBACK_KINDS, isFeedbackKind, } from "../feedback/feedback-payload.js";
|
|
18
|
+
import { postFeedback } from "../feedback/feedback-relay.js";
|
|
19
|
+
import { buildStatusSnapshot } from "../feedback/feedback-status.js";
|
|
20
|
+
import { renderHistory } from "../feedback/feedback-history.js";
|
|
21
|
+
export function makeFeedbackCommand() {
|
|
22
|
+
const cmd = new Command("feedback")
|
|
23
|
+
.description("Send a quick note to Clem (or store it locally).")
|
|
24
|
+
.argument("[note...]", "Free-text note (omit with --history)")
|
|
25
|
+
.addOption(new Option("--kind <kind>", "Tag the note").choices([...FEEDBACK_KINDS]))
|
|
26
|
+
.option("--with-status", "Attach a sanitized status snapshot (no paths, no content)", false)
|
|
27
|
+
.option("--history", "Print local feedback rows", false)
|
|
28
|
+
.action(async function (noteParts) {
|
|
29
|
+
const opts = this.opts();
|
|
30
|
+
const globalOpts = this.parent?.opts() ?? {};
|
|
31
|
+
const deps = resolveDefaultDeps(globalOpts);
|
|
32
|
+
await runFeedback(noteParts.join(" ").trim(), opts, deps);
|
|
33
|
+
});
|
|
34
|
+
return cmd;
|
|
35
|
+
}
|
|
36
|
+
export async function runFeedback(note, opts, deps) {
|
|
37
|
+
const emit = deps.emit ?? ((line) => process.stdout.write(`${line}\n`));
|
|
38
|
+
if (opts.history) {
|
|
39
|
+
renderHistory(deps.dataDir, emit);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!note) {
|
|
43
|
+
throw new CliError('Pass a note: rift feedback "this worked" --kind=worked', "validation");
|
|
44
|
+
}
|
|
45
|
+
const kind = resolveKind(opts.kind);
|
|
46
|
+
const config = loadFeedbackConfig(deps.dataDir);
|
|
47
|
+
const build = getBuildInfo();
|
|
48
|
+
const ts = (deps.now ? deps.now() : new Date()).toISOString();
|
|
49
|
+
const payload = {
|
|
50
|
+
ts,
|
|
51
|
+
...(config.installation_id ? { installation_id: config.installation_id } : {}),
|
|
52
|
+
kind,
|
|
53
|
+
note,
|
|
54
|
+
version: build.version,
|
|
55
|
+
commit: build.commit,
|
|
56
|
+
node: build.node,
|
|
57
|
+
};
|
|
58
|
+
if (opts.withStatus) {
|
|
59
|
+
payload.status_snapshot = await buildStatusSnapshot({
|
|
60
|
+
dataDir: deps.dataDir,
|
|
61
|
+
baseUrl: deps.baseUrl,
|
|
62
|
+
...(deps.fetchFn ? { fetchFn: deps.fetchFn } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
appendLocalRow(deps.dataDir, payload);
|
|
66
|
+
const relay = await maybeRelay(payload, config, deps);
|
|
67
|
+
emit(formatConfirmation(relay, config.enabled));
|
|
68
|
+
}
|
|
69
|
+
function resolveKind(raw) {
|
|
70
|
+
if (!raw)
|
|
71
|
+
return "idea";
|
|
72
|
+
if (!isFeedbackKind(raw)) {
|
|
73
|
+
throw new CliError(`Unknown --kind "${raw}". Use one of: ${FEEDBACK_KINDS.join(", ")}.`, "validation");
|
|
74
|
+
}
|
|
75
|
+
return raw;
|
|
76
|
+
}
|
|
77
|
+
function appendLocalRow(dataDir, payload) {
|
|
78
|
+
const dir = path.join(dataDir, "observability");
|
|
79
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
80
|
+
const file = path.join(dir, "feedback.jsonl");
|
|
81
|
+
fs.appendFileSync(file, `${JSON.stringify(payload)}\n`, {
|
|
82
|
+
encoding: "utf8",
|
|
83
|
+
mode: 0o600,
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
fs.chmodSync(file, 0o600);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best-effort permission fix
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function maybeRelay(payload, config, deps) {
|
|
93
|
+
if (!config.enabled || !config.url) {
|
|
94
|
+
return { attempted: false, ok: false };
|
|
95
|
+
}
|
|
96
|
+
return postFeedback(payload, {
|
|
97
|
+
url: config.url,
|
|
98
|
+
...(config.hmac_secret ? { hmacSecret: config.hmac_secret } : {}),
|
|
99
|
+
...(deps.fetchFn ? { fetchFn: deps.fetchFn } : {}),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function formatConfirmation(relay, optedIn) {
|
|
103
|
+
if (!relay.attempted) {
|
|
104
|
+
return optedIn
|
|
105
|
+
? "Thanks. (Stored locally — relay opt-in incomplete.)"
|
|
106
|
+
: "Thanks. (Stored locally — opt in to relay via `rift onboard`.)";
|
|
107
|
+
}
|
|
108
|
+
return relay.ok
|
|
109
|
+
? "Thanks. (Sent to Clem.)"
|
|
110
|
+
: "Thanks. (Stored locally — relay POST failed.)";
|
|
111
|
+
}
|
|
112
|
+
function resolveDefaultDeps(globalOpts) {
|
|
113
|
+
const configPath = path.resolve(globalOpts.config ?? "config.json");
|
|
114
|
+
const config = loadConfig(configPath);
|
|
115
|
+
const dataDir = path.resolve(config.data_paths.data_dir);
|
|
116
|
+
let baseUrl;
|
|
117
|
+
try {
|
|
118
|
+
baseUrl = resolveBaseUrl(configPath);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
baseUrl = null;
|
|
122
|
+
}
|
|
123
|
+
return { dataDir, baseUrl };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AA0BhE,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;SAChC,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC7D,SAAS,CACR,IAAI,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CACzE;SACA,MAAM,CACL,eAAe,EACf,2DAA2D,EAC3D,KAAK,CACN;SACA,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,KAAK,WAA0B,SAAmB;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAgB,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAc,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,IAAkB,EAClB,IAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IAExE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAChB,wDAAwD,EACxD,YAAY,CACb,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9D,MAAM,OAAO,GAAoB;QAC/B,EAAE;QACF,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;IAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CAAC,eAAe,GAAG,MAAM,mBAAmB,CAAC;YAClD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC;IACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,GAAG,kBAAkB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACpE,YAAY,CACb,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAAwB;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAChD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC9C,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE;QACtD,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAwB,EACxB,MAA6C,EAC7C,IAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAkB,EAAE,OAAgB;IAC9D,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,OAAO;YACZ,CAAC,CAAC,qDAAqD;YACvD,CAAC,CAAC,gEAAgE,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC,EAAE;QACb,CAAC,CAAC,yBAAyB;QAC3B,CAAC,CAAC,+CAA+C,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAsB;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { HookClientId, HookWriteOutcome } from "../hooks-writers/index.js";
|
|
3
|
+
interface RunOptions {
|
|
4
|
+
client?: HookClientId;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface HooksInstallDeps {
|
|
8
|
+
/** Override `$HOME` (test injection). */
|
|
9
|
+
homeDir?: string;
|
|
10
|
+
/** Test injection: stable timestamp for backup IDs. */
|
|
11
|
+
now?: () => Date;
|
|
12
|
+
/** Test injection: where stdout writes go. */
|
|
13
|
+
emit?: (line: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function makeHooksInstallCommand(): Command;
|
|
16
|
+
export declare function makeHooksCommand(): Command;
|
|
17
|
+
export declare function runHooksInstall(opts: RunOptions, deps: HooksInstallDeps): Promise<HookWriteOutcome>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=hooks-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-install.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/hooks-install.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAS5C,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAEnC,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CA0BjD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAqC3B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rift hooks install --client <id> [--dry-run]`
|
|
3
|
+
*
|
|
4
|
+
* Installs the Rift policy hook into a known agent's settings file.
|
|
5
|
+
* Currently only `claude-code` is supported. Idempotent — re-running
|
|
6
|
+
* with the same package version is a no-op when the hook is already
|
|
7
|
+
* up-to-date.
|
|
8
|
+
*
|
|
9
|
+
* For Claude Code the install:
|
|
10
|
+
* 1. Writes `~/.claude/hooks/rift-policy.mjs` (a small Node ESM script
|
|
11
|
+
* with no third-party deps — no `jq` required).
|
|
12
|
+
* 2. Adds a PreToolUse matcher entry to `~/.claude/settings.json`
|
|
13
|
+
* that runs the script for `mcp__rift__rift_*` tools.
|
|
14
|
+
*
|
|
15
|
+
* The script enforces: `rift_context_pack` must be the first Rift
|
|
16
|
+
* retrieval call per session. `rift_search` and
|
|
17
|
+
* `rift_conversations_search` are blocked until the pack runs (exit 2).
|
|
18
|
+
*
|
|
19
|
+
* Disable knobs:
|
|
20
|
+
* - `RIFT_POLICY_DISABLED=1` env var → script no-ops.
|
|
21
|
+
* - Remove the matcher entry from `settings.json`.
|
|
22
|
+
*/
|
|
23
|
+
import os from "node:os";
|
|
24
|
+
import { Command, Option } from "commander";
|
|
25
|
+
import { CliError } from "../http-client.js";
|
|
26
|
+
import { ALL_HOOK_CLIENTS, HooksParseFailedError, isHookClientId, writeHookConfig, } from "../hooks-writers/index.js";
|
|
27
|
+
export function makeHooksInstallCommand() {
|
|
28
|
+
return new Command("install")
|
|
29
|
+
.description("Install the Rift policy hook into a known agent's settings file.")
|
|
30
|
+
.addOption(new Option("--client <id>", "Target client (claude-code)").choices([
|
|
31
|
+
...ALL_HOOK_CLIENTS,
|
|
32
|
+
]))
|
|
33
|
+
.option("--dry-run", "Print the outcome without writing", false)
|
|
34
|
+
.action(async function () {
|
|
35
|
+
const runOpts = this.opts();
|
|
36
|
+
try {
|
|
37
|
+
await runHooksInstall(runOpts, {});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const msg = err instanceof CliError
|
|
41
|
+
? err.message
|
|
42
|
+
: err instanceof Error
|
|
43
|
+
? err.message
|
|
44
|
+
: String(err);
|
|
45
|
+
process.stderr.write(`rift hooks install failed: ${msg}\n`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function makeHooksCommand() {
|
|
51
|
+
const hooks = new Command("hooks").description("Manage agent hook integrations for Rift.");
|
|
52
|
+
hooks.addCommand(makeHooksInstallCommand());
|
|
53
|
+
return hooks;
|
|
54
|
+
}
|
|
55
|
+
export async function runHooksInstall(opts, deps) {
|
|
56
|
+
const emit = deps.emit ?? ((line) => process.stdout.write(`${line}\n`));
|
|
57
|
+
if (!opts.client) {
|
|
58
|
+
throw new CliError(`Pass --client <id> (one of: ${ALL_HOOK_CLIENTS.join(", ")}).`, "validation");
|
|
59
|
+
}
|
|
60
|
+
if (!isHookClientId(opts.client)) {
|
|
61
|
+
throw new CliError("Unknown --client value.", "validation");
|
|
62
|
+
}
|
|
63
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
64
|
+
let outcome;
|
|
65
|
+
try {
|
|
66
|
+
outcome = writeHookConfig({
|
|
67
|
+
client: opts.client,
|
|
68
|
+
homeDir,
|
|
69
|
+
dryRun: !!opts.dryRun,
|
|
70
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof HooksParseFailedError) {
|
|
75
|
+
// Path-free + content-free by construction; pass through.
|
|
76
|
+
emit(err.message);
|
|
77
|
+
throw new CliError("rift hooks install: existing settings file unparseable.", "validation");
|
|
78
|
+
}
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
printSummary(emit, opts.client, outcome);
|
|
82
|
+
return outcome;
|
|
83
|
+
}
|
|
84
|
+
function printSummary(emit, client, outcome) {
|
|
85
|
+
const verb = outcome.dryRun
|
|
86
|
+
? "Would install"
|
|
87
|
+
: outcome.hookEntryAdded || outcome.hookEntryReplaced || outcome.scriptUpdated
|
|
88
|
+
? "Installed"
|
|
89
|
+
: "Already up-to-date";
|
|
90
|
+
emit(`${verb} Rift policy hook for ${client}.`);
|
|
91
|
+
emit(` Script: ${outcome.scriptPath}`);
|
|
92
|
+
emit(` Settings: ${outcome.settingsPath}`);
|
|
93
|
+
if (outcome.hookEntryAdded)
|
|
94
|
+
emit(" PreToolUse entry: added");
|
|
95
|
+
if (outcome.hookEntryReplaced)
|
|
96
|
+
emit(" PreToolUse entry: updated");
|
|
97
|
+
if (outcome.scriptUpdated && !outcome.dryRun)
|
|
98
|
+
emit(" Script: written");
|
|
99
|
+
if (outcome.backupId)
|
|
100
|
+
emit(` Backup ID: ${outcome.backupId}`);
|
|
101
|
+
emit(" Disable knobs: RIFT_POLICY_DISABLED=1 in env, or remove the matcher entry.");
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=hooks-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-install.js","sourceRoot":"","sources":["../../../../src/cli/commands/hooks-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAoBnC,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CACV,kEAAkE,CACnE;SACA,SAAS,CACR,IAAI,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC;QACjE,GAAG,gBAAgB;KACpB,CAAC,CACH;SACA,MAAM,CAAC,WAAW,EAAE,mCAAmC,EAAE,KAAK,CAAC;SAC/D,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAc,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GACP,GAAG,YAAY,QAAQ;gBACrB,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,GAAG,YAAY,KAAK;oBACpB,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC;YAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAC5C,0CAA0C,CAC3C,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAgB,EAChB,IAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAChB,+BAA+B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAC9D,YAAY,CACb,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAE7C,IAAI,OAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,GAAG,eAAe,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;YACrB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,0DAA0D;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,MAAM,IAAI,QAAQ,CAChB,yDAAyD,EACzD,YAAY,CACb,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CACnB,IAA4B,EAC5B,MAAoB,EACpB,OAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;QACzB,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,aAAa;YAC5E,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,oBAAoB,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,yBAAyB,MAAM,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,eAAe,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,cAAc;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,iBAAiB;QAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,QAAQ;QAAE,IAAI,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,IAAI,CACF,8EAA8E,CAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type SupportedIngestSource } from "../../ingestion/parsers/types.js";
|
|
3
|
+
export interface SniffResult {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
/** When `ok` is false, a one-line operator-friendly hint. */
|
|
6
|
+
hint?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Inspect a zip export's top-level entry names against the canonical
|
|
10
|
+
* markers for `source`. Returns `ok: true` when the layout looks
|
|
11
|
+
* right; returns a hint pointing at the likely correct source when
|
|
12
|
+
* the layout matches a different one (or none).
|
|
13
|
+
*
|
|
14
|
+
* Pure (no I/O outside the passed-in entry name list) so it stays
|
|
15
|
+
* unit-testable without zip fixtures.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sniffZipEntries(entryNames: string[], source: SupportedIngestSource): SniffResult;
|
|
18
|
+
export declare function makeImportCommand(): Command;
|
|
19
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/import.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAY1C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,qBAAqB,GAC5B,WAAW,CA8Fb;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAsB3C"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rift import <export>` — friend-grade wrapper around POST /ingest.
|
|
3
|
+
*
|
|
4
|
+
* Slice 3. Wraps the existing `rift ingest` flow with:
|
|
5
|
+
* - source default (`chatgpt_web`) so the common case is one arg
|
|
6
|
+
* - structural sniff for zip exports: open the archive, read entry
|
|
7
|
+
* names, bail early with a "looks like a <other> export" hint if
|
|
8
|
+
* the canonical marker for `--source` is missing
|
|
9
|
+
* - friendlier polling output and a final one-line summary
|
|
10
|
+
*
|
|
11
|
+
* The internal `rift ingest` command still exists for scripted use
|
|
12
|
+
* (multipart upload + idempotency-key passthrough). Friend onboarding
|
|
13
|
+
* and the install flow point at `rift import`.
|
|
14
|
+
*/
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { Command } from "commander";
|
|
18
|
+
import AdmZip from "adm-zip";
|
|
19
|
+
import { CliError, createHttpClient, readToken, resolveBaseUrl, } from "../http-client.js";
|
|
20
|
+
import { pollJob } from "../job-poller.js";
|
|
21
|
+
import { isJobFailure, printError, printJson, printJobResult, } from "../output.js";
|
|
22
|
+
import { SUPPORTED_INGEST_SOURCES, } from "../../ingestion/parsers/types.js";
|
|
23
|
+
import { SOURCE_EXTENSIONS } from "../../ingestion/staging.js";
|
|
24
|
+
const DEFAULT_SOURCE = "chatgpt_web";
|
|
25
|
+
/**
|
|
26
|
+
* Inspect a zip export's top-level entry names against the canonical
|
|
27
|
+
* markers for `source`. Returns `ok: true` when the layout looks
|
|
28
|
+
* right; returns a hint pointing at the likely correct source when
|
|
29
|
+
* the layout matches a different one (or none).
|
|
30
|
+
*
|
|
31
|
+
* Pure (no I/O outside the passed-in entry name list) so it stays
|
|
32
|
+
* unit-testable without zip fixtures.
|
|
33
|
+
*/
|
|
34
|
+
export function sniffZipEntries(entryNames, source) {
|
|
35
|
+
const names = entryNames.map((n) => n.toLowerCase());
|
|
36
|
+
const has = (re) => names.some((n) => re.test(n));
|
|
37
|
+
const grokMarker = /(^|\/)prod-grok-backend\.json$/;
|
|
38
|
+
// ChatGPT-only sidecars (verified from real exports). `user.json` is
|
|
39
|
+
// singular; Claude's metadata file is `users.json` (plural) — that
|
|
40
|
+
// plural-vs-singular distinction is the load-bearing signal.
|
|
41
|
+
const chatgptOnlyMarker = /(^|\/)(chat\.html|user\.json|message_feedback\.json|model_comparisons\.json|shared_conversations\.json)$/;
|
|
42
|
+
// ChatGPT chunked layout: conversations-001.json etc. — never produced
|
|
43
|
+
// by Claude.
|
|
44
|
+
const chatgptChunkedMarker = /(^|\/)conversations-\d+\.json$/;
|
|
45
|
+
// Claude-only metadata files (verified from real exports).
|
|
46
|
+
const claudeOnlyMarker = /(^|\/)(projects\.json|users\.json)$/;
|
|
47
|
+
// Plain `conversations.json` — present in both ChatGPT and Claude
|
|
48
|
+
// exports, so on its own it cannot disambiguate.
|
|
49
|
+
const conversationsJson = /(^|\/)conversations\.json$/;
|
|
50
|
+
const looksLikeGrok = has(grokMarker);
|
|
51
|
+
const looksLikeChatgpt = has(chatgptOnlyMarker) || has(chatgptChunkedMarker);
|
|
52
|
+
const looksLikeClaude = has(claudeOnlyMarker);
|
|
53
|
+
const hasConversationsJson = has(conversationsJson);
|
|
54
|
+
switch (source) {
|
|
55
|
+
case "chatgpt_web":
|
|
56
|
+
if (looksLikeGrok) {
|
|
57
|
+
return { ok: false, hint: "looks like a Grok export — try --source grok_web" };
|
|
58
|
+
}
|
|
59
|
+
if (looksLikeClaude) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
hint: "looks like a Claude export — try --source claude_web",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (looksLikeChatgpt)
|
|
66
|
+
return { ok: true };
|
|
67
|
+
// Bare `conversations.json` with no ChatGPT-only sidecars and no
|
|
68
|
+
// Claude-only sidecars: ambiguous. Refuse rather than risk an
|
|
69
|
+
// import that yields zero rows because the JSON shape is wrong
|
|
70
|
+
// for the chosen parser.
|
|
71
|
+
if (hasConversationsJson) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
hint: "found conversations.json but no ChatGPT sidecars — if it's a Claude export, pass --source claude_web; otherwise --no-sniff to override",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
hint: "no recognizable export markers found at zip root — pass the right --source",
|
|
80
|
+
};
|
|
81
|
+
case "claude_web":
|
|
82
|
+
if (looksLikeGrok) {
|
|
83
|
+
return { ok: false, hint: "looks like a Grok export — try --source grok_web" };
|
|
84
|
+
}
|
|
85
|
+
if (looksLikeChatgpt) {
|
|
86
|
+
return {
|
|
87
|
+
ok: false,
|
|
88
|
+
hint: "looks like a ChatGPT export — try --source chatgpt_web",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Either Claude-only sidecars or a bare conversations.json (which
|
|
92
|
+
// for a friend who explicitly chose --source claude_web is fine).
|
|
93
|
+
if (looksLikeClaude || hasConversationsJson)
|
|
94
|
+
return { ok: true };
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
hint: "no conversations.json found in zip — pass the right --source",
|
|
98
|
+
};
|
|
99
|
+
case "grok_web":
|
|
100
|
+
if (looksLikeGrok)
|
|
101
|
+
return { ok: true };
|
|
102
|
+
if (looksLikeChatgpt) {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
hint: "looks like a ChatGPT export — try --source chatgpt_web",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (looksLikeClaude) {
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
hint: "looks like a Claude export — try --source claude_web",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
ok: false,
|
|
116
|
+
hint: "no prod-grok-backend.json found in zip",
|
|
117
|
+
};
|
|
118
|
+
case "gemini_web":
|
|
119
|
+
// Gemini's `.zip` path doesn't exist (SOURCE_EXTENSIONS only allows
|
|
120
|
+
// .json). Defensive: if a zip is somehow passed, redirect.
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
hint: "Gemini exports are JSON only — pass the .json file directly",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function makeImportCommand() {
|
|
128
|
+
return new Command("import")
|
|
129
|
+
.description("Import a conversation export (ChatGPT/Claude/Grok zip, or Gemini JSON)")
|
|
130
|
+
.argument("<file>", "Path to export file (.zip or .json)")
|
|
131
|
+
.option("--source <source>", `Source: ${SUPPORTED_INGEST_SOURCES.join(" | ")} (default: ${DEFAULT_SOURCE})`, DEFAULT_SOURCE)
|
|
132
|
+
.option("--idempotency-key <key>", "Idempotency key")
|
|
133
|
+
.option("--no-sniff", "Skip the structural sniff (zip-only) and trust --source")
|
|
134
|
+
.action(async (file, opts, cmd) => {
|
|
135
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
136
|
+
try {
|
|
137
|
+
await runImport(file, opts, globalOpts);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
printError(err instanceof CliError || err instanceof Error ? err.message : String(err));
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async function runImport(file, opts, globalOpts) {
|
|
146
|
+
// --- Validate source ---
|
|
147
|
+
if (!SUPPORTED_INGEST_SOURCES.includes(opts.source)) {
|
|
148
|
+
printError(`Unsupported source "${opts.source}". Supported: ${SUPPORTED_INGEST_SOURCES.join(", ")}.`);
|
|
149
|
+
process.exitCode = 1;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const source = opts.source;
|
|
153
|
+
// --- Resolve + validate file ---
|
|
154
|
+
const filePath = path.resolve(file);
|
|
155
|
+
if (!fs.existsSync(filePath)) {
|
|
156
|
+
printError(`File not found: ${filePath}`);
|
|
157
|
+
process.exitCode = 1;
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const stat = fs.statSync(filePath);
|
|
161
|
+
if (!stat.isFile()) {
|
|
162
|
+
printError(`Not a file: ${filePath}`);
|
|
163
|
+
process.exitCode = 1;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
167
|
+
const allowed = SOURCE_EXTENSIONS[source];
|
|
168
|
+
if (!allowed.includes(ext)) {
|
|
169
|
+
printError(`${source} expects ${allowed.join(" or ")} — got "${ext}".`);
|
|
170
|
+
process.exitCode = 1;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// --- Structural sniff (zip only, opt-out via --no-sniff) ---
|
|
174
|
+
if (ext === ".zip" && opts.sniff !== false) {
|
|
175
|
+
const sniff = sniffFile(filePath, source);
|
|
176
|
+
if (!sniff.ok) {
|
|
177
|
+
printError(`This doesn't look like a ${source} export — ${sniff.hint}.`);
|
|
178
|
+
process.exitCode = 1;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// --- Auth + daemon ---
|
|
183
|
+
const baseUrl = resolveBaseUrl(globalOpts.config);
|
|
184
|
+
const token = await readToken();
|
|
185
|
+
if (!token) {
|
|
186
|
+
printError("No auth token. Run: rift token issue");
|
|
187
|
+
process.exitCode = 1;
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const client = createHttpClient({ baseUrl, token });
|
|
191
|
+
// --- Submit ---
|
|
192
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
193
|
+
const form = new FormData();
|
|
194
|
+
form.append("source", source);
|
|
195
|
+
form.append("file", new Blob([fileBuffer]), path.basename(filePath));
|
|
196
|
+
if (opts.idempotencyKey)
|
|
197
|
+
form.append("idempotency_key", opts.idempotencyKey);
|
|
198
|
+
const submitted = (await client.postMultipart("/ingest", form)).data;
|
|
199
|
+
if (submitted.duplicate) {
|
|
200
|
+
if (globalOpts.json) {
|
|
201
|
+
printJson(submitted);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
process.stdout.write(`Already imported (job ${submitted.job_id}). Skipping.\n`);
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (!globalOpts.json) {
|
|
209
|
+
process.stderr.write(`Importing ${path.basename(filePath)} as ${source} (job ${submitted.job_id})…\n`);
|
|
210
|
+
}
|
|
211
|
+
// --- Poll ---
|
|
212
|
+
const result = await pollJob({
|
|
213
|
+
get: client.get.bind(client),
|
|
214
|
+
jobId: submitted.job_id,
|
|
215
|
+
onProgress: (job) => {
|
|
216
|
+
if (globalOpts.json)
|
|
217
|
+
return;
|
|
218
|
+
// JobStatusView doesn't carry counts yet; render the status churn
|
|
219
|
+
// on a single line so the friend sees the daemon is alive.
|
|
220
|
+
const tty = process.stderr.isTTY === true;
|
|
221
|
+
const line = ` [${job.status}] job ${job.id}`;
|
|
222
|
+
process.stderr.write(tty ? `\r\x1b[2K${line}` : `${line}\n`);
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
// Newline after the last \r-redrawn status line.
|
|
226
|
+
if (!globalOpts.json && process.stderr.isTTY === true) {
|
|
227
|
+
process.stderr.write("\n");
|
|
228
|
+
}
|
|
229
|
+
if (globalOpts.json) {
|
|
230
|
+
printJson(result.job);
|
|
231
|
+
}
|
|
232
|
+
else if (isJobFailure(result.job, result.timedOut)) {
|
|
233
|
+
printJobResult(result.job, result.timedOut);
|
|
234
|
+
process.stderr.write("If the failure mentions parsing or quarantine, re-run with --source set to the right exporter.\n");
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
process.stdout.write(`✓ Imported (job ${result.job.id}). Try: rift search "<topic>"\n`);
|
|
238
|
+
}
|
|
239
|
+
if (isJobFailure(result.job, result.timedOut))
|
|
240
|
+
process.exitCode = 1;
|
|
241
|
+
}
|
|
242
|
+
function sniffFile(zipPath, source) {
|
|
243
|
+
let entries;
|
|
244
|
+
try {
|
|
245
|
+
entries = new AdmZip(zipPath)
|
|
246
|
+
.getEntries()
|
|
247
|
+
.filter((e) => !e.isDirectory)
|
|
248
|
+
.map((e) => e.entryName);
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return {
|
|
252
|
+
ok: false,
|
|
253
|
+
hint: `couldn't open the zip (${err instanceof Error ? err.message : String(err)})`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return sniffZipEntries(entries, source);
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../../src/cli/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,iBAAiB,IAAI,OAAO,CAsD3C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { createHttpClient, readToken, resolveBaseUrl, CliError } from "../http-client.js";
|
|
5
|
+
import { pollJob } from "../job-poller.js";
|
|
6
|
+
import { printError, printJson, printJobResult, isJobFailure } from "../output.js";
|
|
7
|
+
// Web-conversation ingest only understands JSON exports (raw or zipped).
|
|
8
|
+
// Reject other formats locally so the operator gets immediate feedback
|
|
9
|
+
// instead of a 400 from the daemon (or, worse, a silent no-op job).
|
|
10
|
+
const SUPPORTED_INGEST_EXTENSIONS = new Set([".json", ".zip"]);
|
|
11
|
+
export function makeIngestCommand() {
|
|
12
|
+
return new Command("ingest")
|
|
13
|
+
.description("Import a conversation export (zip or JSON)")
|
|
14
|
+
.requiredOption("--source <source>", "Source (chatgpt_web)")
|
|
15
|
+
.requiredOption("--file <path>", "Path to export file (.json or .zip)")
|
|
16
|
+
.option("--idempotency-key <key>", "Idempotency key")
|
|
17
|
+
.action(async (opts, cmd) => {
|
|
18
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
19
|
+
try {
|
|
20
|
+
const baseUrl = resolveBaseUrl(globalOpts.config);
|
|
21
|
+
const token = await readToken();
|
|
22
|
+
if (!token) {
|
|
23
|
+
printError("No auth token. Run: rift token issue");
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const filePath = path.resolve(opts.file);
|
|
28
|
+
if (!fs.existsSync(filePath)) {
|
|
29
|
+
printError(`File not found: ${filePath}`);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
34
|
+
if (!SUPPORTED_INGEST_EXTENSIONS.has(ext)) {
|
|
35
|
+
printError(`Unsupported file extension "${ext}". ` +
|
|
36
|
+
`Allowed: ${[...SUPPORTED_INGEST_EXTENSIONS].join(", ")}.`);
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const client = createHttpClient({ baseUrl, token });
|
|
41
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
42
|
+
const form = new FormData();
|
|
43
|
+
form.append("source", opts.source);
|
|
44
|
+
form.append("file", new Blob([fileBuffer]), path.basename(filePath));
|
|
45
|
+
if (opts.idempotencyKey)
|
|
46
|
+
form.append("idempotency_key", opts.idempotencyKey);
|
|
47
|
+
const { data } = await client.postMultipart("/ingest", form);
|
|
48
|
+
const resp = data;
|
|
49
|
+
if (resp.duplicate) {
|
|
50
|
+
if (globalOpts.json) {
|
|
51
|
+
printJson(resp);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
process.stdout.write(`Duplicate job: ${resp.job_id}\n`);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
process.stderr.write(`Job ${resp.job_id} submitted. Polling...\n`);
|
|
59
|
+
const result = await pollJob({ get: client.get.bind(client), jobId: resp.job_id });
|
|
60
|
+
if (globalOpts.json) {
|
|
61
|
+
printJson(result.job);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
printJobResult(result.job, result.timedOut);
|
|
65
|
+
}
|
|
66
|
+
if (isJobFailure(result.job, result.timedOut))
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (err instanceof CliError) {
|
|
71
|
+
printError(err.message);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
printError(err instanceof Error ? err.message : String(err));
|
|
75
|
+
}
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=ingest.js.map
|