Commit Graph

415 Commits

Author SHA1 Message Date
saravanakumardb1
3a14f87814 chore(platform-service): wire P2+P3 modules into server + cosmos-init
- server.ts: register cdnRoutes, searchRoutes, dunningRoutes (P2)
- server.ts: register tenantRoutes, retentionRoutes, backupRoutes, apiVersioningRoutes (P3)
- cosmos-init.ts: 17 new containers across 7 modules:
  CDN: cdn_assets, cdn_purge_requests, cdn_origin_configs
  Search: search_index, search_suggestions
  Dunning: dunning_campaigns, dunning_policies
  Tenants: tenants, tenant_members, tenant_invites
  Retention: retention_policies, retention_jobs
  Backups: backups, restores, backup_configs
  API Versioning: api_versions, api_version_pins
- Total platform-service modules: ~41, tests: 1239
2026-03-19 23:50:38 -07:00
saravanakumardb1
946390f378 feat(api-versioning): add API versioning — lifecycle, pins, deprecation
- types.ts: ApiVersionDoc, ClientVersionPinDoc + 4 Zod schemas
- repository.ts: version CRUD, client pin CRUD, active version lookup
- routes.ts: 10 endpoints (version lifecycle, current, pins CRUD)
- api-versioning.test.ts: 13 schema tests
- draft → active → deprecated → sunset lifecycle
- Client version pinning with auto-upgrade scheduling
- Cosmos containers: api_versions, api_version_pins
2026-03-19 23:50:23 -07:00
saravanakumardb1
b5c83b1874 feat(backups): add backup/restore module — on-demand + config
- types.ts: BackupDoc, RestoreDoc, BackupConfigDoc + 3 Zod schemas
- repository.ts: backup/restore CRUD, config singleton per product
- routes.ts: 9 endpoints (backup CRUD, restore, history, config)
- backups.test.ts: 11 schema tests
- Supports full/incremental/selective types with expiry
- Cosmos containers: backups, restores, backup_configs
2026-03-19 23:50:09 -07:00
saravanakumardb1
c638555069 feat(retention): add data retention policies — policy CRUD, enforce, jobs
- types.ts: RetentionPolicyDoc, RetentionJobDoc + 2 schemas + getCutoffDate helper
- repository.ts: policy CRUD, enabled policies query, job audit trail, stats
- routes.ts: 7 endpoints (policy CRUD, enforce with dry-run, job history, stats)
- retention.test.ts: 12 schema + helper tests
- Supports delete/archive/anonymize actions with configurable date fields
- Cosmos containers: retention_policies, retention_jobs
2026-03-19 23:49:56 -07:00
saravanakumardb1
33e5fd70ce feat(tenants): add multi-tenant module — tenant CRUD, members, invites
- types.ts: TenantDoc, TenantMemberDoc, TenantInviteDoc + 4 Zod schemas
- repository.ts: tenant CRUD, member CRUD, invite lifecycle, slug uniqueness
- routes.ts: 10 endpoints (tenant CRUD, invite, accept, member role, remove)
- tenants.test.ts: 16 schema + plan-limits tests
- Plan limits: free(5), starter(25), pro(100), enterprise(10k) members
- SHA-256 hashed invite tokens with 7-day expiry
- Cosmos containers: tenants, tenant_members, tenant_invites
2026-03-19 23:49:41 -07:00
saravanakumardb1
797f5e4318 feat(dunning): add billing dunning module — campaigns, policies, retries
- types.ts: DunningCampaignDoc, DunningPolicyDoc + 3 Zod schemas + helpers
- repository.ts: campaign CRUD, policy management, retry scheduling
- routes.ts: 11 endpoints (campaign lifecycle, policy CRUD, retry, grace period)
- dunning.test.ts: 20 schema + helper tests (getNextRetryTime, isGracePeriodExpired)
- Configurable retry schedules, grace periods, auto-downgrade
- Campaign status lifecycle: active → resolved/escalated
- Cosmos containers: dunning_campaigns, dunning_policies
2026-03-19 23:49:25 -07:00
saravanakumardb1
e9cb6b2a38 feat(search): add full-text search module — index, query, suggestions
- types.ts: SearchIndexDoc, SearchSuggestion + 3 Zod schemas
- repository.ts: index/remove entities, search with CONTAINS, prefix suggestions
- routes.ts: 6 endpoints (search, suggest, index entity, reindex, delete by type:id)
- search.test.ts: 15 schema validation tests
- Parameterized queries (no manual quote escaping)
- Composite doc ID format: entityType:entityId
- Cosmos containers: search_index, search_suggestions
2026-03-19 23:49:02 -07:00
saravanakumardb1
7b43a02126 feat(cdn): add CDN asset pipeline module — upload, purge, origin config
- types.ts: CdnAsset, PurgeRequest, OriginConfig + 3 Zod schemas
- repository.ts: asset CRUD, purge request tracking, origin config management
- routes.ts: 9 endpoints (asset upload/list/get/delete, purge, origin config CRUD)
- cdn.test.ts: 15 schema validation tests
- Supports categories (image/video/font/script/style/document/other)
- SHA-256 content hash tracking, size limits, TTL-based purge requests
- Cosmos containers: cdn_assets, cdn_purge_requests, cdn_origin_configs
2026-03-19 23:47:59 -07:00
saravanakumardb1
4071429871 fix(platform-service): fix OFFSET/LIMIT pairing, survey analytics productId, unused imports
- broadcasts/repository: fix OFFSET/LIMIT must be paired (Cosmos SQL requires both)
- broadcasts/repository: remove unused TargetingContext import
- surveys/repository: fix OFFSET/LIMIT in listSurveys + listResponsesForSurvey
- surveys/repository: fix getSurveyAnalytics to accept and pass productId
- surveys/repository: fix isComplete boolean param cast for Cosmos SDK types
- surveys/routes: fix parseInt safety for limit/offset query params (NaN guard)
- surveys/routes: pass productId to getSurveyAnalytics call
2026-03-19 23:47:43 -07:00
saravanakumardb1
652a8e5d15 fix(platform-service): missing cosmos containers + NaN guard in cross-product limit
- cosmos-init.ts: add onboarding_events + onboarding_completions containers
  (onboarding repository references them but they were never registered)
- telemetry cross-product route: parseInt(limit) could produce NaN when
  given non-numeric input — now clamps to 1-100 with default 20
2026-03-19 22:20:31 -07:00
saravanakumardb1
4e7401d164 test(platform-service): add broadcast + survey module tests — 43 tests
Broadcasts (23 tests): schema validation, targeting engine (segments,
platform, version range, country, specific users, percentage rollout),
query builder, context extraction.

Surveys (20 tests): schema validation (create, update, question, answer,
triggers), completion rate, answer type validation (NPS, text, rating,
dropdown, scale, ranking), length/range constraints.
2026-03-19 22:16:28 -07:00
saravanakumardb1
0352ea5383 feat(platform-service): pre-built Stripe checkout flow (Phase 4.4) — 6 tests
New modules/billing-checkout/ — higher-level POST /billing/checkout with:
- Zod-validated input (plan OR explicit priceId)
- Tax collection support (automatic_tax)
- Customer email pre-fill
- Arbitrary metadata passthrough
- Trial period and promo code support
- 6 tests: plan, priceId, missing both, invalid plan, optional fields, URL validation
2026-03-19 22:10:32 -07:00
saravanakumardb1
0e880fd40d feat(platform-service): shared onboarding analytics module (Phase 4.3) — 8 tests
New modules/onboarding/ with standard pattern (types → repository → routes):
- POST /onboarding/step — track step completion (any auth)
- POST /onboarding/complete — track onboarding completion (any auth)
- GET /onboarding/funnel — funnel conversion rates (admin)
- GET /onboarding/user/:userId — user progress (admin)
- Cosmos containers: onboarding_events, onboarding_completions
- Funnel: per-step unique users, conversion rates, avg duration
- 8 tests: schema validation, funnel, date filter, user progress, empty product
2026-03-19 22:07:03 -07:00
saravanakumardb1
d900df3dc8 feat(platform-service): cross-product telemetry endpoint (Phase 4.2) — 6 tests
GET /telemetry/cross-product?products=a,b,c — admin-only endpoint for
multi-product telemetry comparison:
- Per-product summary: totalEvents, errorEvents, errorRate, topModules, platforms
- Daily event counts per product (for stacked bar charts)
- Top error clusters across products (merged + sorted by count)
- Date range filtering via from/to query params
- 6 tests: summary, daily breakdown, clusters, date filter, unknown product, limit
2026-03-19 22:04:00 -07:00
saravanakumardb1
1fe1e75999 feat(platform-service): auto-registration on first request (Phase 4.1) — 8 tests
Zero-touch product provisioning: when a request arrives with an unknown
productId and a valid JWT, auto-create a minimal ProductDoc instead of
rejecting. Enables new products to use platform-service immediately.

- auto-register.ts: auto-create ProductDoc with sensible defaults
- Rate limited: max 10 auto-registrations per minute
- Requires valid JWT (unauthenticated requests still rejected)
- Audit logged as product.auto_registered
- request-context.ts: exported extractProductIdAsync with auto-register
- 8 tests: register, duplicate, format validation, rate limit
2026-03-19 22:00:57 -07:00
saravanakumardb1
0f299231cc feat(platform-service): declarative YAML module loader (4.4) — 34 tests
New files:
- src/lib/declarative-schema.ts — YAML schema + Zod validation
  - ModuleSchema, FieldSchema, EndpointSchema
  - fieldToZodSchema, buildCreateSchema, buildUpdateSchema, defaultEndpoints

- src/lib/declarative-loader.ts — runtime route generator
  - parseModuleYaml, registerModuleRoutes, loadDeclarativeModules
  - MemoryStore with filtering, sorting, pagination
  - Auth enforcement (none/user/admin), custom endpoint support

- src/lib/declarative-loader.test.ts — 34 tests
  - Schema validation, field conversion, endpoint generation
  - MemoryStore CRUD, route integration with full lifecycle

Dependency: yaml (npm)
2026-03-19 21:16:58 -07:00
saravanakumardb1
6ba86e0bf4 fix: replace corepack pnpm with pnpm in pretest/predev scripts
Node 25 removed corepack as a built-in. Replace all 'corepack pnpm'
invocations with direct 'pnpm' calls since pnpm is installed globally.

Affected: platform-service, tracker-web, blob, testing, LLM dashboard
2026-03-19 19:57:16 -07:00
saravanakumardb1
16dc1c4a79 feat(platform-service): overhaul module generator with auto-patching
- Rewrote gen-module.ts to match actual codebase patterns
- Repository uses getRegisteredContainer from @bytelyst/cosmos
- Routes use req.jwtPayload?.sub for auth (not req.user)
- Routes register with explicit /name paths under /api prefix
- Auto-patches cosmos-init.ts with container definition
- Auto-patches server.ts with import + route registration
- Proper parenthesis-aware field splitter for enum(a,b,c)
- Test template generates per-field validation tests
- Checks for existing module directory before overwriting
- Pascal/camel case helpers handle hyphenated module names
- Dry-run shows auto-patch previews
2026-03-19 19:52:06 -07:00
saravanakumardb1
1ad8660dd8 fix(platform): fix 2 type errors found in typecheck sweep
- api-key-auth.ts: Record<string, unknown> → FilterMap (import from @bytelyst/datastore)
- reviews/notifications.ts: raw subject/html/text → templateId + variables (match dispatchEmail signature)
2026-03-19 19:02:57 -07:00
saravanakumardb1
548f7199bf fix(extraction-service): fix QueueJob generic type mismatch in createJob
enqueue() returns QueueJob<TPayload, unknown> since no result exists at
enqueue time. mapQueueJob expects ExtractionJobResult. Cast at the call
site since newly enqueued jobs have undefined result and all accesses
use optional chaining.
2026-03-19 18:12:34 -07:00
root
e996962b64 feat(mcp-server): add team provisioning follow-up hooks 2026-03-15 09:59:35 +00:00
root
8976caa966 feat(mcp-server): add org review follow-up hooks 2026-03-15 09:56:04 +00:00
root
7c5999ce5a feat(mcp-server): wire a2a governance hooks 2026-03-15 09:51:00 +00:00
root
d93ada4037 docs(config): align rate limit settings 2026-03-15 09:42:42 +00:00
root
e4bff5a2fe feat(platform-service): add support case management foundation 2026-03-15 09:39:20 +00:00
root
14346fbd5d feat(ratelimit): back api throttles with datastore 2026-03-15 09:37:03 +00:00
root
8b99b7a9a7 feat(platform-service): add scim provisioning foundation 2026-03-15 09:36:27 +00:00
root
66d0bf53a9 feat(platform-service): add shared knowledge foundation 2026-03-15 09:33:17 +00:00
root
728d8f2484 feat(platform-service): add ai budget governance 2026-03-15 09:30:16 +00:00
root
3f06427038 feat(platform-service): add agent evaluation governance 2026-03-15 09:26:40 +00:00
root
8d78b6ce59 feat(api-key): audit security events 2026-03-15 09:24:01 +00:00
root
2f7163b856 feat(api-key): restrict job operations to service tokens 2026-03-15 09:08:38 +00:00
root
95261acb92 feat(api-key): log auth and throttling rejects 2026-03-15 09:06:51 +00:00
root
798c1b9fad feat(platform-service): add agent registry foundation 2026-03-15 09:05:39 +00:00
root
473b7310d5 fix(tokens): tighten machine credential issuance 2026-03-15 06:28:50 +00:00
root
57abfa5b03 feat(api-key): add per-product throttling 2026-03-15 06:26:42 +00:00
root
8240f6060d feat(api-key): restrict ops routes to service tokens 2026-03-15 06:24:08 +00:00
root
d1b3faae8b fix(tokens): issue machine-ready defaults 2026-03-15 06:19:48 +00:00
root
eac633e1e7 fix(api-key): enforce machine token policy 2026-03-15 06:16:15 +00:00
root
507f0fdd1f feat(tokens): classify machine credentials 2026-03-15 06:09:42 +00:00
root
3398d1400f feat(platform-service): add human review queue 2026-03-15 06:08:23 +00:00
root
33c5a5a5ce feat(platform-service): add org workspace foundation 2026-03-15 06:03:08 +00:00
root
841d2f5129 fix(api-key): enforce requested product binding 2026-03-15 06:01:17 +00:00
root
daec38faf7 feat(a2a): persist incident pipeline runs 2026-03-15 05:58:15 +00:00
root
07e9475b70 fix(tokens): align api token storage with cosmos partitioning 2026-03-15 05:57:34 +00:00
root
a76b932502 feat(platform-service): add durable run tracking 2026-03-14 16:08:07 +00:00
root
885ee2d504 feat(events): add durable event bus worker path 2026-03-14 16:02:40 +00:00
root
8de22f9f22 feat(platform-service): allow scoped api keys on webhook routes 2026-03-14 15:38:42 +00:00
root
da744ab116 feat(platform-service): allow scoped api keys on ops routes 2026-03-14 14:58:08 +00:00
root
0ad6703961 feat(platform-service): add api key auth context and throttling guard 2026-03-14 14:55:23 +00:00
root
7616901683 test(workspace): harden service bootstrap and sync coverage 2026-03-14 06:40:10 +00:00
root
2b4fccb744 feat(queue): add durable worker runtime and extraction integration 2026-03-14 06:25:10 +00:00
root
91885f0d4f Add Mailpit-backed prototype email sandbox 2026-03-14 06:16:28 +00:00
root
a27a822fc2 Add prototype storage diagnostics and smoke test 2026-03-14 06:06:35 +00:00
root
114240c79a feat(platform-service): add telegram and slack delivery 2026-03-14 06:01:59 +00:00
root
db9ae4a573 feat(platform-service): add smtp email delivery and postal setup 2026-03-14 05:52:28 +00:00
root
19b58b3ea0 Fix prototype service runtime dependencies 2026-03-14 05:32:21 +00:00
root
a5e8890df2 Add Cosmos emulator prototype support 2026-03-14 05:24:01 +00:00
saravanakumardb1
2b3130821c fix(auth): register magic_link event type + use admin productId for enterprise IdP
- Register 'auth.magic_link_requested' in @bytelyst/events PlatformEventSchemas
- Remove any-cast from magic-link/routes.ts — now properly typed
- Enterprise IdP creation uses admin's JWT productId instead of hardcoded 'smartauth'
- All 53 auth tests passing
2026-03-12 15:55:09 -07:00
saravanakumardb1
b0e1a54481 fix(auth): enterprise SSO bcrypt hash + upgrade cost 10→12
- Enterprise SAML/OIDC callbacks used raw 'sso_xxx' string as passwordHash
  which would crash bcrypt.compare(). Now uses userRepo.hashPassword(randomUUID())
- Added updateLastLogin() for existing enterprise SSO users
- Upgraded bcrypt cost factor from 10 to 12 per PRD spec
- All 53 auth tests passing
2026-03-12 15:35:00 -07:00
saravanakumardb1
0c4e53a0ed feat(auth): Phase 6 — enterprise SAML/OIDC, magic link, HIBP, E2E specs
6A: Enterprise IdP CRUD, SAML callback, OIDC callback, email domain lookup
6B: Magic link send/verify (15min TTL, anti-enumeration), HIBP breach check
6D: 3 new E2E specs (account-linking, step-up, enterprise) — total 8 SmartAuth specs
- All 53 auth tests passing
2026-03-12 15:25:28 -07:00
saravanakumardb1
f4b9124065 feat(auth): add Phase 5C-5E endpoints + SDK methods — TOTP secret, push approvals, QR auth
- GET /auth/mfa/totp/secret — retrieve decrypted TOTP secret for auth app
- POST /auth/mfa/push/create, GET /pending, POST /:id/respond, GET /:id/status
- POST /auth/qr/create, POST /auth/qr/confirm, GET /auth/qr/:id/status
- Kotlin SDK: getTotpSecret, getPendingApprovals, respondToApproval, confirmQrLogin
- Swift SDK: getTotpSecret, getPendingApprovals, respondToApproval, confirmQrLogin
- All 53 auth tests passing
2026-03-12 15:01:51 -07:00
saravanakumardb1
ae13abfab2 fix(auth): address SmartAuth agent review gaps — Swift mock wiring, passkey SDK consistency, device list parity, JSDoc, SSR docs 2026-03-12 12:27:08 -07:00
saravanakumardb1
a613cf1bf9 test(auth): add SmartAuth integration tests + fix auth.routes.test mocks
- Add 5 new tests: MFA challenge integration, risk scorer edge cases, login events wiring, device trust pure function
- Fix auth.routes.test.ts: add vi.mock stubs for login-events, risk-scorer, mfa, devices, config, event-bus
- Change afterEach from restoreAllMocks to clearAllMocks (preserves mock implementations between tests)
- Total: 42 smartauth tests, 951 platform-service tests all passing
2026-03-12 11:27:50 -07:00
saravanakumardb1
0f4be0c325 feat(auth): wire login events into OAuth login helper
- Record success login event with risk scoring after OAuth token issuance
- Import login-events repo + risk-scorer into oauth/routes
- Best-effort recording — never blocks OAuth login flow
2026-03-12 11:19:11 -07:00
saravanakumardb1
82d7f157d9 feat(auth): wire login events + MFA challenge into login handler
- Add recordLoginEvent() helper with risk scoring via scoreLoginRisk()
- On failed login: record 'failed' event with risk assessment
- On MFA-required: issue challenge token, record 'mfa_required' event
- On success: record 'success' event with risk assessment
- Import login-events repo, risk-scorer, mfa repo, challenge store, device repo
2026-03-12 11:17:23 -07:00
saravanakumardb1
bdb3e95e00 fix(auth): clean up MFA routes — remove redundant imports, use userRepo.update()
- Remove redundant dynamic import('node:crypto'), use top-level nodeCrypto
- Remove getCollection import, use userRepo.update() for mfaEnabled/mfaMethods
- Expand update() Pick type to include mfaEnabled, mfaMethods, emailVerified
- Remove unused _reply param from MFA policy PUT handler
2026-03-12 11:12:33 -07:00
saravanakumardb1
362b915ea9 feat(auth): SmartAuth backend core — OAuth, MFA, passkeys, device trust, login events
Phase 0A: OneAuth schema extension — UserDoc evolution + auth_providers container
Phase 0B: Progressive lockout + IP rate limiting on login
Phase 1A-1B: Google/Microsoft/Apple OAuth + account linking
Phase 1D: Enhanced /auth/me — products, providers, MFA status
Phase 2A-2C: TOTP MFA + challenge flow + admin policies
Phase 3A-3B: WebAuthn passkeys + device trust
Phase 4A: Login events + rule-based risk scoring

New sub-modules: oauth/, mfa/, passkeys/, devices/, login-events/
New containers: auth_providers, auth_mfa, auth_mfa_policies, auth_passkeys, auth_devices, auth_login_events
Tests: 37 new (946 total, all passing), typecheck clean
2026-03-12 10:55:41 -07:00
saravanakumardb1
aff78c55a4 fix(mcp-server): align notes tool outputs with contracts 2026-03-10 09:54:08 -07:00
saravanakumardb1
ec3dd4bd66 feat(mcp-server): add notes tool integration 2026-03-10 09:39:07 -07:00
saravanakumardb1
49db2cd2af fix(platform-service): pin vitest pool to threads 2026-03-06 13:52:44 -08:00
saravanakumardb1
63b0d20b07 fix(fastify-core): address jwt rollout review findings 2026-03-06 13:44:22 -08:00
saravanakumardb1
e4baa2fc16 refactor(platform-service): use shared optional jwt context 2026-03-06 12:57:00 -08:00
saravanakumardb1
cfca118c71 feat(fastify-core): add shared optional jwt context 2026-03-06 12:52:49 -08:00
saravanakumardb1
d365bc59d6 refactor(mcp-server): tighten MCP tool typing after review 2026-03-05 22:37:53 -08:00
saravanakumardb1
b199ea7976 fix(mcp-server): align secret and experiment tools with real services 2026-03-05 22:36:30 -08:00
saravanakumardb1
53f34851df fix(mcp-server): resolve lint blockers in new MCP tools 2026-03-05 22:30:39 -08:00
saravanakumardb1
3a7139790c fix(mcp-server): Improve error handling in A2A pipelines
- regression-watch-pipeline.ts: Add try/catch around session creation, continue on failures
- post-incident-cleanup-pipeline.ts: Add try/catch around policy deletion and audit export
- Fix extractionResetProductRateLimit optional parameter pattern
- Update return values to use actual counts instead of targets
- All pipelines now continue processing individual items instead of failing entirely
- Add proper type casting for audit response events array
2026-03-05 22:09:56 -08:00
saravanakumardb1
40db19a389 feat(mcp-server): Add 2 high-priority A2A pipelines
- regression-watch-pipeline.ts: Monitor error clusters and auto-create diagnostics sessions
- post-incident-cleanup-pipeline.ts: Resolve clusters, delete policies, export audit logs
- a2a-tools.ts: Register both pipelines as MCP tools (a2a.regressionWatch, a2a.postIncidentCleanup)
- Fix platform-client function names and TelemetryCluster interface usage
- Both pipelines support dryRun mode and proper error handling
- Fix ESLint warnings: remove unused imports, add proper types

All tools require admin role and use existing platform-service endpoints.
2026-03-05 22:07:42 -08:00
saravanakumardb1
c8fafbb564 feat(mcp-server): Add 7 missing extraction async jobs tools
- extraction.extractBatch: batch extraction with shared config
- extraction.submitJob: async job submission with webhook support
- extraction.getJob: get job status/results by ID
- extraction.listJobs: list recent async jobs
- extraction.getProductRateLimitStatus: per-product or summary rate limits
- extraction.resetProductRateLimit: admin rate limit reset
- extraction.sidecarMonitoringState: detailed sidecar circuit breaker state

All tools require admin role and map to existing extraction-service endpoints.
Fixes TypeScript optional parameter error in extractionGetProductRateLimitStatus.
2026-03-05 22:05:00 -08:00
saravanakumardb1
3f296a8e72 feat(mcp-server): fill 12 DOMAIN_PRODUCTS.md MCP tool gaps + client fn additions
Bug fix (committed separately):
  social-fast-coordinator: stage_transition used non-existent currentStage

New client functions:
  nomgap-client: nomgapFastingCreateSession, nomgapProtocolGet,
                 nomgapSocialListGroupFasts (+ GroupFastDoc)
  peakpulse-client: peakpulseRoutesList, peakpulseSyncStatus
  lysnrai-client: lysnraiApiTokenCreate, lysnraiSessionsStats,
                  lysnraiTranscriptsExportBatch
  chronomind-client: chronomindRoutineGet, chronomindSharedTimerShare

New MCP tools (12):
  mindlyst.briefs.generate        — trigger daily brief via mindlystBriefCreate
  mindlyst.memory.getTriageResult — extract TriageResult sub-doc only
  nomgap.fasting.createSession    — start new fast with protocolId
  nomgap.protocols.get            — single protocol lookup
  nomgap.social.listGroupFasts    — list group fast sessions
  peakpulse.routes.list           — list GPS r
Bug fix (committed separately):
  social-fast-coordinator: stage_transition used non-existent currentStage
ats  social-fast-coordinator: staon
New client functions:
  nomgap-client: nomgapFastingCreateSession, nomgarai  nomgaens.rotate                      nomgapSocialListGroupFasts (+ GroupFastDoc)
 d.  peakpulse-client: peakpulseRoutesList, peakpulseSyncStaturg  lysnrai-client: lysnraiApiTokenCreate, lysnraiSessionsStati                  lysnraiTranscriptsExpor                    us  chronomind-client: chronomindRoutineGet, chrerver total: 126 tools across 17 namespaces
2026-03-05 18:19:04 -08:00
saravanakumardb1
1da3394caf fix(mcp-server): social-fast-coordinator-pipeline — stage_transition used non-existent currentStage field
FastingSessionDoc has stages: unknown[] not currentStage: string.
- Replace currentStage cast with hasStages check (session.stages.length > 0)
- Fix protocolId extraction to use direct field (session?.protocolId)
- Report currentStage derived from stages.length as 'stage_N' indicator
2026-03-05 18:13:28 -08:00
saravanakumardb1
0a6950216a feat(mcp-server): A2A batch-5 — GoalCoachingAgent + SkiRunAnalystAgent (peakpulse) + OrgProvisioningAgent (lysnrai) + ProtocolTuningAgent (nomgap) + CalendarImportAgent (chronomind)
goal-coaching-pipeline.ts: peakpulse.goals.coach
  - SessionHistoryAgent -> GoalAnalysisAgent -> GoalReportAgent
  - Computes duration/distance/elevation/speed trends across recent sessions
  - Classifies user as beginner/intermediate/advanced; generates metric-specific goal suggestions

ski-run-analyst-pipeline.ts: peakpulse.ski.analyze
  - SkiSessionCollectorAgent -> RunQualityAnalystAgent -> SkiReportAgent
  - Computes runDensity, verticalPerRun, skiToLiftRatio per session
  - Flags: low_run_density, high_lift_ratio, short_session, vertical_drop vs baseline

org-provisioning-pipeline.ts: lysnrai.orgs.provision
  - OrgInspectorAgent -> ProvisioningActionAgent -> OrgReportAgent
  - Checks API tokens + session activity; classifies as new_org/needs_attention/complete

protocol-tuning-pipeline.ts: nomgap.protocols.tune
  - ProtocolStatsCollectorAgent -> AbandonmentAnalysisAgent -> TuningReportAgent
  - Finds protocols with >40% abandonment; runs extraction for pattern analysis
  - Proposes duration reduction, milestone notifications, or variant creation

calendar-import-pipeline.ts: chronomind.calendar.import
  - EventValidatorAgent -> ConflictDetectorAgent -> ImportReportAgent
  - Validates dtstart/dtend; detects time overlaps vs existing timers
  - Creates alarm timers for conflict-free events; dryRun support

MCP server total: 110 tools
2026-03-05 18:07:59 -08:00
saravanakumardb1
acadc3551e feat(mcp-server): A2A batch-4 — RoutineQualityAgent (chronomind) + SocialFastCoordinatorAgent (nomgap) + TeamProvisioningAgent (jarvis)
routine-quality-pipeline.ts: chronomind.routines.checkQuality
  - RoutineInventoryAgent -> QualityCheckAgent -> QualityReportAgent
  - Flags: duration_overflow, never_completed, empty_steps, no_category
  - Per-routine issue list + remediation suggestions; configurable maxDurationMinutes

social-fast-coordinator-pipeline.ts: nomgap.social.coordinateFast
  - GroupMemberResolverAgent -> NotificationDispatchAgent -> CoordinationReportAgent
  - Fires social_invite + stage_transition push to each group member
  - Sends weekly_digest to session owner; per-member outcome tracking

team-provisioning-pipeline.ts: jarvis.teams.provision
  - NewMemberDetectorAgent -> OnboardingAgent -> ProvisioningReportAgent
  - Detects invited + recently joined members (configurable sinceHours window)
  - Recommends starter agents by member role, seeds context memory in each agent
  - Marks check-in as scheduled after successful memory seed

MCP server total: 105 tools
2026-03-05 16:39:36 -08:00
saravanakumardb1
7ed4a105b7 feat(mcp-server): A2A batch-3 — ReflectionSynthesisAgent (mindlyst) + KeyboardDiagnosticsAgent (lysnrai) + NLParserEvalAgent (chronomind)
reflection-synthesis-pipeline.ts: mindlyst.reflections.synthesize
  - ReflectionCollectorAgent -> ThemeExtractionAgent -> SynthesisReportAgent
  - Fetches recent reflections, runs reflection-enrichment extraction, surfaces themes by frequency
  - Proposes weekly summary text; max 52 reflections (1 year lookback)

keyboard-diagnostics-pipeline.ts: lysnrai.keyboard.diagnose
  - KeyboardErrorScannerAgent -> DiagnosticsSessionAgent -> BugReportDraftAgent
  - Scans error telemetry filtered to keyboard surface, groups by anonymousInstallId
  - Opens diagnostics session per erroring install; drafts severity-ranked bug reports
  - 48h default window, configurable minErrors threshold

nl-parser-eval-pipeline.ts: chronomind.nlParser.eval
  - PhraseSamplerAgent -> ParseEvalAgent -> RegressionReportAgent
  - 10-phrase canonical test suite + optional custom phrases
  - Submits to extraction-service timer-parse task, validates parsed field presence
  - Returns pass/fail/partial scorecard with regression list

MCP server total: 102 tools
2026-03-05 16:36:19 -08:00
saravanakumardb1
b8e230f018 feat(mcp-server): A2A batch-2 — STTFallbackMonitorAgent (lysnrai) + ProgressAnalystAgent (jarvis) + BrainOverflowAgent (mindlyst)
stt-fallback-monitor-pipeline.ts: lysnrai.stt.monitorFallback
  - STTEventScannerAgent -> DiagnosticsLaunchAgent -> FallbackReportAgent
  - Queries stt_completed telemetry, splits azure vs whisper events, computes offline rate
  - Opens diagnostics session if rate exceeds threshold (default 20%); 6h default window

progress-analyst-pipeline.ts: jarvis.progress.analyze
  - SessionMetricsCollectorAgent -> PlateauDetectorAgent -> ProgressReportAgent
  - Collects skillMetrics timeseries per agent from recent sessions
  - Detects plateau (delta < threshold), recommends increase_difficulty or supplementary_agent

brain-overflow-pipeline.ts: mindlyst.brains.checkOverflow
  - BrainInventoryAgent -> OverflowDetectorAgent -> OverflowReportAgent
  - Flags brains above item count threshold with no acted-on items in N days
  - Per-brain suggestion: archive / reassign / review

MCP server total: 99 tools
2026-03-05 16:31:32 -08:00
saravanakumardb1
e4d489d40c fix(triage-quality-pipeline): remove unused MemoryItemDoc import 2026-03-05 16:18:54 -08:00
saravanakumardb1
d7aa90b021 feat(mcp-server): 4 MCP tool gaps + 3 new A2A pipelines (Priority 3/6/7)
MCP tool gaps filled (DOMAIN_PRODUCTS.md alignment):
- jarvis.memory.create — POST /jarvis/agents/:agentId/memory (sessionId, type, content, importance, tags, expiresAt)
- jarvis.teams.listMembers — GET /jarvis/teams/:teamId/members (role, status, joinedAt)
- nomgap.fasting.getSession — GET /fasting/sessions/:id (client func already existed, MCP tool was missing)
- peakpulse.weather.getSnapshot — extracts weather field from peakpulseSessionGet response

New A2A pipelines (all registered in server.ts):
- transcript-extraction-pipeline.ts: lysnrai.transcripts.runExtractionPipeline
  - TranscriptCollectorAgent -> ExtractionBatchAgent -> ExtractionReportAgent
  - Queries transcripts missing extractedAt, runs extraction, returns batch report + dryRun support
- sync-conflict-pipeline.ts: chronomind.sync.diagnoseConflicts
  - ConflictDetectorAgent -> SyncStateInspectorAgent -> DiagnosticsSessionAgent -> ConflictReportAgent
  - Queries telemetry for sync_conflict events, classifies pattern, creates diagnostics session on conflict
- route-safety-pipeline.ts: peakpulse.sessions.assessSafety
  - SessionDataAgent -> RouteProfileAgent -> SafetyAnalysisAgent -> SafetyReportAgent
  - Fetches GPS + weather, evaluates UV/wind/altitude/speed risk factors, enriches with extraction entities

Client additions (jarvis-client.ts):
  jarvisMemoryCreate, jarvisTeamsListMembers + JarvisTeamMemberDoc interface

MCP server total: 93 tools across 17 namespaces
2026-03-05 15:18:21 -08:00
saravanakumardb1
7e47151918 fix(mcp-server): 3 A2A pipeline bug fixes from audit
- nomgap-client: add electrolyte_reminder + extended_fast_warning to PushTriggerType; rename scheduledAt → scheduledFor to match backend schema; fix startedAt type string → number (backend stores epoch ms)
- nomgap-tools: rename scheduledAt → scheduledFor in nomgap.push.fire tool schema + execute call
- safety-monitor-pipeline: fix FastStateResult.startedAt type number; use epoch ms directly instead of new Date(string)
- sync-diagnostics-pipeline: remove peakpulseGetStats (returns aggregate stats not sync queue); derive queueDepth from recentFailureCount telemetry; add lastSuccessfulSync derivation from events
2026-03-05 14:54:21 -08:00
saravanakumardb1
ea16f8df19 feat(mcp-server): add 6 platform.schemas.* + platform.sdks.* tools from DOMAIN_PACKAGES_AND_SDKS.md
- platform.schemas.telemetryEvent: TelemetryEventDoc field schema + clustering keys + privacy rules
- platform.schemas.diagnosticsSession: DebugSession schema + full endpoint map
- platform.sdks.swiftCapabilities: ByteLystPlatformSDK 13 modules with phase + description
- platform.sdks.kotlinCapabilities: Android/KMP SDK feature inventory + KMP adoption
- platform.sdks.crossProductAdoption: 8 capabilities x 6 products adoption matrix + known gaps
- platform.sdks.auditActivity: live telemetry query to verify SDK wired + event breakdown per platform/module
- MCP server now at 97 tools across 16 namespaces
2026-03-05 14:25:01 -08:00
saravanakumardb1
654de4ed2e feat(mcp-server): add 4 A2A pipelines — DailyBrief, MarketplaceCert, SafetyMonitor, SyncDiagnostics
- DailyBriefGenerationPipeline (mindlyst.brief.generate): fans out memory items across all brains, runs memory-insight extraction per brain, assembles and stores DailyBriefDoc
- MarketplaceCertificationPipeline (jarvis.marketplace.runCertification): ingestion validation, content safety via triage extraction, heuristic quality scoring, approve/reject/pending_human_review decision
- SafetyMonitorAgent (nomgap.safety.check + nomgap.safety.getThresholds): 5-tier threshold table, push notifications, A2A handoff for 72h+ fasts
- SyncDiagnosticsAgent (peakpulse.sync.diagnose): failure pattern classification from telemetry, conditional platform diagnostics session, log/trace capture, root cause + extraction entity report
- Add 3 missing client functions: mindlystBriefCreate, nomgapFastingSessionGet, jarvisMarketplaceGetListing
- MCP server now at 91 tools across 16 namespaces
2026-03-05 14:22:25 -08:00
saravanakumardb1
26a9868380 feat(mcp-server): add 5 missing tools for existing backend routes
New tools backed by routes that existed but had no MCP surface:
- maintenance.getSchedule: GET /settings/maintenance/schedule (list upcoming windows)
- maintenance.deleteWindow: DELETE /settings/maintenance/schedule/:id (cancel window)
- lysnrai.apiTokens.revoke: DELETE /api-tokens/:id (revoke token by ID)

New client functions:
- maintenanceGetSchedule, maintenanceDeleteWindow (platform-client.ts)
- lysnraiApiTokenRevoke (lysnrai-client.ts)
2026-03-05 14:09:00 -08:00
saravanakumardb1
5a3987bd9f fix(mcp-server): jarvis.marketplace.certify routes to wrong endpoint on rejection
The backend has two separate endpoints:
  POST /marketplace/admin/:id/approve
  POST /marketplace/admin/:id/reject

Previously jarvisMarketplaceCertify always called /approve regardless of
the decision field — rejections would silently approve listings.

Fix: derive action from decision.decision ('approved' → 'approve', else 'reject')
and use the correct endpoint path.
2026-03-05 14:06:19 -08:00
saravanakumardb1
f70001de74 fix(mcp-server): audit fixes — 3 bugs + 2 new tools
Bug fixes:
- lysnrai: add lysnrai.sessions.get tool (GET /sessions/:id existed but had no MCP surface)
- nomgap: add nomgap.autophagyConfidence tool (POST /fasting/autophagy-confidence had no tool)
- chronomind: fix syncStatus description 'paused' -> 'pending' (wrong field name)

New client functions: lysnraiSessionGet, nomgapAutophagyConfidence (with typed interfaces)

Root bug fixed in learning_voice_ai_agent commit 42aa931:
GET /transcripts/:id was missing from backend — lysnrai.transcripts.get was always 404-ing
2026-03-05 14:05:03 -08:00
saravanakumardb1
0f57a48168 feat(mcp-server): add 19 platform ops tools — flags.*, jobs.*, maintenance.*, settings.*, webhooks.*
flags (5): list, get, upsert (create-or-update), delete, killSwitch
jobs (4): list, get, trigger, listRuns
maintenance (3): getCurrent (admin full), set, scheduleWindow
settings (3): get, update, checkKillSwitch
webhooks (7): listSubscriptions, create, get, update, delete, listDeliveries, test, rotateSecret

All backed by existing platform-service endpoints — no new backend changes.
MCP server now has 84 tools across 16 namespaces.
2026-03-05 13:46:15 -08:00
saravanakumardb1
33dd530d5f feat(mcp-server): add tracker.* namespace — 13 tools for items, votes, comments, public roadmap
- tracker-client functions appended to platform-client.ts (tracker is part of platform-service)
- tracker.items.{stats,list,get,create,updateStatus,delete}
- tracker.votes.{toggle,list}
- tracker.comments.{list,add,delete}
- tracker.public.{roadmap,stats}
- All 13 tools require admin role; productId forwarded as x-product-id
2026-03-05 13:36:55 -08:00
saravanakumardb1
481760fba1 feat(mcp-server): fill DOMAIN_PRODUCTS.md tool gaps — +17 tools across 6 products
- mindlyst: +memory.get (single item with full TriageResult)
- lysnrai: +transcripts.get, +orgs.get
- jarvis: +agents.create, +marketplace.listPending/certify/suspend/feature
- chronomind: +timers.create, +households.list
- nomgap: +protocols.list, +bodyStages.list
- peakpulse: +sessions.get
2026-03-05 13:15:22 -08:00
saravanakumardb1
c9022665d6 fix(mcp-server): add /api prefix to all product backend clients (critical — all routes 404 without it) 2026-03-05 13:10:08 -08:00
saravanakumardb1
fcb3befa23 feat(mcp-server): Phase 3 — product namespaces for ChronoMind, NomGap, PeakPulse (13 more tools) 2026-03-05 13:05:03 -08:00
saravanakumardb1
f780f0b409 feat(mcp-server): Phase 3 — product namespaces for MindLyst, LysnrAI, JarvisJr (22 new tools) 2026-03-05 13:01:05 -08:00
saravanakumardb1
852cb18a5c refactor(mcp-server): replace redundant CreatedSession local interface with imported DebugSession in diagnostics-orchestrator 2026-03-05 12:40:06 -08:00
saravanakumardb1
00b0555c97 fix(fastify-core,mcp-server): add logLevel to ServiceAppOptions and wire config.LOG_LEVEL so log verbosity is actually honoured at runtime 2026-03-05 12:38:09 -08:00
saravanakumardb1
44800ed36b fix(mcp-server): correct stale port comment 4006→4007 in server.ts; document CORS_ORIGIN and query limit vars in .env.example 2026-03-05 12:36:26 -08:00
saravanakumardb1
3e37b3d5a0 fix(mcp-server): handle ZodDefault in zodToJsonSchema so boolean/object fields with defaults emit correct JSON Schema types; clean up inline import in debug-pack 2026-03-05 12:35:27 -08:00
saravanakumardb1
c04c78aff4 fix(mcp-server): fix debug-pack cluster rendering to use correct field names, tighten TelemetryCluster type; fix test mock to include all required fields 2026-03-05 12:33:43 -08:00
saravanakumardb1
6cee9c20af fix(mcp-server): correct TelemetryCluster type, remove productId QS dead code from telemetryClusters, remove redundant extend() in pipeline-tool 2026-03-05 12:32:34 -08:00
saravanakumardb1
0f044830fa feat(mcp-server): Phase 2 A2A orchestration — DispatcherAgent, TelemetryAnalystAgent, DiagnosticsOrchestratorAgent, ReportWriterAgent, runIncidentPipeline runner + support.runIncidentPipeline MCP tool (10 tests) 2026-03-05 12:23:53 -08:00
saravanakumardb1
d1d643f782 feat(mcp-server): Milestone B — telemetry policy CRUD, cluster status, diagnostics cancel, extraction sidecar health; enforce expiresAt on createPolicy 2026-03-05 12:17:15 -08:00
saravanakumardb1
26d3403d5a fix(mcp-server): zodToJsonSchema emits correct JSON type for number/boolean/array fields (was always string) 2026-03-05 12:09:38 -08:00
saravanakumardb1
22ad88dd13 fix(mcp-server): Dockerfile — copy all 33 workspace package.json files for complete pnpm --frozen-lockfile resolution 2026-03-05 12:07:03 -08:00
saravanakumardb1
9a298d50ef fix(mcp-server): add missing jose + @fastify/cors deps; use ServiceError subclasses for 401/403; remove swagger option that crashed startup; add AbortSignal.timeout to platformFetch 2026-03-05 12:06:54 -08:00
saravanakumardb1
3bc8e0e14c fix(mcp-server): move default port 4006 → 4007 (conflict with extraction-service Python sidecar); add Dockerfile + docker-compose service + CI workflow 2026-03-05 11:56:35 -08:00
saravanakumardb1
027e2163a0 feat(mcp-server): scaffold @bytelyst/mcp-server on port 4006 with 10 tools across 4 namespaces
- platform.telemetry.{query,clusters,metrics}
- platform.diagnostics.sessions.{list,create,get,update,getLogs,getTraces}
- extraction.{run,models,cacheStats}
- support.createDebugPack (compound: clusters + optional diag session + markdown summary)
- Role-gated (viewer/admin/super_admin), JWT auth via platform-service secret
- Proxies to platform-service:4003 and extraction-service:4005
- 4 Vitest tests passing, tsc --noEmit clean
2026-03-05 11:47:08 -08:00
saravanakumardb1
a31fdfe55a feat(predictive-analytics): complete admin UI for churn prediction and health scoring
- Add health-dashboard page with 6-dimension health cards and anomaly detection
- Add predictive/at-risk page with user risk profiles and segmentation
- Add predictive/campaigns page with campaign management and stats
- Add predictive-client.ts API client with full type coverage
- Update all 3 roadmaps to reflect complete implementation status
2026-03-03 13:48:37 -08:00
saravanakumardb1
dfeed4c10f fix(diagnostics): add missing crypto import for randomUUID [BUG-5] 2026-03-03 12:27:03 -08:00
saravanakumardb1
8749aa211d fix(feedback-client): update tests to use fetch instead of post 2026-03-03 12:26:02 -08:00
saravanakumardb1
7552b8c8e8 fix(diagnostics): remove unused updateSessionStats import [BUG-4] 2026-03-03 12:25:55 -08:00
saravanakumardb1
eb83b83035 fix(diagnostics): resolve FilterMap type error in performance-profile-repository [BUG-3] 2026-03-03 12:24:54 -08:00
saravanakumardb1
7714ab51fb fix(events): add missing platform event schemas for campaign engine and notifications 2026-03-03 12:24:39 -08:00
saravanakumardb1
d80cf075a3 fix(diagnostics): add missing session_replays and performance_profiles cosmos containers [BUG-1] 2026-03-03 12:24:05 -08:00
saravanakumardb1
03cda3a74f fix(platform-service): resolve type errors in diagnostics and ab-testing modules 2026-03-03 12:22:35 -08:00
saravanakumardb1
914e344a92 fix(feedback-client): correct ApiClient method usage and types 2026-03-03 12:20:43 -08:00
saravanakumardb1
05ad9dbedc feat(diagnostics): Phase 4 - automated triggers, crash sessions, session replay, profiling [4.1][4.2][4.3][4.4] 2026-03-03 12:18:58 -08:00
saravanakumardb1
eab854375e feat(ai-diagnostics): add proactive alerts API and complete [4.3] 2026-03-03 12:17:11 -08:00
saravanakumardb1
460ed6d0c0 feat(ai-diagnostics): add admin UI insights page [4.1] 2026-03-03 12:15:09 -08:00
saravanakumardb1
1cba69948f feat(ai-diagnostics): add REST API routes [3.3] 2026-03-03 11:57:00 -08:00
saravanakumardb1
71cbb570ef feat(ai-diagnostics): add query parser and executor [3.1-3.2] 2026-03-03 11:53:59 -08:00
saravanakumardb1
44fa045ec5 feat(ab-testing): AI hypothesis generation and admin dashboard UI [3.1][3.2][3.3][4.1][4.2][4.3] 2026-03-03 11:53:48 -08:00
saravanakumardb1
97b3ffb21d feat(ai-diagnostics): add LLM analyzer with prompts and insight generation [2.1-2.2] 2026-03-03 11:52:12 -08:00
saravanakumardb1
1ff02934fa feat(ai-diagnostics): add telemetry linking and context enrichment [1.3] 2026-03-03 11:50:28 -08:00
saravanakumardb1
8951ab2c92 feat(ai-diagnostics): add HDBSCAN clustering algorithm [1.2.3] 2026-03-03 11:49:05 -08:00
saravanakumardb1
783067e17d feat(ab-testing): bucketing, statistics, guardrails, routes [1.2][2.1][2.2] 2026-03-03 11:48:50 -08:00
saravanakumardb1
917ea03af9 feat(ai-diagnostics): add vector search repository with cosmos integration [1.2.2] 2026-03-03 11:48:12 -08:00
saravanakumardb1
50b7e22985 feat(ai-diagnostics): add Azure OpenAI embedding pipeline [1.2.1] 2026-03-03 11:47:12 -08:00
saravanakumardb1
8cdddd7c23 feat(ai-diagnostics): implement error normalization and fingerprinting [1.1.3] 2026-03-03 11:45:52 -08:00
saravanakumardb1
a9b224749c feat(ab-testing): add experiment types and cosmos containers [1.1] 2026-03-03 11:44:33 -08:00
saravanakumardb1
4de01269b5 feat(ai-diagnostics): add error clustering types and cosmos containers [1.1.1-1.1.2] 2026-03-03 11:44:23 -08:00
saravanakumardb1
fcbae17866 feat(platform-service): implement P0-1 - Module generator script (pnpm gen:module)
- Add gen-module.ts with full CLI interface
- Generate types.ts, repository.ts, routes.ts, and test.ts
- Support field types: string, number, boolean, date, datetime, enum, string[], number[]
- Add --dry-run flag for preview
- Register script in package.json
2026-03-03 10:05:55 -08:00
saravanakumardb1
8e90358960 feat(platform): PII Redaction library (Appendix D.1)
- 8 PII patterns: email, SSN, credit card, phone, IP, password/token, JWT, API key
- redactPII() for string redaction
- redactObject() for recursive object redaction
- redactLogMessage() for log entries with context
- containsPII() and getPIITypes() detection helpers
- Custom pattern registration
- Preset configurations: minimal, standard, aggressive
2026-03-03 09:37:53 -08:00
saravanakumardb1
3efdd97057 feat(broadcasts): Rich media support in backend types
- BroadcastMedia interface for image/video/gif/audio
- Extended BroadcastMetrics with media engagement tracking
- Updated CreateBroadcastSchema with media array validation
2026-03-03 08:36:00 -08:00
saravanakumardb1
30583a1768 feat(diagnostics): implement Phase 1.5 — event bus, audit, rate limiting
1.5.2 Event Bus: Add warn to noopLog, update comments

1.5.3 Audit: Already implemented in all handlers

1.5.4 Rate Limiting: Add diagnostics keys (10/hr, 12/min, 100/min)

Delivery Templates: Add 4 diagnostics email templates (ready for wiring)

Tests: Update count to 12 templates (was 8)

All 839 tests passing
2026-03-03 08:19:41 -08:00
saravanakumardb1
4bf18f4d4f feat(platform-service): Phase 4.4 - Push notification wiring (FCM/APNS)
- push-notifications.ts: FCM and APNS delivery services
- Device token registration/management
- sendPushNotification() for bulk delivery
- Automatic token deactivation on APNS 410 responses
2026-03-03 08:05:21 -08:00
saravanakumardb1
8614e3f0f1 fix(feedback): address 6 bugs/gaps from systematic review
- Fix search icon positioning (add relative container)
- Fix toast variant from 'destructive' to 'error'
- Remove non-existent screenshotUrl fields from delete endpoint
- Fix misleading blob path comment (blob stays at initial location)
- Add download screenshot function and button
- Add pointer-events-none to search icon
2026-03-03 07:03:27 -08:00
saravanakumardb1
3ded5ad751 fix(diagnostics,test): fix flaky test and test configuration
- Add DB_PROVIDER=memory to vitest config for diagnostics tests
- Fix flaky timestamp comparison in 'should update a session' test
  - Add 10ms delay between create and update
  - Use toBeGreaterThanOrEqual instead of strict inequality
- All 17 diagnostics tests now pass
2026-03-03 00:01:20 -08:00
saravanakumardb1
fdaffdb13c docs(feedback): fix 8 bugs/gaps identified in systematic review
- Fix inconsistent screenshotUrl fields (removed, SAS generated on-demand)
- Fix blob path pattern to match feedbackScreenshots container
- Clarify flow: direct upload to final container (no temp/move)
- Add rate limiting specs to endpoint table
- Clarify access control: users submit but cannot view (security)
- Remove sas.ts from appendix (not created)
- Align size limits to 5MB consistently
- Add missing screenshotContentType and screenshotSizeBytes
2026-03-03 00:00:14 -08:00
saravanakumardb1
6f9b799cc4 fix(jobs): add missing 'warn' method to logger type in runner.ts
The JobContext type requires log.warn but runner.ts loggers only
defined info/error. This caused TypeScript errors when passing log
to job handlers.

- Add warn: (...a: unknown[]) => void to startRunner log param
- Add warn: (...a: unknown[]) => void to tick log param
- Add warn: (...a: unknown[]) => void to executeJob log param
2026-03-02 23:57:21 -08:00
saravanakumardb1
e712968d3d test(feedback): Phase 1.5 - add screenshot and deviceContext schema tests 2026-03-02 23:56:59 -08:00
saravanakumardb1
ecb9f67c99 fix(broadcasts): Fix percentage rollout bucketing logic
- Use userId only as seed instead of userId + percentage
- Prevents users from being re-bucketed when rollout % increases
- Ensures deterministic assignment for phased rollouts
2026-03-02 23:56:42 -08:00
saravanakumardb1
e4681fbbb2 fix(broadcasts): Fix metrics increment bug in updateBroadcastMetrics
- Change from merge pattern to explicit increment pattern
- Each metric field is properly incremented instead of overwritten
- Prevents race condition data loss
2026-03-02 23:56:09 -08:00
saravanakumardb1
cfbaa92539 feat(feedback): Phase 1.3 - add SAS endpoint and screenshot view/delete routes 2026-03-02 23:55:47 -08:00