@cachly-dev/mcp-server 0.10.65 → 0.10.66

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 (269) hide show
  1. package/dist/src/handlers/brain.js +1 -1
  2. package/dist/src/index.js +1 -1
  3. package/package.json +7 -1
  4. package/server.json +2 -2
  5. package/.env.test.example +0 -23
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -50
  7. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -25
  9. package/.github/workflows/eas-build-android.yml +0 -58
  10. package/.github/workflows/eas-update.yml +0 -55
  11. package/.github/workflows/publish.yml +0 -72
  12. package/BENCH.md +0 -113
  13. package/CHANGELOG.md +0 -653
  14. package/Dockerfile +0 -16
  15. package/LAUNCH_TEXTS.md +0 -182
  16. package/PROGRESS.md +0 -141
  17. package/STRATEGY.md +0 -228
  18. package/VISION_10X.md +0 -133
  19. package/apps/travel-chaos-organizer/.env.example +0 -49
  20. package/apps/travel-chaos-organizer/DEPLOY.md +0 -328
  21. package/apps/travel-chaos-organizer/Makefile +0 -57
  22. package/apps/travel-chaos-organizer/README.md +0 -159
  23. package/apps/travel-chaos-organizer/backend/.env.example +0 -10
  24. package/apps/travel-chaos-organizer/backend/Dockerfile +0 -25
  25. package/apps/travel-chaos-organizer/backend/alembic/env.py +0 -56
  26. package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +0 -24
  27. package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
  28. package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +0 -24
  29. package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +0 -24
  30. package/apps/travel-chaos-organizer/backend/alembic.ini +0 -39
  31. package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
  32. package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
  33. package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +0 -81
  34. package/apps/travel-chaos-organizer/backend/app/config.py +0 -66
  35. package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
  36. package/apps/travel-chaos-organizer/backend/app/db/database.py +0 -20
  37. package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +0 -71
  38. package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +0 -31
  39. package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +0 -4
  40. package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +0 -5
  41. package/apps/travel-chaos-organizer/backend/app/limiter.py +0 -4
  42. package/apps/travel-chaos-organizer/backend/app/logging_config.py +0 -25
  43. package/apps/travel-chaos-organizer/backend/app/main.py +0 -77
  44. package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
  45. package/apps/travel-chaos-organizer/backend/app/models/schemas.py +0 -142
  46. package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
  47. package/apps/travel-chaos-organizer/backend/app/routers/admin.py +0 -237
  48. package/apps/travel-chaos-organizer/backend/app/routers/cache.py +0 -13
  49. package/apps/travel-chaos-organizer/backend/app/routers/events.py +0 -29
  50. package/apps/travel-chaos-organizer/backend/app/routers/export.py +0 -122
  51. package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +0 -122
  52. package/apps/travel-chaos-organizer/backend/app/routers/items.py +0 -130
  53. package/apps/travel-chaos-organizer/backend/app/routers/mail.py +0 -108
  54. package/apps/travel-chaos-organizer/backend/app/routers/parse.py +0 -303
  55. package/apps/travel-chaos-organizer/backend/app/routers/payments.py +0 -179
  56. package/apps/travel-chaos-organizer/backend/app/routers/trips.py +0 -134
  57. package/apps/travel-chaos-organizer/backend/app/routers/users.py +0 -169
  58. package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +0 -37
  59. package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
  60. package/apps/travel-chaos-organizer/backend/app/services/cache.py +0 -131
  61. package/apps/travel-chaos-organizer/backend/app/services/drip.py +0 -128
  62. package/apps/travel-chaos-organizer/backend/app/services/email.py +0 -61
  63. package/apps/travel-chaos-organizer/backend/app/services/errors.py +0 -44
  64. package/apps/travel-chaos-organizer/backend/app/services/notifier.py +0 -10
  65. package/apps/travel-chaos-organizer/backend/app/services/ollama.py +0 -101
  66. package/apps/travel-chaos-organizer/backend/app/services/parser.py +0 -22
  67. package/apps/travel-chaos-organizer/backend/app/services/quota.py +0 -85
  68. package/apps/travel-chaos-organizer/backend/app/services/sentry.py +0 -11
  69. package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +0 -35
  70. package/apps/travel-chaos-organizer/backend/pytest.ini +0 -4
  71. package/apps/travel-chaos-organizer/backend/requirements-dev.txt +0 -6
  72. package/apps/travel-chaos-organizer/backend/requirements.txt +0 -25
  73. package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
  74. package/apps/travel-chaos-organizer/backend/tests/conftest.py +0 -223
  75. package/apps/travel-chaos-organizer/backend/tests/test_admin.py +0 -99
  76. package/apps/travel-chaos-organizer/backend/tests/test_cache.py +0 -142
  77. package/apps/travel-chaos-organizer/backend/tests/test_drip.py +0 -32
  78. package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +0 -121
  79. package/apps/travel-chaos-organizer/backend/tests/test_export.py +0 -48
  80. package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +0 -107
  81. package/apps/travel-chaos-organizer/backend/tests/test_items.py +0 -138
  82. package/apps/travel-chaos-organizer/backend/tests/test_mail.py +0 -113
  83. package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +0 -145
  84. package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +0 -98
  85. package/apps/travel-chaos-organizer/backend/tests/test_parser.py +0 -72
  86. package/apps/travel-chaos-organizer/backend/tests/test_payments.py +0 -163
  87. package/apps/travel-chaos-organizer/backend/tests/test_quota.py +0 -46
  88. package/apps/travel-chaos-organizer/backend/tests/test_search.py +0 -67
  89. package/apps/travel-chaos-organizer/backend/tests/test_trips.py +0 -123
  90. package/apps/travel-chaos-organizer/backend/tests/test_users.py +0 -52
  91. package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
  92. package/apps/travel-chaos-organizer/caddy/Caddyfile +0 -27
  93. package/apps/travel-chaos-organizer/docker-compose.node1.yml +0 -31
  94. package/apps/travel-chaos-organizer/docker-compose.override.yml +0 -14
  95. package/apps/travel-chaos-organizer/docker-compose.yml +0 -128
  96. package/apps/travel-chaos-organizer/frontend/.env.example +0 -13
  97. package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +0 -80
  98. package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +0 -166
  99. package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +0 -130
  100. package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +0 -381
  101. package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +0 -346
  102. package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +0 -363
  103. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +0 -34
  104. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +0 -35
  105. package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +0 -91
  106. package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +0 -71
  107. package/apps/travel-chaos-organizer/frontend/app/auth.tsx +0 -29
  108. package/apps/travel-chaos-organizer/frontend/app/index.tsx +0 -16
  109. package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +0 -119
  110. package/apps/travel-chaos-organizer/frontend/app.config.ts +0 -54
  111. package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +0 -66
  112. package/apps/travel-chaos-organizer/frontend/assets/icon.svg +0 -79
  113. package/apps/travel-chaos-organizer/frontend/assets/splash.svg +0 -15
  114. package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +0 -102
  115. package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +0 -107
  116. package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +0 -109
  117. package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +0 -45
  118. package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +0 -19
  119. package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +0 -155
  120. package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +0 -55
  121. package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +0 -80
  122. package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +0 -39
  123. package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +0 -39
  124. package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +0 -70
  125. package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +0 -121
  126. package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +0 -70
  127. package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +0 -73
  128. package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +0 -130
  129. package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +0 -60
  130. package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +0 -42
  131. package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +0 -146
  132. package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +0 -70
  133. package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +0 -44
  134. package/apps/travel-chaos-organizer/frontend/eas.json +0 -22
  135. package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +0 -24
  136. package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +0 -60
  137. package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +0 -112
  138. package/apps/travel-chaos-organizer/frontend/lib/api.ts +0 -223
  139. package/apps/travel-chaos-organizer/frontend/lib/auth.ts +0 -93
  140. package/apps/travel-chaos-organizer/frontend/lib/db.ts +0 -86
  141. package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +0 -54
  142. package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +0 -13
  143. package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +0 -112
  144. package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +0 -145
  145. package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +0 -43
  146. package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +0 -28
  147. package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +0 -44
  148. package/apps/travel-chaos-organizer/frontend/package-lock.json +0 -13221
  149. package/apps/travel-chaos-organizer/frontend/package.json +0 -44
  150. package/apps/travel-chaos-organizer/frontend/tsconfig.json +0 -23
  151. package/apps/travel-chaos-organizer/keycloak/realm-export.json +0 -59
  152. package/apps/travel-chaos-organizer/landing/index.html +0 -773
  153. package/apps/travel-chaos-organizer/scripts/backup.sh +0 -14
  154. package/apps/travel-chaos-organizer/scripts/configure-env.sh +0 -82
  155. package/apps/travel-chaos-organizer/scripts/deploy.sh +0 -54
  156. package/apps/travel-chaos-organizer/scripts/health-check.sh +0 -36
  157. package/apps/travel-chaos-organizer/scripts/migrate.sh +0 -7
  158. package/apps/travel-chaos-organizer/scripts/server-setup.sh +0 -85
  159. package/apps/travel-chaos-organizer/scripts/smoke-test.sh +0 -29
  160. package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +0 -71
  161. package/apps/travel-chaos-organizer/telegram-bot/.env.example +0 -3
  162. package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +0 -6
  163. package/apps/travel-chaos-organizer/telegram-bot/bot.py +0 -504
  164. package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +0 -3
  165. package/dist/src/__tests__/auth.test.d.ts +0 -1
  166. package/dist/src/__tests__/auth.test.js +0 -107
  167. package/dist/src/__tests__/auth.test.js.map +0 -1
  168. package/dist/src/__tests__/brain-flow.test.d.ts +0 -12
  169. package/dist/src/__tests__/brain-flow.test.js +0 -1241
  170. package/dist/src/__tests__/brain-flow.test.js.map +0 -1
  171. package/dist/src/__tests__/confidence.test.d.ts +0 -13
  172. package/dist/src/__tests__/confidence.test.js +0 -233
  173. package/dist/src/__tests__/confidence.test.js.map +0 -1
  174. package/dist/src/__tests__/e2e/api-auth.test.d.ts +0 -7
  175. package/dist/src/__tests__/e2e/api-auth.test.js +0 -162
  176. package/dist/src/__tests__/e2e/api-auth.test.js.map +0 -1
  177. package/dist/src/__tests__/e2e/api-health.test.d.ts +0 -7
  178. package/dist/src/__tests__/e2e/api-health.test.js +0 -95
  179. package/dist/src/__tests__/e2e/api-health.test.js.map +0 -1
  180. package/dist/src/__tests__/e2e/cli.test.d.ts +0 -10
  181. package/dist/src/__tests__/e2e/cli.test.js +0 -204
  182. package/dist/src/__tests__/e2e/cli.test.js.map +0 -1
  183. package/dist/src/__tests__/e2e/config.d.ts +0 -35
  184. package/dist/src/__tests__/e2e/config.js +0 -53
  185. package/dist/src/__tests__/e2e/config.js.map +0 -1
  186. package/dist/src/__tests__/e2e/funnel.test.d.ts +0 -13
  187. package/dist/src/__tests__/e2e/funnel.test.js +0 -90
  188. package/dist/src/__tests__/e2e/funnel.test.js.map +0 -1
  189. package/dist/src/__tests__/e2e/mcp-tools.test.d.ts +0 -7
  190. package/dist/src/__tests__/e2e/mcp-tools.test.js +0 -129
  191. package/dist/src/__tests__/e2e/mcp-tools.test.js.map +0 -1
  192. package/dist/src/__tests__/e2e/provisioning.test.d.ts +0 -15
  193. package/dist/src/__tests__/e2e/provisioning.test.js +0 -123
  194. package/dist/src/__tests__/e2e/provisioning.test.js.map +0 -1
  195. package/dist/src/__tests__/handlers-unit.test.d.ts +0 -12
  196. package/dist/src/__tests__/handlers-unit.test.js +0 -505
  197. package/dist/src/__tests__/handlers-unit.test.js.map +0 -1
  198. package/dist/src/__tests__/namespace.test.d.ts +0 -1
  199. package/dist/src/__tests__/namespace.test.js +0 -114
  200. package/dist/src/__tests__/namespace.test.js.map +0 -1
  201. package/dist/src/__tests__/rerank.test.d.ts +0 -1
  202. package/dist/src/__tests__/rerank.test.js +0 -125
  203. package/dist/src/__tests__/rerank.test.js.map +0 -1
  204. package/dist/src/__tests__/utils.test.d.ts +0 -1
  205. package/dist/src/__tests__/utils.test.js +0 -83
  206. package/dist/src/__tests__/utils.test.js.map +0 -1
  207. package/dist/src/bench/cachly-bench.d.ts +0 -39
  208. package/dist/src/bench/cachly-bench.js +0 -223
  209. package/dist/src/bench/cachly-bench.js.map +0 -1
  210. package/dist/src/bench/fixtures.d.ts +0 -37
  211. package/dist/src/bench/fixtures.js +0 -225
  212. package/dist/src/bench/fixtures.js.map +0 -1
  213. package/dist/src/search.test.d.ts +0 -1
  214. package/dist/src/search.test.js +0 -713
  215. package/dist/src/search.test.js.map +0 -1
  216. package/eslint.config.js +0 -16
  217. package/glama.json +0 -36
  218. package/llms.txt +0 -155
  219. package/packages/telegram-notify/SPLIT_PLAN.md +0 -106
  220. package/packages/telegram-notify/client.ts +0 -88
  221. package/packages/telegram-notify/emojis.json +0 -22
  222. package/packages/telegram-notify/pyproject.toml +0 -17
  223. package/packages/telegram-notify/telegram_notify/__init__.py +0 -3
  224. package/packages/telegram-notify/telegram_notify/client.py +0 -87
  225. package/packages/telegram-notify/telegram_notify/emojis.json +0 -22
  226. package/scripts/e2e-run.sh +0 -160
  227. package/scripts/generate-icons.js +0 -28
  228. package/smithery.yaml +0 -45
  229. package/src/__tests__/auth.test.ts +0 -147
  230. package/src/__tests__/brain-flow.test.ts +0 -1472
  231. package/src/__tests__/confidence.test.ts +0 -285
  232. package/src/__tests__/e2e/api-auth.test.ts +0 -182
  233. package/src/__tests__/e2e/api-health.test.ts +0 -103
  234. package/src/__tests__/e2e/cli.test.ts +0 -228
  235. package/src/__tests__/e2e/config.ts +0 -53
  236. package/src/__tests__/e2e/funnel.test.ts +0 -99
  237. package/src/__tests__/e2e/mcp-tools.test.ts +0 -191
  238. package/src/__tests__/e2e/provisioning.test.ts +0 -128
  239. package/src/__tests__/handlers-unit.test.ts +0 -677
  240. package/src/__tests__/namespace.test.ts +0 -126
  241. package/src/__tests__/rerank.test.ts +0 -141
  242. package/src/__tests__/utils.test.ts +0 -81
  243. package/src/auth.ts +0 -46
  244. package/src/bench/cachly-bench.ts +0 -263
  245. package/src/bench/fixtures.ts +0 -256
  246. package/src/ckg.ts +0 -103
  247. package/src/confidence.ts +0 -38
  248. package/src/embeddings.ts +0 -217
  249. package/src/handlers/advanced.ts +0 -647
  250. package/src/handlers/brain.ts +0 -2622
  251. package/src/handlers/cache.ts +0 -633
  252. package/src/handlers/context.ts +0 -222
  253. package/src/handlers/fedbrain.ts +0 -1232
  254. package/src/handlers/instances.ts +0 -180
  255. package/src/handlers/roadmap.ts +0 -201
  256. package/src/handlers/syndicate.ts +0 -460
  257. package/src/handlers/tco.ts +0 -345
  258. package/src/handlers/team.ts +0 -1249
  259. package/src/index.ts +0 -2815
  260. package/src/namespace.ts +0 -128
  261. package/src/notifier.ts +0 -5
  262. package/src/rerank.ts +0 -148
  263. package/src/search.test.ts +0 -848
  264. package/src/search.ts +0 -1781
  265. package/src/tools.ts +0 -2056
  266. package/src/utils.ts +0 -90
  267. package/test-features.cjs +0 -23
  268. package/tsconfig.json +0 -16
  269. package/vitest.config.ts +0 -14
@@ -1,505 +0,0 @@
1
- /**
2
- * Unit tests for handler helper functions and handler logic.
3
- *
4
- * Covers (no real network or Redis required):
5
- * formatInstance – status badge, memory formatting
6
- * buildConnectionString – TLS, auth, port
7
- * handleRoadmapTool – add, list, update, next (full in-memory flow)
8
- * handleInstanceTool – list, create, get, connection string, delete
9
- *
10
- * Run: npx vitest run src/__tests__/handlers-unit.test.ts
11
- */
12
- import { describe, it, expect, vi, beforeEach } from 'vitest';
13
- import { formatInstance, buildConnectionString, handleInstanceTool, } from '../handlers/instances.js';
14
- import { handleRoadmapTool } from '../handlers/roadmap.js';
15
- // ── Minimal MockRedis (hashes + lists) ───────────────────────────────────────
16
- class MockRedis {
17
- hashes = new Map();
18
- async hset(key, field, value) {
19
- if (!this.hashes.has(key))
20
- this.hashes.set(key, new Map());
21
- this.hashes.get(key).set(field, value);
22
- return 1;
23
- }
24
- async hget(key, field) {
25
- return this.hashes.get(key)?.get(field) ?? null;
26
- }
27
- async hgetall(key) {
28
- const h = this.hashes.get(key);
29
- if (!h || h.size === 0)
30
- return null;
31
- const out = {};
32
- for (const [k, v] of h)
33
- out[k] = v;
34
- return out;
35
- }
36
- /** Expose internals for test assertions */
37
- _hashes() { return this.hashes; }
38
- }
39
- // ── Fixtures ──────────────────────────────────────────────────────────────────
40
- const baseInstance = {
41
- id: 'inst-abc123',
42
- name: 'my-cache',
43
- tier: 'free',
44
- status: 'running',
45
- region: 'eu-west',
46
- host: 'redis.cachly.dev',
47
- port: 6379,
48
- password: 'supersecret',
49
- tls_enabled: false,
50
- memory_mb: 256,
51
- encryption_at_rest: false,
52
- created_at: '2026-01-01T00:00:00Z',
53
- };
54
- // ── formatInstance ────────────────────────────────────────────────────────────
55
- describe('formatInstance', () => {
56
- it('running instance shows 🟢 badge', () => {
57
- const result = formatInstance({ ...baseInstance, status: 'running' });
58
- expect(result).toContain('🟢');
59
- });
60
- it('provisioning instance shows 🟡 badge', () => {
61
- const result = formatInstance({ ...baseInstance, status: 'provisioning' });
62
- expect(result).toContain('🟡');
63
- });
64
- it('stopped/error instance shows 🔴 badge', () => {
65
- const result = formatInstance({ ...baseInstance, status: 'stopped' });
66
- expect(result).toContain('🔴');
67
- const error = formatInstance({ ...baseInstance, status: 'error' });
68
- expect(error).toContain('🔴');
69
- });
70
- it('includes instance name', () => {
71
- expect(formatInstance(baseInstance)).toContain('my-cache');
72
- });
73
- it('includes instance id in backticks', () => {
74
- expect(formatInstance(baseInstance)).toContain('inst-abc123');
75
- });
76
- it('includes tier', () => {
77
- expect(formatInstance(baseInstance)).toContain('free');
78
- });
79
- it('includes region', () => {
80
- expect(formatInstance(baseInstance)).toContain('eu-west');
81
- });
82
- it('displays memory < 1024 MB in MB', () => {
83
- const result = formatInstance({ ...baseInstance, memory_mb: 512 });
84
- expect(result).toContain('512MB');
85
- });
86
- it('displays memory >= 1024 MB in GB', () => {
87
- const result = formatInstance({ ...baseInstance, memory_mb: 1024 });
88
- expect(result).toContain('1GB');
89
- });
90
- it('displays 2048 MB as 2GB', () => {
91
- const result = formatInstance({ ...baseInstance, memory_mb: 2048 });
92
- expect(result).toContain('2GB');
93
- });
94
- it('displays 4096 MB as 4GB', () => {
95
- const result = formatInstance({ ...baseInstance, memory_mb: 4096 });
96
- expect(result).toContain('4GB');
97
- });
98
- });
99
- // ── buildConnectionString ─────────────────────────────────────────────────────
100
- describe('buildConnectionString', () => {
101
- it('returns error message when host is absent', () => {
102
- const result = buildConnectionString({ ...baseInstance, host: undefined });
103
- expect(result).toContain('❌');
104
- expect(result.toLowerCase()).toContain('not ready');
105
- });
106
- it('uses redis:// for non-TLS', () => {
107
- const result = buildConnectionString({ ...baseInstance, tls_enabled: false });
108
- expect(result).toMatch(/^redis:\/\//);
109
- });
110
- it('uses rediss:// for TLS', () => {
111
- const result = buildConnectionString({ ...baseInstance, tls_enabled: true });
112
- expect(result).toMatch(/^rediss:\/\//);
113
- });
114
- it('includes password in auth section', () => {
115
- const result = buildConnectionString({ ...baseInstance, password: 'mypass' });
116
- expect(result).toContain(':mypass@');
117
- });
118
- it('no auth section when password is absent', () => {
119
- const result = buildConnectionString({ ...baseInstance, password: undefined });
120
- expect(result).not.toContain('@');
121
- });
122
- it('includes host in connection string', () => {
123
- const result = buildConnectionString(baseInstance);
124
- expect(result).toContain('redis.cachly.dev');
125
- });
126
- it('includes default port 6379', () => {
127
- const result = buildConnectionString(baseInstance);
128
- expect(result).toContain(':6379');
129
- });
130
- it('includes custom port', () => {
131
- const result = buildConnectionString({ ...baseInstance, port: 12345 });
132
- expect(result).toContain(':12345');
133
- });
134
- it('TLS + auth builds correct rediss:// URL', () => {
135
- const result = buildConnectionString({
136
- ...baseInstance,
137
- tls_enabled: true,
138
- password: 'pass123',
139
- host: 'secure.cachly.dev',
140
- port: 6380,
141
- });
142
- expect(result).toBe('rediss://:pass123@secure.cachly.dev:6380');
143
- });
144
- it('non-TLS no-auth builds correct redis:// URL', () => {
145
- const result = buildConnectionString({
146
- ...baseInstance,
147
- tls_enabled: false,
148
- password: undefined,
149
- host: 'open.cachly.dev',
150
- port: 6379,
151
- });
152
- expect(result).toBe('redis://open.cachly.dev:6379');
153
- });
154
- });
155
- // ── handleRoadmapTool ─────────────────────────────────────────────────────────
156
- describe('handleRoadmapTool', () => {
157
- let redis;
158
- let getConnection;
159
- const apiFetch = vi.fn();
160
- const INSTANCE = 'inst-test';
161
- beforeEach(() => {
162
- redis = new MockRedis();
163
- getConnection = vi.fn().mockResolvedValue(redis);
164
- });
165
- // ── roadmap_add ──────────────────────────────────────────────────────────────
166
- describe('roadmap_add', () => {
167
- it('creates a roadmap item and returns formatted output', async () => {
168
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Fix login bug', priority: 'high' }, getConnection, apiFetch);
169
- expect(result).toContain('📋 **Roadmap item added**');
170
- expect(result).toContain('Fix login bug');
171
- expect(result).toContain('high');
172
- expect(result).toContain('planned');
173
- });
174
- it('returns an ID prefixed with rm_', async () => {
175
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Migrate DB', priority: 'critical' }, getConnection, apiFetch);
176
- expect(result).toMatch(/`rm_[a-z0-9_]+`/);
177
- });
178
- it('stores item in Redis under cachly:roadmap:{instance_id}', async () => {
179
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Add tests', priority: 'medium' }, getConnection, apiFetch);
180
- const stored = redis._hashes().get(`cachly:roadmap:${INSTANCE}`);
181
- expect(stored).toBeDefined();
182
- expect(stored.size).toBe(1);
183
- const item = JSON.parse([...stored.values()][0]);
184
- expect(item.title).toBe('Add tests');
185
- expect(item.status).toBe('planned');
186
- expect(item.priority).toBe('medium');
187
- });
188
- it('includes milestone in output when provided', async () => {
189
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Release v2', priority: 'high', milestone: 'Q2-2026' }, getConnection, apiFetch);
190
- expect(result).toContain('Q2-2026');
191
- });
192
- it('includes tags in output when provided', async () => {
193
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Cache warmup', priority: 'low', tags: ['perf', 'infra'] }, getConnection, apiFetch);
194
- expect(result).toContain('perf');
195
- expect(result).toContain('infra');
196
- });
197
- it('contains roadmap_update hint with the new item ID', async () => {
198
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Deploy feature', priority: 'medium' }, getConnection, apiFetch);
199
- // Hint should reference the new item ID for marking in-progress
200
- expect(result).toContain('roadmap_update');
201
- expect(result).toContain('in-progress');
202
- });
203
- });
204
- // ── roadmap_list ─────────────────────────────────────────────────────────────
205
- describe('roadmap_list', () => {
206
- it('returns empty message when no items', async () => {
207
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE }, getConnection, apiFetch);
208
- expect(result).toContain('empty');
209
- expect(result).toContain('roadmap_add');
210
- });
211
- it('shows added item in list', async () => {
212
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Write tests', priority: 'high' }, getConnection, apiFetch);
213
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE }, getConnection, apiFetch);
214
- expect(result).toContain('Write tests');
215
- });
216
- it('shows item count', async () => {
217
- for (let i = 0; i < 3; i++) {
218
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: `Task ${i}`, priority: 'low' }, getConnection, apiFetch);
219
- }
220
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE }, getConnection, apiFetch);
221
- expect(result).toContain('3 item');
222
- });
223
- it('sorts critical items before low items', async () => {
224
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Low priority', priority: 'low' }, getConnection, apiFetch);
225
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Critical fix', priority: 'critical' }, getConnection, apiFetch);
226
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE }, getConnection, apiFetch);
227
- const critIdx = result.indexOf('Critical fix');
228
- const lowIdx = result.indexOf('Low priority');
229
- expect(critIdx).toBeLessThan(lowIdx);
230
- });
231
- it('filters by tag', async () => {
232
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Frontend task', priority: 'medium', tags: ['frontend'] }, getConnection, apiFetch);
233
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Backend task', priority: 'medium', tags: ['backend'] }, getConnection, apiFetch);
234
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE, tag: 'frontend' }, getConnection, apiFetch);
235
- expect(result).toContain('Frontend task');
236
- expect(result).not.toContain('Backend task');
237
- });
238
- it('filters by milestone', async () => {
239
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'MVP feature', priority: 'high', milestone: 'mvp' }, getConnection, apiFetch);
240
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Post-launch', priority: 'low', milestone: 'v2' }, getConnection, apiFetch);
241
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE, milestone: 'mvp' }, getConnection, apiFetch);
242
- expect(result).toContain('MVP feature');
243
- expect(result).not.toContain('Post-launch');
244
- });
245
- it('status=done shows only done items', async () => {
246
- // Add and complete one item
247
- const addResult = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Finished task', priority: 'low' }, getConnection, apiFetch);
248
- const idMatch = addResult.match(/`(rm_[a-z0-9_]+)`/);
249
- const id = idMatch[1];
250
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, status: 'done' }, getConnection, apiFetch);
251
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE, status: 'done' }, getConnection, apiFetch);
252
- expect(result).toContain('Finished task');
253
- });
254
- it('status=open hides done items', async () => {
255
- const addResult = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Done item', priority: 'low' }, getConnection, apiFetch);
256
- const id = addResult.match(/`(rm_[a-z0-9_]+)`/)[1];
257
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, status: 'done' }, getConnection, apiFetch);
258
- const result = await handleRoadmapTool('roadmap_list', { instance_id: INSTANCE, status: 'open' }, getConnection, apiFetch);
259
- // No open items after marking done
260
- expect(result).toContain('No roadmap items');
261
- });
262
- });
263
- // ── roadmap_update ────────────────────────────────────────────────────────────
264
- describe('roadmap_update', () => {
265
- async function addItem(title, priority = 'medium') {
266
- const result = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title, priority }, getConnection, apiFetch);
267
- return result.match(/`(rm_[a-z0-9_]+)`/)[1];
268
- }
269
- it('updates status and returns confirmation', async () => {
270
- const id = await addItem('Deploy feature');
271
- const result = await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, status: 'in-progress' }, getConnection, apiFetch);
272
- expect(result).toContain('⚡');
273
- expect(result).toContain('Deploy feature');
274
- expect(result).toContain('in-progress');
275
- });
276
- it('persists status change in Redis', async () => {
277
- const id = await addItem('Fix cache');
278
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, status: 'done' }, getConnection, apiFetch);
279
- const stored = await redis.hget(`cachly:roadmap:${INSTANCE}`, id);
280
- const item = JSON.parse(stored);
281
- expect(item.status).toBe('done');
282
- });
283
- it('appends notes with timestamp prefix', async () => {
284
- const id = await addItem('Refactor');
285
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, notes: 'Started refactor' }, getConnection, apiFetch);
286
- const stored = JSON.parse((await redis.hget(`cachly:roadmap:${INSTANCE}`, id)));
287
- expect(stored.notes).toContain('Started refactor');
288
- expect(stored.notes).toMatch(/^\[20\d\d-/); // Date prefix like [2026-...
289
- });
290
- it('appends multiple notes, keeping history', async () => {
291
- const id = await addItem('Long task');
292
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, notes: 'First update' }, getConnection, apiFetch);
293
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, notes: 'Second update' }, getConnection, apiFetch);
294
- const stored = JSON.parse((await redis.hget(`cachly:roadmap:${INSTANCE}`, id)));
295
- expect(stored.notes).toContain('First update');
296
- expect(stored.notes).toContain('Second update');
297
- });
298
- it('returns error message for missing item ID', async () => {
299
- const result = await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id: 'rm_nonexistent', status: 'done' }, getConnection, apiFetch);
300
- expect(result).toContain('not found');
301
- expect(result).toContain('roadmap_list');
302
- });
303
- it('updates title', async () => {
304
- const id = await addItem('Old title');
305
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, title: 'New title' }, getConnection, apiFetch);
306
- const stored = JSON.parse((await redis.hget(`cachly:roadmap:${INSTANCE}`, id)));
307
- expect(stored.title).toBe('New title');
308
- });
309
- it('updates priority', async () => {
310
- const id = await addItem('Task', 'low');
311
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, priority: 'critical' }, getConnection, apiFetch);
312
- const stored = JSON.parse((await redis.hget(`cachly:roadmap:${INSTANCE}`, id)));
313
- expect(stored.priority).toBe('critical');
314
- });
315
- });
316
- // ── roadmap_next ─────────────────────────────────────────────────────────────
317
- describe('roadmap_next', () => {
318
- it('returns empty roadmap message when no items exist', async () => {
319
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
320
- expect(result).toContain('empty');
321
- expect(result).toContain('roadmap_add');
322
- });
323
- it('returns all-done message when all items are completed', async () => {
324
- // Add an item then mark it done
325
- const addResult = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Finished', priority: 'low' }, getConnection, apiFetch);
326
- const id = addResult.match(/`(rm_[a-z0-9_]+)`/)[1];
327
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id, status: 'done' }, getConnection, apiFetch);
328
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
329
- // All open items exhausted → 🎉 message
330
- expect(result).toContain('No open roadmap items');
331
- });
332
- it('returns the single item when only one exists', async () => {
333
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Only task', priority: 'medium' }, getConnection, apiFetch);
334
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
335
- expect(result).toContain('Only task');
336
- });
337
- it('returns critical item over low item', async () => {
338
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Low task', priority: 'low' }, getConnection, apiFetch);
339
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Critical task', priority: 'critical' }, getConnection, apiFetch);
340
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
341
- expect(result).toContain('Critical task');
342
- });
343
- it('returns in-progress item over higher-priority planned item', async () => {
344
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Critical planned', priority: 'critical' }, getConnection, apiFetch);
345
- const lowResult = await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Low in-progress', priority: 'low' }, getConnection, apiFetch);
346
- const lowId = lowResult.match(/`(rm_[a-z0-9_]+)`/)[1];
347
- await handleRoadmapTool('roadmap_update', { instance_id: INSTANCE, id: lowId, status: 'in-progress' }, getConnection, apiFetch);
348
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
349
- expect(result).toContain('Low in-progress');
350
- expect(result).toContain('⚡');
351
- });
352
- it('shows remaining count', async () => {
353
- for (let i = 0; i < 5; i++) {
354
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: `Task ${i}`, priority: 'medium' }, getConnection, apiFetch);
355
- }
356
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
357
- expect(result).toContain('+4 more');
358
- });
359
- it('filters by tag', async () => {
360
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Backend', priority: 'high', tags: ['backend'] }, getConnection, apiFetch);
361
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'Frontend', priority: 'critical', tags: ['frontend'] }, getConnection, apiFetch);
362
- // Even though Frontend has higher priority, filtering by backend should return Backend
363
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE, tag: 'backend' }, getConnection, apiFetch);
364
- expect(result).toContain('Backend');
365
- expect(result).not.toContain('Frontend');
366
- });
367
- it('contains a roadmap_update call-to-action hint', async () => {
368
- await handleRoadmapTool('roadmap_add', { instance_id: INSTANCE, title: 'My task', priority: 'medium' }, getConnection, apiFetch);
369
- const result = await handleRoadmapTool('roadmap_next', { instance_id: INSTANCE }, getConnection, apiFetch);
370
- expect(result).toContain('roadmap_update');
371
- });
372
- });
373
- });
374
- // ── handleInstanceTool ────────────────────────────────────────────────────────
375
- describe('handleInstanceTool', () => {
376
- const noop = vi.fn();
377
- const getConnection = vi.fn();
378
- beforeEach(() => {
379
- vi.clearAllMocks();
380
- });
381
- it('list_instances — empty list returns helpful message', async () => {
382
- const apiFetch = vi.fn().mockResolvedValue({ data: [] });
383
- const result = await handleInstanceTool('list_instances', {}, getConnection, apiFetch);
384
- expect(result).toContain('no cache instances');
385
- expect(result).toContain('create_instance');
386
- });
387
- it('list_instances — returns formatted instance list', async () => {
388
- const instances = [
389
- { ...baseInstance, id: 'inst-1', name: 'prod-cache', status: 'running' },
390
- { ...baseInstance, id: 'inst-2', name: 'dev-cache', status: 'provisioning' },
391
- ];
392
- const apiFetch = vi.fn().mockResolvedValue({ data: instances });
393
- const result = await handleInstanceTool('list_instances', {}, getConnection, apiFetch);
394
- expect(result).toContain('2 instance');
395
- expect(result).toContain('prod-cache');
396
- expect(result).toContain('dev-cache');
397
- expect(result).toContain('🟢');
398
- expect(result).toContain('🟡');
399
- });
400
- it('create_instance (free tier) — returns success without checkout URL', async () => {
401
- const apiFetch = vi.fn().mockResolvedValue({
402
- instance_id: 'inst-new123',
403
- status: 'provisioning',
404
- });
405
- const result = await handleInstanceTool('create_instance', { name: 'my-new-cache', tier: 'free' }, getConnection, apiFetch);
406
- expect(result).toContain('✅');
407
- expect(result).toContain('inst-new123');
408
- expect(result).toContain('provisioning');
409
- expect(result).not.toContain('checkout');
410
- expect(result).toContain('get_connection_string');
411
- });
412
- it('create_instance (paid tier) — returns checkout URL', async () => {
413
- const apiFetch = vi.fn().mockResolvedValue({
414
- instance_id: 'inst-paid-456',
415
- checkout_url: 'https://checkout.stripe.com/pay/cs_test_abc',
416
- status: 'pending_payment',
417
- });
418
- const result = await handleInstanceTool('create_instance', { name: 'pro-cache', tier: 'starter' }, getConnection, apiFetch);
419
- expect(result).toContain('✅');
420
- expect(result).toContain('inst-paid-456');
421
- expect(result).toContain('💳');
422
- expect(result).toContain('https://checkout.stripe.com');
423
- });
424
- it('get_instance — calls correct API endpoint and returns formatted result', async () => {
425
- const apiFetch = vi.fn().mockResolvedValue({ ...baseInstance, status: 'running' });
426
- const result = await handleInstanceTool('get_instance', { instance_id: 'inst-abc123' }, getConnection, apiFetch);
427
- expect(apiFetch).toHaveBeenCalledWith('/api/v1/instances/inst-abc123');
428
- expect(result).toContain('my-cache');
429
- expect(result).toContain('🟢');
430
- });
431
- it('get_connection_string — running instance returns redis:// URL block', async () => {
432
- const apiFetch = vi.fn().mockResolvedValue({
433
- ...baseInstance,
434
- status: 'running',
435
- tls_enabled: false,
436
- password: 'abc',
437
- host: 'redis.cachly.dev',
438
- port: 6379,
439
- });
440
- const result = await handleInstanceTool('get_connection_string', { instance_id: 'inst-abc123' }, getConnection, apiFetch);
441
- expect(result).toContain('redis://:abc@redis.cachly.dev:6379');
442
- expect(result).toContain('REDIS_URL');
443
- expect(result).toContain('redis-cli');
444
- });
445
- it('get_connection_string — non-running instance returns not-ready message', async () => {
446
- const apiFetch = vi.fn().mockResolvedValue({ ...baseInstance, status: 'provisioning', host: undefined });
447
- const result = await handleInstanceTool('get_connection_string', { instance_id: 'inst-abc123' }, getConnection, apiFetch);
448
- expect(result).toContain('not running');
449
- expect(result).toContain('provisioning');
450
- });
451
- it('delete_instance without confirm — returns cancelled message without calling API', async () => {
452
- const apiFetch = vi.fn();
453
- const result = await handleInstanceTool('delete_instance', { instance_id: 'inst-abc123', confirm: false }, getConnection, apiFetch);
454
- expect(result).toContain('cancelled');
455
- expect(apiFetch).not.toHaveBeenCalled();
456
- });
457
- it('delete_instance with confirm=true — calls DELETE and returns success', async () => {
458
- const apiFetch = vi.fn().mockResolvedValue({});
459
- const result = await handleInstanceTool('delete_instance', { instance_id: 'inst-abc123', confirm: true }, getConnection, apiFetch);
460
- expect(apiFetch).toHaveBeenCalledWith('/api/v1/instances/inst-abc123', { method: 'DELETE' });
461
- expect(result).toContain('✅');
462
- expect(result).toContain('inst-abc123');
463
- });
464
- it('list_orgs — empty org list returns hint to create org', async () => {
465
- const apiFetch = vi.fn().mockResolvedValue({ orgs: [] });
466
- const result = await handleInstanceTool('list_orgs', {}, getConnection, apiFetch);
467
- expect(result).toContain('No organizations');
468
- expect(result).toContain('create_org');
469
- });
470
- it('list_orgs — returns formatted org list', async () => {
471
- const apiFetch = vi.fn().mockResolvedValue({
472
- orgs: [
473
- { id: 'org-1', name: 'ACME Inc.', slug: 'acme', plan: 'team', max_members: 10, member_count: 3 },
474
- ],
475
- });
476
- const result = await handleInstanceTool('list_orgs', {}, getConnection, apiFetch);
477
- expect(result).toContain('ACME Inc.');
478
- expect(result).toContain('team');
479
- expect(result).toContain('3/10');
480
- });
481
- it('create_org — returns created org details', async () => {
482
- const apiFetch = vi.fn().mockResolvedValue({
483
- id: 'org-new',
484
- name: 'My Team',
485
- slug: 'my-team',
486
- plan: 'free',
487
- });
488
- const result = await handleInstanceTool('create_org', { name: 'My Team' }, getConnection, apiFetch);
489
- expect(result).toContain('✅');
490
- expect(result).toContain('My Team');
491
- expect(result).toContain('invite_member');
492
- });
493
- it('invite_member — returns confirmation with email', async () => {
494
- const apiFetch = vi.fn().mockResolvedValue({});
495
- const result = await handleInstanceTool('invite_member', { org_id: 'org-1', email: 'dev@example.com', role: 'member' }, getConnection, apiFetch);
496
- expect(result).toContain('✅');
497
- expect(result).toContain('dev@example.com');
498
- expect(result).toContain('member');
499
- });
500
- it('unknown tool name — returns null', async () => {
501
- const result = await handleInstanceTool('nonexistent_tool', {}, getConnection, noop);
502
- expect(result).toBeNull();
503
- });
504
- });
505
- //# sourceMappingURL=handlers-unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers-unit.test.js","sourceRoot":"","sources":["../../../src/__tests__/handlers-unit.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};