@getrift/rift 0.1.0-beta.1 → 0.1.0-beta.10

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.
Files changed (178) hide show
  1. package/README.md +154 -0
  2. package/dist/src/auth/keychain.d.ts +9 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -1
  4. package/dist/src/auth/keychain.js +37 -0
  5. package/dist/src/auth/keychain.js.map +1 -1
  6. package/dist/src/capture/recover-quarantine.d.ts +221 -0
  7. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  8. package/dist/src/capture/recover-quarantine.js +453 -0
  9. package/dist/src/capture/recover-quarantine.js.map +1 -0
  10. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  11. package/dist/src/cli/commands/backfill.js +5 -2
  12. package/dist/src/cli/commands/backfill.js.map +1 -1
  13. package/dist/src/cli/commands/capture-recover.d.ts +12 -0
  14. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  15. package/dist/src/cli/commands/capture-recover.js +120 -0
  16. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  17. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  18. package/dist/src/cli/commands/capture.js +10 -4
  19. package/dist/src/cli/commands/capture.js.map +1 -1
  20. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  21. package/dist/src/cli/commands/feedback.js +6 -2
  22. package/dist/src/cli/commands/feedback.js.map +1 -1
  23. package/dist/src/cli/commands/mcp-install.js +5 -2
  24. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  25. package/dist/src/cli/commands/onboard.d.ts +24 -0
  26. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  27. package/dist/src/cli/commands/onboard.js +119 -21
  28. package/dist/src/cli/commands/onboard.js.map +1 -1
  29. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  30. package/dist/src/cli/commands/rebuild.js +6 -3
  31. package/dist/src/cli/commands/rebuild.js.map +1 -1
  32. package/dist/src/cli/commands/review.d.ts.map +1 -1
  33. package/dist/src/cli/commands/review.js +22 -7
  34. package/dist/src/cli/commands/review.js.map +1 -1
  35. package/dist/src/cli/commands/status.d.ts.map +1 -1
  36. package/dist/src/cli/commands/status.js +48 -2
  37. package/dist/src/cli/commands/status.js.map +1 -1
  38. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  39. package/dist/src/cli/commands/token-issue.js +9 -1
  40. package/dist/src/cli/commands/token-issue.js.map +1 -1
  41. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  42. package/dist/src/cli/commands/triage.js +7 -5
  43. package/dist/src/cli/commands/triage.js.map +1 -1
  44. package/dist/src/cli/commands/update.d.ts +26 -0
  45. package/dist/src/cli/commands/update.d.ts.map +1 -0
  46. package/dist/src/cli/commands/update.js +130 -0
  47. package/dist/src/cli/commands/update.js.map +1 -0
  48. package/dist/src/cli/default-config-path.d.ts +15 -0
  49. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  50. package/dist/src/cli/default-config-path.js +27 -0
  51. package/dist/src/cli/default-config-path.js.map +1 -0
  52. package/dist/src/cli/http-client.d.ts +56 -1
  53. package/dist/src/cli/http-client.d.ts.map +1 -1
  54. package/dist/src/cli/http-client.js +140 -4
  55. package/dist/src/cli/http-client.js.map +1 -1
  56. package/dist/src/cli/index.d.ts.map +1 -1
  57. package/dist/src/cli/index.js +25 -6
  58. package/dist/src/cli/index.js.map +1 -1
  59. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  60. package/dist/src/cli/status/friend-header.js +117 -7
  61. package/dist/src/cli/status/friend-header.js.map +1 -1
  62. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  63. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  64. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  65. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  66. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  67. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  68. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  69. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  70. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  71. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  72. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  73. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  74. package/dist/src/ingestion/inbox-core/index.d.ts +19 -0
  75. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  76. package/dist/src/ingestion/inbox-core/index.js +19 -0
  77. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  78. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  79. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  80. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  81. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  82. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  83. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  84. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  85. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  86. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  87. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  88. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  89. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  90. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  91. package/dist/src/ingestion/inbox-watcher.js +34 -50
  92. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  93. package/dist/src/ingestion/indexer.d.ts +7 -0
  94. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  95. package/dist/src/ingestion/indexer.js +36 -2
  96. package/dist/src/ingestion/indexer.js.map +1 -1
  97. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  98. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  99. package/dist/src/ingestion/metadata-extraction.js +24 -5
  100. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  101. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  102. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  103. package/dist/src/ingestion/skip-quarantine.js +35 -0
  104. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  105. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  106. package/dist/src/jobs/handlers/compact.js +25 -4
  107. package/dist/src/jobs/handlers/compact.js.map +1 -1
  108. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  109. package/dist/src/jobs/handlers/ingest.js +49 -24
  110. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  111. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  112. package/dist/src/jobs/handlers/reconcile.js +30 -8
  113. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  114. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  115. package/dist/src/jobs/handlers/reindex.js +12 -2
  116. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  117. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  118. package/dist/src/jobs/handlers/save.js +9 -2
  119. package/dist/src/jobs/handlers/save.js.map +1 -1
  120. package/dist/src/jobs/queue.d.ts +11 -0
  121. package/dist/src/jobs/queue.d.ts.map +1 -1
  122. package/dist/src/jobs/queue.js +18 -0
  123. package/dist/src/jobs/queue.js.map +1 -1
  124. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  125. package/dist/src/jobs/worker-entry.js +2 -0
  126. package/dist/src/jobs/worker-entry.js.map +1 -1
  127. package/dist/src/main.js +36 -4
  128. package/dist/src/main.js.map +1 -1
  129. package/dist/src/observability/embedding-events.d.ts +52 -0
  130. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  131. package/dist/src/observability/embedding-events.js +149 -0
  132. package/dist/src/observability/embedding-events.js.map +1 -0
  133. package/dist/src/observability/index-events.d.ts +70 -0
  134. package/dist/src/observability/index-events.d.ts.map +1 -0
  135. package/dist/src/observability/index-events.js +148 -0
  136. package/dist/src/observability/index-events.js.map +1 -0
  137. package/dist/src/observability/tool-usage-stats.d.ts +7 -0
  138. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  139. package/dist/src/observability/tool-usage-stats.js +41 -5
  140. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  141. package/dist/src/observability/tool-usage.d.ts +7 -7
  142. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  143. package/dist/src/observability/tool-usage.js +78 -39
  144. package/dist/src/observability/tool-usage.js.map +1 -1
  145. package/dist/src/observability/version-check.d.ts +70 -0
  146. package/dist/src/observability/version-check.d.ts.map +1 -0
  147. package/dist/src/observability/version-check.js +197 -0
  148. package/dist/src/observability/version-check.js.map +1 -0
  149. package/dist/src/providers/ollama-embed.d.ts +2 -1
  150. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  151. package/dist/src/providers/ollama-embed.js +1 -0
  152. package/dist/src/providers/ollama-embed.js.map +1 -1
  153. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  154. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  155. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  156. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  157. package/dist/src/providers/stub.d.ts +2 -0
  158. package/dist/src/providers/stub.d.ts.map +1 -1
  159. package/dist/src/providers/stub.js +2 -0
  160. package/dist/src/providers/stub.js.map +1 -1
  161. package/dist/src/providers/types.d.ts +11 -0
  162. package/dist/src/providers/types.d.ts.map +1 -1
  163. package/dist/src/providers/voyage.d.ts +2 -1
  164. package/dist/src/providers/voyage.d.ts.map +1 -1
  165. package/dist/src/providers/voyage.js +1 -0
  166. package/dist/src/providers/voyage.js.map +1 -1
  167. package/dist/src/server/app.d.ts.map +1 -1
  168. package/dist/src/server/app.js +67 -1
  169. package/dist/src/server/app.js.map +1 -1
  170. package/dist/src/server/routes/friend-status.d.ts +202 -3
  171. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  172. package/dist/src/server/routes/friend-status.js +290 -7
  173. package/dist/src/server/routes/friend-status.js.map +1 -1
  174. package/dist/src/storage/rebuild.d.ts +14 -1
  175. package/dist/src/storage/rebuild.d.ts.map +1 -1
  176. package/dist/src/storage/rebuild.js +160 -34
  177. package/dist/src/storage/rebuild.js.map +1 -1
  178. package/package.json +1 -1
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
+ import { realpathSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
3
5
  import { getBuildInfo } from "../server/build-info.js";
6
+ import { defaultConfigPath } from "./default-config-path.js";
4
7
  import { makeTokenIssueCommand } from "./commands/token-issue.js";
5
8
  import { makeStatusCommand } from "./commands/status.js";
6
9
  import { makeStatsCommand } from "./commands/stats.js";
@@ -22,12 +25,13 @@ import { makeMcpCommand } from "./commands/mcp-install.js";
22
25
  import { makeHooksCommand } from "./commands/hooks-install.js";
23
26
  import { makeFeedbackCommand } from "./commands/feedback.js";
24
27
  import { makeUninstallCommand } from "./commands/uninstall.js";
28
+ import { makeUpdateCommand } from "./commands/update.js";
25
29
  export function createProgram() {
26
30
  const program = new Command()
27
31
  .name("rift")
28
32
  .description("CLI for the Rift daemon")
29
33
  .version(getBuildInfo().version)
30
- .option("--config <path>", "Path to config.json", "config.json")
34
+ .option("--config <path>", "Path to config.json", defaultConfigPath())
31
35
  .option("--json", "Output as JSON", false);
32
36
  const tokenCmd = new Command("token").description("Token management");
33
37
  tokenCmd.addCommand(makeTokenIssueCommand());
@@ -52,14 +56,29 @@ export function createProgram() {
52
56
  program.addCommand(makeHooksCommand());
53
57
  program.addCommand(makeFeedbackCommand());
54
58
  program.addCommand(makeUninstallCommand());
59
+ program.addCommand(makeUpdateCommand());
55
60
  return program;
56
61
  }
57
62
  // Only run when executed directly (not when imported for testing).
58
- const isDirectExecution = typeof process !== "undefined" &&
59
- process.argv[1] &&
60
- (process.argv[1].endsWith("/cli/index.js") ||
61
- process.argv[1].endsWith("/cli/index.ts"));
62
- if (isDirectExecution) {
63
+ // Compare the realpath of the running script against the realpath of
64
+ // process.argv[1]. This handles the npm-global `bin/rift` symlink case:
65
+ // when invoked as `~/.npm-global/bin/rift`, argv[1] is the symlink path
66
+ // (does not end in `/cli/index.js`), but its realpath resolves to the
67
+ // actual cli/index.js file. Without this realpath compare, every
68
+ // fresh-install CLI invocation silently no-ops.
69
+ function isDirectExecution() {
70
+ if (typeof process === "undefined" || !process.argv[1])
71
+ return false;
72
+ try {
73
+ const me = realpathSync(fileURLToPath(import.meta.url));
74
+ const invoked = realpathSync(process.argv[1]);
75
+ return me === invoked;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ if (isDirectExecution()) {
63
82
  createProgram().parseAsync().catch((err) => {
64
83
  process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
65
84
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,yBAAyB,CAAC;SACtC,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC;SAC/B,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtE,QAAQ,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE7B,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mEAAmE;AACnE,qEAAqE;AACrE,wEAAwE;AACxE,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AACjE,gDAAgD;AAChD,SAAS,iBAAiB;IACxB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,EAAE,KAAK,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,iBAAiB,EAAE,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC/D,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"friend-header.d.ts","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,yEAAyE;IACzE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qDAAqD;IACrD,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA0CrE;AA6ED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUtD"}
1
+ {"version":3,"file":"friend-header.d.ts","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,yEAAyE;IACzE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qDAAqD;IACrD,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA4DrE;AAkLD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUtD"}
@@ -11,20 +11,43 @@ export function renderFriendHeader(input) {
11
11
  lines.push(`Rift v${status.build.version} · daemon: running (uptime ${formatDuration(status.daemon.uptime_seconds)}) · port ${status.daemon.port} ${status.daemon.voyage_key_present ? "✓" : "✗"}`);
12
12
  // 2. voyage
13
13
  lines.push(renderVoyageLine(input, now));
14
- // 3. codex
14
+ // 3. index — distinct from voyage: an embed can succeed but the
15
+ // downstream LanceDB write can still fail (schema, lock, IO).
16
+ // Without this line the user has no signal that "embedded" does not
17
+ // imply "searchable yet".
18
+ lines.push(renderIndexLine(status.index, now));
19
+ // 4. inbox — surfaces drop-folder freshness. Distinct from index:
20
+ // a watcher-fed write can succeed at the index lane without ever
21
+ // having processed an inbox file. This line is the user-visible
22
+ // confirmation that the inbox path itself is wired up and current.
23
+ lines.push(renderInboxLine(status.inbox, now));
24
+ // 5. codex
15
25
  lines.push(renderCodexLine(status.codex, now));
16
- // 4. capture
26
+ // 6. capture
17
27
  lines.push(renderCaptureLine(status.capture, now));
18
- // 5. MCP
28
+ // 7. MCP
19
29
  lines.push(renderMcpLine(input.mcpClients));
20
- // 6. feedback
30
+ // 8. feedback
21
31
  lines.push(`Feedback: ${status.feedback.relay_enabled
22
32
  ? "relay on (local JSONL + Clem-side relay)"
23
33
  : "relay off (local JSONL only) — opt in via rift onboard"}`);
34
+ // 9. update — surfaced only when the daemon's last probe found a
35
+ // newer beta. Probe failures and up-to-date installs print nothing
36
+ // so npm reachability cannot make Rift look broken.
37
+ const updateLine = renderUpdateLine(status.update);
38
+ if (updateLine)
39
+ lines.push(updateLine);
24
40
  lines.push("");
25
41
  lines.push(`Next: ${decideNextLine({ status, mcpClients: input.mcpClients })}`);
26
42
  return lines;
27
43
  }
44
+ function renderUpdateLine(update) {
45
+ if (!update.available)
46
+ return null;
47
+ if (!update.latest_beta)
48
+ return null;
49
+ return `Update: available ${update.installed} → ${update.latest_beta} — run: rift update`;
50
+ }
28
51
  function renderVoyageLine(input, now) {
29
52
  const { status, voyageLast4 } = input;
30
53
  if (!status)
@@ -39,7 +62,45 @@ function renderVoyageLine(input, now) {
39
62
  const embedSuffix = status.voyage.last_embed_at
40
63
  ? `, last embed ${formatAge(status.voyage.last_embed_at, now)}`
41
64
  : "";
42
- return `Voyage: key valid (${last4}${embedSuffix})${labelSuffix}`;
65
+ const errorSuffix = status.voyage.last_error_at
66
+ ? ` · last error ${formatAge(status.voyage.last_error_at, now)} (${status.voyage.last_error_reason ?? "unknown"})`
67
+ : "";
68
+ return `Voyage: key valid (${last4}${embedSuffix})${labelSuffix}${errorSuffix}`;
69
+ }
70
+ function renderIndexLine(index, now) {
71
+ if (index.last_update_at === null && index.last_error_at === null) {
72
+ return "Index: no writes yet";
73
+ }
74
+ const updateSuffix = index.last_update_at
75
+ ? `last update ${formatAge(index.last_update_at, now)}`
76
+ : "no writes yet";
77
+ const errorSuffix = index.last_error_at
78
+ ? ` · last error ${formatAge(index.last_error_at, now)} (${index.last_error_reason ?? "unknown"})`
79
+ : "";
80
+ return `Index: ${updateSuffix}${errorSuffix}`;
81
+ }
82
+ function renderInboxLine(inbox, now) {
83
+ // Older daemons (pre-this-slice) don't ship an `inbox` block. Treat
84
+ // the missing block exactly as "idle" — the line stays present and
85
+ // the CLI never crashes on a cross-version mismatch.
86
+ if (!inbox ||
87
+ (inbox.last_import_at === null &&
88
+ inbox.last_error_at === null &&
89
+ inbox.pending === 0)) {
90
+ return "Inbox: nothing dropped yet — drop a web export under data/inbox/";
91
+ }
92
+ const parts = [];
93
+ if (inbox.last_import_at) {
94
+ parts.push(`last import ${formatAge(inbox.last_import_at, now)}`);
95
+ }
96
+ if (inbox.pending > 0) {
97
+ parts.push(`${inbox.pending} pending`);
98
+ }
99
+ const head = parts.length > 0 ? parts.join(" · ") : "idle";
100
+ const errorSuffix = inbox.last_error_at
101
+ ? ` · last error ${formatAge(inbox.last_error_at, now)} (${inbox.last_error_reason ?? "unknown"})`
102
+ : "";
103
+ return `Inbox: ${head}${errorSuffix}`;
43
104
  }
44
105
  function renderCodexLine(codex, now) {
45
106
  if (codex.last_preflight_at === null) {
@@ -52,13 +113,29 @@ function renderCodexLine(codex, now) {
52
113
  }
53
114
  function renderCaptureLine(capture, now) {
54
115
  if (capture.last_run_at === null) {
55
- return "Capture: no runs yet";
116
+ const nextOnly = formatNextRunSuffix(capture.next_run_at, now);
117
+ return nextOnly
118
+ ? `Capture: no runs yet · ${nextOnly}`
119
+ : "Capture: no runs yet";
56
120
  }
57
121
  const age = formatAge(capture.last_run_at, now);
58
122
  const quarantinedSuffix = capture.last_quarantined > 0
59
123
  ? ` · ${capture.last_quarantined} quarantined`
60
124
  : "";
61
- return `Capture: last run ${age} — ${capture.last_saved} saved · ${capture.last_review} review · ${capture.last_errors} failed${quarantinedSuffix}`;
125
+ const nextSuffix = formatNextRunSuffix(capture.next_run_at, now);
126
+ const nextPart = nextSuffix ? ` · ${nextSuffix}` : "";
127
+ return `Capture: last run ${age} — ${capture.last_saved} saved · ${capture.last_review} review · ${capture.last_errors} failed${quarantinedSuffix}${nextPart}`;
128
+ }
129
+ function formatNextRunSuffix(iso, now) {
130
+ if (!iso)
131
+ return null;
132
+ const then = Date.parse(iso);
133
+ if (Number.isNaN(then))
134
+ return null;
135
+ const deltaSeconds = Math.round((then - now) / 1000);
136
+ if (deltaSeconds <= 0)
137
+ return "next tick due";
138
+ return `next in ${formatDuration(deltaSeconds)}`;
62
139
  }
63
140
  function renderMcpLine(clients) {
64
141
  if (clients.length === 0)
@@ -76,6 +153,23 @@ function decideNextLine(input) {
76
153
  if (status.codex.last_preflight_ok === false) {
77
154
  return "Codex auth expired → run: codex login";
78
155
  }
156
+ if (status.voyage.last_error_at) {
157
+ return `Voyage embedding errors in last 24h (${status.voyage.last_error_reason ?? "unknown"}) → run: rift feedback --kind=broke --with-status`;
158
+ }
159
+ if (status.index.last_error_at) {
160
+ return `Index write errors in last 24h (${status.index.last_error_reason ?? "unknown"}) → run: rift feedback --kind=broke --with-status`;
161
+ }
162
+ // Inbox import failures are usually the user's own drop being rejected
163
+ // (malformed export, corrupted ZIP, unsupported source). The fix is on
164
+ // their side — re-drop a fresh export — not in the feedback flow.
165
+ // We deliberately do NOT name `data/quarantine/`: pre-parse failures
166
+ // (e.g. corrupted ZIPs that throw inside extractArchive) never write
167
+ // a quarantine record, so the path would point at an empty folder.
168
+ // Only the parser-level per-conversation failures land there, and
169
+ // the user doesn't need to disambiguate before re-dropping.
170
+ if (status.inbox && status.inbox.last_error_at) {
171
+ return `Inbox import errors in last 24h (${status.inbox.last_error_reason ?? "unknown"}) → re-drop a fresh export under data/inbox/`;
172
+ }
79
173
  if (status.capture.last_errors > 0) {
80
174
  return "Capture errors detected → run: rift feedback --kind=broke --with-status";
81
175
  }
@@ -83,6 +177,22 @@ function decideNextLine(input) {
83
177
  if (missing.length > 0) {
84
178
  return `MCP not installed for ${missing.join(", ")} → run: rift mcp install --client=${missing[0]}`;
85
179
  }
180
+ // Quarantined oversized Codex sessions are a graceful skip, not an
181
+ // error — so they don't bump `last_errors`. But they are silent data
182
+ // loss until an operator either raises the threshold or accepts the
183
+ // gap, so the Next: line must surface them instead of "nothing broken."
184
+ if (status.capture.last_quarantined > 0) {
185
+ const n = status.capture.last_quarantined;
186
+ return `${n} Codex session${n === 1 ? "" : "s"} quarantined (>8 MB) — raise capture.codex_cli.max_session_bytes in config.json and restart, or accept the gap`;
187
+ }
188
+ // Update available wins over "nothing broken" — a friend who runs
189
+ // status precisely to find out what to do next should see the update
190
+ // hint surfaced as the action, not buried under "all green." It is
191
+ // still strictly below every real error branch above, so a broken
192
+ // daemon never prefers an update suggestion over a Voyage/Index fix.
193
+ if (status.update.available && status.update.latest_beta) {
194
+ return `Update available (${status.update.installed} → ${status.update.latest_beta}) → run: rift update`;
195
+ }
86
196
  return 'nothing broken. Try rift search "<topic>".';
87
197
  }
88
198
  export function formatAge(iso, now) {
@@ -1 +1 @@
1
- {"version":3,"file":"friend-header.js","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"friend-header.js","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function stableConversationRowId(source: string, conversationId: string): string;
2
+ //# sourceMappingURL=conversation-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-key.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-key.ts"],"names":[],"mappings":"AAwBA,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,MAAM,CAMR"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stable row id for an indexed conversation.
3
+ *
4
+ * Pure: takes the source provider name and the provider's own
5
+ * conversation id, returns a deterministic row id. No filesystem,
6
+ * no clock, no random input.
7
+ *
8
+ * The key is `sha256("${source}:${conversationId}").slice(0, 32)` so:
9
+ * - re-imports of the same conversation (e.g. monthly full-export
10
+ * from ChatGPT/Claude/Grok/Gemini that re-includes everything
11
+ * the user has) collapse to the same row id and short-circuit
12
+ * on the existing "skip if already indexed" replay guard;
13
+ * - the same conversation id from two providers (Grok and Gemini
14
+ * both expose plain UUID-shaped ids) cannot collide because
15
+ * `source` is part of the hash input.
16
+ *
17
+ * Note: this dedupe is skip-if-exists. A conversation that has
18
+ * grown new messages between two exports keeps its older
19
+ * snapshot until a future refresh-on-grow slice lands. The
20
+ * duplicate-rows correctness gap is what this helper closes;
21
+ * stale-content is tracked separately.
22
+ */
23
+ import crypto from "node:crypto";
24
+ export function stableConversationRowId(source, conversationId) {
25
+ return crypto
26
+ .createHash("sha256")
27
+ .update(`${source}:${conversationId}`)
28
+ .digest("hex")
29
+ .slice(0, 32);
30
+ }
31
+ //# sourceMappingURL=conversation-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-key.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,cAAsB;IAEtB,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SUPPORTED_INBOX_EXTENSIONS: ReadonlySet<string>;
2
+ export declare function isSupportedInboxExtension(filePath: string): boolean;
3
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/extensions.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAGzD,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Inbox file extension policy.
3
+ *
4
+ * Web conversation exports are always JSON or an archive of JSON.
5
+ * Markdown / images / arbitrary text are rejected at the watcher
6
+ * boundary so they never reach the parser layer.
7
+ */
8
+ import path from "node:path";
9
+ export const SUPPORTED_INBOX_EXTENSIONS = new Set([
10
+ ".json",
11
+ ".zip",
12
+ ]);
13
+ export function isSupportedInboxExtension(filePath) {
14
+ return SUPPORTED_INBOX_EXTENSIONS.has(path.extname(filePath).toLowerCase());
15
+ }
16
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IACrE,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,OAAO,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function inboxIdempotencyKey(filePath: string, mtimeMs: number): string;
2
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/idempotency.ts"],"names":[],"mappings":"AAcA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Stable idempotency key for a file dropped into an inbox folder.
3
+ *
4
+ * Pure: takes path + mtime as input, does no filesystem access. The
5
+ * caller (Rift adapter or a future standalone shell) is responsible
6
+ * for stat'ing the file.
7
+ *
8
+ * The key combines path and mtimeMs so re-dropping the same filename
9
+ * with new content gets a fresh key, while a watcher restart on
10
+ * unchanged files produces the same key and short-circuits as a
11
+ * duplicate at the queue layer.
12
+ */
13
+ import crypto from "node:crypto";
14
+ export function inboxIdempotencyKey(filePath, mtimeMs) {
15
+ const hash = crypto
16
+ .createHash("sha256")
17
+ .update(`${filePath}:${mtimeMs}`)
18
+ .digest("hex")
19
+ .slice(0, 16);
20
+ return `inbox:${hash}`;
21
+ }
22
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,IAAI,GAAG,MAAM;SAChB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;SAChC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,SAAS,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * inbox-core — pure file-detection primitives for an inbox watcher.
3
+ *
4
+ * Carved as a seam so the same logic can power both Rift's
5
+ * inbox-watcher.ts (which hands off to the job queue + ingest route)
6
+ * and a future standalone "AI Chat Backup Inbox" shell (which hands
7
+ * off to a local archive folder, with optional Rift indexing).
8
+ *
9
+ * Invariant: this module has zero Rift internals — no Fastify, no
10
+ * LanceDB, no Voyage, no JobQueue, no config loader, no parser
11
+ * registry. Only `node:` stdlib. The adapter wires it up.
12
+ */
13
+ export { inboxIdempotencyKey } from "./idempotency.js";
14
+ export { stableConversationRowId } from "./conversation-key.js";
15
+ export { detectSourceFromSubdir } from "./source-detection.js";
16
+ export { SUPPORTED_INBOX_EXTENSIONS, isSupportedInboxExtension, } from "./extensions.js";
17
+ export { sniffInboxSource, type SniffedProvider } from "./source-sniffer.js";
18
+ export { readZipCentralDirectoryFilenames, sniffProviderFromZipEntries, sniffZipBuffer, } from "./zip-sniffer.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,cAAc,GACf,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * inbox-core — pure file-detection primitives for an inbox watcher.
3
+ *
4
+ * Carved as a seam so the same logic can power both Rift's
5
+ * inbox-watcher.ts (which hands off to the job queue + ingest route)
6
+ * and a future standalone "AI Chat Backup Inbox" shell (which hands
7
+ * off to a local archive folder, with optional Rift indexing).
8
+ *
9
+ * Invariant: this module has zero Rift internals — no Fastify, no
10
+ * LanceDB, no Voyage, no JobQueue, no config loader, no parser
11
+ * registry. Only `node:` stdlib. The adapter wires it up.
12
+ */
13
+ export { inboxIdempotencyKey } from "./idempotency.js";
14
+ export { stableConversationRowId } from "./conversation-key.js";
15
+ export { detectSourceFromSubdir } from "./source-detection.js";
16
+ export { SUPPORTED_INBOX_EXTENSIONS, isSupportedInboxExtension, } from "./extensions.js";
17
+ export { sniffInboxSource } from "./source-sniffer.js";
18
+ export { readZipCentralDirectoryFilenames, sniffProviderFromZipEntries, sniffZipBuffer, } from "./zip-sniffer.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,cAAc,GACf,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function detectSourceFromSubdir(filePath: string, inboxDir: string, knownSources: readonly string[]): string | null;
2
+ //# sourceMappingURL=source-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-detection.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/source-detection.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,GAAG,IAAI,CAWf"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Subdirectory-based source detection for inbox drops.
3
+ *
4
+ * If `data/inbox/<source>/file.json` exists and `<source>` is in
5
+ * `knownSources`, the source is `<source>`. Otherwise returns null
6
+ * and the caller decides on a default.
7
+ *
8
+ * Pure: no filesystem access, no Rift coupling. `knownSources` is
9
+ * passed in so the standalone shell can supply its own provider list
10
+ * without dragging in `parsers/types.ts`.
11
+ */
12
+ import path from "node:path";
13
+ export function detectSourceFromSubdir(filePath, inboxDir, knownSources) {
14
+ const relative = path.relative(inboxDir, filePath);
15
+ const firstSegment = relative.split(path.sep)[0];
16
+ if (firstSegment &&
17
+ firstSegment !== path.basename(filePath) &&
18
+ knownSources.includes(firstSegment)) {
19
+ return firstSegment;
20
+ }
21
+ return null;
22
+ }
23
+ //# sourceMappingURL=source-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-detection.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/source-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,QAAgB,EAChB,YAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IACE,YAAY;QACZ,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type SniffedProvider = "claude_web" | "grok_web" | "gemini_web";
2
+ /**
3
+ * Attempt to identify a non-ChatGPT provider for a file dropped in
4
+ * the inbox root. Returns null if no confident match — caller should
5
+ * fall back to its default (chatgpt_web in Rift's adapter).
6
+ *
7
+ * `data` may be undefined when the caller has only the filename
8
+ * (e.g., before reading the file). Filename-only heuristics still run.
9
+ */
10
+ export declare function sniffInboxSource(filename: string, data?: Buffer, peekBytes?: number): SniffedProvider | null;
11
+ //# sourceMappingURL=source-sniffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-sniffer.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/source-sniffer.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,CAAC;AAIvE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,GAAE,MAA2B,GACrC,eAAe,GAAG,IAAI,CAuCxB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Conservative content/filename sniffer for inbox drops.
3
+ *
4
+ * Purpose: when a file lands in the inbox root (no subdirectory hint),
5
+ * identify non-ChatGPT providers so they reach the right parser
6
+ * instead of silently failing under the ChatGPT default.
7
+ *
8
+ * Design: identify ONLY non-default providers (claude_web, grok_web,
9
+ * gemini_web). ChatGPT shapes are not matched here — the adapter's
10
+ * default fallback already handles them. Returning null means "no
11
+ * confident match; let the caller decide."
12
+ *
13
+ * Heuristics are cheap and ordered most-specific first:
14
+ * 1. Filename pattern (no I/O)
15
+ * 2. JSON content head substring match (bounded peek)
16
+ *
17
+ * Pure: no filesystem access, no Rift internals. The buffer is passed
18
+ * in by the caller — Rift's adapter reads with `fs`, a standalone
19
+ * shell would read however it likes.
20
+ */
21
+ import path from "node:path";
22
+ import { sniffZipBuffer } from "./zip-sniffer.js";
23
+ const DEFAULT_PEEK_BYTES = 64 * 1024;
24
+ /**
25
+ * Attempt to identify a non-ChatGPT provider for a file dropped in
26
+ * the inbox root. Returns null if no confident match — caller should
27
+ * fall back to its default (chatgpt_web in Rift's adapter).
28
+ *
29
+ * `data` may be undefined when the caller has only the filename
30
+ * (e.g., before reading the file). Filename-only heuristics still run.
31
+ */
32
+ export function sniffInboxSource(filename, data, peekBytes = DEFAULT_PEEK_BYTES) {
33
+ const fnameLower = path.basename(filename).toLowerCase();
34
+ const ext = path.extname(fnameLower);
35
+ // --- Filename hints (cheap, no I/O) ---
36
+ if (fnameLower.startsWith("prod-grok-backend"))
37
+ return "grok_web";
38
+ if (fnameLower.includes("claude"))
39
+ return "claude_web";
40
+ if (fnameLower.includes("takeout"))
41
+ return "gemini_web";
42
+ // --- Content hints ---
43
+ if (!data || data.length === 0)
44
+ return null;
45
+ // ZIPs: walk the central directory and match on marker filenames.
46
+ // We never decompress here — the parser layer handles extraction.
47
+ if (ext === ".zip") {
48
+ return sniffZipBuffer(data);
49
+ }
50
+ if (ext !== ".json")
51
+ return null;
52
+ const head = data.subarray(0, Math.min(peekBytes, data.length)).toString("utf-8");
53
+ // Claude exports always carry chat_messages arrays on every conversation.
54
+ if (head.includes('"chat_messages"'))
55
+ return "claude_web";
56
+ // Gemini activity cards carry timestamp_text or assistant_turns.
57
+ if (head.includes('"timestamp_text"') || head.includes('"assistant_turns"')) {
58
+ return "gemini_web";
59
+ }
60
+ // Grok exports nest responses[] inside each conversation. The
61
+ // combined presence of both top-level keys is what distinguishes
62
+ // them from the (rare) ChatGPT JSON that happens to mention
63
+ // "conversations" or "responses" in isolation.
64
+ if (head.includes('"conversations"') && head.includes('"responses"')) {
65
+ return "grok_web";
66
+ }
67
+ return null;
68
+ }
69
+ //# sourceMappingURL=source-sniffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-sniffer.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/source-sniffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAAa,EACb,YAAoB,kBAAkB;IAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAErC,yCAAyC;IACzC,IAAI,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,UAAU,CAAC;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAC;IACvD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,YAAY,CAAC;IAExD,wBAAwB;IACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,kEAAkE;IAClE,kEAAkE;IAClE,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElF,0EAA0E;IAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,YAAY,CAAC;IAE1D,iEAAiE;IACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5E,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,8DAA8D;IAC9D,iEAAiE;IACjE,4DAA4D;IAC5D,+CAA+C;IAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}