@clipin/convex-wearables 0.0.1

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 (143) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +616 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +4 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +244 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +555 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +689 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +112 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/component/_generated/_ignore.d.ts +1 -0
  16. package/dist/component/_generated/_ignore.d.ts.map +1 -0
  17. package/dist/component/_generated/_ignore.js +4 -0
  18. package/dist/component/_generated/_ignore.js.map +1 -0
  19. package/dist/component/_generated/api.d.ts +13 -0
  20. package/dist/component/_generated/api.d.ts.map +1 -0
  21. package/dist/component/_generated/api.js +14 -0
  22. package/dist/component/_generated/api.js.map +1 -0
  23. package/dist/component/_generated/dataModel.d.ts +28 -0
  24. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  25. package/dist/component/_generated/dataModel.js +11 -0
  26. package/dist/component/_generated/dataModel.js.map +1 -0
  27. package/dist/component/_generated/server.d.ts +23 -0
  28. package/dist/component/_generated/server.d.ts.map +1 -0
  29. package/dist/component/_generated/server.js +18 -0
  30. package/dist/component/_generated/server.js.map +1 -0
  31. package/dist/component/backfillJobs.d.ts +121 -0
  32. package/dist/component/backfillJobs.d.ts.map +1 -0
  33. package/dist/component/backfillJobs.js +233 -0
  34. package/dist/component/backfillJobs.js.map +1 -0
  35. package/dist/component/connections.d.ts +159 -0
  36. package/dist/component/connections.d.ts.map +1 -0
  37. package/dist/component/connections.js +288 -0
  38. package/dist/component/connections.js.map +1 -0
  39. package/dist/component/convex.config.d.ts +3 -0
  40. package/dist/component/convex.config.d.ts.map +1 -0
  41. package/dist/component/convex.config.js +6 -0
  42. package/dist/component/convex.config.js.map +1 -0
  43. package/dist/component/dataPoints.d.ts +81 -0
  44. package/dist/component/dataPoints.d.ts.map +1 -0
  45. package/dist/component/dataPoints.js +258 -0
  46. package/dist/component/dataPoints.js.map +1 -0
  47. package/dist/component/dataSources.d.ts +56 -0
  48. package/dist/component/dataSources.d.ts.map +1 -0
  49. package/dist/component/dataSources.js +95 -0
  50. package/dist/component/dataSources.js.map +1 -0
  51. package/dist/component/events.d.ts +203 -0
  52. package/dist/component/events.d.ts.map +1 -0
  53. package/dist/component/events.js +251 -0
  54. package/dist/component/events.js.map +1 -0
  55. package/dist/component/garminBackfill.d.ts +40 -0
  56. package/dist/component/garminBackfill.d.ts.map +1 -0
  57. package/dist/component/garminBackfill.js +296 -0
  58. package/dist/component/garminBackfill.js.map +1 -0
  59. package/dist/component/garminWebhooks.d.ts +17 -0
  60. package/dist/component/garminWebhooks.d.ts.map +1 -0
  61. package/dist/component/garminWebhooks.js +505 -0
  62. package/dist/component/garminWebhooks.js.map +1 -0
  63. package/dist/component/httpHandlers.d.ts +32 -0
  64. package/dist/component/httpHandlers.d.ts.map +1 -0
  65. package/dist/component/httpHandlers.js +131 -0
  66. package/dist/component/httpHandlers.js.map +1 -0
  67. package/dist/component/lifecycle.d.ts +12 -0
  68. package/dist/component/lifecycle.d.ts.map +1 -0
  69. package/dist/component/lifecycle.js +79 -0
  70. package/dist/component/lifecycle.js.map +1 -0
  71. package/dist/component/menstrualCycles.d.ts +98 -0
  72. package/dist/component/menstrualCycles.d.ts.map +1 -0
  73. package/dist/component/menstrualCycles.js +112 -0
  74. package/dist/component/menstrualCycles.js.map +1 -0
  75. package/dist/component/oauthActions.d.ts +52 -0
  76. package/dist/component/oauthActions.d.ts.map +1 -0
  77. package/dist/component/oauthActions.js +208 -0
  78. package/dist/component/oauthActions.js.map +1 -0
  79. package/dist/component/oauthStates.d.ts +47 -0
  80. package/dist/component/oauthStates.d.ts.map +1 -0
  81. package/dist/component/oauthStates.js +77 -0
  82. package/dist/component/oauthStates.js.map +1 -0
  83. package/dist/component/providerSettings.d.ts +15 -0
  84. package/dist/component/providerSettings.d.ts.map +1 -0
  85. package/dist/component/providerSettings.js +57 -0
  86. package/dist/component/providerSettings.js.map +1 -0
  87. package/dist/component/providers/garmin.d.ts +306 -0
  88. package/dist/component/providers/garmin.d.ts.map +1 -0
  89. package/dist/component/providers/garmin.js +675 -0
  90. package/dist/component/providers/garmin.js.map +1 -0
  91. package/dist/component/providers/oauth.d.ts +42 -0
  92. package/dist/component/providers/oauth.d.ts.map +1 -0
  93. package/dist/component/providers/oauth.js +181 -0
  94. package/dist/component/providers/oauth.js.map +1 -0
  95. package/dist/component/providers/polar.d.ts +6 -0
  96. package/dist/component/providers/polar.d.ts.map +1 -0
  97. package/dist/component/providers/polar.js +175 -0
  98. package/dist/component/providers/polar.js.map +1 -0
  99. package/dist/component/providers/registry.d.ts +14 -0
  100. package/dist/component/providers/registry.d.ts.map +1 -0
  101. package/dist/component/providers/registry.js +32 -0
  102. package/dist/component/providers/registry.js.map +1 -0
  103. package/dist/component/providers/strava.d.ts +45 -0
  104. package/dist/component/providers/strava.d.ts.map +1 -0
  105. package/dist/component/providers/strava.js +182 -0
  106. package/dist/component/providers/strava.js.map +1 -0
  107. package/dist/component/providers/suunto.d.ts +5 -0
  108. package/dist/component/providers/suunto.d.ts.map +1 -0
  109. package/dist/component/providers/suunto.js +502 -0
  110. package/dist/component/providers/suunto.js.map +1 -0
  111. package/dist/component/providers/types.d.ts +139 -0
  112. package/dist/component/providers/types.d.ts.map +1 -0
  113. package/dist/component/providers/types.js +5 -0
  114. package/dist/component/providers/types.js.map +1 -0
  115. package/dist/component/providers/whoop.d.ts +4 -0
  116. package/dist/component/providers/whoop.d.ts.map +1 -0
  117. package/dist/component/providers/whoop.js +439 -0
  118. package/dist/component/providers/whoop.js.map +1 -0
  119. package/dist/component/schema.d.ts +429 -0
  120. package/dist/component/schema.d.ts.map +1 -0
  121. package/dist/component/schema.js +282 -0
  122. package/dist/component/schema.js.map +1 -0
  123. package/dist/component/sdkPush.d.ts +143 -0
  124. package/dist/component/sdkPush.d.ts.map +1 -0
  125. package/dist/component/sdkPush.js +338 -0
  126. package/dist/component/sdkPush.js.map +1 -0
  127. package/dist/component/summaries.d.ts +129 -0
  128. package/dist/component/summaries.d.ts.map +1 -0
  129. package/dist/component/summaries.js +129 -0
  130. package/dist/component/summaries.js.map +1 -0
  131. package/dist/component/syncJobs.d.ts +142 -0
  132. package/dist/component/syncJobs.d.ts.map +1 -0
  133. package/dist/component/syncJobs.js +136 -0
  134. package/dist/component/syncJobs.js.map +1 -0
  135. package/dist/component/syncWorkflow.d.ts +99 -0
  136. package/dist/component/syncWorkflow.d.ts.map +1 -0
  137. package/dist/component/syncWorkflow.js +579 -0
  138. package/dist/component/syncWorkflow.js.map +1 -0
  139. package/dist/component/workflowManager.d.ts +3 -0
  140. package/dist/component/workflowManager.d.ts.map +1 -0
  141. package/dist/component/workflowManager.js +17 -0
  142. package/dist/component/workflowManager.js.map +1 -0
  143. package/package.json +84 -0
@@ -0,0 +1,142 @@
1
+ export declare const getByUser: import("convex/server").RegisteredQuery<"public", {
2
+ limit?: number | undefined;
3
+ userId: string;
4
+ }, Promise<{
5
+ _id: import("convex/values").GenericId<"syncJobs">;
6
+ _creationTime: number;
7
+ error?: string | undefined;
8
+ mode?: "manual" | "cron" | "webhook" | undefined;
9
+ triggerSource?: string | undefined;
10
+ completedAt?: number | undefined;
11
+ recordsProcessed?: number | undefined;
12
+ workflowId?: string | undefined;
13
+ windowStart?: number | undefined;
14
+ windowEnd?: number | undefined;
15
+ attempt?: number | undefined;
16
+ lastHeartbeatAt?: number | undefined;
17
+ cursor?: string | undefined;
18
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
19
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
20
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
21
+ userId: string;
22
+ connectionId: import("convex/values").GenericId<"connections">;
23
+ idempotencyKey: string;
24
+ startedAt: number;
25
+ }[]>>;
26
+ export declare const getRunning: import("convex/server").RegisteredQuery<"internal", {}, Promise<{
27
+ _id: import("convex/values").GenericId<"syncJobs">;
28
+ _creationTime: number;
29
+ error?: string | undefined;
30
+ mode?: "manual" | "cron" | "webhook" | undefined;
31
+ triggerSource?: string | undefined;
32
+ completedAt?: number | undefined;
33
+ recordsProcessed?: number | undefined;
34
+ workflowId?: string | undefined;
35
+ windowStart?: number | undefined;
36
+ windowEnd?: number | undefined;
37
+ attempt?: number | undefined;
38
+ lastHeartbeatAt?: number | undefined;
39
+ cursor?: string | undefined;
40
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
41
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
42
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
43
+ userId: string;
44
+ connectionId: import("convex/values").GenericId<"connections">;
45
+ idempotencyKey: string;
46
+ startedAt: number;
47
+ }[]>>;
48
+ export declare const getById: import("convex/server").RegisteredQuery<"internal", {
49
+ jobId: import("convex/values").GenericId<"syncJobs">;
50
+ }, Promise<{
51
+ _id: import("convex/values").GenericId<"syncJobs">;
52
+ _creationTime: number;
53
+ error?: string | undefined;
54
+ mode?: "manual" | "cron" | "webhook" | undefined;
55
+ triggerSource?: string | undefined;
56
+ completedAt?: number | undefined;
57
+ recordsProcessed?: number | undefined;
58
+ workflowId?: string | undefined;
59
+ windowStart?: number | undefined;
60
+ windowEnd?: number | undefined;
61
+ attempt?: number | undefined;
62
+ lastHeartbeatAt?: number | undefined;
63
+ cursor?: string | undefined;
64
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
65
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
66
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
67
+ userId: string;
68
+ connectionId: import("convex/values").GenericId<"connections">;
69
+ idempotencyKey: string;
70
+ startedAt: number;
71
+ } | null>>;
72
+ export declare const getActiveByIdempotencyKey: import("convex/server").RegisteredQuery<"internal", {
73
+ idempotencyKey: string;
74
+ }, Promise<{
75
+ _id: import("convex/values").GenericId<"syncJobs">;
76
+ _creationTime: number;
77
+ error?: string | undefined;
78
+ mode?: "manual" | "cron" | "webhook" | undefined;
79
+ triggerSource?: string | undefined;
80
+ completedAt?: number | undefined;
81
+ recordsProcessed?: number | undefined;
82
+ workflowId?: string | undefined;
83
+ windowStart?: number | undefined;
84
+ windowEnd?: number | undefined;
85
+ attempt?: number | undefined;
86
+ lastHeartbeatAt?: number | undefined;
87
+ cursor?: string | undefined;
88
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
89
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
90
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
91
+ userId: string;
92
+ connectionId: import("convex/values").GenericId<"connections">;
93
+ idempotencyKey: string;
94
+ startedAt: number;
95
+ } | null>>;
96
+ export declare const getByWorkflowId: import("convex/server").RegisteredQuery<"internal", {
97
+ workflowId: string;
98
+ }, Promise<{
99
+ _id: import("convex/values").GenericId<"syncJobs">;
100
+ _creationTime: number;
101
+ error?: string | undefined;
102
+ mode?: "manual" | "cron" | "webhook" | undefined;
103
+ triggerSource?: string | undefined;
104
+ completedAt?: number | undefined;
105
+ recordsProcessed?: number | undefined;
106
+ workflowId?: string | undefined;
107
+ windowStart?: number | undefined;
108
+ windowEnd?: number | undefined;
109
+ attempt?: number | undefined;
110
+ lastHeartbeatAt?: number | undefined;
111
+ cursor?: string | undefined;
112
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
113
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
114
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
115
+ userId: string;
116
+ connectionId: import("convex/values").GenericId<"connections">;
117
+ idempotencyKey: string;
118
+ startedAt: number;
119
+ } | null>>;
120
+ export declare const create: import("convex/server").RegisteredMutation<"internal", {
121
+ mode?: "manual" | "cron" | "webhook" | undefined;
122
+ triggerSource?: string | undefined;
123
+ startedAt?: number | undefined;
124
+ windowStart?: number | undefined;
125
+ windowEnd?: number | undefined;
126
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
127
+ userId: string;
128
+ connectionId: import("convex/values").GenericId<"connections">;
129
+ idempotencyKey: string;
130
+ }, Promise<import("convex/values").GenericId<"syncJobs">>>;
131
+ export declare const updateStatus: import("convex/server").RegisteredMutation<"internal", {
132
+ error?: string | undefined;
133
+ recordsProcessed?: number | undefined;
134
+ workflowId?: string | undefined;
135
+ attempt?: number | undefined;
136
+ lastHeartbeatAt?: number | undefined;
137
+ cursor?: string | undefined;
138
+ currentPhase?: "events" | "dataPoints" | "summaries" | undefined;
139
+ status: "queued" | "running" | "completed" | "failed" | "canceled";
140
+ jobId: import("convex/values").GenericId<"syncJobs">;
141
+ }, Promise<void>>;
142
+ //# sourceMappingURL=syncJobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncJobs.d.ts","sourceRoot":"","sources":["../../src/component/syncJobs.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;KAapB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;KASrB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;UAQlB,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;UAkBpC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;UAW1B,CAAC;AAMH,eAAO,MAAM,MAAM;;;;;;;;;;0DA4BjB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;iBA0BvB,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { v } from "convex/values";
2
+ import { internalMutation, internalQuery, query } from "./_generated/server";
3
+ import { providerName, syncJobStatus } from "./schema";
4
+ const syncPhase = v.union(v.literal("events"), v.literal("dataPoints"), v.literal("summaries"));
5
+ // ---------------------------------------------------------------------------
6
+ // Queries
7
+ // ---------------------------------------------------------------------------
8
+ export const getByUser = query({
9
+ args: {
10
+ userId: v.string(),
11
+ limit: v.optional(v.number()),
12
+ },
13
+ returns: v.array(v.any()),
14
+ handler: async (ctx, args) => {
15
+ return await ctx.db
16
+ .query("syncJobs")
17
+ .withIndex("by_user", (idx) => idx.eq("userId", args.userId))
18
+ .order("desc")
19
+ .take(args.limit ?? 10);
20
+ },
21
+ });
22
+ export const getRunning = internalQuery({
23
+ args: {},
24
+ returns: v.array(v.any()),
25
+ handler: async (ctx) => {
26
+ return await ctx.db
27
+ .query("syncJobs")
28
+ .withIndex("by_status", (idx) => idx.eq("status", "running"))
29
+ .collect();
30
+ },
31
+ });
32
+ export const getById = internalQuery({
33
+ args: {
34
+ jobId: v.id("syncJobs"),
35
+ },
36
+ returns: v.union(v.any(), v.null()),
37
+ handler: async (ctx, args) => {
38
+ return await ctx.db.get(args.jobId);
39
+ },
40
+ });
41
+ export const getActiveByIdempotencyKey = internalQuery({
42
+ args: {
43
+ idempotencyKey: v.string(),
44
+ },
45
+ returns: v.union(v.any(), v.null()),
46
+ handler: async (ctx, args) => {
47
+ const job = await ctx.db
48
+ .query("syncJobs")
49
+ .withIndex("by_idempotency_key", (idx) => idx.eq("idempotencyKey", args.idempotencyKey))
50
+ .order("desc")
51
+ .first();
52
+ if (!job) {
53
+ return null;
54
+ }
55
+ return job.status === "queued" || job.status === "running" ? job : null;
56
+ },
57
+ });
58
+ export const getByWorkflowId = internalQuery({
59
+ args: {
60
+ workflowId: v.string(),
61
+ },
62
+ returns: v.union(v.any(), v.null()),
63
+ handler: async (ctx, args) => {
64
+ return await ctx.db
65
+ .query("syncJobs")
66
+ .withIndex("by_workflow", (idx) => idx.eq("workflowId", args.workflowId))
67
+ .first();
68
+ },
69
+ });
70
+ // ---------------------------------------------------------------------------
71
+ // Mutations
72
+ // ---------------------------------------------------------------------------
73
+ export const create = internalMutation({
74
+ args: {
75
+ connectionId: v.id("connections"),
76
+ userId: v.string(),
77
+ provider: providerName,
78
+ mode: v.optional(v.union(v.literal("manual"), v.literal("cron"), v.literal("webhook"))),
79
+ triggerSource: v.optional(v.string()),
80
+ idempotencyKey: v.string(),
81
+ startedAt: v.optional(v.number()),
82
+ windowStart: v.optional(v.number()),
83
+ windowEnd: v.optional(v.number()),
84
+ },
85
+ returns: v.id("syncJobs"),
86
+ handler: async (ctx, args) => {
87
+ return await ctx.db.insert("syncJobs", {
88
+ connectionId: args.connectionId,
89
+ userId: args.userId,
90
+ provider: args.provider,
91
+ mode: args.mode,
92
+ triggerSource: args.triggerSource,
93
+ idempotencyKey: args.idempotencyKey,
94
+ status: "queued",
95
+ startedAt: args.startedAt ?? Date.now(),
96
+ windowStart: args.windowStart,
97
+ windowEnd: args.windowEnd,
98
+ attempt: 0,
99
+ });
100
+ },
101
+ });
102
+ export const updateStatus = internalMutation({
103
+ args: {
104
+ jobId: v.id("syncJobs"),
105
+ status: syncJobStatus,
106
+ error: v.optional(v.string()),
107
+ recordsProcessed: v.optional(v.number()),
108
+ workflowId: v.optional(v.string()),
109
+ attempt: v.optional(v.number()),
110
+ lastHeartbeatAt: v.optional(v.number()),
111
+ cursor: v.optional(v.string()),
112
+ currentPhase: v.optional(syncPhase),
113
+ },
114
+ handler: async (ctx, args) => {
115
+ const updates = { status: args.status };
116
+ if (args.error !== undefined)
117
+ updates.error = args.error;
118
+ if (args.recordsProcessed !== undefined)
119
+ updates.recordsProcessed = args.recordsProcessed;
120
+ if (args.workflowId !== undefined)
121
+ updates.workflowId = args.workflowId;
122
+ if (args.attempt !== undefined)
123
+ updates.attempt = args.attempt;
124
+ if (args.lastHeartbeatAt !== undefined)
125
+ updates.lastHeartbeatAt = args.lastHeartbeatAt;
126
+ if (args.cursor !== undefined)
127
+ updates.cursor = args.cursor;
128
+ if (args.currentPhase !== undefined)
129
+ updates.currentPhase = args.currentPhase;
130
+ if (args.status === "completed" || args.status === "failed" || args.status === "canceled") {
131
+ updates.completedAt = Date.now();
132
+ }
133
+ await ctx.db.patch(args.jobId, updates);
134
+ },
135
+ });
136
+ //# sourceMappingURL=syncJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncJobs.js","sourceRoot":"","sources":["../../src/component/syncJobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Durable sync orchestration for provider pull syncs.
3
+ *
4
+ * The old implementation executed a whole sync inline in one action. This
5
+ * module now enqueues a durable workflow per connection and keeps syncJobs as
6
+ * the user-visible progress surface.
7
+ */
8
+ import type { NormalizedDailySummary, NormalizedDataPoint, NormalizedEvent } from "./providers/types";
9
+ export declare const requestConnectionSync: import("convex/server").RegisteredMutation<"internal", {
10
+ mode?: "manual" | "cron" | "webhook" | undefined;
11
+ triggerSource?: string | undefined;
12
+ connectionId: import("convex/values").GenericId<"connections">;
13
+ windowStart: number;
14
+ windowEnd: number;
15
+ }, Promise<{
16
+ syncJobId: import("convex/values").GenericId<"syncJobs">;
17
+ workflowId: string;
18
+ deduped: boolean;
19
+ }>>;
20
+ export declare const fetchSyncPhaseBatch: import("convex/server").RegisteredAction<"internal", {
21
+ cursor?: string | undefined;
22
+ syncJobId: import("convex/values").GenericId<"syncJobs">;
23
+ phase: "events" | "dataPoints" | "summaries";
24
+ }, Promise<{
25
+ events: NormalizedEvent[];
26
+ dataPoints: never[];
27
+ summaries: never[];
28
+ nextCursor: string | null;
29
+ } | {
30
+ events: never[];
31
+ dataPoints: NormalizedDataPoint[];
32
+ summaries: never[];
33
+ nextCursor: string | null;
34
+ } | {
35
+ events: never[];
36
+ dataPoints: never[];
37
+ summaries: NormalizedDailySummary[];
38
+ nextCursor: string | null;
39
+ }>>;
40
+ export declare const runConnectionSync: import("convex/server").RegisteredMutation<"internal", {
41
+ fn: "You should not call this directly, call workflow.start instead";
42
+ args: {
43
+ syncJobId: import("convex/values").GenericId<"syncJobs">;
44
+ };
45
+ }, {
46
+ recordsProcessed: number;
47
+ }>;
48
+ export declare const handleConnectionSyncComplete: import("convex/server").RegisteredMutation<"internal", {
49
+ workflowId: string;
50
+ result: any;
51
+ context: {
52
+ syncJobId: import("convex/values").GenericId<"syncJobs">;
53
+ };
54
+ }, Promise<void>>;
55
+ export declare const syncConnection: import("convex/server").RegisteredAction<"public", {
56
+ clientId?: string | undefined;
57
+ clientSecret?: string | undefined;
58
+ subscriptionKey?: string | undefined;
59
+ startDate?: number | undefined;
60
+ endDate?: number | undefined;
61
+ syncWindowHours?: number | undefined;
62
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
63
+ connectionId: import("convex/values").GenericId<"connections">;
64
+ }, Promise<{
65
+ syncJobId: string;
66
+ workflowId: any;
67
+ deduped: any;
68
+ }>>;
69
+ export declare const syncAllActive: import("convex/server").RegisteredAction<"public", {
70
+ syncWindowHours?: number | undefined;
71
+ clientCredentials: {
72
+ garmin?: {
73
+ clientId: string;
74
+ clientSecret: string;
75
+ } | undefined;
76
+ suunto?: {
77
+ subscriptionKey?: string | undefined;
78
+ clientId: string;
79
+ clientSecret: string;
80
+ } | undefined;
81
+ polar?: {
82
+ clientId: string;
83
+ clientSecret: string;
84
+ } | undefined;
85
+ whoop?: {
86
+ clientId: string;
87
+ clientSecret: string;
88
+ } | undefined;
89
+ strava?: {
90
+ clientId: string;
91
+ clientSecret: string;
92
+ } | undefined;
93
+ };
94
+ }, Promise<{
95
+ enqueued: number;
96
+ deduped: number;
97
+ skipped: number;
98
+ }>>;
99
+ //# sourceMappingURL=syncWorkflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncWorkflow.d.ts","sourceRoot":"","sources":["../../src/component/syncWorkflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAgK3B,eAAO,MAAM,qBAAqB;;;;;;;;;;GA6EhC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;GAgH9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;EAiK5B,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;iBA0CvC,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;GA8DzB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGxB,CAAC"}