@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.
- package/LICENSE +1 -1
- package/README.md +35 -6
- package/bin/commands/deploy.js +246 -6
- package/bin/commands/deploy.js.map +1 -1
- package/bin/commands/generate.js +11 -2
- package/bin/commands/generate.js.map +1 -1
- package/bin/commands/login.js +19 -3
- package/bin/commands/login.js.map +1 -1
- package/bin/commands/priority-create.js +7 -2
- package/bin/commands/priority-create.js.map +1 -1
- package/bin/commands/priority-list.js +6 -1
- package/bin/commands/priority-list.js.map +1 -1
- package/bin/commands/twist-logs.js +12 -3
- package/bin/commands/twist-logs.js.map +1 -1
- package/bin/templates/AGENTS.template.md +133 -20
- package/bin/utils/bundle.js +40 -0
- package/bin/utils/bundle.js.map +1 -1
- package/bin/utils/network-error.js +149 -0
- package/bin/utils/network-error.js.map +1 -0
- package/bin/utils/sse.js +19 -1
- package/bin/utils/sse.js.map +1 -1
- package/cli/templates/AGENTS.template.md +133 -20
- package/dist/common/calendar.d.ts +28 -5
- package/dist/common/calendar.d.ts.map +1 -1
- package/dist/common/messaging.d.ts +12 -6
- package/dist/common/messaging.d.ts.map +1 -1
- package/dist/common/projects.d.ts +121 -0
- package/dist/common/projects.d.ts.map +1 -0
- package/dist/common/projects.js +2 -0
- package/dist/common/projects.js.map +1 -0
- package/dist/docs/assets/hierarchy.js +1 -1
- package/dist/docs/assets/highlight.css +4 -4
- package/dist/docs/assets/navigation.js +1 -1
- package/dist/docs/assets/search.js +1 -1
- package/dist/docs/classes/tool.Tool.html +5 -5
- package/dist/docs/classes/tools_ai.AI.html +3 -3
- package/dist/docs/classes/tools_callbacks.Callbacks.html +4 -4
- package/dist/docs/classes/tools_integrations.Integrations.html +1 -1
- package/dist/docs/classes/tools_network.Network.html +4 -4
- package/dist/docs/classes/tools_plot.Plot.html +28 -14
- package/dist/docs/classes/tools_store.Store.html +1 -1
- package/dist/docs/classes/tools_tasks.Tasks.html +2 -2
- package/dist/docs/classes/tools_twists.Twists.html +4 -4
- package/dist/docs/classes/twist.Twist.html +1 -1
- package/dist/docs/documents/Building_Custom_Tools.html +6 -6
- package/dist/docs/documents/Built-in_Tools.html +24 -17
- package/dist/docs/documents/Core_Concepts.html +42 -9
- package/dist/docs/documents/Getting_Started.html +10 -3
- package/dist/docs/documents/Runtime_Environment.html +7 -7
- package/dist/docs/enums/plot.ActivityLinkType.html +5 -5
- package/dist/docs/enums/plot.ActivityType.html +4 -4
- package/dist/docs/enums/plot.ActorType.html +4 -4
- package/dist/docs/enums/plot.ConferencingProvider.html +6 -6
- package/dist/docs/enums/tag.Tag.html +3 -4
- package/dist/docs/enums/tools_plot.ActivityAccess.html +3 -3
- package/dist/docs/enums/tools_plot.ContactAccess.html +3 -3
- package/dist/docs/enums/tools_plot.PriorityAccess.html +3 -3
- package/dist/docs/functions/index.Uuid.Generate.html +1 -0
- package/dist/docs/hierarchy.html +1 -1
- package/dist/docs/interfaces/common_calendar.CalendarTool.html +17 -9
- package/dist/docs/interfaces/tools_ai.AIResponse.html +2 -2
- package/dist/docs/interfaces/tools_twists.TwistSource.html +1 -1
- package/dist/docs/modules/index.Uuid.html +1 -0
- package/dist/docs/modules/index.html +1 -1
- package/dist/docs/modules/plot.html +1 -1
- package/dist/docs/types/index.Uuid.html +1 -0
- package/dist/docs/types/plot.Activity.html +21 -7
- package/dist/docs/types/plot.ActivityCommon.html +17 -15
- package/dist/docs/types/plot.ActivityLink.html +1 -1
- package/dist/docs/types/plot.ActivityMeta.html +7 -9
- package/dist/docs/types/plot.ActivityUpdate.html +3 -4
- package/dist/docs/types/plot.ActivityWithNotes.html +1 -1
- package/dist/docs/types/plot.Actor.html +5 -5
- package/dist/docs/types/plot.ActorId.html +8 -3
- package/dist/docs/types/plot.ContentType.html +1 -0
- package/dist/docs/types/plot.NewActivity.html +24 -5
- package/dist/docs/types/plot.NewActivityWithNotes.html +1 -1
- package/dist/docs/types/plot.NewActor.html +3 -0
- package/dist/docs/types/plot.NewContact.html +4 -4
- package/dist/docs/types/plot.NewNote.html +15 -4
- package/dist/docs/types/plot.NewPriority.html +1 -1
- package/dist/docs/types/plot.NewTags.html +2 -0
- package/dist/docs/types/plot.Note.html +3 -3
- package/dist/docs/types/plot.NoteUpdate.html +6 -6
- package/dist/docs/types/plot.PickPriorityConfig.html +3 -3
- package/dist/docs/types/plot.Priority.html +3 -3
- package/dist/docs/types/plot.SyncUpdate.html +15 -0
- package/dist/docs/types/plot.Tags.html +2 -0
- package/dist/docs/types/tools_ai.DataContent.html +1 -1
- package/dist/docs/types/tools_network.WebhookRequest.html +5 -3
- package/dist/docs/types/tools_plot.NoteIntentHandler.html +4 -4
- package/dist/llm-docs/common/calendar.d.ts +2 -2
- package/dist/llm-docs/common/calendar.d.ts.map +1 -1
- package/dist/llm-docs/common/calendar.js +2 -2
- package/dist/llm-docs/common/calendar.js.map +1 -1
- package/dist/llm-docs/common/messaging.d.ts +2 -2
- package/dist/llm-docs/common/messaging.d.ts.map +1 -1
- package/dist/llm-docs/common/messaging.js +2 -2
- package/dist/llm-docs/common/messaging.js.map +1 -1
- package/dist/llm-docs/common/projects.d.ts +9 -0
- package/dist/llm-docs/common/projects.d.ts.map +1 -0
- package/dist/llm-docs/common/projects.js +8 -0
- package/dist/llm-docs/common/projects.js.map +1 -0
- package/dist/llm-docs/index.d.ts +1 -1
- package/dist/llm-docs/index.js +17 -17
- package/dist/llm-docs/index.js.map +1 -1
- package/dist/llm-docs/plot.d.ts +2 -2
- package/dist/llm-docs/plot.d.ts.map +1 -1
- package/dist/llm-docs/plot.js +2 -2
- package/dist/llm-docs/plot.js.map +1 -1
- package/dist/llm-docs/tag.d.ts +2 -2
- package/dist/llm-docs/tag.d.ts.map +1 -1
- package/dist/llm-docs/tag.js +2 -2
- package/dist/llm-docs/tag.js.map +1 -1
- package/dist/llm-docs/tool.d.ts +2 -2
- package/dist/llm-docs/tool.d.ts.map +1 -1
- package/dist/llm-docs/tool.js +2 -2
- package/dist/llm-docs/tool.js.map +1 -1
- package/dist/llm-docs/tools/ai.d.ts +2 -2
- package/dist/llm-docs/tools/ai.d.ts.map +1 -1
- package/dist/llm-docs/tools/ai.js +2 -2
- package/dist/llm-docs/tools/ai.js.map +1 -1
- package/dist/llm-docs/tools/callbacks.d.ts +2 -2
- package/dist/llm-docs/tools/callbacks.d.ts.map +1 -1
- package/dist/llm-docs/tools/callbacks.js +2 -2
- package/dist/llm-docs/tools/callbacks.js.map +1 -1
- package/dist/llm-docs/tools/integrations.d.ts +1 -1
- package/dist/llm-docs/tools/integrations.js +1 -1
- package/dist/llm-docs/tools/network.d.ts +2 -2
- package/dist/llm-docs/tools/network.d.ts.map +1 -1
- package/dist/llm-docs/tools/network.js +2 -2
- package/dist/llm-docs/tools/network.js.map +1 -1
- package/dist/llm-docs/tools/plot.d.ts +2 -2
- package/dist/llm-docs/tools/plot.d.ts.map +1 -1
- package/dist/llm-docs/tools/plot.js +2 -2
- package/dist/llm-docs/tools/plot.js.map +1 -1
- package/dist/llm-docs/tools/store.d.ts +1 -1
- package/dist/llm-docs/tools/store.js +1 -1
- package/dist/llm-docs/tools/tasks.d.ts +1 -1
- package/dist/llm-docs/tools/tasks.js +1 -1
- package/dist/llm-docs/tools/twists.d.ts +2 -2
- package/dist/llm-docs/tools/twists.d.ts.map +1 -1
- package/dist/llm-docs/tools/twists.js +2 -2
- package/dist/llm-docs/tools/twists.js.map +1 -1
- package/dist/llm-docs/twist-guide-template.d.ts +1 -1
- package/dist/llm-docs/twist-guide-template.d.ts.map +1 -1
- package/dist/llm-docs/twist-guide-template.js +1 -1
- package/dist/llm-docs/twist-guide-template.js.map +1 -1
- package/dist/llm-docs/twist.d.ts +1 -1
- package/dist/llm-docs/twist.js +1 -1
- package/dist/plot.d.ts +271 -87
- package/dist/plot.d.ts.map +1 -1
- package/dist/plot.js +1 -0
- package/dist/plot.js.map +1 -1
- package/dist/tag.d.ts +2 -3
- package/dist/tag.d.ts.map +1 -1
- package/dist/tag.js +2 -3
- package/dist/tag.js.map +1 -1
- package/dist/tool.d.ts +2 -2
- package/dist/tool.d.ts.map +1 -1
- package/dist/tool.js +1 -1
- package/dist/tool.js.map +1 -1
- package/dist/tools/ai.d.ts +2 -2
- package/dist/tools/ai.d.ts.map +1 -1
- package/dist/tools/callbacks.d.ts +1 -1
- package/dist/tools/callbacks.d.ts.map +1 -1
- package/dist/tools/network.d.ts +2 -0
- package/dist/tools/network.d.ts.map +1 -1
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/plot.d.ts +36 -4
- package/dist/tools/plot.d.ts.map +1 -1
- package/dist/tools/plot.js.map +1 -1
- package/dist/tools/twists.d.ts +2 -2
- package/dist/twist-guide.d.ts +1 -1
- package/dist/twist-guide.d.ts.map +1 -1
- package/dist/utils/uuid.d.ts +7 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +9 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +60 -3
- package/tsconfig.base.json +1 -0
- package/dist/docs/types/plot.NoteType.html +0 -1
- package/dist/llm-docs/creator-docs.d.ts +0 -9
- package/dist/llm-docs/creator-docs.d.ts.map +0 -1
- package/dist/llm-docs/creator-docs.js +0 -8
- 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
|
-
##
|
|
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.
|
|
148
|
+
type: ActivityType.Note,
|
|
122
149
|
title: "Connect your account",
|
|
123
|
-
|
|
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.
|
|
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.
|
|
222
|
+
type: ActivityType.Note,
|
|
186
223
|
title: "Task with links",
|
|
187
|
-
|
|
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.
|
|
247
|
+
type: ActivityType.Note,
|
|
206
248
|
title: "Connect Google account",
|
|
207
|
-
|
|
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
|
|
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(
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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,
|
|
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(
|
|
88
|
+
* async onCalendarEvent(
|
|
89
|
+
* syncUpdate: SyncUpdate,
|
|
90
|
+
* syncMeta: { initialSync: boolean }
|
|
91
|
+
* ) {
|
|
89
92
|
* // Step 4: Process synced events
|
|
90
|
-
*
|
|
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 (
|
|
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 (
|
|
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,
|
|
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,
|
|
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
|
|
65
|
-
*
|
|
66
|
-
*
|
|
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 (
|
|
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 (
|
|
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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/common/projects.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "eJyNkrFOwzAQht/
|
|
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: #
|
|
29
|
-
--dark-hl-13: #
|
|
30
|
-
--light-hl-14: #
|
|
31
|
-
--dark-hl-14: #
|
|
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 = "eJytm99v2zYQx/+
|
|
1
|
+
window.navigationData = "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"
|