@cachly-dev/mcp-server 0.10.56 → 0.10.58

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 (338) hide show
  1. package/.github/workflows/eas-build-android.yml +58 -0
  2. package/.github/workflows/eas-update.yml +55 -0
  3. package/.github/workflows/publish.yml +2 -2
  4. package/BENCH.md +91 -0
  5. package/CHANGELOG.md +44 -0
  6. package/README.md +6 -34
  7. package/STRATEGY.md +228 -0
  8. package/apps/travel-chaos-organizer/.env.example +49 -0
  9. package/apps/travel-chaos-organizer/DEPLOY.md +328 -0
  10. package/apps/travel-chaos-organizer/Makefile +57 -0
  11. package/apps/travel-chaos-organizer/README.md +159 -0
  12. package/apps/travel-chaos-organizer/backend/.env.example +10 -0
  13. package/apps/travel-chaos-organizer/backend/Dockerfile +25 -0
  14. package/apps/travel-chaos-organizer/backend/alembic/env.py +56 -0
  15. package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +24 -0
  16. package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
  17. package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +24 -0
  18. package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +24 -0
  19. package/apps/travel-chaos-organizer/backend/alembic.ini +39 -0
  20. package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
  21. package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
  22. package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +81 -0
  23. package/apps/travel-chaos-organizer/backend/app/config.py +66 -0
  24. package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
  25. package/apps/travel-chaos-organizer/backend/app/db/database.py +20 -0
  26. package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +71 -0
  27. package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +31 -0
  28. package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +4 -0
  29. package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +5 -0
  30. package/apps/travel-chaos-organizer/backend/app/limiter.py +4 -0
  31. package/apps/travel-chaos-organizer/backend/app/logging_config.py +25 -0
  32. package/apps/travel-chaos-organizer/backend/app/main.py +77 -0
  33. package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
  34. package/apps/travel-chaos-organizer/backend/app/models/schemas.py +142 -0
  35. package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
  36. package/apps/travel-chaos-organizer/backend/app/routers/admin.py +237 -0
  37. package/apps/travel-chaos-organizer/backend/app/routers/cache.py +13 -0
  38. package/apps/travel-chaos-organizer/backend/app/routers/events.py +29 -0
  39. package/apps/travel-chaos-organizer/backend/app/routers/export.py +122 -0
  40. package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +122 -0
  41. package/apps/travel-chaos-organizer/backend/app/routers/items.py +130 -0
  42. package/apps/travel-chaos-organizer/backend/app/routers/mail.py +108 -0
  43. package/apps/travel-chaos-organizer/backend/app/routers/parse.py +303 -0
  44. package/apps/travel-chaos-organizer/backend/app/routers/payments.py +179 -0
  45. package/apps/travel-chaos-organizer/backend/app/routers/trips.py +134 -0
  46. package/apps/travel-chaos-organizer/backend/app/routers/users.py +169 -0
  47. package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +37 -0
  48. package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
  49. package/apps/travel-chaos-organizer/backend/app/services/cache.py +131 -0
  50. package/apps/travel-chaos-organizer/backend/app/services/drip.py +128 -0
  51. package/apps/travel-chaos-organizer/backend/app/services/email.py +61 -0
  52. package/apps/travel-chaos-organizer/backend/app/services/errors.py +44 -0
  53. package/apps/travel-chaos-organizer/backend/app/services/notifier.py +10 -0
  54. package/apps/travel-chaos-organizer/backend/app/services/ollama.py +101 -0
  55. package/apps/travel-chaos-organizer/backend/app/services/parser.py +22 -0
  56. package/apps/travel-chaos-organizer/backend/app/services/quota.py +85 -0
  57. package/apps/travel-chaos-organizer/backend/app/services/sentry.py +11 -0
  58. package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +35 -0
  59. package/apps/travel-chaos-organizer/backend/pytest.ini +4 -0
  60. package/apps/travel-chaos-organizer/backend/requirements-dev.txt +6 -0
  61. package/apps/travel-chaos-organizer/backend/requirements.txt +25 -0
  62. package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
  63. package/apps/travel-chaos-organizer/backend/tests/conftest.py +223 -0
  64. package/apps/travel-chaos-organizer/backend/tests/test_admin.py +99 -0
  65. package/apps/travel-chaos-organizer/backend/tests/test_cache.py +142 -0
  66. package/apps/travel-chaos-organizer/backend/tests/test_drip.py +32 -0
  67. package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +121 -0
  68. package/apps/travel-chaos-organizer/backend/tests/test_export.py +48 -0
  69. package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +107 -0
  70. package/apps/travel-chaos-organizer/backend/tests/test_items.py +138 -0
  71. package/apps/travel-chaos-organizer/backend/tests/test_mail.py +113 -0
  72. package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +145 -0
  73. package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +98 -0
  74. package/apps/travel-chaos-organizer/backend/tests/test_parser.py +72 -0
  75. package/apps/travel-chaos-organizer/backend/tests/test_payments.py +163 -0
  76. package/apps/travel-chaos-organizer/backend/tests/test_quota.py +46 -0
  77. package/apps/travel-chaos-organizer/backend/tests/test_search.py +67 -0
  78. package/apps/travel-chaos-organizer/backend/tests/test_trips.py +123 -0
  79. package/apps/travel-chaos-organizer/backend/tests/test_users.py +52 -0
  80. package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
  81. package/apps/travel-chaos-organizer/caddy/Caddyfile +27 -0
  82. package/apps/travel-chaos-organizer/docker-compose.node1.yml +31 -0
  83. package/apps/travel-chaos-organizer/docker-compose.override.yml +14 -0
  84. package/apps/travel-chaos-organizer/docker-compose.yml +128 -0
  85. package/apps/travel-chaos-organizer/frontend/.env.example +13 -0
  86. package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +80 -0
  87. package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +166 -0
  88. package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +130 -0
  89. package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +381 -0
  90. package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +346 -0
  91. package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +363 -0
  92. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +34 -0
  93. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +35 -0
  94. package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +91 -0
  95. package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +71 -0
  96. package/apps/travel-chaos-organizer/frontend/app/auth.tsx +29 -0
  97. package/apps/travel-chaos-organizer/frontend/app/index.tsx +16 -0
  98. package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +119 -0
  99. package/apps/travel-chaos-organizer/frontend/app.config.ts +54 -0
  100. package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +66 -0
  101. package/apps/travel-chaos-organizer/frontend/assets/icon.svg +79 -0
  102. package/apps/travel-chaos-organizer/frontend/assets/splash.svg +15 -0
  103. package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +102 -0
  104. package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +107 -0
  105. package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +109 -0
  106. package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +45 -0
  107. package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +19 -0
  108. package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +155 -0
  109. package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +55 -0
  110. package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +80 -0
  111. package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +39 -0
  112. package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +39 -0
  113. package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +70 -0
  114. package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +121 -0
  115. package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +70 -0
  116. package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +73 -0
  117. package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +130 -0
  118. package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +60 -0
  119. package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +42 -0
  120. package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +146 -0
  121. package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +70 -0
  122. package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +44 -0
  123. package/apps/travel-chaos-organizer/frontend/eas.json +22 -0
  124. package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +24 -0
  125. package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +60 -0
  126. package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +112 -0
  127. package/apps/travel-chaos-organizer/frontend/lib/api.ts +223 -0
  128. package/apps/travel-chaos-organizer/frontend/lib/auth.ts +93 -0
  129. package/apps/travel-chaos-organizer/frontend/lib/db.ts +86 -0
  130. package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +54 -0
  131. package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +13 -0
  132. package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +112 -0
  133. package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +145 -0
  134. package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +43 -0
  135. package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +28 -0
  136. package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +44 -0
  137. package/apps/travel-chaos-organizer/frontend/package-lock.json +13221 -0
  138. package/apps/travel-chaos-organizer/frontend/package.json +44 -0
  139. package/apps/travel-chaos-organizer/frontend/tsconfig.json +23 -0
  140. package/apps/travel-chaos-organizer/keycloak/realm-export.json +59 -0
  141. package/apps/travel-chaos-organizer/landing/index.html +773 -0
  142. package/apps/travel-chaos-organizer/scripts/backup.sh +14 -0
  143. package/apps/travel-chaos-organizer/scripts/configure-env.sh +82 -0
  144. package/apps/travel-chaos-organizer/scripts/deploy.sh +54 -0
  145. package/apps/travel-chaos-organizer/scripts/health-check.sh +36 -0
  146. package/apps/travel-chaos-organizer/scripts/migrate.sh +7 -0
  147. package/apps/travel-chaos-organizer/scripts/server-setup.sh +85 -0
  148. package/apps/travel-chaos-organizer/scripts/smoke-test.sh +29 -0
  149. package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +71 -0
  150. package/apps/travel-chaos-organizer/telegram-bot/.env.example +3 -0
  151. package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +6 -0
  152. package/apps/travel-chaos-organizer/telegram-bot/bot.py +504 -0
  153. package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +3 -0
  154. package/dist/packages/telegram-notify/client.d.ts +19 -0
  155. package/dist/packages/telegram-notify/client.js +75 -0
  156. package/dist/packages/telegram-notify/client.js.map +1 -0
  157. package/dist/src/__tests__/auth.test.js.map +1 -0
  158. package/dist/{__tests__ → src/__tests__}/brain-flow.test.js +141 -0
  159. package/dist/src/__tests__/brain-flow.test.js.map +1 -0
  160. package/dist/src/__tests__/confidence.test.js.map +1 -0
  161. package/dist/src/__tests__/e2e/api-auth.test.js.map +1 -0
  162. package/dist/src/__tests__/e2e/api-health.test.js.map +1 -0
  163. package/dist/src/__tests__/e2e/cli.test.js.map +1 -0
  164. package/dist/src/__tests__/e2e/config.js.map +1 -0
  165. package/dist/src/__tests__/e2e/funnel.test.js.map +1 -0
  166. package/dist/src/__tests__/e2e/mcp-tools.test.js.map +1 -0
  167. package/dist/src/__tests__/e2e/provisioning.test.js.map +1 -0
  168. package/dist/{__tests__ → src/__tests__}/handlers-unit.test.js +0 -2
  169. package/dist/src/__tests__/handlers-unit.test.js.map +1 -0
  170. package/dist/src/__tests__/namespace.test.js.map +1 -0
  171. package/dist/src/__tests__/rerank.test.js +115 -0
  172. package/dist/src/__tests__/rerank.test.js.map +1 -0
  173. package/dist/src/auth.js.map +1 -0
  174. package/dist/src/bench/cachly-bench.d.ts +35 -0
  175. package/dist/src/bench/cachly-bench.js +182 -0
  176. package/dist/src/bench/cachly-bench.js.map +1 -0
  177. package/dist/src/bench/fixtures.d.ts +37 -0
  178. package/dist/src/bench/fixtures.js +225 -0
  179. package/dist/src/bench/fixtures.js.map +1 -0
  180. package/dist/src/ckg.js.map +1 -0
  181. package/dist/src/confidence.js.map +1 -0
  182. package/dist/src/embeddings.js.map +1 -0
  183. package/dist/{handlers → src/handlers}/advanced.d.ts +1 -1
  184. package/dist/{handlers → src/handlers}/advanced.js +1 -2
  185. package/dist/src/handlers/advanced.js.map +1 -0
  186. package/dist/{handlers → src/handlers}/brain.js +361 -191
  187. package/dist/src/handlers/brain.js.map +1 -0
  188. package/dist/src/handlers/cache.js.map +1 -0
  189. package/dist/{handlers → src/handlers}/context.js +9 -4
  190. package/dist/src/handlers/context.js.map +1 -0
  191. package/dist/{handlers → src/handlers}/fedbrain.d.ts +6 -0
  192. package/dist/{handlers → src/handlers}/fedbrain.js +19 -7
  193. package/dist/src/handlers/fedbrain.js.map +1 -0
  194. package/dist/src/handlers/instances.js.map +1 -0
  195. package/dist/{handlers → src/handlers}/roadmap.d.ts +1 -1
  196. package/dist/{handlers → src/handlers}/roadmap.js +8 -4
  197. package/dist/src/handlers/roadmap.js.map +1 -0
  198. package/dist/src/handlers/syndicate.js.map +1 -0
  199. package/dist/src/handlers/tco.d.ts +16 -0
  200. package/dist/src/handlers/tco.js +303 -0
  201. package/dist/src/handlers/tco.js.map +1 -0
  202. package/dist/{handlers → src/handlers}/team.js +58 -7
  203. package/dist/src/handlers/team.js.map +1 -0
  204. package/dist/{index.js → src/index.js} +207 -429
  205. package/dist/src/index.js.map +1 -0
  206. package/dist/src/namespace.js.map +1 -0
  207. package/dist/src/notifier.d.ts +5 -0
  208. package/dist/src/notifier.js +6 -0
  209. package/dist/src/notifier.js.map +1 -0
  210. package/dist/src/rerank.d.ts +55 -0
  211. package/dist/src/rerank.js +111 -0
  212. package/dist/src/rerank.js.map +1 -0
  213. package/dist/{search.js → src/search.js} +2 -2
  214. package/dist/src/search.js.map +1 -0
  215. package/dist/src/search.test.d.ts +1 -0
  216. package/dist/{search.test.js → src/search.test.js} +1 -1
  217. package/dist/src/search.test.js.map +1 -0
  218. package/dist/{tools.d.ts → src/tools.d.ts} +226 -0
  219. package/dist/{tools.js → src/tools.js} +196 -0
  220. package/dist/src/tools.js.map +1 -0
  221. package/dist/src/utils.js.map +1 -0
  222. package/eslint.config.js +1 -1
  223. package/package.json +8 -7
  224. package/packages/telegram-notify/SPLIT_PLAN.md +106 -0
  225. package/packages/telegram-notify/client.ts +88 -0
  226. package/packages/telegram-notify/emojis.json +22 -0
  227. package/packages/telegram-notify/pyproject.toml +17 -0
  228. package/packages/telegram-notify/telegram_notify/__init__.py +3 -0
  229. package/packages/telegram-notify/telegram_notify/client.py +87 -0
  230. package/packages/telegram-notify/telegram_notify/emojis.json +22 -0
  231. package/scripts/generate-icons.js +28 -0
  232. package/server.json +3 -3
  233. package/smithery.yaml +27 -16
  234. package/src/__tests__/auth.test.ts +1 -1
  235. package/src/__tests__/brain-flow.test.ts +175 -1
  236. package/src/__tests__/e2e/api-health.test.ts +1 -1
  237. package/src/__tests__/handlers-unit.test.ts +1 -2
  238. package/src/__tests__/rerank.test.ts +130 -0
  239. package/src/bench/cachly-bench.ts +217 -0
  240. package/src/bench/fixtures.ts +256 -0
  241. package/src/handlers/advanced.ts +2 -6
  242. package/src/handlers/brain.ts +371 -194
  243. package/src/handlers/cache.ts +1 -2
  244. package/src/handlers/context.ts +10 -6
  245. package/src/handlers/fedbrain.ts +21 -12
  246. package/src/handlers/roadmap.ts +8 -4
  247. package/src/handlers/syndicate.ts +7 -4
  248. package/src/handlers/tco.ts +345 -0
  249. package/src/handlers/team.ts +70 -10
  250. package/src/index.ts +193 -419
  251. package/src/notifier.ts +5 -0
  252. package/src/rerank.ts +148 -0
  253. package/src/search.test.ts +1 -1
  254. package/src/search.ts +2 -2
  255. package/src/tools.ts +210 -0
  256. package/tsconfig.json +2 -3
  257. package/vitest.config.ts +2 -0
  258. package/dist/__tests__/auth.test.js.map +0 -1
  259. package/dist/__tests__/brain-flow.test.js.map +0 -1
  260. package/dist/__tests__/brain-predict-failures.test.d.ts +0 -17
  261. package/dist/__tests__/brain-predict-failures.test.js +0 -339
  262. package/dist/__tests__/brain-predict-failures.test.js.map +0 -1
  263. package/dist/__tests__/confidence.test.js.map +0 -1
  264. package/dist/__tests__/e2e/api-auth.test.js.map +0 -1
  265. package/dist/__tests__/e2e/api-health.test.js.map +0 -1
  266. package/dist/__tests__/e2e/cli.test.js.map +0 -1
  267. package/dist/__tests__/e2e/config.js.map +0 -1
  268. package/dist/__tests__/e2e/funnel.test.js.map +0 -1
  269. package/dist/__tests__/e2e/mcp-tools.test.js.map +0 -1
  270. package/dist/__tests__/e2e/provisioning.test.js.map +0 -1
  271. package/dist/__tests__/handlers-unit.test.js.map +0 -1
  272. package/dist/__tests__/namespace.test.js.map +0 -1
  273. package/dist/auth.js.map +0 -1
  274. package/dist/ckg.js.map +0 -1
  275. package/dist/confidence.js.map +0 -1
  276. package/dist/embeddings.js.map +0 -1
  277. package/dist/handlers/advanced.js.map +0 -1
  278. package/dist/handlers/brain.js.map +0 -1
  279. package/dist/handlers/cache.js.map +0 -1
  280. package/dist/handlers/context.js.map +0 -1
  281. package/dist/handlers/fedbrain.js.map +0 -1
  282. package/dist/handlers/instances.js.map +0 -1
  283. package/dist/handlers/roadmap.js.map +0 -1
  284. package/dist/handlers/syndicate.js.map +0 -1
  285. package/dist/handlers/team.js.map +0 -1
  286. package/dist/index.js.map +0 -1
  287. package/dist/namespace.js.map +0 -1
  288. package/dist/search.js.map +0 -1
  289. package/dist/search.test.js.map +0 -1
  290. package/dist/tools.js.map +0 -1
  291. package/dist/utils.js.map +0 -1
  292. package/src/__tests__/brain-predict-failures.test.ts +0 -430
  293. /package/dist/{__tests__ → src/__tests__}/auth.test.d.ts +0 -0
  294. /package/dist/{__tests__ → src/__tests__}/auth.test.js +0 -0
  295. /package/dist/{__tests__ → src/__tests__}/brain-flow.test.d.ts +0 -0
  296. /package/dist/{__tests__ → src/__tests__}/confidence.test.d.ts +0 -0
  297. /package/dist/{__tests__ → src/__tests__}/confidence.test.js +0 -0
  298. /package/dist/{__tests__ → src/__tests__}/e2e/api-auth.test.d.ts +0 -0
  299. /package/dist/{__tests__ → src/__tests__}/e2e/api-auth.test.js +0 -0
  300. /package/dist/{__tests__ → src/__tests__}/e2e/api-health.test.d.ts +0 -0
  301. /package/dist/{__tests__ → src/__tests__}/e2e/api-health.test.js +0 -0
  302. /package/dist/{__tests__ → src/__tests__}/e2e/cli.test.d.ts +0 -0
  303. /package/dist/{__tests__ → src/__tests__}/e2e/cli.test.js +0 -0
  304. /package/dist/{__tests__ → src/__tests__}/e2e/config.d.ts +0 -0
  305. /package/dist/{__tests__ → src/__tests__}/e2e/config.js +0 -0
  306. /package/dist/{__tests__ → src/__tests__}/e2e/funnel.test.d.ts +0 -0
  307. /package/dist/{__tests__ → src/__tests__}/e2e/funnel.test.js +0 -0
  308. /package/dist/{__tests__ → src/__tests__}/e2e/mcp-tools.test.d.ts +0 -0
  309. /package/dist/{__tests__ → src/__tests__}/e2e/mcp-tools.test.js +0 -0
  310. /package/dist/{__tests__ → src/__tests__}/e2e/provisioning.test.d.ts +0 -0
  311. /package/dist/{__tests__ → src/__tests__}/e2e/provisioning.test.js +0 -0
  312. /package/dist/{__tests__ → src/__tests__}/handlers-unit.test.d.ts +0 -0
  313. /package/dist/{__tests__ → src/__tests__}/namespace.test.d.ts +0 -0
  314. /package/dist/{__tests__ → src/__tests__}/namespace.test.js +0 -0
  315. /package/dist/{search.test.d.ts → src/__tests__/rerank.test.d.ts} +0 -0
  316. /package/dist/{auth.d.ts → src/auth.d.ts} +0 -0
  317. /package/dist/{auth.js → src/auth.js} +0 -0
  318. /package/dist/{ckg.d.ts → src/ckg.d.ts} +0 -0
  319. /package/dist/{ckg.js → src/ckg.js} +0 -0
  320. /package/dist/{confidence.d.ts → src/confidence.d.ts} +0 -0
  321. /package/dist/{confidence.js → src/confidence.js} +0 -0
  322. /package/dist/{embeddings.d.ts → src/embeddings.d.ts} +0 -0
  323. /package/dist/{embeddings.js → src/embeddings.js} +0 -0
  324. /package/dist/{handlers → src/handlers}/brain.d.ts +0 -0
  325. /package/dist/{handlers → src/handlers}/cache.d.ts +0 -0
  326. /package/dist/{handlers → src/handlers}/cache.js +0 -0
  327. /package/dist/{handlers → src/handlers}/context.d.ts +0 -0
  328. /package/dist/{handlers → src/handlers}/instances.d.ts +0 -0
  329. /package/dist/{handlers → src/handlers}/instances.js +0 -0
  330. /package/dist/{handlers → src/handlers}/syndicate.d.ts +0 -0
  331. /package/dist/{handlers → src/handlers}/syndicate.js +0 -0
  332. /package/dist/{handlers → src/handlers}/team.d.ts +0 -0
  333. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  334. /package/dist/{namespace.d.ts → src/namespace.d.ts} +0 -0
  335. /package/dist/{namespace.js → src/namespace.js} +0 -0
  336. /package/dist/{search.d.ts → src/search.d.ts} +0 -0
  337. /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
  338. /package/dist/{utils.js → src/utils.js} +0 -0
@@ -1,9 +1,8 @@
1
- import { execSync } from 'node:child_process';
2
1
  import { readFileSync } from 'node:fs';
3
2
  import { join } from 'node:path';
4
3
  import type { Redis } from 'ioredis';
5
- import { calculateConfidence, confidenceBadge, CONFIDENCE_STALE_VALUE, CONFIDENCE_WARN_VALUE,
6
- CONFIDENCE_WARN_DAYS, CONFIDENCE_STALE_DAYS, simpleHash } from '../confidence.js';
4
+ import { calculateConfidence, CONFIDENCE_STALE_VALUE, CONFIDENCE_WARN_VALUE,
5
+ CONFIDENCE_WARN_DAYS, CONFIDENCE_STALE_DAYS } from '../confidence.js';
7
6
  import type { Instance } from './brain.js';
8
7
  import { safeJsonParse } from '../utils.js';
9
8
 
@@ -11,7 +10,7 @@ type GetConnection = (instanceId: string) => Promise<Redis>;
11
10
  type ApiFetch = <T>(path: string, options?: RequestInit) => Promise<T>;
12
11
 
13
12
  export const TEAM_TOOL_NAMES = new Set([
14
- 'sync_file_changes', 'team_learn', 'team_recall', 'team_synthesize', 'memory_crystalize',
13
+ 'sync_file_changes', 'team_learn', 'team_confirm', 'team_recall', 'team_synthesize', 'memory_crystalize',
15
14
  'brain_doctor', 'recall_at', 'trace_dependency', 'global_learn', 'global_recall',
16
15
  'publish_lesson', 'import_public_brain', 'setup_ai_memory',
17
16
  ]);
@@ -109,9 +108,7 @@ export async function handleTeamTool(
109
108
  file_paths: file_paths ?? [],
110
109
  commands: commands ?? [],
111
110
  tags: [...(tags ?? []), 'team'],
112
- ts: new Date().toISOString(),
113
- verified_at: outcome === 'success' ? new Date().toISOString() : undefined,
114
- confidence: 1.0,
111
+ timestamp: new Date().toISOString(),
115
112
  recall_count: 0,
116
113
  version: 2,
117
114
  };
@@ -126,6 +123,60 @@ export async function handleTeamTool(
126
123
  return `✅ Team lesson stored by **${author}**: \`${topic}\` (${outcome})\n💡 ${what_worked.slice(0, 120)}`;
127
124
  }
128
125
 
126
+ // ── team_confirm — knowledge governance (Phase 3) ─────────────────────────
127
+ // A human reviewer endorses a stored lesson. The endorsement raises the
128
+ // lesson's recall ranking (see src/rerank.ts), so trusted, reviewed knowledge
129
+ // surfaces above unreviewed auto-learned entries.
130
+ case 'team_confirm': {
131
+ const { instance_id, topic, reviewer, level = 'peer', note = '' } = args as {
132
+ instance_id: string; topic: string; reviewer: string;
133
+ level?: 'senior' | 'peer'; note?: string;
134
+ };
135
+ if (!instance_id) return '❌ instance_id required';
136
+ if (!topic || !reviewer) return '❌ Required: topic, reviewer';
137
+ const reviewLevel = level === 'senior' ? 'senior' : 'peer';
138
+
139
+ const redis = await getConnection(instance_id);
140
+ const key = `cachly:lesson:best:${topic}`;
141
+ const raw = await redis.get(key);
142
+ const lesson = safeJsonParse<Record<string, unknown> | null>(raw, null);
143
+ if (!lesson) {
144
+ return `📭 No best-solution lesson found for \`${topic}\`.\n\nA lesson must exist (store one with \`team_learn\` / \`learn_from_attempts\`) before it can be confirmed.`;
145
+ }
146
+
147
+ // Track distinct reviewers so endorsements can't be inflated by one person.
148
+ const endorsersKey = `cachly:lesson:endorsers:${topic}`;
149
+ const isNewEndorser = (await redis.sadd(endorsersKey, reviewer)) === 1;
150
+ await redis.expire(endorsersKey, 365 * 86400);
151
+ const endorsements = await redis.scard(endorsersKey);
152
+
153
+ // Senior beats peer; never downgrade an existing senior review to peer.
154
+ const prevLevel = (lesson.review_level as string) ?? '';
155
+ const effectiveLevel = prevLevel === 'senior' ? 'senior' : reviewLevel;
156
+
157
+ const updated = {
158
+ ...lesson,
159
+ reviewed_by: reviewer,
160
+ review_level: effectiveLevel,
161
+ endorsements,
162
+ reviewed_at: new Date().toISOString(),
163
+ };
164
+ await redis.set(key, JSON.stringify(updated));
165
+
166
+ // Append an immutable review record for the audit trail.
167
+ const reviewLog = {
168
+ reviewer, level: reviewLevel, note: note.slice(0, 280), ts: new Date().toISOString(),
169
+ };
170
+ const logKey = `cachly:lesson:reviews:${topic}`;
171
+ await redis.rpush(logKey, JSON.stringify(reviewLog));
172
+ await redis.ltrim(logKey, -50, -1);
173
+ await redis.expire(logKey, 365 * 86400);
174
+
175
+ const badge = effectiveLevel === 'senior' ? '🛡️ senior-reviewed' : '✔️ peer-reviewed';
176
+ const alreadyNote = isNewEndorser ? '' : ` (already endorsed by ${reviewer} — no change to rank)`;
177
+ return `${badge} — \`${topic}\` confirmed by **${reviewer}** (${endorsements} distinct endorsement${endorsements === 1 ? '' : 's'})${alreadyNote}.\n📈 This lesson now ranks higher in \`smart_recall\` / \`team_recall\`.${note ? `\n📝 ${note.slice(0, 200)}` : ''}`;
178
+ }
179
+
129
180
  // ── team_recall ───────────────────────────────────────────────────────────
130
181
  case 'team_recall': {
131
182
  const { instance_id, topic, author, limit = 10 } = args as {
@@ -148,6 +199,7 @@ export async function handleTeamTool(
148
199
  topic: string; outcome: string; what_worked: string;
149
200
  ts: string; severity?: string; recall_count?: number;
150
201
  author?: string; tags?: string[];
202
+ reviewed_by?: string; review_level?: string; endorsements?: number;
151
203
  };
152
204
  let lessons: TeamLesson[] = [];
153
205
  if (lessonKeys.length > 0) {
@@ -171,8 +223,10 @@ export async function handleTeamTool(
171
223
  lessons = lessons.filter(l => l.author?.toLowerCase().includes(a));
172
224
  }
173
225
 
174
- // Sort by recall_count desc
175
- lessons.sort((a, b) => (b.recall_count ?? 0) - (a.recall_count ?? 0));
226
+ // Sort: reviewed lessons first (senior > peer), then by recall_count desc.
227
+ const reviewRank = (l: TeamLesson) => l.reviewed_by ? (l.review_level === 'senior' ? 2 : 1) : 0;
228
+ lessons.sort((a, b) =>
229
+ (reviewRank(b) - reviewRank(a)) || ((b.recall_count ?? 0) - (a.recall_count ?? 0)));
176
230
  lessons = lessons.slice(0, limit);
177
231
 
178
232
  if (lessons.length === 0) {
@@ -185,11 +239,17 @@ export async function handleTeamTool(
185
239
  for (const l of lessons) {
186
240
  const emoji = l.outcome === 'success' ? '✅' : l.outcome === 'partial' ? '⚠️' : '❌';
187
241
  const sev = l.severity === 'critical' ? '🔴 ' : l.severity === 'major' ? '🟡 ' : '';
242
+ const reviewBadge = l.reviewed_by
243
+ ? (l.review_level === 'senior' ? ' 🛡️' : ' ✔️')
244
+ : '';
188
245
  const authorStr = l.author ? ` · _by ${l.author}_` : '';
246
+ const reviewStr = l.reviewed_by
247
+ ? ` · reviewed by ${l.reviewed_by}${(l.endorsements ?? 0) > 1 ? ` +${(l.endorsements ?? 0) - 1}` : ''}`
248
+ : '';
189
249
  const recallStr = (l.recall_count ?? 0) > 0 ? ` · recalled ${l.recall_count}×` : '';
190
250
  const ago = Math.round((Date.now() - new Date(l.ts).getTime()) / 86400000);
191
251
  const agoStr = ago === 0 ? 'today' : ago === 1 ? 'yesterday' : `${ago}d ago`;
192
- lines.push(`${emoji} ${sev}**\`${l.topic}\`**${authorStr}${recallStr} · ${agoStr}`);
252
+ lines.push(`${emoji} ${sev}**\`${l.topic}\`**${reviewBadge}${authorStr}${reviewStr}${recallStr} · ${agoStr}`);
193
253
  lines.push(` ${l.what_worked.slice(0, 120)}`);
194
254
  lines.push('');
195
255
  }