@plotday/twister 0.21.0 → 0.26.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 +234 -2
  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 +109 -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/cli/templates/AGENTS.template.md +109 -20
  21. package/dist/common/calendar.d.ts +12 -4
  22. package/dist/common/calendar.d.ts.map +1 -1
  23. package/dist/common/messaging.d.ts +8 -7
  24. package/dist/common/messaging.d.ts.map +1 -1
  25. package/dist/common/projects.d.ts +123 -0
  26. package/dist/common/projects.d.ts.map +1 -0
  27. package/dist/common/projects.js +2 -0
  28. package/dist/common/projects.js.map +1 -0
  29. package/dist/docs/assets/hierarchy.js +1 -1
  30. package/dist/docs/assets/highlight.css +6 -6
  31. package/dist/docs/assets/navigation.js +1 -1
  32. package/dist/docs/assets/search.js +1 -1
  33. package/dist/docs/classes/tool.ITool.html +1 -1
  34. package/dist/docs/classes/tool.Tool.html +5 -5
  35. package/dist/docs/classes/tools_ai.AI.html +3 -3
  36. package/dist/docs/classes/tools_callbacks.Callbacks.html +4 -4
  37. package/dist/docs/classes/tools_integrations.Integrations.html +1 -1
  38. package/dist/docs/classes/tools_network.Network.html +4 -4
  39. package/dist/docs/classes/tools_plot.Plot.html +64 -29
  40. package/dist/docs/classes/tools_store.Store.html +1 -1
  41. package/dist/docs/classes/tools_tasks.Tasks.html +2 -2
  42. package/dist/docs/classes/tools_twists.Twists.html +5 -5
  43. package/dist/docs/classes/twist.Twist.html +1 -1
  44. package/dist/docs/documents/Building_Custom_Tools.html +5 -6
  45. package/dist/docs/documents/Built-in_Tools.html +33 -14
  46. package/dist/docs/documents/Core_Concepts.html +59 -8
  47. package/dist/docs/documents/Getting_Started.html +19 -3
  48. package/dist/docs/documents/Runtime_Environment.html +7 -8
  49. package/dist/docs/enums/plot.ActivityLinkType.html +5 -5
  50. package/dist/docs/enums/plot.ActivityType.html +4 -4
  51. package/dist/docs/enums/plot.ActorType.html +4 -4
  52. package/dist/docs/enums/plot.ConferencingProvider.html +6 -6
  53. package/dist/docs/enums/tag.Tag.html +3 -4
  54. package/dist/docs/enums/tools_plot.ActivityAccess.html +6 -6
  55. package/dist/docs/enums/tools_plot.ContactAccess.html +3 -3
  56. package/dist/docs/enums/tools_plot.PriorityAccess.html +3 -3
  57. package/dist/docs/functions/utils_hash.quickHash.html +1 -0
  58. package/dist/docs/hierarchy.html +1 -1
  59. package/dist/docs/index.html +2 -11
  60. package/dist/docs/interfaces/common_calendar.CalendarTool.html +14 -8
  61. package/dist/docs/interfaces/tools_ai.AIRequest.html +4 -4
  62. package/dist/docs/interfaces/tools_ai.AIResponse.html +2 -2
  63. package/dist/docs/interfaces/tools_twists.TwistSource.html +1 -1
  64. package/dist/docs/modules/index.html +1 -1
  65. package/dist/docs/modules/plot.html +1 -1
  66. package/dist/docs/modules/tools_plot.html +1 -1
  67. package/dist/docs/modules/utils_hash.html +1 -0
  68. package/dist/docs/modules.html +1 -1
  69. package/dist/docs/types/plot.Activity.html +37 -52
  70. package/dist/docs/types/plot.ActivityCommon.html +22 -0
  71. package/dist/docs/types/plot.ActivityLink.html +1 -1
  72. package/dist/docs/types/plot.ActivityMeta.html +24 -6
  73. package/dist/docs/types/plot.ActivityUpdate.html +2 -8
  74. package/dist/docs/types/plot.ActivityWithNotes.html +1 -0
  75. package/dist/docs/types/plot.Actor.html +5 -5
  76. package/dist/docs/types/plot.ActorId.html +8 -3
  77. package/dist/docs/types/plot.ContentType.html +1 -0
  78. package/dist/docs/types/plot.NewActivity.html +18 -3
  79. package/dist/docs/types/plot.NewActivityWithNotes.html +1 -0
  80. package/dist/docs/types/plot.NewContact.html +4 -4
  81. package/dist/docs/types/plot.NewNote.html +16 -0
  82. package/dist/docs/types/plot.NewPriority.html +1 -1
  83. package/dist/docs/types/plot.Note.html +7 -0
  84. package/dist/docs/types/plot.NoteUpdate.html +14 -0
  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.Tags.html +1 -0
  88. package/dist/docs/types/tools_ai.DataContent.html +1 -1
  89. package/dist/docs/types/tools_network.WebhookRequest.html +4 -2
  90. package/dist/docs/types/{tools_plot.ActivityIntentHandler.html → tools_plot.NoteIntentHandler.html} +5 -5
  91. package/dist/llm-docs/common/calendar.d.ts +2 -2
  92. package/dist/llm-docs/common/calendar.d.ts.map +1 -1
  93. package/dist/llm-docs/common/calendar.js +2 -2
  94. package/dist/llm-docs/common/calendar.js.map +1 -1
  95. package/dist/llm-docs/common/messaging.d.ts +2 -2
  96. package/dist/llm-docs/common/messaging.d.ts.map +1 -1
  97. package/dist/llm-docs/common/messaging.js +2 -2
  98. package/dist/llm-docs/common/messaging.js.map +1 -1
  99. package/dist/llm-docs/common/projects.d.ts +9 -0
  100. package/dist/llm-docs/common/projects.d.ts.map +1 -0
  101. package/dist/llm-docs/common/projects.js +8 -0
  102. package/dist/llm-docs/common/projects.js.map +1 -0
  103. package/dist/llm-docs/index.d.ts +1 -1
  104. package/dist/llm-docs/index.js +17 -17
  105. package/dist/llm-docs/index.js.map +1 -1
  106. package/dist/llm-docs/plot.d.ts +2 -2
  107. package/dist/llm-docs/plot.d.ts.map +1 -1
  108. package/dist/llm-docs/plot.js +2 -2
  109. package/dist/llm-docs/plot.js.map +1 -1
  110. package/dist/llm-docs/tag.d.ts +2 -2
  111. package/dist/llm-docs/tag.d.ts.map +1 -1
  112. package/dist/llm-docs/tag.js +2 -2
  113. package/dist/llm-docs/tag.js.map +1 -1
  114. package/dist/llm-docs/tool.d.ts +2 -2
  115. package/dist/llm-docs/tool.d.ts.map +1 -1
  116. package/dist/llm-docs/tool.js +2 -2
  117. package/dist/llm-docs/tool.js.map +1 -1
  118. package/dist/llm-docs/tools/ai.d.ts +2 -2
  119. package/dist/llm-docs/tools/ai.d.ts.map +1 -1
  120. package/dist/llm-docs/tools/ai.js +2 -2
  121. package/dist/llm-docs/tools/ai.js.map +1 -1
  122. package/dist/llm-docs/tools/callbacks.d.ts +2 -2
  123. package/dist/llm-docs/tools/callbacks.d.ts.map +1 -1
  124. package/dist/llm-docs/tools/callbacks.js +2 -2
  125. package/dist/llm-docs/tools/callbacks.js.map +1 -1
  126. package/dist/llm-docs/tools/integrations.d.ts +1 -1
  127. package/dist/llm-docs/tools/integrations.js +1 -1
  128. package/dist/llm-docs/tools/network.d.ts +2 -2
  129. package/dist/llm-docs/tools/network.d.ts.map +1 -1
  130. package/dist/llm-docs/tools/network.js +2 -2
  131. package/dist/llm-docs/tools/network.js.map +1 -1
  132. package/dist/llm-docs/tools/plot.d.ts +2 -2
  133. package/dist/llm-docs/tools/plot.d.ts.map +1 -1
  134. package/dist/llm-docs/tools/plot.js +2 -2
  135. package/dist/llm-docs/tools/plot.js.map +1 -1
  136. package/dist/llm-docs/tools/store.d.ts +1 -1
  137. package/dist/llm-docs/tools/store.js +1 -1
  138. package/dist/llm-docs/tools/tasks.d.ts +1 -1
  139. package/dist/llm-docs/tools/tasks.js +1 -1
  140. package/dist/llm-docs/tools/twists.d.ts +2 -2
  141. package/dist/llm-docs/tools/twists.d.ts.map +1 -1
  142. package/dist/llm-docs/tools/twists.js +2 -2
  143. package/dist/llm-docs/tools/twists.js.map +1 -1
  144. package/dist/llm-docs/twist-guide-template.d.ts +1 -1
  145. package/dist/llm-docs/twist-guide-template.d.ts.map +1 -1
  146. package/dist/llm-docs/twist-guide-template.js +1 -1
  147. package/dist/llm-docs/twist-guide-template.js.map +1 -1
  148. package/dist/llm-docs/twist.d.ts +1 -1
  149. package/dist/llm-docs/twist.js +1 -1
  150. package/dist/plot.d.ts +271 -61
  151. package/dist/plot.d.ts.map +1 -1
  152. package/dist/plot.js.map +1 -1
  153. package/dist/tag.d.ts +2 -3
  154. package/dist/tag.d.ts.map +1 -1
  155. package/dist/tag.js +2 -3
  156. package/dist/tag.js.map +1 -1
  157. package/dist/tool.d.ts +2 -2
  158. package/dist/tool.d.ts.map +1 -1
  159. package/dist/tool.js +1 -1
  160. package/dist/tool.js.map +1 -1
  161. package/dist/tools/ai.d.ts +2 -2
  162. package/dist/tools/ai.d.ts.map +1 -1
  163. package/dist/tools/callbacks.d.ts +1 -1
  164. package/dist/tools/callbacks.d.ts.map +1 -1
  165. package/dist/tools/network.d.ts +2 -0
  166. package/dist/tools/network.d.ts.map +1 -1
  167. package/dist/tools/network.js.map +1 -1
  168. package/dist/tools/plot.d.ts +150 -29
  169. package/dist/tools/plot.d.ts.map +1 -1
  170. package/dist/tools/plot.js +4 -4
  171. package/dist/tools/plot.js.map +1 -1
  172. package/dist/tools/twists.d.ts +2 -2
  173. package/dist/twist-guide.d.ts +1 -1
  174. package/dist/twist-guide.d.ts.map +1 -1
  175. package/dist/utils/hash.d.ts +2 -0
  176. package/dist/utils/hash.d.ts.map +1 -0
  177. package/dist/utils/hash.js +9 -0
  178. package/dist/utils/hash.js.map +1 -0
  179. package/package.json +56 -2
  180. package/tsconfig.base.json +1 -0
  181. package/dist/docs/documents/Advanced.html +0 -91
  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,14 +17,39 @@ 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. **Use `source` field for deduplication** - Enables safe, idempotent sync from external systems
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 → Create new Activity with initial Note
38
+ │ Include `source` field for deduplication
39
+
40
+ └─ No (update/reply/comment) → Check for existing Activity
41
+ ├─ Found → Add Note to existing Activity
42
+ └─ Not found → Create new Activity with initial Note
43
+ ```
44
+
45
+ ## Twist Structure Pattern
21
46
 
22
47
  ```typescript
23
48
  import {
24
49
  type Activity,
25
- twist,
26
50
  type Priority,
27
51
  type ToolBuilder,
52
+ twist,
28
53
  } from "@plotday/twister";
29
54
  import { Plot } from "@plotday/twister/tools/plot";
30
55
 
@@ -118,9 +143,14 @@ async activate(_priority: Pick<Priority, "id">) {
118
143
  );
119
144
 
120
145
  await this.tools.plot.createActivity({
121
- type: ActivityType.Action,
146
+ type: ActivityType.Note,
122
147
  title: "Connect your account",
123
- links: [authLink],
148
+ notes: [
149
+ {
150
+ content: "Click the link below to connect your account and start syncing.",
151
+ links: [authLink],
152
+ },
153
+ ],
124
154
  });
125
155
  }
126
156
  ```
@@ -129,8 +159,13 @@ async activate(_priority: Pick<Priority, "id">) {
129
159
 
130
160
  ```typescript
131
161
  const activity = await this.tools.plot.createActivity({
132
- type: ActivityType.Action,
162
+ type: ActivityType.Note,
133
163
  title: "Setup",
164
+ notes: [
165
+ {
166
+ content: "Your twist is being set up. Configuration steps will appear here.",
167
+ },
168
+ ],
134
169
  });
135
170
 
136
171
  await this.set("setup_activity_id", activity.id);
@@ -180,11 +215,16 @@ const callbackLink: ActivityLink = {
180
215
  token: token,
181
216
  };
182
217
 
183
- // Add to activity
218
+ // Add to activity note
184
219
  await this.tools.plot.createActivity({
185
- type: ActivityType.Action,
220
+ type: ActivityType.Note,
186
221
  title: "Task with links",
187
- links: [urlLink, callbackLink],
222
+ notes: [
223
+ {
224
+ content: "Click the links below to take action.",
225
+ links: [urlLink, callbackLink],
226
+ },
227
+ ],
188
228
  });
189
229
  ```
190
230
 
@@ -202,9 +242,14 @@ async activate(_priority: Pick<Priority, "id">) {
202
242
 
203
243
  // Create activity with auth link
204
244
  const activity = await this.tools.plot.createActivity({
205
- type: ActivityType.Action,
245
+ type: ActivityType.Note,
206
246
  title: "Connect Google account",
207
- links: [authLink],
247
+ notes: [
248
+ {
249
+ content: "Click below to connect your Google account and start syncing.",
250
+ links: [authLink],
251
+ },
252
+ ],
208
253
  });
209
254
 
210
255
  // Store for later use
@@ -222,7 +267,7 @@ async onAuthComplete(authResult: { authToken: string }, provider: string) {
222
267
 
223
268
  ## Sync Pattern
224
269
 
225
- Pattern for syncing external data with callbacks:
270
+ Pattern for syncing external data - demonstrates adding Notes to existing Activities:
226
271
 
227
272
  ```typescript
228
273
  async startSync(calendarId: string): Promise<void> {
@@ -236,9 +281,30 @@ async startSync(calendarId: string): Promise<void> {
236
281
  );
237
282
  }
238
283
 
239
- async handleEvent(activity: Activity, calendarId: string): Promise<void> {
240
- // Process incoming event from external service
241
- await this.tools.plot.createActivity(activity);
284
+ async handleEvent(
285
+ incomingActivity: NewActivityWithNotes,
286
+ calendarId: string
287
+ ): Promise<void> {
288
+ // Check if this activity already exists (using source for deduplication)
289
+ if (incomingActivity.source) {
290
+ const existing = await this.tools.plot.getActivityBySource(
291
+ incomingActivity.source
292
+ );
293
+
294
+ if (existing) {
295
+ // Add update as a Note to existing Activity (add message to thread)
296
+ if (incomingActivity.notes?.[0]?.content) {
297
+ await this.tools.plot.createNote({
298
+ activity: { id: existing.id },
299
+ content: incomingActivity.notes[0].content,
300
+ });
301
+ }
302
+ return;
303
+ }
304
+ }
305
+
306
+ // Create new Activity with initial Note (new thread with first message)
307
+ await this.tools.plot.createActivity(incomingActivity);
242
308
  }
243
309
 
244
310
  async stopSync(calendarId: string): Promise<void> {
@@ -278,7 +344,12 @@ private async createCalendarSelectionActivity(
278
344
  await this.tools.plot.createActivity({
279
345
  type: ActivityType.Note,
280
346
  title: "Which calendars would you like to connect?",
281
- links,
347
+ notes: [
348
+ {
349
+ content: "Select the calendars you want to sync:",
350
+ links,
351
+ },
352
+ ],
282
353
  });
283
354
  }
284
355
 
@@ -334,9 +405,14 @@ async syncBatch(args: any, resourceId: string): Promise<void> {
334
405
  // Process one batch (keep under time limit)
335
406
  const result = await this.fetchBatch(state.nextPageToken);
336
407
 
337
- // Process results
408
+ // Process results (create activities with Notes)
338
409
  for (const item of result.items) {
339
- await this.tools.plot.createActivity(item);
410
+ await this.tools.plot.createActivity({
411
+ type: ActivityType.Note,
412
+ title: item.title,
413
+ source: `external:${item.id}`, // For deduplication
414
+ notes: [{ content: item.description }],
415
+ });
340
416
  }
341
417
 
342
418
  if (result.nextPageToken) {
@@ -357,7 +433,12 @@ async syncBatch(args: any, resourceId: string): Promise<void> {
357
433
  // Optionally notify user of completion
358
434
  await this.tools.plot.createActivity({
359
435
  type: ActivityType.Note,
360
- note: `Sync complete: ${state.itemsProcessed + result.items.length} items processed`,
436
+ title: "Sync complete",
437
+ notes: [
438
+ {
439
+ content: `Successfully processed ${state.itemsProcessed + result.items.length} items.`,
440
+ },
441
+ ],
361
442
  });
362
443
  }
363
444
  }
@@ -375,7 +456,12 @@ try {
375
456
 
376
457
  await this.tools.plot.createActivity({
377
458
  type: ActivityType.Note,
378
- note: `Failed to complete operation: ${error.message}`,
459
+ title: "Operation failed",
460
+ notes: [
461
+ {
462
+ content: `Failed to complete operation: ${error.message}`,
463
+ },
464
+ ],
379
465
  });
380
466
  }
381
467
  ```
@@ -384,7 +470,10 @@ try {
384
470
 
385
471
  - **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
472
  - **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.
473
+ - **Always create Activities with Notes** - See "Understanding Activities and Notes" section above for the thread/message pattern and decision tree.
474
+ - **Use correct Activity types** - Most should be `ActivityType.Note`. Only use `Action` for tasks with `doneAt`, and `Event` for items with `start`/`end`.
475
+ - **Use `source` field for deduplication** - Always include `source` when syncing external data to enable safe, idempotent operations.
476
+ - **Add Notes to existing Activities** - Check for existing Activities with `getActivityBySource()` before creating new ones. Think thread replies, not new threads.
388
477
  - Tools are declared in the `build` method and accessed via `this.tools.toolName` in twist methods.
389
478
  - **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
479
  - **Always use Callbacks tool for persistent references** - Direct function references don't survive worker restarts.
@@ -1,4 +1,4 @@
1
- import type { Activity, ActivityLink } from "../index";
1
+ import type { ActivityLink, NewActivityWithNotes } from "../index";
2
2
  /**
3
3
  * Represents successful calendar authorization.
4
4
  *
@@ -85,7 +85,10 @@ export interface SyncOptions {
85
85
  * }
86
86
  * }
87
87
  *
88
- * async onCalendarEvent(activity: Activity) {
88
+ * async onCalendarEvent(
89
+ * activity: NewActivityWithNotes,
90
+ * syncMeta: { initialSync: boolean }
91
+ * ) {
89
92
  * // Step 4: Process synced events
90
93
  * await this.plot.createActivity(activity);
91
94
  * }
@@ -120,14 +123,19 @@ export interface CalendarTool {
120
123
  * event import and ongoing change notifications. The callback function
121
124
  * will be invoked for each synced event.
122
125
  *
126
+ * Tools implementing this should set activity.unread based on sync type:
127
+ * - Initial sync (historical data): Set activity.unread = false
128
+ * - Incremental updates (webhooks): Set activity.unread = true or leave undefined
129
+ *
123
130
  * @param authToken - Authorization token for calendar access
124
131
  * @param calendarId - ID of the calendar to sync
125
- * @param callback - Function receiving (activity, ...extraArgs) for each synced event
132
+ * @param callback - Function receiving (activity, ...extraArgs) for each synced event.
133
+ * The activity.unread field indicates whether this is from initial sync.
126
134
  * @param extraArgs - Additional arguments to pass to the callback (type-checked)
127
135
  * @returns Promise that resolves when sync setup is complete
128
136
  * @throws When auth token is invalid or calendar doesn't exist
129
137
  */
130
- startSync<TCallback extends (activity: Activity, ...args: any[]) => any>(authToken: string, calendarId: string, callback: TCallback, ...extraArgs: TCallback extends (activity: any, ...rest: infer R) => any ? R : []): Promise<void>;
138
+ 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>;
131
139
  /**
132
140
  * Stops synchronizing events from a specific calendar.
133
141
  *
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/common/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;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,CAAC,SAAS,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrE,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,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;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;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CACP,SAAS,SAAS,CAChB,QAAQ,EAAE,oBAAoB,EAC9B,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,QAAQ,EAAE,GAAG,EACb,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 { Activity, ActivityLink } from "../index";
1
+ import type { ActivityLink, NewActivityWithNotes } from "../index";
2
2
  /**
3
3
  * Represents a successful messaging service authorization.
4
4
  *
@@ -39,7 +39,8 @@ export interface MessageSyncOptions {
39
39
  /**
40
40
  * Base interface for email and chat integration tools.
41
41
  *
42
- * All synced messages/emails are converted to Activity.
42
+ * All synced messages/emails are converted to ActivityWithNotes objects.
43
+ * Each email thread or chat conversation becomes an Activity with Notes for each message.
43
44
  */
44
45
  export interface MessagingTool {
45
46
  /**
@@ -60,18 +61,18 @@ export interface MessagingTool {
60
61
  /**
61
62
  * Begins synchronizing messages from a specific channel.
62
63
  *
63
- * Messages are converted to an array of Activity represent the email/chat thread.
64
- * The meta.source is unique and stable per message. The meta.source of the first
65
- * Activity in the thread can be used as a thread identifier.
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.
66
67
  *
67
68
  * @param authToken - Authorization token for access
68
69
  * @param channelId - ID of the channel (e.g., channel, inbox) to sync
69
- * @param callback - Function receiving (activity, ...extraArgs) for each synced message/thread
70
+ * @param callback - Function receiving (thread, ...extraArgs) for each synced conversation
70
71
  * @param options - Optional configuration for limiting the sync scope (e.g., time range)
71
72
  * @param extraArgs - Additional arguments to pass to the callback (type-checked)
72
73
  * @returns Promise that resolves when sync setup is complete
73
74
  */
74
- startSync<TCallback extends (thread: Activity[], ...args: any[]) => any>(authToken: string, channelId: string, callback: TCallback, options?: MessageSyncOptions, ...extraArgs: TCallback extends (thread: any, ...rest: infer R) => any ? R : []): Promise<void>;
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>;
75
76
  /**
76
77
  * Stops synchronizing messages from a specific channel.
77
78
  *
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/common/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;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;;;;GAIG;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,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrE,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,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"}
@@ -0,0 +1,123 @@
1
+ import type { ActivityLink, ActivityUpdate, NewActivityWithNotes } 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 ActivityWithNotes objects.
65
+ * Each object contains an Activity (with issue title and metadata) and Notes array
66
+ * (description as first note, followed by comments).
67
+ * The Activity.source should be set for deduplication.
68
+ *
69
+ * When an issue is updated, tools should check for existing Activity using
70
+ * getActivityBySource() and add a Note rather than creating a new Activity.
71
+ *
72
+ * Tools implementing this should set issue.unread based on sync type:
73
+ * - Initial sync (historical data): Set issue.unread = false
74
+ * - Incremental updates (webhooks): Set issue.unread = true or leave undefined
75
+ *
76
+ * @param authToken - Authorization token for access
77
+ * @param projectId - ID of the project to sync
78
+ * @param callback - Function receiving (issue, ...extraArgs) for each synced issue.
79
+ * The issue.unread field indicates whether this is from initial sync.
80
+ * @param options - Optional configuration for limiting the sync scope (e.g., time range)
81
+ * @param extraArgs - Additional arguments to pass to the callback (type-checked)
82
+ * @returns Promise that resolves when sync setup is complete
83
+ */
84
+ startSync<TCallback extends (issue: NewActivityWithNotes, ...args: any[]) => any>(authToken: string, projectId: string, callback: TCallback, options?: ProjectSyncOptions, ...extraArgs: TCallback extends (issue: any, ...rest: infer R) => any ? R : []): Promise<void>;
85
+ /**
86
+ * Stops synchronizing issues from a specific project.
87
+ *
88
+ * @param authToken - Authorization token for access
89
+ * @param projectId - ID of the project to stop syncing
90
+ * @returns Promise that resolves when sync is stopped
91
+ */
92
+ stopSync(authToken: string, projectId: string): Promise<void>;
93
+ /**
94
+ * Updates an issue/task with new values.
95
+ *
96
+ * Optional method for bidirectional sync. When implemented, allows Plot to
97
+ * sync activity updates back to the external service.
98
+ *
99
+ * The update object contains only the fields that changed, plus id and source.
100
+ * Uses the combination of start and doneAt to determine workflow state:
101
+ * - doneAt set → Completed/Done state
102
+ * - doneAt null + start set → In Progress/Active state
103
+ * - doneAt null + start null → Backlog/Todo state
104
+ *
105
+ * @param authToken - Authorization token for access
106
+ * @param update - ActivityUpdate with changed fields (includes id and source)
107
+ * @returns Promise that resolves when the update is synced
108
+ */
109
+ updateIssue?(authToken: string, update: ActivityUpdate): Promise<void>;
110
+ /**
111
+ * Adds a comment to an issue/task.
112
+ *
113
+ * Optional method for bidirectional sync. When implemented, allows Plot to
114
+ * sync notes added to activities back as comments on the external service.
115
+ *
116
+ * @param authToken - Authorization token for access
117
+ * @param issueId - ID or key of the issue/task to comment on
118
+ * @param body - The comment text content
119
+ * @returns Promise that resolves when the comment is added
120
+ */
121
+ addIssueComment?(authToken: string, issueId: string, body: string): Promise<void>;
122
+ }
123
+ //# 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,EACd,oBAAoB,EACrB,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;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CACP,SAAS,SAAS,CAChB,KAAK,EAAE,oBAAoB,EAC3B,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,KAAK,EAAE,GAAG,EACV,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 = "eJyNkk1PxCAQhv/LnGexhX5IbxtPvRgTvZmNwRbdpmwxMGYPm/53Q6uGG1w4wDPvM8DcwFlLHrrXlp8QnP4weqDJLh66G7Q8rIu6aOigf7HWAMI8LSN0Jb9H+HYGOhiM8l77O7LWsI1iZ7oEdDuBDsiPh1B22DcQhvNkRqeX4K1RFBKFkFhzjnVVYS0lNpXARnJsy+K0IrR11ElWIxl9rAiikHHwdfLkU9H+jTaO7XiGRMSSY58WqIkd+3RwzeMPelDGvKthzrjA8Iey/6IMW1XF47CQ/nRqn5WkcIpoFpdmaGX8eo+artbNaeOyg+y3IO1pKhF5noyltOTLWGIBzYiX8V89k3U6ne8DxjY4bWjLIp5l5XMmgQLGNjhlWNcf+ypcaQ=="
1
+ window.hierarchyData = "eJyNkrFuwyAQht/l5guVbTCNt6iTl6pSu1VRRW3aIBNTwVUZIr97hd1WZIKFAb7//w7pruCdowDdq6yOCF5/WD2QcXOA7gqyiueszho66F+cs4AwmXmErqrvEb69hQ4Gq0LQ4Y6cs2yl2InOEV1foAMK4y7GdtsFwnAydvR6jl6OTVNj09YouEAhK2xria2sUPIKpdgfFwTJk0mKBimYY0FomjotvphAIVcd3mjl2IYXSNpUcujzAmXYoc8XCy6S4gdl7bsapoIPDH8o+w8V2G7XYSb96dW2K1mhSWiWRvPatpaJ9lHTxfkpb5w3kP0GCjw333uyjvKSL+uIRTRfL3la/0zO63x/iBhb4QKD2Ke7rELJJlDE2ArnDMvyA843XGE="
@@ -23,14 +23,14 @@
23
23
  --dark-hl-10: #6796E6;
24
24
  --light-hl-11: #0451A5;
25
25
  --dark-hl-11: #9CDCFE;
26
- --light-hl-12: #098658;
27
- --dark-hl-12: #B5CEA8;
26
+ --light-hl-12: #EE0000;
27
+ --dark-hl-12: #D7BA7D;
28
28
  --light-hl-13: #000000FF;
29
29
  --dark-hl-13: #D4D4D4;
30
- --light-hl-14: #000000;
31
- --dark-hl-14: #C8C8C8;
32
- --light-hl-15: #EE0000;
33
- --dark-hl-15: #D7BA7D;
30
+ --light-hl-14: #098658;
31
+ --dark-hl-14: #B5CEA8;
32
+ --light-hl-15: #000000;
33
+ --dark-hl-15: #C8C8C8;
34
34
  --light-code-background: #FFFFFF;
35
35
  --dark-code-background: #1E1E1E;
36
36
  }
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "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"