@plotday/twister 0.33.1 → 0.34.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 (65) hide show
  1. package/dist/common/documents.d.ts +135 -0
  2. package/dist/common/documents.d.ts.map +1 -0
  3. package/dist/common/documents.js +2 -0
  4. package/dist/common/documents.js.map +1 -0
  5. package/dist/docs/assets/hierarchy.js +1 -1
  6. package/dist/docs/assets/navigation.js +1 -1
  7. package/dist/docs/assets/search.js +1 -1
  8. package/dist/docs/classes/tools_ai.AI.html +1 -1
  9. package/dist/docs/classes/tools_callbacks.Callbacks.html +1 -1
  10. package/dist/docs/classes/tools_integrations.Integrations.html +1 -1
  11. package/dist/docs/classes/tools_network.Network.html +1 -1
  12. package/dist/docs/classes/tools_plot.Plot.html +1 -1
  13. package/dist/docs/classes/tools_store.Store.html +1 -1
  14. package/dist/docs/classes/tools_tasks.Tasks.html +1 -1
  15. package/dist/docs/classes/tools_twists.Twists.html +1 -1
  16. package/dist/docs/enums/plot.ActivityKind.html +2 -2
  17. package/dist/docs/enums/plot.ActivityLinkType.html +7 -5
  18. package/dist/docs/enums/plot.ActivityType.html +4 -4
  19. package/dist/docs/enums/plot.ActorType.html +4 -4
  20. package/dist/docs/enums/plot.ConferencingProvider.html +6 -6
  21. package/dist/docs/enums/plot.ThemeColor.html +9 -9
  22. package/dist/docs/hierarchy.html +1 -1
  23. package/dist/docs/modules/index.html +1 -1
  24. package/dist/docs/modules/plot.html +1 -1
  25. package/dist/docs/types/plot.Activity.html +2 -59
  26. package/dist/docs/types/plot.ActivityCommon.html +8 -8
  27. package/dist/docs/types/plot.ActivityLink.html +7 -2
  28. package/dist/docs/types/plot.ActivityMeta.html +1 -1
  29. package/dist/docs/types/plot.ActivityOccurrence.html +7 -7
  30. package/dist/docs/types/plot.ActivityOccurrenceUpdate.html +1 -1
  31. package/dist/docs/types/plot.ActivityUpdate.html +6 -3
  32. package/dist/docs/types/plot.ActivityWithNotes.html +1 -1
  33. package/dist/docs/types/plot.Actor.html +5 -5
  34. package/dist/docs/types/plot.ActorId.html +1 -1
  35. package/dist/docs/types/plot.ContentType.html +1 -1
  36. package/dist/docs/types/plot.NewActivity.html +3 -3
  37. package/dist/docs/types/plot.NewActivityOccurrence.html +1 -1
  38. package/dist/docs/types/plot.NewActivityWithNotes.html +1 -1
  39. package/dist/docs/types/plot.NewActor.html +1 -1
  40. package/dist/docs/types/plot.NewContact.html +8 -4
  41. package/dist/docs/types/plot.NewNote.html +9 -2
  42. package/dist/docs/types/plot.NewPriority.html +1 -1
  43. package/dist/docs/types/plot.NewTags.html +1 -1
  44. package/dist/docs/types/plot.Note.html +3 -2
  45. package/dist/docs/types/plot.NoteUpdate.html +2 -2
  46. package/dist/docs/types/plot.PickPriorityConfig.html +2 -2
  47. package/dist/docs/types/plot.Priority.html +6 -6
  48. package/dist/docs/types/plot.PriorityUpdate.html +1 -1
  49. package/dist/docs/types/plot.Tags.html +1 -1
  50. package/dist/llm-docs/common/documents.d.ts +9 -0
  51. package/dist/llm-docs/common/documents.d.ts.map +1 -0
  52. package/dist/llm-docs/common/documents.js +8 -0
  53. package/dist/llm-docs/common/documents.js.map +1 -0
  54. package/dist/llm-docs/index.d.ts.map +1 -1
  55. package/dist/llm-docs/index.js +2 -0
  56. package/dist/llm-docs/index.js.map +1 -1
  57. package/dist/llm-docs/plot.d.ts +1 -1
  58. package/dist/llm-docs/plot.d.ts.map +1 -1
  59. package/dist/llm-docs/plot.js +1 -1
  60. package/dist/llm-docs/plot.js.map +1 -1
  61. package/dist/plot.d.ts +79 -10
  62. package/dist/plot.d.ts.map +1 -1
  63. package/dist/plot.js +2 -0
  64. package/dist/plot.js.map +1 -1
  65. package/package.json +11 -1
@@ -0,0 +1,135 @@
1
+ import type { ActivityLink, ActivityMeta, NewActivityWithNotes, Serializable } from "../index";
2
+ /**
3
+ * Represents a successful document service authorization.
4
+ *
5
+ * Returned by document tools when authorization completes successfully.
6
+ * The auth token is an opaque identifier that can be used for subsequent
7
+ * document operations.
8
+ */
9
+ export type DocumentAuth = {
10
+ /** Opaque token for document operations */
11
+ authToken: string;
12
+ };
13
+ /**
14
+ * Represents a folder from an external document service.
15
+ *
16
+ * Contains metadata about a specific folder that can be synced
17
+ * with Plot. Different document providers may have additional
18
+ * provider-specific properties.
19
+ */
20
+ export type DocumentFolder = {
21
+ /** Unique identifier for the folder within the provider */
22
+ id: string;
23
+ /** Human-readable name of the folder */
24
+ name: string;
25
+ /** Optional description or additional details about the folder */
26
+ description: string | null;
27
+ /** Whether this is a root-level folder (e.g., "My Drive" in Google Drive) */
28
+ root: boolean;
29
+ };
30
+ /**
31
+ * Configuration options for document synchronization.
32
+ *
33
+ * Controls the time range and other parameters for document sync operations.
34
+ * Used to limit sync scope and optimize performance.
35
+ */
36
+ export type DocumentSyncOptions = {
37
+ /** Earliest date to sync documents from (inclusive) */
38
+ timeMin?: Date;
39
+ };
40
+ /**
41
+ * Base interface for document service integration tools.
42
+ *
43
+ * All synced documents are converted to ActivityWithNotes objects.
44
+ * Each document becomes an Activity with Notes for the description and comments.
45
+ *
46
+ * **Recommended Data Sync Strategy:**
47
+ * Use Activity.source and Note.key for automatic upserts.
48
+ *
49
+ * - Set `Activity.source` to `"{provider}:file:{fileId}"` (e.g., `"google-drive:file:abc123"`)
50
+ * - Use `Note.key` for document details:
51
+ * - key: `"summary"` for the document description or metadata summary
52
+ * - key: `"comment-{commentId}"` for individual comments (unique per comment)
53
+ * - key: `"reply-{commentId}-{replyId}"` for comment replies
54
+ * - No manual ID tracking needed - Plot handles deduplication automatically
55
+ * - Send NewActivityWithNotes for all documents (creates new or updates existing)
56
+ * - Set `activity.unread = false` for initial sync, omit for incremental updates
57
+ */
58
+ export type DocumentTool = {
59
+ /**
60
+ * Initiates the authorization flow for the document service.
61
+ *
62
+ * @param callback - Function receiving (auth, ...extraArgs) when auth completes
63
+ * @param extraArgs - Additional arguments to pass to the callback (type-checked)
64
+ * @returns Promise resolving to an ActivityLink to initiate the auth flow
65
+ */
66
+ requestAuth<TArgs extends Serializable[], TCallback extends (auth: DocumentAuth, ...args: TArgs) => any>(callback: TCallback, ...extraArgs: TArgs): Promise<ActivityLink>;
67
+ /**
68
+ * Retrieves the list of folders accessible to the user.
69
+ *
70
+ * @param authToken - Authorization token from successful auth flow
71
+ * @returns Promise resolving to array of available folders
72
+ */
73
+ getFolders(authToken: string): Promise<DocumentFolder[]>;
74
+ /**
75
+ * Begins synchronizing documents from a specific folder.
76
+ *
77
+ * Documents are converted to NewActivityWithNotes objects.
78
+ *
79
+ * **Recommended Implementation:**
80
+ * - Set Activity.source to `"{provider}:file:{fileId}"`
81
+ * - Use Note.key for document details:
82
+ * - key: "summary" for description (upserts on changes)
83
+ * - key: "comment-{commentId}" for individual comments (unique per comment)
84
+ * - key: "reply-{commentId}-{replyId}" for comment replies
85
+ * - Send NewActivityWithNotes for all documents (creates new or updates existing)
86
+ * - Set activity.unread = false for initial sync, omit for incremental updates
87
+ *
88
+ * @param options - Sync configuration options
89
+ * @param options.authToken - Authorization token for access
90
+ * @param options.folderId - ID of the folder to sync
91
+ * @param options.timeMin - Earliest date to sync documents from (inclusive)
92
+ * @param callback - Function receiving (activity, ...extraArgs) for each synced document
93
+ * @param extraArgs - Additional arguments to pass to the callback (type-checked, no functions allowed)
94
+ * @returns Promise that resolves when sync setup is complete
95
+ */
96
+ startSync<TArgs extends Serializable[], TCallback extends (activity: NewActivityWithNotes, ...args: TArgs) => any>(options: {
97
+ authToken: string;
98
+ folderId: string;
99
+ } & DocumentSyncOptions, callback: TCallback, ...extraArgs: TArgs): Promise<void>;
100
+ /**
101
+ * Stops synchronizing documents from a specific folder.
102
+ *
103
+ * @param authToken - Authorization token for access
104
+ * @param folderId - ID of the folder to stop syncing
105
+ * @returns Promise that resolves when sync is stopped
106
+ */
107
+ stopSync(authToken: string, folderId: string): Promise<void>;
108
+ /**
109
+ * Adds a comment to a document.
110
+ *
111
+ * Optional method for bidirectional sync. When implemented, allows Plot to
112
+ * sync notes added to activities back as comments on the external document.
113
+ *
114
+ * The tool should extract its own ID from meta (e.g., fileId).
115
+ *
116
+ * @param authToken - Authorization token for access
117
+ * @param meta - Activity metadata containing the tool's document identifier
118
+ * @param body - The comment text content
119
+ * @param noteId - Optional Plot note ID for deduplication
120
+ * @returns The external comment key (e.g. "comment-123") for dedup, or void
121
+ */
122
+ addDocumentComment?(authToken: string, meta: ActivityMeta, body: string, noteId?: string): Promise<string | void>;
123
+ /**
124
+ * Adds a reply to an existing comment thread on a document.
125
+ *
126
+ * @param authToken - Authorization token for access
127
+ * @param meta - Activity metadata containing the tool's document identifier
128
+ * @param commentId - The external comment ID to reply to
129
+ * @param body - The reply text content
130
+ * @param noteId - Optional Plot note ID for deduplication
131
+ * @returns The external reply key (e.g. "reply-123-456") for dedup, or void
132
+ */
133
+ addDocumentReply?(authToken: string, meta: ActivityMeta, commentId: string, body: string, noteId?: string): Promise<string | void>;
134
+ };
135
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/common/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACb,MAAM,UAAU,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,uDAAuD;IACvD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,WAAW,CACT,KAAK,SAAS,YAAY,EAAE,EAC5B,SAAS,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAE7D,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,KAAK,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAEzD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CACP,KAAK,SAAS,YAAY,EAAE,EAC5B,SAAS,SAAS,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAEzE,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,mBAAmB,EACvB,QAAQ,EAAE,SAAS,EACnB,GAAG,SAAS,EAAE,KAAK,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,CACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/common/documents.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- window.hierarchyData = "eJyNkrFuwyAQht/l5gs1tmUMW9TJS1Wp3aKoog5NLBNTwVUZIr97Zbut6AQLA3z//x3S3cE7RwHUQbZHBG8+rOlpcFMAdQfZLuekrwYUdK/OWUAYh+kEipctwpe3oKC3OgQTHsg5y1aKXei6oOsLKKBw2i2x3XaB0F8Ge/JmAnXgBce6KbCWBTaiQlFWKESFLa+xlRIlF8cZgRc8miVrlIxJZoS6KeLi2xAopKrDG60c2/AMiYwl+y4t0APbd+niRlRR8aO29l33Y8YH+l+U/YXSNlHGtm4ic/Z625akcIhoFkcztP8++WTo5vyYNk4byH4CaU/L68jzbB2lJZ/WEVvQjHopo/oXct6k+8OCsRVOGyQX8S7rkLMJtGBshVOGef4G4bhc4Q=="
1
+ window.hierarchyData = "eJyNkj1vwyAQhv/LzRca/AlsUScvVaV2i6KK2qSxTEwFV2WI/N8r221FJ7wwwPO+zyHdHbxzFEAdpTgheHO2pqXejQHUHaSYz1FfDShoXp2zgDD0YweKZwLhy1tQ0FodggkP5JxlC8UudJ3R5QUUUOh2c2y3XiC0l9523oygjnzPsRAZljzDSpZYFyXWskSRVygzjjKXpwmB73k0y6ZRNkwyIRQii4tvfaCQqg5vtHBsxdOSkseSQ5MW6J4dmnRxJcuo+FFb+67bYcMH2l+U/YXStrqIbc1I5sPrdVuSwj6iWRzdoP33ySdDN+eHtHFcQfYTSHtEXkWeZ+soLfm0jtiMputlFq/wCzlv0v1hxtgCbzDkMt5lHbZsAs0YW+CUYZq+AQY2XOs="
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "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"