@getrift/rift 0.1.0-beta.20 → 0.1.0-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/README.md +7 -3
  2. package/dist/src/capture/auto-capture.d.ts +105 -4
  3. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  4. package/dist/src/capture/auto-capture.js +313 -34
  5. package/dist/src/capture/auto-capture.js.map +1 -1
  6. package/dist/src/capture/claude-cli-triage-provider.d.ts +28 -0
  7. package/dist/src/capture/claude-cli-triage-provider.d.ts.map +1 -0
  8. package/dist/src/capture/claude-cli-triage-provider.js +88 -0
  9. package/dist/src/capture/claude-cli-triage-provider.js.map +1 -0
  10. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  11. package/dist/src/capture/codex-cli-triage-provider.js +1 -33
  12. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  13. package/dist/src/capture/cursor-capture.d.ts +89 -0
  14. package/dist/src/capture/cursor-capture.d.ts.map +1 -0
  15. package/dist/src/capture/cursor-capture.js +121 -0
  16. package/dist/src/capture/cursor-capture.js.map +1 -0
  17. package/dist/src/capture/observability.d.ts +30 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +29 -0
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/sources.d.ts +41 -3
  22. package/dist/src/capture/sources.d.ts.map +1 -1
  23. package/dist/src/capture/sources.js +43 -1
  24. package/dist/src/capture/sources.js.map +1 -1
  25. package/dist/src/capture/triage-classification.d.ts +69 -0
  26. package/dist/src/capture/triage-classification.d.ts.map +1 -0
  27. package/dist/src/capture/triage-classification.js +62 -0
  28. package/dist/src/capture/triage-classification.js.map +1 -0
  29. package/dist/src/capture/triage-provider-factory.d.ts +36 -0
  30. package/dist/src/capture/triage-provider-factory.d.ts.map +1 -0
  31. package/dist/src/capture/triage-provider-factory.js +55 -0
  32. package/dist/src/capture/triage-provider-factory.js.map +1 -0
  33. package/dist/src/capture/triage.d.ts +1 -1
  34. package/dist/src/capture/triage.d.ts.map +1 -1
  35. package/dist/src/capture/triage.js +8 -6
  36. package/dist/src/capture/triage.js.map +1 -1
  37. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  38. package/dist/src/cli/commands/capture.js +72 -17
  39. package/dist/src/cli/commands/capture.js.map +1 -1
  40. package/dist/src/cli/commands/chunk-backfill.d.ts +13 -0
  41. package/dist/src/cli/commands/chunk-backfill.d.ts.map +1 -0
  42. package/dist/src/cli/commands/chunk-backfill.js +157 -0
  43. package/dist/src/cli/commands/chunk-backfill.js.map +1 -0
  44. package/dist/src/cli/commands/cursor-probe.d.ts +20 -0
  45. package/dist/src/cli/commands/cursor-probe.d.ts.map +1 -0
  46. package/dist/src/cli/commands/cursor-probe.js +162 -0
  47. package/dist/src/cli/commands/cursor-probe.js.map +1 -0
  48. package/dist/src/cli/commands/menubar.d.ts +50 -0
  49. package/dist/src/cli/commands/menubar.d.ts.map +1 -1
  50. package/dist/src/cli/commands/menubar.js +224 -16
  51. package/dist/src/cli/commands/menubar.js.map +1 -1
  52. package/dist/src/cli/commands/onboard.d.ts +36 -7
  53. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  54. package/dist/src/cli/commands/onboard.js +256 -53
  55. package/dist/src/cli/commands/onboard.js.map +1 -1
  56. package/dist/src/cli/commands/status.d.ts.map +1 -1
  57. package/dist/src/cli/commands/status.js +16 -0
  58. package/dist/src/cli/commands/status.js.map +1 -1
  59. package/dist/src/cli/commands/update.d.ts +34 -1
  60. package/dist/src/cli/commands/update.d.ts.map +1 -1
  61. package/dist/src/cli/commands/update.js +179 -2
  62. package/dist/src/cli/commands/update.js.map +1 -1
  63. package/dist/src/cli/index.d.ts.map +1 -1
  64. package/dist/src/cli/index.js +4 -0
  65. package/dist/src/cli/index.js.map +1 -1
  66. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -1
  67. package/dist/src/cli/postinstall-menubar.js +14 -0
  68. package/dist/src/cli/postinstall-menubar.js.map +1 -1
  69. package/dist/src/cli/status/friend-header.d.ts +18 -0
  70. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  71. package/dist/src/cli/status/friend-header.js +137 -0
  72. package/dist/src/cli/status/friend-header.js.map +1 -1
  73. package/dist/src/cli/status/local-signals.d.ts +41 -0
  74. package/dist/src/cli/status/local-signals.d.ts.map +1 -1
  75. package/dist/src/cli/status/local-signals.js +48 -0
  76. package/dist/src/cli/status/local-signals.js.map +1 -1
  77. package/dist/src/config/schema.d.ts +220 -14
  78. package/dist/src/config/schema.d.ts.map +1 -1
  79. package/dist/src/config/schema.js +82 -7
  80. package/dist/src/config/schema.js.map +1 -1
  81. package/dist/src/diagnostics/claude-preflight.d.ts +34 -0
  82. package/dist/src/diagnostics/claude-preflight.d.ts.map +1 -0
  83. package/dist/src/diagnostics/claude-preflight.js +89 -0
  84. package/dist/src/diagnostics/claude-preflight.js.map +1 -0
  85. package/dist/src/diagnostics/codex-preflight.d.ts +1 -1
  86. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
  87. package/dist/src/diagnostics/codex-preflight.js +14 -0
  88. package/dist/src/diagnostics/codex-preflight.js.map +1 -1
  89. package/dist/src/diagnostics/doctor.d.ts +9 -1
  90. package/dist/src/diagnostics/doctor.d.ts.map +1 -1
  91. package/dist/src/diagnostics/doctor.js +57 -2
  92. package/dist/src/diagnostics/doctor.js.map +1 -1
  93. package/dist/src/ingestion/chunk-meta.d.ts +85 -0
  94. package/dist/src/ingestion/chunk-meta.d.ts.map +1 -0
  95. package/dist/src/ingestion/chunk-meta.js +167 -0
  96. package/dist/src/ingestion/chunk-meta.js.map +1 -0
  97. package/dist/src/ingestion/chunk-text.d.ts +39 -0
  98. package/dist/src/ingestion/chunk-text.d.ts.map +1 -0
  99. package/dist/src/ingestion/chunk-text.js +114 -0
  100. package/dist/src/ingestion/chunk-text.js.map +1 -0
  101. package/dist/src/ingestion/cursor/cursor-store.d.ts +177 -0
  102. package/dist/src/ingestion/cursor/cursor-store.d.ts.map +1 -0
  103. package/dist/src/ingestion/cursor/cursor-store.js +243 -0
  104. package/dist/src/ingestion/cursor/cursor-store.js.map +1 -0
  105. package/dist/src/ingestion/cursor/enrich-roots.d.ts +16 -0
  106. package/dist/src/ingestion/cursor/enrich-roots.d.ts.map +1 -0
  107. package/dist/src/ingestion/cursor/enrich-roots.js +22 -0
  108. package/dist/src/ingestion/cursor/enrich-roots.js.map +1 -0
  109. package/dist/src/ingestion/cursor/vscdb-reader.d.ts +32 -0
  110. package/dist/src/ingestion/cursor/vscdb-reader.d.ts.map +1 -0
  111. package/dist/src/ingestion/cursor/vscdb-reader.js +113 -0
  112. package/dist/src/ingestion/cursor/vscdb-reader.js.map +1 -0
  113. package/dist/src/ingestion/cursor/workspace-root.d.ts +96 -0
  114. package/dist/src/ingestion/cursor/workspace-root.d.ts.map +1 -0
  115. package/dist/src/ingestion/cursor/workspace-root.js +187 -0
  116. package/dist/src/ingestion/cursor/workspace-root.js.map +1 -0
  117. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  118. package/dist/src/ingestion/indexer.js +41 -32
  119. package/dist/src/ingestion/indexer.js.map +1 -1
  120. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  121. package/dist/src/jobs/handlers/compact.js +9 -4
  122. package/dist/src/jobs/handlers/compact.js.map +1 -1
  123. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  124. package/dist/src/jobs/handlers/ingest.js +60 -30
  125. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  126. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  127. package/dist/src/jobs/handlers/reconcile.js +128 -45
  128. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  129. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  130. package/dist/src/jobs/handlers/save.js +122 -72
  131. package/dist/src/jobs/handlers/save.js.map +1 -1
  132. package/dist/src/jobs/types.d.ts +1 -1
  133. package/dist/src/main.js +26 -15
  134. package/dist/src/main.js.map +1 -1
  135. package/dist/src/mcp/server.d.ts.map +1 -1
  136. package/dist/src/mcp/server.js +10 -3
  137. package/dist/src/mcp/server.js.map +1 -1
  138. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  139. package/dist/src/mcp/tools/context-pack.js +7 -1
  140. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  141. package/dist/src/mcp/tools/conversations-search.d.ts +1 -1
  142. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -1
  143. package/dist/src/mcp/tools/conversations-search.js +7 -1
  144. package/dist/src/mcp/tools/conversations-search.js.map +1 -1
  145. package/dist/src/mcp/tools/evidence-feedback.d.ts +60 -0
  146. package/dist/src/mcp/tools/evidence-feedback.d.ts.map +1 -0
  147. package/dist/src/mcp/tools/evidence-feedback.js +62 -0
  148. package/dist/src/mcp/tools/evidence-feedback.js.map +1 -0
  149. package/dist/src/mcp/tools/log-outcome.d.ts +72 -0
  150. package/dist/src/mcp/tools/log-outcome.d.ts.map +1 -0
  151. package/dist/src/mcp/tools/log-outcome.js +59 -0
  152. package/dist/src/mcp/tools/log-outcome.js.map +1 -0
  153. package/dist/src/mcp/tools/open-evidence.d.ts +37 -0
  154. package/dist/src/mcp/tools/open-evidence.d.ts.map +1 -0
  155. package/dist/src/mcp/tools/open-evidence.js +72 -0
  156. package/dist/src/mcp/tools/open-evidence.js.map +1 -0
  157. package/dist/src/mcp/tools/save.d.ts +7 -2
  158. package/dist/src/mcp/tools/save.d.ts.map +1 -1
  159. package/dist/src/mcp/tools/save.js +7 -2
  160. package/dist/src/mcp/tools/save.js.map +1 -1
  161. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  162. package/dist/src/mcp/tools/search.js +7 -1
  163. package/dist/src/mcp/tools/search.js.map +1 -1
  164. package/dist/src/observability/retrieval-feedback.d.ts +82 -0
  165. package/dist/src/observability/retrieval-feedback.d.ts.map +1 -0
  166. package/dist/src/observability/retrieval-feedback.js +231 -0
  167. package/dist/src/observability/retrieval-feedback.js.map +1 -0
  168. package/dist/src/observability/rift-context.d.ts.map +1 -1
  169. package/dist/src/observability/rift-context.js +3 -0
  170. package/dist/src/observability/rift-context.js.map +1 -1
  171. package/dist/src/observability/tool-usage-stats.d.ts +13 -0
  172. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  173. package/dist/src/observability/tool-usage-stats.js +15 -0
  174. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  175. package/dist/src/observability/tool-usage.d.ts +56 -0
  176. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  177. package/dist/src/observability/tool-usage.js +86 -0
  178. package/dist/src/observability/tool-usage.js.map +1 -1
  179. package/dist/src/providers/claude-cli-metadata-extraction.d.ts +47 -0
  180. package/dist/src/providers/claude-cli-metadata-extraction.d.ts.map +1 -0
  181. package/dist/src/providers/claude-cli-metadata-extraction.js +120 -0
  182. package/dist/src/providers/claude-cli-metadata-extraction.js.map +1 -0
  183. package/dist/src/providers/claude-cli-runner.d.ts +92 -0
  184. package/dist/src/providers/claude-cli-runner.d.ts.map +1 -0
  185. package/dist/src/providers/claude-cli-runner.js +598 -0
  186. package/dist/src/providers/claude-cli-runner.js.map +1 -0
  187. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  188. package/dist/src/providers/codex-cli-metadata-extraction.js +1 -40
  189. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  190. package/dist/src/providers/codex-cli-runner.d.ts +7 -0
  191. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  192. package/dist/src/providers/codex-cli-runner.js +131 -5
  193. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  194. package/dist/src/providers/conversation-generation.d.ts +10 -0
  195. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  196. package/dist/src/providers/conversation-generation.js +54 -13
  197. package/dist/src/providers/conversation-generation.js.map +1 -1
  198. package/dist/src/providers/openai-metadata-extraction.d.ts +48 -1
  199. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  200. package/dist/src/providers/openai-metadata-extraction.js +51 -2
  201. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  202. package/dist/src/providers/types.d.ts +1 -1
  203. package/dist/src/providers/types.d.ts.map +1 -1
  204. package/dist/src/providers/types.js +4 -0
  205. package/dist/src/providers/types.js.map +1 -1
  206. package/dist/src/retrieval/compact.d.ts +81 -0
  207. package/dist/src/retrieval/compact.d.ts.map +1 -1
  208. package/dist/src/retrieval/compact.js +248 -8
  209. package/dist/src/retrieval/compact.js.map +1 -1
  210. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  211. package/dist/src/retrieval/context-pack.js +28 -14
  212. package/dist/src/retrieval/context-pack.js.map +1 -1
  213. package/dist/src/retrieval/evidence-key.d.ts +48 -0
  214. package/dist/src/retrieval/evidence-key.d.ts.map +1 -0
  215. package/dist/src/retrieval/evidence-key.js +131 -0
  216. package/dist/src/retrieval/evidence-key.js.map +1 -0
  217. package/dist/src/retrieval/group-by-parent.d.ts +38 -0
  218. package/dist/src/retrieval/group-by-parent.d.ts.map +1 -0
  219. package/dist/src/retrieval/group-by-parent.js +40 -0
  220. package/dist/src/retrieval/group-by-parent.js.map +1 -0
  221. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  222. package/dist/src/retrieval/lexical.js +1 -3
  223. package/dist/src/retrieval/lexical.js.map +1 -1
  224. package/dist/src/retrieval/receipt.d.ts +57 -0
  225. package/dist/src/retrieval/receipt.d.ts.map +1 -0
  226. package/dist/src/retrieval/receipt.js +119 -0
  227. package/dist/src/retrieval/receipt.js.map +1 -0
  228. package/dist/src/retrieval/reranker.d.ts +12 -2
  229. package/dist/src/retrieval/reranker.d.ts.map +1 -1
  230. package/dist/src/retrieval/reranker.js +11 -4
  231. package/dist/src/retrieval/reranker.js.map +1 -1
  232. package/dist/src/retrieval/stitch-chunks.d.ts +73 -0
  233. package/dist/src/retrieval/stitch-chunks.d.ts.map +1 -0
  234. package/dist/src/retrieval/stitch-chunks.js +106 -0
  235. package/dist/src/retrieval/stitch-chunks.js.map +1 -0
  236. package/dist/src/server/app.d.ts.map +1 -1
  237. package/dist/src/server/app.js +17 -1
  238. package/dist/src/server/app.js.map +1 -1
  239. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  240. package/dist/src/server/routes/conversations-search.js +12 -3
  241. package/dist/src/server/routes/conversations-search.js.map +1 -1
  242. package/dist/src/server/routes/friend-status.d.ts +44 -5
  243. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  244. package/dist/src/server/routes/friend-status.js +74 -6
  245. package/dist/src/server/routes/friend-status.js.map +1 -1
  246. package/dist/src/server/routes/mcp-usage.d.ts +9 -6
  247. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  248. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  249. package/dist/src/server/routes/retrieval-feedback.d.ts +3 -0
  250. package/dist/src/server/routes/retrieval-feedback.d.ts.map +1 -0
  251. package/dist/src/server/routes/retrieval-feedback.js +290 -0
  252. package/dist/src/server/routes/retrieval-feedback.js.map +1 -0
  253. package/dist/src/server/routes/save.d.ts +3 -3
  254. package/dist/src/server/routes/save.d.ts.map +1 -1
  255. package/dist/src/server/routes/save.js +6 -2
  256. package/dist/src/server/routes/save.js.map +1 -1
  257. package/dist/src/server/routes/search.d.ts.map +1 -1
  258. package/dist/src/server/routes/search.js +19 -7
  259. package/dist/src/server/routes/search.js.map +1 -1
  260. package/dist/src/server/serving-marker.d.ts +85 -0
  261. package/dist/src/server/serving-marker.d.ts.map +1 -0
  262. package/dist/src/server/serving-marker.js +226 -0
  263. package/dist/src/server/serving-marker.js.map +1 -0
  264. package/dist/src/storage/chunk-backfill.d.ts +39 -0
  265. package/dist/src/storage/chunk-backfill.d.ts.map +1 -0
  266. package/dist/src/storage/chunk-backfill.js +295 -0
  267. package/dist/src/storage/chunk-backfill.js.map +1 -0
  268. package/dist/src/storage/filter.d.ts +42 -0
  269. package/dist/src/storage/filter.d.ts.map +1 -0
  270. package/dist/src/storage/filter.js +70 -0
  271. package/dist/src/storage/filter.js.map +1 -0
  272. package/dist/src/storage/rebuild.d.ts.map +1 -1
  273. package/dist/src/storage/rebuild.js +44 -27
  274. package/dist/src/storage/rebuild.js.map +1 -1
  275. package/dist/src/storage/tables.d.ts +41 -0
  276. package/dist/src/storage/tables.d.ts.map +1 -1
  277. package/dist/src/storage/tables.js +64 -1
  278. package/dist/src/storage/tables.js.map +1 -1
  279. package/operator/swiftbar/render-menu.py +57 -15
  280. package/package.json +5 -3
@@ -113,12 +113,13 @@ def time_until(iso, now):
113
113
  return "in " + fmt_duration(delta)
114
114
 
115
115
 
116
- def fmt_tokens(n):
116
+ def fmt_token_count(n):
117
+ """Compact magnitude for a token count: '~800', '~31k', '~1.2M'."""
117
118
  if n >= 1_000_000:
118
- return "~{:.1f}M context tokens".format(n / 1_000_000).replace(".0M", "M")
119
+ return "~{:.1f}M".format(n / 1_000_000).replace(".0M", "M")
119
120
  if n >= 1_000:
120
- return "~{}k context tokens".format(round(n / 1_000))
121
- return f"~{n} context tokens"
121
+ return "~{}k".format(round(n / 1_000))
122
+ return f"~{n}"
122
123
 
123
124
 
124
125
  # Friendly labels for the three Memory windows, mapped to their keys in the
@@ -129,22 +130,40 @@ def fmt_tokens(n):
129
130
  # emits `today` still renders cleanly.
130
131
  MEMORY_PERIODS = (("Today", "today"), ("This month", "month"), ("All time", "all_time"))
131
132
 
132
-
133
- def memory_window_row(label, hits, tokens):
134
- """One '<Label>: N useful recalls · ~tokens' row, or a calm zero state."""
133
+ # The "saved ~X tokens of reading" clause is HELD until the source-size metric
134
+ # (`context_tokens_saved_estimate`, PR #66) has broad enough coverage to be
135
+ # per-window meaningful. It is forward-only `source_tokens_estimate` is logged
136
+ # only from the daemon redeploy onward, and historical/all-time rows can never
137
+ # be back-filled — so today a single measured call smears the same number across
138
+ # every window, which reads as broken. Logging continues (data accumulates); only
139
+ # this menu line is held. Flip to True once coverage is broad (target: next beta),
140
+ # ideally alongside a per-window saved-measured-hits gate so the figure only shows
141
+ # where it's genuinely supported. See the #66 follow-up.
142
+ SHOW_SAVED_TOKENS = False
143
+
144
+
145
+ def memory_window_row(label, hits, saved_tokens):
146
+ """One '<Label>: N useful recalls' row (+ optional saved clause).
147
+
148
+ The recall count is the honest hero — a recall is a discrete unit of help.
149
+ The 'saved ~tokens of reading' clause is the value figure, but it is gated
150
+ behind SHOW_SAVED_TOKENS: until the source-size metric has broad per-window
151
+ coverage, a single measured call would print the same number on every
152
+ window. While held, rows collapse cleanly to just the recall count.
153
+ """
135
154
  if hits <= 0:
136
155
  return f"{label}: nothing yet"
137
156
  parts = [f"{hits:,} useful recall" + ("" if hits == 1 else "s")]
138
- if isinstance(tokens, int) and tokens > 0:
139
- parts.append(fmt_tokens(tokens))
157
+ if SHOW_SAVED_TOKENS and isinstance(saved_tokens, int) and saved_tokens > 0:
158
+ parts.append(f"saved {fmt_token_count(saved_tokens)} tokens of reading")
140
159
  return f"{label}: " + " · ".join(parts)
141
160
 
142
161
 
143
162
  def memory_section(mcp):
144
163
  """Friendly 'Memory' section lines (header + period rows), or [].
145
164
 
146
- Reads today / month / all-time recall + context-token counts straight
147
- from /stats/mcp-usage and prints them in plain language. Returns [] when
165
+ Reads today / month / all-time recall counts + reading-saved estimates
166
+ straight from /stats/mcp-usage and prints them in plain language. Returns [] when
148
167
  the stats payload is missing or carries none of the expected windows, so
149
168
  the menu degrades gracefully (section omitted, Rift still healthy) rather
150
169
  than showing an error. A history with no recalls anywhere collapses to a
@@ -161,8 +180,8 @@ def memory_section(mcp):
161
180
  hits = window.get("context_hits")
162
181
  if not isinstance(hits, int):
163
182
  continue
164
- tokens = window.get("context_tokens_delivered_estimate")
165
- present.append((label, hits, tokens))
183
+ saved = window.get("context_tokens_saved_estimate")
184
+ present.append((label, hits, saved))
166
185
  if hits > 0:
167
186
  any_activity = True
168
187
  if not present:
@@ -175,7 +194,7 @@ def memory_section(mcp):
175
194
  if not any_activity and len(present) == len(MEMORY_PERIODS):
176
195
  return ["Memory", "Nothing recalled yet — Rift learns as you use it"]
177
196
  return ["Memory"] + [
178
- memory_window_row(label, hits, tokens) for label, hits, tokens in present
197
+ memory_window_row(label, hits, saved) for label, hits, saved in present
179
198
  ]
180
199
 
181
200
 
@@ -271,8 +290,31 @@ def has_doctor_report(doctor):
271
290
  return isinstance(doctor, dict) and "healthy" in doctor
272
291
 
273
292
 
293
+ # The Rift brand mark ("smooth bloom": a 4x4 memory grid, cells bright in the
294
+ # top-right fading toward the bottom-left), rendered to a 144px PNG and
295
+ # base64-embedded so render-menu.py stays a single self-contained file — it is
296
+ # symlinked/copied standalone into SwiftBar's plugins dir, so an external asset
297
+ # would add a path-resolution surface. Shipped as a `templateImage`: macOS
298
+ # ignores RGB and tints the ALPHA mask to the menu-bar color (adapting to
299
+ # light/dark), so the bloom is baked into alpha (black ink, per-cell
300
+ # opacity), with no background container. DO NOT hand-edit this constant —
301
+ # regenerate from the locked logo: `python3 generate-icon.py` (source of
302
+ # truth: assets/rift-mark.svg).
303
+ RIFT_ICON_B64 = "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAEBUlEQVR42u3cwUpVQRyAcbGkIsrQhYTG5UKJIAhuJFyEJLSQuxTcuU7aCG5a6rK1PUT0AkJv4Cp6Ane9Rs2hczYH7pzT3DnaxO+Db+fwF+a7C50/d24OAAAAAAAAAAAAAAAAAAAAAABk535wHNwNvk1wtz5/v8esh8G94GnwPMHT+vzDHrOeBE+CV8EfCV7V55/0mPWs/v1ugr8SvKnPPysxnp3EcNrudERUXfr7xHDavu+IqLr0r4nhtP3aEVF16d8Tw2n7vbSIxpniaRxHZu1liqdxLzLrJFM8jSeRWeeZ4mk8Lymg3cwB7UZmnWYO6DQy6ypzQFeRWTeZA7opKaC3Axj7pOZ2Gj8GcBq/BlBAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhLQHeM13mv8TNgHsg80EzYSbSRmichOtJ1oAAAAAEAR3AuuBDeCWwlu1Ofv9Zi1ENwMToJHCU7q8ws9Zj0OHgYvg18SvKzPP+4x62nwLHgd/JngdX3+aYnxvEoMp+2rjoiqS3+XGE7bdx0RVZf+KTGctp86Iqou/VtiOG2/lRbRSqZ4GlciszYzxdO4GZl1mCmexsPIrLNM8TSelRTQRuaANiKzJpkDmkRmXWYO6DIy6zpzQNclBbQ1gNM4GsBpfBnAafwcQAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEB3jNd4r/EzYR/IPtBM2Ei0kZglIjvRdqIBAAAAAEUwH1wKjoIvExzV5+d7zKq+xWwtuB18neB2fb7Pt6E9mPvztXvHwQ8JHtfnH/SY9Sh4ELwIfk7woj7/qMR4XiSG0/ZFR0TVpW8lhtN2qyOi6tKPEsNpe9QRUXXpHxPDafuxtIiWMsXTuBSZtZYpnsa1yKydTPE07kRmHWSKp/GgpIBGmQMaRWZtZw5oOzLrOHNAx5FZF5kDuigpoJcDOI3XAziNDwM4jc8DKCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCeiO8RrvNX4m7APZB5oJG4k2ErNEZCfaTjQAAAAAoJg/4xeDq/Wf5H/ran1+vues5eA4uJ7guD7/r/3LYKH+/fbn/nyL2t+6X59fKDGe54nhtH3ecbHz9c+tZ3A09+/807K69DeJ4bR9U1pEi5niaVyMzFrOFE/jcmTWbT6brGeKp3G9pIBWMwe0Gpk1zhzQODLrNh9u9zMHtF9SQKMBjH1SczuN21wdmQyggAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkoDvGa7zX+JmwD2QfaCZsJNpIzBKRnWg70QAAAAAAAAAAAAAAAAAAAAAA/J/8BkPYO9tuFesnAAAAAElFTkSuQmCC"
304
+ # width/height are required: SwiftBar renders a custom image at its decoded
305
+ # pixel size (144px here) unless both are set, which would oversize the icon
306
+ # and distort menu-bar spacing. 18pt matches the menu-bar glyph height; the
307
+ # 144px source downscales crisply on retina.
308
+ _RIFT_TITLE = f"Rift | templateImage={RIFT_ICON_B64} width=18 height=18"
309
+
310
+ # Hybrid menu-bar title: the Rift brand mark when healthy (calm, branded), but
311
+ # a colored SF Symbol when something needs attention so the alert stays legible
312
+ # at a glance without opening the dropdown. SwiftBar renders one image per title
313
+ # line and force-tints a `templateImage` to monochrome, so color has to come
314
+ # from the sfimage/sfcolor path — hence the brand mark is healthy-only. The
315
+ # detailed verdict still renders inside the dropdown for every state.
274
316
  TITLES = {
275
- "healthy": "Rift | sfimage=circle.fill sfcolor=systemGreen",
317
+ "healthy": _RIFT_TITLE,
276
318
  "warning": "Rift | sfimage=exclamationmark.circle.fill sfcolor=systemYellow",
277
319
  "broken": "Rift | sfimage=exclamationmark.triangle.fill sfcolor=systemRed",
278
320
  "unknown": "Rift | sfimage=questionmark.circle.fill sfcolor=systemGray",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getrift/rift",
3
- "version": "0.1.0-beta.20",
3
+ "version": "0.1.0-beta.22",
4
4
  "description": "Local-first personal memory + reasoning infrastructure with an MCP interface.",
5
5
  "homepage": "https://getrift.dev",
6
6
  "license": "UNLICENSED",
@@ -14,7 +14,8 @@
14
14
  },
15
15
  "files": [
16
16
  "dist/src",
17
- "operator/swiftbar",
17
+ "operator/swiftbar/rift.10s.sh",
18
+ "operator/swiftbar/render-menu.py",
18
19
  "README.md"
19
20
  ],
20
21
  "scripts": {
@@ -28,10 +29,11 @@
28
29
  "ci:test:focused": "tsx tests/fixtures/generate.ts && vitest tests/retrieval/current-truth.test.ts tests/retrieval/report-demotion.test.ts tests/retrieval/locator-boost.test.ts tests/retrieval/context-pack.test.ts tests/server/routes/search.test.ts tests/server/routes/context.test.ts --run",
29
30
  "ci:pr": "npm run ci:typecheck && npm run check:rename && npm run ci:test:focused",
30
31
  "check:rename": "bash scripts/check-rename.sh",
32
+ "check:publish-source": "node scripts/check-publish-source.mjs",
31
33
  "check:tarball": "bash scripts/verify-tarball.sh",
32
34
  "plist:generate": "bash scripts/generate-plist.sh",
33
35
  "postinstall": "node -e \"const e=process.env;if(e.RIFT_SKIP_POSTINSTALL_MENUBAR==='1'||(e.RIFT_POSTINSTALL_MENUBAR!=='1'&&e.npm_config_global!=='true'&&e.npm_config_location!=='global'))process.exit(0);import('./dist/src/cli/postinstall-menubar.js').catch(() => {})\"",
34
- "prepublishOnly": "npm run check && npm run check:rename && npm run build && npm run check:tarball"
36
+ "prepublishOnly": "npm run check:publish-source && npm run check && npm run check:rename && npm run build && npm run check:tarball"
35
37
  },
36
38
  "dependencies": {
37
39
  "@fastify/multipart": "^9.4.0",