@cachly-dev/mcp-server 0.10.49 → 0.10.56

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 (310) hide show
  1. package/.github/workflows/publish.yml +2 -2
  2. package/README.md +33 -5
  3. package/dist/__tests__/auth.test.js.map +1 -0
  4. package/dist/{src/__tests__ → __tests__}/brain-flow.test.js +0 -141
  5. package/dist/__tests__/brain-flow.test.js.map +1 -0
  6. package/dist/__tests__/brain-predict-failures.test.d.ts +17 -0
  7. package/dist/__tests__/brain-predict-failures.test.js +339 -0
  8. package/dist/__tests__/brain-predict-failures.test.js.map +1 -0
  9. package/dist/__tests__/confidence.test.js.map +1 -0
  10. package/dist/__tests__/e2e/api-auth.test.js.map +1 -0
  11. package/dist/__tests__/e2e/api-health.test.js.map +1 -0
  12. package/dist/__tests__/e2e/cli.test.js.map +1 -0
  13. package/dist/__tests__/e2e/config.js.map +1 -0
  14. package/dist/__tests__/e2e/funnel.test.js.map +1 -0
  15. package/dist/__tests__/e2e/mcp-tools.test.js.map +1 -0
  16. package/dist/__tests__/e2e/provisioning.test.js.map +1 -0
  17. package/dist/{src/__tests__ → __tests__}/handlers-unit.test.js +2 -0
  18. package/dist/__tests__/handlers-unit.test.js.map +1 -0
  19. package/dist/__tests__/namespace.test.js.map +1 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/ckg.js.map +1 -0
  22. package/dist/confidence.js.map +1 -0
  23. package/dist/embeddings.js.map +1 -0
  24. package/dist/handlers/advanced.js.map +1 -0
  25. package/dist/{src/handlers → handlers}/brain.js +141 -135
  26. package/dist/handlers/brain.js.map +1 -0
  27. package/dist/handlers/cache.js.map +1 -0
  28. package/dist/{src/handlers → handlers}/context.js +4 -9
  29. package/dist/handlers/context.js.map +1 -0
  30. package/dist/{src/handlers → handlers}/fedbrain.d.ts +0 -6
  31. package/dist/{src/handlers → handlers}/fedbrain.js +7 -19
  32. package/dist/handlers/fedbrain.js.map +1 -0
  33. package/dist/handlers/instances.js.map +1 -0
  34. package/dist/{src/handlers → handlers}/roadmap.js +3 -7
  35. package/dist/handlers/roadmap.js.map +1 -0
  36. package/dist/handlers/syndicate.js.map +1 -0
  37. package/dist/{src/handlers → handlers}/team.js +3 -1
  38. package/dist/handlers/team.js.map +1 -0
  39. package/dist/{src/index.js → index.js} +428 -206
  40. package/dist/index.js.map +1 -0
  41. package/dist/namespace.js.map +1 -0
  42. package/dist/search.js.map +1 -0
  43. package/dist/search.test.js.map +1 -0
  44. package/dist/{src/tools.d.ts → tools.d.ts} +0 -196
  45. package/dist/{src/tools.js → tools.js} +0 -178
  46. package/dist/tools.js.map +1 -0
  47. package/dist/utils.js.map +1 -0
  48. package/package.json +3 -3
  49. package/smithery.yaml +16 -27
  50. package/src/__tests__/brain-flow.test.ts +0 -174
  51. package/src/__tests__/brain-predict-failures.test.ts +430 -0
  52. package/src/__tests__/handlers-unit.test.ts +2 -1
  53. package/src/handlers/brain.ts +142 -142
  54. package/src/handlers/context.ts +4 -9
  55. package/src/handlers/fedbrain.ts +7 -21
  56. package/src/handlers/roadmap.ts +3 -7
  57. package/src/handlers/team.ts +3 -1
  58. package/src/index.ts +415 -221
  59. package/src/tools.ts +0 -191
  60. package/tsconfig.json +3 -2
  61. package/.github/workflows/eas-build-android.yml +0 -58
  62. package/.github/workflows/eas-update.yml +0 -55
  63. package/STRATEGY.md +0 -209
  64. package/apps/travel-chaos-organizer/.env.example +0 -49
  65. package/apps/travel-chaos-organizer/DEPLOY.md +0 -328
  66. package/apps/travel-chaos-organizer/Makefile +0 -57
  67. package/apps/travel-chaos-organizer/README.md +0 -159
  68. package/apps/travel-chaos-organizer/backend/.env.example +0 -10
  69. package/apps/travel-chaos-organizer/backend/Dockerfile +0 -25
  70. package/apps/travel-chaos-organizer/backend/alembic/env.py +0 -56
  71. package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +0 -24
  72. package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
  73. package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +0 -24
  74. package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +0 -24
  75. package/apps/travel-chaos-organizer/backend/alembic.ini +0 -39
  76. package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
  77. package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
  78. package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +0 -81
  79. package/apps/travel-chaos-organizer/backend/app/config.py +0 -66
  80. package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
  81. package/apps/travel-chaos-organizer/backend/app/db/database.py +0 -20
  82. package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +0 -71
  83. package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +0 -31
  84. package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +0 -4
  85. package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +0 -5
  86. package/apps/travel-chaos-organizer/backend/app/limiter.py +0 -4
  87. package/apps/travel-chaos-organizer/backend/app/logging_config.py +0 -25
  88. package/apps/travel-chaos-organizer/backend/app/main.py +0 -77
  89. package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
  90. package/apps/travel-chaos-organizer/backend/app/models/schemas.py +0 -142
  91. package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
  92. package/apps/travel-chaos-organizer/backend/app/routers/admin.py +0 -237
  93. package/apps/travel-chaos-organizer/backend/app/routers/cache.py +0 -13
  94. package/apps/travel-chaos-organizer/backend/app/routers/events.py +0 -29
  95. package/apps/travel-chaos-organizer/backend/app/routers/export.py +0 -122
  96. package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +0 -122
  97. package/apps/travel-chaos-organizer/backend/app/routers/items.py +0 -130
  98. package/apps/travel-chaos-organizer/backend/app/routers/mail.py +0 -108
  99. package/apps/travel-chaos-organizer/backend/app/routers/parse.py +0 -303
  100. package/apps/travel-chaos-organizer/backend/app/routers/payments.py +0 -179
  101. package/apps/travel-chaos-organizer/backend/app/routers/trips.py +0 -134
  102. package/apps/travel-chaos-organizer/backend/app/routers/users.py +0 -169
  103. package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +0 -37
  104. package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
  105. package/apps/travel-chaos-organizer/backend/app/services/cache.py +0 -131
  106. package/apps/travel-chaos-organizer/backend/app/services/drip.py +0 -128
  107. package/apps/travel-chaos-organizer/backend/app/services/email.py +0 -61
  108. package/apps/travel-chaos-organizer/backend/app/services/errors.py +0 -44
  109. package/apps/travel-chaos-organizer/backend/app/services/notifier.py +0 -10
  110. package/apps/travel-chaos-organizer/backend/app/services/ollama.py +0 -101
  111. package/apps/travel-chaos-organizer/backend/app/services/parser.py +0 -22
  112. package/apps/travel-chaos-organizer/backend/app/services/quota.py +0 -85
  113. package/apps/travel-chaos-organizer/backend/app/services/sentry.py +0 -11
  114. package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +0 -35
  115. package/apps/travel-chaos-organizer/backend/pytest.ini +0 -4
  116. package/apps/travel-chaos-organizer/backend/requirements-dev.txt +0 -6
  117. package/apps/travel-chaos-organizer/backend/requirements.txt +0 -25
  118. package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
  119. package/apps/travel-chaos-organizer/backend/tests/conftest.py +0 -223
  120. package/apps/travel-chaos-organizer/backend/tests/test_admin.py +0 -99
  121. package/apps/travel-chaos-organizer/backend/tests/test_cache.py +0 -142
  122. package/apps/travel-chaos-organizer/backend/tests/test_drip.py +0 -32
  123. package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +0 -121
  124. package/apps/travel-chaos-organizer/backend/tests/test_export.py +0 -48
  125. package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +0 -107
  126. package/apps/travel-chaos-organizer/backend/tests/test_items.py +0 -138
  127. package/apps/travel-chaos-organizer/backend/tests/test_mail.py +0 -113
  128. package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +0 -145
  129. package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +0 -98
  130. package/apps/travel-chaos-organizer/backend/tests/test_parser.py +0 -72
  131. package/apps/travel-chaos-organizer/backend/tests/test_payments.py +0 -163
  132. package/apps/travel-chaos-organizer/backend/tests/test_quota.py +0 -46
  133. package/apps/travel-chaos-organizer/backend/tests/test_search.py +0 -67
  134. package/apps/travel-chaos-organizer/backend/tests/test_trips.py +0 -123
  135. package/apps/travel-chaos-organizer/backend/tests/test_users.py +0 -52
  136. package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
  137. package/apps/travel-chaos-organizer/caddy/Caddyfile +0 -27
  138. package/apps/travel-chaos-organizer/docker-compose.node1.yml +0 -31
  139. package/apps/travel-chaos-organizer/docker-compose.override.yml +0 -14
  140. package/apps/travel-chaos-organizer/docker-compose.yml +0 -128
  141. package/apps/travel-chaos-organizer/frontend/.env.example +0 -13
  142. package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +0 -80
  143. package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +0 -166
  144. package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +0 -130
  145. package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +0 -381
  146. package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +0 -346
  147. package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +0 -363
  148. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +0 -34
  149. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +0 -35
  150. package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +0 -91
  151. package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +0 -71
  152. package/apps/travel-chaos-organizer/frontend/app/auth.tsx +0 -29
  153. package/apps/travel-chaos-organizer/frontend/app/index.tsx +0 -16
  154. package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +0 -119
  155. package/apps/travel-chaos-organizer/frontend/app.config.ts +0 -54
  156. package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +0 -66
  157. package/apps/travel-chaos-organizer/frontend/assets/icon.svg +0 -79
  158. package/apps/travel-chaos-organizer/frontend/assets/splash.svg +0 -15
  159. package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +0 -102
  160. package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +0 -107
  161. package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +0 -109
  162. package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +0 -45
  163. package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +0 -19
  164. package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +0 -155
  165. package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +0 -55
  166. package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +0 -80
  167. package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +0 -39
  168. package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +0 -39
  169. package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +0 -70
  170. package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +0 -121
  171. package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +0 -70
  172. package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +0 -73
  173. package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +0 -130
  174. package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +0 -60
  175. package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +0 -42
  176. package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +0 -146
  177. package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +0 -70
  178. package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +0 -44
  179. package/apps/travel-chaos-organizer/frontend/eas.json +0 -22
  180. package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +0 -24
  181. package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +0 -60
  182. package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +0 -112
  183. package/apps/travel-chaos-organizer/frontend/lib/api.ts +0 -223
  184. package/apps/travel-chaos-organizer/frontend/lib/auth.ts +0 -93
  185. package/apps/travel-chaos-organizer/frontend/lib/db.ts +0 -86
  186. package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +0 -54
  187. package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +0 -13
  188. package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +0 -112
  189. package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +0 -145
  190. package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +0 -43
  191. package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +0 -28
  192. package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +0 -44
  193. package/apps/travel-chaos-organizer/frontend/package-lock.json +0 -13037
  194. package/apps/travel-chaos-organizer/frontend/package.json +0 -44
  195. package/apps/travel-chaos-organizer/frontend/tsconfig.json +0 -23
  196. package/apps/travel-chaos-organizer/keycloak/realm-export.json +0 -59
  197. package/apps/travel-chaos-organizer/landing/index.html +0 -773
  198. package/apps/travel-chaos-organizer/scripts/backup.sh +0 -14
  199. package/apps/travel-chaos-organizer/scripts/configure-env.sh +0 -82
  200. package/apps/travel-chaos-organizer/scripts/deploy.sh +0 -54
  201. package/apps/travel-chaos-organizer/scripts/health-check.sh +0 -36
  202. package/apps/travel-chaos-organizer/scripts/migrate.sh +0 -7
  203. package/apps/travel-chaos-organizer/scripts/server-setup.sh +0 -85
  204. package/apps/travel-chaos-organizer/scripts/smoke-test.sh +0 -29
  205. package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +0 -71
  206. package/apps/travel-chaos-organizer/telegram-bot/.env.example +0 -3
  207. package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +0 -6
  208. package/apps/travel-chaos-organizer/telegram-bot/bot.py +0 -504
  209. package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +0 -3
  210. package/dist/packages/telegram-notify/client.d.ts +0 -19
  211. package/dist/packages/telegram-notify/client.js +0 -75
  212. package/dist/packages/telegram-notify/client.js.map +0 -1
  213. package/dist/src/__tests__/auth.test.js.map +0 -1
  214. package/dist/src/__tests__/brain-flow.test.js.map +0 -1
  215. package/dist/src/__tests__/confidence.test.js.map +0 -1
  216. package/dist/src/__tests__/e2e/api-auth.test.js.map +0 -1
  217. package/dist/src/__tests__/e2e/api-health.test.js.map +0 -1
  218. package/dist/src/__tests__/e2e/cli.test.js.map +0 -1
  219. package/dist/src/__tests__/e2e/config.js.map +0 -1
  220. package/dist/src/__tests__/e2e/funnel.test.js.map +0 -1
  221. package/dist/src/__tests__/e2e/mcp-tools.test.js.map +0 -1
  222. package/dist/src/__tests__/e2e/provisioning.test.js.map +0 -1
  223. package/dist/src/__tests__/handlers-unit.test.js.map +0 -1
  224. package/dist/src/__tests__/namespace.test.js.map +0 -1
  225. package/dist/src/auth.js.map +0 -1
  226. package/dist/src/ckg.js.map +0 -1
  227. package/dist/src/confidence.js.map +0 -1
  228. package/dist/src/embeddings.js.map +0 -1
  229. package/dist/src/handlers/advanced.js.map +0 -1
  230. package/dist/src/handlers/brain.js.map +0 -1
  231. package/dist/src/handlers/cache.js.map +0 -1
  232. package/dist/src/handlers/context.js.map +0 -1
  233. package/dist/src/handlers/fedbrain.js.map +0 -1
  234. package/dist/src/handlers/instances.js.map +0 -1
  235. package/dist/src/handlers/roadmap.js.map +0 -1
  236. package/dist/src/handlers/syndicate.js.map +0 -1
  237. package/dist/src/handlers/tco.d.ts +0 -16
  238. package/dist/src/handlers/tco.js +0 -303
  239. package/dist/src/handlers/tco.js.map +0 -1
  240. package/dist/src/handlers/team.js.map +0 -1
  241. package/dist/src/index.js.map +0 -1
  242. package/dist/src/namespace.js.map +0 -1
  243. package/dist/src/notifier.d.ts +0 -5
  244. package/dist/src/notifier.js +0 -6
  245. package/dist/src/notifier.js.map +0 -1
  246. package/dist/src/search.js.map +0 -1
  247. package/dist/src/search.test.js.map +0 -1
  248. package/dist/src/tools.js.map +0 -1
  249. package/dist/src/utils.js.map +0 -1
  250. package/packages/telegram-notify/SPLIT_PLAN.md +0 -106
  251. package/packages/telegram-notify/client.ts +0 -88
  252. package/packages/telegram-notify/emojis.json +0 -22
  253. package/packages/telegram-notify/pyproject.toml +0 -17
  254. package/packages/telegram-notify/telegram_notify/__init__.py +0 -3
  255. package/packages/telegram-notify/telegram_notify/client.py +0 -87
  256. package/packages/telegram-notify/telegram_notify/emojis.json +0 -22
  257. package/scripts/generate-icons.js +0 -28
  258. package/src/handlers/tco.ts +0 -347
  259. package/src/notifier.ts +0 -5
  260. /package/dist/{src/__tests__ → __tests__}/auth.test.d.ts +0 -0
  261. /package/dist/{src/__tests__ → __tests__}/auth.test.js +0 -0
  262. /package/dist/{src/__tests__ → __tests__}/brain-flow.test.d.ts +0 -0
  263. /package/dist/{src/__tests__ → __tests__}/confidence.test.d.ts +0 -0
  264. /package/dist/{src/__tests__ → __tests__}/confidence.test.js +0 -0
  265. /package/dist/{src/__tests__ → __tests__}/e2e/api-auth.test.d.ts +0 -0
  266. /package/dist/{src/__tests__ → __tests__}/e2e/api-auth.test.js +0 -0
  267. /package/dist/{src/__tests__ → __tests__}/e2e/api-health.test.d.ts +0 -0
  268. /package/dist/{src/__tests__ → __tests__}/e2e/api-health.test.js +0 -0
  269. /package/dist/{src/__tests__ → __tests__}/e2e/cli.test.d.ts +0 -0
  270. /package/dist/{src/__tests__ → __tests__}/e2e/cli.test.js +0 -0
  271. /package/dist/{src/__tests__ → __tests__}/e2e/config.d.ts +0 -0
  272. /package/dist/{src/__tests__ → __tests__}/e2e/config.js +0 -0
  273. /package/dist/{src/__tests__ → __tests__}/e2e/funnel.test.d.ts +0 -0
  274. /package/dist/{src/__tests__ → __tests__}/e2e/funnel.test.js +0 -0
  275. /package/dist/{src/__tests__ → __tests__}/e2e/mcp-tools.test.d.ts +0 -0
  276. /package/dist/{src/__tests__ → __tests__}/e2e/mcp-tools.test.js +0 -0
  277. /package/dist/{src/__tests__ → __tests__}/e2e/provisioning.test.d.ts +0 -0
  278. /package/dist/{src/__tests__ → __tests__}/e2e/provisioning.test.js +0 -0
  279. /package/dist/{src/__tests__ → __tests__}/handlers-unit.test.d.ts +0 -0
  280. /package/dist/{src/__tests__ → __tests__}/namespace.test.d.ts +0 -0
  281. /package/dist/{src/__tests__ → __tests__}/namespace.test.js +0 -0
  282. /package/dist/{src/auth.d.ts → auth.d.ts} +0 -0
  283. /package/dist/{src/auth.js → auth.js} +0 -0
  284. /package/dist/{src/ckg.d.ts → ckg.d.ts} +0 -0
  285. /package/dist/{src/ckg.js → ckg.js} +0 -0
  286. /package/dist/{src/confidence.d.ts → confidence.d.ts} +0 -0
  287. /package/dist/{src/confidence.js → confidence.js} +0 -0
  288. /package/dist/{src/embeddings.d.ts → embeddings.d.ts} +0 -0
  289. /package/dist/{src/embeddings.js → embeddings.js} +0 -0
  290. /package/dist/{src/handlers → handlers}/advanced.d.ts +0 -0
  291. /package/dist/{src/handlers → handlers}/advanced.js +0 -0
  292. /package/dist/{src/handlers → handlers}/brain.d.ts +0 -0
  293. /package/dist/{src/handlers → handlers}/cache.d.ts +0 -0
  294. /package/dist/{src/handlers → handlers}/cache.js +0 -0
  295. /package/dist/{src/handlers → handlers}/context.d.ts +0 -0
  296. /package/dist/{src/handlers → handlers}/instances.d.ts +0 -0
  297. /package/dist/{src/handlers → handlers}/instances.js +0 -0
  298. /package/dist/{src/handlers → handlers}/roadmap.d.ts +0 -0
  299. /package/dist/{src/handlers → handlers}/syndicate.d.ts +0 -0
  300. /package/dist/{src/handlers → handlers}/syndicate.js +0 -0
  301. /package/dist/{src/handlers → handlers}/team.d.ts +0 -0
  302. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  303. /package/dist/{src/namespace.d.ts → namespace.d.ts} +0 -0
  304. /package/dist/{src/namespace.js → namespace.js} +0 -0
  305. /package/dist/{src/search.d.ts → search.d.ts} +0 -0
  306. /package/dist/{src/search.js → search.js} +0 -0
  307. /package/dist/{src/search.test.d.ts → search.test.d.ts} +0 -0
  308. /package/dist/{src/search.test.js → search.test.js} +0 -0
  309. /package/dist/{src/utils.d.ts → utils.d.ts} +0 -0
  310. /package/dist/{src/utils.js → utils.js} +0 -0
@@ -1,346 +0,0 @@
1
- import React, { useEffect, useState } from "react";
2
- import {
3
- ActivityIndicator, BackHandler, FlatList, KeyboardAvoidingView,
4
- Platform, Share, StyleSheet, Text, TouchableOpacity, View,
5
- } from "react-native";
6
- import ConfettiCannon from "../../../components/ConfettiCannon";
7
- import { useLocalSearchParams, useRouter, useFocusEffect } from "expo-router";
8
- import ConfirmDialog from "../../../components/ConfirmDialog";
9
- import { useSafeAreaInsets } from "react-native-safe-area-context";
10
- import * as DocumentPicker from "expo-document-picker";
11
- import * as ImagePicker from "expo-image-picker";
12
- import { useTripItems, useTrips } from "../../../hooks/useTrips";
13
- import { ApiError, parseFile, TripItem } from "../../../lib/api";
14
- import SwipeableTimelineItem from "../../../components/SwipeableTimelineItem";
15
- import TimelineItemDetail from "../../../components/TimelineItemDetail";
16
- import ImportSheet from "../../../components/ImportSheet";
17
- import FileUploadButton from "../../../components/FileUploadButton";
18
- import { TimelineItemSkeleton } from "../../../components/Skeleton";
19
- import { haptics } from "../../../lib/haptics";
20
- import { useToast } from "../../../components/ToastContext";
21
- import { scheduleItemReminder } from "../../../lib/notifications";
22
- import { getLocalItems } from "../../../lib/db";
23
- import { format, parseISO } from "date-fns";
24
- import { de } from "date-fns/locale";
25
-
26
- export default function TripDetailScreen() {
27
- const { id, sharedUri, sharedMime, sharedName } = useLocalSearchParams<{
28
- id: string;
29
- sharedUri?: string;
30
- sharedMime?: string;
31
- sharedName?: string;
32
- }>();
33
- const router = useRouter();
34
- const insets = useSafeAreaInsets();
35
- const { items, loading, refresh, deleteItem } = useTripItems(id);
36
- const { deleteTrip, trips } = useTrips();
37
- const { showToast } = useToast();
38
- const [parsing, setParsing] = useState(false);
39
- const [showConfetti, setShowConfetti] = useState(false);
40
- const [selectedItem, setSelectedItem] = useState<TripItem | null>(null);
41
- const [importVisible, setImportVisible] = useState(false);
42
- const [dialog, setDialog] = useState<{ title: string; message?: string; onConfirm: () => void; destructive?: boolean } | null>(null);
43
-
44
- useFocusEffect(
45
- React.useCallback(() => {
46
- const handler = BackHandler.addEventListener('hardwareBackPress', () => {
47
- if (parsing) {
48
- setDialog({ title: 'Upload läuft', message: 'Ein Dokument wird gerade verarbeitet. Trotzdem zurück?', onConfirm: () => router.back(), destructive: true });
49
- return true;
50
- }
51
- return false;
52
- });
53
- return () => handler.remove();
54
- }, [parsing])
55
- );
56
-
57
- useEffect(() => {
58
- if (sharedUri) {
59
- parseAndRefresh(sharedUri, sharedMime ?? "application/octet-stream", sharedName ?? "shared-file");
60
- }
61
- }, [sharedUri]);
62
-
63
- async function uploadDocument() {
64
- const result = await DocumentPicker.getDocumentAsync({ type: ["application/pdf", "image/*", "text/*"] });
65
- if (result.canceled) return;
66
- const asset = result.assets[0];
67
- await parseAndRefresh(asset.uri, asset.mimeType ?? "application/octet-stream", asset.name);
68
- }
69
-
70
- async function uploadScreenshot() {
71
- const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, quality: 0.9 });
72
- if (result.canceled) return;
73
- const asset = result.assets[0];
74
- await parseAndRefresh(asset.uri, "image/jpeg", "screenshot.jpg");
75
- }
76
-
77
- async function parseAndRefresh(uri: string, mime: string, name: string) {
78
- setParsing(true);
79
- await haptics.confirm();
80
- // Capture existing item IDs before upload so we can identify the new item
81
- // after refresh — and only schedule a reminder for that one item.
82
- // Without this, every upload would re-schedule reminders for ALL existing
83
- // items, causing duplicate (or spam) notifications.
84
- const itemIdsBefore = new Set(getLocalItems(id).map((i) => i.id));
85
- const currentTrip = trips.find((t) => t.id === id);
86
- const tripName = currentTrip?.name ?? "Dein Trip";
87
- try {
88
- await parseFile(uri, mime, name, id);
89
- await haptics.success();
90
- await refresh();
91
- // After refresh, SQLite is up-to-date. Find only the newly added item(s).
92
- const allItems = getLocalItems(id);
93
- for (const item of allItems) {
94
- if (!itemIdsBefore.has(item.id) && item.event_at) {
95
- await scheduleItemReminder(id, tripName, item.id, item.title, item.event_at);
96
- }
97
- }
98
- setShowConfetti(true);
99
- setTimeout(() => setShowConfetti(false), 1500);
100
- } catch (err) {
101
- await haptics.error();
102
- if (err instanceof ApiError && err.status === 429) {
103
- showToast("Tageslimit erreicht (50 Parses/Tag). Upgrade auf Pro.", "warning");
104
- } else if (err instanceof ApiError && err.status === 408) {
105
- showToast("Timeout — Ollama antwortet nicht. Bitte warte und versuche es erneut.", "error");
106
- } else if (err instanceof ApiError && err.status === 413) {
107
- showToast("Datei zu groß (max. 10 MB).", "error");
108
- } else if (err instanceof ApiError && err.status === 415) {
109
- showToast("Dateityp nicht unterstützt (PDF, Bild oder Text).", "error");
110
- } else {
111
- showToast("Datei konnte nicht verarbeitet werden. Prüfe Ollama.", "error");
112
- }
113
- } finally {
114
- setParsing(false);
115
- }
116
- }
117
-
118
- function handleDeleteItem(itemId: string) {
119
- setDialog({
120
- title: "Eintrag löschen?",
121
- message: "Dieser Eintrag wird dauerhaft entfernt.",
122
- destructive: true,
123
- onConfirm: async () => {
124
- await haptics.warning();
125
- await deleteItem(itemId);
126
- },
127
- });
128
- }
129
-
130
- function handleDeleteTrip() {
131
- setDialog({
132
- title: "Trip löschen?",
133
- message: "Alle Einträge und Daten werden gelöscht.",
134
- destructive: true,
135
- onConfirm: async () => {
136
- await haptics.error();
137
- await deleteTrip(id);
138
- router.back();
139
- },
140
- });
141
- }
142
-
143
- async function handleTapItem(item: TripItem) {
144
- await haptics.tap();
145
- setSelectedItem(item);
146
- }
147
-
148
- async function handleShareTrip() {
149
- const currentTrip = trips.find(t => t.id === id);
150
- const tripName = currentTrip?.name ?? "Mein Trip";
151
- const lines: string[] = [];
152
-
153
- lines.push(`✈️ Mein Trip: ${tripName}`);
154
-
155
- if (currentTrip?.start_date) {
156
- const startStr = format(parseISO(currentTrip.start_date), "dd. MMM", { locale: de });
157
- if (currentTrip.end_date) {
158
- const endStr = format(parseISO(currentTrip.end_date), "dd. MMM yyyy", { locale: de });
159
- const diffMs = new Date(currentTrip.end_date).getTime() - new Date(currentTrip.start_date).getTime();
160
- const days = Math.round(diffMs / (1000 * 60 * 60 * 24));
161
- lines.push(`📅 ${startStr} → ${endStr} (${days} Tage)`);
162
- } else {
163
- lines.push(`📅 ${startStr}`);
164
- }
165
- }
166
-
167
- if (items.length > 0) {
168
- const types = Array.from(new Set(items.map(i => i.type).filter(Boolean))) as string[];
169
- const capitalizedTypes = types.map(t => t.charAt(0).toUpperCase() + t.slice(1));
170
- const displayTypes = capitalizedTypes.length > 3
171
- ? `${capitalizedTypes.slice(0, 3).join(", ")} + mehr`
172
- : capitalizedTypes.join(", ");
173
- lines.push(`📋 ${items.length} Einträge${displayTypes ? ` (${displayTypes})` : ""}`);
174
- }
175
-
176
- const refs = items.map(i => i.booking_ref).filter(Boolean) as string[];
177
- if (refs.length > 0) {
178
- const displayRefs = refs.length > 3
179
- ? `${refs.slice(0, 3).join(", ")} + mehr`
180
- : refs.join(", ");
181
- lines.push(`🔑 ${displayRefs}`);
182
- }
183
-
184
- lines.push("");
185
- lines.push("Erstellt mit Travel Chaos Organizer");
186
-
187
- await Share.share({ message: lines.join("\n") });
188
- }
189
-
190
- return (
191
- <KeyboardAvoidingView style={s.container} behavior={Platform.OS === "ios" ? "padding" : "height"}>
192
- <View style={[s.header, { paddingTop: insets.top + 8 }]}>
193
- <TouchableOpacity
194
- onPress={() => {
195
- if (parsing) {
196
- setDialog({ title: 'Upload läuft', message: 'Ein Dokument wird gerade verarbeitet. Trotzdem zurück?', onConfirm: () => router.back(), destructive: true });
197
- } else {
198
- router.back();
199
- }
200
- }}
201
- style={s.back}
202
- hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}
203
- accessibilityLabel="Zurück"
204
- accessibilityRole="button"
205
- >
206
- <Text style={s.backText}>← Zurück</Text>
207
- </TouchableOpacity>
208
-
209
- <Text style={s.headerTitle} numberOfLines={1}>
210
- {trips.find((t) => t.id === id)?.name ?? "Timeline"}
211
- </Text>
212
-
213
- <TouchableOpacity
214
- onPress={handleShareTrip}
215
- style={s.shareBtn}
216
- hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}
217
- accessibilityLabel="Trip teilen"
218
- accessibilityRole="button"
219
- >
220
- <Text style={s.shareBtnText}>↗</Text>
221
- </TouchableOpacity>
222
-
223
- <TouchableOpacity
224
- onPress={handleDeleteTrip}
225
- style={s.deleteBtn}
226
- hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}
227
- accessibilityLabel="Trip löschen"
228
- accessibilityRole="button"
229
- >
230
- <Text style={s.deleteBtnText}>🗑️</Text>
231
- </TouchableOpacity>
232
- </View>
233
-
234
- {parsing && (
235
- <View style={s.parsingBanner}>
236
- <ActivityIndicator color="#4f46e5" size="small" />
237
- <Text style={s.parsingText}>Ollama analysiert Dokument…</Text>
238
- </View>
239
- )}
240
-
241
- <FlatList
242
- data={items}
243
- keyExtractor={(i) => i.id}
244
- contentContainerStyle={items.length === 0 ? s.emptyContainer : s.list}
245
- refreshing={loading}
246
- onRefresh={refresh}
247
- ListHeaderComponent={
248
- items.length > 0
249
- ? <Text style={s.hint}>Tippen für Details · ← Wischen zum Löschen</Text>
250
- : null
251
- }
252
- ListEmptyComponent={
253
- loading
254
- ? <View style={s.list}>{[1, 2, 3].map(k => <TimelineItemSkeleton key={k} />)}</View>
255
- : <View style={s.empty}>
256
- <Text style={s.emptyIcon}>📂</Text>
257
- <Text style={s.emptyTitle}>Noch keine Einträge</Text>
258
- <Text style={s.emptySub}>Lade ein Dokument hoch oder füge Text ein.</Text>
259
- </View>
260
- }
261
- renderItem={({ item }) => (
262
- <TouchableOpacity
263
- onPress={() => handleTapItem(item)}
264
- activeOpacity={0.85}
265
- accessibilityLabel={`${item.title} — Details anzeigen`}
266
- accessibilityRole="button"
267
- >
268
- <SwipeableTimelineItem
269
- item={item}
270
- onDelete={() => handleDeleteItem(item.id)}
271
- />
272
- </TouchableOpacity>
273
- )}
274
- />
275
-
276
- <View style={[s.uploadBar, { paddingBottom: insets.bottom + 8 }]}>
277
- <FileUploadButton icon="📄" label="PDF / Datei" onPress={uploadDocument} disabled={parsing} />
278
- <FileUploadButton icon="🖼️" label="Screenshot" onPress={uploadScreenshot} disabled={parsing} />
279
- <FileUploadButton
280
- icon="📝"
281
- label="Text / E-Mail"
282
- onPress={() => setImportVisible(true)}
283
- disabled={parsing}
284
- />
285
- </View>
286
-
287
- {/* Timeline item detail */}
288
- <TimelineItemDetail
289
- item={selectedItem}
290
- onClose={() => setSelectedItem(null)}
291
- />
292
-
293
- {/* In-app text/email import */}
294
- <ImportSheet
295
- visible={importVisible}
296
- onClose={() => setImportVisible(false)}
297
- tripId={id}
298
- onSuccess={refresh}
299
- />
300
-
301
- <ConfirmDialog
302
- visible={!!dialog}
303
- title={dialog?.title ?? ""}
304
- message={dialog?.message}
305
- actions={[
306
- {
307
- label: dialog?.destructive ? "Ja, löschen" : "Ja, zurück",
308
- style: "destructive",
309
- onPress: () => { setDialog(null); dialog?.onConfirm(); },
310
- },
311
- { label: "Abbrechen", style: "cancel", onPress: () => setDialog(null) },
312
- ]}
313
- />
314
-
315
- <ConfettiCannon visible={showConfetti} />
316
- </KeyboardAvoidingView>
317
- );
318
- }
319
-
320
- const s = StyleSheet.create({
321
- container: { flex: 1, backgroundColor: "#0f0f1a" },
322
- header: {
323
- flexDirection: "row", alignItems: "center", paddingHorizontal: 16,
324
- paddingBottom: 12, backgroundColor: "#1a1a2e",
325
- },
326
- back: { paddingVertical: 4 },
327
- backText: { color: "#4f46e5", fontSize: 15 },
328
- headerTitle: { flex: 1, color: "#fff", fontSize: 18, fontWeight: "700", textAlign: "center" },
329
- deleteBtn: { padding: 4 },
330
- deleteBtnText: { fontSize: 18 },
331
- shareBtn: { padding: 4, marginRight: 8 },
332
- shareBtnText: { color: "#a5b4fc", fontSize: 20, fontWeight: "300" },
333
- parsingBanner: { flexDirection: "row", alignItems: "center", gap: 8, backgroundColor: "#4f46e522", padding: 10, paddingHorizontal: 16 },
334
- parsingText: { color: "#a5b4fc", fontSize: 14 },
335
- hint: { color: "#3a3a5e", fontSize: 12, textAlign: "center", marginBottom: 8 },
336
- list: { padding: 16, gap: 1 },
337
- emptyContainer: { flex: 1 },
338
- empty: { flex: 1, alignItems: "center", justifyContent: "center", padding: 48 },
339
- emptyIcon: { fontSize: 56, marginBottom: 16 },
340
- emptyTitle: { fontSize: 20, fontWeight: "700", color: "#fff", marginBottom: 8 },
341
- emptySub: { fontSize: 14, color: "#6666aa", textAlign: "center" },
342
- uploadBar: {
343
- flexDirection: "row", gap: 8, padding: 12,
344
- backgroundColor: "#1a1a2e", borderTopWidth: 1, borderTopColor: "#2a2a4e",
345
- },
346
- });