digital-tools 2.1.3 → 2.3.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 (294) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -0
  3. package/dist/client.d.ts +109 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +69 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/define.d.ts +2 -2
  8. package/dist/define.d.ts.map +1 -1
  9. package/dist/define.js +21 -11
  10. package/dist/define.js.map +1 -1
  11. package/dist/function-ref.d.ts +229 -0
  12. package/dist/function-ref.d.ts.map +1 -0
  13. package/dist/function-ref.js +28 -0
  14. package/dist/function-ref.js.map +1 -0
  15. package/dist/function-sugar.d.ts +57 -0
  16. package/dist/function-sugar.d.ts.map +1 -0
  17. package/dist/function-sugar.js +79 -0
  18. package/dist/function-sugar.js.map +1 -0
  19. package/dist/index.d.ts +10 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +24 -4
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
  24. package/dist/providers/analytics/mixpanel.js +21 -18
  25. package/dist/providers/analytics/mixpanel.js.map +1 -1
  26. package/dist/providers/calendar/cal-com.d.ts.map +1 -1
  27. package/dist/providers/calendar/cal-com.js +10 -10
  28. package/dist/providers/calendar/cal-com.js.map +1 -1
  29. package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
  30. package/dist/providers/calendar/google-calendar.js +4 -4
  31. package/dist/providers/calendar/google-calendar.js.map +1 -1
  32. package/dist/providers/crm/hubspot.d.ts.map +1 -1
  33. package/dist/providers/crm/hubspot.js +107 -85
  34. package/dist/providers/crm/hubspot.js.map +1 -1
  35. package/dist/providers/development/github.d.ts.map +1 -1
  36. package/dist/providers/development/github.js +40 -43
  37. package/dist/providers/development/github.js.map +1 -1
  38. package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
  39. package/dist/providers/ecommerce/shopify.js +79 -62
  40. package/dist/providers/ecommerce/shopify.js.map +1 -1
  41. package/dist/providers/email/resend.d.ts.map +1 -1
  42. package/dist/providers/email/resend.js +20 -16
  43. package/dist/providers/email/resend.js.map +1 -1
  44. package/dist/providers/email/sendgrid.d.ts.map +1 -1
  45. package/dist/providers/email/sendgrid.js +12 -9
  46. package/dist/providers/email/sendgrid.js.map +1 -1
  47. package/dist/providers/finance/stripe.d.ts.map +1 -1
  48. package/dist/providers/finance/stripe.js +44 -42
  49. package/dist/providers/finance/stripe.js.map +1 -1
  50. package/dist/providers/forms/typeform.d.ts.map +1 -1
  51. package/dist/providers/forms/typeform.js +68 -58
  52. package/dist/providers/forms/typeform.js.map +1 -1
  53. package/dist/providers/knowledge/notion.d.ts.map +1 -1
  54. package/dist/providers/knowledge/notion.js +75 -41
  55. package/dist/providers/knowledge/notion.js.map +1 -1
  56. package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
  57. package/dist/providers/marketing/mailchimp.js +74 -61
  58. package/dist/providers/marketing/mailchimp.js.map +1 -1
  59. package/dist/providers/media/cloudinary.d.ts.map +1 -1
  60. package/dist/providers/media/cloudinary.js +30 -28
  61. package/dist/providers/media/cloudinary.js.map +1 -1
  62. package/dist/providers/messaging/slack.d.ts.map +1 -1
  63. package/dist/providers/messaging/slack.js +75 -58
  64. package/dist/providers/messaging/slack.js.map +1 -1
  65. package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
  66. package/dist/providers/messaging/twilio-sms.js +33 -15
  67. package/dist/providers/messaging/twilio-sms.js.map +1 -1
  68. package/dist/providers/project-management/linear.d.ts.map +1 -1
  69. package/dist/providers/project-management/linear.js +31 -27
  70. package/dist/providers/project-management/linear.js.map +1 -1
  71. package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
  72. package/dist/providers/spreadsheet/google-sheets.js +21 -18
  73. package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
  74. package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
  75. package/dist/providers/spreadsheet/xlsx.js +4 -4
  76. package/dist/providers/spreadsheet/xlsx.js.map +1 -1
  77. package/dist/providers/storage/index.js +1 -0
  78. package/dist/providers/storage/index.js.map +1 -1
  79. package/dist/providers/storage/s3.d.ts.map +1 -1
  80. package/dist/providers/storage/s3.js +36 -27
  81. package/dist/providers/storage/s3.js.map +1 -1
  82. package/dist/providers/support/zendesk.d.ts.map +1 -1
  83. package/dist/providers/support/zendesk.js +24 -25
  84. package/dist/providers/support/zendesk.js.map +1 -1
  85. package/dist/providers/tasks/todoist.d.ts.map +1 -1
  86. package/dist/providers/tasks/todoist.js +18 -18
  87. package/dist/providers/tasks/todoist.js.map +1 -1
  88. package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
  89. package/dist/providers/video-conferencing/google-meet.js +11 -11
  90. package/dist/providers/video-conferencing/google-meet.js.map +1 -1
  91. package/dist/providers/video-conferencing/jitsi.js +14 -14
  92. package/dist/providers/video-conferencing/jitsi.js.map +1 -1
  93. package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
  94. package/dist/providers/video-conferencing/teams.js +9 -7
  95. package/dist/providers/video-conferencing/teams.js.map +1 -1
  96. package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
  97. package/dist/providers/video-conferencing/zoom.js +26 -24
  98. package/dist/providers/video-conferencing/zoom.js.map +1 -1
  99. package/dist/tools/data.d.ts.map +1 -1
  100. package/dist/tools/data.js +5 -12
  101. package/dist/tools/data.js.map +1 -1
  102. package/dist/tools/index.d.ts +1 -0
  103. package/dist/tools/index.d.ts.map +1 -1
  104. package/dist/tools/index.js +1 -0
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/system.d.ts +289 -0
  107. package/dist/tools/system.d.ts.map +1 -0
  108. package/dist/tools/system.js +752 -0
  109. package/dist/tools/system.js.map +1 -0
  110. package/dist/tools/web.d.ts.map +1 -1
  111. package/dist/tools/web.js +22 -10
  112. package/dist/tools/web.js.map +1 -1
  113. package/dist/track-record.d.ts +101 -0
  114. package/dist/track-record.d.ts.map +1 -0
  115. package/dist/track-record.js +17 -0
  116. package/dist/track-record.js.map +1 -0
  117. package/dist/types.d.ts +210 -9
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/verb-registration.d.ts +122 -0
  120. package/dist/verb-registration.d.ts.map +1 -0
  121. package/dist/verb-registration.js +176 -0
  122. package/dist/verb-registration.js.map +1 -0
  123. package/dist/worker.d.ts +93 -0
  124. package/dist/worker.d.ts.map +1 -0
  125. package/dist/worker.js +315 -0
  126. package/dist/worker.js.map +1 -0
  127. package/dist/wrap.d.ts +89 -0
  128. package/dist/wrap.d.ts.map +1 -0
  129. package/dist/wrap.js +225 -0
  130. package/dist/wrap.js.map +1 -0
  131. package/package.json +31 -14
  132. package/src/client.ts +136 -0
  133. package/src/define.ts +30 -24
  134. package/src/function-ref.ts +264 -0
  135. package/src/function-sugar.ts +134 -0
  136. package/src/index.ts +132 -10
  137. package/src/providers/analytics/mixpanel.ts +19 -18
  138. package/src/providers/calendar/cal-com.ts +29 -18
  139. package/src/providers/calendar/google-calendar.ts +20 -14
  140. package/src/providers/crm/hubspot.ts +225 -99
  141. package/src/providers/development/github.ts +206 -135
  142. package/src/providers/ecommerce/shopify.ts +250 -89
  143. package/src/providers/email/resend.ts +101 -28
  144. package/src/providers/email/sendgrid.ts +12 -9
  145. package/src/providers/finance/stripe.ts +128 -49
  146. package/src/providers/forms/typeform.ts +74 -58
  147. package/src/providers/knowledge/notion.ts +340 -88
  148. package/src/providers/marketing/mailchimp.ts +86 -70
  149. package/src/providers/media/cloudinary.ts +99 -41
  150. package/src/providers/messaging/slack.ts +283 -85
  151. package/src/providers/messaging/twilio-sms.ts +35 -15
  152. package/src/providers/project-management/linear.ts +143 -55
  153. package/src/providers/spreadsheet/google-sheets.ts +222 -56
  154. package/src/providers/spreadsheet/xlsx.ts +47 -16
  155. package/src/providers/storage/s3.ts +119 -47
  156. package/src/providers/support/zendesk.ts +196 -46
  157. package/src/providers/tasks/todoist.ts +20 -26
  158. package/src/providers/video-conferencing/google-meet.ts +17 -20
  159. package/src/providers/video-conferencing/jitsi.ts +14 -14
  160. package/src/providers/video-conferencing/teams.ts +14 -13
  161. package/src/providers/video-conferencing/zoom.ts +54 -49
  162. package/src/tools/data.ts +6 -16
  163. package/src/tools/index.ts +1 -0
  164. package/src/tools/system.ts +887 -0
  165. package/src/tools/web.ts +22 -10
  166. package/src/track-record.ts +106 -0
  167. package/src/types.ts +241 -13
  168. package/src/verb-registration.ts +197 -0
  169. package/src/worker.ts +370 -0
  170. package/src/wrap.ts +260 -0
  171. package/test/client.test.ts +146 -0
  172. package/test/communication-tools-extended.test.ts +734 -0
  173. package/test/data-tools-extended.test.ts +743 -0
  174. package/test/define-extended.test.ts +819 -0
  175. package/test/define.test.ts +150 -41
  176. package/test/entities.test.ts +623 -0
  177. package/test/extended-entities.test.ts +1228 -0
  178. package/test/provider-implementations.test.ts +725 -0
  179. package/test/provider-registry-extended.test.ts +583 -0
  180. package/test/providers/google-sheets.test.ts +851 -0
  181. package/test/providers/helpers.ts +554 -0
  182. package/test/providers/hubspot.test.ts +576 -0
  183. package/test/providers/slack.test.ts +932 -0
  184. package/test/providers/stripe.test.ts +701 -0
  185. package/test/providers.test.ts +578 -0
  186. package/test/system-tools-extended.test.ts +632 -0
  187. package/test/system.test.ts +673 -0
  188. package/test/tools.test.ts +15 -11
  189. package/test/types.test.ts +402 -0
  190. package/test/verb-registration.test.ts +395 -0
  191. package/test/web-tools.test.ts +553 -0
  192. package/test/worker-extended.test.ts +699 -0
  193. package/test/worker.test.ts +576 -0
  194. package/test/wrap.test.ts +366 -0
  195. package/tsconfig.json +3 -13
  196. package/vitest.config.ts +37 -0
  197. package/wrangler.jsonc +9 -0
  198. package/.turbo/turbo-build.log +0 -4
  199. package/LICENSE +0 -21
  200. package/dist/providers/voice/vapi.d.ts +0 -27
  201. package/dist/providers/voice/vapi.d.ts.map +0 -1
  202. package/dist/providers/voice/vapi.js +0 -440
  203. package/dist/providers/voice/vapi.js.map +0 -1
  204. package/src/define.js +0 -259
  205. package/src/entities/advertising.js +0 -999
  206. package/src/entities/ai.js +0 -756
  207. package/src/entities/analytics.js +0 -1588
  208. package/src/entities/automation.js +0 -601
  209. package/src/entities/communication.js +0 -1150
  210. package/src/entities/crm.js +0 -1386
  211. package/src/entities/design.js +0 -546
  212. package/src/entities/development.js +0 -2212
  213. package/src/entities/document.js +0 -874
  214. package/src/entities/ecommerce.js +0 -1429
  215. package/src/entities/experiment.js +0 -1039
  216. package/src/entities/finance.js +0 -3478
  217. package/src/entities/forms.js +0 -1892
  218. package/src/entities/hr.js +0 -661
  219. package/src/entities/identity.js +0 -997
  220. package/src/entities/index.js +0 -282
  221. package/src/entities/infrastructure.js +0 -1153
  222. package/src/entities/knowledge.js +0 -1438
  223. package/src/entities/marketing.js +0 -1610
  224. package/src/entities/media.js +0 -1634
  225. package/src/entities/notification.js +0 -1199
  226. package/src/entities/presentation.js +0 -1274
  227. package/src/entities/productivity.js +0 -1317
  228. package/src/entities/project-management.js +0 -1136
  229. package/src/entities/recruiting.js +0 -736
  230. package/src/entities/shipping.js +0 -509
  231. package/src/entities/signature.js +0 -1102
  232. package/src/entities/site.js +0 -222
  233. package/src/entities/spreadsheet.js +0 -1341
  234. package/src/entities/storage.js +0 -1198
  235. package/src/entities/support.js +0 -1166
  236. package/src/entities/video-conferencing.js +0 -1750
  237. package/src/entities/video.js +0 -950
  238. package/src/entities.js +0 -1663
  239. package/src/index.js +0 -74
  240. package/src/providers/analytics/index.js +0 -17
  241. package/src/providers/analytics/mixpanel.js +0 -255
  242. package/src/providers/calendar/cal-com.js +0 -303
  243. package/src/providers/calendar/google-calendar.js +0 -335
  244. package/src/providers/calendar/index.js +0 -20
  245. package/src/providers/crm/hubspot.js +0 -566
  246. package/src/providers/crm/index.js +0 -17
  247. package/src/providers/development/github.js +0 -472
  248. package/src/providers/development/index.js +0 -17
  249. package/src/providers/ecommerce/index.js +0 -17
  250. package/src/providers/ecommerce/shopify.js +0 -378
  251. package/src/providers/email/index.js +0 -20
  252. package/src/providers/email/resend.js +0 -258
  253. package/src/providers/email/sendgrid.js +0 -161
  254. package/src/providers/finance/index.js +0 -17
  255. package/src/providers/finance/stripe.js +0 -549
  256. package/src/providers/forms/index.js +0 -17
  257. package/src/providers/forms/typeform.js +0 -500
  258. package/src/providers/index.js +0 -123
  259. package/src/providers/knowledge/index.js +0 -17
  260. package/src/providers/knowledge/notion.js +0 -389
  261. package/src/providers/marketing/index.js +0 -17
  262. package/src/providers/marketing/mailchimp.js +0 -443
  263. package/src/providers/media/cloudinary.js +0 -318
  264. package/src/providers/media/index.js +0 -17
  265. package/src/providers/messaging/index.js +0 -20
  266. package/src/providers/messaging/slack.js +0 -393
  267. package/src/providers/messaging/twilio-sms.js +0 -249
  268. package/src/providers/project-management/index.js +0 -17
  269. package/src/providers/project-management/linear.js +0 -575
  270. package/src/providers/registry.js +0 -86
  271. package/src/providers/spreadsheet/google-sheets.js +0 -375
  272. package/src/providers/spreadsheet/index.js +0 -20
  273. package/src/providers/spreadsheet/xlsx.js +0 -423
  274. package/src/providers/storage/index.js +0 -24
  275. package/src/providers/storage/s3.js +0 -419
  276. package/src/providers/support/index.js +0 -17
  277. package/src/providers/support/zendesk.js +0 -373
  278. package/src/providers/tasks/index.js +0 -17
  279. package/src/providers/tasks/todoist.js +0 -286
  280. package/src/providers/types.js +0 -9
  281. package/src/providers/video-conferencing/google-meet.js +0 -286
  282. package/src/providers/video-conferencing/index.js +0 -31
  283. package/src/providers/video-conferencing/jitsi.js +0 -254
  284. package/src/providers/video-conferencing/teams.js +0 -270
  285. package/src/providers/video-conferencing/zoom.js +0 -332
  286. package/src/registry.js +0 -128
  287. package/src/tools/communication.js +0 -184
  288. package/src/tools/data.js +0 -205
  289. package/src/tools/index.js +0 -11
  290. package/src/tools/web.js +0 -137
  291. package/src/types.js +0 -10
  292. package/test/define.test.js +0 -306
  293. package/test/registry.test.js +0 -357
  294. package/test/tools.test.js +0 -363
@@ -23,6 +23,224 @@ import { defineProvider } from '../registry.js'
23
23
  const NOTION_API_URL = 'https://api.notion.com/v1'
24
24
  const NOTION_VERSION = '2022-06-28'
25
25
 
26
+ // =============================================================================
27
+ // Notion API Types
28
+ // =============================================================================
29
+
30
+ /**
31
+ * Notion rich text object
32
+ */
33
+ interface NotionRichText {
34
+ type: 'text' | 'mention' | 'equation'
35
+ text?: {
36
+ content: string
37
+ link?: { url: string } | null
38
+ }
39
+ plain_text: string
40
+ annotations?: {
41
+ bold: boolean
42
+ italic: boolean
43
+ strikethrough: boolean
44
+ underline: boolean
45
+ code: boolean
46
+ color: string
47
+ }
48
+ href?: string | null
49
+ }
50
+
51
+ /**
52
+ * Notion user reference
53
+ */
54
+ interface NotionUserReference {
55
+ id: string
56
+ object?: 'user'
57
+ }
58
+
59
+ /**
60
+ * Notion icon object
61
+ */
62
+ interface NotionIcon {
63
+ type: 'emoji' | 'external' | 'file'
64
+ emoji?: string
65
+ external?: { url: string }
66
+ file?: { url: string; expiry_time?: string }
67
+ }
68
+
69
+ /**
70
+ * Notion cover object
71
+ */
72
+ interface NotionCover {
73
+ type: 'external' | 'file'
74
+ external?: { url: string }
75
+ file?: { url: string; expiry_time?: string }
76
+ }
77
+
78
+ /**
79
+ * Notion parent object
80
+ */
81
+ interface NotionParent {
82
+ type: 'page_id' | 'database_id' | 'workspace' | 'block_id'
83
+ page_id?: string
84
+ database_id?: string
85
+ workspace?: boolean
86
+ block_id?: string
87
+ }
88
+
89
+ /**
90
+ * Notion property value types
91
+ */
92
+ interface NotionTitleProperty {
93
+ type: 'title'
94
+ title: NotionRichText[]
95
+ id: string
96
+ }
97
+
98
+ interface NotionRichTextProperty {
99
+ type: 'rich_text'
100
+ rich_text: NotionRichText[]
101
+ id: string
102
+ }
103
+
104
+ interface NotionProperty {
105
+ type: string
106
+ id: string
107
+ title?: NotionRichText[]
108
+ rich_text?: NotionRichText[]
109
+ [key: string]: unknown
110
+ }
111
+
112
+ /**
113
+ * Notion page object from API
114
+ */
115
+ interface NotionPage {
116
+ object: 'page'
117
+ id: string
118
+ created_time: string
119
+ last_edited_time: string
120
+ created_by: NotionUserReference
121
+ last_edited_by: NotionUserReference
122
+ cover: NotionCover | null
123
+ icon: NotionIcon | null
124
+ parent: NotionParent
125
+ archived: boolean
126
+ in_trash: boolean
127
+ properties: Record<string, NotionProperty>
128
+ url: string
129
+ public_url?: string | null
130
+ child_page?: { title: string }
131
+ }
132
+
133
+ /**
134
+ * Notion database object from API
135
+ */
136
+ interface NotionDatabase {
137
+ object: 'database'
138
+ id: string
139
+ created_time: string
140
+ last_edited_time: string
141
+ created_by: NotionUserReference
142
+ last_edited_by: NotionUserReference
143
+ title: NotionRichText[]
144
+ description: NotionRichText[]
145
+ icon: NotionIcon | null
146
+ cover: NotionCover | null
147
+ parent: NotionParent
148
+ url: string
149
+ public_url?: string | null
150
+ archived: boolean
151
+ in_trash: boolean
152
+ is_inline: boolean
153
+ properties: Record<string, NotionProperty>
154
+ }
155
+
156
+ /**
157
+ * Notion API error response
158
+ */
159
+ interface NotionErrorResponse {
160
+ object: 'error'
161
+ status: number
162
+ code: string
163
+ message: string
164
+ }
165
+
166
+ /**
167
+ * Notion paginated response
168
+ */
169
+ interface NotionPaginatedResponse<T> {
170
+ object: 'list'
171
+ results: T[]
172
+ next_cursor: string | null
173
+ has_more: boolean
174
+ type?: string
175
+ }
176
+
177
+ /**
178
+ * Request body for creating a page
179
+ */
180
+ interface NotionCreatePageBody {
181
+ parent: { page_id: string } | { database_id: string }
182
+ properties: {
183
+ title: Array<{ text: { content: string } }>
184
+ }
185
+ icon?: { emoji: string }
186
+ cover?: { external: { url: string } }
187
+ children?: NotionBlock[]
188
+ }
189
+
190
+ /**
191
+ * Notion block object
192
+ */
193
+ interface NotionBlock {
194
+ object: 'block'
195
+ type: string
196
+ paragraph?: {
197
+ rich_text: Array<{
198
+ type: 'text'
199
+ text: { content: string }
200
+ }>
201
+ }
202
+ [key: string]: unknown
203
+ }
204
+
205
+ /**
206
+ * Request body for database query
207
+ */
208
+ interface NotionDatabaseQueryBody {
209
+ page_size?: number
210
+ start_cursor?: string
211
+ filter?: Record<string, unknown>
212
+ sorts?: Array<Record<string, unknown>>
213
+ }
214
+
215
+ /**
216
+ * Request body for search
217
+ */
218
+ interface NotionSearchBody {
219
+ query?: string
220
+ page_size?: number
221
+ start_cursor?: string
222
+ filter?: {
223
+ property: 'object'
224
+ value: 'page' | 'database'
225
+ }
226
+ sort?: {
227
+ direction: 'ascending' | 'descending'
228
+ timestamp: 'last_edited_time'
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Request body for updating a page
234
+ */
235
+ interface NotionUpdatePageBody {
236
+ properties: {
237
+ title?: Array<{ text: { content: string } }>
238
+ }
239
+ icon?: { emoji: string } | null
240
+ cover?: { external: { url: string } } | null
241
+ archived?: boolean
242
+ }
243
+
26
244
  /**
27
245
  * Notion provider info
28
246
  */
@@ -48,16 +266,13 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
48
266
  /**
49
267
  * Make authenticated request to Notion API
50
268
  */
51
- async function notionRequest(
52
- endpoint: string,
53
- options: RequestInit = {}
54
- ): Promise<Response> {
269
+ async function notionRequest(endpoint: string, options: RequestInit = {}): Promise<Response> {
55
270
  const url = endpoint.startsWith('http') ? endpoint : `${NOTION_API_URL}${endpoint}`
56
271
 
57
272
  return fetch(url, {
58
273
  ...options,
59
274
  headers: {
60
- 'Authorization': `Bearer ${integrationToken}`,
275
+ Authorization: `Bearer ${integrationToken}`,
61
276
  'Notion-Version': NOTION_VERSION,
62
277
  'Content-Type': 'application/json',
63
278
  ...options.headers,
@@ -68,19 +283,24 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
68
283
  /**
69
284
  * Convert Notion page to PageData
70
285
  */
71
- function convertNotionPage(notionPage: any): PageData {
286
+ function convertNotionPage(notionPage: NotionPage): PageData {
72
287
  const title = extractTitle(notionPage)
73
288
  const parentId = notionPage.parent?.page_id || notionPage.parent?.database_id || undefined
289
+ const icon = notionPage.icon?.emoji || notionPage.icon?.external?.url
290
+ const cover = notionPage.cover?.external?.url || notionPage.cover?.file?.url
74
291
 
75
292
  return {
76
293
  id: notionPage.id,
77
294
  title,
78
- content: undefined, // Content requires separate API call
79
- parentId,
80
- spaceId: notionPage.parent?.workspace ? 'workspace' : parentId,
295
+ ...(parentId !== undefined && { parentId }),
296
+ ...(notionPage.parent?.workspace
297
+ ? { spaceId: 'workspace' }
298
+ : parentId !== undefined
299
+ ? { spaceId: parentId }
300
+ : {}),
81
301
  url: notionPage.url,
82
- icon: notionPage.icon?.emoji || notionPage.icon?.external?.url || undefined,
83
- cover: notionPage.cover?.external?.url || notionPage.cover?.file?.url || undefined,
302
+ ...(icon !== undefined && { icon }),
303
+ ...(cover !== undefined && { cover }),
84
304
  createdAt: new Date(notionPage.created_time),
85
305
  updatedAt: new Date(notionPage.last_edited_time),
86
306
  createdBy: notionPage.created_by?.id,
@@ -91,20 +311,28 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
91
311
  /**
92
312
  * Extract title from Notion page properties
93
313
  */
94
- function extractTitle(notionPage: any): string {
95
- // Check for title property
314
+ function extractTitle(notionPage: NotionPage | NotionDatabase): string {
315
+ // For databases, title is a top-level property
316
+ if ('title' in notionPage && Array.isArray(notionPage.title)) {
317
+ const dbPage = notionPage as NotionDatabase
318
+ if (dbPage.title.length > 0) {
319
+ return dbPage.title.map((t) => t.plain_text).join('')
320
+ }
321
+ }
322
+
323
+ // Check for title property in page properties
96
324
  const properties = notionPage.properties || {}
97
325
 
98
326
  // Look for title or Name property
99
- for (const [key, value] of Object.entries(properties)) {
100
- const prop = value as any
101
- if (prop.type === 'title' && prop.title?.length > 0) {
102
- return prop.title.map((t: any) => t.plain_text).join('')
327
+ for (const [_key, value] of Object.entries(properties)) {
328
+ const prop = value as NotionProperty
329
+ if (prop.type === 'title' && prop.title && prop.title.length > 0) {
330
+ return prop.title.map((t) => t.plain_text).join('')
103
331
  }
104
332
  }
105
333
 
106
334
  // Fallback to page title in child_page parent
107
- if (notionPage.child_page?.title) {
335
+ if ('child_page' in notionPage && notionPage.child_page?.title) {
108
336
  return notionPage.child_page.title
109
337
  }
110
338
 
@@ -114,7 +342,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
114
342
  /**
115
343
  * Build page properties for creation/update
116
344
  */
117
- function buildPageProperties(title: string): any {
345
+ function buildPageProperties(title: string): { title: Array<{ text: { content: string } }> } {
118
346
  return {
119
347
  title: [
120
348
  {
@@ -129,7 +357,10 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
129
357
  /**
130
358
  * Build parent object for page creation
131
359
  */
132
- function buildParent(parentId?: string, spaceId?: string): any {
360
+ function buildParent(
361
+ parentId?: string,
362
+ spaceId?: string
363
+ ): { page_id: string } | { database_id: string } {
133
364
  const targetParent = parentId || spaceId || defaultParentId || defaultDatabaseId
134
365
 
135
366
  if (!targetParent) {
@@ -149,9 +380,9 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
149
380
  info: notionInfo,
150
381
 
151
382
  async initialize(cfg: ProviderConfig): Promise<void> {
152
- integrationToken = cfg.integrationToken as string
153
- defaultParentId = cfg.defaultParentId as string | undefined
154
- defaultDatabaseId = cfg.defaultDatabaseId as string | undefined
383
+ integrationToken = cfg['integrationToken'] as string
384
+ defaultParentId = cfg['defaultParentId'] as string | undefined
385
+ defaultDatabaseId = cfg['defaultDatabaseId'] as string | undefined
155
386
 
156
387
  if (!integrationToken) {
157
388
  throw new Error('Notion integration token is required')
@@ -186,7 +417,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
186
417
  async createPage(page: CreatePageOptions): Promise<PageData> {
187
418
  const parent = buildParent(page.parentId, page.spaceId)
188
419
 
189
- const body: any = {
420
+ const body: NotionCreatePageBody = {
190
421
  parent,
191
422
  properties: buildPageProperties(page.title),
192
423
  }
@@ -224,17 +455,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
224
455
  })
225
456
 
226
457
  if (!response.ok) {
227
- const errorData = await response.json().catch(() => ({}))
228
- throw new Error(
229
- `Failed to create page: ${(errorData as any)?.message || response.statusText}`
230
- )
458
+ const errorData = (await response
459
+ .json()
460
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
461
+ throw new Error(`Failed to create page: ${errorData?.message || response.statusText}`)
231
462
  }
232
463
 
233
- const notionPage = await response.json() as any
464
+ const notionPage = (await response.json()) as NotionPage
234
465
  return convertNotionPage(notionPage)
235
466
  } catch (error) {
236
467
  throw new Error(
237
- `Failed to create Notion page: ${error instanceof Error ? error.message : 'Unknown error'}`
468
+ `Failed to create Notion page: ${
469
+ error instanceof Error ? error.message : 'Unknown error'
470
+ }`
238
471
  )
239
472
  }
240
473
  },
@@ -248,16 +481,16 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
248
481
  }
249
482
 
250
483
  if (!response.ok) {
251
- const errorData = await response.json().catch(() => ({}))
252
- throw new Error(
253
- `Failed to get page: ${(errorData as any)?.message || response.statusText}`
254
- )
484
+ const errorData = (await response
485
+ .json()
486
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
487
+ throw new Error(`Failed to get page: ${errorData?.message || response.statusText}`)
255
488
  }
256
489
 
257
- const notionPage = await response.json() as any
490
+ const notionPage = (await response.json()) as NotionPage
258
491
  return convertNotionPage(notionPage)
259
492
  } catch (error) {
260
- if ((error as any)?.message?.includes('404')) {
493
+ if (error instanceof Error && error.message.includes('404')) {
261
494
  return null
262
495
  }
263
496
  throw new Error(
@@ -267,7 +500,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
267
500
  },
268
501
 
269
502
  async updatePage(pageId: string, updates: Partial<CreatePageOptions>): Promise<PageData> {
270
- const body: any = {
503
+ const body: NotionUpdatePageBody = {
271
504
  properties: {},
272
505
  }
273
506
 
@@ -290,17 +523,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
290
523
  })
291
524
 
292
525
  if (!response.ok) {
293
- const errorData = await response.json().catch(() => ({}))
294
- throw new Error(
295
- `Failed to update page: ${(errorData as any)?.message || response.statusText}`
296
- )
526
+ const errorData = (await response
527
+ .json()
528
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
529
+ throw new Error(`Failed to update page: ${errorData?.message || response.statusText}`)
297
530
  }
298
531
 
299
- const notionPage = await response.json() as any
532
+ const notionPage = (await response.json()) as NotionPage
300
533
  return convertNotionPage(notionPage)
301
534
  } catch (error) {
302
535
  throw new Error(
303
- `Failed to update Notion page: ${error instanceof Error ? error.message : 'Unknown error'}`
536
+ `Failed to update Notion page: ${
537
+ error instanceof Error ? error.message : 'Unknown error'
538
+ }`
304
539
  )
305
540
  }
306
541
  },
@@ -313,16 +548,18 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
313
548
  })
314
549
 
315
550
  if (!response.ok) {
316
- const errorData = await response.json().catch(() => ({}))
317
- throw new Error(
318
- `Failed to delete page: ${(errorData as any)?.message || response.statusText}`
319
- )
551
+ const errorData = (await response
552
+ .json()
553
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
554
+ throw new Error(`Failed to delete page: ${errorData?.message || response.statusText}`)
320
555
  }
321
556
 
322
557
  return true
323
558
  } catch (error) {
324
559
  throw new Error(
325
- `Failed to delete Notion page: ${error instanceof Error ? error.message : 'Unknown error'}`
560
+ `Failed to delete Notion page: ${
561
+ error instanceof Error ? error.message : 'Unknown error'
562
+ }`
326
563
  )
327
564
  }
328
565
  },
@@ -332,11 +569,13 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
332
569
  const parentId = options?.parentId || options?.spaceId || defaultDatabaseId
333
570
 
334
571
  if (!parentId) {
335
- throw new Error('Parent ID, space ID, or default database must be provided for listing pages')
572
+ throw new Error(
573
+ 'Parent ID, space ID, or default database must be provided for listing pages'
574
+ )
336
575
  }
337
576
 
338
577
  try {
339
- const body: any = {
578
+ const body: NotionDatabaseQueryBody = {
340
579
  page_size: options?.limit || 100,
341
580
  }
342
581
 
@@ -350,19 +589,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
350
589
  })
351
590
 
352
591
  if (!response.ok) {
353
- const errorData = await response.json().catch(() => ({}))
354
- throw new Error(
355
- `Failed to list pages: ${(errorData as any)?.message || response.statusText}`
356
- )
592
+ const errorData = (await response
593
+ .json()
594
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
595
+ throw new Error(`Failed to list pages: ${errorData?.message || response.statusText}`)
357
596
  }
358
597
 
359
- const data = await response.json() as any
598
+ const data = (await response.json()) as NotionPaginatedResponse<NotionPage>
360
599
  const pages = data.results.map(convertNotionPage)
361
600
 
362
601
  return {
363
602
  items: pages,
364
603
  hasMore: data.has_more,
365
- nextCursor: data.next_cursor || undefined,
604
+ ...(data.next_cursor !== null && { nextCursor: data.next_cursor }),
366
605
  }
367
606
  } catch (error) {
368
607
  throw new Error(
@@ -371,9 +610,12 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
371
610
  }
372
611
  },
373
612
 
374
- async searchPages(query: string, options?: PaginationOptions): Promise<PaginatedResult<PageData>> {
613
+ async searchPages(
614
+ query: string,
615
+ options?: PaginationOptions
616
+ ): Promise<PaginatedResult<PageData>> {
375
617
  try {
376
- const body: any = {
618
+ const body: NotionSearchBody = {
377
619
  query,
378
620
  page_size: options?.limit || 100,
379
621
  filter: {
@@ -392,23 +634,25 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
392
634
  })
393
635
 
394
636
  if (!response.ok) {
395
- const errorData = await response.json().catch(() => ({}))
396
- throw new Error(
397
- `Failed to search pages: ${(errorData as any)?.message || response.statusText}`
398
- )
637
+ const errorData = (await response
638
+ .json()
639
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
640
+ throw new Error(`Failed to search pages: ${errorData?.message || response.statusText}`)
399
641
  }
400
642
 
401
- const data = await response.json() as any
643
+ const data = (await response.json()) as NotionPaginatedResponse<NotionPage>
402
644
  const pages = data.results.map(convertNotionPage)
403
645
 
404
646
  return {
405
647
  items: pages,
406
648
  hasMore: data.has_more,
407
- nextCursor: data.next_cursor || undefined,
649
+ ...(data.next_cursor !== null && { nextCursor: data.next_cursor }),
408
650
  }
409
651
  } catch (error) {
410
652
  throw new Error(
411
- `Failed to search Notion pages: ${error instanceof Error ? error.message : 'Unknown error'}`
653
+ `Failed to search Notion pages: ${
654
+ error instanceof Error ? error.message : 'Unknown error'
655
+ }`
412
656
  )
413
657
  }
414
658
  },
@@ -416,7 +660,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
416
660
  async listSpaces(): Promise<SpaceData[]> {
417
661
  try {
418
662
  // List databases as "spaces"
419
- const body = {
663
+ const body: NotionSearchBody = {
420
664
  filter: {
421
665
  property: 'object',
422
666
  value: 'database',
@@ -430,24 +674,30 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
430
674
  })
431
675
 
432
676
  if (!response.ok) {
433
- const errorData = await response.json().catch(() => ({}))
434
- throw new Error(
435
- `Failed to list spaces: ${(errorData as any)?.message || response.statusText}`
436
- )
677
+ const errorData = (await response
678
+ .json()
679
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
680
+ throw new Error(`Failed to list spaces: ${errorData?.message || response.statusText}`)
437
681
  }
438
682
 
439
- const data = await response.json() as any
440
-
441
- return data.results.map((db: any): SpaceData => ({
442
- id: db.id,
443
- name: extractTitle(db),
444
- description: db.description?.[0]?.plain_text,
445
- icon: db.icon?.emoji || db.icon?.external?.url || undefined,
446
- url: db.url,
447
- }))
683
+ const data = (await response.json()) as NotionPaginatedResponse<NotionDatabase>
684
+
685
+ return data.results.map((db): SpaceData => {
686
+ const description = db.description?.[0]?.plain_text
687
+ const icon = db.icon?.emoji || db.icon?.external?.url
688
+ return {
689
+ id: db.id,
690
+ name: extractTitle(db),
691
+ ...(description !== undefined && { description }),
692
+ ...(icon !== undefined && { icon }),
693
+ url: db.url,
694
+ }
695
+ })
448
696
  } catch (error) {
449
697
  throw new Error(
450
- `Failed to list Notion spaces: ${error instanceof Error ? error.message : 'Unknown error'}`
698
+ `Failed to list Notion spaces: ${
699
+ error instanceof Error ? error.message : 'Unknown error'
700
+ }`
451
701
  )
452
702
  }
453
703
  },
@@ -462,23 +712,25 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
462
712
  }
463
713
 
464
714
  if (!response.ok) {
465
- const errorData = await response.json().catch(() => ({}))
466
- throw new Error(
467
- `Failed to get space: ${(errorData as any)?.message || response.statusText}`
468
- )
715
+ const errorData = (await response
716
+ .json()
717
+ .catch(() => ({}))) as Partial<NotionErrorResponse>
718
+ throw new Error(`Failed to get space: ${errorData?.message || response.statusText}`)
469
719
  }
470
720
 
471
- const db = await response.json() as any
721
+ const db = (await response.json()) as NotionDatabase
722
+ const description = db.description?.[0]?.plain_text
723
+ const icon = db.icon?.emoji || db.icon?.external?.url
472
724
 
473
725
  return {
474
726
  id: db.id,
475
727
  name: extractTitle(db),
476
- description: db.description?.[0]?.plain_text,
477
- icon: db.icon?.emoji || db.icon?.external?.url || undefined,
728
+ ...(description !== undefined && { description }),
729
+ ...(icon !== undefined && { icon }),
478
730
  url: db.url,
479
731
  }
480
732
  } catch (error) {
481
- if ((error as any)?.message?.includes('404')) {
733
+ if (error instanceof Error && error.message.includes('404')) {
482
734
  return null
483
735
  }
484
736
  throw new Error(