@cachly-dev/mcp-server 0.10.65 → 0.10.67
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.
- package/dist/src/embeddings.js +10 -0
- package/dist/src/embeddings.js.map +1 -1
- package/dist/src/handlers/brain.js +2 -1
- package/dist/src/handlers/brain.js.map +1 -1
- package/dist/src/handlers/cache.js +4 -0
- package/dist/src/handlers/cache.js.map +1 -1
- package/dist/src/handlers/tco.js +1 -0
- package/dist/src/handlers/tco.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/package.json +7 -1
- package/server.json +2 -2
- package/.env.test.example +0 -23
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -50
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -25
- package/.github/workflows/eas-build-android.yml +0 -58
- package/.github/workflows/eas-update.yml +0 -55
- package/.github/workflows/publish.yml +0 -72
- package/BENCH.md +0 -113
- package/CHANGELOG.md +0 -653
- package/Dockerfile +0 -16
- package/LAUNCH_TEXTS.md +0 -182
- package/PROGRESS.md +0 -141
- package/STRATEGY.md +0 -228
- package/VISION_10X.md +0 -133
- package/apps/travel-chaos-organizer/.env.example +0 -49
- package/apps/travel-chaos-organizer/DEPLOY.md +0 -328
- package/apps/travel-chaos-organizer/Makefile +0 -57
- package/apps/travel-chaos-organizer/README.md +0 -159
- package/apps/travel-chaos-organizer/backend/.env.example +0 -10
- package/apps/travel-chaos-organizer/backend/Dockerfile +0 -25
- package/apps/travel-chaos-organizer/backend/alembic/env.py +0 -56
- package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +0 -24
- package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
- package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +0 -24
- package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +0 -24
- package/apps/travel-chaos-organizer/backend/alembic.ini +0 -39
- package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +0 -81
- package/apps/travel-chaos-organizer/backend/app/config.py +0 -66
- package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/db/database.py +0 -20
- package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +0 -71
- package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +0 -31
- package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +0 -4
- package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +0 -5
- package/apps/travel-chaos-organizer/backend/app/limiter.py +0 -4
- package/apps/travel-chaos-organizer/backend/app/logging_config.py +0 -25
- package/apps/travel-chaos-organizer/backend/app/main.py +0 -77
- package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/models/schemas.py +0 -142
- package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/routers/admin.py +0 -237
- package/apps/travel-chaos-organizer/backend/app/routers/cache.py +0 -13
- package/apps/travel-chaos-organizer/backend/app/routers/events.py +0 -29
- package/apps/travel-chaos-organizer/backend/app/routers/export.py +0 -122
- package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +0 -122
- package/apps/travel-chaos-organizer/backend/app/routers/items.py +0 -130
- package/apps/travel-chaos-organizer/backend/app/routers/mail.py +0 -108
- package/apps/travel-chaos-organizer/backend/app/routers/parse.py +0 -303
- package/apps/travel-chaos-organizer/backend/app/routers/payments.py +0 -179
- package/apps/travel-chaos-organizer/backend/app/routers/trips.py +0 -134
- package/apps/travel-chaos-organizer/backend/app/routers/users.py +0 -169
- package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +0 -37
- package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/services/cache.py +0 -131
- package/apps/travel-chaos-organizer/backend/app/services/drip.py +0 -128
- package/apps/travel-chaos-organizer/backend/app/services/email.py +0 -61
- package/apps/travel-chaos-organizer/backend/app/services/errors.py +0 -44
- package/apps/travel-chaos-organizer/backend/app/services/notifier.py +0 -10
- package/apps/travel-chaos-organizer/backend/app/services/ollama.py +0 -101
- package/apps/travel-chaos-organizer/backend/app/services/parser.py +0 -22
- package/apps/travel-chaos-organizer/backend/app/services/quota.py +0 -85
- package/apps/travel-chaos-organizer/backend/app/services/sentry.py +0 -11
- package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +0 -35
- package/apps/travel-chaos-organizer/backend/pytest.ini +0 -4
- package/apps/travel-chaos-organizer/backend/requirements-dev.txt +0 -6
- package/apps/travel-chaos-organizer/backend/requirements.txt +0 -25
- package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/tests/conftest.py +0 -223
- package/apps/travel-chaos-organizer/backend/tests/test_admin.py +0 -99
- package/apps/travel-chaos-organizer/backend/tests/test_cache.py +0 -142
- package/apps/travel-chaos-organizer/backend/tests/test_drip.py +0 -32
- package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +0 -121
- package/apps/travel-chaos-organizer/backend/tests/test_export.py +0 -48
- package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +0 -107
- package/apps/travel-chaos-organizer/backend/tests/test_items.py +0 -138
- package/apps/travel-chaos-organizer/backend/tests/test_mail.py +0 -113
- package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +0 -145
- package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +0 -98
- package/apps/travel-chaos-organizer/backend/tests/test_parser.py +0 -72
- package/apps/travel-chaos-organizer/backend/tests/test_payments.py +0 -163
- package/apps/travel-chaos-organizer/backend/tests/test_quota.py +0 -46
- package/apps/travel-chaos-organizer/backend/tests/test_search.py +0 -67
- package/apps/travel-chaos-organizer/backend/tests/test_trips.py +0 -123
- package/apps/travel-chaos-organizer/backend/tests/test_users.py +0 -52
- package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
- package/apps/travel-chaos-organizer/caddy/Caddyfile +0 -27
- package/apps/travel-chaos-organizer/docker-compose.node1.yml +0 -31
- package/apps/travel-chaos-organizer/docker-compose.override.yml +0 -14
- package/apps/travel-chaos-organizer/docker-compose.yml +0 -128
- package/apps/travel-chaos-organizer/frontend/.env.example +0 -13
- package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +0 -80
- package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +0 -166
- package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +0 -130
- package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +0 -381
- package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +0 -346
- package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +0 -363
- package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +0 -34
- package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +0 -35
- package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +0 -91
- package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +0 -71
- package/apps/travel-chaos-organizer/frontend/app/auth.tsx +0 -29
- package/apps/travel-chaos-organizer/frontend/app/index.tsx +0 -16
- package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +0 -119
- package/apps/travel-chaos-organizer/frontend/app.config.ts +0 -54
- package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +0 -66
- package/apps/travel-chaos-organizer/frontend/assets/icon.svg +0 -79
- package/apps/travel-chaos-organizer/frontend/assets/splash.svg +0 -15
- package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +0 -102
- package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +0 -107
- package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +0 -109
- package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +0 -45
- package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +0 -19
- package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +0 -155
- package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +0 -55
- package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +0 -80
- package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +0 -39
- package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +0 -39
- package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +0 -70
- package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +0 -121
- package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +0 -70
- package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +0 -73
- package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +0 -130
- package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +0 -60
- package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +0 -42
- package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +0 -146
- package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +0 -70
- package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +0 -44
- package/apps/travel-chaos-organizer/frontend/eas.json +0 -22
- package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +0 -24
- package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +0 -60
- package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +0 -112
- package/apps/travel-chaos-organizer/frontend/lib/api.ts +0 -223
- package/apps/travel-chaos-organizer/frontend/lib/auth.ts +0 -93
- package/apps/travel-chaos-organizer/frontend/lib/db.ts +0 -86
- package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +0 -54
- package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +0 -13
- package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +0 -112
- package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +0 -145
- package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +0 -43
- package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +0 -28
- package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +0 -44
- package/apps/travel-chaos-organizer/frontend/package-lock.json +0 -13221
- package/apps/travel-chaos-organizer/frontend/package.json +0 -44
- package/apps/travel-chaos-organizer/frontend/tsconfig.json +0 -23
- package/apps/travel-chaos-organizer/keycloak/realm-export.json +0 -59
- package/apps/travel-chaos-organizer/landing/index.html +0 -773
- package/apps/travel-chaos-organizer/scripts/backup.sh +0 -14
- package/apps/travel-chaos-organizer/scripts/configure-env.sh +0 -82
- package/apps/travel-chaos-organizer/scripts/deploy.sh +0 -54
- package/apps/travel-chaos-organizer/scripts/health-check.sh +0 -36
- package/apps/travel-chaos-organizer/scripts/migrate.sh +0 -7
- package/apps/travel-chaos-organizer/scripts/server-setup.sh +0 -85
- package/apps/travel-chaos-organizer/scripts/smoke-test.sh +0 -29
- package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +0 -71
- package/apps/travel-chaos-organizer/telegram-bot/.env.example +0 -3
- package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +0 -6
- package/apps/travel-chaos-organizer/telegram-bot/bot.py +0 -504
- package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +0 -3
- package/dist/src/__tests__/auth.test.d.ts +0 -1
- package/dist/src/__tests__/auth.test.js +0 -107
- package/dist/src/__tests__/auth.test.js.map +0 -1
- package/dist/src/__tests__/brain-flow.test.d.ts +0 -12
- package/dist/src/__tests__/brain-flow.test.js +0 -1241
- package/dist/src/__tests__/brain-flow.test.js.map +0 -1
- package/dist/src/__tests__/confidence.test.d.ts +0 -13
- package/dist/src/__tests__/confidence.test.js +0 -233
- package/dist/src/__tests__/confidence.test.js.map +0 -1
- package/dist/src/__tests__/e2e/api-auth.test.d.ts +0 -7
- package/dist/src/__tests__/e2e/api-auth.test.js +0 -162
- package/dist/src/__tests__/e2e/api-auth.test.js.map +0 -1
- package/dist/src/__tests__/e2e/api-health.test.d.ts +0 -7
- package/dist/src/__tests__/e2e/api-health.test.js +0 -95
- package/dist/src/__tests__/e2e/api-health.test.js.map +0 -1
- package/dist/src/__tests__/e2e/cli.test.d.ts +0 -10
- package/dist/src/__tests__/e2e/cli.test.js +0 -204
- package/dist/src/__tests__/e2e/cli.test.js.map +0 -1
- package/dist/src/__tests__/e2e/config.d.ts +0 -35
- package/dist/src/__tests__/e2e/config.js +0 -53
- package/dist/src/__tests__/e2e/config.js.map +0 -1
- package/dist/src/__tests__/e2e/funnel.test.d.ts +0 -13
- package/dist/src/__tests__/e2e/funnel.test.js +0 -90
- package/dist/src/__tests__/e2e/funnel.test.js.map +0 -1
- package/dist/src/__tests__/e2e/mcp-tools.test.d.ts +0 -7
- package/dist/src/__tests__/e2e/mcp-tools.test.js +0 -129
- package/dist/src/__tests__/e2e/mcp-tools.test.js.map +0 -1
- package/dist/src/__tests__/e2e/provisioning.test.d.ts +0 -15
- package/dist/src/__tests__/e2e/provisioning.test.js +0 -123
- package/dist/src/__tests__/e2e/provisioning.test.js.map +0 -1
- package/dist/src/__tests__/handlers-unit.test.d.ts +0 -12
- package/dist/src/__tests__/handlers-unit.test.js +0 -505
- package/dist/src/__tests__/handlers-unit.test.js.map +0 -1
- package/dist/src/__tests__/namespace.test.d.ts +0 -1
- package/dist/src/__tests__/namespace.test.js +0 -114
- package/dist/src/__tests__/namespace.test.js.map +0 -1
- package/dist/src/__tests__/rerank.test.d.ts +0 -1
- package/dist/src/__tests__/rerank.test.js +0 -125
- package/dist/src/__tests__/rerank.test.js.map +0 -1
- package/dist/src/__tests__/utils.test.d.ts +0 -1
- package/dist/src/__tests__/utils.test.js +0 -83
- package/dist/src/__tests__/utils.test.js.map +0 -1
- package/dist/src/bench/cachly-bench.d.ts +0 -39
- package/dist/src/bench/cachly-bench.js +0 -223
- package/dist/src/bench/cachly-bench.js.map +0 -1
- package/dist/src/bench/fixtures.d.ts +0 -37
- package/dist/src/bench/fixtures.js +0 -225
- package/dist/src/bench/fixtures.js.map +0 -1
- package/dist/src/search.test.d.ts +0 -1
- package/dist/src/search.test.js +0 -713
- package/dist/src/search.test.js.map +0 -1
- package/eslint.config.js +0 -16
- package/glama.json +0 -36
- package/llms.txt +0 -155
- package/packages/telegram-notify/SPLIT_PLAN.md +0 -106
- package/packages/telegram-notify/client.ts +0 -88
- package/packages/telegram-notify/emojis.json +0 -22
- package/packages/telegram-notify/pyproject.toml +0 -17
- package/packages/telegram-notify/telegram_notify/__init__.py +0 -3
- package/packages/telegram-notify/telegram_notify/client.py +0 -87
- package/packages/telegram-notify/telegram_notify/emojis.json +0 -22
- package/scripts/e2e-run.sh +0 -160
- package/scripts/generate-icons.js +0 -28
- package/smithery.yaml +0 -45
- package/src/__tests__/auth.test.ts +0 -147
- package/src/__tests__/brain-flow.test.ts +0 -1472
- package/src/__tests__/confidence.test.ts +0 -285
- package/src/__tests__/e2e/api-auth.test.ts +0 -182
- package/src/__tests__/e2e/api-health.test.ts +0 -103
- package/src/__tests__/e2e/cli.test.ts +0 -228
- package/src/__tests__/e2e/config.ts +0 -53
- package/src/__tests__/e2e/funnel.test.ts +0 -99
- package/src/__tests__/e2e/mcp-tools.test.ts +0 -191
- package/src/__tests__/e2e/provisioning.test.ts +0 -128
- package/src/__tests__/handlers-unit.test.ts +0 -677
- package/src/__tests__/namespace.test.ts +0 -126
- package/src/__tests__/rerank.test.ts +0 -141
- package/src/__tests__/utils.test.ts +0 -81
- package/src/auth.ts +0 -46
- package/src/bench/cachly-bench.ts +0 -263
- package/src/bench/fixtures.ts +0 -256
- package/src/ckg.ts +0 -103
- package/src/confidence.ts +0 -38
- package/src/embeddings.ts +0 -217
- package/src/handlers/advanced.ts +0 -647
- package/src/handlers/brain.ts +0 -2622
- package/src/handlers/cache.ts +0 -633
- package/src/handlers/context.ts +0 -222
- package/src/handlers/fedbrain.ts +0 -1232
- package/src/handlers/instances.ts +0 -180
- package/src/handlers/roadmap.ts +0 -201
- package/src/handlers/syndicate.ts +0 -460
- package/src/handlers/tco.ts +0 -345
- package/src/handlers/team.ts +0 -1249
- package/src/index.ts +0 -2815
- package/src/namespace.ts +0 -128
- package/src/notifier.ts +0 -5
- package/src/rerank.ts +0 -148
- package/src/search.test.ts +0 -848
- package/src/search.ts +0 -1781
- package/src/tools.ts +0 -2056
- package/src/utils.ts +0 -90
- package/test-features.cjs +0 -23
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -14
package/scripts/e2e-run.sh
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
-
# cachly E2E test runner
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# ./scripts/e2e-run.sh # run all e2e tests
|
|
7
|
-
# ./scripts/e2e-run.sh api # only API health + auth tests
|
|
8
|
-
# ./scripts/e2e-run.sh tools # only MCP tool tests (needs Redis creds)
|
|
9
|
-
# ./scripts/e2e-run.sh cli # only CLI smoke tests
|
|
10
|
-
# ./scripts/e2e-run.sh funnel # only funnel telemetry tests
|
|
11
|
-
# ./scripts/e2e-run.sh provisioning # provisioning lifecycle (slow, ~5 min)
|
|
12
|
-
#
|
|
13
|
-
# Required env vars:
|
|
14
|
-
# E2E_API_URL https://api.dev.cachly.dev (or prod)
|
|
15
|
-
# E2E_JWT <keycloak access token>
|
|
16
|
-
# E2E_INSTANCE_ID <uuid of active test Brain>
|
|
17
|
-
# E2E_API_KEY <redis password>
|
|
18
|
-
# E2E_REDIS_HOST <redis host>
|
|
19
|
-
#
|
|
20
|
-
# Optional:
|
|
21
|
-
# E2E_REDIS_PORT 6380
|
|
22
|
-
# E2E_REDIS_TLS true
|
|
23
|
-
# E2E_SKIP_SLOW true (skip provisioning + device flow)
|
|
24
|
-
# ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
|
|
28
|
-
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
29
|
-
cd "$ROOT"
|
|
30
|
-
|
|
31
|
-
# ── Load .env.test if present (convenience for local dev) ─────────────────────
|
|
32
|
-
if [[ -f "$ROOT/.env.test" ]]; then
|
|
33
|
-
set -a
|
|
34
|
-
# shellcheck source=/dev/null
|
|
35
|
-
source "$ROOT/.env.test"
|
|
36
|
-
set +a
|
|
37
|
-
echo -e "\033[90m[e2e] Loaded $ROOT/.env.test\033[0m"
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
# ── Defaults ──────────────────────────────────────────────────────────────────
|
|
41
|
-
export E2E_API_URL="${E2E_API_URL:-https://api.cachly.dev}"
|
|
42
|
-
export E2E_REDIS_PORT="${E2E_REDIS_PORT:-6380}"
|
|
43
|
-
export E2E_REDIS_TLS="${E2E_REDIS_TLS:-true}"
|
|
44
|
-
export E2E_SKIP_SLOW="${E2E_SKIP_SLOW:-false}"
|
|
45
|
-
|
|
46
|
-
# ── Color output ──────────────────────────────────────────────────────────────
|
|
47
|
-
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
48
|
-
|
|
49
|
-
header() { echo -e "\n${YELLOW}━━━ $1 ━━━${NC}"; }
|
|
50
|
-
ok() { echo -e "${GREEN}✓ $1${NC}"; }
|
|
51
|
-
fail() { echo -e "${RED}✗ $1${NC}"; }
|
|
52
|
-
|
|
53
|
-
# ── Pre-flight checks ─────────────────────────────────────────────────────────
|
|
54
|
-
header "Pre-flight"
|
|
55
|
-
|
|
56
|
-
if [[ -z "${E2E_JWT:-}" ]]; then
|
|
57
|
-
fail "E2E_JWT is not set. Export a valid Keycloak token."
|
|
58
|
-
echo " Hint: copy your JWT from https://${E2E_API_URL}/api/v1/debug/me after login"
|
|
59
|
-
exit 1
|
|
60
|
-
fi
|
|
61
|
-
ok "E2E_JWT is set (length: ${#E2E_JWT})"
|
|
62
|
-
|
|
63
|
-
if [[ -z "${E2E_INSTANCE_ID:-}" ]]; then
|
|
64
|
-
echo -e "${YELLOW}⚠ E2E_INSTANCE_ID not set — instance-specific tests will be skipped${NC}"
|
|
65
|
-
else
|
|
66
|
-
ok "E2E_INSTANCE_ID: $E2E_INSTANCE_ID"
|
|
67
|
-
fi
|
|
68
|
-
|
|
69
|
-
# ── Build ─────────────────────────────────────────────────────────────────────
|
|
70
|
-
header "Building"
|
|
71
|
-
npm run build
|
|
72
|
-
ok "Build complete"
|
|
73
|
-
|
|
74
|
-
# ── Select test suite ─────────────────────────────────────────────────────────
|
|
75
|
-
SUITE="${1:-all}"
|
|
76
|
-
|
|
77
|
-
VITEST_BASE="npx vitest run --reporter=verbose"
|
|
78
|
-
E2E_DIR="src/__tests__/e2e"
|
|
79
|
-
|
|
80
|
-
run_suite() {
|
|
81
|
-
local name="$1"; local pattern="$2"
|
|
82
|
-
header "Running: $name"
|
|
83
|
-
$VITEST_BASE "$pattern" && ok "$name passed" || { fail "$name FAILED"; exit 1; }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
case "$SUITE" in
|
|
87
|
-
api)
|
|
88
|
-
run_suite "API health + auth" "$E2E_DIR/api-health.test.ts $E2E_DIR/api-auth.test.ts"
|
|
89
|
-
;;
|
|
90
|
-
tools)
|
|
91
|
-
if [[ -z "${E2E_API_KEY:-}" || -z "${E2E_REDIS_HOST:-}" ]]; then
|
|
92
|
-
fail "E2E_API_KEY and E2E_REDIS_HOST required for MCP tool tests"
|
|
93
|
-
exit 1
|
|
94
|
-
fi
|
|
95
|
-
run_suite "MCP tools" "$E2E_DIR/mcp-tools.test.ts"
|
|
96
|
-
;;
|
|
97
|
-
cli)
|
|
98
|
-
run_suite "CLI smoke" "$E2E_DIR/cli.test.ts"
|
|
99
|
-
;;
|
|
100
|
-
funnel)
|
|
101
|
-
run_suite "Funnel telemetry" "$E2E_DIR/funnel.test.ts"
|
|
102
|
-
;;
|
|
103
|
-
provisioning)
|
|
104
|
-
export E2E_SKIP_SLOW=false
|
|
105
|
-
run_suite "Provisioning lifecycle" "$E2E_DIR/provisioning.test.ts"
|
|
106
|
-
;;
|
|
107
|
-
all)
|
|
108
|
-
header "Running ALL e2e suites"
|
|
109
|
-
|
|
110
|
-
echo ""
|
|
111
|
-
echo " API URL: $E2E_API_URL"
|
|
112
|
-
echo " Instance ID: ${E2E_INSTANCE_ID:-(not set)}"
|
|
113
|
-
echo " Redis host: ${E2E_REDIS_HOST:-(not set — tool tests will fail)}"
|
|
114
|
-
echo " Skip slow: $E2E_SKIP_SLOW"
|
|
115
|
-
echo ""
|
|
116
|
-
|
|
117
|
-
FAILED=()
|
|
118
|
-
|
|
119
|
-
run_one() {
|
|
120
|
-
local name="$1"; local file="$2"
|
|
121
|
-
header "$name"
|
|
122
|
-
if $VITEST_BASE "$file"; then
|
|
123
|
-
ok "$name passed"
|
|
124
|
-
else
|
|
125
|
-
fail "$name FAILED"
|
|
126
|
-
FAILED+=("$name")
|
|
127
|
-
fi
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
run_one "API health (no auth)" "$E2E_DIR/api-health.test.ts"
|
|
131
|
-
run_one "API auth + instances" "$E2E_DIR/api-auth.test.ts"
|
|
132
|
-
run_one "Funnel telemetry" "$E2E_DIR/funnel.test.ts"
|
|
133
|
-
run_one "CLI smoke tests" "$E2E_DIR/cli.test.ts"
|
|
134
|
-
|
|
135
|
-
if [[ -n "${E2E_API_KEY:-}" && -n "${E2E_REDIS_HOST:-}" ]]; then
|
|
136
|
-
run_one "MCP tools (live Redis)" "$E2E_DIR/mcp-tools.test.ts"
|
|
137
|
-
else
|
|
138
|
-
echo -e "${YELLOW}⚠ Skipping MCP tool tests (E2E_API_KEY / E2E_REDIS_HOST not set)${NC}"
|
|
139
|
-
fi
|
|
140
|
-
|
|
141
|
-
if [[ "$E2E_SKIP_SLOW" != "true" ]]; then
|
|
142
|
-
run_one "Provisioning lifecycle" "$E2E_DIR/provisioning.test.ts"
|
|
143
|
-
else
|
|
144
|
-
echo -e "${YELLOW}⚠ Skipping provisioning tests (E2E_SKIP_SLOW=true)${NC}"
|
|
145
|
-
fi
|
|
146
|
-
|
|
147
|
-
echo ""
|
|
148
|
-
if [[ ${#FAILED[@]} -eq 0 ]]; then
|
|
149
|
-
echo -e "${GREEN}━━━ ALL E2E TESTS PASSED ━━━${NC}"
|
|
150
|
-
else
|
|
151
|
-
echo -e "${RED}━━━ FAILED SUITES: ${FAILED[*]} ━━━${NC}"
|
|
152
|
-
exit 1
|
|
153
|
-
fi
|
|
154
|
-
;;
|
|
155
|
-
*)
|
|
156
|
-
echo "Unknown suite: $SUITE"
|
|
157
|
-
echo "Usage: $0 [all|api|tools|cli|funnel|provisioning]"
|
|
158
|
-
exit 1
|
|
159
|
-
;;
|
|
160
|
-
esac
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Converts SVG icon assets to PNG for Expo.
|
|
4
|
-
* Run: node scripts/generate-icons.js
|
|
5
|
-
* Requires: npm install -g sharp-cli OR npx sharp-cli
|
|
6
|
-
*/
|
|
7
|
-
const { execSync } = require('child_process');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
|
|
10
|
-
const frontend = path.join(__dirname, '..', 'apps', 'travel-chaos-organizer', 'frontend');
|
|
11
|
-
|
|
12
|
-
const conversions = [
|
|
13
|
-
{ input: 'assets/icon.svg', output: 'assets/icon.png', width: 1024, height: 1024 },
|
|
14
|
-
{ input: 'assets/adaptive-icon.svg', output: 'assets/adaptive-icon.png', width: 1024, height: 1024 },
|
|
15
|
-
{ input: 'assets/icon.svg', output: 'assets/splash.png', width: 1284, height: 2778 },
|
|
16
|
-
{ input: 'assets/icon.svg', output: 'assets/favicon.png', width: 32, height: 32 },
|
|
17
|
-
];
|
|
18
|
-
|
|
19
|
-
for (const { input, output, width, height } of conversions) {
|
|
20
|
-
const src = path.join(frontend, input);
|
|
21
|
-
const dst = path.join(frontend, output);
|
|
22
|
-
try {
|
|
23
|
-
execSync(`npx sharp-cli --input "${src}" --output "${dst}" resize ${width} ${height}`, { stdio: 'inherit' });
|
|
24
|
-
console.log(`✓ ${output}`);
|
|
25
|
-
} catch {
|
|
26
|
-
console.error(`✗ ${output} — install sharp-cli: npm i -g sharp-cli`);
|
|
27
|
-
}
|
|
28
|
-
}
|
package/smithery.yaml
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
name: cachly AI Brain
|
|
2
|
-
description: >
|
|
3
|
-
Persistent AI memory for Claude Code, Cursor, Copilot, Windsurf, Cline & Zed.
|
|
4
|
-
Your AI remembers every lesson, fix, and architecture decision — forever.
|
|
5
|
-
Features: causal root-cause analysis (causal_trace), failure prediction (brain_predict),
|
|
6
|
-
git-ambient learning (brain_from_git), team knowledge sharing, Memory Crystals,
|
|
7
|
-
BM25+ search in 11 languages. 80 MCP tools. Free tier. GDPR. German servers.
|
|
8
|
-
Zero-config: sign in once via browser, auto-provisions your Brain instance.
|
|
9
|
-
|
|
10
|
-
startCommand:
|
|
11
|
-
type: stdio
|
|
12
|
-
configSchema:
|
|
13
|
-
type: object
|
|
14
|
-
properties:
|
|
15
|
-
CACHLY_JWT:
|
|
16
|
-
type: string
|
|
17
|
-
title: "API Key (optional — sign in via browser on first use)"
|
|
18
|
-
description: "Leave blank for zero-config: on your first tool call the server opens a browser sign-in (OAuth Device Flow) and auto-provisions your Brain instance. Or pre-fill with your API key from cachly.dev/setup-ai."
|
|
19
|
-
examples:
|
|
20
|
-
- "cky_live_abc123..."
|
|
21
|
-
CACHLY_BRAIN_INSTANCE_ID:
|
|
22
|
-
type: string
|
|
23
|
-
title: "Brain Instance ID (optional)"
|
|
24
|
-
description: "Only needed if you have multiple Brain instances. Leave blank — the server auto-detects your active instance from the API key."
|
|
25
|
-
pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
|
26
|
-
examples:
|
|
27
|
-
- "9d4077aa-bfa2-468b-89cd-0a8d8f3ec483"
|
|
28
|
-
CACHLY_API_URL:
|
|
29
|
-
type: string
|
|
30
|
-
title: "API URL (optional)"
|
|
31
|
-
description: "Leave blank unless you self-host Cachly."
|
|
32
|
-
default: "https://api.cachly.dev"
|
|
33
|
-
required: []
|
|
34
|
-
commandFunction: |-
|
|
35
|
-
(config) => ({
|
|
36
|
-
command: "npx",
|
|
37
|
-
args: ["-y", "@cachly-dev/mcp-server@latest"],
|
|
38
|
-
env: Object.fromEntries(
|
|
39
|
-
Object.entries({
|
|
40
|
-
CACHLY_JWT: config.CACHLY_JWT,
|
|
41
|
-
CACHLY_BRAIN_INSTANCE_ID: config.CACHLY_BRAIN_INSTANCE_ID,
|
|
42
|
-
CACHLY_API_URL: config.CACHLY_API_URL ?? "https://api.cachly.dev",
|
|
43
|
-
}).filter(([, v]) => v != null && v !== "")
|
|
44
|
-
)
|
|
45
|
-
})
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import { jwtExpiryMs, checkJwt, handleApiError } from '../auth.js';
|
|
4
|
-
|
|
5
|
-
function makeJwt(payload: Record<string, unknown>): string {
|
|
6
|
-
const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
|
|
7
|
-
const body = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
8
|
-
return `${header}.${body}.fakesig`;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const nowSec = () => Math.floor(Date.now() / 1000);
|
|
12
|
-
|
|
13
|
-
describe('jwtExpiryMs', () => {
|
|
14
|
-
it('returns null for an empty string', () => {
|
|
15
|
-
expect(jwtExpiryMs('')).toBeNull();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('returns null for a plain (non-JWT) string', () => {
|
|
19
|
-
expect(jwtExpiryMs('not-a-token')).toBeNull();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('returns null when the JWT has only two parts', () => {
|
|
23
|
-
expect(jwtExpiryMs('header.payload')).toBeNull();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('returns null when the JWT has four parts', () => {
|
|
27
|
-
expect(jwtExpiryMs('a.b.c.d')).toBeNull();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('returns null when the payload base64 is invalid', () => {
|
|
31
|
-
expect(jwtExpiryMs('header.!!!.sig')).toBeNull();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('returns null when the payload has no exp field', () => {
|
|
35
|
-
expect(jwtExpiryMs(makeJwt({ sub: 'user-123', iat: nowSec() }))).toBeNull();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('returns null when exp is 0', () => {
|
|
39
|
-
expect(jwtExpiryMs(makeJwt({ exp: 0 }))).toBeNull();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('converts exp (seconds) to milliseconds', () => {
|
|
43
|
-
const expSec = nowSec() + 3600;
|
|
44
|
-
expect(jwtExpiryMs(makeJwt({ exp: expSec }))).toBe(expSec * 1000);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('returns a past timestamp for an expired token', () => {
|
|
48
|
-
expect(jwtExpiryMs(makeJwt({ exp: nowSec() - 300 }))).toBeLessThan(Date.now());
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('returns a future timestamp for a valid token', () => {
|
|
52
|
-
expect(jwtExpiryMs(makeJwt({ exp: nowSec() + 86400 }))).toBeGreaterThan(Date.now());
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('handles a token expiring in less than 60 minutes', () => {
|
|
56
|
-
const expSec = nowSec() + 30 * 60;
|
|
57
|
-
const result = jwtExpiryMs(makeJwt({ exp: expSec }))!;
|
|
58
|
-
const minsLeft = Math.floor((result - Date.now()) / 60_000);
|
|
59
|
-
expect(minsLeft).toBeGreaterThanOrEqual(29);
|
|
60
|
-
expect(minsLeft).toBeLessThanOrEqual(30);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('ignores extra claims', () => {
|
|
64
|
-
const expSec = nowSec() + 3600;
|
|
65
|
-
expect(jwtExpiryMs(makeJwt({ sub: 'u', iat: nowSec(), exp: expSec, plan: 'free' }))).toBe(expSec * 1000);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('handles padding-free base64url payloads', () => {
|
|
69
|
-
// base64url (no =) — Buffer.from handles this natively
|
|
70
|
-
const expSec = nowSec() + 7200;
|
|
71
|
-
expect(jwtExpiryMs(makeJwt({ exp: expSec, x: 'a' }))).toBe(expSec * 1000);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
describe('checkJwt', () => {
|
|
76
|
-
it('throws InvalidRequest when jwt is empty', () => {
|
|
77
|
-
expect(() => checkJwt('')).toThrowError(
|
|
78
|
-
expect.objectContaining({ code: ErrorCode.InvalidRequest, message: expect.stringContaining('CACHLY_JWT env var not set') }),
|
|
79
|
-
);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('throws with setup URL when jwt is missing', () => {
|
|
83
|
-
expect(() => checkJwt('')).toThrowError(
|
|
84
|
-
expect.objectContaining({ message: expect.stringContaining('cachly.dev/setup-ai') }),
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('throws InvalidRequest with expiry timestamp for an expired token', () => {
|
|
89
|
-
const expSec = nowSec() - 60;
|
|
90
|
-
const token = makeJwt({ exp: expSec });
|
|
91
|
-
expect(() => checkJwt(token)).toThrowError(
|
|
92
|
-
expect.objectContaining({
|
|
93
|
-
code: ErrorCode.InvalidRequest,
|
|
94
|
-
message: expect.stringContaining('expired at'),
|
|
95
|
-
}),
|
|
96
|
-
);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('does not throw for a valid non-expired token', () => {
|
|
100
|
-
expect(() => checkJwt(makeJwt({ exp: nowSec() + 3600 }))).not.toThrow();
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('does not throw for a token with no exp claim', () => {
|
|
104
|
-
expect(() => checkJwt(makeJwt({ sub: 'user' }))).not.toThrow();
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
describe('handleApiError', () => {
|
|
109
|
-
it('throws InvalidRequest for 401 with the detail message', () => {
|
|
110
|
-
expect(() => handleApiError(401, 'token expired')).toThrowError(
|
|
111
|
-
expect.objectContaining({
|
|
112
|
-
code: ErrorCode.InvalidRequest,
|
|
113
|
-
message: expect.stringContaining('Authentication failed (401): token expired'),
|
|
114
|
-
}),
|
|
115
|
-
);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('throws InvalidRequest for 403 with the detail message', () => {
|
|
119
|
-
expect(() => handleApiError(403, 'plan limit reached')).toThrowError(
|
|
120
|
-
expect.objectContaining({
|
|
121
|
-
code: ErrorCode.InvalidRequest,
|
|
122
|
-
message: expect.stringContaining('Access denied (403): plan limit reached'),
|
|
123
|
-
}),
|
|
124
|
-
);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('throws InternalError for other status codes', () => {
|
|
128
|
-
expect(() => handleApiError(500, 'server crash')).toThrowError(
|
|
129
|
-
expect.objectContaining({
|
|
130
|
-
code: ErrorCode.InternalError,
|
|
131
|
-
message: expect.stringContaining('cachly API error 500: server crash'),
|
|
132
|
-
}),
|
|
133
|
-
);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('includes the cachly.dev/setup-ai link for 401 errors', () => {
|
|
137
|
-
expect(() => handleApiError(401, 'Unauthorized')).toThrowError(
|
|
138
|
-
expect.objectContaining({ message: expect.stringContaining('cachly.dev/setup-ai') }),
|
|
139
|
-
);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('includes account access hint for 403 errors', () => {
|
|
143
|
-
expect(() => handleApiError(403, 'Forbidden')).toThrowError(
|
|
144
|
-
expect.objectContaining({ message: expect.stringContaining('access to this resource') }),
|
|
145
|
-
);
|
|
146
|
-
});
|
|
147
|
-
});
|