@plotday/twister 0.22.0 → 0.27.0

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 (186) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +35 -6
  3. package/bin/commands/deploy.js +246 -6
  4. package/bin/commands/deploy.js.map +1 -1
  5. package/bin/commands/generate.js +11 -2
  6. package/bin/commands/generate.js.map +1 -1
  7. package/bin/commands/login.js +19 -3
  8. package/bin/commands/login.js.map +1 -1
  9. package/bin/commands/priority-create.js +7 -2
  10. package/bin/commands/priority-create.js.map +1 -1
  11. package/bin/commands/priority-list.js +6 -1
  12. package/bin/commands/priority-list.js.map +1 -1
  13. package/bin/commands/twist-logs.js +12 -3
  14. package/bin/commands/twist-logs.js.map +1 -1
  15. package/bin/templates/AGENTS.template.md +133 -20
  16. package/bin/utils/bundle.js +40 -0
  17. package/bin/utils/bundle.js.map +1 -1
  18. package/bin/utils/network-error.js +149 -0
  19. package/bin/utils/network-error.js.map +1 -0
  20. package/bin/utils/sse.js +19 -1
  21. package/bin/utils/sse.js.map +1 -1
  22. package/cli/templates/AGENTS.template.md +133 -20
  23. package/dist/common/calendar.d.ts +28 -5
  24. package/dist/common/calendar.d.ts.map +1 -1
  25. package/dist/common/messaging.d.ts +12 -6
  26. package/dist/common/messaging.d.ts.map +1 -1
  27. package/dist/common/projects.d.ts +121 -0
  28. package/dist/common/projects.d.ts.map +1 -0
  29. package/dist/common/projects.js +2 -0
  30. package/dist/common/projects.js.map +1 -0
  31. package/dist/docs/assets/hierarchy.js +1 -1
  32. package/dist/docs/assets/highlight.css +4 -4
  33. package/dist/docs/assets/navigation.js +1 -1
  34. package/dist/docs/assets/search.js +1 -1
  35. package/dist/docs/classes/tool.Tool.html +5 -5
  36. package/dist/docs/classes/tools_ai.AI.html +3 -3
  37. package/dist/docs/classes/tools_callbacks.Callbacks.html +4 -4
  38. package/dist/docs/classes/tools_integrations.Integrations.html +1 -1
  39. package/dist/docs/classes/tools_network.Network.html +4 -4
  40. package/dist/docs/classes/tools_plot.Plot.html +28 -14
  41. package/dist/docs/classes/tools_store.Store.html +1 -1
  42. package/dist/docs/classes/tools_tasks.Tasks.html +2 -2
  43. package/dist/docs/classes/tools_twists.Twists.html +4 -4
  44. package/dist/docs/classes/twist.Twist.html +1 -1
  45. package/dist/docs/documents/Building_Custom_Tools.html +6 -6
  46. package/dist/docs/documents/Built-in_Tools.html +24 -17
  47. package/dist/docs/documents/Core_Concepts.html +42 -9
  48. package/dist/docs/documents/Getting_Started.html +10 -3
  49. package/dist/docs/documents/Runtime_Environment.html +7 -7
  50. package/dist/docs/enums/plot.ActivityLinkType.html +5 -5
  51. package/dist/docs/enums/plot.ActivityType.html +4 -4
  52. package/dist/docs/enums/plot.ActorType.html +4 -4
  53. package/dist/docs/enums/plot.ConferencingProvider.html +6 -6
  54. package/dist/docs/enums/tag.Tag.html +3 -4
  55. package/dist/docs/enums/tools_plot.ActivityAccess.html +3 -3
  56. package/dist/docs/enums/tools_plot.ContactAccess.html +3 -3
  57. package/dist/docs/enums/tools_plot.PriorityAccess.html +3 -3
  58. package/dist/docs/functions/index.Uuid.Generate.html +1 -0
  59. package/dist/docs/hierarchy.html +1 -1
  60. package/dist/docs/interfaces/common_calendar.CalendarTool.html +17 -9
  61. package/dist/docs/interfaces/tools_ai.AIResponse.html +2 -2
  62. package/dist/docs/interfaces/tools_twists.TwistSource.html +1 -1
  63. package/dist/docs/modules/index.Uuid.html +1 -0
  64. package/dist/docs/modules/index.html +1 -1
  65. package/dist/docs/modules/plot.html +1 -1
  66. package/dist/docs/types/index.Uuid.html +1 -0
  67. package/dist/docs/types/plot.Activity.html +21 -7
  68. package/dist/docs/types/plot.ActivityCommon.html +17 -15
  69. package/dist/docs/types/plot.ActivityLink.html +1 -1
  70. package/dist/docs/types/plot.ActivityMeta.html +7 -9
  71. package/dist/docs/types/plot.ActivityUpdate.html +3 -4
  72. package/dist/docs/types/plot.ActivityWithNotes.html +1 -1
  73. package/dist/docs/types/plot.Actor.html +5 -5
  74. package/dist/docs/types/plot.ActorId.html +8 -3
  75. package/dist/docs/types/plot.ContentType.html +1 -0
  76. package/dist/docs/types/plot.NewActivity.html +24 -5
  77. package/dist/docs/types/plot.NewActivityWithNotes.html +1 -1
  78. package/dist/docs/types/plot.NewActor.html +3 -0
  79. package/dist/docs/types/plot.NewContact.html +4 -4
  80. package/dist/docs/types/plot.NewNote.html +15 -4
  81. package/dist/docs/types/plot.NewPriority.html +1 -1
  82. package/dist/docs/types/plot.NewTags.html +2 -0
  83. package/dist/docs/types/plot.Note.html +3 -3
  84. package/dist/docs/types/plot.NoteUpdate.html +6 -6
  85. package/dist/docs/types/plot.PickPriorityConfig.html +3 -3
  86. package/dist/docs/types/plot.Priority.html +3 -3
  87. package/dist/docs/types/plot.SyncUpdate.html +15 -0
  88. package/dist/docs/types/plot.Tags.html +2 -0
  89. package/dist/docs/types/tools_ai.DataContent.html +1 -1
  90. package/dist/docs/types/tools_network.WebhookRequest.html +5 -3
  91. package/dist/docs/types/tools_plot.NoteIntentHandler.html +4 -4
  92. package/dist/llm-docs/common/calendar.d.ts +2 -2
  93. package/dist/llm-docs/common/calendar.d.ts.map +1 -1
  94. package/dist/llm-docs/common/calendar.js +2 -2
  95. package/dist/llm-docs/common/calendar.js.map +1 -1
  96. package/dist/llm-docs/common/messaging.d.ts +2 -2
  97. package/dist/llm-docs/common/messaging.d.ts.map +1 -1
  98. package/dist/llm-docs/common/messaging.js +2 -2
  99. package/dist/llm-docs/common/messaging.js.map +1 -1
  100. package/dist/llm-docs/common/projects.d.ts +9 -0
  101. package/dist/llm-docs/common/projects.d.ts.map +1 -0
  102. package/dist/llm-docs/common/projects.js +8 -0
  103. package/dist/llm-docs/common/projects.js.map +1 -0
  104. package/dist/llm-docs/index.d.ts +1 -1
  105. package/dist/llm-docs/index.js +17 -17
  106. package/dist/llm-docs/index.js.map +1 -1
  107. package/dist/llm-docs/plot.d.ts +2 -2
  108. package/dist/llm-docs/plot.d.ts.map +1 -1
  109. package/dist/llm-docs/plot.js +2 -2
  110. package/dist/llm-docs/plot.js.map +1 -1
  111. package/dist/llm-docs/tag.d.ts +2 -2
  112. package/dist/llm-docs/tag.d.ts.map +1 -1
  113. package/dist/llm-docs/tag.js +2 -2
  114. package/dist/llm-docs/tag.js.map +1 -1
  115. package/dist/llm-docs/tool.d.ts +2 -2
  116. package/dist/llm-docs/tool.d.ts.map +1 -1
  117. package/dist/llm-docs/tool.js +2 -2
  118. package/dist/llm-docs/tool.js.map +1 -1
  119. package/dist/llm-docs/tools/ai.d.ts +2 -2
  120. package/dist/llm-docs/tools/ai.d.ts.map +1 -1
  121. package/dist/llm-docs/tools/ai.js +2 -2
  122. package/dist/llm-docs/tools/ai.js.map +1 -1
  123. package/dist/llm-docs/tools/callbacks.d.ts +2 -2
  124. package/dist/llm-docs/tools/callbacks.d.ts.map +1 -1
  125. package/dist/llm-docs/tools/callbacks.js +2 -2
  126. package/dist/llm-docs/tools/callbacks.js.map +1 -1
  127. package/dist/llm-docs/tools/integrations.d.ts +1 -1
  128. package/dist/llm-docs/tools/integrations.js +1 -1
  129. package/dist/llm-docs/tools/network.d.ts +2 -2
  130. package/dist/llm-docs/tools/network.d.ts.map +1 -1
  131. package/dist/llm-docs/tools/network.js +2 -2
  132. package/dist/llm-docs/tools/network.js.map +1 -1
  133. package/dist/llm-docs/tools/plot.d.ts +2 -2
  134. package/dist/llm-docs/tools/plot.d.ts.map +1 -1
  135. package/dist/llm-docs/tools/plot.js +2 -2
  136. package/dist/llm-docs/tools/plot.js.map +1 -1
  137. package/dist/llm-docs/tools/store.d.ts +1 -1
  138. package/dist/llm-docs/tools/store.js +1 -1
  139. package/dist/llm-docs/tools/tasks.d.ts +1 -1
  140. package/dist/llm-docs/tools/tasks.js +1 -1
  141. package/dist/llm-docs/tools/twists.d.ts +2 -2
  142. package/dist/llm-docs/tools/twists.d.ts.map +1 -1
  143. package/dist/llm-docs/tools/twists.js +2 -2
  144. package/dist/llm-docs/tools/twists.js.map +1 -1
  145. package/dist/llm-docs/twist-guide-template.d.ts +1 -1
  146. package/dist/llm-docs/twist-guide-template.d.ts.map +1 -1
  147. package/dist/llm-docs/twist-guide-template.js +1 -1
  148. package/dist/llm-docs/twist-guide-template.js.map +1 -1
  149. package/dist/llm-docs/twist.d.ts +1 -1
  150. package/dist/llm-docs/twist.js +1 -1
  151. package/dist/plot.d.ts +271 -87
  152. package/dist/plot.d.ts.map +1 -1
  153. package/dist/plot.js +1 -0
  154. package/dist/plot.js.map +1 -1
  155. package/dist/tag.d.ts +2 -3
  156. package/dist/tag.d.ts.map +1 -1
  157. package/dist/tag.js +2 -3
  158. package/dist/tag.js.map +1 -1
  159. package/dist/tool.d.ts +2 -2
  160. package/dist/tool.d.ts.map +1 -1
  161. package/dist/tool.js +1 -1
  162. package/dist/tool.js.map +1 -1
  163. package/dist/tools/ai.d.ts +2 -2
  164. package/dist/tools/ai.d.ts.map +1 -1
  165. package/dist/tools/callbacks.d.ts +1 -1
  166. package/dist/tools/callbacks.d.ts.map +1 -1
  167. package/dist/tools/network.d.ts +2 -0
  168. package/dist/tools/network.d.ts.map +1 -1
  169. package/dist/tools/network.js.map +1 -1
  170. package/dist/tools/plot.d.ts +36 -4
  171. package/dist/tools/plot.d.ts.map +1 -1
  172. package/dist/tools/plot.js.map +1 -1
  173. package/dist/tools/twists.d.ts +2 -2
  174. package/dist/twist-guide.d.ts +1 -1
  175. package/dist/twist-guide.d.ts.map +1 -1
  176. package/dist/utils/uuid.d.ts +7 -0
  177. package/dist/utils/uuid.d.ts.map +1 -0
  178. package/dist/utils/uuid.js +9 -0
  179. package/dist/utils/uuid.js.map +1 -0
  180. package/package.json +60 -3
  181. package/tsconfig.base.json +1 -0
  182. package/dist/docs/types/plot.NoteType.html +0 -1
  183. package/dist/llm-docs/creator-docs.d.ts +0 -9
  184. package/dist/llm-docs/creator-docs.d.ts.map +0 -1
  185. package/dist/llm-docs/creator-docs.js +0 -8
  186. package/dist/llm-docs/creator-docs.js.map +0 -1
@@ -17,16 +17,43 @@ Plot Twists are TypeScript classes that extend the `Twist` base class. Twists in
17
17
  - **Store intermediate state**: Use the Store tool to persist state between batches
18
18
  - **Examples**: Syncing large datasets, processing many API calls, or performing batch operations
19
19
 
20
- ## twist Structure Pattern
20
+ ## Understanding Activities and Notes
21
+
22
+ **CRITICAL CONCEPT**: An **Activity** represents something done or to be done (a task, event, or conversation), while **Notes** represent the updates and details on that activity.
23
+
24
+ **Think of an Activity as a thread** on a messaging platform, and **Notes as the messages in that thread**.
25
+
26
+ ### Key Guidelines
27
+
28
+ 1. **Always create Activities with an initial Note** - The title is just a summary; detailed content goes in Notes
29
+ 2. **Add Notes to existing Activities for updates** - Don't create a new Activity for each related message
30
+ 3. **Track external items using generated UUIDs** - Store mappings between external IDs and Plot UUIDs for deduplication
31
+ 4. **Most Activities should be `ActivityType.Note`** - Use `Action` only for tasks with `doneAt`, use `Event` only for items with `start`/`end`
32
+
33
+ ### Decision Tree
34
+
35
+ ```
36
+ New event/task/conversation?
37
+ ├─ Yes → Generate UUID with Uuid.Generate()
38
+ │ Create new Activity with that UUID
39
+ │ Store mapping: external_id → activity_uuid
40
+
41
+ └─ No (update/reply/comment) → Look up mapping by external_id
42
+ ├─ Found → Add Note to existing Activity using stored UUID
43
+ └─ Not found → Create new Activity with UUID + store mapping
44
+ ```
45
+
46
+ ## Twist Structure Pattern
21
47
 
22
48
  ```typescript
23
49
  import {
24
50
  type Activity,
25
- twist,
26
51
  type Priority,
27
52
  type ToolBuilder,
53
+ twist,
28
54
  } from "@plotday/twister";
29
55
  import { Plot } from "@plotday/twister/tools/plot";
56
+ import { Uuid } from "@plotday/twister/utils/uuid";
30
57
 
31
58
  export default class MyTwist extends Twist<MyTwist> {
32
59
  build(build: ToolBuilder) {
@@ -118,9 +145,14 @@ async activate(_priority: Pick<Priority, "id">) {
118
145
  );
119
146
 
120
147
  await this.tools.plot.createActivity({
121
- type: ActivityType.Action,
148
+ type: ActivityType.Note,
122
149
  title: "Connect your account",
123
- links: [authLink],
150
+ notes: [
151
+ {
152
+ content: "Click the link below to connect your account and start syncing.",
153
+ links: [authLink],
154
+ },
155
+ ],
124
156
  });
125
157
  }
126
158
  ```
@@ -129,8 +161,13 @@ async activate(_priority: Pick<Priority, "id">) {
129
161
 
130
162
  ```typescript
131
163
  const activity = await this.tools.plot.createActivity({
132
- type: ActivityType.Action,
164
+ type: ActivityType.Note,
133
165
  title: "Setup",
166
+ notes: [
167
+ {
168
+ content: "Your twist is being set up. Configuration steps will appear here.",
169
+ },
170
+ ],
134
171
  });
135
172
 
136
173
  await this.set("setup_activity_id", activity.id);
@@ -180,11 +217,16 @@ const callbackLink: ActivityLink = {
180
217
  token: token,
181
218
  };
182
219
 
183
- // Add to activity
220
+ // Add to activity note
184
221
  await this.tools.plot.createActivity({
185
- type: ActivityType.Action,
222
+ type: ActivityType.Note,
186
223
  title: "Task with links",
187
- links: [urlLink, callbackLink],
224
+ notes: [
225
+ {
226
+ content: "Click the links below to take action.",
227
+ links: [urlLink, callbackLink],
228
+ },
229
+ ],
188
230
  });
189
231
  ```
190
232
 
@@ -202,9 +244,14 @@ async activate(_priority: Pick<Priority, "id">) {
202
244
 
203
245
  // Create activity with auth link
204
246
  const activity = await this.tools.plot.createActivity({
205
- type: ActivityType.Action,
247
+ type: ActivityType.Note,
206
248
  title: "Connect Google account",
207
- links: [authLink],
249
+ notes: [
250
+ {
251
+ content: "Click below to connect your Google account and start syncing.",
252
+ links: [authLink],
253
+ },
254
+ ],
208
255
  });
209
256
 
210
257
  // Store for later use
@@ -222,7 +269,7 @@ async onAuthComplete(authResult: { authToken: string }, provider: string) {
222
269
 
223
270
  ## Sync Pattern
224
271
 
225
- Pattern for syncing external data with callbacks:
272
+ Pattern for syncing external data - demonstrates adding Notes to existing Activities:
226
273
 
227
274
  ```typescript
228
275
  async startSync(calendarId: string): Promise<void> {
@@ -236,9 +283,42 @@ async startSync(calendarId: string): Promise<void> {
236
283
  );
237
284
  }
238
285
 
239
- async handleEvent(activity: Activity, calendarId: string): Promise<void> {
240
- // Process incoming event from external service
241
- await this.tools.plot.createActivity(activity);
286
+ async handleEvent(
287
+ incomingActivity: NewActivityWithNotes,
288
+ calendarId: string
289
+ ): Promise<void> {
290
+ // Extract external event ID from meta (adapt based on your tool's data)
291
+ const externalId = incomingActivity.meta?.eventId;
292
+
293
+ if (!externalId) {
294
+ console.error("Event missing external ID");
295
+ return;
296
+ }
297
+
298
+ // Check if we've already synced this event
299
+ const mappingKey = `event_mapping:${calendarId}:${externalId}`;
300
+ const existingActivityId = await this.get<Uuid>(mappingKey);
301
+
302
+ if (existingActivityId) {
303
+ // Event already exists - add update as a Note (add message to thread)
304
+ if (incomingActivity.notes?.[0]?.content) {
305
+ await this.tools.plot.createNote({
306
+ activity: { id: existingActivityId },
307
+ content: incomingActivity.notes[0].content,
308
+ });
309
+ }
310
+ return;
311
+ }
312
+
313
+ // New event - generate UUID and store mapping
314
+ const activityId = Uuid.Generate();
315
+ await this.set(mappingKey, activityId);
316
+
317
+ // Create new Activity with initial Note (new thread with first message)
318
+ await this.tools.plot.createActivity({
319
+ ...incomingActivity,
320
+ id: activityId,
321
+ });
242
322
  }
243
323
 
244
324
  async stopSync(calendarId: string): Promise<void> {
@@ -278,7 +358,12 @@ private async createCalendarSelectionActivity(
278
358
  await this.tools.plot.createActivity({
279
359
  type: ActivityType.Note,
280
360
  title: "Which calendars would you like to connect?",
281
- links,
361
+ notes: [
362
+ {
363
+ content: "Select the calendars you want to sync:",
364
+ links,
365
+ },
366
+ ],
282
367
  });
283
368
  }
284
369
 
@@ -334,9 +419,24 @@ async syncBatch(args: any, resourceId: string): Promise<void> {
334
419
  // Process one batch (keep under time limit)
335
420
  const result = await this.fetchBatch(state.nextPageToken);
336
421
 
337
- // Process results
422
+ // Process results (create activities with Notes)
338
423
  for (const item of result.items) {
339
- await this.tools.plot.createActivity(item);
424
+ // Check if already synced
425
+ const mappingKey = `item_mapping:${resourceId}:${item.id}`;
426
+ const existingId = await this.get<Uuid>(mappingKey);
427
+
428
+ if (!existingId) {
429
+ // New item - generate UUID and store mapping
430
+ const activityId = Uuid.Generate();
431
+ await this.set(mappingKey, activityId);
432
+
433
+ await this.tools.plot.createActivity({
434
+ id: activityId,
435
+ type: ActivityType.Note,
436
+ title: item.title,
437
+ notes: [{ id: Uuid.Generate(), content: item.description }],
438
+ });
439
+ }
340
440
  }
341
441
 
342
442
  if (result.nextPageToken) {
@@ -357,7 +457,12 @@ async syncBatch(args: any, resourceId: string): Promise<void> {
357
457
  // Optionally notify user of completion
358
458
  await this.tools.plot.createActivity({
359
459
  type: ActivityType.Note,
360
- note: `Sync complete: ${state.itemsProcessed + result.items.length} items processed`,
460
+ title: "Sync complete",
461
+ notes: [
462
+ {
463
+ content: `Successfully processed ${state.itemsProcessed + result.items.length} items.`,
464
+ },
465
+ ],
361
466
  });
362
467
  }
363
468
  }
@@ -375,7 +480,12 @@ try {
375
480
 
376
481
  await this.tools.plot.createActivity({
377
482
  type: ActivityType.Note,
378
- note: `Failed to complete operation: ${error.message}`,
483
+ title: "Operation failed",
484
+ notes: [
485
+ {
486
+ content: `Failed to complete operation: ${error.message}`,
487
+ },
488
+ ],
379
489
  });
380
490
  }
381
491
  ```
@@ -384,7 +494,10 @@ try {
384
494
 
385
495
  - **Don't use instance variables for state** - Anything stored in memory is lost after function execution. Always use the Store tool for data that needs to persist.
386
496
  - **Processing self-created activities** - Other users may change an Activity created by the twist, resulting in an \`activity\` call. Be sure to check the \`changes === null\` and/or \`activity.author.id !== this.id\` to avoid re-processing.
387
- - Most activity should be `type = ActivityType.Note` with a `title` and `note`, and no `start` or `end`. This represents a typical message. `start` and `end` should only be used for a note if it should be displayed for a specific date or time, such as a birthday.
497
+ - **Always create Activities with Notes** - See "Understanding Activities and Notes" section above for the thread/message pattern and decision tree.
498
+ - **Use correct Activity types** - Most should be `ActivityType.Note`. Only use `Action` for tasks with `doneAt`, and `Event` for items with `start`/`end`.
499
+ - **Track external items with UUID mappings** - Generate UUIDs with `Uuid.Generate()` and store mappings (`external_id → uuid`) for deduplication. Never rely on the `source` field.
500
+ - **Add Notes to existing Activities** - Look up stored UUID mappings before creating new Activities. Think thread replies, not new threads.
388
501
  - Tools are declared in the `build` method and accessed via `this.tools.toolName` in twist methods.
389
502
  - **Don't forget runtime limits** - Each execution has ~10 seconds. Break long operations into batches with the Tasks tool. Process enough items per batch to be efficient, but few enough to stay under time limits.
390
503
  - **Always use Callbacks tool for persistent references** - Direct function references don't survive worker restarts.
@@ -1,4 +1,4 @@
1
- import type { ActivityLink, NewActivityWithNotes } from "../index";
1
+ import type { ActivityLink, SyncUpdate } from "../index";
2
2
  /**
3
3
  * Represents successful calendar authorization.
4
4
  *
@@ -85,9 +85,25 @@ export interface SyncOptions {
85
85
  * }
86
86
  * }
87
87
  *
88
- * async onCalendarEvent(activity: NewActivityWithNotes) {
88
+ * async onCalendarEvent(
89
+ * syncUpdate: SyncUpdate,
90
+ * syncMeta: { initialSync: boolean }
91
+ * ) {
89
92
  * // Step 4: Process synced events
90
- * await this.plot.createActivity(activity);
93
+ * if ('activityId' in syncUpdate) {
94
+ * // Update existing activity
95
+ * if (syncUpdate.update) {
96
+ * await this.plot.updateActivity(syncUpdate.update);
97
+ * }
98
+ * if (syncUpdate.notes) {
99
+ * for (const note of syncUpdate.notes) {
100
+ * await this.plot.createNote(note);
101
+ * }
102
+ * }
103
+ * } else {
104
+ * // Create new activity
105
+ * await this.plot.createActivity(syncUpdate);
106
+ * }
91
107
  * }
92
108
  * }
93
109
  * ```
@@ -120,14 +136,21 @@ export interface CalendarTool {
120
136
  * event import and ongoing change notifications. The callback function
121
137
  * will be invoked for each synced event.
122
138
  *
139
+ * Tools implementing this should:
140
+ * - Generate UUIDs for new activities and notes using Uuid.Generate()
141
+ * - Track activity IDs locally to detect updates vs new items
142
+ * - Send NewActivityWithNotes for new events
143
+ * - Send update object with activityId for changed events
144
+ * - Set activity.unread = false for initial sync, true for incremental updates
145
+ *
123
146
  * @param authToken - Authorization token for calendar access
124
147
  * @param calendarId - ID of the calendar to sync
125
- * @param callback - Function receiving (activity, ...extraArgs) for each synced event
148
+ * @param callback - Function receiving (syncUpdate, ...extraArgs) for each synced event
126
149
  * @param extraArgs - Additional arguments to pass to the callback (type-checked)
127
150
  * @returns Promise that resolves when sync setup is complete
128
151
  * @throws When auth token is invalid or calendar doesn't exist
129
152
  */
130
- startSync<TCallback extends (activity: NewActivityWithNotes, ...args: any[]) => any>(authToken: string, calendarId: string, callback: TCallback, ...extraArgs: TCallback extends (activity: any, ...rest: infer R) => any ? R : []): Promise<void>;
153
+ startSync<TCallback extends (syncUpdate: SyncUpdate, ...args: any[]) => any>(authToken: string, calendarId: string, callback: TCallback, ...extraArgs: TCallback extends (syncUpdate: any, ...rest: infer R) => any ? R : []): Promise<void>;
131
154
  /**
132
155
  * Stops synchronizing events from a specific calendar.
133
156
  *
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/common/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACvE,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAChE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;;;;;;OAUG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErD;;;;;;;;;;;;;OAaG;IACH,SAAS,CACP,SAAS,SAAS,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAEzE,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GACpE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE"}
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/common/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAwB,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACvE,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAChE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;;;;;;OAUG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CACP,SAAS,SAAS,CAChB,UAAU,EAAE,UAAU,EACtB,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,GAAG,EAER,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAC9B,UAAU,EAAE,GAAG,EACf,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,GAAG,GACJ,CAAC,GACD,EAAE,GACL,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE"}
@@ -1,4 +1,4 @@
1
- import type { ActivityLink, NewActivityWithNotes } from "../index";
1
+ import type { ActivityLink, SyncUpdate } from "../index";
2
2
  /**
3
3
  * Represents a successful messaging service authorization.
4
4
  *
@@ -61,18 +61,24 @@ export interface MessagingTool {
61
61
  /**
62
62
  * Begins synchronizing messages from a specific channel.
63
63
  *
64
- * Email threads and chat conversations are converted to ActivityWithNotes objects.
65
- * Each object contains an Activity (with subject/title) and Notes array (one per message).
66
- * The Activity.id can be used as a stable conversation identifier.
64
+ * Email threads and chat conversations are converted to SyncUpdate objects,
65
+ * which can be either new items or updates to existing items.
66
+ *
67
+ * Tools implementing this should:
68
+ * - Generate UUIDs for new activities and notes using Uuid.Generate()
69
+ * - Track activity IDs locally to detect updates vs new threads
70
+ * - Send NewActivityWithNotes for new threads
71
+ * - Send update object with activityId and new notes for new messages in existing threads
72
+ * - Set activity.unread = false for initial sync, true for incremental updates
67
73
  *
68
74
  * @param authToken - Authorization token for access
69
75
  * @param channelId - ID of the channel (e.g., channel, inbox) to sync
70
- * @param callback - Function receiving (thread, ...extraArgs) for each synced conversation
76
+ * @param callback - Function receiving (syncUpdate, ...extraArgs) for each synced conversation
71
77
  * @param options - Optional configuration for limiting the sync scope (e.g., time range)
72
78
  * @param extraArgs - Additional arguments to pass to the callback (type-checked)
73
79
  * @returns Promise that resolves when sync setup is complete
74
80
  */
75
- startSync<TCallback extends (thread: NewActivityWithNotes, ...args: any[]) => any>(authToken: string, channelId: string, callback: TCallback, options?: MessageSyncOptions, ...extraArgs: TCallback extends (thread: any, ...rest: infer R) => any ? R : []): Promise<void>;
81
+ startSync<TCallback extends (syncUpdate: SyncUpdate, ...args: any[]) => any>(authToken: string, channelId: string, callback: TCallback, options?: MessageSyncOptions, ...extraArgs: TCallback extends (syncUpdate: any, ...rest: infer R) => any ? R : []): Promise<void>;
76
82
  /**
77
83
  * Stops synchronizing messages from a specific channel.
78
84
  *
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/common/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxE,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAChE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE1D;;;;;;;;;;;;;OAaG;IACH,SAAS,CACP,SAAS,SAAS,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAEvE,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,EACnB,OAAO,CAAC,EAAE,kBAAkB,EAC5B,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAClE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/common/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAwB,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxE,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAChE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE1D;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CACP,SAAS,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAEjE,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,EACnB,OAAO,CAAC,EAAE,kBAAkB,EAC5B,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GACtE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,121 @@
1
+ import type { ActivityLink, ActivityUpdate, SyncUpdate } from "../index";
2
+ /**
3
+ * Represents a successful project management service authorization.
4
+ *
5
+ * Returned by project management tools when authorization completes successfully.
6
+ * The auth token is an opaque identifier that can be used for subsequent
7
+ * project operations.
8
+ */
9
+ export type ProjectAuth = {
10
+ /** Opaque token for project management operations */
11
+ authToken: string;
12
+ };
13
+ /**
14
+ * Represents a project from an external project management service.
15
+ *
16
+ * Contains metadata about a specific project/board/workspace that can be synced
17
+ * with Plot.
18
+ */
19
+ export interface Project {
20
+ /** Unique identifier for the project within the provider */
21
+ id: string;
22
+ /** Human-readable name of the project (e.g., "Q1 Roadmap", "Engineering") */
23
+ name: string;
24
+ /** Optional description or additional details about the project */
25
+ description: string | null;
26
+ /** Optional project key/abbreviation (e.g., "PROJ" in Jira, "ENG" in Linear) */
27
+ key: string | null;
28
+ }
29
+ /**
30
+ * Configuration options for project synchronization.
31
+ *
32
+ * Controls the time range and other parameters for project sync operations.
33
+ * Used to limit sync scope and optimize performance.
34
+ */
35
+ export interface ProjectSyncOptions {
36
+ /** Earliest date to sync issues from (inclusive) */
37
+ timeMin?: Date;
38
+ }
39
+ /**
40
+ * Base interface for project management integration tools.
41
+ *
42
+ * All synced issues/tasks are converted to ActivityWithNotes objects.
43
+ * Each issue becomes an Activity with Notes for the description and comments.
44
+ */
45
+ export interface ProjectTool {
46
+ /**
47
+ * Initiates the authorization flow for the service.
48
+ *
49
+ * @param callback - Function receiving (auth, ...extraArgs) when auth completes
50
+ * @param extraArgs - Additional arguments to pass to the callback (type-checked)
51
+ * @returns Promise resolving to an ActivityLink to initiate the auth flow
52
+ */
53
+ requestAuth<TCallback extends (auth: ProjectAuth, ...args: any[]) => any>(callback: TCallback, ...extraArgs: TCallback extends (auth: any, ...rest: infer R) => any ? R : []): Promise<ActivityLink>;
54
+ /**
55
+ * Retrieves the list of projects accessible to the user.
56
+ *
57
+ * @param authToken - Authorization token from successful auth flow
58
+ * @returns Promise resolving to array of available projects
59
+ */
60
+ getProjects(authToken: string): Promise<Project[]>;
61
+ /**
62
+ * Begins synchronizing issues from a specific project.
63
+ *
64
+ * Issues and tasks are converted to SyncUpdate objects, which can be either
65
+ * new items or updates to existing items.
66
+ *
67
+ * Tools implementing this should:
68
+ * - Generate UUIDs for new activities and notes using Uuid.Generate()
69
+ * - Track activity IDs locally to detect updates vs new items
70
+ * - Send NewActivityWithNotes for new issues
71
+ * - Send update object with activityId for changed issues or new comments
72
+ * - Track description note ID and hash to detect description changes
73
+ * - Set activity.unread = false for initial sync, true for incremental updates
74
+ *
75
+ * @param authToken - Authorization token for access
76
+ * @param projectId - ID of the project to sync
77
+ * @param callback - Function receiving (syncUpdate, ...extraArgs) for each synced issue
78
+ * @param options - Optional configuration for limiting the sync scope (e.g., time range)
79
+ * @param extraArgs - Additional arguments to pass to the callback (type-checked)
80
+ * @returns Promise that resolves when sync setup is complete
81
+ */
82
+ startSync<TCallback extends (syncUpdate: SyncUpdate, ...args: any[]) => any>(authToken: string, projectId: string, callback: TCallback, options?: ProjectSyncOptions, ...extraArgs: TCallback extends (syncUpdate: any, ...rest: infer R) => any ? R : []): Promise<void>;
83
+ /**
84
+ * Stops synchronizing issues from a specific project.
85
+ *
86
+ * @param authToken - Authorization token for access
87
+ * @param projectId - ID of the project to stop syncing
88
+ * @returns Promise that resolves when sync is stopped
89
+ */
90
+ stopSync(authToken: string, projectId: string): Promise<void>;
91
+ /**
92
+ * Updates an issue/task with new values.
93
+ *
94
+ * Optional method for bidirectional sync. When implemented, allows Plot to
95
+ * sync activity updates back to the external service.
96
+ *
97
+ * The update object contains only the fields that changed, plus id and source.
98
+ * Uses the combination of start and doneAt to determine workflow state:
99
+ * - doneAt set → Completed/Done state
100
+ * - doneAt null + start set → In Progress/Active state
101
+ * - doneAt null + start null → Backlog/Todo state
102
+ *
103
+ * @param authToken - Authorization token for access
104
+ * @param update - ActivityUpdate with changed fields (includes id and source)
105
+ * @returns Promise that resolves when the update is synced
106
+ */
107
+ updateIssue?(authToken: string, update: ActivityUpdate): Promise<void>;
108
+ /**
109
+ * Adds a comment to an issue/task.
110
+ *
111
+ * Optional method for bidirectional sync. When implemented, allows Plot to
112
+ * sync notes added to activities back as comments on the external service.
113
+ *
114
+ * @param authToken - Authorization token for access
115
+ * @param issueId - ID or key of the issue/task to comment on
116
+ * @param body - The comment text content
117
+ * @returns Promise that resolves when the comment is added
118
+ */
119
+ addIssueComment?(authToken: string, issueId: string, body: string): Promise<void>;
120
+ }
121
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/common/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EAEd,UAAU,EACX,MAAM,UAAU,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gFAAgF;IAChF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACtE,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAChE,CAAC,GACD,EAAE,GACL,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CACP,SAAS,SAAS,CAChB,UAAU,EAAE,UAAU,EACtB,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,GAAG,EAER,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,EACnB,OAAO,CAAC,EAAE,kBAAkB,EAC5B,GAAG,SAAS,EAAE,SAAS,SAAS,CAC9B,UAAU,EAAE,GAAG,EACf,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,GAAG,GACJ,CAAC,GACD,EAAE,GACL,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;;;;;;;;OAUG;IACH,eAAe,CAAC,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/common/projects.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- window.hierarchyData = "eJyNkrFOwzAQht/l5quR6zhOs1VMWRASbKhCJjE0ihsj+1CHKu+OnAAyk714iL///87R3cA7RwHaF8VPCN68W9PT6OYA7Q0Uj+esLwZa6J6ds4AwjfMALd83CF/eQgu91SGYcEfOWbZS7EyXiK430AKFYRdju+0DQn8e7eDNHL0Vin2FQlYohUIpD1jzCmvZoOINKlGfFgRVJZMUDVIwx4Ig9v+Kr2OgkKsOr7RybMMLJDKVHLu8QI/s2OWLpVBJ8b229k33U8ED+l+U/YUKbPKQrsNM5sPrbVeywjGhWRrNa2ue/r0HQ1fnp7xx3kD2EyjwyCbxPFpHecmndcQimq9XPK1/IudNvj9EjK1wgUHU6S7rULIJFDG2wjnDsnwDA8lccw=="
1
+ window.hierarchyData = "eJyNkrFOwzAQht/l5qtRSJyzslWdsiAk2FCFTGpoFDdG9qEOVd4dOQFkJnvxYH/3f3fy3cA7xwG6F6qOCN68WzPw6OYA3Q2oiuesLwY66J+ds4AwjfMJuupeIXx5Cx0MVodgwh07Z8VKiTNfIrq+QAccTrtYttsuEIbzaE/ezNHbYN0orEmhbCuUirBtamwVIUlCInlcEKhJOilqpKCPBaFuVBp8HQOHXHR45ZUTG14goVSy7/MCPYp9nw+WbfpBB23tmx6mggGGX1T8FRXYFKXrMLP58HrblaxwTGiRlua1bVMn2gfDV+envHHeQPFTUOD5N96jdZyXfFrHIqL5eJJp/BM7b/L5IWJihQsMJNNd1qFkEzhiYoVzhmX5BnM3XJs="
@@ -25,10 +25,10 @@
25
25
  --dark-hl-11: #9CDCFE;
26
26
  --light-hl-12: #EE0000;
27
27
  --dark-hl-12: #D7BA7D;
28
- --light-hl-13: #098658;
29
- --dark-hl-13: #B5CEA8;
30
- --light-hl-14: #000000FF;
31
- --dark-hl-14: #D4D4D4;
28
+ --light-hl-13: #000000FF;
29
+ --dark-hl-13: #D4D4D4;
30
+ --light-hl-14: #098658;
31
+ --dark-hl-14: #B5CEA8;
32
32
  --light-hl-15: #000000;
33
33
  --dark-hl-15: #C8C8C8;
34
34
  --light-code-background: #FFFFFF;
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "eJytm99v2zYQx/+VwHvtlv5emrfM6zYDSRYk7vYwFAYrMTFhiXRFqk429H8fKEoyKR5559av4ZefOx7PNHnn/PPfzPBHMzuf/d6KkuvZs1mxFlXZcDk7/2c/yI0R8uHkzrDG8HL2bLZlZj07n5WqaGsujT7tJate8tPa1NXs2WwjZDk7P3t1dvb2+dnXZyNxrhp+Mley4FujIZ4VrAYBRvulFZX5UciTpVIViBsUq05B4ZV2wfNWG1XnsVa4ckIafX65OLnl97zhsuDg2i8Xq1GA0W5baUTNT97LL6JR0hIgZi9beTKY/NFjX6myrZJZUai6VvK0YBWXJWv2Vms37dQJVoMgtPcShi6k4c09K5JW55E5MU6JLM5h02/eeou8e5LFn1sjlNQkpqfPYQfTNiUO8tVOiMH+tiyftvzkohJMo1G6aM16b908bTOGrXZi+Pm7n1+8efn1Y2BeyJI/xrvd/Zm0xwT/P7SinPrtDNiRlJd7H69ZzfU2k0ahgXANsYnXMOS3VhZD4sDnpuQNM96H/H6Y4ZsaZKHNt6+7uPurGg+FlMEle8htzA+mG+/X9OLd61fPX3v4i8KoZpEMS0dgVtOFLkW5aYRqhHnKYrZ7UYpzzXcklOQ7Au2iMOKLME8297AFdkLjhBjvUsgNmVkJuUG4cyXdHgv5cNOoL6LkwMnqsQtvwnY/geI32WcC74obRuLVTpjiLdmDxlJY57MGRUi+QyjDqubdUUlaVzFIMSaJRuD8Lcz6WhmeX+sA3Amzlr06E7vD4JLvDuHfiGIzfKRtnov8YbUVxWb4ZBeDnOA71WVCjD9sy+D4zgS4HaQppr03EHj6SRYoy25NfpkqP5/vcATfYRRlOGFFloKuqPvuwb950AxAIG77s5wOQjnSVYOc5dd8N1fSsMJgPhWjLPO9YLg0qF+F0yGe2Ttm93ZBvlyMUtWnUZeiLcI7LsARxily/qCO5PZskd8skZl7pUpe3TT+1SpNqq14G4jTPnVkxLG616Qpt/xzy3U+hZhoRlWOpLdKaiSxRbOXpVl3T9rw+oprzR4woO609ahNUz9o3tCYreYNhXihtdCGSUPDskFOYduspWFt+lKINBotkpQYYpQ71TYFur2DKPnp5o/mhjX5FLbarROlOL8yw/pzMIsqmWHFqEueWjV74KhbwqoQv34TFQ66FxXGueVMK2kv/hisGZQosWSF4eUhZDeDasF+BuasqvD9VaoqWFUReLdctxUhY5Sqmk5KYL5/5EVrX95RqSdB5sMENU7InwSEIwBl3HHsnLcYzbM3BVZVn1ixueJmrcr8QoteW4/a9F3PL3bkLnv3ni5NkwMOocn7vQ5bMWmpBA4tZrn12SrmQ8PwcIlQmMyO1qxJ1QDWmjWlCtCa9SX/gt1OWrOuelWOpBrxL0P3kk2UOeJSbThOM70qRfqbf1ortaFcoHZOit+irrnZqSafanLUYO/Li6LgmvaAZ4MUq7sRmMOrGmX2zxcCsn/BoET7Zlx0X81/MFlWSDrbp6Po1OtRnVx/pfJ7vHWC5PvcqAZ5mveKdO1KI2eH6RVJwk5oQ7h0GatD712XKl9gqVSuotL5csObWmiNf2Na8TYQZ7kEGsrAEREhLKdvwYyxfz1WGyOqqLtORmeiH4N7GblyuscYBjEIWEv3ON44hoILyOG6RgEVFlaPAZgVYLCw7utB7AAhQsn5/Rh1MdOiMbAcJ6ECsygqBKjoArRRRYgXjQwJ0ZzPFIr97I9kB3iNOUuN67QACgTVSTAgVB/2YPthdJEqgbADhAil57sxiv3MQvbDhBD75dzp2Unb7ARhGCRAohpuiOmHMRBYwPVI3jje3n4v25rvnw2Jrx6g4cllW0+yM7Z4ljjuUdQgSuPy7U0PCQmzXk5r9qF7bnQK+P7e+nhZQFrr8M8N9rPbFuiph7cVA9k3bHrmwc4TEiZYn4uepS+nFs6mfoG1DxP/iiXxS5WK6fQFalJZKZzY0RfxL2VevPSzIjMXnnpYPuR6KOPysy2UOJD6tOtVADS9YuIIAfU7JX5EOvzFIh8T9MdZQLfC+8WTZ6eX5X5ABfUrUjCny9HiGjTEGlQ5ElA3hlCjLMeKK8cQalDlSIkKL4QLpHlmtnoMs4Ep2X0B68fg3nhKjAhVkFPMvRajpmvIKfZ0RmzhwN/1pZuV7ioxWp8K0btWqqM34U50OBZs6UVQT4Uj0z29iDuV4nCwqRdxPRWOxHEHRBOLIwkzLTHFm9wJMBDYkJuwPA0t+EjUaZCgkQJy7njCn0Pv2dM2f3918jbXjuN3KH1apPsPDjcKjnARAJod4X1gb2wOm53eDmg/S550avy9iS3iO4Re09B2GBTaYzXGQPYRWmQJbrpZBqWbyDapnAlfc4zrPGgyzLvA5CJp/xuyL9Gr8lMwMB7o0XMnbltlwZ32OCcQ2Bz0j6HIOOFFHXcIs8ROSznkZKqB5sD98BFyLerUhWk2GLqGDH5DcqWajX4SDDZDbSoJ4tjBDQvHJrct8lELu2hhyFzRNbLzDcHKdAH9eI31wkB71PLYtLXpJ3lQ23LC9Acm1X6NgKEwWyqDeq8RL9BRPoEabnQ6ZDd4hDyadFPDRHJG7mJTLpVilw3cWXW0bvAILk/at6HLzsgyNpV0OdHm7HHd6DGcnpiZeO3MLAFrB9d2wN509PD1LYKPiMPfvEEb2z8eeluXCu37pHvZAG8qJp3PcEO6+/OxdhnY5A6/jI3ESdkaUenTNdPr2MtubGXHSK5i//X2uRXF5o/A0v7f3jxboy60+nZ6W3WudxuV8r0bJDmPp7l9G679f3L2cty3Ngi/O79vGlULzf9iVRsXdHyLgRBL+fePpmGF6SrUt9y0TXQx9dGxGuN3/1G9kJN/jY7Jvg5jLmzPByXuVSReVKxLEOESXXyUQGX/GOnJ8H4p8NKLiZ4MJwJvUog4ytDuZeoVHVMn0vTp+fHrx/8BGzrumg=="